[BETA] Oblivion Script Extender (OBSE) v0018

Post » Fri May 27, 2011 11:33 am

I was kinda avoiding describing it because I didn't want anyone to get interested since there's a good chance I won't pull it off.

ScriptName jawArmorStandTestScriptshort refreshshort InvPosshort oppositedayshort switchshort switch1short switch2short switch3short switch4short switch5float xposfloat yposfloat zposfloat xpos1float ypos1float zpos1float ypos2float zpos2ref pInvObjref meref jawArmorStandCuirassRefref jawArmorStandGauntletsRefref jawArmorStandGreavesRefref jawArmorStandHelmRefref jawArmorStandBootsRefref jawArmorStandCuirassCloneref jawArmorStandGauntletsCloneref jawArmorStandGreavesCloneref jawArmorStandHelmCloneref jawArmorStandBootsClonestring_var jawArmorStandCuirassPathstring_var jawArmorStandGauntletsPathstring_var jawArmorStandGreavesPathstring_var jawArmorStandHelmPathstring_var jawArmorStandBootsPathBegin OnActivateif isActionRef player == 1	set me to getself	if me.getnumitems == 0		set xpos to getpos x		set ypos to getpos y		set zpos to getpos z		set xpos1 to (getpos x - 0.3379)		set ypos1 to (getpos y + 1.959)		set zpos1 to (getpos z + 17.2509)		set ypos2 to (getpos y + 3)		set zpos2 to (getpos z + 16.8372)		if player.issneaking == 1			message "This will pick up the item"		else			Activate		endif	else		if player.issneaking == 1			set oppositeday to 1			message "This will toggle the armor"		else			set refresh to 1			Activate		Endif	Endif	Else			ActivateEndIfEndBegin Menumode 1008if refresh == 1	set InvPos to me.GetNumItems	Label	if InvPos > 0		set InvPos to (InvPos - 1)		set pInvObj to (me.GetInventoryObject InvPos)		if pInvObj.GetEquipmentSlot == 0			set jawArmorStandHelmPath to GetBipedModelPath 0 pInvObj		elseif pInvObj.GetEquipmentSlot == 2			set jawArmorStandCuirassPath to GetBipedModelPath 0 pInvObj		elseif pInvObj.GetEquipmentSlot == 3			set jawArmorStandGreavesPath to GetBipedModelPath 0 pInvObj		elseif pInvObj.GetEquipmentSlot == 4			set jawArmorStandGauntletsPath to GetBipedModelPath 0 pInvObj		elseif pInvObj.GetEquipmentSlot == 5			set jawArmorStandBootsPath to GetBipedModelPath 0 pInvObj		endif		Goto	endif	if switch == 0		set jawArmorStandCuirassClone to CloneForm SteelCuirass		set jawArmorStandCuirassRef to placeatme jawArmorStandCuirassClone		jawArmorStandCuirassRef.SetMaleGroundPath jawArmorStandCuirassPath		jawArmorStandCuirassRef.setpos x xpos		jawArmorStandCuirassRef.setpos y ypos2		jawArmorStandCuirassRef.setpos z zpos2				set switch to 1	endif	if switch1 == 0		set jawArmorStandBootsClone to CloneForm SteelBoots		set jawArmorStandBootsRef to placeatme jawArmorStandBootsClone		jawArmorStandBootsRef.SetMaleGroundPath jawArmorStandBootsPath		jawArmorStandBootsRef.setpos x xpos		jawArmorStandBootsRef.setpos y ypos2		jawArmorStandBootsRef.setpos z zpos2		set switch1 to 1	endif	if switch2 == 0		set jawArmorStandGauntletsClone to CloneForm SteelGauntlets		set jawArmorStandGauntletsRef to placeatme jawArmorStandGauntletsClone		jawArmorStandGauntletsRef.SetMaleGroundPath jawArmorStandGauntletsPath		jawArmorStandGauntletsRef.setpos x xpos		jawArmorStandGauntletsRef.setpos y ypos2		jawArmorStandGauntletsRef.setpos z zpos2		set switch2 to 1	endif	if switch3 == 0		set jawArmorStandGreavesClone to CloneForm SteelGreaves		set jawArmorStandGreavesRef to placeatme jawArmorStandGreavesClone		jawArmorStandGreavesRef.SetMaleGroundPath jawArmorStandGreavesPath		jawArmorStandGreavesRef.setpos x xpos		jawArmorStandGreavesRef.setpos y ypos2		jawArmorStandGreavesRef.setpos z zpos2		set switch3 to 1	endif	if switch4 == 0		set jawArmorStandHelmClone to CloneForm SteelHelmet		set jawArmorStandHelmRef to placeatme jawArmorStandHelmClone		jawArmorStandHelmRef.SetMaleGroundPath jawArmorStandHelmPath		jawArmorStandHelmRef.setpos x xpos		jawArmorStandHelmRef.setpos y ypos1		jawArmorStandHelmRef.setpos z zpos1		set switch4 to 1	endifendifif switch == 1	jawArmorStandCuirassRef.disableendifif switch1 == 1	jawArmorStandBootsRef.disableendifif switch2 == 1	jawArmorStandGauntletsRef.disableendifif switch3 == 1	jawArmorStandGreavesRef.disableendifif switch4 == 1	jawArmorStandHelmRef.disableendifEndBegin GameModeif switch == 1	jawArmorStandCuirassRef.enable	set switch to 0endifif switch1 == 1	jawArmorStandBootsRef.enable	set switch1 to 0endifif switch2 == 1	jawArmorStandGauntletsRef.enable	set switch2 to 0endifif switch3 == 1	jawArmorStandGreavesRef.enable	set switch3 to 0endifif switch4 == 1	jawArmorStandHelmRef.enable	set switch4 to 0endif	End
This is a very rough beginning (lacking checks, features and with several placeholders) for what is intended to be a functional armor stand. Similar to the one from KotN, but which would work with any armor, vanilla or mod added. The stand functions as a container, and the script is supposed to check what items are in the container, then Cloneform a "matching" Steel piece, place a reference, swap the ground mesh of the reference with the biped mesh of the item in the container and move it into place. I can get the reference in place and make it look like any armor I want by hand typing in the model path, but I'm having trouble getting it to copy the correct path over automatically. I can't use the copy path commands because I need to switch from the biped model to the ground model in order for it to work.

I've had enough success to make me think it's doable, but I'm not a good scripter at all....I have trouble even understanding the documentation formats.
User avatar
Jynx Anthropic
 
Posts: 3352
Joined: Fri Sep 08, 2006 9:36 pm

Post » Thu May 26, 2011 11:35 pm

		if pInvObj.GetEquipmentSlot == 0			set jawArmorStandHelmPath to GetBipedModelPath 0 pInvObj		elseif pInvObj.GetEquipmentSlot == 2			set jawArmorStandCuirassPath to GetBipedModelPath 0 pInvObj		elseif pInvObj.GetEquipmentSlot == 3			set jawArmorStandGreavesPath to GetBipedModelPath 0 pInvObj		elseif pInvObj.GetEquipmentSlot == 4			set jawArmorStandGauntletsPath to GetBipedModelPath 0 pInvObj		elseif pInvObj.GetEquipmentSlot == 5			set jawArmorStandBootsPath to GetBipedModelPath 0 pInvObj		endif

pInvObj is a base object, which means it can't be used with dot syntax. Place it as the last function argument instead (in all of the cases above) e.g.
if GetEquipmentSlot pInvObj == 0


On a different note: I'm not sure I see the need to use cloneForm here. I know you said you want the model path changes to persist in the savegame, but creating new cloned forms and placeAtMe'ed references every time the model path changes means you end up creating a potentially unlimited number of new objects, each of which is only used once but sticks around in the savegame permanently.
Alternatives are:
-Place the armor items in the editor and keep track of their associated model paths in string variables (or an array of strings). Use GetGameLoaded to reset the model paths. Or
-Use CloneForm exactly once per armor slot; subsequently when changing the model path change it on the existing clone form. The change will be saved.
User avatar
FABIAN RUIZ
 
Posts: 3495
Joined: Mon Oct 15, 2007 11:13 am

Post » Fri May 27, 2011 1:38 am

Another thing to beware is that many bits of clothing/armoe take up more than one biped slot. Robes and cuirass frequently fill both upper and lower body slots (for instance.)
User avatar
Gavin Roberts
 
Posts: 3335
Joined: Fri Jun 08, 2007 8:14 pm

Post » Fri May 27, 2011 11:29 am

pInvObj is a base object, which means it can't be used with dot syntax. Place it as the last function argument instead (in all of the cases above) e.g.
if GetEquipmentSlot pInvObj == 0


On a different note: I'm not sure I see the need to use cloneForm here. I know you said you want the model path changes to persist in the savegame, but creating new cloned forms and placeAtMe'ed references every time the model path changes means you end up creating a potentially unlimited number of new objects, each of which is only used once but sticks around in the savegame permanently.
Alternatives are:
-Place the armor items in the editor and keep track of their associated model paths in string variables (or an array of strings). Use GetGameLoaded to reset the model paths. Or
-Use CloneForm exactly once per armor slot; subsequently when changing the model path change it on the existing clone form. The change will be saved.
Okay, the base object stuff is beginning to penetrate my brain, I think. I'll change those....I didn't even realize there were alternative syntaxes for these things.

The Cloneform is possibly temporary, and even if I keep it the idea is that the Stand would create the cloneform once and then only change the stored reference (the silly setup now is just because some of the more necessary functions are still kicking my ass...plus it's funny to see the armor get darker everytime a new one is placed). When I got the basic functions working, I was going to inquire from the more educated as to whether I could use an autoincrementing array on the "jawArmorStand******Clone" entries somehow. If I could do that then I think everything else would stay unique due to all the references being declared within the script. If I could do that, then I believe I could make a single Armor Stand, sell it from a vendor chest with multiple stock and respawning active and the player could have as many as they wanted. That requires the cloneform so that the items that have their model paths changed would all have different base objects.

If that was impossible, then I was going to alter the script to use moveto's and create about twenty or thirty versions of the Stand, the sacrificial items and the associated script and the player would be limited to that many.

edit: I saw there were checks for items that take up multiple slots. I was going to include them as I expanded the script. In the long run I was hoping someone might donate a new Armor Stand model and a Dressmaker's model (for clothing display)...this was partly because I didn't want it to be dependent on KotN, and partly because Beths Armor Stand model is very weirdly shaped.

editedit: I added a check to make it only cloneform the object once, and only create the reference once as well. That should be helpful.

Looking at my variables with "sv" after adding some armor I found that the five string_var variables are numbered 1,2,3,4,5, which I assume is just a reference to where the string is actually stored. However it still doesn't seem to transfer to the replacement item.

jawArmorStandCuirassRef.SetMaleGroundPath "meshes/armor/daedric/m/cuirass.nif" -> works with no problem
jawArmorStandCuirassRef.SetMaleGroundPath jawArmorStandCuirassPath -> I just get the missing mesh placeholder.
User avatar
Sami Blackburn
 
Posts: 3306
Joined: Tue Jun 20, 2006 7:56 am

Post » Fri May 27, 2011 10:39 am

Does any of the array commands work within an ini file called with RunBatchScript?

I want to initialize an array with values from an ini file, and was hoping that ar_List could work in the ini file. Failing that, I was hoping "set arr[0] to value", etc. may work if the array is already constructed before the call to RunBatchScript.
User avatar
BEl J
 
Posts: 3397
Joined: Tue Feb 13, 2007 8:12 am

Post » Fri May 27, 2011 9:22 am

Does any of the array commands work within an ini file called with RunBatchScript?

I want to initialize an array with values from an ini file, and was hoping that ar_List could work in the ini file. Failing that, I was hoping "set arr[0] to value", etc. may work if the array is already constructed before the call to RunBatchScript.
Just tried it out to be sure but it isn't possible. Any command involving arrays requires it to be inside an OBSE context (let, eval, while, etc.) and non of them work in the console. Sad but true. :(

Question of my own regarding ar_List, when used on an array that already holds elements, will it add the new elements after the current ones or will it essentionally return a new array? If it's the latter, can I do something like?
arrVar1 + arrVar2
If not, could that be added in v19, useful for when you wanna add stuff to an array without loosing the current elements. :)
User avatar
vanuza
 
Posts: 3522
Joined: Fri Sep 22, 2006 11:14 pm

Post » Fri May 27, 2011 3:47 am

Just tried it out to be sure but it isn't possible. Any command involving arrays requires it to be inside an OBSE context (let, eval, while, etc.) and non of them work in the console. Sad but true. :(
OK. I guess it may be possible to work around it by using something like:

set my_string to sv_Construct "val1|val2|val3..."
etc. and then from my script divide what's between the "|"'s into an array. How long can such a string be btw?

Question of my own regarding ar_List, when used on an array that already holds elements, will it add the new elements after the current ones or will it essentionally return a new array? If it's the latter, can I do something like?
arrVar1 + arrVar2
If not, could that be added in v19, useful for when you wanna add stuff to an array without loosing the current elements. :)
I'm pretty sure it returns a new array. But you should be able to use "ar_InsertRange" to combine the two arrays.
User avatar
Sam Parker
 
Posts: 3358
Joined: Sat May 12, 2007 3:10 am

Post » Fri May 27, 2011 5:30 am

OK. I guess it may be possible to work around it by using something like:

set my_string to sv_Construct "val1|val2|val3..."
etc. and then from my script divide what's between the "|"'s into an array. How long can such a string be btw?
That should work yes, just keep in mind the 73-bytes bug when using set/to (where the game CTDs when you have a set/to line that is greater than 73-bytes when compiled, happens very quickly when working with strings). Best use sv_Construct to initialize the string_var and then use sv_Set to set the actual string.
set MyQuest.svTmp to sv_Construct "BlaBla"sv_Set "val1|val2|val3|val4" MyQuest.svTmp
The doc no longer holds the info on sv_Set but it is similar to sv_Construct. Only exception is that the string_var needs to be placed at the very end, after any possible formatter parameters.

I'm pretty sure it returns a new array. But you should be able to use "ar_InsertRange" to combine the two arrays.
Yes ofcourse. *facepalm*
User avatar
Hazel Sian ogden
 
Posts: 3425
Joined: Tue Jul 04, 2006 7:10 am

Post » Fri May 27, 2011 8:09 am

Can I use a messagebox or printc or anything similar to print the contents of a string_var reference so that I can see them?
User avatar
Julia Schwalbe
 
Posts: 3557
Joined: Wed Apr 11, 2007 3:02 pm

Post » Fri May 27, 2011 1:47 pm

Can I use a messagebox or printc or anything similar to print the contents of a string_var reference so that I can see them?
Yes, use the %z formatter with functions that take a http://obse.silverlock.org/obse_command_doc.html#FormatSpecifiers. PrintC and MessageBoxEx are two examples.
User avatar
kat no x
 
Posts: 3247
Joined: Mon Apr 16, 2007 5:39 pm

Post » Fri May 27, 2011 12:25 am

I didn't see that this got answered in the last thread so I'll repost:
If I wanted to make the HUD slowly disappear until it's invisible in 5 seconds, would the script be something like this:
float alphaOLDfloat alphachangeshort donebegin gamemodeif done == 0	 set alphaOLD to Getmenufloatvalue "HUDxmlfilestuff/alpha" 1004; I presume its just called alpha	 set done to 1endifif done == 1 	 set alphachange to 100 - (100/5) * GetSecondsPassed	 setMenuFloatvalue to "HUDxmlfilestuff/alpha" 1004 alphachange	 if alphachange == 0		  set done to 2	 endifendifend

This hasn't got answered in this thread or the previous one. I was just wondering if anyone could clarify on this.
User avatar
Miguel
 
Posts: 3364
Joined: Sat Jul 14, 2007 9:32 am

Post » Fri May 27, 2011 3:47 am

This hasn't got answered in this thread or the previous one. I was just wondering if anyone could clarify on this.

Usually when someone doesn't get around to answering the question, it is because no one knows. I think you would have to look through the HUD xml to find where and if the alpha is listed and can be changed. Then you'd need to test.

At a quick look, your alpha degradation ought to work smoothly - but it is something I would want to test. I am also not sure how you would be sure the HUD gets back to full.

Really - this is something you're going to have to play with and see what happens. That will be the fastest way to find your answer. You've waited 20 days so far - I am sure trying it would take less time. If the issue is exactly what portion of the xml to change, you would probably need to look for yourself or ask someone like DarN who has been playing in the XML more (although admittedly for Fallout and not OBSE)
User avatar
Paula Rose
 
Posts: 3305
Joined: Fri Feb 16, 2007 8:12 am

Post » Fri May 27, 2011 10:50 am

Hi, is it possible (and if so how) to get a user-defined function to be called from an ini file with RunBatchScript?


My idea was to create a reference variable defined in a quest script, and set that variable to refer to the function script.

i.e. something like this:

ref my_func...let my_func := MyFunctionScript


and then in the ini file have lines like:

Call my_quest.my_func



However, this seems not to work, MyFunctionScript isn't called at all. If I try the same line in the console (after I know my_func is set to the function script), I get an error message saying left of . must be quest or percistant reference. However, my_quest is a quest in this case, so I don't understand the error message.


So is what I try to do impossible, or am I just doing it wrong?
User avatar
Charity Hughes
 
Posts: 3408
Joined: Sat Mar 17, 2007 3:22 pm

Post » Fri May 27, 2011 5:00 am

However, this seems not to work, MyFunctionScript isn't called at all. If I try the same line in the console (after I know my_func is set to the function script), I get an error message saying left of . must be quest or percistant reference. However, my_quest is a quest in this case, so I don't understand the error message.
I get the same message when used from console, although the MyQuest.MyRef methode works fine in normal scripts. It's likely Call has either limitations when used in the console or it just doesn't work. I did not get an error message saying Call can not be used from the console like I get with let

But there is something that might work, if you try calling 'Call functionID (formID)' from the console and it works, then you can use a system like this:
string_var YourFunctionID.....let YourFunctionID := (first two digits of your mod) + functionformID

;Use RunScriptLine in order to use a format string.RunScriptLine "Call %z" YourQuest.YourFunctionID
Gonna try it out real quick.

[edit]Using formID with call doesn't seem to work in the console. It keeps saying "Expected user function".[/edit]

-kyoma
User avatar
Lucie H
 
Posts: 3276
Joined: Tue Mar 13, 2007 11:46 pm

Post » Fri May 27, 2011 10:50 am

Hi, is it possible (and if so how) to get a user-defined function to be called from an ini file with RunBatchScript?

No.
User avatar
Philip Lyon
 
Posts: 3297
Joined: Tue Aug 14, 2007 6:08 am

Post » Fri May 27, 2011 11:01 am

OK, thanks for the answers. I guess I have to think of something else then, or wait for OBSE 19 and hope for the possibility of loading a full array with values from an ini file :)
User avatar
Nomee
 
Posts: 3382
Joined: Thu May 24, 2007 5:18 pm

Post » Fri May 27, 2011 12:28 am

Any chance of showing the correct code displacement on 'eval' error messages?

For me, all error messages related to eval show the displacement 0x00000005, no matter what:

Error in script 1500714cOperator == failed to evaluate to a valid result	File: ModName.esp Offset: 0x00000005 Command: eval (0x1769) Error in script 1500714cAn expression failed to evaluate to a valid result	File: ModName.esp Offset: 0x00000032 Command: <unknown> (0x7265)

Not that big a deal, but it would help when using Script Viewer as I do.
Btw, I would say the Script Viewer cut by half my debugging time. Thanks again.

= = = = = = = = = = = = = = = = =

[EDIT] A debugging function that would be nice to have is a 'OnError" kind of function.

Something like these lines placed at the beginning of a script: "OnError ar_dump MyArray" or "OnError call MyFunctionToPrintTheStateOfTheMod" would cause the command on the OnError Function to run whenever an error message was printed on the console.

This would save an extra debugging cycle to add those debugging lines to the script.
User avatar
Josh Trembly
 
Posts: 3381
Joined: Fri Nov 02, 2007 9:25 am

Post » Fri May 27, 2011 12:14 am

I got the basics of my Armor Stand working. Thank god for ConScribe and debugging text.

As usual, the problem all came down to money. Or, rather, to the $ I needed to place in front of my string variables so that the script would put the contents of the variable into the model path, instead of the name of the variable.

Now I need to script it to make it more realistically functional....and then learn to model.
User avatar
Natalie Taylor
 
Posts: 3301
Joined: Mon Sep 11, 2006 7:54 pm

Post » Fri May 27, 2011 12:37 pm

[EDIT] A debugging function that would be nice to have is a 'OnError" kind of function.

Something like these lines placed at the beginning of a script: "OnError ar_dump MyArray" or "OnError call MyFunctionToPrintTheStateOfTheMod" would cause the command on the OnError Function to run whenever an error message was printed on the console.

This would save an extra debugging cycle to add those debugging lines to the script.
Seconded ?. A new script block perhaps. That would tremendously help with debugging.


Request for v19 : Conditional Ternary Operator ?:

Question about the Plugin API : How remove/overwrite previously written records from/in the co-save ?

Having issues with the stringVar interface. The plugin has a valid handle registered with the interface. This function causes a crash :
static bool Cmd_ConScribe_GetRegisteredLogName_Execute(COMMAND_ARGS){    const char * modName = resolveModName(scriptObj);    if (modName == NULL)        return true;    if (logNameRegister.count(modName))    {        Console_Print("%s->getRegisteredLogName = %s", modName, logNameRegister[modName].c_str());        g_stringvar->Assign(PASS_COMMAND_ARGS,logNameRegister[modName].c_str());    }    else    {        Console_Print("%s->getRegisteredLogName = 0", modName);        g_stringvar->Assign(PASS_COMMAND_ARGS,"0");    }    return true;}
The assign statement causes a CTD, apparently. The function uses kParamInfo_OneOptionalInt as it's paramlist. Scribe takes Format_String_Params and doesn't have any issues. g_stringvar is defined as a global [OBSEStringVarInterface* g_stringvar = NULL].
User avatar
Miss Hayley
 
Posts: 3414
Joined: Tue Jun 27, 2006 2:31 am

Post » Fri May 27, 2011 6:53 am

Any chance of showing the correct code displacement on 'eval' error messages?

For me, all error messages related to eval show the displacement 0x00000005, no matter what:

Yes, I've been meaning to make the offsets more helpful. Currently you won't get a useful offset if an error occurs within nested commands, which is most noticeable when using eval.
Seconded ?. A new script block perhaps. That would tremendously help with debugging.

Request for v19 : Conditional Ternary Operator ?:

Question about the Plugin API : How remove/overwrite previously written records from/in the co-save ?

Having issues with the stringVar interface. The plugin has a valid handle registered with the interface. This function causes a crash :
static bool Cmd_ConScribe_GetRegisteredLogName_Execute(COMMAND_ARGS){    const char * modName = resolveModName(scriptObj);    if (modName == NULL)        return true;    if (logNameRegister.count(modName))    {        Console_Print("%s->getRegisteredLogName = %s", modName, logNameRegister[modName].c_str());        g_stringvar->Assign(PASS_COMMAND_ARGS,logNameRegister[modName].c_str());    }    else    {        Console_Print("%s->getRegisteredLogName = 0", modName);        g_stringvar->Assign(PASS_COMMAND_ARGS,"0");    }    return true;}
The assign statement causes a CTD, apparently. The function uses kParamInfo_OneOptionalInt as it's paramlist. Scribe takes Format_String_Params and doesn't have any issues. g_stringvar is defined as a global [OBSEStringVarInterface* g_stringvar = NULL].

Plugins don't overwrite or remove data from a co-save. Each time the game is saved, your save callback saves all of the data it needs to for that particular game session. When the player overwrites a savegame, he overwrites the associated .obse file as well.
Put another way, you are saving the current state of your data at the time of the save, with no reference to data which may have been previously saved.

Did you use the QueryInterface() API to retrieve and store a valid OBSEStringVarInterface* in g_stringVar?
User avatar
Miss K
 
Posts: 3458
Joined: Sat Jan 20, 2007 2:33 pm

Post » Fri May 27, 2011 12:28 am

Moved to CS forum.
User avatar
kevin ball
 
Posts: 3399
Joined: Fri Jun 08, 2007 10:02 pm

Post » Fri May 27, 2011 8:20 am

Plugins don't overwrite or remove data from a co-save. Each time the game is saved, your save callback saves all of the data it needs to for that particular game session. When the player overwrites a savegame, he overwrites the associated .obse file as well.
Put another way, you are saving the current state of your data at the time of the save, with no reference to data which may have been previously saved.
Got it.

Did you use the QueryInterface() API to retrieve and store a valid OBSEStringVarInterface* in g_stringVar?
I'd re-defined the variable inside the function :banghead: But using let to assign the value to a string var gives me a Operator := failed to evaluate to a valid result error. Set yields null and print $getRegisteredLogName seems to return the stringID. It fails, however, when called without the ToString operator.

Is argument type checking all that can be done at compile time ? Would it be possible to evaluate their values ?
User avatar
Lisa Robb
 
Posts: 3542
Joined: Mon Nov 27, 2006 9:13 pm

Post » Fri May 27, 2011 8:22 am

Got it.

I'd re-defined the variable inside the function :banghead: But using let to assign the value to a string var gives me a Operator := failed to evaluate to a valid result error. Set yields null and print $getRegisteredLogName seems to return the stringID. It fails, however, when called without the ToString operator.

Is argument type checking all that can be done at compile time ? Would it be possible to evaluate their values ?

You need to define the return type of the command as kRetnType_String.
User avatar
cheryl wright
 
Posts: 3382
Joined: Sat Nov 25, 2006 4:43 am

Post » Fri May 27, 2011 12:44 pm

Nevermind.
User avatar
Laura Shipley
 
Posts: 3564
Joined: Thu Oct 26, 2006 4:47 am

Post » Fri May 27, 2011 9:18 am

Got a request for v19 or maybe to sneak in a possible v18a :angel:, a GetLastWeatherID. To be used when http://cs.elderscrolls.com/constwiki/index.php/GetCurrentWeatherPercent is between 0 and 1, it would return the weatherID from which the new weather transitions. GetCurrentWeatherID only returns the weather that is transitioned to.
User avatar
Misty lt
 
Posts: 3400
Joined: Mon Dec 25, 2006 10:06 am

PreviousNext

Return to IV - Oblivion