Scriptname _00E_MQ12b_NPCControl extends Quest Hidden ; 2.1, Eddoursul: Moved disabling NPCs to a separate quest Actor[] RegisteredDisabledNPCs Int nRegisteredDisabledNPCs Bool bDisabledNPCsLocked Actor[] RegisteredGhostedNPCs Int nRegisteredGhostedNPCs Bool bGhostedNPCsLocked function OnInit() RegisteredDisabledNPCs = New Actor[128] nRegisteredDisabledNPCs = 0 RegisteredGhostedNPCs = New Actor[128] nRegisteredGhostedNPCs = 0 endfunction ; Queue an NPC Function PrepareNPC(Actor akMoveActor, Bool bOnlyGhost = False) If MQ12b.bArkUnderAttackPrelude == False Return EndIf ; Validate akMoveActor, could receive "nullptr form" instead of a valid actor from the packages If akMoveActor == None || akMoveActor.GetActorBase() == None Return EndIf If bOnlyGhost == False If RegisteredDisabledNPCs.Find(akMoveActor) >= 0 || akMoveActor.IsDisabled() Return EndIf if SKSE.GetVersion() if akMoveActor.GetEnableParent() == None akMoveActor.DisableNoWait() _RegisterDisabledNPC(akMoveActor) return endif else akMoveActor.Disable() if akMoveActor.IsDisabled() _RegisterDisabledNPC(akMoveActor) return endif endif EndIf If RegisteredGhostedNPCs.Find(akMoveActor) < 0 && akMoveActor.IsGhost() == False && ! akMoveActor.IsDisabled() akMoveActor.SetGhost(True) _RegisterGhostedNPC(akMoveActor) EndIf EndFunction Function _RegisterDisabledNPC(Actor akMoveActor) nRegisteredDisabledNPCs += 1 ; In case an actor slips in here, RegisteredDisabledNPCs may have an empty slot in the middle, and it's fine int iSlot = nRegisteredDisabledNPCs - 1 if iSlot <= 127 RegisteredDisabledNPCs[iSlot] = akMoveActor ;Debug.Trace("Registered disabled " + akMoveActor.GetBaseObject().GetName() + " " + (akMoveActor as String)) else ; Added overflow to the ghosted _RegisterGhostedNPC(akMoveActor) endif EndFunction Function _RegisterGhostedNPC(Actor akMoveActor) nRegisteredGhostedNPCs += 1 int iSlot = nRegisteredGhostedNPCs - 1 if iSlot <= 127 RegisteredGhostedNPCs[iSlot] = akMoveActor ;Debug.Trace("Registered ghosted " + akMoveActor.GetBaseObject().GetName() + " " + (akMoveActor as String)) else ; oh well endif EndFunction Function ReEnableNPCs() MQ12b.bArkUnderAttackPrelude = false bool bSKSE = SKSE.GetVersion() as bool int Index = RegisteredDisabledNPCs.length While Index > 0 Index -= 1 Actor akActor = RegisteredDisabledNPCs[Index] if akActor != None && ( ! bSKSE || akActor.GetEnableParent() == None ) akActor.EnableNoWait() ;Debug.Trace("Re-enabled: " + akActor.GetActorBase().GetName()) RegisteredDisabledNPCs[Index] = None endif EndWhile RegisteredDisabledNPCs = New Actor[1] Index = RegisteredGhostedNPCs.length While Index > 0 Index -= 1 Actor akActor = RegisteredGhostedNPCs[Index] if akActor != None if akActor.IsDisabled() && ( ! bSKSE || akActor.GetEnableParent() == None ) akActor.EnableNoWait() endif akActor.SetGhost(False) ;Debug.Trace("Unghosted: " + akActor.GetActorBase().GetName()) RegisteredGhostedNPCs[Index] = None endif EndWhile RegisteredGhostedNPCs = New Actor[1] EndFunction _00E_MQ12b_Functions Property MQ12b Auto