1

Moved delayed follower updates to the DLL

This commit is contained in:
Eddoursul 2022-07-09 14:30:51 +02:00
parent 39b9e5cc04
commit 77ef7c15da
7 changed files with 67 additions and 28 deletions

Binary file not shown.

Binary file not shown.

View File

@ -18,6 +18,7 @@ namespace ArtifactTracker
std::unordered_set<RE::FormType> g_artifactFormTypes; std::unordered_set<RE::FormType> g_artifactFormTypes;
std::unordered_map<RE::FormID, RE::TESObjectREFR*> g_persistentMap; std::unordered_map<RE::FormID, RE::TESObjectREFR*> g_persistentMap;
RE::TESObjectREFR* g_cellStorage; RE::TESObjectREFR* g_cellStorage;
std::uint32_t g_iFollowerIndex;
bool Init(bool bKID) bool Init(bool bKID)
{ {
@ -628,4 +629,48 @@ namespace ArtifactTracker
} }
} }
} }
// From po3's Papyrus Extender
std::vector<RE::Actor*> GetPlayerFollowers()
{
std::vector<RE::Actor*> result;
if (const auto processLists = RE::ProcessLists::GetSingleton(); processLists) {
for (auto& actorHandle : processLists->highActorHandles) {
if (auto actor = actorHandle.get(); actor && actor->IsPlayerTeammate()) {
result.push_back(actor.get());
}
}
}
return result;
}
void RescanFoundArtifacts()
{
ListRevert(g_listFound);
AddRefArtifactsToList(RE::PlayerCharacter::GetSingleton(), g_listFound, g_listStored);
for (const auto& ref : GetPlayerFollowers()) {
AddRefArtifactsToList(ref, g_listFound, g_listStored);
}
}
void OnLocationChange()
{
std::uint32_t iCurrentFollowers;
for (const auto& actor : GetPlayerFollowers()) {
iCurrentFollowers += actor->formID;
}
if (iCurrentFollowers != g_iFollowerIndex) {
g_iFollowerIndex = iCurrentFollowers;
std::thread([]() {
std::this_thread::sleep_for(std::chrono::milliseconds(3000)); // wait for followers to load into the new cell
RE::DebugNotification("Team changed, rescanning the found list");
RescanFoundArtifacts();
}).detach();
}
}
} }

View File

@ -37,4 +37,6 @@ namespace ArtifactTracker
void OnContainerChanged(const RE::TESContainerChangedEvent* a_event, RE::TESForm* form); void OnContainerChanged(const RE::TESContainerChangedEvent* a_event, RE::TESForm* form);
void AddRefArtifactsToList(RE::TESForm* a_refOrList, RE::BGSListForm* a_targetList, RE::BGSListForm* a_excludeList = NULL); void AddRefArtifactsToList(RE::TESForm* a_refOrList, RE::BGSListForm* a_targetList, RE::BGSListForm* a_excludeList = NULL);
void OnLocationChange();
} }

View File

@ -12,6 +12,7 @@ void EventListener::Install()
{ {
RE::PlayerCharacter::GetSingleton()->AddEventSink<RE::BGSActorCellEvent>(EventListener::GetSingleton()); RE::PlayerCharacter::GetSingleton()->AddEventSink<RE::BGSActorCellEvent>(EventListener::GetSingleton());
RE::ScriptEventSourceHolder::GetSingleton()->AddEventSink<RE::TESContainerChangedEvent>(EventListener::GetSingleton()); RE::ScriptEventSourceHolder::GetSingleton()->AddEventSink<RE::TESContainerChangedEvent>(EventListener::GetSingleton());
RE::ScriptEventSourceHolder::GetSingleton()->AddEventSink<RE::TESActorLocationChangeEvent>(EventListener::GetSingleton());
} }
auto EventListener::ProcessEvent( auto EventListener::ProcessEvent(
@ -106,3 +107,15 @@ auto EventListener::ProcessEvent(
return RE::BSEventNotifyControl::kContinue; return RE::BSEventNotifyControl::kContinue;
} }
auto EventListener::ProcessEvent(
const RE::TESActorLocationChangeEvent* a_event,
RE::BSTEventSource<RE::TESActorLocationChangeEvent>* a_eventSource)
-> RE::BSEventNotifyControl
{
if (a_event->actor->IsPlayerRef()) {
ArtifactTracker::OnLocationChange();
}
return RE::BSEventNotifyControl::kContinue;
}

View File

@ -6,7 +6,8 @@ class EventListener :
public RE::BSTEventSink<RE::TESCellFullyLoadedEvent>, public RE::BSTEventSink<RE::TESCellFullyLoadedEvent>,
public RE::BSTEventSink<RE::BGSActorCellEvent>, public RE::BSTEventSink<RE::BGSActorCellEvent>,
public RE::BSTEventSink<RE::MenuOpenCloseEvent>, public RE::BSTEventSink<RE::MenuOpenCloseEvent>,
public RE::BSTEventSink<RE::TESActivateEvent> public RE::BSTEventSink<RE::TESActivateEvent>,
public RE::BSTEventSink<RE::TESActorLocationChangeEvent>
{ {
public: public:
~EventListener() = default; ~EventListener() = default;
@ -48,6 +49,11 @@ public:
RE::BSTEventSource<RE::TESActivateEvent>* a_eventSource) RE::BSTEventSource<RE::TESActivateEvent>* a_eventSource)
-> RE::BSEventNotifyControl override; -> RE::BSEventNotifyControl override;
auto ProcessEvent(
const RE::TESActorLocationChangeEvent* a_event,
RE::BSTEventSource<RE::TESActorLocationChangeEvent>* a_eventSource)
-> RE::BSEventNotifyControl override;
private: private:
EventListener() = default; EventListener() = default;
}; };

View File

@ -4,7 +4,6 @@ FormList Property ETR_ItemsNew Auto
FormList Property ETR_ItemsFound Auto FormList Property ETR_ItemsFound Auto
FormList Property ETR_ItemsStored Auto FormList Property ETR_ItemsStored Auto
int iFollowerIndex = 0
int iArtifactCount = 0 int iArtifactCount = 0
@ -58,32 +57,6 @@ Event OnPlayerLoadGame()
EndEvent EndEvent
Event OnLocationChange(Location akOldLoc, Location akNewLoc)
int iCurrentFollowers = 0;
Actor[] aFollowers = GetPlayerFollowers()
int i = aFollowers.length
while i > 0
i -= 1
iCurrentFollowers += aFollowers[i].GetFormID()
endwhile
if iCurrentFollowers != iFollowerIndex
iFollowerIndex = iCurrentFollowers
RegisterForSingleUpdate(5.0) ; wait until followers load into the location
endif
endEvent
Event OnUpdate()
Debug.Notification("Team changed, updating ETR_ItemsFound")
RescanFoundArtifacts()
EndEvent
; NATIVE FUNCTIONS ; NATIVE FUNCTIONS
bool function Load() native global bool function Load() native global