#pragma once #include "ArtifactTracker.h" #include "Util.h" namespace Papyrus::PapyrusFunctions { inline bool Load(RE::StaticFunctionTag*) { return ArtifactTracker::Init(); } inline RE::TESObjectREFR* GetCellStorage(RE::StaticFunctionTag*) { return ArtifactTracker::g_cellStorage; } inline void SyncCellStorage(RE::StaticFunctionTag*) { ArtifactTracker::SyncCellStorage(); } inline std::uint32_t GetArtifactCount(RE::StaticFunctionTag*) { return (ArtifactTracker::g_artifactMap).size(); } // From po3's Papyrus Extender inline std::vector GetPlayerFollowers(RE::StaticFunctionTag*) { std::vector 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; } inline RE::TESObjectREFR* GetCurrentContainer(RE::StaticFunctionTag*) { const auto handle = RE::ContainerMenu::GetTargetRefHandle(); const auto refr = RE::TESObjectREFR::LookupByHandle(handle); return refr ? refr.get() : nullptr; } inline void RescanStoredArtifacts(RE::StaticFunctionTag*) { ListRevert(ArtifactTracker::g_listStored); ArtifactTracker::AddRefArtifactsToList(ArtifactTracker::g_persistentStorage, ArtifactTracker::g_listStored); } inline void RescanFoundArtifacts(RE::StaticFunctionTag*) { ListRevert(ArtifactTracker::g_listFound); ArtifactTracker::AddRefArtifactsToList(RE::PlayerCharacter::GetSingleton(), ArtifactTracker::g_listFound, ArtifactTracker::g_listStored); for (const auto& ref : GetPlayerFollowers(nullptr)) { ArtifactTracker::AddRefArtifactsToList(ref, ArtifactTracker::g_listFound, ArtifactTracker::g_listStored); } } inline void RescanNewArtifacts(RE::StaticFunctionTag*) { for (auto const& item : ArtifactTracker::g_artifactMap) { if (!ArtifactTracker::g_listNew->HasForm(item.second) && !ArtifactTracker::g_listStored->HasForm(item.second) && !ArtifactTracker::g_listFound->HasForm(item.second)) { ArtifactTracker::g_listNew->AddForm(item.second); } } } inline void RegisterPersistentStorage(RE::StaticFunctionTag*, RE::TESObjectREFR* ref) { if (ref) { ArtifactTracker::g_persistentStorage->AddForm(ref); ArtifactTracker::g_persistentMap[ref->formID] = ref; } } inline void Bind(VM& a_vm) { BIND(Load); logger::info("Registered Load"sv); BIND(GetArtifactCount); logger::info("Registered GetArtifactCount"sv); BIND(RescanStoredArtifacts); logger::info("Registered RescanStoredArtifacts"sv); BIND(RescanFoundArtifacts); logger::info("Registered RescanFoundArtifacts"sv); BIND(RescanNewArtifacts); logger::info("Registered RescanNewArtifacts"sv); BIND(GetCellStorage); logger::info("Registered GetCellStorage"sv); BIND(SyncCellStorage); logger::info("Registered SyncCellStorage"sv); BIND(GetPlayerFollowers); logger::info("Registered GetPlayerFollowers"sv); BIND(GetCurrentContainer); logger::info("Registered GetCurrentContainer"sv); BIND(RegisterPersistentStorage); logger::info("Registered RegisterPersistentStorage"sv); } }