First version of backend for multi-actor that builds

Only lightly tested. Still need to figure out "frontend" and test with other actors somehow.
This commit is contained in:
MetricExpansion 2021-05-21 18:16:34 -07:00
parent f17c48993e
commit 6364cbf662
6 changed files with 149 additions and 85 deletions

View file

@ -4,6 +4,7 @@
#pragma warning( disable : 4267 ) // SKSE has some integer conversion when returning arrays. Returned arrays should be limited to 32-bit size().
#pragma warning( disable : 5053 ) // SKSE uses explicit(<expr>) vendor extension.
#include "skse64/PapyrusNativeFunctions.h"
#include "RE/FormComponents/TESForm/TESObjectREFR/Actor/Character/PlayerCharacter.h"
#pragma warning( pop )
#include "skse64/PapyrusObjects.h"
@ -492,7 +493,7 @@ extern SKSESerializationInterface* g_Serialization;
}
BSFixedString GetSelectedOutfit(VMClassRegistry* registry, UInt32 stackId, StaticFunctionTag*) {
auto& service = ArmorAddonOverrideService::GetInstance();
return service.currentOutfit().name.c_str();
return service.currentOutfit(RE::PlayerCharacter::GetSingleton()).name.c_str();
}
bool IsEnabled(VMClassRegistry* registry, UInt32 stackId, StaticFunctionTag*) {
auto& service = ArmorAddonOverrideService::GetInstance();
@ -613,7 +614,7 @@ extern SKSESerializationInterface* g_Serialization;
}
void SetSelectedOutfit(VMClassRegistry* registry, UInt32 stackId, StaticFunctionTag*, BSFixedString name) {
auto& service = ArmorAddonOverrideService::GetInstance();
service.setOutfit(name.data);
service.setOutfit(name.data, RE::PlayerCharacter::GetSingleton());
}
void SetLocationBasedAutoSwitchEnabled(VMClassRegistry* registry, UInt32 stackId, StaticFunctionTag*, bool value) {
ArmorAddonOverrideService::GetInstance().setLocationBasedAutoSwitchEnabled(value);
@ -670,7 +671,7 @@ extern SKSESerializationInterface* g_Serialization;
}
location = location->parentLoc;
}
return service.checkLocationType(keywords, weather_flags);
return service.checkLocationType(keywords, weather_flags, RE::PlayerCharacter::GetSingleton());
}
UInt32 IdentifyLocationType(VMClassRegistry* registry, UInt32 stackId, StaticFunctionTag*, BGSLocation* location_skse, TESWeather* weather_skse) {
// NOTE: Identify the location for Papyrus. In the event no location is identified, we lie to Papyrus and say "World".
@ -691,7 +692,7 @@ extern SKSESerializationInterface* g_Serialization;
RE::DebugNotification(message, nullptr, false);
*/
if (location.has_value()) {
service.setOutfitUsingLocation(location.value());
service.setOutfitUsingLocation(location.value(), RE::PlayerCharacter::GetSingleton());
}
}
@ -701,13 +702,13 @@ extern SKSESerializationInterface* g_Serialization;
// Location outfit assignment is never allowed to be empty string. Use unset instead.
return;
}
return ArmorAddonOverrideService::GetInstance().setLocationOutfit(LocationType(location), name.data);
return ArmorAddonOverrideService::GetInstance().setLocationOutfit(LocationType(location), name.data, RE::PlayerCharacter::GetSingleton());
}
void UnsetLocationOutfit(VMClassRegistry* registry, UInt32 stackId, StaticFunctionTag*, UInt32 location) {
return ArmorAddonOverrideService::GetInstance().unsetLocationOutfit(LocationType(location));
return ArmorAddonOverrideService::GetInstance().unsetLocationOutfit(LocationType(location), RE::PlayerCharacter::GetSingleton());
}
BSFixedString GetLocationOutfit(VMClassRegistry* registry, UInt32 stackId, StaticFunctionTag*, UInt32 location) {
auto outfit = ArmorAddonOverrideService::GetInstance().getLocationOutfit(LocationType(location));
auto outfit = ArmorAddonOverrideService::GetInstance().getLocationOutfit(LocationType(location), RE::PlayerCharacter::GetSingleton());
if (outfit.has_value()) {
return BSFixedString(outfit.value().c_str());
} else {