1

Add artifacts via keyword added by Keyword Item Distributor

This commit is contained in:
Eddoursul 2022-07-03 03:35:16 +02:00
parent e83e23ff3d
commit 137b2e175f
5 changed files with 69 additions and 28 deletions

Binary file not shown.

Binary file not shown.

View File

@ -12,8 +12,10 @@ namespace ArtifactTracker
RE::BGSListForm* g_listStored; RE::BGSListForm* g_listStored;
RE::BGSListForm* g_listFound; RE::BGSListForm* g_listFound;
RE::BGSListForm* g_persistentStorage; RE::BGSListForm* g_persistentStorage;
RE::BGSKeyword* g_extraArtifactKeyword;
RE::BGSKeyword* g_homeKeyword; RE::BGSKeyword* g_homeKeyword;
std::unordered_map<RE::FormID, RE::TESForm*> g_artifactMap; std::unordered_map<RE::FormID, RE::TESForm*> g_artifactMap;
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;
@ -34,13 +36,14 @@ namespace ArtifactTracker
g_listStored = dataHandler->LookupForm<RE::BGSListForm>(0x805, "Artifact Tracker.esp"); // ETR_ItemsStored g_listStored = dataHandler->LookupForm<RE::BGSListForm>(0x805, "Artifact Tracker.esp"); // ETR_ItemsStored
g_listFound = dataHandler->LookupForm<RE::BGSListForm>(0x806, "Artifact Tracker.esp"); // ETR_ItemsFound g_listFound = dataHandler->LookupForm<RE::BGSListForm>(0x806, "Artifact Tracker.esp"); // ETR_ItemsFound
g_persistentStorage = dataHandler->LookupForm<RE::BGSListForm>(0x807, "Artifact Tracker.esp"); // ETR_PersistentStorageList g_persistentStorage = dataHandler->LookupForm<RE::BGSListForm>(0x807, "Artifact Tracker.esp"); // ETR_PersistentStorageList
g_extraArtifactKeyword = dataHandler->LookupForm<RE::BGSKeyword>(0x80B, "Artifact Tracker.esp"); // ETR_ExtraArtifact
g_homeKeyword = dataHandler->LookupForm<RE::BGSKeyword>(0xFC1A3, "Skyrim.esm"); // LocTypePlayerHouse g_homeKeyword = dataHandler->LookupForm<RE::BGSKeyword>(0xFC1A3, "Skyrim.esm"); // LocTypePlayerHouse
const auto recipeKeyword = dataHandler->LookupForm<RE::BGSKeyword>(0xF5CB0, "Skyrim.esm"); // VendorItemRecipe const auto recipeKeyword = dataHandler->LookupForm<RE::BGSKeyword>(0xF5CB0, "Skyrim.esm"); // VendorItemRecipe
const auto excludeKeywords = dataHandler->LookupForm<RE::BGSListForm>(0x801, "Artifact Tracker.esp"); // ETR_ExcludeMiscKeywords const auto excludeKeywords = dataHandler->LookupForm<RE::BGSListForm>(0x801, "Artifact Tracker.esp"); // ETR_ExcludeMiscKeywords
if (!g_cellContainer || !g_listNew || !g_listStored || !g_listFound || !g_persistentStorage || !g_homeKeyword || !recipeKeyword || !excludeKeywords) { if (!g_cellContainer || !g_listNew || !g_listStored || !g_listFound || !g_persistentStorage || !g_homeKeyword || !g_extraArtifactKeyword || !recipeKeyword || !excludeKeywords) {
SKSE::log::warn("Failed to load data from Artifact Tracker.esp"); SKSE::log::warn("Failed to load data from Artifact Tracker.esp");
RE::DebugMessageBox("Failed to load data from Artifact Tracker.esp, the mod is disabled."); RE::DebugMessageBox("Failed to load data from Artifact Tracker.esp, the mod is disabled.");
return; return;
@ -48,20 +51,7 @@ namespace ArtifactTracker
// Preloading item lists // Preloading item lists
for (const auto& form : dataHandler->GetFormArray<RE::TESObjectBOOK>()) { g_artifactFormTypes.insert(RE::FormType::Weapon);
if (form && !form->TeachesSpell() && (form->HasKeyword(recipeKeyword) || BookCheck::IsBook(form))) {
g_artifactMap[form->formID] = form;
}
}
for (const auto& form : dataHandler->GetFormArray(RE::FormType::Misc)) {
if (form->GetPlayable() && !form->HasKeywordInList(excludeKeywords, false)) {
g_artifactMap[form->formID] = form;
}
}
g_artifactMap.erase(0xA); // Lockpick
g_artifactMap.erase(0xF); // Gold
for (const auto& form : dataHandler->GetFormArray(RE::FormType::Weapon)) { for (const auto& form : dataHandler->GetFormArray(RE::FormType::Weapon)) {
if (form->GetPlayable()) { if (form->GetPlayable()) {
g_artifactMap[form->formID] = form; g_artifactMap[form->formID] = form;
@ -69,31 +59,76 @@ namespace ArtifactTracker
} }
g_artifactMap.erase(0x1F4); // Unarmed g_artifactMap.erase(0x1F4); // Unarmed
g_artifactFormTypes.insert(RE::FormType::Armor);
for (const auto& form : dataHandler->GetFormArray(RE::FormType::Armor)) { for (const auto& form : dataHandler->GetFormArray(RE::FormType::Armor)) {
if (form->GetPlayable()) { if (form->GetPlayable()) {
g_artifactMap[form->formID] = form; g_artifactMap[form->formID] = form;
} }
} }
g_artifactFormTypes.insert(RE::FormType::Book);
for (const auto& form : dataHandler->GetFormArray<RE::TESObjectBOOK>()) {
if (form && !form->TeachesSpell() && (form->HasKeyword(recipeKeyword) || BookCheck::IsBook(form))) {
g_artifactMap[form->formID] = form;
}
}
OnGameLoad(); OnGameLoad();
EventListener::Install(); EventListener::Install();
}
void PreloadArtifactList()
{
if (g_bLoaded) {
return;
}
const auto dataHandler = RE::TESDataHandler::GetSingleton();
const auto recipeKeyword = dataHandler->LookupForm<RE::BGSKeyword>(0xF5CB0, "Skyrim.esm"); // VendorItemRecipe
const auto excludeKeywords = dataHandler->LookupForm<RE::BGSListForm>(0x801, "Artifact Tracker.esp"); // ETR_ExcludeMiscKeywords
for (const auto& form : dataHandler->GetFormArray<RE::TESObjectBOOK>()) {
if (form->HasKeyword(g_extraArtifactKeyword)) {
g_artifactMap[form->formID] = form;
}
}
g_artifactFormTypes.insert(RE::FormType::Misc);
for (const auto& form : dataHandler->GetFormArray<RE::TESObjectMISC>()) {
if (form->GetPlayable() && (form->HasKeyword(g_extraArtifactKeyword) || !form->HasKeywordInList(excludeKeywords, false))) {
g_artifactMap[form->formID] = form;
}
}
g_artifactMap.erase(0xA); // Lockpick
g_artifactMap.erase(0xF); // Gold
for (const auto& form : dataHandler->GetFormArray<RE::AlchemyItem>()) {
if (form->HasKeyword(g_extraArtifactKeyword)) {
g_artifactMap[form->formID] = form;
g_artifactFormTypes.insert(RE::FormType::AlchemyItem);
}
}
for (const auto& form : dataHandler->GetFormArray<RE::IngredientItem>()) {
if (form->HasKeyword(g_extraArtifactKeyword)) {
g_artifactMap[form->formID] = form;
g_artifactFormTypes.insert(RE::FormType::Ingredient);
}
}
for (const auto& form : dataHandler->GetFormArray<RE::TESSoulGem>()) {
if (form->HasKeyword(g_extraArtifactKeyword)) {
g_artifactMap[form->formID] = form;
g_artifactFormTypes.insert(RE::FormType::SoulGem);
}
}
g_bLoaded = true; g_bLoaded = true;
} }
bool IsArtifact(RE::TESForm* a_form) bool IsArtifact(RE::TESForm* a_form)
{ {
if (!a_form) { return a_form && g_artifactFormTypes.contains(a_form->GetFormType()) && g_artifactMap.contains(a_form->formID);
return false;
}
const auto formType = a_form->GetFormType();
if (formType == RE::FormType::Armor || formType == RE::FormType::Weapon || formType == RE::FormType::Book || formType == RE::FormType::Misc) {
return g_artifactMap.contains(a_form->formID);
}
return false;
} }
RE::TESForm* GetArtifactByID(RE::FormID a_formID) RE::TESForm* GetArtifactByID(RE::FormID a_formID)

View File

@ -9,13 +9,17 @@ namespace ArtifactTracker
extern RE::BGSListForm* g_listStored; extern RE::BGSListForm* g_listStored;
extern RE::BGSListForm* g_listFound; extern RE::BGSListForm* g_listFound;
extern RE::BGSListForm* g_persistentStorage; extern RE::BGSListForm* g_persistentStorage;
extern RE::BGSKeyword* g_extraArtifactKeyword;
extern RE::BGSKeyword* g_homeKeyword; extern RE::BGSKeyword* g_homeKeyword;
extern std::unordered_map<RE::FormID, RE::TESForm*> g_artifactMap; extern std::unordered_map<RE::FormID, RE::TESForm*> g_artifactMap;
extern std::unordered_set<RE::FormType> g_artifactFormTypes;
extern std::unordered_map<RE::FormID, RE::TESObjectREFR*> g_persistentMap; extern std::unordered_map<RE::FormID, RE::TESObjectREFR*> g_persistentMap;
extern RE::TESObjectREFR* g_cellStorage; extern RE::TESObjectREFR* g_cellStorage;
void Init(); void Init();
void PreloadArtifactList();
bool IsArtifact(RE::TESForm* a_item); bool IsArtifact(RE::TESForm* a_item);
RE::TESForm* GetArtifactByID(RE::FormID a_formID); RE::TESForm* GetArtifactByID(RE::FormID a_formID);

View File

@ -32,6 +32,8 @@ namespace {
ArtifactTracker::Init(); ArtifactTracker::Init();
} else if (message->type == MessagingInterface::kPostLoadGame) { } else if (message->type == MessagingInterface::kPostLoadGame) {
ArtifactTracker::OnGameLoad(); ArtifactTracker::OnGameLoad();
} else if (message->type == MessagingInterface::kNewGame || message->type == MessagingInterface::kPreLoadGame) {
ArtifactTracker::PreloadArtifactList();
} }
}); });
} }