Talk:Reference Variables

From the Oblivion ConstructionSet Wiki
Revision as of 10:55, 25 March 2008 by imported>Haama (→‎Update: Terminology Discussion)
Jump to navigation Jump to search

Update: Terminology Discussion

This article needs to be updated to reflect the changes decided in the Terminology Discussion. First of all, it should be moved to Record Variables, and then the difference and reasons should be explained. I will probably do this myself, but I cannot at this moment, so I'm just leaving a note.
Dragoon Wraith TALK 21:04, 27 January 2008 (EST)

Can you link to the article you are referencing? I tried searching for it so I could study up on any decisions, but all I found was Community_Portal/Terminology_Discussion, which points to another page on another site... is that the page you mean? Thanks, -Laisren 01:11, 25 March 2008 (EDT)
That would be the one. Also, please use : to indent for replies - see Welcome_to_the_Wiki#Talk Pages.--Haama 03:03, 25 March 2008 (EDT)

Haama, I noticed you said you were going to update this - how up to that do you feel? I can't remember the original discussion too clearly, so I don't even know if you were there - but I've been meaning to do this for a long while, so if you would like me to instead, let me know.
Dragoon Wraith TALK 06:02, 25 March 2008 (EDT)

Let me give it another (50th) shot a bit later today. I think I'll leave it on a test page - as I've said before it will probably require collaboration to get it right.--Haama 11:55, 25 March 2008 (EDT)

Technical Workings of Ref Variables?

How are reference variables stored internally. I'm having issues reliably accessing my reference variables when there get to be more than 16 user created ones in a cell. I get correct behaviour sometimes but not all the time. I can provide an ESP and simple instructions to replicate the problem. It is possible it is my code however which is why I would like to try and eliminate as many issues as possible, since you certainly don't have time to be debugging my scripts.

On further testing, I see that the same code works perfectly sometimes and not others. Is it possible to hit race conditions in scripts? I assumed they would be linearly processed with no interruption. If that's not the case, then the errors I am getting virtually require that the references I have stored are variable and not fixed as I would expect. Almost nothing else describes this behavior. --Tegid 00:16, 24 April 2006 (EDT)

I'm not sure what you mean by "race conditions in scripts". Script processing is threaded, however, so several scripts can be processed simulataneously, if that's what you're referring to. --Kkuhlmann 08:02, 25 April 2006 (EDT)

That's what I mean. So two scripts can be running simultaneously both of them operate on the same persistent data, we can have data races. Do you run blocks of scripts together (ie, do you split the scripts into separate threads on groups of 16 scripts (or 32)) I ask that because things work correctly, reliably with 16 new objects, but with 18 (I create two at a time) things stop working reliably (they more reliably fail to work). --Tegid 09:16, 25 April 2006 (EDT)

Unnecessary Caveats

CAVEAT: Objects created by leveled lists do not process in low, if you set a reference variable from a leveled list, if your script tries to refer to that reference variable when that actor isn't loaded, bad things will happen. So don't ever do a "set myRefVariable to myXmarker.placeAtMe myLeveledList". Instead create an if-then section in a script which checks the player level, pick an appropriate base object for the players level, then do a "set myRefVariable to myXmarker.placeAtMe SpecificBaseObjectID".--Jduvall

This happens when you try to refer non-persistent objects or those that can be put in a container, not a specific problem with reference variables or leveled lists.--JOG 17:19, 24 May 2006 (EDT)


CAVEAT 2: You can not pass reference variables IN OTHER SCRIPTS as parameters to functions that take references. You must first set a local reference variable. For example: "myCharacterRef.look MyQuestScript.myReferenceVariable" will fail whereas "myCharacterRef.look myReferenceVariableDeclaredInThisScript" will work just fine. So in the local script just declare a "ref myReferenceVariableDeclaredInThisScript" and then set it to the external one "set myReferenceVariableDeclaredInThisScript to MyQuestScript.myReferenceVariable", and use the local one.--Jduvall

You can't use ANY variables this way.--JOG 17:19, 24 May 2006 (EDT)

Persistence?

Looking at this description from the article:

Keep in mind, that References to non-persistent objects aren't accessible when the object is not in memory (i.e. in another cell) The same applies to inventory items that are currently within a container. Trying to access a non-accessible reference might have no effect at all, but it's equally probable that it will crash the game. While there are safeguards in the CS to prevent you from accessing such references directly, you can bypass them by using reference-variables.

...If I'm understanding that right, a variable that stores a reference to a non-persistent object (such as one created via placeAtMe) is valid as long as the cell is loaded, even after the cell has been reset or a savegame is loaded? Scruggs 00:23, 20 July 2006 (EDT)

Yes, persistent means they're accessible by scripts from wherever they are (i.e. the references are always loaded into memory) non-persistent means they're just accessible when the cell is loaded.--JOG 10:22, 20 July 2006 (EDT)
Thanks. Scruggs 10:45, 20 July 2006 (EDT)

Quest as Function Reference?

Dragoon Wraith TALK 11:51, 14 August 2006 (EDT): JOG, you just added this: "Uninitialized reference variables act as if they referred to the scripted object or quest itself" - what do you mean? What functions can take a quest as the calling object?

All of them, of course there usually is no effect.
If Getquestrunning ReferenceVariable
Works fine for example
set MyReference.variable to 1
Can be used to set a variable in a quest.
You can also set Reference-Variables to Base Objects and cells and use them as placeholder for the EditorIDs in the appropriate commands:
If GetIncell Referencevariable
Ref Currentammo
Set Currentamo to Arrow1Iron
Player additem Currentammo 1

--JOG 13:10, 14 August 2006 (EDT)

Dragoon Wraith TALK 23:21, 14 August 2006 (EDT): That's cool, good to know, thanks JOG!