diff --git a/include/ArmorAddonOverrideService.h b/include/ArmorAddonOverrideService.h index c4bf0b1..db705f5 100644 --- a/include/ArmorAddonOverrideService.h +++ b/include/ArmorAddonOverrideService.h @@ -124,7 +124,9 @@ class ArmorAddonOverrideService { 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, RE::Actor* target); - // + void addActor(RE::Actor* target); + void removeActor(RE::Actor* target); + // void setLocationBasedAutoSwitchEnabled(bool) noexcept; void setOutfitUsingLocation(LocationType location, RE::Actor* target); void setLocationOutfit(LocationType location, const char* name, RE::Actor* target); diff --git a/src/ArmorAddonOverrideService.cpp b/src/ArmorAddonOverrideService.cpp index 9fe01e9..dfea005 100644 --- a/src/ArmorAddonOverrideService.cpp +++ b/src/ArmorAddonOverrideService.cpp @@ -333,6 +333,15 @@ void ArmorAddonOverrideService::setOutfit(const char* name, RE::Actor* target) { } } +void ArmorAddonOverrideService::addActor(RE::Actor* target) { + if (actorOutfitAssignments.count(target) == 0) actorOutfitAssignments.emplace(target, ActorOutfitAssignments()); +} + +void ArmorAddonOverrideService::removeActor(RE::Actor* target) { + if (target == RE::PlayerCharacter::GetSingleton()) return; + actorOutfitAssignments.erase(target); +} + void ArmorAddonOverrideService::setLocationBasedAutoSwitchEnabled(bool newValue) noexcept { locationBasedAutoSwitchEnabled = newValue; } diff --git a/src/OutfitSystem.cpp b/src/OutfitSystem.cpp index 7409ae4..8822e1b 100644 --- a/src/OutfitSystem.cpp +++ b/src/OutfitSystem.cpp @@ -616,6 +616,14 @@ extern SKSESerializationInterface* g_Serialization; auto& service = ArmorAddonOverrideService::GetInstance(); service.setOutfit(name.data, RE::PlayerCharacter::GetSingleton()); } + void AddActor(VMClassRegistry* registry, UInt32 stackId, StaticFunctionTag*, Actor* target) { + auto& service = ArmorAddonOverrideService::GetInstance(); + service.addActor((RE::Actor*) target); + } + void RemoveActor(VMClassRegistry* registry, UInt32 stackId, StaticFunctionTag*, Actor* target) { + auto& service = ArmorAddonOverrideService::GetInstance(); + service.removeActor((RE::Actor*) target); + } void SetLocationBasedAutoSwitchEnabled(VMClassRegistry* registry, UInt32 stackId, StaticFunctionTag*, bool value) { ArmorAddonOverrideService::GetInstance().setLocationBasedAutoSwitchEnabled(value); } @@ -1012,6 +1020,18 @@ bool OutfitSystem::RegisterPapyrus(VMClassRegistry* registry) { SetSelectedOutfit, registry )); + registry->RegisterFunction(new NativeFunction1( + "AddActor", + "SkyrimOutfitSystemNativeFuncs", + AddActor, + registry + )); + registry->RegisterFunction(new NativeFunction1( + "RemoveActor", + "SkyrimOutfitSystemNativeFuncs", + RemoveActor, + registry + )); registry->RegisterFunction(new NativeFunction1( "SetLocationBasedAutoSwitchEnabled", "SkyrimOutfitSystemNativeFuncs", diff --git a/src/papyrus/skyrimoutfitsystemnativefuncs.psc b/src/papyrus/skyrimoutfitsystemnativefuncs.psc index 04fb4c7..725491e 100644 --- a/src/papyrus/skyrimoutfitsystemnativefuncs.psc +++ b/src/papyrus/skyrimoutfitsystemnativefuncs.psc @@ -80,6 +80,8 @@ Bool Function OutfitExists (String asOutfitName) Global Native Function OverwriteOutfit (String asOutfitName, Armor[] akArmors) Global Native Function SetEnabled (Bool abEnabled) Global Native Function SetSelectedOutfit (String asOutfitName) Global Native + Function AddActor (Actor akSubject) Global Native + Function RemoveActor (Actor akSubject) Global Native Function SetLocationBasedAutoSwitchEnabled (Bool abEnabled) Global Native Bool Function GetLocationBasedAutoSwitchEnabled () Global Native