Scriptname ETR_TrackStoredItems extends ReferenceAlias Actor Property PlayerRef Auto FormList Property ETR_ItemsNew Auto FormList Property ETR_ItemsFound Auto FormList Property ETR_ItemsStored Auto FormList Property ETR_PersistentStorageList Auto FormList Property ETR_ExcludeFromNew Auto FormList Property ETR_ExcludeMisc Auto Container Property ETR_CellStorageContainer Auto Keyword Property LocTypePlayerHouse Auto bool bBusy = false bool bAtHome = false bool bRescanHome = false bool bRescanPersistent = false ObjectReference lastDestContainer = None bool lastDestIsPersistent = false ObjectReference lastSourceContainer = None bool lastSourceIsPersistent = false int iUpdateCount event OnInit() OnPlayerLoadGame() endevent Event OnPlayerLoadGame() AddInventoryEventFilter(ETR_ItemsStored) Location currentLocation = PlayerRef.GetCurrentLocation() bAtHome = currentLocation && currentLocation.HasKeyword(LocTypePlayerHouse) if bAtHome GotoState("AtHome") else GotoState("") endif EndEvent Event OnLocationChange(Location akOldLoc, Location akNewLoc) bAtHome = akNewLoc && akNewLoc.HasKeyword(LocTypePlayerHouse) if bAtHome GotoState("AtHome") else GotoState("") endif endEvent Event OnMenuClose(String MenuName) UnregisterForUpdate() OnUpdate() EndEvent Event OnUpdate() if UI.IsMenuOpen("ContainerMenu") RegisterForMenu("ContainerMenu") return endif while bBusy Debug.Notification("Stored OnUpdate is busy") Utility.wait(0.5) endwhile bBusy = true iUpdateCount += 1 Debug.Notification("Running Stored OnUpdate " + iUpdateCount) if bRescanHome if lastSourceContainer && lastSourceContainer as Actor && (lastSourceContainer as Actor).IsPlayerTeammate() lastSourceContainer = None return endif ObjectReference cellStorage = ETR_Functions.GetCellStorage(PlayerRef, ETR_PersistentStorageList, ETR_CellStorageContainer) ETR_Functions.SyncCellStorage(cellStorage) endif if bRescanPersistent ETR_ItemsStored.Revert() Form[] aContainers = ETR_PersistentStorageList.ToArray() int n = aContainers.length while n > 0 n -= 1 ETR_Functions.AddArtifactsToList(aContainers[n], ETR_ItemsStored) endwhile ETR_ItemsFound.Revert() ETR_Functions.AddArtifactsToList(PlayerRef, ETR_ItemsFound, ETR_ItemsStored) Actor[] aFollowers = ETR_Functions.GetPlayerFollowers() int i = aFollowers.length while i > 0 i -= 1 ETR_Functions.AddArtifactsToList(aFollowers[i], ETR_ItemsFound, ETR_ItemsStored) endwhile endif bBusy = false EndEvent ; We acquired a stored item, and we want to find out if we just have taken the last stored item of its kind event OnItemAdded(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer) if akSourceContainer if lastSourceContainer != akSourceContainer lastSourceContainer = akSourceContainer lastSourceIsPersistent = ETR_PersistentStorageList.HasForm(akSourceContainer) endif if bAtHome || lastSourceIsPersistent bRescanHome = bAtHome bRescanPersistent = true RegisterForSingleUpdate(0.5) endif elseif bAtHome ObjectReference cellStorage = ETR_Functions.GetCellStorage(PlayerRef, ETR_PersistentStorageList, ETR_CellStorageContainer) if cellStorage.GetItemCount(akBaseItem) ETR_Functions.SyncCellStorage(cellStorage) if ETR_Functions.GetItemCountInList(ETR_PersistentStorageList, akBaseItem) == 0 ETR_ItemsStored.RemoveAddedForm(akBaseItem) ETR_ItemsFound.AddForm(akBaseItem) endif endif endif endevent state AtHome ; The item is already registered as stored, and we just stored more event OnItemRemoved(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer) if akDestContainer if lastDestContainer != akDestContainer lastDestContainer = akDestContainer lastDestIsPersistent = ETR_PersistentStorageList.HasForm(akDestContainer) endif if ! lastDestIsPersistent bRescanHome = true bRescanPersistent = false RegisterForSingleUpdate(0.5) endif elseif akItemReference ObjectReference cellStorage = ETR_Functions.GetCellStorage(PlayerRef, ETR_PersistentStorageList, ETR_CellStorageContainer) if cellStorage.GetItemCount(akBaseItem) == 0 cellStorage.AddItem(akBaseItem, 1, true) endif endif endevent endstate