diff --git a/Artifact Tracker.esp b/Artifact Tracker.esp index 1be4264..f2b5273 100644 Binary files a/Artifact Tracker.esp and b/Artifact Tracker.esp differ diff --git a/SKSE/Plugins/ArtifactTracker.dll b/SKSE/Plugins/ArtifactTracker.dll index d98e046..652c2b3 100644 Binary files a/SKSE/Plugins/ArtifactTracker.dll and b/SKSE/Plugins/ArtifactTracker.dll differ diff --git a/Scripts/ArtifactTrackerPlayer.pex b/Scripts/ArtifactTrackerPlayer.pex index 6195133..3bff73f 100644 Binary files a/Scripts/ArtifactTrackerPlayer.pex and b/Scripts/ArtifactTrackerPlayer.pex differ diff --git a/Source/ArtifactTrackerDLL/src/ArtifactTracker.cpp b/Source/ArtifactTrackerDLL/src/ArtifactTracker.cpp index 3930d8d..a7a2e80 100644 --- a/Source/ArtifactTrackerDLL/src/ArtifactTracker.cpp +++ b/Source/ArtifactTrackerDLL/src/ArtifactTracker.cpp @@ -7,6 +7,7 @@ namespace ArtifactTracker { bool g_bLoaded; bool g_bHomeContainer; + bool g_bBookShelf; RE::TESBoundObject* g_cellContainer; RE::BGSListForm* g_listNew; RE::BGSListForm* g_listStored; @@ -175,6 +176,8 @@ namespace ArtifactTracker && IsInSameCell(refr.get()) && !g_persistentMap.contains(refr.get()->formID); + g_bBookShelf = g_bHomeContainer && refr->GetBaseObject()->formID == 0xDC9E7; + #ifdef _DEBUG if (g_bHomeContainer) { RE::DebugNotification("Delayed processing enabled"); @@ -183,7 +186,16 @@ namespace ArtifactTracker } else if (g_bHomeContainer) { g_bHomeContainer = false; - SyncCellStorage(); + + if (g_bBookShelf) { + g_bBookShelf = false; + std::thread([]() { + std::this_thread::sleep_for(std::chrono::milliseconds(1200)); + ArtifactTracker::SyncCellStorage(); + }).detach(); + } else { + SyncCellStorage(); + } } } diff --git a/Source/ArtifactTrackerDLL/src/ArtifactTracker.h b/Source/ArtifactTrackerDLL/src/ArtifactTracker.h index 09f8283..13df36b 100644 --- a/Source/ArtifactTrackerDLL/src/ArtifactTracker.h +++ b/Source/ArtifactTrackerDLL/src/ArtifactTracker.h @@ -4,6 +4,7 @@ namespace ArtifactTracker { extern bool g_bLoaded; extern bool g_bHomeContainer; + extern bool g_bBookShelf; extern RE::TESBoundObject* g_cellContainer; extern RE::BGSListForm* g_listNew; extern RE::BGSListForm* g_listStored; diff --git a/Source/ArtifactTrackerDLL/src/EventListener.cpp b/Source/ArtifactTrackerDLL/src/EventListener.cpp index 8390613..4a3d367 100644 --- a/Source/ArtifactTrackerDLL/src/EventListener.cpp +++ b/Source/ArtifactTrackerDLL/src/EventListener.cpp @@ -93,6 +93,7 @@ auto EventListener::ProcessEvent( RE::BSTEventSource* a_eventSource) -> RE::BSEventNotifyControl { + // This listener is expected to be unregistered outside of home. if (ArtifactTracker::IsHome() && a_event->actionRef->IsPlayerRef() && a_event->objectActivated) { const auto ref = a_event->objectActivated.get(); if (ref && ArtifactTracker::IsArtifact(ref->GetBaseObject())) { diff --git a/Source/Scripts/ArtifactTrackerPlayer.psc b/Source/Scripts/ArtifactTrackerPlayer.psc index 2f79c36..1a8a322 100644 --- a/Source/Scripts/ArtifactTrackerPlayer.psc +++ b/Source/Scripts/ArtifactTrackerPlayer.psc @@ -4,10 +4,6 @@ FormList Property ETR_ItemsNew Auto FormList Property ETR_ItemsFound Auto FormList Property ETR_ItemsStored Auto -Keyword Property LocTypePlayerHouse Auto - -bool bAtHome = false -ObjectReference bookShelf = None int iFollowerIndex = 0 int iArtifactCount = 0 @@ -59,34 +55,11 @@ Event OnPlayerLoadGame() RescanFoundArtifacts() RescanNewArtifacts() - Location currentLocation = (GetReference() as ObjectReference).GetCurrentLocation() - bAtHome = currentLocation && currentLocation.HasKeyword(LocTypePlayerHouse) - - if bAtHome - RegisterForModEvent("AT_HomeInventoryUpdate", "OnHomeInventoryUpdate") - RegisterForMenu("ContainerMenu") - GotoState("AtHome") - else - UnregisterForModEvent("AT_HomeInventoryUpdate") - UnregisterForMenu("ContainerMenu") - GotoState("") - endif - EndEvent Event OnLocationChange(Location akOldLoc, Location akNewLoc) - bAtHome = akNewLoc && akNewLoc.HasKeyword(LocTypePlayerHouse) - - if bAtHome - RegisterForModEvent("AT_HomeInventoryUpdate", "OnHomeInventoryUpdate") - GotoState("AtHome") - elseif akOldLoc && akOldLoc.HasKeyword(LocTypePlayerHouse) - UnregisterForModEvent("AT_HomeInventoryUpdate") - GotoState("") - endif - int iCurrentFollowers = 0; Actor[] aFollowers = GetPlayerFollowers() int i = aFollowers.length @@ -111,53 +84,6 @@ Event OnUpdate() EndEvent -event OnHomeInventoryUpdate(string eventName, string strArg, float numArg, Form sender) - if bAtHome - SyncCellStorage() - endif -endevent - - -state AtHome - - event OnBeginState() - RegisterForMenu("ContainerMenu") - endevent - - event OnEndState() - UnregisterForMenu("ContainerMenu") - endevent - - event OnMenuOpen(String MenuName) - if ! bAtHome - GotoState("") - return - endif - ObjectReference currentContainer = GetCurrentContainer() - if currentContainer as PlayerBookShelfContainerScript - bookShelf = currentContainer - endif - endevent - - event OnMenuClose(String MenuName) - - if bookShelf - ObjectReference ref = bookShelf - bookShelf = None - Utility.wait(1.0) - int iLimit = 10 - while iLimit > 0 && (ref as PlayerBookShelfContainerScript).GetState() == "PlacingBooks" - iLimit -= 1 - Utility.wait(0.5) - endwhile - SyncCellStorage() - endif - - endevent - -endstate - - ; NATIVE FUNCTIONS bool function Load() native global