From e141c8370e439ec01d72931bbcdbe511ba4d2e7e Mon Sep 17 00:00:00 2001 From: MetricExpansion <> Date: Mon, 10 Oct 2022 22:04:35 -0700 Subject: [PATCH] More native func work --- include/ArmorAddonOverrideService.h | 2 +- src/OutfitSystem.cpp | 50 ++++++++++++++++--- src/papyrus/skyrimoutfitsystemnativefuncs.psc | 6 ++- 3 files changed, 49 insertions(+), 9 deletions(-) diff --git a/include/ArmorAddonOverrideService.h b/include/ArmorAddonOverrideService.h index 44fe37b..04c5d3d 100644 --- a/include/ArmorAddonOverrideService.h +++ b/include/ArmorAddonOverrideService.h @@ -46,7 +46,7 @@ namespace SlotPolicy { std::string code; std::int32_t sortOrder; bool advanced; - std::string translationKey() { + std::string translationKey() const { return "$SkyOutSys_Desc_PolicyName_" + code; } }; diff --git a/src/OutfitSystem.cpp b/src/OutfitSystem.cpp index fcfb7df..87ae475 100644 --- a/src/OutfitSystem.cpp +++ b/src/OutfitSystem.cpp @@ -364,7 +364,7 @@ namespace OutfitSystem { } }// namespace BodySlotListing namespace BodySlotPolicy { - std::vector BodySlotPoliciesForOutfit(RE::BSScript::IVirtualMachine* registry, + std::vector BodySlotPolicyNamesForOutfit(RE::BSScript::IVirtualMachine* registry, std::uint32_t stackId, RE::StaticFunctionTag*, RE::BSFixedString name) { @@ -381,10 +381,15 @@ namespace OutfitSystem { RE::StaticFunctionTag*, RE::BSFixedString name, std::uint32_t slot, - std::uint32_t policy) { + RE::BSFixedString code) { auto& service = ArmorAddonOverrideService::GetInstance(); auto& outfit = service.getOutfit(name.data()); - outfit.setSlotPolicy(static_cast(slot), static_cast(policy)); + std::string codeString(code); + auto found = std::find_if(SlotPolicy::g_policiesMetadata.begin(), SlotPolicy::g_policiesMetadata.end(), [&](const SlotPolicy::Metadata& first) { + return first.code == codeString; + }); + if (found == SlotPolicy::g_policiesMetadata.end()) return; + outfit.setSlotPolicy(static_cast(slot), static_cast(found - SlotPolicy::g_policiesMetadata.begin())); } void SetBodySlotPolicyToDefaultForOutfit(RE::BSScript::IVirtualMachine* registry, std::uint32_t stackId, @@ -394,7 +399,32 @@ namespace OutfitSystem { auto& outfit = service.getOutfit(name.data()); outfit.setDefaultSlotPolicy(); } - + std::vector GetAvailablePolicyNames(RE::BSScript::IVirtualMachine* registry, + std::uint32_t stackId, + RE::StaticFunctionTag*) { + auto policies = SlotPolicy::g_policiesMetadata; + std::sort(policies.begin(), policies.end(), [](const SlotPolicy::Metadata& first, const SlotPolicy::Metadata& second) { + return first.code < second.code; + }); + std::vector result; + for (const auto& policy : policies) { + result.emplace_back(policy.translationKey()); + } + return result; + } + std::vector GetAvailablePolicyCodes(RE::BSScript::IVirtualMachine* registry, + std::uint32_t stackId, + RE::StaticFunctionTag*) { + auto policies = SlotPolicy::g_policiesMetadata; + std::sort(policies.begin(), policies.end(), [](const SlotPolicy::Metadata& first, const SlotPolicy::Metadata& second) { + return first.code < second.code; + }); + std::vector result; + for (const auto& policy : policies) { + result.emplace_back(policy.code); + } + return result; + } } namespace StringSorts { std::vector NaturalSort_ASCII(RE::BSScript::IVirtualMachine* registry, @@ -1122,9 +1152,9 @@ bool OutfitSystem::RegisterPapyrus(RE::BSScript::IVirtualMachine* registry) { } {//body slot policy registry->RegisterFunction( - "BodySlotPoliciesForOutfit", + "BodySlotPolicyNamesForOutfit", "SkyrimOutfitSystemNativeFuncs", - BodySlotPolicy::BodySlotPoliciesForOutfit); + BodySlotPolicy::BodySlotPolicyNamesForOutfit); registry->RegisterFunction( "SetBodySlotPoliciesForOutfit", "SkyrimOutfitSystemNativeFuncs", @@ -1133,6 +1163,14 @@ bool OutfitSystem::RegisterPapyrus(RE::BSScript::IVirtualMachine* registry) { "SetBodySlotPolicyToDefaultForOutfit", "SkyrimOutfitSystemNativeFuncs", BodySlotPolicy::SetBodySlotPolicyToDefaultForOutfit); + registry->RegisterFunction( + "GetAvailablePolicyNames", + "SkyrimOutfitSystemNativeFuncs", + BodySlotPolicy::GetAvailablePolicyNames); + registry->RegisterFunction( + "GetAvailablePolicyCodes", + "SkyrimOutfitSystemNativeFuncs", + BodySlotPolicy::GetAvailablePolicyCodes); } {// string sorts registry->RegisterFunction( diff --git a/src/papyrus/skyrimoutfitsystemnativefuncs.psc b/src/papyrus/skyrimoutfitsystemnativefuncs.psc index a67c05c..2f654bc 100644 --- a/src/papyrus/skyrimoutfitsystemnativefuncs.psc +++ b/src/papyrus/skyrimoutfitsystemnativefuncs.psc @@ -75,9 +75,11 @@ Bool Function GetOutfitPassthroughStatus(String asOutfitName) Global Native Function SetOutfitPassthroughStatus(String asOutfitName, Bool abPassthrough) Global Native Bool Function GetOutfitEquipRequiredStatus(String asOutfitName) Global Native Function SetOutfitEquipRequiredStatus(String asOutfitName, Bool asEquipRequired) Global Native -String[] Function BodySlotPoliciesForOutfit(String asOutfitName) Global Native - Function SetBodySlotPoliciesForOutfit(String asOutfitName, Int aiSlot, Int aiPolicy) Global Native +String[] Function BodySlotPolicyNamesForOutfit(String asOutfitName) Global Native + Function SetBodySlotPoliciesForOutfit(String asOutfitName, Int aiSlot, String aiPolicyCode) Global Native Function SetBodySlotPolicyToDefaultForOutfit(String asOutfitName) Global Native +String[] Function GetAvailablePolicyNames() Global Native +String[] Function GetAvailablePolicyCodes() Global Native String Function GetSelectedOutfit (Actor actor) Global Native Bool Function IsEnabled () Global Native String[] Function ListOutfits (Bool favoritesOnly = False) Global Native