diff --git a/CommonLibF4/cmake/sourcelist.cmake b/CommonLibF4/cmake/sourcelist.cmake index d9187a76..ec2d0666 100644 --- a/CommonLibF4/cmake/sourcelist.cmake +++ b/CommonLibF4/cmake/sourcelist.cmake @@ -27,6 +27,7 @@ set(SOURCES include/RE/Bethesda/BGSMod.h include/RE/Bethesda/BGSPrimitive.h include/RE/Bethesda/BGSSaveLoad.h + include/RE/Bethesda/BGSSceneAction.h include/RE/Bethesda/BGSStoryEventManager.h include/RE/Bethesda/BGSStoryManagerTreeForm.h include/RE/Bethesda/BGSSynchronizedAnimationManager.h diff --git a/CommonLibF4/include/RE/Bethesda/Actor.h b/CommonLibF4/include/RE/Bethesda/Actor.h index 9c376c2f..27cdf864 100644 --- a/CommonLibF4/include/RE/Bethesda/Actor.h +++ b/CommonLibF4/include/RE/Bethesda/Actor.h @@ -259,7 +259,7 @@ namespace RE void SetupFireSounds(Actor& a_actor, BGSObjectInstanceT& a_weapon) { using func_t = decltype(&EquippedWeaponData::SetupFireSounds); - REL::Relocation func{ REL::ID(1468462) }; + REL::Relocation func{ REL::ID(2232275) }; return func(this, a_actor, a_weapon); } diff --git a/CommonLibF4/include/RE/Bethesda/BGSSceneAction.h b/CommonLibF4/include/RE/Bethesda/BGSSceneAction.h new file mode 100644 index 00000000..fde492f2 --- /dev/null +++ b/CommonLibF4/include/RE/Bethesda/BGSSceneAction.h @@ -0,0 +1,228 @@ +#pragma once + +#include "RE/Bethesda/BSTArray.h" +#include "RE/Bethesda/BSTSmartPointer.h" +#include "RE/Bethesda/TESCondition.h" +#include "RE/Bethesda/TESForms.h" + +namespace RE +{ + class Actor; + class BGSScene; + class BGSKeyword; + class BGSSoundDescriptorForm; + class BGSSoundOutput; + class BSInputEnableLayer; + class TESCondition; + class TESPackage; + class TESQuest; + class TESTopic; + + class __declspec(novtable) BGSSceneAction + { + public: + static constexpr auto RTTI{ RTTI::BGSSceneAction }; + static constexpr auto VTABLE{ VTABLE::BGSSceneAction }; + + struct STARTSCENEACTIONDATA + { + BGSScene* pScene; + std::uint16_t sceneStartPhase; + TESQuest* parentQuest; + TESCondition sceneConditions; + }; + + enum SCENE_ACTION_PLAYER_RESPONSE_TYPE : std::uint32_t + { + kPositive = 0, + kNegative = 1, + kNeutral = 2, + kQuestion = 3, + kTotal = 4, + kNone + }; + + enum SCENE_ACTION_TYPE : std::uint32_t + { + kDialogue = 0, + kPackage = 1, + kTimer = 2, + kPlayerDialogue = 3, + kStartScene = 4, + kNPCResponse = 5, + kRadio = 6, + }; + + enum class Flag + { + kPlayerUseDialogueSubtypePositive = 1 << 7, + kPlayerUseDialogueSubtypeNegative = 1 << 8, + kPlayerUseDialogueSubtypeNeutral = 1 << 9, + kUseDialogueSubtype = 1 << 10, + kPlayerUseDialogueSubtypeQuestion = 1 << 11, + kFaceTaget = 1 << 15, + kHeadTrackPlayer = 1 << 17, + kIngoreForCompletion = 1 << 19, + kCameraSpeakerTarget = 1 << 21 + }; + + enum class Status + { + kStopped, + kRunning, + kComplete + }; + + virtual ~BGSSceneAction(); // 00 + + // add + virtual void Unk_01(void); // 01 + virtual void Unk_02(void); // 02 + virtual void Unk_03(void); // 03 + virtual void Unk_04(void); // 04 + virtual void Unk_05(void); // 05 + virtual bool QIsLooping(void); // 06 + virtual bool QFaceHeadTrackTarget(const BGSScene* scene); // 07 + virtual SCENE_ACTION_TYPE GetActionType() const = 0; // 08 + virtual bool QActionCanEnd(); // 09 + virtual bool IsPackageActive(BGSScene* scene, TESPackage* package, Actor* actor); // 0A + virtual void Unk_0B(void); // 0B + virtual void Unk_0C(void); // 0C + virtual void Unk_0D(void); // 0D + virtual void Unk_0E(void); // 0E + virtual void Unk_0F(void); // 0F + virtual void Unk_10(void); // 10 + virtual void Unk_11(void); // 11 + virtual void StartAction(BGSScene* scene); // 12 + virtual void EndAction(BGSScene* scene); // 13 + virtual void CleanUpActionActor(void); // 14 + virtual void UpdateAction(BGSScene* scene); // 14 + + // members + std::uint32_t actorID; // 08 + std::uint16_t startPhase; // 0C + std::uint16_t endPhase; // 0E + stl::enumeration flags; // 10 + stl::enumeration status; // 14 + std::uint32_t uniqueID; // 18 + }; + static_assert(sizeof(BGSSceneAction) == 0x20); + + class __declspec(novtable) BGSSceneActionDialogue : + public BGSSceneAction + { + public: + static constexpr auto RTTI{ RTTI::BGSSceneActionDialogue }; + static constexpr auto VTABLE{ VTABLE::BGSSceneActionDialogue }; + + // members + TESTopic* topic; // 20 + float maxLoopTime; // 28 + float minLoopTime; // 2C + BSTArray headTrackTargetA; // 30 + float currentLoopTimer; // 48 + BGSKeyword* pAnimFaceArchType; // 50 + BGSKeyword* pSubtypeKeyword; // 58 + BGSSoundOutput* outputModel; // 60 + BSTSmartPointer pInputLayer; // 68 + std::uint32_t headTargetValue; // 74 + float headTrackChangeTimer; // 78 + }; + static_assert(sizeof(BGSSceneActionDialogue) == 0x78); + + class __declspec(novtable) BGSSceneActionConversationBase : + public BGSSceneAction + { + public: + static constexpr auto RTTI{ RTTI::BGSSceneActionConversationBase }; + static constexpr auto VTABLE{ VTABLE::BGSSceneActionConversationBase }; + + TESTopic* responseTopics[4]; // 20 + BGSKeyword* pResponseSubtypeKeywords[4]; // 40 + BGSSoundOutput* pOutputModel; // 60 + BSTArray headTrackTargetA; // 68 + std::uint32_t headTargetValue; // 80 + float headTrackChangeTimer; // 84 + TESTopic* currentTopic; // 88 + }; + static_assert(sizeof(BGSSceneActionConversationBase) == 0x90); + + class __declspec(novtable) BGSSceneActionPlayerDialogue : + public BGSSceneActionConversationBase + { + public: + static constexpr auto RTTI{ RTTI::BGSSceneActionPlayerDialogue }; + static constexpr auto VTABlE{ VTABLE::BGSSceneActionPlayerDialogue }; + + std::uint64_t dialogueTarget; // 90 + TESTopic* pNPCResponseTopics[4]; // 98 + BGSKeyword* pNPCResponseSubtypeKeywords[4]; // B8 + TESTopic* pTopic; // D8 + SCENE_ACTION_PLAYER_RESPONSE_TYPE playerInput; // E0 + }; + static_assert(sizeof(BGSSceneActionPlayerDialogue) == 0xE8); + + class __declspec(novtable) BGSSceneActionNPCResponseDialogue : public BGSSceneActionConversationBase { }; + + class __declspec(novtable) BGSSceneActionStartScene : + public BGSSceneAction + { + public: + static constexpr auto RTTI{ RTTI::BGSSceneActionStartScene }; + static constexpr auto VTABlE{ VTABLE::BGSSceneActionStartScene }; + + BSTArray scenesA; // 20 + BGSScene* scene; // 38 + std::uint16_t sceneStartPhase; // 40 + bool endSceneSayGreeting; // 42 + }; + static_assert(sizeof(BGSSceneActionStartScene) == 0x48); + + class __declspec(novtable) BGSSceneActionTimer : + public BGSSceneAction + { + public: + static constexpr auto RTTI{ RTTI::BGSSceneActionTimer }; + static constexpr auto VTABlE{ VTABLE::BGSSceneActionTimer }; + + float seconds; // 20 + float minSeconds; // 24 + float timer; // 28 + bool scriptEndRun; // 2C + bool runEnd; // 2D + float currentSeconds; // 30 + }; + static_assert(sizeof(BGSSceneActionTimer) == 0x38); + + class __declspec(novtable) BGSSceneActionRadio : + public BGSSceneAction + { + public: + static constexpr auto RTTI{ RTTI::BGSSceneActionRadio }; + static constexpr auto VTABlE{ VTABLE::BGSSceneActionRadio }; + + TESTopic* topic; // 20 + BGSSoundDescriptorForm* sound; // 28 + BGSSoundOutput* outputModel; // 30 + BGSKeyword* subtypeKeyword; // 38 + BGSSoundDescriptorForm* topicSound; // 40 + float soundDuration; // 48 + std::uint32_t soundID; // 4C + bool soundDone; // 50 + TESTopic* currentTopic; // 58 + float failTimer; // 60 + }; + static_assert(sizeof(BGSSceneActionRadio) == 0x68); + + class __declspec(novtable) BGSSceneActionPackage : + public BGSSceneAction + { + public: + static constexpr auto RTTI{ RTTI::BGSSceneActionPackage }; + static constexpr auto VTABlE{ VTABLE::BGSSceneActionPackage }; + + std::uint32_t currentPackIndex; // 20 + BSTArray packages; // 28 + }; + static_assert(sizeof(BGSSceneActionPackage) == 0x40); +} diff --git a/CommonLibF4/include/RE/Bethesda/BGSStoryManagerTreeForm.h b/CommonLibF4/include/RE/Bethesda/BGSStoryManagerTreeForm.h index a87e5077..a6115be9 100644 --- a/CommonLibF4/include/RE/Bethesda/BGSStoryManagerTreeForm.h +++ b/CommonLibF4/include/RE/Bethesda/BGSStoryManagerTreeForm.h @@ -96,7 +96,7 @@ namespace RE bool SetStage(std::uint16_t stage) { using func_t = decltype(&TESQuest::SetStage); - REL::Relocation func{ REL::ID(952799) }; + REL::Relocation func{ REL::ID(2207743) }; return func(this, stage); } diff --git a/CommonLibF4/include/RE/Bethesda/BSExtraData.h b/CommonLibF4/include/RE/Bethesda/BSExtraData.h index 876bcb72..1091ec2a 100644 --- a/CommonLibF4/include/RE/Bethesda/BSExtraData.h +++ b/CommonLibF4/include/RE/Bethesda/BSExtraData.h @@ -888,7 +888,7 @@ namespace RE void SetStartingWorldOrCell(TESForm* a_form) { using func_t = decltype(&ExtraDataList::SetStartingWorldOrCell); - REL::Relocation func{ REL::ID(603621) }; + REL::Relocation func{ REL::ID(2191213) }; return func(this, a_form); } diff --git a/CommonLibF4/include/RE/Bethesda/PlayerCharacter.h b/CommonLibF4/include/RE/Bethesda/PlayerCharacter.h index 780cc56c..408c70cf 100644 --- a/CommonLibF4/include/RE/Bethesda/PlayerCharacter.h +++ b/CommonLibF4/include/RE/Bethesda/PlayerCharacter.h @@ -289,7 +289,7 @@ namespace RE bool IsGodMode() { using func_t = decltype(&PlayerCharacter::IsGodMode); - REL::Relocation func{ REL::ID(1032309) }; + REL::Relocation func{ REL::ID(2232986) }; return func(this); } diff --git a/CommonLibF4/include/RE/Bethesda/ProcessLists.h b/CommonLibF4/include/RE/Bethesda/ProcessLists.h index dccdc624..6ea73cf0 100644 --- a/CommonLibF4/include/RE/Bethesda/ProcessLists.h +++ b/CommonLibF4/include/RE/Bethesda/ProcessLists.h @@ -72,7 +72,7 @@ namespace RE [[nodiscard]] bool IsActorTargetingREFinPackage(const TESObjectREFR* a_actor, PTYPE a_type, bool a_onlyHigh) { using func_t = decltype(&ProcessLists::IsActorTargetingREFinPackage); - REL::Relocation func{ REL::ID(559542) }; + REL::Relocation func{ REL::ID(2234033) }; return func(this, a_actor, a_type, a_onlyHigh); } diff --git a/CommonLibF4/include/RE/Bethesda/SWFToCodeFunctionHandler.h b/CommonLibF4/include/RE/Bethesda/SWFToCodeFunctionHandler.h index 5e9b9f10..b8a4cc31 100644 --- a/CommonLibF4/include/RE/Bethesda/SWFToCodeFunctionHandler.h +++ b/CommonLibF4/include/RE/Bethesda/SWFToCodeFunctionHandler.h @@ -23,14 +23,14 @@ namespace RE void MapCodeMethodToASFunction(const char* a_functionName, std::int32_t a_functionID) { using func_t = decltype(&SWFToCodeFunctionHandler::MapCodeMethodToASFunction); - REL::Relocation func{ REL::ID(1263128) }; + REL::Relocation func{ REL::ID(2287419) }; return func(this, a_functionName, a_functionID); } void RegisterCodeObject(Scaleform::GFx::Movie& a_movie, Scaleform::GFx::Value& a_menuObj) { using func_t = decltype(&SWFToCodeFunctionHandler::RegisterCodeObject); - REL::Relocation func{ REL::ID(67637) }; + REL::Relocation func{ REL::ID(2287415) }; return func(this, a_movie, a_menuObj); } }; diff --git a/CommonLibF4/include/RE/Bethesda/TESBoundAnimObjects.h b/CommonLibF4/include/RE/Bethesda/TESBoundAnimObjects.h index ff9956d3..b81b7a5d 100644 --- a/CommonLibF4/include/RE/Bethesda/TESBoundAnimObjects.h +++ b/CommonLibF4/include/RE/Bethesda/TESBoundAnimObjects.h @@ -281,7 +281,7 @@ namespace RE [[nodiscard]] TESContainer* GetContainer() { using func_t = decltype(&TESFurniture::GetContainer); - REL::Relocation func{ REL::ID(1049933) }; + REL::Relocation func{ REL::ID(2198043) }; return func(this); } @@ -443,7 +443,7 @@ namespace RE [[nodiscard]] uint32_t GetSex() noexcept { using func_t = decltype(&TESNPC::GetSex); - REL::Relocation func{ REL::ID(1257181) }; + REL::Relocation func{ REL::ID(2207107) }; return func(this); } @@ -563,21 +563,21 @@ namespace RE LOCK_LEVEL GetHackDifficultyLockLevel(TESObjectREFR* a_refr) { using func_t = decltype(&BGSTerminal::GetHackDifficultyLockLevel); - REL::Relocation func{ REL::ID(537273) }; + REL::Relocation func{ REL::ID(2197777) }; return func(this, a_refr); } static bool IsTerminalRefInUse(TESObjectREFR* a_refr) { using func_t = decltype(&BGSTerminal::IsTerminalRefInUse); - REL::Relocation func{ REL::ID(1093565) }; + REL::Relocation func{ REL::ID(2197779) }; return func(a_refr); } static void Show(TESObjectREFR* a_refr) { using func_t = decltype(&BGSTerminal::Show); - REL::Relocation func{ REL::ID(1069012) }; + REL::Relocation func{ REL::ID(2197776) }; return func(a_refr); } diff --git a/CommonLibF4/include/RE/Bethesda/TESBoundObjects.h b/CommonLibF4/include/RE/Bethesda/TESBoundObjects.h index 8774d0a5..38f5ee25 100644 --- a/CommonLibF4/include/RE/Bethesda/TESBoundObjects.h +++ b/CommonLibF4/include/RE/Bethesda/TESBoundObjects.h @@ -102,7 +102,7 @@ namespace RE void ApplyMods(BSTSmartPointer& a_dest, const BGSObjectInstanceExtra* a_extra) const { using func_t = decltype(&TESBoundObject::ApplyMods); - REL::Relocation func{ REL::ID(113585) }; + REL::Relocation func{ REL::ID(2198325) }; return func(this, a_dest, a_extra); } @@ -655,7 +655,7 @@ namespace RE [[nodiscard]] static bool GetReloadsWithAmmoRef(const TESAmmo* a_ammo) { using func_t = decltype(&TESAmmo::GetReloadsWithAmmoRef); - REL::Relocation func{ REL::ID(1035622) }; + REL::Relocation func{ REL::ID(2197864) }; return func(a_ammo); } @@ -793,7 +793,7 @@ namespace RE bool CollidesWithSmallTransparentLayer() { using func_t = decltype(&BGSProjectile::CollidesWithSmallTransparentLayer); - REL::Relocation func{ REL::ID(1115694) }; + REL::Relocation func{ REL::ID(2197620) }; return func(this); } diff --git a/CommonLibF4/include/RE/Bethesda/TESCondition.h b/CommonLibF4/include/RE/Bethesda/TESCondition.h index 2662b5c7..7af87583 100644 --- a/CommonLibF4/include/RE/Bethesda/TESCondition.h +++ b/CommonLibF4/include/RE/Bethesda/TESCondition.h @@ -74,14 +74,14 @@ namespace RE [[nodiscard]] float GetComparisonValue() { using func_t = decltype(&TESConditionItem::GetComparisonValue); - REL::Relocation func{ REL::ID(1373349) }; + REL::Relocation func{ REL::ID(2212007) }; return func(this); } [[nodiscard]] bool IsTrue(TESObjectREFR* a_actionRef, TESObjectREFR* a_targetRef) { using func_t = decltype(&TESConditionItem::IsTrue); - REL::Relocation func{ REL::ID(1453240) }; + REL::Relocation func{ REL::ID(2212008) }; return func(this, a_actionRef, a_targetRef); } diff --git a/CommonLibF4/include/RE/Bethesda/TESDataHandler.h b/CommonLibF4/include/RE/Bethesda/TESDataHandler.h index 6d6ab66d..660f0ae9 100644 --- a/CommonLibF4/include/RE/Bethesda/TESDataHandler.h +++ b/CommonLibF4/include/RE/Bethesda/TESDataHandler.h @@ -72,14 +72,14 @@ namespace RE [[nodiscard]] bool AddFormToDataHandler(TESForm* a_form) { using func_t = decltype(&TESDataHandler::AddFormToDataHandler); - REL::Relocation func{ REL::ID(350112) }; + REL::Relocation func{ REL::ID(2192271) }; return func(this, a_form); } [[nodiscard]] bool CheckModsLoaded(bool a_everModded) { using func_t = decltype(&TESDataHandler::CheckModsLoaded); - REL::Relocation func{ REL::ID(1432894) }; + REL::Relocation func{ REL::ID(2192323) }; return func(this, a_everModded); } @@ -205,7 +205,7 @@ namespace RE bool IsFormIDInuse(std::uint32_t a_formID) { using func_t = decltype(&TESDataHandler::IsFormIDInuse); - REL::Relocation func{ REL::ID(1448838) }; + REL::Relocation func{ REL::ID(2192351) }; return func(this, a_formID); } diff --git a/CommonLibF4/include/RE/Bethesda/TESForms.h b/CommonLibF4/include/RE/Bethesda/TESForms.h index 3142cc6b..859f1413 100644 --- a/CommonLibF4/include/RE/Bethesda/TESForms.h +++ b/CommonLibF4/include/RE/Bethesda/TESForms.h @@ -479,7 +479,6 @@ namespace RE class TESPackageData; class TESRegionDataList; class TESRegionPointList; - class TESResponse; struct BGSDebrisData; struct FORM; @@ -1663,12 +1662,63 @@ namespace RE struct TOPIC_INFO_DATA { public: + enum class TOPIC_INFO_FLAGS : std::uint32_t { + kNone = 0, + kStartSceneOnEnd = 0x1, + kRandom = 0x2, + kSayOnce = 0x4, + kRequirePlayerActivation = 0x8, + kInfoRefusal = 0x10, + kRandomEnd = 0x20, + kEndRunningScene = 0x40, + kIsForceGreet = 0x80, + kPlaredAddress = 0x100, + kGroupTracksData = 0x100, + kForceSubtitle = 0x200, + kGroupForceRandom = 0x200, + kCanMoveWhileGreeitng = 0x400, + kNoLIPFile = 0x800, + kGroupDontDoAll = 0x800, + kPostProcess = 0x1000, + kCustomSoundOutpt = 0x2000, + kDialogueInfoSaid = 0x4000, + kHasCapsData = 0x4000, + kAlreadySaidDoAllBeforeRepeating = 0x8000, + kEditorOnly = 0x4000, + }; + // members - std::uint16_t flags; // 0 + stl::enumeration flags; // 0 std::uint16_t timeUntilReset; // 2 }; static_assert(sizeof(TOPIC_INFO_DATA) == 0x4); + struct TESResponse + { + public: + struct RespData + { + std::uint16_t percent; + std::uint8_t responseID; + bool useEmotion; + }; + static_assert(sizeof(RespData) == 0x4); + + const char* GetResponseText() + { + using func_t = decltype(&TESResponse::GetResponseText); + REL::Relocation func{ REL::ID(2208288) }; + return func(this); + } + + // Members + BGSLocalizedString responseText; + TESResponse* pNext; + TESResponse::RespData data; + BGSTypedKeywordValue faceArcheType; + }; + static_assert(sizeof(TESResponse) == 0x18); + class ResponseListWrapper { public: @@ -1685,6 +1735,32 @@ namespace RE static constexpr auto VTABLE{ VTABLE::TESTopicInfo }; static constexpr auto FORM_ID{ ENUM_FORM_ID::kINFO }; + enum Flags + { + kInfoGroup = (1 << 6), + }; + + enum CHARISMA_CHALLENGE_DIFFICULTY : std::uint32_t + { + CC_CHALLENGE_NONE = 0x0, + CC_CHALLENGE_EASY = 0x1, + CC_CHALLENGE_MEDIUM = 0x2, + CC_CHALLENGE_HARD = 0x3, + CC_CHALLENGE_ALWAYS_SUCCEEDS = 0x4, + CC_CHALLENGE_EASY_REPEATABLE = 0x5, + CC_CHALLENGE_MEDIUM_REPEATABLE = 0x6, + CC_CHALLENGE_HARD_REPEATABLE = 0x7, + CC_CHALLENGE_COUNT = 0x8, + }; + + enum CHARISMA_CHALLENGE_SUCCESS : std::uint32_t + { + CC_SUCCESS_NONE = 0xFFFFFFFF, + CC_SUCCESS_FAIL = 0x0, + CC_SUCCESS_SUCCEED = 0x1, + CC_SUCCESS_COUNT = 0x2, + }; + // members TESTopic* parentTopic; // 20 TESGlobal* resetGlobal; // 28 diff --git a/CommonLibF4/include/RE/Bethesda/Workshop.h b/CommonLibF4/include/RE/Bethesda/Workshop.h index 68f7c751..e517e011 100644 --- a/CommonLibF4/include/RE/Bethesda/Workshop.h +++ b/CommonLibF4/include/RE/Bethesda/Workshop.h @@ -200,21 +200,21 @@ namespace RE [[nodiscard]] inline TESObjectREFR* FindNearestValidWorkshop(const TESObjectREFR& a_refr) { using func_t = decltype(&Workshop::FindNearestValidWorkshop); - REL::Relocation func{ REL::ID(905705) }; + REL::Relocation func{ REL::ID(2194970) }; return func(a_refr); } [[nodiscard]] inline bool FreeBuild() { using func_t = decltype(&Workshop::FreeBuild); - REL::Relocation func{ REL::ID(1583365) }; + REL::Relocation func{ REL::ID(2194924) }; return func(); } [[nodiscard]] inline WorkshopMenuNode* GetSelectedWorkshopMenuNode(std::uint32_t a_row, std::uint32_t& a_column) { using func_t = decltype(&Workshop::GetSelectedWorkshopMenuNode); - REL::Relocation func{ REL::ID(763948) }; + REL::Relocation func{ REL::ID(2195024) }; return func(a_row, a_column); } diff --git a/CommonLibF4/include/RE/Fallout.h b/CommonLibF4/include/RE/Fallout.h index 33b33f89..140610b0 100644 --- a/CommonLibF4/include/RE/Fallout.h +++ b/CommonLibF4/include/RE/Fallout.h @@ -22,6 +22,7 @@ #include "RE/Bethesda/BGSMod.h" #include "RE/Bethesda/BGSPrimitive.h" #include "RE/Bethesda/BGSSaveLoad.h" +#include "RE/Bethesda/BGSSceneAction.h" #include "RE/Bethesda/BGSStoryEventManager.h" #include "RE/Bethesda/BGSStoryManagerTreeForm.h" #include "RE/Bethesda/BGSSynchronizedAnimationManager.h"