Scriptname ETR_TrackFoundItems 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 Keyword Property LocTypePlayerHouse Auto bool bBusy = false int iFollowerIndex = 0 bool bAtHome = false bool bRescanHome = false bool bRescanPersistent = false bool bRescanFollowers = false ObjectReference lastDestContainer = None bool lastDestIsPersistent = false int iUpdateCount event OnInit() OnPlayerLoadGame() endevent Event OnPlayerLoadGame() AddInventoryEventFilter(ETR_ItemsFound) Location currentLocation = PlayerRef.GetCurrentLocation() bAtHome = currentLocation && currentLocation.HasKeyword(LocTypePlayerHouse) lastDestContainer = None bBusy = false EndEvent Event OnLocationChange(Location akOldLoc, Location akNewLoc) bAtHome = akNewLoc && akNewLoc.HasKeyword(LocTypePlayerHouse) lastDestContainer = None bRescanFollowers = true RegisterForSingleUpdate(3.0) endEvent Event OnMenuClose(String MenuName) UnregisterForUpdate() OnUpdate() EndEvent Event OnUpdate() if bRescanFollowers bRescanFollowers = false int iCurrentFollowers = 0; Actor[] aFollowers = ETR_Functions.GetPlayerFollowers() int i = aFollowers.length while i > 0 i -= 1 iCurrentFollowers += aFollowers[i].GetFormID() endwhile if iCurrentFollowers == iFollowerIndex return endif iFollowerIndex = iCurrentFollowers Debug.Notification("Team changed, rescanning") endif if lastDestContainer && lastDestContainer as Actor && (lastDestContainer as Actor).IsPlayerTeammate() lastDestContainer = None bRescanHome = false return endif if UI.IsMenuOpen("ContainerMenu") RegisterForMenu("ContainerMenu") return endif while bBusy Debug.Notification("Found OnUpdate is busy") Utility.wait(0.5) endwhile bBusy = true iUpdateCount += 1 Debug.Notification("Running Found OnUpdate " + iUpdateCount) if bRescanHome bRescanHome = false if lastDestContainer && lastDestContainer as PlayerBookShelfContainerScript int iLimit = 10 while iLimit >= 0 && (lastDestContainer 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) if ! bRescanPersistent ETR_Functions.AddArtifactsToList(cellStorage, ETR_ItemsStored) endif endif if bRescanPersistent bRescanPersistent = false Form[] aContainers = ETR_PersistentStorageList.ToArray() int n = aContainers.length while n > 0 n -= 1 ETR_Functions.AddArtifactsToList(aContainers[n], ETR_ItemsStored) endwhile endif ETR_ItemsFound.Revert() ETR_Functions.AddArtifactsToList(PlayerRef, ETR_ItemsFound, ETR_ItemsStored) ETR_Functions.AddArtifactsFromFollowersToList(ETR_ItemsFound, ETR_ItemsStored) bBusy = false EndEvent event OnItemRemoved(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer) if akDestContainer if lastDestContainer != akDestContainer lastDestContainer = akDestContainer lastDestIsPersistent = ETR_PersistentStorageList.HasForm(akDestContainer) endif ; Moving items without latent functions should help with avoiding stack dumps if lastDestIsPersistent bRescanHome = false bRescanPersistent = true RegisterForSingleUpdate(0.5) elseif bAtHome bRescanHome = true bRescanPersistent = false RegisterForSingleUpdate(0.5) elseif PlayerRef.GetItemCount(akBaseItem) == 0 && ! ETR_Functions.FollowersHaveItem(akBaseItem) ETR_ItemsFound.RemoveAddedForm(akBaseItem) ETR_ItemsNew.AddForm(akBaseItem) endif elseif bAtHome && akItemReference ETR_ItemsFound.RemoveAddedForm(akBaseItem) ETR_ItemsStored.AddForm(akBaseItem) ETR_Functions.GetCellStorage(PlayerRef, ETR_PersistentStorageList, ETR_CellStorageContainer).AddItem(akBaseItem, 1, true) elseif PlayerRef.GetItemCount(akBaseItem) == 0 && ! ETR_Functions.FollowersHaveItem(akBaseItem) ETR_ItemsFound.RemoveAddedForm(akBaseItem) ETR_ItemsNew.AddForm(akBaseItem) endif endevent