louisthird Posted August 12, 2020 Author Share Posted August 12, 2020 (edited) ... Do note that the Story Manager only auto-fills aliases when the quest first starts up, so you'll probably have to periodically stop and restart the quest to update the actors in the RefCollectionAlias. ... IDontEvenKnow - Do you have a short example of how you would periodically start and restart the quest? I imagine it would involve the use of StartTimer(), but I have been having trouble getting it to reliably work. How would you do it? ... Looking for some best practice advice here because how I am doing it is likely not. This is what I was trying below. Maybe I need to be doing SecretFormula_QuestScript.Reset(), etc.? Or maybe my script code extending Quest needs to match the Quest name: SecretFormula_Quest ? LMK. Thanks! Scriptname SecretFormula_QuestScript extends Quest import MCM Quest Property SecretFormula_Quest Auto Const int timerId = 8675309 Const Function CheckRunning() If SecretFormula_Quest.IsRunning() Debug.Notification("Secret Formula is running") Else Debug.Notification("Secret Formula is not running") EndIf EndFunction Function ForceRestart() SecretFormula_Quest.Reset() EndFunction Event OnQuestInit() Debug.Notification("Secret Formula Initializing") EndEvent Event OnReset() SecretFormula_Quest.Stop() SecretFormula_Quest.Start() StartTimer(MCM.GetModSettingInt("louisthird_SecretFormula", "iSecretFormulaRefreshTimeInSeconds:Main"), timerId) EndEvent Event OnQuestShutdown() CancelTimer(timerId) EndEvent Event OnTimer(int aiTimerId) If aiTimerId == timerId SecretFormula_Quest.Reset() EndIf EndEvent Edited August 12, 2020 by louisthird Link to comment Share on other sites More sharing options...
SKKmods Posted August 12, 2020 Share Posted August 12, 2020 I would like to say that using Events is more elegant than timers if you can find an event that keys into the likely change. I have abandoned mods that I could not find an event for rather than add more tight timers, but that's just my quality threshold. The code in the controlling quest is simple; Quest Property pFolowrFinderQuest Auto Const Mandatory Float fQuestResetTimer = 60.0 Int iQuestResetTimer = 10 Bool bIsThisFunctionActive = False OnTimer(Int iTimer) If (iTimer == iQuestResetTimer) pFollowerFinderQuest.Stop() pFollowerFinderQuest.Start() If (bIsThisFunctionActive == TRUE) Self.StartTimer(fQuestResetTimer, iQuestResetTimer) Endif EndIf EndEvent Because quest stop and start are latent/synch calls which wait for completion before returning. Edit: of course you need to actually set the active flag and START the timer on some event or user input ... Alternative to using story manager to fill a quest alias is: OnTimer(Int iTimer) If (iTimer == iFindFollowersTimer) Actor[] PlayerFollowers = Game.GetPlayerFollowers() Int iIndex = 0 While (iIndex < PlayerFollowers.Length) Actor ThisFollower = PlayerFollowers[iIndex] ;Do stuff to ThisFollower iIndex +=1 EndWhile If (bIsThisFunctionActive == TRUE) Self.StartTimer(fFindFollowersTimer, iFindFollowersTimer) Endif EndIf EndEvent Link to comment Share on other sites More sharing options...
louisthird Posted August 14, 2020 Author Share Posted August 14, 2020 SKK's way of not using Story Manager worked smooth for tracking the companions for a mod like I am working on that is more script based (i.e. not a quest mod like talking to a character or finding a grasshopper statue). As a side note: the whole stopping and starting the quest did not work. This was the reason that I tried the non-Story Manager approach which is working well. I'm almost done... just dealing with a little more scope creep on my part. Gotta stop myself before the mod description is: "this mod replaces the entire Fallout 4 engine..." Take care, -louisthird Link to comment Share on other sites More sharing options...
Recommended Posts