2022-06-27 11:38:49 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "ArtifactTracker.h"
|
2022-06-30 10:31:01 +00:00
|
|
|
#include "Util.h"
|
2022-06-27 11:38:49 +00:00
|
|
|
|
|
|
|
namespace Papyrus::PapyrusFunctions
|
|
|
|
{
|
2022-07-05 15:52:30 +00:00
|
|
|
inline bool Load(RE::StaticFunctionTag*)
|
2022-06-27 11:38:49 +00:00
|
|
|
{
|
2022-07-05 15:52:30 +00:00
|
|
|
return ArtifactTracker::Init();
|
2022-06-30 10:31:01 +00:00
|
|
|
}
|
2022-06-27 11:38:49 +00:00
|
|
|
|
2022-06-30 10:31:01 +00:00
|
|
|
inline RE::TESObjectREFR* GetCellStorage(RE::StaticFunctionTag*)
|
|
|
|
{
|
|
|
|
return ArtifactTracker::g_cellStorage;
|
|
|
|
}
|
2022-06-27 11:38:49 +00:00
|
|
|
|
2022-07-01 20:15:55 +00:00
|
|
|
inline void SyncCellStorage(RE::StaticFunctionTag*)
|
2022-06-30 10:31:01 +00:00
|
|
|
{
|
2022-07-01 20:15:55 +00:00
|
|
|
ArtifactTracker::SyncCellStorage();
|
2022-06-27 11:38:49 +00:00
|
|
|
}
|
|
|
|
|
2022-07-03 13:12:14 +00:00
|
|
|
inline std::uint32_t GetArtifactCount(RE::StaticFunctionTag*)
|
|
|
|
{
|
|
|
|
return (ArtifactTracker::g_artifactMap).size();
|
|
|
|
}
|
|
|
|
|
2022-06-30 10:31:01 +00:00
|
|
|
// From po3's Papyrus Extender
|
|
|
|
inline std::vector<RE::Actor*> GetPlayerFollowers(RE::StaticFunctionTag*)
|
2022-06-27 11:38:49 +00:00
|
|
|
{
|
2022-06-30 10:31:01 +00:00
|
|
|
std::vector<RE::Actor*> result;
|
2022-06-27 11:38:49 +00:00
|
|
|
|
2022-06-30 10:31:01 +00:00
|
|
|
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());
|
2022-06-27 11:38:49 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-06-30 10:31:01 +00:00
|
|
|
return result;
|
2022-06-27 11:38:49 +00:00
|
|
|
}
|
|
|
|
|
2022-06-30 10:31:01 +00:00
|
|
|
inline RE::TESObjectREFR* GetCurrentContainer(RE::StaticFunctionTag*)
|
2022-06-27 11:38:49 +00:00
|
|
|
{
|
2022-06-30 10:31:01 +00:00
|
|
|
const auto handle = RE::ContainerMenu::GetTargetRefHandle();
|
|
|
|
const auto refr = RE::TESObjectREFR::LookupByHandle(handle);
|
|
|
|
return refr ? refr.get() : nullptr;
|
2022-06-27 11:38:49 +00:00
|
|
|
}
|
|
|
|
|
2022-06-30 10:31:01 +00:00
|
|
|
inline void RescanStoredArtifacts(RE::StaticFunctionTag*)
|
2022-06-27 11:38:49 +00:00
|
|
|
{
|
2022-06-30 10:31:01 +00:00
|
|
|
ListRevert(ArtifactTracker::g_listStored);
|
|
|
|
ArtifactTracker::AddRefArtifactsToList(ArtifactTracker::g_persistentStorage, ArtifactTracker::g_listStored);
|
2022-06-27 11:38:49 +00:00
|
|
|
}
|
|
|
|
|
2022-06-30 10:31:01 +00:00
|
|
|
inline void RescanFoundArtifacts(RE::StaticFunctionTag*)
|
|
|
|
{
|
|
|
|
ListRevert(ArtifactTracker::g_listFound);
|
|
|
|
ArtifactTracker::AddRefArtifactsToList(RE::PlayerCharacter::GetSingleton(), ArtifactTracker::g_listFound, ArtifactTracker::g_listStored);
|
2022-06-27 11:38:49 +00:00
|
|
|
|
2022-06-30 10:31:01 +00:00
|
|
|
for (const auto& ref : GetPlayerFollowers(nullptr)) {
|
|
|
|
ArtifactTracker::AddRefArtifactsToList(ref, ArtifactTracker::g_listFound, ArtifactTracker::g_listStored);
|
2022-06-27 11:38:49 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-06-30 10:31:01 +00:00
|
|
|
inline void RescanNewArtifacts(RE::StaticFunctionTag*)
|
2022-06-27 11:38:49 +00:00
|
|
|
{
|
2022-06-30 10:31:01 +00:00
|
|
|
for (auto const& item : ArtifactTracker::g_artifactMap) {
|
2022-07-02 21:22:58 +00:00
|
|
|
if (!ArtifactTracker::g_listNew->HasForm(item.second) && !ArtifactTracker::g_listStored->HasForm(item.second) && !ArtifactTracker::g_listFound->HasForm(item.second)) {
|
2022-06-30 10:31:01 +00:00
|
|
|
ArtifactTracker::g_listNew->AddForm(item.second);
|
|
|
|
}
|
|
|
|
}
|
2022-06-27 11:38:49 +00:00
|
|
|
}
|
|
|
|
|
2022-07-08 20:21:36 +00:00
|
|
|
inline void RegisterPersistentStorage(RE::StaticFunctionTag*,
|
|
|
|
RE::TESObjectREFR* ref)
|
|
|
|
{
|
|
|
|
if (ref) {
|
|
|
|
ArtifactTracker::g_persistentStorage->AddForm(ref);
|
|
|
|
ArtifactTracker::g_persistentMap[ref->formID] = ref;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-06-27 11:38:49 +00:00
|
|
|
inline void Bind(VM& a_vm)
|
|
|
|
{
|
2022-07-05 15:52:30 +00:00
|
|
|
BIND(Load);
|
|
|
|
logger::info("Registered Load"sv);
|
2022-07-03 13:12:14 +00:00
|
|
|
BIND(GetArtifactCount);
|
|
|
|
logger::info("Registered GetArtifactCount"sv);
|
2022-06-30 10:31:01 +00:00
|
|
|
BIND(RescanStoredArtifacts);
|
|
|
|
logger::info("Registered RescanStoredArtifacts"sv);
|
|
|
|
BIND(RescanFoundArtifacts);
|
|
|
|
logger::info("Registered RescanFoundArtifacts"sv);
|
|
|
|
BIND(RescanNewArtifacts);
|
|
|
|
logger::info("Registered RescanNewArtifacts"sv);
|
2022-06-27 11:38:49 +00:00
|
|
|
BIND(GetCellStorage);
|
|
|
|
logger::info("Registered GetCellStorage"sv);
|
|
|
|
BIND(SyncCellStorage);
|
|
|
|
logger::info("Registered SyncCellStorage"sv);
|
2022-06-30 10:31:01 +00:00
|
|
|
BIND(GetPlayerFollowers);
|
|
|
|
logger::info("Registered GetPlayerFollowers"sv);
|
|
|
|
BIND(GetCurrentContainer);
|
|
|
|
logger::info("Registered GetCurrentContainer"sv);
|
2022-07-08 20:21:36 +00:00
|
|
|
BIND(RegisterPersistentStorage);
|
|
|
|
logger::info("Registered RegisterPersistentStorage"sv);
|
2022-06-27 11:38:49 +00:00
|
|
|
}
|
|
|
|
}
|