|
|
|
@ -2,54 +2,6 @@ |
|
|
|
|
|
|
|
|
|
namespace Papyrus::ArtifactTracker |
|
|
|
|
{ |
|
|
|
|
inline bool is_excluded(RE::TESForm* a_form, RE::TESForm* a_excludeForm = NULL, bool nested = true) |
|
|
|
|
{ |
|
|
|
|
if (!a_excludeForm) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const RE::BGSListForm* list = a_excludeForm->As<RE::BGSListForm>(); |
|
|
|
|
|
|
|
|
|
if (list) { |
|
|
|
|
if (list->HasForm(a_form)) { |
|
|
|
|
return true; |
|
|
|
|
} else if (nested) { |
|
|
|
|
bool isExcluded = false; |
|
|
|
|
|
|
|
|
|
list->ForEachForm([&](RE::TESForm& a_exform) { |
|
|
|
|
const auto exlist = a_exform.As<RE::BGSListForm>(); |
|
|
|
|
if (exlist) { |
|
|
|
|
if (exlist->forms.size() > 0) { |
|
|
|
|
if (exlist->forms[0]->Is(RE::FormType::Keyword) ? a_form->HasKeywordInList(exlist, false) : exlist->HasForm(a_form)) { |
|
|
|
|
isExcluded = true; |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
const auto exkeyword = a_exform.As<RE::BGSKeyword>(); |
|
|
|
|
if (exkeyword && a_form->As<RE::BGSKeywordForm>()->HasKeyword(exkeyword)) { |
|
|
|
|
isExcluded = true; |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
return isExcluded; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const RE::BGSKeyword* keyword = a_excludeForm->As<RE::BGSKeyword>(); |
|
|
|
|
|
|
|
|
|
if (keyword) { |
|
|
|
|
if (a_form->As<RE::BGSKeywordForm>()->HasKeyword(keyword)) { |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline bool is_artifact(RE::TESForm* a_form) |
|
|
|
|
{ |
|
|
|
|
switch (a_form->GetFormType()) { |
|
|
|
@ -69,8 +21,8 @@ namespace Papyrus::ArtifactTracker |
|
|
|
|
inline std::int32_t AddAllFormsToList(RE::StaticFunctionTag*, |
|
|
|
|
RE::BGSListForm* a_targetList, |
|
|
|
|
short a_formType, |
|
|
|
|
RE::TESForm* a_excludeForm = NULL, |
|
|
|
|
bool excludeNested = true) |
|
|
|
|
RE::BGSListForm* a_storedList, |
|
|
|
|
RE::BGSListForm* a_foundList) |
|
|
|
|
{ |
|
|
|
|
const auto formType = static_cast<RE::FormType>(a_formType); |
|
|
|
|
|
|
|
|
@ -78,7 +30,7 @@ namespace Papyrus::ArtifactTracker |
|
|
|
|
|
|
|
|
|
case RE::FormType::Book: |
|
|
|
|
for (auto const& item : BookCheck::GetBookList()) { |
|
|
|
|
if (!a_excludeForm || !is_excluded(item.second, a_excludeForm, excludeNested)) { |
|
|
|
|
if (!a_storedList->HasForm(item.second) && !a_foundList->HasForm(item.second)) { |
|
|
|
|
a_targetList->AddForm(item.second); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -86,7 +38,7 @@ namespace Papyrus::ArtifactTracker |
|
|
|
|
|
|
|
|
|
case RE::FormType::Misc: |
|
|
|
|
for (auto const& item : MiscCheck::GetMiscList()) { |
|
|
|
|
if (!a_excludeForm || !is_excluded(item.second, a_excludeForm, excludeNested)) { |
|
|
|
|
if (!a_storedList->HasForm(item.second) && !a_foundList->HasForm(item.second)) { |
|
|
|
|
a_targetList->AddForm(item.second); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -106,7 +58,7 @@ namespace Papyrus::ArtifactTracker |
|
|
|
|
if (!form || !form->GetPlayable()) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if (a_excludeForm && is_excluded(form, a_excludeForm, excludeNested)) { |
|
|
|
|
if (a_storedList->HasForm(form) || a_foundList->HasForm(form)) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
a_targetList->AddForm(form); |
|
|
|
@ -119,8 +71,7 @@ namespace Papyrus::ArtifactTracker |
|
|
|
|
inline std::int32_t AddArtifactsToList(VM* a_vm, StackID a_stackID, RE::StaticFunctionTag*, |
|
|
|
|
RE::TESForm* a_refOrList, |
|
|
|
|
RE::BGSListForm* a_targetList, |
|
|
|
|
RE::TESForm* a_excludeForm = NULL, |
|
|
|
|
bool excludeNested = false) |
|
|
|
|
RE::BGSListForm* a_excludeList = NULL) |
|
|
|
|
{ |
|
|
|
|
if (!a_refOrList) { |
|
|
|
|
a_vm->TraceStack("a_refOrList in AddArtifactsToList is None", a_stackID); |
|
|
|
@ -135,7 +86,7 @@ namespace Papyrus::ArtifactTracker |
|
|
|
|
a_refOrList->As<RE::BGSListForm>()->ForEachForm([&](RE::TESForm& a_exform) { |
|
|
|
|
const auto refrItem = a_exform.As<RE::TESObjectREFR>(); |
|
|
|
|
if (refrItem) { |
|
|
|
|
AddArtifactsToList(a_vm, a_stackID, nullptr, refrItem, a_targetList, a_excludeForm); |
|
|
|
|
AddArtifactsToList(a_vm, a_stackID, nullptr, refrItem, a_targetList, a_excludeList); |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
}); |
|
|
|
@ -149,8 +100,8 @@ namespace Papyrus::ArtifactTracker |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
auto inv = containerRef->GetInventory([&](RE::TESBoundObject& a_exform) { |
|
|
|
|
return is_artifact(&a_exform) && !is_excluded(&a_exform, a_excludeForm, excludeNested); |
|
|
|
|
const auto inv = containerRef->GetInventory([&](RE::TESBoundObject& a_exform) { |
|
|
|
|
return is_artifact(&a_exform) && (!a_excludeList || !a_excludeList->HasForm(&a_exform)); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
for (const auto& item : inv) { |
|
|
|
@ -198,8 +149,7 @@ namespace Papyrus::ArtifactTracker |
|
|
|
|
|
|
|
|
|
inline void SyncCellStorage(VM* a_vm, StackID a_stackID, RE::StaticFunctionTag*, |
|
|
|
|
RE::TESObjectREFR* a_cellStorage, |
|
|
|
|
RE::BGSListForm* a_excludeContainers, |
|
|
|
|
RE::TESForm* a_excludeForm = NULL) |
|
|
|
|
RE::BGSListForm* a_excludeContainers) |
|
|
|
|
{ |
|
|
|
|
if (!a_cellStorage) { |
|
|
|
|
return; |
|
|
|
@ -226,7 +176,7 @@ namespace Papyrus::ArtifactTracker |
|
|
|
|
if (data.first > 0) { |
|
|
|
|
cellItems[item->formID] = true; |
|
|
|
|
if (inv.find(item) == inv.end()) { |
|
|
|
|
if (is_artifact(item) && !is_excluded(item, a_excludeForm)) { |
|
|
|
|
if (is_artifact(item)) { |
|
|
|
|
a_cellStorage->AddObjectToContainer(item, nullptr, 1, nullptr); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -251,9 +201,7 @@ namespace Papyrus::ArtifactTracker |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (inv.find(baseObj) == inv.end()) { |
|
|
|
|
if (!a_excludeForm || !is_excluded(baseObj, a_excludeForm)) { |
|
|
|
|
a_cellStorage->AddObjectToContainer(baseObj, nullptr, 1, nullptr); |
|
|
|
|
} |
|
|
|
|
a_cellStorage->AddObjectToContainer(baseObj, nullptr, 1, nullptr); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -285,12 +233,11 @@ namespace Papyrus::ArtifactTracker |
|
|
|
|
|
|
|
|
|
inline std::int32_t AddArtifactsFromFollowersToList(RE::StaticFunctionTag*, |
|
|
|
|
RE::BGSListForm* a_targetList, |
|
|
|
|
RE::TESForm* a_excludeForm = NULL, |
|
|
|
|
bool excludeNested = false) |
|
|
|
|
RE::BGSListForm* a_excludeList = NULL) |
|
|
|
|
{ |
|
|
|
|
for (const auto& actor : GetPlayerFollowers(nullptr)) { |
|
|
|
|
auto inv = actor->GetInventory([&](RE::TESBoundObject& a_exform) { |
|
|
|
|
return is_artifact(&a_exform) && !is_excluded(&a_exform, a_excludeForm, excludeNested); |
|
|
|
|
const auto inv = actor->GetInventory([&](RE::TESBoundObject& a_exform) { |
|
|
|
|
return is_artifact(&a_exform) && (!a_excludeList || !a_excludeList->HasForm(&a_exform)); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
for (const auto& item : inv) { |
|
|
|
|