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 Container Property ETR_CellStorageContainer Auto Container Property PlayerBookShelfContainer 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 bRescanHome = false ObjectReference bookShelf if lastDestContainer && lastDestContainer.GetBaseObject() == PlayerBookShelfContainer bookShelf = lastDestContainer elseif lastSourceContainer && lastSourceContainer.GetBaseObject() == PlayerBookShelfContainer bookShelf = lastSourceContainer endif if bookShelf && bookShelf as PlayerBookShelfContainerScript int iLimit = 10 while iLimit >= 0 && (bookShelf as PlayerBookShelfContainerScript).GetState() == "PlacingBooks" Debug.Notification("Waiting for shelf update") iLimit -= 1 Utility.wait(0.5) endwhile endif ObjectReference cellStorage = ETR_Functions.GetCellStorage(PlayerRef, ETR_PersistentStorageList, ETR_CellStorageContainer) ETR_Functions.SyncCellStorage(cellStorage, ETR_PersistentStorageList) endif if bRescanPersistent bRescanPersistent = false 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) ETR_Functions.AddArtifactsFromFollowersToList(ETR_ItemsFound, ETR_ItemsStored) 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, ETR_PersistentStorageList) 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