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 FormList Property ETR_ExcludeFromNew Auto FormList Property ETR_ExcludeMisc 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 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 EndEvent Event OnLocationChange(Location akOldLoc, Location akNewLoc) bAtHome = akNewLoc && akNewLoc.HasKeyword(LocTypePlayerHouse) lastDestContainer = None 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 iFollowerIndex = iCurrentFollowers bRescanHome = false bRescanPersistent = false RegisterForSingleUpdate(3.0) ; wait until followers load into the location endif endEvent Event OnMenuClose(String MenuName) UnregisterForUpdate() OnUpdate() EndEvent Event OnUpdate() 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 if lastDestContainer && lastDestContainer as Actor && (lastDestContainer as Actor).IsPlayerTeammate() lastDestContainer = None return endif bRescanHome = false ObjectReference cellStorage = ETR_Functions.GetCellStorage(PlayerRef, ETR_PersistentStorageList, ETR_CellStorageContainer) ETR_Functions.SyncCellStorage(cellStorage, ETR_ExcludeMisc) 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, ETR_ExcludeMisc, true) endwhile endif ETR_ItemsFound.Revert() ETR_Functions.AddArtifactsToList(PlayerRef, ETR_ItemsFound, ETR_ExcludeFromNew) Actor[] aFollowers = ETR_Functions.GetPlayerFollowers() int i = aFollowers.length while i > 0 i -= 1 ETR_Functions.AddArtifactsToList(aFollowers[i], ETR_ItemsFound, ETR_ExcludeFromNew) endwhile 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.GetItemCountInActors(ETR_Functions.GetPlayerFollowers(), akBaseItem) == 0 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.GetItemCountInActors(ETR_Functions.GetPlayerFollowers(), akBaseItem) == 0 ETR_ItemsFound.RemoveAddedForm(akBaseItem) ETR_ItemsNew.AddForm(akBaseItem) endif endevent