From 82204fec0b2f64c32b023d9f3ae0bce5c4cf1958 Mon Sep 17 00:00:00 2001 From: MetricExpansion <> Date: Fri, 4 Dec 2020 16:13:04 -0800 Subject: [PATCH] Add calls for Papyrus to use --- include/ArmorAddonOverrideService.h | 2 + src/ArmorAddonOverrideService.cpp | 13 ++++ src/OutfitSystem.cpp | 60 ++++++++++++++++++- src/papyrus/skyrimoutfitsystemnativefuncs.psc | 4 ++ 4 files changed, 77 insertions(+), 2 deletions(-) diff --git a/include/ArmorAddonOverrideService.h b/include/ArmorAddonOverrideService.h index 5a54231..be163a1 100644 --- a/include/ArmorAddonOverrideService.h +++ b/include/ArmorAddonOverrideService.h @@ -112,6 +112,8 @@ class ArmorAddonOverrideService { bool hasOutfit(const char* name) const; void deleteOutfit(const char* name); void setFavorite(const char* name, bool favorite); + void setOutfitPassthrough(const char* name, bool allowPassthrough); + void setOutfitEquipRequired(const char* name, bool requiresEquipped); void modifyOutfit(const char* name, std::vector& add, std::vector& remove, bool createIfMissing = false); // can throw bad_name if (createIfMissing) void renameOutfit(const char* oldName, const char* newName); // throws name_conflict if the new name is already taken; can throw bad_name; throws std::out_of_range if the oldName doesn't exist void setOutfit(const char* name); diff --git a/src/ArmorAddonOverrideService.cpp b/src/ArmorAddonOverrideService.cpp index 4279926..c77638b 100644 --- a/src/ArmorAddonOverrideService.cpp +++ b/src/ArmorAddonOverrideService.cpp @@ -256,6 +256,19 @@ void ArmorAddonOverrideService::setFavorite(const char* name, bool favorite) { outfit->second.isFavorite = favorite; } +void ArmorAddonOverrideService::setOutfitPassthrough(const char* name, bool allowPassthrough) { + auto outfit = this->outfits.find(name); + if (outfit != this->outfits.end()) + outfit->second.allowsPassthrough = allowPassthrough; +} + +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, std::vector& add, std::vector& remove, bool createIfMissing) { try { Outfit& target = this->getOutfit(name); diff --git a/src/OutfitSystem.cpp b/src/OutfitSystem.cpp index f893b1c..fe2dbc0 100644 --- a/src/OutfitSystem.cpp +++ b/src/OutfitSystem.cpp @@ -466,7 +466,31 @@ extern SKSESerializationInterface* g_Serialization; } return result; } - BSFixedString GetSelectedOutfit(VMClassRegistry* registry, UInt32 stackId, StaticFunctionTag*) { + bool GetOutfitPassthroughStatus(VMClassRegistry* registry, UInt32 stackId, StaticFunctionTag*, BSFixedString name) { + auto& service = ArmorAddonOverrideService::GetInstance(); + bool result = false; + try { + auto& outfit = service.getOutfit(name.data); + result = outfit.allowsPassthrough; + } + catch (std::out_of_range) { + registry->LogWarning("The specified outfit does not exist.", stackId); + } + return result; + } + bool GetOutfitEquipRequiredStatus(VMClassRegistry* registry, UInt32 stackId, StaticFunctionTag*, BSFixedString name) { + auto& service = ArmorAddonOverrideService::GetInstance(); + bool result = false; + try { + auto& outfit = service.getOutfit(name.data); + result = outfit.requiresEquipped; + } + catch (std::out_of_range) { + registry->LogWarning("The specified outfit does not exist.", stackId); + } + return result; + } + BSFixedString GetSelectedOutfit(VMClassRegistry* registry, UInt32 stackId, StaticFunctionTag*) { auto& service = ArmorAddonOverrideService::GetInstance(); return service.currentOutfit().name.c_str(); } @@ -544,7 +568,15 @@ extern SKSESerializationInterface* g_Serialization; auto& service = ArmorAddonOverrideService::GetInstance(); service.setFavorite(name.data, favorite); } - bool OutfitExists(VMClassRegistry* registry, UInt32 stackId, StaticFunctionTag*, BSFixedString name) { + void SetOutfitPassthroughStatus(VMClassRegistry* registry, UInt32 stackId, StaticFunctionTag*, BSFixedString name, bool allowsPassthrough) { + auto& service = ArmorAddonOverrideService::GetInstance(); + service.setOutfitPassthrough(name.data, allowsPassthrough); + } + void SetOutfitEquipRequiredStatus(VMClassRegistry* registry, UInt32 stackId, StaticFunctionTag*, BSFixedString name, bool equipRequired) { + auto& service = ArmorAddonOverrideService::GetInstance(); + service.setOutfitEquipRequired(name.data, equipRequired); + } + bool OutfitExists(VMClassRegistry* registry, UInt32 stackId, StaticFunctionTag*, BSFixedString name) { auto& service = ArmorAddonOverrideService::GetInstance(); return service.hasOutfit(name.data); } @@ -889,12 +921,36 @@ bool OutfitSystem::RegisterPapyrus(VMClassRegistry* registry) { GetOutfitFavoriteStatus, registry )); + registry->RegisterFunction(new NativeFunction1( + "GetOutfitPassthroughStatus", + "SkyrimOutfitSystemNativeFuncs", + GetOutfitPassthroughStatus, + registry + )); + registry->RegisterFunction(new NativeFunction1( + "GetOutfitEquipRequiredStatus", + "SkyrimOutfitSystemNativeFuncs", + GetOutfitEquipRequiredStatus, + registry + )); registry->RegisterFunction(new NativeFunction2( "SetOutfitFavoriteStatus", "SkyrimOutfitSystemNativeFuncs", SetOutfitFavoriteStatus, registry )); + registry->RegisterFunction(new NativeFunction2( + "SetOutfitPassthroughStatus", + "SkyrimOutfitSystemNativeFuncs", + SetOutfitPassthroughStatus, + registry + )); + registry->RegisterFunction(new NativeFunction2( + "SetOutfitEquipRequiredStatus", + "SkyrimOutfitSystemNativeFuncs", + SetOutfitEquipRequiredStatus, + registry + )); registry->RegisterFunction(new NativeFunction0( "IsEnabled", "SkyrimOutfitSystemNativeFuncs", diff --git a/src/papyrus/skyrimoutfitsystemnativefuncs.psc b/src/papyrus/skyrimoutfitsystemnativefuncs.psc index 0f9c90e..04fb4c7 100644 --- a/src/papyrus/skyrimoutfitsystemnativefuncs.psc +++ b/src/papyrus/skyrimoutfitsystemnativefuncs.psc @@ -66,6 +66,10 @@ Bool Function ArmorConflictsWithOutfit (Armor akTest, String asOutfitName) G Armor[] Function GetOutfitContents (String asOutfitName) Global Native Bool Function GetOutfitFavoriteStatus(String asOutfitName) Global Native Function SetOutfitFavoriteStatus(String asOutfitName, Bool abFavorite) Global Native +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 GetSelectedOutfit () Global Native Bool Function IsEnabled () Global Native String[] Function ListOutfits (Bool favoritesOnly = False) Global Native