Jump to content

xWilburCobbx

Members
  • Posts

    92
  • Joined

  • Last visited

Posts posted by xWilburCobbx

  1. I have answered my own question! As it turns out, it just shows the objectives in the order the script sets them in, I don't know why it didn't dawn on me till now. So (90) is at the bottom, and (5) is at the top.

    self.SetObjectiveDisplayed(90)
    self.SetObjectiveDisplayed(80)
    self.SetObjectiveDisplayed(75)	
    self.SetObjectiveDisplayed(74)
    self.SetObjectiveDisplayed(70)
    self.SetObjectiveDisplayed(60)
    self.SetObjectiveDisplayed(50)
    self.SetObjectiveDisplayed(40)
    self.SetObjectiveDisplayed(30)
    self.SetObjectiveDisplayed(6)
    self.SetObjectiveDisplayed(5)
  2. Ok new development... It's got to be something SKI UI is doing. If I set the value by using the OnOptionDefault() function with a float value that is set to 0.1, it will work normally.

    float Property fDefPer = 0.1 auto
    
    event OnOptionDefault(int option)
    
    	gPercent.SetValue(fDefPer)
    	fPer = fDefPer
    	SetSliderOptionValue(_Multiplier, fPer, "x{2}")
    	IncQS.UpdStatVal()
    	iTot = gTotIncStat.GetValue() as int ;Updates the ForceMoney value
    	SetTextOptionValue(_ForceMoney, iTot)
    	
    endEvent
    

    Something about SKI UI's slider system is probably outputting strange values.

  3. I don't know why this is happening, but I have a simple math operation that takes a global variable, multiplies it by 0.1. Normally this outputs like it should, but if I use an MCM programmed for SKI UI to adjust the 0.1 and put it back, it outputs the value by 1 less then it should.

     

    This script fragment is the main one that runs this calculation:

     

    gTotalPaid.GetValue() = 5,000 * gPercent.GetValue() = 0.1

    fTot = (gTotalPaid.GetValue() * gPercent.GetValue())
    gTotIncStat.SetValue(fTot)
    

    fTot outputs 500 if untouched, but if I move it up to 0.11 and back to 0.10, it then outputs 499.

     

    This isn't the full code, but this is what I use for my SKU UI. These are the important pieces of the code that actually do the adjustments:

     

     

    ;CODE FRAGMENTS
    
    ;----------
    ;Properties
    ;----------
    
    float Property fDefPer auto
    
    float fPer
    
    GlobalVariable Property gTotIncStat auto
    GlobalVariable Property gInterval auto
    
    int iTot
    
    int _Multiplier
    int _ForceMoney
    
    AboveScript property IncQS auto
    
    ;---------
    ;Functions
    ;---------
    
    event OnPageReset(string page) ;When the meny starts these values are assigned
    
    	iTot = gTotIncStat.GetValue() as int
    	fPer = gPercent.GetValue()
    
    	_Multiplier = AddSliderOption("Income Multiplier", fPer, "x{2}") ;This is the slider itself
    
    endEvent
    
    
    event OnOptionSliderOpen(int option) ;This is how my slider adjust the settings
    
    	SetSliderDialogStartValue(fPer)
    	SetSliderDialogDefaultValue(fDefPer)
    	SetSliderDialogRange(0.01, 10)
    	SetSliderDialogInterval(0.01)
    
    endEvent
    
    
    event OnOptionSliderAccept(int option, float value) ;This segment will set the percent global to the selected value, and re-run the other code fragment from another script
    
    	gPercent.SetValue(value)
    	fPer = value
    	SetSliderOptionValue(_Multiplier, fPer, "x{2}")
    	IncQS.UpdStatVal()
    
    	iTot = gTotIncStat.GetValue() as int ;Updates the ForceMoney value
    	SetTextOptionValue(_ForceMoney, iTot)
    
    endEvent
     

     

     

     

    What's weird is it will subtract 1 from only some multiples. Multiples of 0.05 generally subtract 1, but not all. 0.08 will even give me a flat 400.

     

    Does anyone know why Papyrus calculates like this? It shouldn't be rounding up/down since 0.10 should be outputting whole numbers. It just takes 1 away from the result on some multiplier values for seemingly no reason.

  4. Could you have a separate quest for each item? All the quests started by the same trigger. That way you could turn off individual targets at will. An ending quest could be started when all of the individual quests are completed or the ending quest could be started at the same time as the individual ones but to get to the next stage the individual quests must all be completed. The ending quest could track the total number of individual quests that are completed and have a stage of 1 completed, 2 completed up to all completed stage.

    Sounds worse than lumping them all together to be honest, imagine having 11+ quests in your list! I think what I have isn't too bad, some things are getting moved around to different quest anyways.

  5. If you create additional stages you can breakdown your objectives into smaller groups or even individually. Each stage will handle one objective or a set of objectives, complete that objective and advance to the next stage for the next objective or set of objectives.

    That's probably what I would do normally, but in this case it's extremely important all 11 objectives are available at once. It doesn't look too bad when your inside cities, but some cities are outside and it crowds the compass a bit. The game will embolden the closest objective so it's not horrible, but it might be a bit inconvenient if the player has to double check the map in some cases.

  6. I actually have two different questions.

     

    The way my quest works you need to have a lot of objective markers, it has 11 and they are all displayed at once. To help keep the objectives in order, I tried changing the IDs of my first two objectives so it fits in the list alphabetically. In game they just show in the order they were created in! Even if I delete them and recreate them using the same IDs they still appear in their original place.

     

    Also, is there a way to make the objectives selectable? Like the Misc quest, but without actually putting in the misc quest.

     

    None of these are necessarily game breaking, but if there is any way I can improve the aesthetic I would like to know. My mod is gonna ship soon and I want to make it look it's best.

  7. What will happen there is, assuming it starts in the Waiting state and something triggers the OnActivate Event:

     

    The OnActivate event declared in the Waiting state starts processing. The first thing it does is put the script into the empty state, so any further function calls or event triggers will use the versions declared in the empty state. Then it proceeds to call MyFunct(), which will use the empty state version, and therefore not call MyFunct2(), so the script doesn't get put back into the Waiting state.

    Yeah, I figured as much, thanks for clarifying. Its super useful to know that once a function is ran, no matter what state the script changes to while running the function, it wont stop and it will only change for future runs.

  8.  

    foamyesque and ReDragon2013 are more than capable to guide you through this.
    I just want to add that, although 'States' are one of the most reliable and fastest functions, they need an extensive care, you need to be very careful with them.
    One wrong 'State Call' or one simple 'Typo' can F**** UP EVERYTHING !!l.
    Plus the most important : TYPOS on the 'State' won't trigger a "Compile Error", so you can have a fully functional without errors script that in-game is not working correctly and all this because your 'State' has a 'Typo'.
    It happened to me with the mod i recently released.
    A few days before publishing it, i made a minor addition to one simple script and didn't test it, there was no need for it since it's just a simple script, but in-game the script wasn't working correctly.
    All of this from some stupid cookie crumbs on my keyboard !!, instead of writing "GoToState("WaitingPlayer")" i wrote "GoToState("WaitingPlayr")" without an "E".

     

    You aren't kidding! I typo'd "GotoState("Standby")" and wrote "Standb" I had a bit of a hard time understanding why my trigger wasn't usable after I clicked away the fail message. I opened the .psc back up and immediately spotted it, luckily my script is small!

  9. Don't need to explicitly declare the empty activation in the Disabled state. Undeclared events fall back to their defaults, which is an empty block anyway.

     

    However, my suggestion would be to go to the Disabled state immediately on activation, regardless of whether or not the player has the gold, etc. Do all those checks there, and then either display the menu or go back to the Active state. This gives the smallest possible window for malformed input and should functionally guarantee that all the code finishes running, in either path, before a new trigger can start it again.

     

    For clarity I'd probably rename them from Active -> Waiting and Disabled -> Active.

    Noted. Thanks! I changed it up, I wasn't aware changing the state didn't end the current function abruptly.

     

     

    Scriptname AAAxWCxINVxPurchaseScript extends ObjectReference  
    {Used to buy a property to generate income.}
    
    ;----------------
    ;Local properties
    ;----------------
    
    bool property IsInn = false auto
    {Increases price by 50%}
    
    GlobalVariable Property gCnt auto
    {Objective counter}
    
    GlobalVariable Property gCntTotal auto
    {Objective counter cap for completion}
    
    GlobalVariable Property gBasePrice auto
    {Starting price tier}
    
    int property ModObjID auto
    {ID of objective to count}
    
    AAAxWCxINVxAliasControl property AliasQS auto
    {Alias to control}
    
    ;--------------------
    ;Universal properties
    ;--------------------
    
    Actor property PlayerREF auto
    
    float fCost
    
    GlobalVariable Property gTotalPaid auto
    
    MiscObject Property mCoin auto
    
    Message property mMenuP auto
    Message property mMenuFailP auto
    
    MusicType property muBuy auto
    
    Quest property qIncByInt auto
    
    AAAxWCxINVxIncomeScript property IncQS auto
    
    ;------
    ;States
    ;------
    
    Auto State Standby ;Debug--allows the player to activate the trigger
    	Event OnActivate(ObjectReference akActionRef) ;Checks to see if the player has the money and changes state
    		GotoState("")
    		fCost = gBasePrice.GetValue()
    		if IsInn == true ;Calculates the cost of the property
    			fCost *= 1.5
    		endif
    		
    		if PlayerREF.GetGoldAmount() >= fCost
    			BuyMenu()
    		else
    			mMenuFailP.Show(fCost)
    			GotoState("Standby")
    		endif
    	EndEvent
    endState
    
    ;---------
    ;Functions
    ;---------
    
    Event OnActivate(ObjectReference akActionRef) ;Debug--stops the player from activating trigger
    	;Do nothing
    EndEvent
    
    Function BuyMenu(int aiButton = 0) ;Takes the player's money/adds 1 to the objective/runs an income update from a remote script
    	aiButton = mMenuP.Show(fCost)
    	if aiButton == 0 ;Yes
    		PlayerREF.RemoveItem(mCoin, fCost as int)
    		gTotalPaid.Mod(fCost)
    		qIncByInt.ModObjectiveGlobal(1, gCnt, ModObjID, gCntTotal.GetValue(), true, true)
    		IncQS.UpdStatVal()
    		if qIncByInt.IsRunning() == False ;Starts the income quest if its disabled
    			qIncByInt.Start()
    		endif
    		Debug.Notification("Property purchased!")
    		muBuy.Add() ;Plays sound effect
    		DeleteRef(self.GetLinkedRef(), self.countLinkedRefChain())
    	else ;No
    		GotoState("Standby")
    	endif
    endFunction
    
    Function DeleteRef(ObjectReference LRef = none, int iLCnt = 0) ;Fades/Deletes any custom sign objects and controls the alias from a remote script
    	self.Disable() ;Disables initially for AliasCtrl
    	AliasQS.AliasCtrl()
    	while iLCnt > 1 ;Loops till all linked references are erased from the chain
    		LRef.Disable(true)
    		LRef.Delete()
    		LRef = LRef.GetLinkedRef()
    		iLCnt -= 1
    	endWhile
    	Self.Delete()
    EndFunction 

     

     

     

    Which brings me to my next consistently recurring train of thought. What will force a script to drop what it's doing, besides "return"?

     

    Would this work? Or will it only read the current running function before before having issues?

     

     

    Scriptname NewScript extends ObjectReference
    
    Auto State Waiting
    	Event OnActivate(ObjectReference akActionRef)
    		GoToState("")
    		MyFunc()
    	endEvent
    	
    	Function MyFunc()
    		MyFunc2()
    	endFunction
    endState
    
    Event OnActivate(ObjectReference akActionRef)
    	;Do nothing or something else
    endEvent
    
    Function MyFunc()
    	;Do nothing or something else
    endFunction
    
    Function MyFunc2()
    	;Do stuff
    	GoToState("Waiting")
    endFunction 

     

     

     

    I have a feeling this will fail to run "MyFunc()" inside the "Waiting" state, and will run the one inside the empty state instead. That would makes since to me, but let's make sure I am not going insane here.

  10. We don't even stock mechanical harddrives any more.... as SSD's have gotten dirt cheap.

    That's actually kind of crazy. My SSD is rated to last up to 10 years or more, SSDs in general are actually surpassing HDDs in life span. This is with normal use as well.

     

    My lap can only house 1 SATA drive at a time, I was only able to install my Samsung because newer PCs have M.2 slots and that's what I ordered it with. So I actually have 3GBs of storage, 1GB of an ultra high speed M.2 SSD, and 2GB of a SATA SSD which is slower, but not noticeably.

     

     

    I'm definitely (as long as your fine with it) going to add you to the list of credits for the mod (if it gets done someday), and you just saved me 1,200 dollars and a week of switching everything over to a new system.

    No need! If you insist you have my permission, but It was a very simply test. I also got to learn that the CK is limited in how fast it can operate, which is advantageous knowledge to anyone who is sketchy about its overall performance. This program was released in 2012? That's not even counting its existence for developers, could go all the way back as far as Morrowind! It's an ancient piece of software, that has way too many bugs to count. Its a no wonder it runs like truck.

  11. You can absolutely custom define new events and there's no difference whatsoever script-wise between the two. All events are functions, and you can convert a function to an event just by changing its declaration. Nothing will care. The distinction is purely a meta one for the programmer, to highlight things that are triggered by the game doing something.

    This is interesting actually, I never knew because I always just use Funcion when I make them. Makes since I wouldn't know that, especially if declaring it an Event is moot.

  12. Well ReDragon2013 gave me a new idea, funny enough it's actually related to a completely different issue with the script, the way you re-did my delete function with "myF_REM(Int i = 0)" got me thinking about it. I didn't remember I could only do 1 Linked Reference per keyword on an object, so I changed the system to dynamically erase every object in a linked chain.

     

    "change button position to prevent ESC pressed error" I have never heard of this one before, when I go into the game I can't use ESC to exit, and when I turn my controller on it forces me to pick one of the options. Is this related to SkyUI? I have been testing this mod on the vanilla version, trying to keep it away from dependencies since the mod is just too simple.

     

    Also, you really go out of your way to re-write the script in your own technique, that's pretty awesome. What I notice is you really like to use IF statements then manually force the script to stop with RETURN. Why is that? Do you just like to keep things on 1 level for read-ability?

     

    maxarturo I decided to use your way because it makes me feel like my script has more stable security against multiple activations. Though I don't know if it actually does, or if using a bool/int does the job equally well.

     

    testiger2 & NexusComa2 I am no programmer! So I don't understand concepts like "Fist time Flag" yet. I am scratching the surface on learning more advanced methods of scripting, so I appreciate the knowledge.

     

    So, this is what I have come up with, it does 1 new operation but it does essentially the same thing.

     

    The only thing that I am unsure of is using a while loop in "Function DeleteRef()". I heard this can bloat saves, but is it fine if its just fired for a brief amount of time? I feel like uninstalling the mod while its actively doing this in a save is a highly unlikely phenomenon.

     

     

     

    Scriptname AAAxWCxINVxPurchaseScript extends ObjectReference  
    {Used to buy a property to generate income.}
    
    ;----------------
    ;Local properties
    ;----------------
    
    bool property IsInn = false auto
    {Increases price by 50%}
    
    GlobalVariable Property gCnt auto
    {Objective counter}
    
    GlobalVariable Property gCntTotal auto
    {Objective counter cap for completion}
    
    GlobalVariable Property gBasePrice auto
    {Starting price tier}
    
    int property ModObjID auto
    {ID of objective to count}
    
    AAAxWCxINVxAliasControl property AliasQS auto
    {Alias to control}
    
    ;--------------------
    ;Universal properties
    ;--------------------
    
    Actor property PlayerREF auto
    
    float fCost
    
    GlobalVariable Property gTotalPaid auto
    
    MiscObject Property mCoin auto
    
    Message property mMenuP auto
    Message property mMenuFailP auto
    
    MusicType property muBuy auto
    
    Quest property qIncByInt auto
    
    AAAxWCxINVxIncomeScript property IncQS auto
    
    ;------
    ;States
    ;------
    
    Auto State Enabled ;Debug--allows the player to activate the trigger
    	Event OnActivate(ObjectReference akActionRef) ;Checks to see if the player has the money and changes state
    		fCost = gBasePrice.GetValue()
    		if IsInn == true ;Calculates the cost of the property
    			fCost *= 1.5
    		endif
    		
    		if PlayerREF.GetGoldAmount() >= fCost
    			GotoState("Disabled")
    		else
    			mMenuFailP.Show(fCost)
    		endif
    	EndEvent
    endState
    
    State Disabled ;Debug--stops the player from activating trigger
    	Event OnActivate(ObjectReference akActionRef)
    		;Do nothing
    	EndEvent
    	
    	Event OnBeginState() ;Shows the menu
    		BuyMenu()
    	endEvent
    endState
    
    ;---------
    ;Functions
    ;---------
    
    Function BuyMenu(int aiButton = 0) ;Takes the player's money/adds 1 to the objective/runs an income update from a remote script
    	aiButton = mMenuP.Show(fCost)
    	if aiButton == 0 ;Yes
    		PlayerREF.RemoveItem(mCoin, fCost as int)
    		gTotalPaid.Mod(fCost)
    		qIncByInt.ModObjectiveGlobal(1, gCnt, ModObjID, gCntTotal.GetValue(), true, true)
    		IncQS.UpdStatVal()
    		if qIncByInt.IsRunning() == False ;Starts the income quest if its disabled
    			qIncByInt.Start()
    		endif
    		Debug.Notification("Property purchased!")
    		muBuy.Add() ;Plays sound effect
    		DeleteRef(self.GetLinkedRef(), self.countLinkedRefChain())
    	else ;No
    		GotoState("Enabled")
    	endif
    endFunction
    
    Function DeleteRef(ObjectReference LRef = none, int iLCnt = 0) ;Fades/Deletes any custom sign objects and controls the alias from a remote script
    	self.Disable() ;Disables initially for AliasCtrl
    	AliasQS.AliasCtrl()
    	while iLCnt > 1 ;Loops till all linked references are erased from the chain
    		LRef.Disable(true)
    		LRef.Delete()
    		LRef = LRef.GetLinkedRef()
    		iLCnt -= 1
    	endWhile
    	Self.Delete()
    EndFunction 

     

     

  13. I used my phone to time everything out, and here are the results.

     

    System

     

    OS: Windows 10 Home 64-bit

     

    System Manufacturer: Micro-Star International Co., Ltd.

     

    System Model: GL75 9SDK

     

    Processor: Intel® Core i7-9750H CPU @ 2.60GHz (12 CPUs), ~2.6GHz

     

    Memory: 16384MB RAM

     

    GPU: NVIDIA GeForce GTX 1660 Ti

     

    Drive: Samsung SSD 860 EVO 2TB

     

     

    Results

     

    Run 1

     

    Dawnguard.esm

    Dragonborn.esm

    HearthFires.esm

    Skyrim.esm

    Update.esm

    (~2:41)

     

    Run 2

     

    Dawnguard.esm

    Dragonborn.esm

    HearthFires.esm

    Skyrim.esm

    Update.esm

    TESV - MiddleEarth.esm

    TESVMiddelearthII.esp

    (~4:16)

     

    Cell load

     

    (~2:00)

    (This one was hard to do speaking CK was having viewport issues. Its took 5sec to load all the object references and get into the cell, and about 2 minutes to load the models in the viewport for the cell & 6 neighboring cells.)

     

    Conclusion

     

    I would run the same test and compare your results, people in general have a bad sense of time! I thought it only took less than 1 min to load the base game+dlc, but I was way off!

     

    If you are right, then I don't see much of a reason to invest in a more a powerful system just for this purpose. Even if its an extra minute or 2, it wouldn't make sense. Only buy a new PC if you plan on doing current gen gaming with it.

  14. I don't if there is any different between a function and an event. Could they replace each other?

    There is some pretty big differences. https://www.creationkit.com/index.php?title=Events_Reference

     

    You can't just make events like you can functions. Example 1 is the way to go, besides why would you want launch an event from an event? If it has to initiate through 1 event, then any functions it runs are all based on the event anyways.

     

    You can add multiple events to the script though.

     

    Event OnInit()

    EndEvent

     

    Event OnActivate()

    EndEvent

  15. As always, I am very happy that you took the time to help me out.

     

    I know I tend to beat around the bush, I apologize. If you get to the last paragraph, I explain what the bug actually was. I was trying to include details just encase there is something I should know about those things that might have been the root cause. I got my answer for that one.

     

    This is essentially what testiger2 was suggesting, except with an int instead of a bool. I would probably just use a bool if my value could only be 1 of 2 things.

     

    I think I ultimately like the idea maxarturo had. Setting a state seems messy, but functionally faster. Instead of telling the script to do value assignments and to assess those values, I can just tell it to go to a state. It will automatically ignore anything not in the state, essentially disabling the OnActivate() event listener.

     

    When I finally get back on the computer, I am gonna show off my finished version and you guys can critique it.

  16. I tell you what I am willing to do if it would really help you, I know making big investments without knowing the benefit is hard. If you ask me, the ability to play modern games on the PC would be my main reason! If that's not your fancy for one thing or another, then I can help you out.

     

    I can detail my actual specs to you, and if you could hand me the files, I can load them myself. I will time them out if CK doesn't log it anywhere, and show you the results between just masterfiles, and MF + those 2 .esp(s).

     

    I can give you the results and you can see for yourself if its worth it or not.

  17. This is about what I have, I bought mine a year ago for $1,400. https://www.ibuypower.com/Store/ASUS-ROG-Strix-G15-G512LU-RS74-Gaming-Laptop

     

    Mine is an MSI, but MSIs sell like hot cakes! So iBUYPOWER doesn't have any right now. Asus is still solid though.

     

    Your main bottle necks are gonna be your GPU, hard drive, and the program itself. I bought one of these for my laptop, https://www.samsung.com/us/computing/memory-storage/solid-state-drives/ssd-860-evo-2-5--sata-iii-500gb-mz-76e500b-am/

     

    Loading all the masterfiles in CK from my Samsung takes like less then 1min, and saving is instant. Ofcourse .esp size and how well the program handles loading it are major factors.

     

    To what extent I don't know.

  18. That depends on what your script does and how busy the system is at that time.

    Yeah I got a little excited and skimmed through the concept of a state on the wiki, I will make sure to read it thoroughly when I go off work for the next day or 2.

     

    I can see so much potential for this! Other then preventing my strange bug, I don't have a use for it else where quiet yet. Especially since Function UpdStatVal() needs to be ran by this script and it's home script.

     

    Luckily if UpdStatVal() is fumbled, its totally fine as long as it is ran again, its not serious.

     

    gTotalPaid.Mod(fCost) is in the script I showed you, and its the absolute most important one that CAN NOT fail under any circumstances.

  19. Just to elaborate on testiger2 post, that is well explained.

    This explains a lot! Yeah I am not too familiar with the bugs of the papyrus engine itself.

     

    I can always make it use a state, I will read documentation on it and touch up my knowledge of states before I just start using them.

     

    I do have portions of other scripts that take data from some globals. I am not on my PC right now, but it is a function that gets called by this very script.

     

    IncQS.UpdStatVal()

     

    It takes values from 2 globals, runs a math operation with them and stores the result in a 3rd global just meant for text replacement.

     

    Should this go in a state? I feel like it would be pointless to switch that into a state, and extremely problematic as the script has other functions that need to be called when it updates.

  20. 1)

    Yeah I was suspicious of that. I wasn't sure if the script was just 1 instance that can run multiple times, or if it just re-initiated everytime it ran.

     

    Now I know to use that to my advantage, and using a bool makes a lot more since to me.

     

    2)

    I see, guess I jumped the gun on that one. As you can probably tell, I am no programmer, but toddlers can make papyrus scripts so I am comfortable with it.

     

    I am just now learning some basic concepts of programming, and my biggest concern after many projects I tossed, is going beyond just functionality.

     

    I want to make sure my scripts wont slow the game down too much, especially when other mods are doing stuff. I am trying to make everything as clean and professional as possible, so in the future I have the skills to write good scripts that behave.

     

    I have dumped a lot of research to ensure my current scripts do whay they need to do in the shortest way possible, and keep them from save bloating.

  21. Thank you for taking the time to answer my questions!

     

    1)

    I can switch to using a bool, seems like it would be faster and cleaner.

     

    My only concern is I don't know if setting a variable outside a function will set it for every instance of that script ran by the specific object.

     

    So lets say the first run sets bLock to true, but it bugs out and runs OnActivate twice. Will the second one read true and stop?

     

    2)

    I went ahead and just eleminated functions that weren't necessary, and just space out and comment on blocks of code to organize it. I decided that unecessary functions don't provide much benefit for its added slowness, and my new method is just as organized, if not more so.

  22. No. Casting is only required if you're going from a general type to a more specific one (for example, ObjectReference -> Actor). Actor already extends ObjectReference, so it can be supplied without casting to anything that expects an ObjectReference, because all actors *are* ObjectReferences.

     

    Which also makes me wonder why you're bothering to store it twice.

    Just to add to that, here is a comprehensive script objects map that shows the hierarchy of extensions.

     

    https://www.creationkit.com/index.php?title=Category:Script_Objects

     

    This is probably one of the most useful pages in the whole wiki.

     

    EDIT 1: If he stores akCaster as Caster out of a function, like at the top with the properties, he can use that in other functions with Caster as the value.

     

    Thats all I could see it be useful for.

     

    EDIT 2: OH, I see... he only needs Caster instead of CasterRef, not both.

×
×
  • Create New...