From 0bfa5f1a26c6183205f09fa20dad2d4753f0639f Mon Sep 17 00:00:00 2001 From: MetricExpansion <> Date: Mon, 10 Oct 2022 18:26:30 -0700 Subject: [PATCH] more work --- include/ArmorAddonOverrideService.h | 7 +++---- src/ArmorAddonOverrideService.cpp | 28 ++++++++++++++++++---------- src/OutfitSystem.cpp | 6 ++++-- src/protos/outfit.proto | 3 +-- 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/include/ArmorAddonOverrideService.h b/include/ArmorAddonOverrideService.h index 955e4d4..e6300d8 100644 --- a/include/ArmorAddonOverrideService.h +++ b/include/ArmorAddonOverrideService.h @@ -47,16 +47,15 @@ namespace SlotPolicy { struct Outfit { Outfit(){};// we shouldn't need this, really, but std::unordered_map is a brat - Outfit(const char* n) : name(n), isFavorite(false), allowsPassthrough(false), requiresEquipped(false){}; + Outfit(const char* n) : name(n), isFavorite(false), slotPolicies{SlotPolicy::Preference::XXXX} {}; Outfit(const Outfit& other) = default; - Outfit(const char* n, const Outfit& other) : name(n), isFavorite(false), allowsPassthrough(false), requiresEquipped(false) { + Outfit(const char* n, const Outfit& other) : name(n), isFavorite(false), slotPolicies{SlotPolicy::Preference::XXXX} { this->armors = other.armors; } std::string name;// can't be const; prevents assigning to Outfit vars std::unordered_set armors; bool isFavorite; - bool allowsPassthrough; - bool requiresEquipped; + std::array slotPolicies; bool conflictsWith(RE::TESObjectARMO*) const; bool hasShield() const; diff --git a/src/ArmorAddonOverrideService.cpp b/src/ArmorAddonOverrideService.cpp index 7000da2..c8bc98f 100644 --- a/src/ArmorAddonOverrideService.cpp +++ b/src/ArmorAddonOverrideService.cpp @@ -111,8 +111,19 @@ void Outfit::load(const proto::Outfit& proto, const SKSE::SerializationInterface } } this->isFavorite = proto.is_favorite(); - this->allowsPassthrough = proto.allows_passthrough(); - this->requiresEquipped = proto.requires_equipped(); + auto src = proto.slotpolicy().begin(); + auto dst = this->slotPolicies.begin(); + while (src < proto.slotpolicy().end(), dst < this->slotPolicies.end()) { + auto policy = static_cast(*src); + if (policy < SlotPolicy::Preference::XXXX || policy >= SlotPolicy::Preference::MAX) { + LOG(err, "Invalid slot preference {}", static_cast(policy)); + policy = SlotPolicy::Preference::XXXX; + } else { + *dst = policy; + } + dst++; + src++; + } } proto::Outfit Outfit::save() const { @@ -123,8 +134,9 @@ proto::Outfit Outfit::save() const { out.add_armors(armor->formID); } out.set_is_favorite(this->isFavorite); - out.set_allows_passthrough(this->allowsPassthrough); - out.set_requires_equipped(this->requiresEquipped); + for (auto policy : slotPolicies) { + out.add_slotpolicy(static_cast(policy)); + } return out; } @@ -196,16 +208,12 @@ void ArmorAddonOverrideService::setFavorite(const char* name, bool favorite) { outfit->second.isFavorite = favorite; } +// TODO: REMOVE THESE FUNCTIONS void ArmorAddonOverrideService::setOutfitPassthrough(const char* name, bool allowPassthrough) { - auto outfit = this->outfits.find(name); - if (outfit != this->outfits.end()) - outfit->second.allowsPassthrough = allowPassthrough; } +// TODO: REMOVE THESE FUNCTIONS void ArmorAddonOverrideService::setOutfitEquipRequired(const char* name, bool requiresEquipped) { - auto outfit = this->outfits.find(name); - if (outfit != this->outfits.end()) - outfit->second.requiresEquipped = requiresEquipped; } void ArmorAddonOverrideService::modifyOutfit(const char* name, diff --git a/src/OutfitSystem.cpp b/src/OutfitSystem.cpp index 6c76864..449ddcd 100644 --- a/src/OutfitSystem.cpp +++ b/src/OutfitSystem.cpp @@ -563,6 +563,7 @@ namespace OutfitSystem { } return result; } + // TODO: REMOVE THESE FUNCTIONS bool GetOutfitPassthroughStatus(RE::BSScript::IVirtualMachine* registry, std::uint32_t stackId, RE::StaticFunctionTag*, @@ -573,12 +574,13 @@ namespace OutfitSystem { bool result = false; try { auto& outfit = service.getOutfit(name.data()); - result = outfit.allowsPassthrough; + result = false; } catch (std::out_of_range) { registry->TraceStack("The specified outfit does not exist.", stackId, RE::BSScript::IVirtualMachine::Severity::kWarning); } return result; } + // TODO: REMOVE THESE FUNCTIONS bool GetOutfitEquipRequiredStatus(RE::BSScript::IVirtualMachine* registry, std::uint32_t stackId, RE::StaticFunctionTag*, @@ -589,7 +591,7 @@ namespace OutfitSystem { bool result = false; try { auto& outfit = service.getOutfit(name.data()); - result = outfit.requiresEquipped; + result = false; } catch (std::out_of_range) { registry->TraceStack("The specified outfit does not exist.", stackId, RE::BSScript::IVirtualMachine::Severity::kWarning); } diff --git a/src/protos/outfit.proto b/src/protos/outfit.proto index 03d0ed5..c14974a 100644 --- a/src/protos/outfit.proto +++ b/src/protos/outfit.proto @@ -6,8 +6,7 @@ message Outfit { string name = 1; repeated uint32 armors = 2; // A list of formIDs that will be resolved as pointers to RE::TESObjectARMO bool is_favorite = 3; - bool allows_passthrough = 4; - bool requires_equipped = 5; + repeated uint32 slotPolicy = 6; } message ActorOutfitAssignment {