From 4d3375a3412c48cdde88f222aba99aa3b7516dfb Mon Sep 17 00:00:00 2001 From: Flenarn Date: Fri, 31 Jul 2026 22:55:07 +0200 Subject: [PATCH 01/28] chore: Library update. --- include/RE/E/ExtraLinkedRef.h | 31 +++++++++++++++++++++++++++++++ include/RE/F/FastTravelCommand.h | 19 +++++++++++++++++++ include/RE/IDs.h | 7 +++++++ include/RE/M/MapMarker.h | 12 ++++++++++++ include/RE/P/PipboyMapData.h | 7 +++++++ include/RE/P/PlayerCharacter.h | 7 +++++++ include/RE/T/TESWorldSpace.h | 7 +++++++ 7 files changed, 90 insertions(+) create mode 100644 include/RE/E/ExtraLinkedRef.h create mode 100644 include/RE/F/FastTravelCommand.h create mode 100644 include/RE/M/MapMarker.h diff --git a/include/RE/E/ExtraLinkedRef.h b/include/RE/E/ExtraLinkedRef.h new file mode 100644 index 000000000..142e3168c --- /dev/null +++ b/include/RE/E/ExtraLinkedRef.h @@ -0,0 +1,31 @@ +#pragma once + +#include "RE/B/BSExtraData.h" +#include "RE/B/BSTArray.h" + +namespace RE +{ + class BGSKeyword; + class TESObjectREFR; + + class __declspec(novtable) ExtraLinkedRef : + public BSExtraData // 00 + { + public: + static constexpr auto RTTI{ RTTI::ExtraLinkedRef }; + static constexpr auto VTABLE{ VTABLE::ExtraLinkedRef }; + static constexpr auto TYPE{ EXTRA_DATA_TYPE::kLinkedRef }; + + class LinkedRef + { + public: + BGSKeyword* keyword; // 00 + TESObjectREFR* REFR; // 08 + }; + + // members + BSTSmallArray linkedRefs; // 018 + bool transientRefs; // 038 + }; + static_assert(sizeof(ExtraLinkedRef) == 0x40); +} diff --git a/include/RE/F/FastTravelCommand.h b/include/RE/F/FastTravelCommand.h new file mode 100644 index 000000000..dab9addf2 --- /dev/null +++ b/include/RE/F/FastTravelCommand.h @@ -0,0 +1,19 @@ +#pragma once + +#include "RE/P/PipboyCommand.h" + +namespace RE +{ + class __declspec(novtable) FastTravelCommand : + public PipboyCommand // 000 + { + public: + static constexpr auto RTTI{ RTTI::FastTravelCommand }; + static constexpr auto VTABLE{ VTABLE::FastTravelCommand }; + + // members + uint32_t markerId; // 028 + }; + static_assert(sizeof(FastTravelCommand) == 0x30); + +} diff --git a/include/RE/IDs.h b/include/RE/IDs.h index efd5c3839..bc122780e 100644 --- a/include/RE/IDs.h +++ b/include/RE/IDs.h @@ -1683,6 +1683,11 @@ namespace RE::ID inline constexpr REL::ID UpdateCursorConstraint{ 2225488 }; } + namespace PipboyMapData + { + inline constexpr REL::ID GetTravelLocationRefr{ 2225515 }; + } + namespace PipboyMapMenu { inline constexpr REL::ID UpdateData{ 2224074 }; @@ -1807,6 +1812,7 @@ namespace RE::ID inline constexpr REL::ID HasLOSToTarget{ 2233004 }; inline constexpr REL::ID TryUnlockObject{ 2233040 }; inline constexpr REL::ID EnableRadio{ 2233211 }; + inline constexpr REL::ID UpdateAnimation{ 2233005 }; } namespace PlayerControls @@ -2332,6 +2338,7 @@ namespace RE::ID { inline constexpr REL::ID DefaultWater{ 4799138 }; inline constexpr REL::ID GetSkyCell{ 2202924 }; + inline constexpr REL::ID AdjustMapMarkerCoord{ 2202880 }; } namespace UI diff --git a/include/RE/M/MapMarker.h b/include/RE/M/MapMarker.h new file mode 100644 index 000000000..cd39f657e --- /dev/null +++ b/include/RE/M/MapMarker.h @@ -0,0 +1,12 @@ +#pragma once +namespace RE +{ + namespace MapMarker + { + enum class MARKER_SCOPE + { + kWorld = 0x0, + kLocal = 0x1 + }; + } +} diff --git a/include/RE/P/PipboyMapData.h b/include/RE/P/PipboyMapData.h index 0eeb634a7..c171568f0 100644 --- a/include/RE/P/PipboyMapData.h +++ b/include/RE/P/PipboyMapData.h @@ -84,6 +84,13 @@ namespace RE virtual void DoClearData() override; // 0C virtual void DoClearSink() override; // 0D + ObjectRefHandle GetTravelLocationRefr(ObjectRefHandle* a_result, std::uint32_t a_markerId) + { + using func_t = decltype(&PipboyMapData::GetTravelLocationRefr); + static REL::Relocation func{ ID::PipboyMapData::GetTravelLocationRefr }; + return func(this, a_result, a_markerId); + } + // members PipboyObject* mapObject; // E8 BSTHashMap travelLocationsMarkers; // F0 diff --git a/include/RE/P/PlayerCharacter.h b/include/RE/P/PlayerCharacter.h index 5b29c1b74..c97ec7bfc 100644 --- a/include/RE/P/PlayerCharacter.h +++ b/include/RE/P/PlayerCharacter.h @@ -320,6 +320,13 @@ namespace RE return func(this, a_enable); } + void UpdateAnimation(float a_delta) + { + using func_t = decltype(&PlayerCharacter::UpdateAnimation); + static REL::Relocation func{ ID::PlayerCharacter::UpdateAnimation }; + return func(this, a_delta); + } + // members BSSpinLock actorToDisplayOnHUDLock; // 628 BSSpinLock questTargetLock; // 630 diff --git a/include/RE/T/TESWorldSpace.h b/include/RE/T/TESWorldSpace.h index 9c63ac819..bce070dbb 100644 --- a/include/RE/T/TESWorldSpace.h +++ b/include/RE/T/TESWorldSpace.h @@ -91,6 +91,13 @@ namespace RE } } + [[nodiscard]] void AdjustMapMarkerCoord(NiPoint3* a_mapCoord, bool a_inverse) + { + using func_t = decltype(&TESWorldSpace::AdjustMapMarkerCoord); + static REL::Relocation func{ ID::TESWorldSpace::AdjustMapMarkerCoord }; + return func(this, a_mapCoord, a_inverse) + } + // members BSTHashMap cellMap; // 0x040 TESObjectCELL* persistentCell; // 0x070 From 360d71324bee888d1d07821175a52e779673d4aa Mon Sep 17 00:00:00 2001 From: FlenarnDev Date: Fri, 31 Jul 2026 20:55:39 +0000 Subject: [PATCH 02/28] maintenance --- include/RE/Fallout.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/RE/Fallout.h b/include/RE/Fallout.h index 02ab25f99..14cfd788a 100644 --- a/include/RE/Fallout.h +++ b/include/RE/Fallout.h @@ -667,6 +667,7 @@ #include "RE/E/ExtraInstanceData.h" #include "RE/E/ExtraLeveledCreature.h" #include "RE/E/ExtraLight.h" +#include "RE/E/ExtraLinkedRef.h" #include "RE/E/ExtraLocation.h" #include "RE/E/ExtraLock.h" #include "RE/E/ExtraMapMarker.h" @@ -694,6 +695,7 @@ #include "RE/F/FORM.h" #include "RE/F/FORM_ENUM_STRING.h" #include "RE/F/FUNCTION_DATA.h" +#include "RE/F/FastTravelCommand.h" #include "RE/F/FatmanDeaths.h" #include "RE/F/FavoriteMgr_Events.h" #include "RE/F/FavoritesManager.h" @@ -952,6 +954,7 @@ #include "RE/M/MagicTarget.h" #include "RE/M/Main.h" #include "RE/M/MainMenu.h" +#include "RE/M/MapMarker.h" #include "RE/M/MapMarkerData.h" #include "RE/M/MarkerIconTypes.h" #include "RE/M/MeleeThrowHandler.h" From 432feb41181268488919842c51e74d310dc8f0b1 Mon Sep 17 00:00:00 2001 From: Flenarn Date: Fri, 31 Jul 2026 23:00:00 +0200 Subject: [PATCH 03/28] chore: Fix compile and missed file. --- include/RE/E/EXTRA_DATA_TYPE.h | 2 +- include/RE/T/TESWorldSpace.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/RE/E/EXTRA_DATA_TYPE.h b/include/RE/E/EXTRA_DATA_TYPE.h index 139ecb2e8..db6b2417e 100644 --- a/include/RE/E/EXTRA_DATA_TYPE.h +++ b/include/RE/E/EXTRA_DATA_TYPE.h @@ -84,7 +84,7 @@ namespace RE kNoRumors, // kSound, // kTerminalState, // - kLinkedRef, // + kLinkedRef, // ExtraLinkedRef kLinkedRefChildren, // kActivateRef, // kActivateRefChildren, // diff --git a/include/RE/T/TESWorldSpace.h b/include/RE/T/TESWorldSpace.h index bce070dbb..564a51889 100644 --- a/include/RE/T/TESWorldSpace.h +++ b/include/RE/T/TESWorldSpace.h @@ -96,7 +96,7 @@ namespace RE using func_t = decltype(&TESWorldSpace::AdjustMapMarkerCoord); static REL::Relocation func{ ID::TESWorldSpace::AdjustMapMarkerCoord }; return func(this, a_mapCoord, a_inverse) - } + }; // members BSTHashMap cellMap; // 0x040 From 564fec7617f01850c52ec00f0204e74db18f26db Mon Sep 17 00:00:00 2001 From: Flenarn Date: Fri, 31 Jul 2026 23:02:25 +0200 Subject: [PATCH 04/28] fix --- include/RE/T/TESWorldSpace.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/RE/T/TESWorldSpace.h b/include/RE/T/TESWorldSpace.h index 564a51889..520eeacd2 100644 --- a/include/RE/T/TESWorldSpace.h +++ b/include/RE/T/TESWorldSpace.h @@ -95,8 +95,8 @@ namespace RE { using func_t = decltype(&TESWorldSpace::AdjustMapMarkerCoord); static REL::Relocation func{ ID::TESWorldSpace::AdjustMapMarkerCoord }; - return func(this, a_mapCoord, a_inverse) - }; + return func(this, a_mapCoord, a_inverse); + } // members BSTHashMap cellMap; // 0x040 From 1efad3d996509cf60d431b37389781aa971f91da Mon Sep 17 00:00:00 2001 From: Flenarn Date: Sat, 1 Aug 2026 00:10:02 +0200 Subject: [PATCH 05/28] feat: More ExtraData. --- include/RE/E/ExtraCellSkyRegion.h | 20 +++++++++++++++++ include/RE/E/ExtraLinkedRefChildren.h | 31 +++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 include/RE/E/ExtraCellSkyRegion.h create mode 100644 include/RE/E/ExtraLinkedRefChildren.h diff --git a/include/RE/E/ExtraCellSkyRegion.h b/include/RE/E/ExtraCellSkyRegion.h new file mode 100644 index 000000000..7c3654d4b --- /dev/null +++ b/include/RE/E/ExtraCellSkyRegion.h @@ -0,0 +1,20 @@ +#pragma once + +#include "RE/B/BSExtraData.h" + +namespace RE +{ + class TESRegion; + + class __declspec(novtable) ExtraCellSkyRegion : + public BSExtraData // 00 + { + static constexpr auto RTTI{ RTTI::ExtraCellSkyRegion }; + static constexpr auto VTABLE{ VTABLE::ExtraCellSkyRegion }; + static constexpr auto TYPE{ EXTRA_DATA_TYPE::kSkyRegion }; + + // members + TESRegion* skyRegion; // 18 + }; + static_assert(sizeof(ExtraCellSkyRegion) == 0x20); +} diff --git a/include/RE/E/ExtraLinkedRefChildren.h b/include/RE/E/ExtraLinkedRefChildren.h new file mode 100644 index 000000000..a248cfc04 --- /dev/null +++ b/include/RE/E/ExtraLinkedRefChildren.h @@ -0,0 +1,31 @@ +#pragma once + +#include "RE/B/BSExtraData.h" +#include "RE/B/BSPointerHandle.h" +#include "RE/B/BSTArray.h" + +namespace RE +{ + class BGSKeyword; + class TESObjectREFR; + + class __declspec(novtable) ExtraLinkedRefChildren : + public BSExtraData // 00 + { + public: + static constexpr auto RTTI{ RTTI::ExtraLinkedRefChildren }; + static constexpr auto VTABLE{ VTABLE::ExtraLinkedRefChildren }; + static constexpr auto TYPE{ EXTRA_DATA_TYPE::kLinkedRefChildren }; + + class LinkedRefChild + { + public: + BGSKeyword* keyword; // 00 + ObjectRefHandle REFR; // 08 + }; + + // members + BSTSmallArray linkedChildren; // 018 + }; + static_assert(sizeof(ExtraLinkedRefChildren) == 0x38); +} From 2c840a402d2af4c254ade8b624d18bdd576e3daa Mon Sep 17 00:00:00 2001 From: FlenarnDev Date: Fri, 31 Jul 2026 22:10:31 +0000 Subject: [PATCH 06/28] maintenance --- include/RE/E/ExtraCellSkyRegion.h | 4 ++-- include/RE/E/ExtraLinkedRefChildren.h | 4 ++-- include/RE/Fallout.h | 2 ++ 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/include/RE/E/ExtraCellSkyRegion.h b/include/RE/E/ExtraCellSkyRegion.h index 7c3654d4b..fb1ddda6e 100644 --- a/include/RE/E/ExtraCellSkyRegion.h +++ b/include/RE/E/ExtraCellSkyRegion.h @@ -7,14 +7,14 @@ namespace RE class TESRegion; class __declspec(novtable) ExtraCellSkyRegion : - public BSExtraData // 00 + public BSExtraData // 00 { static constexpr auto RTTI{ RTTI::ExtraCellSkyRegion }; static constexpr auto VTABLE{ VTABLE::ExtraCellSkyRegion }; static constexpr auto TYPE{ EXTRA_DATA_TYPE::kSkyRegion }; // members - TESRegion* skyRegion; // 18 + TESRegion* skyRegion; // 18 }; static_assert(sizeof(ExtraCellSkyRegion) == 0x20); } diff --git a/include/RE/E/ExtraLinkedRefChildren.h b/include/RE/E/ExtraLinkedRefChildren.h index a248cfc04..1e1e30f23 100644 --- a/include/RE/E/ExtraLinkedRefChildren.h +++ b/include/RE/E/ExtraLinkedRefChildren.h @@ -10,7 +10,7 @@ namespace RE class TESObjectREFR; class __declspec(novtable) ExtraLinkedRefChildren : - public BSExtraData // 00 + public BSExtraData // 00 { public: static constexpr auto RTTI{ RTTI::ExtraLinkedRefChildren }; @@ -25,7 +25,7 @@ namespace RE }; // members - BSTSmallArray linkedChildren; // 018 + BSTSmallArray linkedChildren; // 018 }; static_assert(sizeof(ExtraLinkedRefChildren) == 0x38); } diff --git a/include/RE/Fallout.h b/include/RE/Fallout.h index 14cfd788a..e4c0c5ff8 100644 --- a/include/RE/Fallout.h +++ b/include/RE/Fallout.h @@ -657,6 +657,7 @@ #include "RE/E/ExtraAliasInstanceArray.h" #include "RE/E/ExtraAmmo.h" #include "RE/E/ExtraBendableSplineParams.h" +#include "RE/E/ExtraCellSkyRegion.h" #include "RE/E/ExtraCellWaterType.h" #include "RE/E/ExtraCharge.h" #include "RE/E/ExtraDataList.h" @@ -668,6 +669,7 @@ #include "RE/E/ExtraLeveledCreature.h" #include "RE/E/ExtraLight.h" #include "RE/E/ExtraLinkedRef.h" +#include "RE/E/ExtraLinkedRefChildren.h" #include "RE/E/ExtraLocation.h" #include "RE/E/ExtraLock.h" #include "RE/E/ExtraMapMarker.h" From dcdaba7b7124121f30969e69f3d8dace78faf0c6 Mon Sep 17 00:00:00 2001 From: Flenarn Date: Sat, 1 Aug 2026 20:00:03 +0200 Subject: [PATCH 07/28] fix: Cleanup. --- include/RE/E/EXTRA_DATA_TYPE.h | 6 +++--- include/RE/T/TESWorldSpace.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/RE/E/EXTRA_DATA_TYPE.h b/include/RE/E/EXTRA_DATA_TYPE.h index db6b2417e..3225a8188 100644 --- a/include/RE/E/EXTRA_DATA_TYPE.h +++ b/include/RE/E/EXTRA_DATA_TYPE.h @@ -12,7 +12,7 @@ namespace RE kSeenData, // kEditorID, // ExtraEditorID kCellMusicType, // - kSkyRegion, // + kSkyRegion, // ExtraCellSkyRegion kCellMidLowProcess, // kCellDetachTime, // kPersistentCell, // @@ -48,7 +48,7 @@ namespace RE kLight, // ExtraLight kLock, // ExtraLock kTeleport, // ExtraTeleport - kMapMarker, // + kMapMarker, // ExtraMapMarker kLeveledCreature, // ExtraLeveledCreature kLevelItem, // kScale, // @@ -85,7 +85,7 @@ namespace RE kSound, // kTerminalState, // kLinkedRef, // ExtraLinkedRef - kLinkedRefChildren, // + kLinkedRefChildren, // ExtraLinkedRefChildren kActivateRef, // kActivateRefChildren, // kTalkToPlayer, // diff --git a/include/RE/T/TESWorldSpace.h b/include/RE/T/TESWorldSpace.h index 520eeacd2..b899cce5f 100644 --- a/include/RE/T/TESWorldSpace.h +++ b/include/RE/T/TESWorldSpace.h @@ -91,7 +91,7 @@ namespace RE } } - [[nodiscard]] void AdjustMapMarkerCoord(NiPoint3* a_mapCoord, bool a_inverse) + void AdjustMapMarkerCoord(NiPoint3* a_mapCoord, bool a_inverse) { using func_t = decltype(&TESWorldSpace::AdjustMapMarkerCoord); static REL::Relocation func{ ID::TESWorldSpace::AdjustMapMarkerCoord }; From f7ce347bec7b802f16d356eb9ff400309aa49378 Mon Sep 17 00:00:00 2001 From: Flenarn Date: Sun, 2 Aug 2026 09:05:18 +0200 Subject: [PATCH 08/28] feat: HandlePositionPlayerRequest --- include/RE/IDs.h | 1 + include/RE/P/PlayerCharacter.h | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/include/RE/IDs.h b/include/RE/IDs.h index bc122780e..eecd2b5fd 100644 --- a/include/RE/IDs.h +++ b/include/RE/IDs.h @@ -1813,6 +1813,7 @@ namespace RE::ID inline constexpr REL::ID TryUnlockObject{ 2233040 }; inline constexpr REL::ID EnableRadio{ 2233211 }; inline constexpr REL::ID UpdateAnimation{ 2233005 }; + inline constexpr REL::ID HandlePositionPlayerRequest{ 2232905 }; } namespace PlayerControls diff --git a/include/RE/P/PlayerCharacter.h b/include/RE/P/PlayerCharacter.h index c97ec7bfc..b04ee798e 100644 --- a/include/RE/P/PlayerCharacter.h +++ b/include/RE/P/PlayerCharacter.h @@ -327,6 +327,13 @@ namespace RE return func(this, a_delta); } + char HandlePositionPlayerRequest() + { + using func_t = decltype(&PlayerCharacter::HandlePositionPlayerRequest); + static REL::Relocation func{ ID::PlayerCharacter::HandlePositionPlayerRequest }; + return func(this); + } + // members BSSpinLock actorToDisplayOnHUDLock; // 628 BSSpinLock questTargetLock; // 630 From e9bc99d93949b02fbe43a9ca9b079e2dbe4e37b5 Mon Sep 17 00:00:00 2001 From: Flenarn Date: Sun, 2 Aug 2026 09:59:51 +0200 Subject: [PATCH 09/28] chore: Update CommonLib-Shared --- lib/commonlib-shared | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/commonlib-shared b/lib/commonlib-shared index 710b88dc6..af93af74e 160000 --- a/lib/commonlib-shared +++ b/lib/commonlib-shared @@ -1 +1 @@ -Subproject commit 710b88dc65308680ca0803b7775aac6e477b4b0f +Subproject commit af93af74e9a572aa2af9b10ea9fdd73bf80b3c9c From cdbef9819144465b527f80f3e7010be8a580e172 Mon Sep 17 00:00:00 2001 From: Flenarn Date: Sun, 2 Aug 2026 10:02:31 +0200 Subject: [PATCH 10/28] chore: Update CommonLib-Shared. --- lib/commonlib-shared | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/commonlib-shared b/lib/commonlib-shared index af93af74e..710b88dc6 160000 --- a/lib/commonlib-shared +++ b/lib/commonlib-shared @@ -1 +1 @@ -Subproject commit af93af74e9a572aa2af9b10ea9fdd73bf80b3c9c +Subproject commit 710b88dc65308680ca0803b7775aac6e477b4b0f From 9c8938457e434d6a30be3f33d984c651ddaff2e1 Mon Sep 17 00:00:00 2001 From: Flenarn Date: Sun, 2 Aug 2026 13:51:20 +0200 Subject: [PATCH 11/28] chore: Misc. RE work. --- include/RE/B/BGSTerrainManager.h | 79 ++++++++++++++++++++++++++++++++ include/RE/Fallout.h | 1 + include/RE/IDs.h | 21 +++++++++ include/RE/M/Main.h | 16 ++++++- include/RE/N/NiCullingProcess.h | 9 ++++ include/RE/N/NiFrustum.h | 12 ++--- include/RE/T/TES.h | 8 ++++ 7 files changed, 138 insertions(+), 8 deletions(-) create mode 100644 include/RE/B/BGSTerrainManager.h diff --git a/include/RE/B/BGSTerrainManager.h b/include/RE/B/BGSTerrainManager.h new file mode 100644 index 000000000..3122563b5 --- /dev/null +++ b/include/RE/B/BGSTerrainManager.h @@ -0,0 +1,79 @@ +#pragma once + +#include "RE/B/BSSpinLock.h" +#include "RE/B/BSTArray.h" +#include "RE/N/NiPoint2.h" +#include "RE/N/NiPoint3.h" + +namespace RE +{ + class BGSTerrainNode; + class NiCamera; + class TESWorldSpace; + + class BGSTerrainManager + { + public: + class CullState + { + public: + bool cullRoot; // 00 + bool cullLand; // 01 + bool cullTrees; // 02 + bool cullObjects; // 03 + bool cullInstanced; // 04 + }; + + class QuickCullDAta + { + public: + NiPoint2 frustNearLeft; // 000 + NiPoint2 frustFarLeft; // 008 + NiPoint2 frustNearRight; // 010 + NiPoint2 frustFarRight; // 018 + }; + + void RecomputeQuickCullData(const NiCamera* a_camera) + { + using func_t = decltype(&BGSTerrainManager::RecomputeQuickCullData); + static REL::Relocation func{ ID::BGSTerrainManager::RecomputeQuickCullData }; + return func(this, a_camera); + } + + // members + bool mapMode; // 000 + TESWorldSpace* world; // 008 + BGSTerrainNode* rootNode; // 010 + std::int16_t minCellX; // 018 + std::int16_t minCellY; // 01A + std::uint32_t maxLevel; // 01C + std::uint32_t minLevel; // 020 + std::uint32_t rootLevel; // 024 + std::uint32_t segmentedBlockLevel; // 028 + std::uint32_t treeLevel; // 02C + CullState savedCullState; // 030 + CullState activeCullState; // 035 + bool cullActive; // 03A + bool needsImmediateUpdate; // 03B + bool initialUpdateDone; // 03C + bool hasLOD; // 03D + QuickCullDAta cullData; // 040 + bool staticDataLoaded; // 060 + BSTArray updateUpdates; // 068 + std::uint32_t nextUpdateNode; // 080 + BSTArray immediateUpdates; // 088 + BSSpinLock immediateUpdateLock; // 0A0 + bool lockedLOD; // 0A8 + std::uint32_t lockedTerrainLOD; // 0AC + std::uint32_t lockedObjectLOD; // 0B0 + std::uint32_t totalChildNodes; // 0B4 + std::uint8_t* childNodeBufferStart; // 0B8 + std::uint8_t* childNodeBufferCurr; // 0C0 + std::uint8_t* childNodeBufferEnd; // 0C8 + std::uint32_t nodeCount; // 0D0 + std::uint32_t loadedRectUpdateDelay; // 0D4 + NiPoint3 interiorAdjustedOffset; // 0D8 + BSTArray fadeNodeA; // 0E8 + }; + static_assert(sizeof(BGSTerrainManager) == 0x100); +} diff --git a/include/RE/Fallout.h b/include/RE/Fallout.h index 38e8374a2..03c13219b 100644 --- a/include/RE/Fallout.h +++ b/include/RE/Fallout.h @@ -490,6 +490,7 @@ #include "RE/B/BSTempEffectUtil.h" #include "RE/B/BSTempEffectWeaponBlood.h" #include "RE/B/BSTerrainEffect.h" +#include "RE/B/BGSTerrainManager.h" #include "RE/B/BSTextureDB.h" #include "RE/B/BSTextureSet.h" #include "RE/B/BSTextureStreamer.h" diff --git a/include/RE/IDs.h b/include/RE/IDs.h index ae08f78c6..0e2a4be6a 100644 --- a/include/RE/IDs.h +++ b/include/RE/IDs.h @@ -432,6 +432,11 @@ namespace RE::ID inline constexpr REL::ID Activate{ 2197778 }; } + namespace BGSTerrainManager + { + inline constexpr REL::ID RecomputeQuickCullData{ 2213622 }; + } + namespace bhkCharacterController { inline constexpr REL::ID Jump{ 2278191 }; @@ -517,6 +522,13 @@ namespace RE::ID inline constexpr REL::ID Singleton{ 2255115 }; } + namespace BSCullingProcess + { + inline constexpr REL::ID Process1{ 2275931 }; + inline constexpr REL::ID Process2{ 2275932 }; + } + + namespace BSGFxDisplayObject { inline constexpr REL::ID RemoveChild{ 2287327 }; @@ -1460,6 +1472,9 @@ namespace RE::ID inline constexpr REL::ID QGameSystemsShouldUpdate{ 2698031 }; inline constexpr REL::ID QGameDataLoaded{ 2698032 }; inline constexpr REL::ID SetCameraFOV{ 2228973 }; + inline constexpr REL::ID LandLODRoot{ 2698035 }; + inline constexpr REL::ID ObjectLODRoot{ 2698036 }; + inline constexpr REL::ID WorldRootNode{ 2698065 }; } namespace MapMarkerData @@ -1557,6 +1572,11 @@ namespace RE::ID inline constexpr REL::ID Activate{ 2271861 }; } + namespace NiCullingProcess + { + inline constexpr REL::ID SetFrustum{ 2270782 }; + } + namespace NiMatrix3 { inline constexpr REL::ID ToEulerAnglesXYZ{ 2269806 }; @@ -2015,6 +2035,7 @@ namespace RE::ID namespace TES { inline constexpr REL::ID Singleton{ 2698044 }; + inline constexpr REL::ID UpdateMultiBoundVisibility{ 2192134 }; } namespace TESActivateEvent diff --git a/include/RE/M/Main.h b/include/RE/M/Main.h index 82eaa50a4..b77bb971f 100644 --- a/include/RE/M/Main.h +++ b/include/RE/M/Main.h @@ -38,9 +38,9 @@ namespace RE return func(); } - [[nodiscard]] static SceneGraph* WorldRootNode() + [[nodiscard]] static SceneGraph* GetWorldRootNode() { - static REL::Relocation*> nodePtr{ ID::Main::WorldRootCamera }; + static REL::Relocation*> nodePtr{ ID::Main::WorldRootNode }; return nodePtr->get(); } @@ -63,6 +63,18 @@ namespace RE return func(this, a_fov); } + inline static NiNode* GetLandLODRoot() + { + static REL::Relocation value{ ID::Main::LandLODRoot }; + return value.get(); + } + + inline static NiNode* GetObjectLODRoot() + { + static REL::Relocation value{ ID::Main::ObjectLODRoot }; + return value.get(); + } + // members BSTArray> sortedVisibleHighActors; // 08 std::uint32_t localMapRenderDelay; // 20 diff --git a/include/RE/N/NiCullingProcess.h b/include/RE/N/NiCullingProcess.h index a73a457f6..1c553f044 100644 --- a/include/RE/N/NiCullingProcess.h +++ b/include/RE/N/NiCullingProcess.h @@ -4,6 +4,8 @@ namespace RE { + class NiFrustum; + class __declspec(novtable) NiCullingProcess { public: @@ -41,6 +43,13 @@ namespace RE virtual void Process(const NiCamera* a_camera, NiAVObject* a_scene, NiVisibleArray* a_visibleSet); // 1A virtual void AppendVirtual(BSGeometry* a_visible); // 1B + void SetFrustum(const NiFrustum* a_frustum) + { + using func_t = decltype(&NiCullingProcess::SetFrustum); + static REL::Relocation func{ ID::NiCullingProcess::SetFrustum }; + return func(this, a_frustum); + } + // members bool useVirtualAppend; // 08 NiVisibleArray* visibleSet; // 10 diff --git a/include/RE/N/NiFrustum.h b/include/RE/N/NiFrustum.h index 59bce8579..ffe4520ba 100644 --- a/include/RE/N/NiFrustum.h +++ b/include/RE/N/NiFrustum.h @@ -5,12 +5,12 @@ namespace RE class NiFrustum { public: - float left; // 00 - float right; // 04 - float top; // 08 - float bottom; // 0C - float near; // 10 - float far; // 14 + float fLeft; // 00 + float fRight; // 04 + float fTop; // 08 + float fBottom; // 0C + float fNear; // 10 + float fFar; // 14 bool ortho; // 18 }; static_assert(sizeof(NiFrustum) == 0x1C); diff --git a/include/RE/T/TES.h b/include/RE/T/TES.h index 9993fa99d..710e370d3 100644 --- a/include/RE/T/TES.h +++ b/include/RE/T/TES.h @@ -9,6 +9,7 @@ namespace RE { + class BSCullingProcess; class GridCellArray; class GridDistantArray; class ImageSpaceModifierInstance; @@ -107,6 +108,13 @@ namespace RE void ForEachReferenceInRange(const NiPoint3& a_origin, const float a_radius, std::function a_callback); void ForEachReferenceInRange(const TESObjectREFR* a_ref, const float a_radius, std::function a_callback); + void UpdateMultiBoundVisibility(BSCullingProcess* a_cullingProcess) + { + using func_t = decltype(&TES::UpdateMultiBoundVisibility); + static REL::Relocation func{ ID::TES::UpdateMultiBoundVisibility }; + return func(this, a_cullingProcess); + } + // members GridDistantArray* gridDistant; // 010 GridCellArray* gridCells; // 018 From d231b7359c65d7b588b54ba6c8d3a4eb2ff0da7d Mon Sep 17 00:00:00 2001 From: Flenarn Date: Sun, 2 Aug 2026 13:52:34 +0200 Subject: [PATCH 12/28] fix: Remove duplicate ID entry. --- include/RE/IDs.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/RE/IDs.h b/include/RE/IDs.h index 0e2a4be6a..5c6b8918b 100644 --- a/include/RE/IDs.h +++ b/include/RE/IDs.h @@ -1474,7 +1474,6 @@ namespace RE::ID inline constexpr REL::ID SetCameraFOV{ 2228973 }; inline constexpr REL::ID LandLODRoot{ 2698035 }; inline constexpr REL::ID ObjectLODRoot{ 2698036 }; - inline constexpr REL::ID WorldRootNode{ 2698065 }; } namespace MapMarkerData From adef562c84e44525fea8cfb66e42ff49cdcd8d16 Mon Sep 17 00:00:00 2001 From: FlenarnDev Date: Sun, 2 Aug 2026 14:08:30 +0000 Subject: [PATCH 13/28] maintenance --- include/RE/Fallout.h | 2 +- include/RE/IDs.h | 1 - include/RE/N/NiFrustum.h | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/include/RE/Fallout.h b/include/RE/Fallout.h index 03c13219b..7681dd3e5 100644 --- a/include/RE/Fallout.h +++ b/include/RE/Fallout.h @@ -230,6 +230,7 @@ #include "RE/B/BGSSynchronizedAnimationManager.h" #include "RE/B/BGSTalkingActivator.h" #include "RE/B/BGSTerminal.h" +#include "RE/B/BGSTerrainManager.h" #include "RE/B/BGSTextureModel.h" #include "RE/B/BGSTextureSet.h" #include "RE/B/BGSTopicSubtypeUnion.h" @@ -490,7 +491,6 @@ #include "RE/B/BSTempEffectUtil.h" #include "RE/B/BSTempEffectWeaponBlood.h" #include "RE/B/BSTerrainEffect.h" -#include "RE/B/BGSTerrainManager.h" #include "RE/B/BSTextureDB.h" #include "RE/B/BSTextureSet.h" #include "RE/B/BSTextureStreamer.h" diff --git a/include/RE/IDs.h b/include/RE/IDs.h index 5c6b8918b..5a5fd067e 100644 --- a/include/RE/IDs.h +++ b/include/RE/IDs.h @@ -528,7 +528,6 @@ namespace RE::ID inline constexpr REL::ID Process2{ 2275932 }; } - namespace BSGFxDisplayObject { inline constexpr REL::ID RemoveChild{ 2287327 }; diff --git a/include/RE/N/NiFrustum.h b/include/RE/N/NiFrustum.h index ffe4520ba..20f2a4f1f 100644 --- a/include/RE/N/NiFrustum.h +++ b/include/RE/N/NiFrustum.h @@ -11,7 +11,7 @@ namespace RE float fBottom; // 0C float fNear; // 10 float fFar; // 14 - bool ortho; // 18 + bool ortho; // 18 }; static_assert(sizeof(NiFrustum) == 0x1C); } From a6526c056eeb21430c4b518ce02ba8890a247394 Mon Sep 17 00:00:00 2001 From: Flenarn Date: Sun, 2 Aug 2026 17:49:33 +0200 Subject: [PATCH 14/28] fix: SetLinkedRef declaration. --- include/RE/T/TESObjectREFR.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/RE/T/TESObjectREFR.h b/include/RE/T/TESObjectREFR.h index 2baab0030..fefea4c64 100644 --- a/include/RE/T/TESObjectREFR.h +++ b/include/RE/T/TESObjectREFR.h @@ -494,11 +494,11 @@ namespace RE return func(this, a_point); } - void SetLinkedRef(Actor* a_actor, BGSKeyword* a_keyword) + void SetLinkedRef(TESObjectREFR* a_ref, BGSKeyword* a_keyword) { using func_t = decltype(&TESObjectREFR::SetLinkedRef); static REL::Relocation func{ ID::TESObjectREFR::SetLinkedRef }; - return func(this, a_actor, a_keyword); + return func(this, a_ref, a_keyword); } void SetLocationOnReference(const NiPoint3& a_point) From 8a45bab400efa87a814f5669305f35e56f064f66 Mon Sep 17 00:00:00 2001 From: Flenarn Date: Wed, 5 Aug 2026 14:17:39 +0200 Subject: [PATCH 15/28] fix: Corrections from review. --- include/RE/M/MapMarker.h | 1 + include/RE/N/NiFrustum.h | 14 +++++++------- include/RE/P/PlayerCharacter.h | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/include/RE/M/MapMarker.h b/include/RE/M/MapMarker.h index cd39f657e..996a5822b 100644 --- a/include/RE/M/MapMarker.h +++ b/include/RE/M/MapMarker.h @@ -1,4 +1,5 @@ #pragma once + namespace RE { namespace MapMarker diff --git a/include/RE/N/NiFrustum.h b/include/RE/N/NiFrustum.h index 20f2a4f1f..59bce8579 100644 --- a/include/RE/N/NiFrustum.h +++ b/include/RE/N/NiFrustum.h @@ -5,13 +5,13 @@ namespace RE class NiFrustum { public: - float fLeft; // 00 - float fRight; // 04 - float fTop; // 08 - float fBottom; // 0C - float fNear; // 10 - float fFar; // 14 - bool ortho; // 18 + float left; // 00 + float right; // 04 + float top; // 08 + float bottom; // 0C + float near; // 10 + float far; // 14 + bool ortho; // 18 }; static_assert(sizeof(NiFrustum) == 0x1C); } diff --git a/include/RE/P/PlayerCharacter.h b/include/RE/P/PlayerCharacter.h index b04ee798e..38b847633 100644 --- a/include/RE/P/PlayerCharacter.h +++ b/include/RE/P/PlayerCharacter.h @@ -327,7 +327,7 @@ namespace RE return func(this, a_delta); } - char HandlePositionPlayerRequest() + bool HandlePositionPlayerRequest() { using func_t = decltype(&PlayerCharacter::HandlePositionPlayerRequest); static REL::Relocation func{ ID::PlayerCharacter::HandlePositionPlayerRequest }; From bbd4c67fb0c7bec28e27212472ef4f9ffb2246db Mon Sep 17 00:00:00 2001 From: Flenarn Date: Fri, 7 Aug 2026 09:26:49 +0200 Subject: [PATCH 16/28] fix: SceneGraph members now public. chore: NiCamera ctor ID. --- include/RE/IDs.h | 1 + include/RE/S/SceneGraph.h | 1 + 2 files changed, 2 insertions(+) diff --git a/include/RE/IDs.h b/include/RE/IDs.h index 5a5fd067e..72eddd7c7 100644 --- a/include/RE/IDs.h +++ b/include/RE/IDs.h @@ -1557,6 +1557,7 @@ namespace RE::ID inline constexpr REL::ID BoundInFrustum{ 2194525 }; inline constexpr REL::ID WorldPtToScreenPt3{ 2270344 }; inline constexpr REL::ID ViewPointToRay{ 2270338 }; + inline constexpr REL::ID ctor{ 2270332 }; } namespace NiControllerManager diff --git a/include/RE/S/SceneGraph.h b/include/RE/S/SceneGraph.h index 046f6d71d..93b2abb4f 100644 --- a/include/RE/S/SceneGraph.h +++ b/include/RE/S/SceneGraph.h @@ -5,6 +5,7 @@ namespace RE class __declspec(novtable) SceneGraph : public BSSceneGraph // 000 { + public: static constexpr auto RTTI{ RTTI::SceneGraph }; static constexpr auto VTABLE{ VTABLE::SceneGraph }; static constexpr auto Ni_RTTI{ Ni_RTTI::SceneGraph }; From 5216ec64952c830dfe5e735aba67d502051eebc9 Mon Sep 17 00:00:00 2001 From: Flenarn Date: Sat, 22 Aug 2026 12:11:53 +0200 Subject: [PATCH 17/28] feat: Runtime support for 1.11.240. --- include/F4SE/Version.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/F4SE/Version.h b/include/F4SE/Version.h index 67c0b446e..0dcb6e286 100644 --- a/include/F4SE/Version.h +++ b/include/F4SE/Version.h @@ -59,6 +59,7 @@ namespace F4SE inline constexpr REL::Version RUNTIME_1_11_169{ 1, 11, 169, 0 }; inline constexpr REL::Version RUNTIME_1_11_191{ 1, 11, 191, 0 }; inline constexpr REL::Version RUNTIME_1_11_221{ 1, 11, 221, 0 }; + inline constexpr REL::Version RUNTIME_1_11_240{ 1, 11, 240, 0 }; - inline constexpr auto RUNTIME_LATEST = RUNTIME_1_11_221; + inline constexpr auto RUNTIME_LATEST = RUNTIME_1_11_240; } From ab53ab2770395cd464c0e06c57e090df6795ed91 Mon Sep 17 00:00:00 2001 From: Flenarn Date: Sat, 22 Aug 2026 14:06:35 +0200 Subject: [PATCH 18/28] fix: Missing EMPLACE_VTABLEs --- include/RE/P/PipboyPrimitiveValue.h | 8 ++++++-- include/RE/P/PipboyValue.h | 4 ++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/include/RE/P/PipboyPrimitiveValue.h b/include/RE/P/PipboyPrimitiveValue.h index a51cf15d4..6d75e1a04 100644 --- a/include/RE/P/PipboyPrimitiveValue.h +++ b/include/RE/P/PipboyPrimitiveValue.h @@ -17,7 +17,9 @@ namespace RE PipboyPrimitiveValue(std::uint32_t a_value, PipboyValue* a_parent) : PipboyValue(a_parent), m_value(a_value) - {} + { + REX::EMPLACE_VTABLE(this); + } // override virtual void CleanDirtyToGame() override {} // 00 @@ -52,7 +54,9 @@ namespace RE PipboyPrimitiveValue(bool a_value, PipboyValue* a_parent) : PipboyValue(a_parent), m_value(a_value) - {} + { + REX::EMPLACE_VTABLE(this); + } // override virtual void CleanDirtyToGame() override {} // 00 diff --git a/include/RE/P/PipboyValue.h b/include/RE/P/PipboyValue.h index b8faaf238..cee2b92ec 100644 --- a/include/RE/P/PipboyValue.h +++ b/include/RE/P/PipboyValue.h @@ -1,5 +1,7 @@ #pragma once +#include "RE/M/MemoryManager.h" + namespace Json { class Value; @@ -48,6 +50,8 @@ namespace RE func(this, a_parent); } + F4_HEAP_REDEFINE_NEW(PipboyValue) + // members std::uint32_t m_id; // 0x08 bool m_isDirtyGame; // 0x0C From 4af132416646a11b3bb8e3c936e3441e42a6c26d Mon Sep 17 00:00:00 2001 From: Flenarn Date: Sat, 29 Aug 2026 19:59:52 +0200 Subject: [PATCH 19/28] feat: Misc RE, started going down from `QuestTargetArray`. --- include/RE/B/BGSCharacterTint.h | 5 +- include/RE/B/BSActorPathingMessage.h | 19 +++++++ include/RE/B/BSActorPathingMessageQueue.h | 19 +++++++ include/RE/B/BSPathingActorAttributes.h | 49 +++++++++++++++++ include/RE/B/BSPathingAvoidNodeArray.h | 14 +++++ include/RE/B/BSPathingCell.h | 35 +++++++++++++ include/RE/B/BSPathingLocation.h | 1 + include/RE/B/BSPathingLockData.h | 28 ++++++++++ include/RE/B/BSPathingNode.h | 18 +++++++ include/RE/B/BSPathingRequest.h | 52 +++++++++++++++++++ include/RE/B/BSPathingRestrictions.h | 16 ++++++ .../RE/B/BSPathingSearchAreaRestrictions.h | 14 +++++ include/RE/B/BSPathingSearchParameters.h | 29 +++++++++++ include/RE/B/BSPathingSolution.h | 23 ++++++++ include/RE/B/BSTArrayRefCounted.h | 15 ++++++ include/RE/B/BSVirtualPathingNode.h | 18 +++++++ include/RE/M/MeanderSettingsData.h | 23 ++++++++ .../RE/M/MovementActorAvoidanceParameters.h | 15 ++++++ include/RE/M/MovementMessage.h | 28 ++++++++++ include/RE/P/PATHING_MESSAGE_TYPE.h | 11 ++++ include/RE/Q/QuestTargetArray.h | 17 ++++++ include/RE/T/TESQuestTarget.h | 33 ++++++++++++ 22 files changed, 480 insertions(+), 2 deletions(-) create mode 100644 include/RE/B/BSActorPathingMessage.h create mode 100644 include/RE/B/BSActorPathingMessageQueue.h create mode 100644 include/RE/B/BSPathingActorAttributes.h create mode 100644 include/RE/B/BSPathingAvoidNodeArray.h create mode 100644 include/RE/B/BSPathingCell.h create mode 100644 include/RE/B/BSPathingLockData.h create mode 100644 include/RE/B/BSPathingNode.h create mode 100644 include/RE/B/BSPathingRequest.h create mode 100644 include/RE/B/BSPathingRestrictions.h create mode 100644 include/RE/B/BSPathingSearchAreaRestrictions.h create mode 100644 include/RE/B/BSPathingSearchParameters.h create mode 100644 include/RE/B/BSPathingSolution.h create mode 100644 include/RE/B/BSTArrayRefCounted.h create mode 100644 include/RE/B/BSVirtualPathingNode.h create mode 100644 include/RE/M/MeanderSettingsData.h create mode 100644 include/RE/M/MovementActorAvoidanceParameters.h create mode 100644 include/RE/M/MovementMessage.h create mode 100644 include/RE/P/PATHING_MESSAGE_TYPE.h create mode 100644 include/RE/Q/QuestTargetArray.h create mode 100644 include/RE/T/TESQuestTarget.h diff --git a/include/RE/B/BGSCharacterTint.h b/include/RE/B/BGSCharacterTint.h index 5b403ce16..9ea8138cf 100644 --- a/include/RE/B/BGSCharacterTint.h +++ b/include/RE/B/BGSCharacterTint.h @@ -150,14 +150,15 @@ namespace RE // Members Entry* templateEntry; // 08 std::uint16_t idLink; // 10 - std::uint8_t tingingValue; // 12 + std::uint8_t tintingValue; // 12 }; static_assert(sizeof(Entry) == 0x18); class Entries { public: - BSTArray entriesA; + // members + BSTArray entriesA; // 00 }; static_assert(sizeof(Entries) == 0x18); diff --git a/include/RE/B/BSActorPathingMessage.h b/include/RE/B/BSActorPathingMessage.h new file mode 100644 index 000000000..14f36f132 --- /dev/null +++ b/include/RE/B/BSActorPathingMessage.h @@ -0,0 +1,19 @@ +#pragma once + +#include "RE/B/BSPathingRequest.h" +#include "RE/B/BSPathingSolution.h" +#include "RE/B/BSTSmartPointer.h" +#include "RE/P/PATHING_MESSAGE_TYPE.h" + +namespace RE +{ + class BSActorPathingMessage + { + public: + // members + PATHING_MESSAGE_TYPE type; // 00 + BSTSmartPointer request; // 08 + BSTSmartPointer solution; // 10 + }; + static_assert(sizeof(BSActorPathingMessage) == 0x18) +} diff --git a/include/RE/B/BSActorPathingMessageQueue.h b/include/RE/B/BSActorPathingMessageQueue.h new file mode 100644 index 000000000..2c1856801 --- /dev/null +++ b/include/RE/B/BSActorPathingMessageQueue.h @@ -0,0 +1,19 @@ +#pragma once + +#include "RE/B/BSActorPathingMessage.h" +#include "RE/B/BSIntrusiveRefCounted.h" +#include "RE/B/BSSpinLock.h" +#include "RE/B/BSTArray.h" + +namespace RE +{ + class BSActorPathingMessageQueue : + public BSIntrusiveRefCounted + { + public: + // members + BSTSmallArray messages; // 008 + BSSpinLock messagesLock; // 030 + }; + static_assert(sizeof(BSActorPathingMessageQueue) == 0x38) +} diff --git a/include/RE/B/BSPathingActorAttributes.h b/include/RE/B/BSPathingActorAttributes.h new file mode 100644 index 000000000..3f7f774c5 --- /dev/null +++ b/include/RE/B/BSPathingActorAttributes.h @@ -0,0 +1,49 @@ +#pragma once + +#include "RE/B/BSPathingLockData.h" +#include "RE/B/BSTSmartPointer.h" + +namespace RE +{ + class BSPathingActorAttributes + { + public: + enum ACTOR_SHAPE_TYPE : std::uint32_t + { + kPoint = 0x0, + kBiped = 0x1, + kQuadruped = 0x2 + }; + + enum LOCK_HANDLING_TYPE : std::uint32_t + { + kIgnore = 0x4, + kCantOpen = 0x8, + kUseLockData = 0xC + }; + + enum ATTRIBUTE : std::uint32_t + { + kWaitIfPlayerWaits = 0x80 + }; + + enum TRAVERSAL_TYPE : std::uint32_t + { + kCanWalk = 0x1, + kCanSwim = 0x2, + kCanFly = 0x4, + kCanFloat = 0x8, + kIsLarge = 0x10, + kCanJump = 0x20 + }; + + // members + float radius; // 00 + float height; // 04 + float floatHeight; // 08 + BSTSmartPointer lockData; // 10 + std::uint32_t data; // 18 + std::uint8_t traversalFlags; // 1C + }; + static_assert(sizeof(BSPathingActorAttributes) == 0x20); +} diff --git a/include/RE/B/BSPathingAvoidNodeArray.h b/include/RE/B/BSPathingAvoidNodeArray.h new file mode 100644 index 000000000..dd377f522 --- /dev/null +++ b/include/RE/B/BSPathingAvoidNodeArray.h @@ -0,0 +1,14 @@ +#pragma once + +#include "RE/B/BSPathingAvoidNode.h" +#include "RE/B/BSTArrayRefCounted.h" + +namespace RE +{ + class BSPathingAvoidNodeArray : + public BSTArrayRefCounted // 00 + { + public: + }; + static_assert(sizeof(BSPathingAvoidNodeArray) == 0x20); +} diff --git a/include/RE/B/BSPathingCell.h b/include/RE/B/BSPathingCell.h new file mode 100644 index 000000000..1827a6575 --- /dev/null +++ b/include/RE/B/BSPathingCell.h @@ -0,0 +1,35 @@ +#pragma once + +#include "RE/B/BSIntrusiveRefCounted.h" +#include "RE/B/BSTSmartPointer.h" + +namespace RE +{ + class bhkWorld; + class BSPathingNumericIDVisitor; + class BSPathingSpace; + class BSPathingStreamRead; + class BSPathingStreamWrite; + + class __declspec(novtable) BSPathingCell : + public BSIntrusiveRefCounted // 00 + { + public: + static constexpr auto RTTI{ RTTI::BSPathingCell }; + static constexpr auto VTABLE{ VTABLE::BSPathingCell }; + + virtual ~BSPathingCell(); // 00 + virtual std::uint32_t GetType(); // 01 + virtual void Write(BSPathingStreamWrite* a_dst); // 02 + virtual void Read(BSPathingStreamRead* a_src); // 03 + virtual void FixupNumericID(BSPathingNumericIDVisitor* a_visitor); // 04 + virtual bool IsEqual(const BSTSmartPointer* a_other); // 05 + virtual void GetSpace(BSTSmartPointer* a_spaceOut); // 06 + virtual bhkWorld* GetBhkWorld(); // 07 + virtual bool QValid(); // 08 + virtual bool QAttached(); // 09 + virtual bool QLoaded(); // 0A + virtual bool IsInSameSpace(const BSTSmartPointer* a_other); // 0B + }; + static_assert(sizeof(BSPathingCell) == 0x10); +} diff --git a/include/RE/B/BSPathingLocation.h b/include/RE/B/BSPathingLocation.h index 2ac1fbc1d..bd2f542d8 100644 --- a/include/RE/B/BSPathingLocation.h +++ b/include/RE/B/BSPathingLocation.h @@ -7,6 +7,7 @@ namespace RE { class BSNavmeshInfo; + class BSPathingCell; class BSPathingLocation { diff --git a/include/RE/B/BSPathingLockData.h b/include/RE/B/BSPathingLockData.h new file mode 100644 index 000000000..304c32c12 --- /dev/null +++ b/include/RE/B/BSPathingLockData.h @@ -0,0 +1,28 @@ +#pragma once + +#include "RE/B/BSIntrusiveRefCounted.h" +#include "RE/B/BSTSmartPointer.h" + +namespace RE +{ + class BSPathingDoor; + class BSPathingStreamRead; + class BSPathingStreamWrite; + + class __declspec(novtable) BSPathingLockData : + public BSIntrusiveRefCounted + { + public: + static constexpr auto RTTI{ RTTI::BSPathingLockData }; + static constexpr auto VTABLE{ VTABLE::BSPathingLockData }; + + virtual ~BSPathingLockData(); // 00 + virtual std::uint32_t GetType(); // 01 + virtual bool CanTraverse(const BSTSmartPointer* a_door, float* a_arg2, bool* a_arg3); // 02 + virtual bool CanTraverse(const BSTSmartPointer* a_door, float* a_arg2); // 03 + virtual bool CanTraverse(const BSTSmartPointer* a_door); // 04 + virtual void Write(BSPathingStreamWrite* a_dst); // 05 + virtual void Read(BSPathingStreamRead* a_src); // 06 + }; + static_assert(sizeof(BSPathingLockData) == 0x10); +} diff --git a/include/RE/B/BSPathingNode.h b/include/RE/B/BSPathingNode.h new file mode 100644 index 000000000..be8e8be3a --- /dev/null +++ b/include/RE/B/BSPathingNode.h @@ -0,0 +1,18 @@ +#pragma once + +#include "RE/B/BSPathingLocation.h" +#include "RE/B/BSTSmartPointer.h" +#include "RE/M/MovementMessage.h" +#include "RE/N/NiPoint3.h" + +namespace RE +{ + class BSPathingNode + { + public: + BSPathingLocation location; // 000 + BSTSmartPointer actionAtNode; // 030 + NiPoint3 tangent; // 038 + }; + static_assert(sizeof(BSPathingNode) == 0x48); +} diff --git a/include/RE/B/BSPathingRequest.h b/include/RE/B/BSPathingRequest.h new file mode 100644 index 000000000..4960fd4e1 --- /dev/null +++ b/include/RE/B/BSPathingRequest.h @@ -0,0 +1,52 @@ +#pragma once + +#include "RE/B/BSIntrusiveRefCounted.h" +#include "RE/B/BSPathingActorAttributes.h" +#include "RE/B/BSPathingGoal.h" +#include "RE/B/BSPathingRestrictions.h" +#include "RE/B/BSPathingSearchParameters.h" +#include "RE/B/BSPathingStart.h" +#include "RE/B/BSTArray.h" +#include "RE/B/BSTSmartPointer.h" +#include "RE/M/MeanderSettingsData.h" +#include "RE/M/MovementActorAvoidanceParameters.h" + +namespace RE +{ + class BSPathingStreamRead; + class BSPathingStreamWrite; + class IDebugText; + class IMovementParameters; + + class __declspec(novtable) BSPathingRequest : + public BSIntrusiveRefCounted // 0008 + { + public: + static constexpr auto RTTI{ RTTI::BSPathingRequest }; + static constexpr auto VTABLE{ VTABLE::BSPathingRequest }; + + virtual ~BSPathingRequest(); // 00 + virtual std::uint32_t GetType(); // 01 + virtual void CopyTo(BSPathingRequest* a_dst); // 02 + virtual void Write(BSPathingStreamWrite* a_dst); // 03 + virtual void Read(BSPathingStreamRead* a_src); // 04 + virtual void CheckValid(); // 05 + virtual void PrintDebugText(IDebugText* a_debugText); // 06 + virtual bool UpdateRequest(); // 07 + + // members + BSPathingStart start; // 0010 + BSPathingGoal goal; // 0048 + BSPathingRestrictions restrictions; // 0098 + BSPathingSearchParameters searchParameters; // 00B0 + BSPathingActorAttributes actorAttributes; // 00C0 + MovementActorAvoidanceParameters avoidanceParameters; // 00E0 + BSTSmartPointer defaultParameters; // 0100 + MeanderSettingsData meanderSettings; // 0108 + BSTArray optionalStartArray; // 0120 + bool shouldMotionCorrectStartIdle; // 0138 + bool requiresPathStartIdle; // 0139 + bool disablePathEndIdle; // 013A + }; + static_assert(sizeof(BSPathingRequest) == 0x140); +} diff --git a/include/RE/B/BSPathingRestrictions.h b/include/RE/B/BSPathingRestrictions.h new file mode 100644 index 000000000..61fc5d470 --- /dev/null +++ b/include/RE/B/BSPathingRestrictions.h @@ -0,0 +1,16 @@ +#pragma once + +#include "RE/B/BSPathingAvoidNodeArray.h" +#include "RE/B/BSPathingSearchAreaRestrictions.h" +#include "RE/N/NiPointer.h" + +namespace RE +{ + class BSPathingRestrictions + { + public: + NiPointer avoidNodeArray; // 00 + BSPathingSearchAreaRestrictions areaRestrictions; // 08 + }; + static_assert(sizeof(BSPathingRestrictions) == 0x18); +} diff --git a/include/RE/B/BSPathingSearchAreaRestrictions.h b/include/RE/B/BSPathingSearchAreaRestrictions.h new file mode 100644 index 000000000..0a8e67540 --- /dev/null +++ b/include/RE/B/BSPathingSearchAreaRestrictions.h @@ -0,0 +1,14 @@ +#pragma once + +#include "RE/N/NiPoint3.h" + +namespace RE +{ + class BSPathingSearchAreaRestrictions + { + public: + NiPoint3 center; // 00 + float radius; // 0C + }; + static_assert(sizeof(BSPathingSearchAreaRestrictions) == 0x10); +} diff --git a/include/RE/B/BSPathingSearchParameters.h b/include/RE/B/BSPathingSearchParameters.h new file mode 100644 index 000000000..a5531ee11 --- /dev/null +++ b/include/RE/B/BSPathingSearchParameters.h @@ -0,0 +1,29 @@ +#pragma once + +namespace RE +{ + class BSPathingSearchParameters + { + public: + enum Flags : std::uint16_t + { + kAllowIncompletePath = 0x1, + kGoDirectIfPathingFails = 0x2, + kIgnoreSmoothingIfFails = 0x4, + kUsePrefferedPath = 0x8, + kRequiresHavok = 0x10, + kAvoidPreferredPath = 0x20, + kMustQueue = 0x40, + kCanShortcut = 0x80, + kAllowUnattachedCell = 0x100, + kProcessSynchronously = 0x200, + kResolveGoalToClosest = 0x400 + }; + + float preferredCostFactor; // 00 + float tangentSmoothingFactor; // 04 + std::uint16_t retryCount; // 08 + REX::TEnumSet flags; // 0A + }; + static_assert(sizeof(BSPathingSearchParameters) == 0x0C); +} diff --git a/include/RE/B/BSPathingSolution.h b/include/RE/B/BSPathingSolution.h new file mode 100644 index 000000000..fb4401f72 --- /dev/null +++ b/include/RE/B/BSPathingSolution.h @@ -0,0 +1,23 @@ +#pragma once + +#include "RE/B/BSPathingNode.h" +#include "RE/B/BSVirtualPathingNode.h" +#include "RE/B/BSTArray.h" + +namespace RE +{ + class BSPathingSolution : + public BSIntrusiveRefCounted // 00 + { + public: + // members + BSTSmallArray virtualPathingNodes; // 008 + std::int32_t firstLoadedVirtualNodeIndex; // 088 + std::int32_t lastLoadedVirtualNodeIndex; // 08C + BSTArray currentPathingNodes; // 090 + float goalRadius; // 0A8 + bool incompletePath; // 0AC + bool requestGoalUnused; // 0AD + }; + static_assert(sizeof(BSPathingSolution) == 0xB0); +} diff --git a/include/RE/B/BSTArrayRefCounted.h b/include/RE/B/BSTArrayRefCounted.h new file mode 100644 index 000000000..8463abcbc --- /dev/null +++ b/include/RE/B/BSTArrayRefCounted.h @@ -0,0 +1,15 @@ +#pragma once + +#include "RE/B/BSIntrusiveRefCounted.h" +#include "RE/B/BSTArray.h" + +namespace RE +{ + template + class alignas(0x8) BSTArrayRefCounted : + public BSTArray, // 00 + public BSIntrusiveRefCounted // 18 + { + public: + }; +} diff --git a/include/RE/B/BSVirtualPathingNode.h b/include/RE/B/BSVirtualPathingNode.h new file mode 100644 index 000000000..c3cf9cfd2 --- /dev/null +++ b/include/RE/B/BSVirtualPathingNode.h @@ -0,0 +1,18 @@ +#pragma once + +#include "RE/B/BSPathingLocation.h" +#include "RE/B/BSTSmartPointer.h" +#include "RE/M/MovementMessage.h" +#include "RE/N/NiPoint3.h" + +namespace RE +{ + class BSVirtualPathingNode + { + public: + // members + BSPathingLocation location; // 000 + BSTSmartPointer actionAtNode; // 030 + }; + static_assert(sizeof(BSVirtualPathingNode) == 0x38); +} diff --git a/include/RE/M/MeanderSettingsData.h b/include/RE/M/MeanderSettingsData.h new file mode 100644 index 000000000..56c806188 --- /dev/null +++ b/include/RE/M/MeanderSettingsData.h @@ -0,0 +1,23 @@ +#pragma once + +#include "RE/N/NiPoint2.h" + +namespace RE +{ + class MeanderSettingsData + { + public: + enum MeanderType : std::uint32_t + { + kNone = 0x0, + kStartLeft = 0x1, + kStartRight = 0x2 + }; + + // members + MeanderType type; // 00 + NiPoint2 amplituteRange; // 04 + NiPoint2 wavelengthRange; // 0C + }; + static_assert(sizeof(MeanderSettingsData) == 0x14); +} diff --git a/include/RE/M/MovementActorAvoidanceParameters.h b/include/RE/M/MovementActorAvoidanceParameters.h new file mode 100644 index 000000000..a746b7863 --- /dev/null +++ b/include/RE/M/MovementActorAvoidanceParameters.h @@ -0,0 +1,15 @@ +#pragma once + +#include "RE/B/BSTArray.h" + +namespace RE +{ + class MovementActorAvoidanceParameters + { + public: + // members + BSTSmallArray actors; // 000 + std::uint32_t flags; // 018 + }; + static_assert(sizeof(MovementActorAvoidanceParameters) == 0x20); +} diff --git a/include/RE/M/MovementMessage.h b/include/RE/M/MovementMessage.h new file mode 100644 index 000000000..eda67fc60 --- /dev/null +++ b/include/RE/M/MovementMessage.h @@ -0,0 +1,28 @@ +#pragma once + +#include "RE/B/BSIntrusiveRefCounted.h" + +namespace RE +{ + class BSPathingNumericIDVisitor; + class BSPathingStreamRead; + class BSPathingStreamWrite; + class IPathFollowerAction; + + class __declspec(novtable) MovementMessage : + public BSIntrusiveRefCounted // 00 + { + public: + static constexpr auto RTTI{ RTTI::MovementMessage }; + static constexpr auto VTABLE{ VTABLE::MovementMessage }; + + virtual ~MovementMessage(); // 00 + virtual std::uint32_t GetMessageType(); // 01 + virtual std::uint32_t GetType(); // 02 + virtual void Write(BSPathingStreamWrite* a_dst); // 03 + virtual void Read(BSPathingStreamRead* a_src); // 04 + virtual void FixupNumericID(BSPathingNumericIDVisitor* a_visitor); // 05 + virtual IPathFollowerAction* GetPathFollowerActionInterface(); // 06 + }; + static_assert(sizeof(MovementMessage) == 0x10); +} diff --git a/include/RE/P/PATHING_MESSAGE_TYPE.h b/include/RE/P/PATHING_MESSAGE_TYPE.h new file mode 100644 index 000000000..2d59cbd25 --- /dev/null +++ b/include/RE/P/PATHING_MESSAGE_TYPE.h @@ -0,0 +1,11 @@ +#pragma once + +namespace RE +{ + enum PATHING_MESSAGE_TYPE : std::uint32_t + { + kOk = 0x0, + kError = 0x1, + kUndefined = -0x1 + }; +} diff --git a/include/RE/Q/QuestTargetArray.h b/include/RE/Q/QuestTargetArray.h new file mode 100644 index 000000000..a4fd6d37e --- /dev/null +++ b/include/RE/Q/QuestTargetArray.h @@ -0,0 +1,17 @@ +#pragma once + +#include "RE/B/BSTArray.h" + +namespace RE +{ + class TESQuestTarget; + + class QuestTargetArray : + public BSTArray + { + public: + // members + std::uint64_t nextRepath; // 018 + }; + static_assert(sizeof(QuestTargetArray) == 0x20); +} diff --git a/include/RE/T/TESQuestTarget.h b/include/RE/T/TESQuestTarget.h new file mode 100644 index 000000000..f2cc61c22 --- /dev/null +++ b/include/RE/T/TESQuestTarget.h @@ -0,0 +1,33 @@ +#pragma once + +#include "RE/B/BSActorPathingMessageQueue.h" +#include "RE/B/BSPointerHandle.h" +#include "RE/B/BSTArray.h" +#include "RE/B/BSTSmartPointer.h" +#include "RE/T/TeleportPath.h" +#include "RE/T/TESCondition.h" + +namespace RE +{ + class BGSKeyword; + + class TESQuestTarget + { + public: + class REF_DATA + { + TeleportPath TeleportPath; // 00 + ObjectRefHandle reference; // 50 + BSTSmartPointer pathMessageQueue; // 58 + bool forceRebuildQueued; // 60 + }; + + + std::uint8_t flags; // 00 + TESCondition conditions; // 08 + std::uint32_t targetAlias; // 10 + BGSKeyword* keyword; // 18 + BSTArray target; // 20 + }; + static_assert(sizeof(TESQuestTarget) == 0x38); +} From 25c91dd50118c436a3459553f89dd06b645c5c9f Mon Sep 17 00:00:00 2001 From: FlenarnDev Date: Sat, 29 Aug 2026 18:00:32 +0000 Subject: [PATCH 20/28] maintenance --- include/RE/B/BGSCharacterTint.h | 2 +- include/RE/B/BSActorPathingMessage.h | 6 +-- include/RE/B/BSActorPathingMessageQueue.h | 4 +- include/RE/B/BSPathingActorAttributes.h | 12 +++--- include/RE/B/BSPathingCell.h | 24 +++++------ include/RE/B/BSPathingLockData.h | 16 ++++---- include/RE/B/BSPathingNode.h | 6 +-- include/RE/B/BSPathingRequest.h | 40 +++++++++---------- include/RE/B/BSPathingRestrictions.h | 4 +- .../RE/B/BSPathingSearchAreaRestrictions.h | 4 +- include/RE/B/BSPathingSearchParameters.h | 8 ++-- include/RE/B/BSPathingSolution.h | 18 ++++----- include/RE/B/BSTArrayRefCounted.h | 2 +- include/RE/B/BSVirtualPathingNode.h | 4 +- include/RE/Fallout.h | 20 ++++++++++ .../RE/M/MovementActorAvoidanceParameters.h | 4 +- include/RE/M/MovementMessage.h | 14 +++---- include/RE/T/TESQuestTarget.h | 21 +++++----- 18 files changed, 114 insertions(+), 95 deletions(-) diff --git a/include/RE/B/BGSCharacterTint.h b/include/RE/B/BGSCharacterTint.h index 9ea8138cf..88bfe47c0 100644 --- a/include/RE/B/BGSCharacterTint.h +++ b/include/RE/B/BGSCharacterTint.h @@ -158,7 +158,7 @@ namespace RE { public: // members - BSTArray entriesA; // 00 + BSTArray entriesA; // 00 }; static_assert(sizeof(Entries) == 0x18); diff --git a/include/RE/B/BSActorPathingMessage.h b/include/RE/B/BSActorPathingMessage.h index 14f36f132..d76bfbd3e 100644 --- a/include/RE/B/BSActorPathingMessage.h +++ b/include/RE/B/BSActorPathingMessage.h @@ -11,9 +11,9 @@ namespace RE { public: // members - PATHING_MESSAGE_TYPE type; // 00 - BSTSmartPointer request; // 08 - BSTSmartPointer solution; // 10 + PATHING_MESSAGE_TYPE type; // 00 + BSTSmartPointer request; // 08 + BSTSmartPointer solution; // 10 }; static_assert(sizeof(BSActorPathingMessage) == 0x18) } diff --git a/include/RE/B/BSActorPathingMessageQueue.h b/include/RE/B/BSActorPathingMessageQueue.h index 2c1856801..c677614f2 100644 --- a/include/RE/B/BSActorPathingMessageQueue.h +++ b/include/RE/B/BSActorPathingMessageQueue.h @@ -12,8 +12,8 @@ namespace RE { public: // members - BSTSmallArray messages; // 008 - BSSpinLock messagesLock; // 030 + BSTSmallArray messages; // 008 + BSSpinLock messagesLock; // 030 }; static_assert(sizeof(BSActorPathingMessageQueue) == 0x38) } diff --git a/include/RE/B/BSPathingActorAttributes.h b/include/RE/B/BSPathingActorAttributes.h index 3f7f774c5..be7519803 100644 --- a/include/RE/B/BSPathingActorAttributes.h +++ b/include/RE/B/BSPathingActorAttributes.h @@ -38,12 +38,12 @@ namespace RE }; // members - float radius; // 00 - float height; // 04 - float floatHeight; // 08 - BSTSmartPointer lockData; // 10 - std::uint32_t data; // 18 - std::uint8_t traversalFlags; // 1C + float radius; // 00 + float height; // 04 + float floatHeight; // 08 + BSTSmartPointer lockData; // 10 + std::uint32_t data; // 18 + std::uint8_t traversalFlags; // 1C }; static_assert(sizeof(BSPathingActorAttributes) == 0x20); } diff --git a/include/RE/B/BSPathingCell.h b/include/RE/B/BSPathingCell.h index 1827a6575..e67e1959e 100644 --- a/include/RE/B/BSPathingCell.h +++ b/include/RE/B/BSPathingCell.h @@ -18,18 +18,18 @@ namespace RE static constexpr auto RTTI{ RTTI::BSPathingCell }; static constexpr auto VTABLE{ VTABLE::BSPathingCell }; - virtual ~BSPathingCell(); // 00 - virtual std::uint32_t GetType(); // 01 - virtual void Write(BSPathingStreamWrite* a_dst); // 02 - virtual void Read(BSPathingStreamRead* a_src); // 03 - virtual void FixupNumericID(BSPathingNumericIDVisitor* a_visitor); // 04 - virtual bool IsEqual(const BSTSmartPointer* a_other); // 05 - virtual void GetSpace(BSTSmartPointer* a_spaceOut); // 06 - virtual bhkWorld* GetBhkWorld(); // 07 - virtual bool QValid(); // 08 - virtual bool QAttached(); // 09 - virtual bool QLoaded(); // 0A - virtual bool IsInSameSpace(const BSTSmartPointer* a_other); // 0B + virtual ~BSPathingCell(); // 00 + virtual std::uint32_t GetType(); // 01 + virtual void Write(BSPathingStreamWrite* a_dst); // 02 + virtual void Read(BSPathingStreamRead* a_src); // 03 + virtual void FixupNumericID(BSPathingNumericIDVisitor* a_visitor); // 04 + virtual bool IsEqual(const BSTSmartPointer* a_other); // 05 + virtual void GetSpace(BSTSmartPointer* a_spaceOut); // 06 + virtual bhkWorld* GetBhkWorld(); // 07 + virtual bool QValid(); // 08 + virtual bool QAttached(); // 09 + virtual bool QLoaded(); // 0A + virtual bool IsInSameSpace(const BSTSmartPointer* a_other); // 0B }; static_assert(sizeof(BSPathingCell) == 0x10); } diff --git a/include/RE/B/BSPathingLockData.h b/include/RE/B/BSPathingLockData.h index 304c32c12..493a606c6 100644 --- a/include/RE/B/BSPathingLockData.h +++ b/include/RE/B/BSPathingLockData.h @@ -10,19 +10,19 @@ namespace RE class BSPathingStreamWrite; class __declspec(novtable) BSPathingLockData : - public BSIntrusiveRefCounted + public BSIntrusiveRefCounted { public: static constexpr auto RTTI{ RTTI::BSPathingLockData }; static constexpr auto VTABLE{ VTABLE::BSPathingLockData }; - virtual ~BSPathingLockData(); // 00 - virtual std::uint32_t GetType(); // 01 - virtual bool CanTraverse(const BSTSmartPointer* a_door, float* a_arg2, bool* a_arg3); // 02 - virtual bool CanTraverse(const BSTSmartPointer* a_door, float* a_arg2); // 03 - virtual bool CanTraverse(const BSTSmartPointer* a_door); // 04 - virtual void Write(BSPathingStreamWrite* a_dst); // 05 - virtual void Read(BSPathingStreamRead* a_src); // 06 + virtual ~BSPathingLockData(); // 00 + virtual std::uint32_t GetType(); // 01 + virtual bool CanTraverse(const BSTSmartPointer* a_door, float* a_arg2, bool* a_arg3); // 02 + virtual bool CanTraverse(const BSTSmartPointer* a_door, float* a_arg2); // 03 + virtual bool CanTraverse(const BSTSmartPointer* a_door); // 04 + virtual void Write(BSPathingStreamWrite* a_dst); // 05 + virtual void Read(BSPathingStreamRead* a_src); // 06 }; static_assert(sizeof(BSPathingLockData) == 0x10); } diff --git a/include/RE/B/BSPathingNode.h b/include/RE/B/BSPathingNode.h index be8e8be3a..d4b44cfad 100644 --- a/include/RE/B/BSPathingNode.h +++ b/include/RE/B/BSPathingNode.h @@ -10,9 +10,9 @@ namespace RE class BSPathingNode { public: - BSPathingLocation location; // 000 - BSTSmartPointer actionAtNode; // 030 - NiPoint3 tangent; // 038 + BSPathingLocation location; // 000 + BSTSmartPointer actionAtNode; // 030 + NiPoint3 tangent; // 038 }; static_assert(sizeof(BSPathingNode) == 0x48); } diff --git a/include/RE/B/BSPathingRequest.h b/include/RE/B/BSPathingRequest.h index 4960fd4e1..16695b707 100644 --- a/include/RE/B/BSPathingRequest.h +++ b/include/RE/B/BSPathingRequest.h @@ -25,28 +25,28 @@ namespace RE static constexpr auto RTTI{ RTTI::BSPathingRequest }; static constexpr auto VTABLE{ VTABLE::BSPathingRequest }; - virtual ~BSPathingRequest(); // 00 - virtual std::uint32_t GetType(); // 01 - virtual void CopyTo(BSPathingRequest* a_dst); // 02 - virtual void Write(BSPathingStreamWrite* a_dst); // 03 - virtual void Read(BSPathingStreamRead* a_src); // 04 - virtual void CheckValid(); // 05 - virtual void PrintDebugText(IDebugText* a_debugText); // 06 - virtual bool UpdateRequest(); // 07 + virtual ~BSPathingRequest(); // 00 + virtual std::uint32_t GetType(); // 01 + virtual void CopyTo(BSPathingRequest* a_dst); // 02 + virtual void Write(BSPathingStreamWrite* a_dst); // 03 + virtual void Read(BSPathingStreamRead* a_src); // 04 + virtual void CheckValid(); // 05 + virtual void PrintDebugText(IDebugText* a_debugText); // 06 + virtual bool UpdateRequest(); // 07 // members - BSPathingStart start; // 0010 - BSPathingGoal goal; // 0048 - BSPathingRestrictions restrictions; // 0098 - BSPathingSearchParameters searchParameters; // 00B0 - BSPathingActorAttributes actorAttributes; // 00C0 - MovementActorAvoidanceParameters avoidanceParameters; // 00E0 - BSTSmartPointer defaultParameters; // 0100 - MeanderSettingsData meanderSettings; // 0108 - BSTArray optionalStartArray; // 0120 - bool shouldMotionCorrectStartIdle; // 0138 - bool requiresPathStartIdle; // 0139 - bool disablePathEndIdle; // 013A + BSPathingStart start; // 0010 + BSPathingGoal goal; // 0048 + BSPathingRestrictions restrictions; // 0098 + BSPathingSearchParameters searchParameters; // 00B0 + BSPathingActorAttributes actorAttributes; // 00C0 + MovementActorAvoidanceParameters avoidanceParameters; // 00E0 + BSTSmartPointer defaultParameters; // 0100 + MeanderSettingsData meanderSettings; // 0108 + BSTArray optionalStartArray; // 0120 + bool shouldMotionCorrectStartIdle; // 0138 + bool requiresPathStartIdle; // 0139 + bool disablePathEndIdle; // 013A }; static_assert(sizeof(BSPathingRequest) == 0x140); } diff --git a/include/RE/B/BSPathingRestrictions.h b/include/RE/B/BSPathingRestrictions.h index 61fc5d470..f481b38af 100644 --- a/include/RE/B/BSPathingRestrictions.h +++ b/include/RE/B/BSPathingRestrictions.h @@ -9,8 +9,8 @@ namespace RE class BSPathingRestrictions { public: - NiPointer avoidNodeArray; // 00 - BSPathingSearchAreaRestrictions areaRestrictions; // 08 + NiPointer avoidNodeArray; // 00 + BSPathingSearchAreaRestrictions areaRestrictions; // 08 }; static_assert(sizeof(BSPathingRestrictions) == 0x18); } diff --git a/include/RE/B/BSPathingSearchAreaRestrictions.h b/include/RE/B/BSPathingSearchAreaRestrictions.h index 0a8e67540..352b7e788 100644 --- a/include/RE/B/BSPathingSearchAreaRestrictions.h +++ b/include/RE/B/BSPathingSearchAreaRestrictions.h @@ -7,8 +7,8 @@ namespace RE class BSPathingSearchAreaRestrictions { public: - NiPoint3 center; // 00 - float radius; // 0C + NiPoint3 center; // 00 + float radius; // 0C }; static_assert(sizeof(BSPathingSearchAreaRestrictions) == 0x10); } diff --git a/include/RE/B/BSPathingSearchParameters.h b/include/RE/B/BSPathingSearchParameters.h index a5531ee11..9705584e1 100644 --- a/include/RE/B/BSPathingSearchParameters.h +++ b/include/RE/B/BSPathingSearchParameters.h @@ -20,10 +20,10 @@ namespace RE kResolveGoalToClosest = 0x400 }; - float preferredCostFactor; // 00 - float tangentSmoothingFactor; // 04 - std::uint16_t retryCount; // 08 - REX::TEnumSet flags; // 0A + float preferredCostFactor; // 00 + float tangentSmoothingFactor; // 04 + std::uint16_t retryCount; // 08 + REX::TEnumSet flags; // 0A }; static_assert(sizeof(BSPathingSearchParameters) == 0x0C); } diff --git a/include/RE/B/BSPathingSolution.h b/include/RE/B/BSPathingSolution.h index fb4401f72..f6ee36885 100644 --- a/include/RE/B/BSPathingSolution.h +++ b/include/RE/B/BSPathingSolution.h @@ -1,23 +1,23 @@ #pragma once #include "RE/B/BSPathingNode.h" -#include "RE/B/BSVirtualPathingNode.h" #include "RE/B/BSTArray.h" +#include "RE/B/BSVirtualPathingNode.h" namespace RE { class BSPathingSolution : - public BSIntrusiveRefCounted // 00 + public BSIntrusiveRefCounted // 00 { public: // members - BSTSmallArray virtualPathingNodes; // 008 - std::int32_t firstLoadedVirtualNodeIndex; // 088 - std::int32_t lastLoadedVirtualNodeIndex; // 08C - BSTArray currentPathingNodes; // 090 - float goalRadius; // 0A8 - bool incompletePath; // 0AC - bool requestGoalUnused; // 0AD + BSTSmallArray virtualPathingNodes; // 008 + std::int32_t firstLoadedVirtualNodeIndex; // 088 + std::int32_t lastLoadedVirtualNodeIndex; // 08C + BSTArray currentPathingNodes; // 090 + float goalRadius; // 0A8 + bool incompletePath; // 0AC + bool requestGoalUnused; // 0AD }; static_assert(sizeof(BSPathingSolution) == 0xB0); } diff --git a/include/RE/B/BSTArrayRefCounted.h b/include/RE/B/BSTArrayRefCounted.h index 8463abcbc..91e054010 100644 --- a/include/RE/B/BSTArrayRefCounted.h +++ b/include/RE/B/BSTArrayRefCounted.h @@ -5,7 +5,7 @@ namespace RE { - template + template class alignas(0x8) BSTArrayRefCounted : public BSTArray, // 00 public BSIntrusiveRefCounted // 18 diff --git a/include/RE/B/BSVirtualPathingNode.h b/include/RE/B/BSVirtualPathingNode.h index c3cf9cfd2..0b501832d 100644 --- a/include/RE/B/BSVirtualPathingNode.h +++ b/include/RE/B/BSVirtualPathingNode.h @@ -11,8 +11,8 @@ namespace RE { public: // members - BSPathingLocation location; // 000 - BSTSmartPointer actionAtNode; // 030 + BSPathingLocation location; // 000 + BSTSmartPointer actionAtNode; // 030 }; static_assert(sizeof(BSVirtualPathingNode) == 0x38); } diff --git a/include/RE/Fallout.h b/include/RE/Fallout.h index 7681dd3e5..e0010e4de 100644 --- a/include/RE/Fallout.h +++ b/include/RE/Fallout.h @@ -243,6 +243,8 @@ #include "RE/B/BIPED_OBJECT.h" #include "RE/B/BIPED_PART.h" #include "RE/B/BIPOBJECT.h" +#include "RE/B/BSActorPathingMessage.h" +#include "RE/B/BSActorPathingMessageQueue.h" #include "RE/B/BSAnimationGraphEvent.h" #include "RE/B/BSAnimationGraphManager.h" #include "RE/B/BSAnimationGraphVariableCache.h" @@ -333,10 +335,20 @@ #include "RE/B/BSOcclusionPlane.h" #include "RE/B/BSOcclusionShape.h" #include "RE/B/BSPackedTaskQueue.h" +#include "RE/B/BSPathingActorAttributes.h" #include "RE/B/BSPathingAvoidNode.h" +#include "RE/B/BSPathingAvoidNodeArray.h" +#include "RE/B/BSPathingCell.h" #include "RE/B/BSPathingFaceTarget.h" #include "RE/B/BSPathingGoal.h" #include "RE/B/BSPathingLocation.h" +#include "RE/B/BSPathingLockData.h" +#include "RE/B/BSPathingNode.h" +#include "RE/B/BSPathingRequest.h" +#include "RE/B/BSPathingRestrictions.h" +#include "RE/B/BSPathingSearchAreaRestrictions.h" +#include "RE/B/BSPathingSearchParameters.h" +#include "RE/B/BSPathingSolution.h" #include "RE/B/BSPathingStart.h" #include "RE/B/BSPointerAllocator.h" #include "RE/B/BSPointerHandle.h" @@ -466,6 +478,7 @@ #include "RE/B/BSSystemFile.h" #include "RE/B/BSSystemFileStreamer.h" #include "RE/B/BSTArray.h" +#include "RE/B/BSTArrayRefCounted.h" #include "RE/B/BSTAtomicValue.h" #include "RE/B/BSTBTree.h" #include "RE/B/BSTDataBuffer.h" @@ -504,6 +517,7 @@ #include "RE/B/BSUIScaleformData.h" #include "RE/B/BSUtilities.h" #include "RE/B/BSUtilityShader.h" +#include "RE/B/BSVirtualPathingNode.h" #include "RE/B/BSVisit.h" #include "RE/B/BSWaterShaderMaterial.h" #include "RE/B/BSXAudio2Audio.h" @@ -967,6 +981,7 @@ #include "RE/M/MapMarker.h" #include "RE/M/MapMarkerData.h" #include "RE/M/MarkerIconTypes.h" +#include "RE/M/MeanderSettingsData.h" #include "RE/M/MeleeThrowHandler.h" #include "RE/M/MemoryManager.h" #include "RE/M/MenuControls.h" @@ -990,10 +1005,12 @@ #include "RE/M/MouseMoveEvent.h" #include "RE/M/MoveData.h" #include "RE/M/Movement.h" +#include "RE/M/MovementActorAvoidanceParameters.h" #include "RE/M/MovementCorrection.h" #include "RE/M/MovementCorrectionData.h" #include "RE/M/MovementData.h" #include "RE/M/MovementLargeDelta.h" +#include "RE/M/MovementMessage.h" #include "RE/M/MovementTweenerOutputData.h" #include "RE/M/MovementVector.h" #include "RE/N/NEW_REFR_DATA.h" @@ -1078,6 +1095,7 @@ #include "RE/P/PACK_EVENT_ACTION_TYPE.h" #include "RE/P/PACK_SCHED_DATA.h" #include "RE/P/PART_DATA.h" +#include "RE/P/PATHING_MESSAGE_TYPE.h" #include "RE/P/PATH_DATA.h" #include "RE/P/PC_GAMEPAD_TYPE.h" #include "RE/P/PERK_ENTRY_TYPE.h" @@ -1172,6 +1190,7 @@ #include "RE/Q/QUEST_TAB.h" #include "RE/Q/QUEST_TYPE.h" #include "RE/Q/QuestFlag.h" +#include "RE/Q/QuestTargetArray.h" #include "RE/Q/QuickContainerMode.h" #include "RE/Q/QuickContainerStateData.h" #include "RE/Q/QuickContainerStateEvent.h" @@ -1357,6 +1376,7 @@ #include "RE/T/TESProduceForm.h" #include "RE/T/TESQuest.h" #include "RE/T/TESQuestEvent.h" +#include "RE/T/TESQuestTarget.h" #include "RE/T/TESRace.h" #include "RE/T/TESRaceForm.h" #include "RE/T/TESReactionForm.h" diff --git a/include/RE/M/MovementActorAvoidanceParameters.h b/include/RE/M/MovementActorAvoidanceParameters.h index a746b7863..a1dc128ec 100644 --- a/include/RE/M/MovementActorAvoidanceParameters.h +++ b/include/RE/M/MovementActorAvoidanceParameters.h @@ -8,8 +8,8 @@ namespace RE { public: // members - BSTSmallArray actors; // 000 - std::uint32_t flags; // 018 + BSTSmallArray actors; // 000 + std::uint32_t flags; // 018 }; static_assert(sizeof(MovementActorAvoidanceParameters) == 0x20); } diff --git a/include/RE/M/MovementMessage.h b/include/RE/M/MovementMessage.h index eda67fc60..e4708779a 100644 --- a/include/RE/M/MovementMessage.h +++ b/include/RE/M/MovementMessage.h @@ -16,13 +16,13 @@ namespace RE static constexpr auto RTTI{ RTTI::MovementMessage }; static constexpr auto VTABLE{ VTABLE::MovementMessage }; - virtual ~MovementMessage(); // 00 - virtual std::uint32_t GetMessageType(); // 01 - virtual std::uint32_t GetType(); // 02 - virtual void Write(BSPathingStreamWrite* a_dst); // 03 - virtual void Read(BSPathingStreamRead* a_src); // 04 - virtual void FixupNumericID(BSPathingNumericIDVisitor* a_visitor); // 05 - virtual IPathFollowerAction* GetPathFollowerActionInterface(); // 06 + virtual ~MovementMessage(); // 00 + virtual std::uint32_t GetMessageType(); // 01 + virtual std::uint32_t GetType(); // 02 + virtual void Write(BSPathingStreamWrite* a_dst); // 03 + virtual void Read(BSPathingStreamRead* a_src); // 04 + virtual void FixupNumericID(BSPathingNumericIDVisitor* a_visitor); // 05 + virtual IPathFollowerAction* GetPathFollowerActionInterface(); // 06 }; static_assert(sizeof(MovementMessage) == 0x10); } diff --git a/include/RE/T/TESQuestTarget.h b/include/RE/T/TESQuestTarget.h index f2cc61c22..f43dc29ee 100644 --- a/include/RE/T/TESQuestTarget.h +++ b/include/RE/T/TESQuestTarget.h @@ -4,8 +4,8 @@ #include "RE/B/BSPointerHandle.h" #include "RE/B/BSTArray.h" #include "RE/B/BSTSmartPointer.h" -#include "RE/T/TeleportPath.h" #include "RE/T/TESCondition.h" +#include "RE/T/TeleportPath.h" namespace RE { @@ -16,18 +16,17 @@ namespace RE public: class REF_DATA { - TeleportPath TeleportPath; // 00 - ObjectRefHandle reference; // 50 - BSTSmartPointer pathMessageQueue; // 58 - bool forceRebuildQueued; // 60 + TeleportPath TeleportPath; // 00 + ObjectRefHandle reference; // 50 + BSTSmartPointer pathMessageQueue; // 58 + bool forceRebuildQueued; // 60 }; - - std::uint8_t flags; // 00 - TESCondition conditions; // 08 - std::uint32_t targetAlias; // 10 - BGSKeyword* keyword; // 18 - BSTArray target; // 20 + std::uint8_t flags; // 00 + TESCondition conditions; // 08 + std::uint32_t targetAlias; // 10 + BGSKeyword* keyword; // 18 + BSTArray target; // 20 }; static_assert(sizeof(TESQuestTarget) == 0x38); } From d570583b8a2c52e132501468b7af120c98aa2a38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Dejerud=20R=C3=A5dstam?= <68670981+FlenarnDev@users.noreply.github.com> Date: Tue, 1 Sep 2026 08:51:06 +0200 Subject: [PATCH 21/28] fix: Declare members of `REF_DATA` public. --- include/RE/T/TESQuestTarget.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/RE/T/TESQuestTarget.h b/include/RE/T/TESQuestTarget.h index f43dc29ee..39b594f0b 100644 --- a/include/RE/T/TESQuestTarget.h +++ b/include/RE/T/TESQuestTarget.h @@ -16,7 +16,8 @@ namespace RE public: class REF_DATA { - TeleportPath TeleportPath; // 00 + public: + TeleportPath teleportPath; // 00 ObjectRefHandle reference; // 50 BSTSmartPointer pathMessageQueue; // 58 bool forceRebuildQueued; // 60 From 4dfc2b38d542b1d151fac2f4f021f9e7332b638b Mon Sep 17 00:00:00 2001 From: Flenarn Date: Tue, 1 Sep 2026 18:42:19 +0200 Subject: [PATCH 22/28] fix: Appease compiler gods. --- include/RE/B/BSActorPathingMessage.h | 2 +- include/RE/B/BSActorPathingMessageQueue.h | 2 +- include/RE/P/PATHING_MESSAGE_TYPE.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/RE/B/BSActorPathingMessage.h b/include/RE/B/BSActorPathingMessage.h index d76bfbd3e..f20ef5ad1 100644 --- a/include/RE/B/BSActorPathingMessage.h +++ b/include/RE/B/BSActorPathingMessage.h @@ -15,5 +15,5 @@ namespace RE BSTSmartPointer request; // 08 BSTSmartPointer solution; // 10 }; - static_assert(sizeof(BSActorPathingMessage) == 0x18) + static_assert(sizeof(BSActorPathingMessage) == 0x18); } diff --git a/include/RE/B/BSActorPathingMessageQueue.h b/include/RE/B/BSActorPathingMessageQueue.h index c677614f2..8aca806e4 100644 --- a/include/RE/B/BSActorPathingMessageQueue.h +++ b/include/RE/B/BSActorPathingMessageQueue.h @@ -15,5 +15,5 @@ namespace RE BSTSmallArray messages; // 008 BSSpinLock messagesLock; // 030 }; - static_assert(sizeof(BSActorPathingMessageQueue) == 0x38) + static_assert(sizeof(BSActorPathingMessageQueue) == 0x38); } diff --git a/include/RE/P/PATHING_MESSAGE_TYPE.h b/include/RE/P/PATHING_MESSAGE_TYPE.h index 2d59cbd25..ad5ad0303 100644 --- a/include/RE/P/PATHING_MESSAGE_TYPE.h +++ b/include/RE/P/PATHING_MESSAGE_TYPE.h @@ -2,7 +2,7 @@ namespace RE { - enum PATHING_MESSAGE_TYPE : std::uint32_t + enum PATHING_MESSAGE_TYPE : std::int32_t { kOk = 0x0, kError = 0x1, From 50014264887539e1f8dea15516b5b792c1bd23a7 Mon Sep 17 00:00:00 2001 From: Flenarn Date: Tue, 1 Sep 2026 19:07:00 +0200 Subject: [PATCH 23/28] feat: Add `TESQuest:GetActive`. --- include/RE/IDs.h | 1 + include/RE/T/TESQuest.h | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/include/RE/IDs.h b/include/RE/IDs.h index 97a2685d9..526fe3e02 100644 --- a/include/RE/IDs.h +++ b/include/RE/IDs.h @@ -2319,6 +2319,7 @@ namespace RE::ID { inline constexpr REL::ID SetStage{ 2207743 }; inline constexpr REL::ID GetAliasedRef{ 2207810 }; + inline constexpr REL::ID GetActive{ 2207733 }; } namespace TESResponse diff --git a/include/RE/T/TESQuest.h b/include/RE/T/TESQuest.h index b774824ad..eb3110eb5 100644 --- a/include/RE/T/TESQuest.h +++ b/include/RE/T/TESQuest.h @@ -50,6 +50,13 @@ namespace RE return func(this, a_result, a_aiAliasID); } + bool GetActive() + { + using func_t = decltype(&TESQuest::GetActive); + static REL::Relocation func{ ID::TESQuest::GetActive }; + return func(this); + } + // members BSTArray instanceData; // 038 std::uint32_t currentInstanceID; // 050 From 292712b7a132a966c099c4fd273604d697ba9100 Mon Sep 17 00:00:00 2001 From: Flenarn Date: Wed, 2 Sep 2026 19:56:08 +0200 Subject: [PATCH 24/28] feat: `TESObjectREFR:HasLocationRefType`. --- include/RE/IDs.h | 1 + include/RE/T/TESObjectREFR.h | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/include/RE/IDs.h b/include/RE/IDs.h index 526fe3e02..b8bc40114 100644 --- a/include/RE/IDs.h +++ b/include/RE/IDs.h @@ -2306,6 +2306,7 @@ namespace RE::ID inline constexpr REL::ID GetMapMarkerData{ 2202644 }; inline constexpr REL::ID GetRelevantWaterHeight{ 2201189 }; inline constexpr REL::ID CanBeMoved{ 2200898 }; + inline constexpr REL::ID HasLocationRefType{ 2202676 }; } namespace TESObjectWEAP diff --git a/include/RE/T/TESObjectREFR.h b/include/RE/T/TESObjectREFR.h index fefea4c64..58ee44748 100644 --- a/include/RE/T/TESObjectREFR.h +++ b/include/RE/T/TESObjectREFR.h @@ -29,6 +29,7 @@ namespace RE class BGSAnimationSequencer; class BGSBehaviorRootData; class BGSDecalGroup; + class BGSLocationRefType; class BipedAnim; class BSActiveGraphIfInactiveEvent; class BSAnimationGraphEvent; @@ -592,6 +593,13 @@ namespace RE return func(this); } + bool HasLocationRefType(BGSLocationRefType* a_type) + { + using func_t = decltype(&TESObjectREFR::HasLocationRefType); + static REL::Relocation func{ ID::TESObjectREFR::HasLocationRefType }; + return func(this, a_type); + } + // members TESObjectCELL* parentCell; // 0x0B8 OBJ_REFR data; // 0x0C0 From 8b02c29c20e365eda83091620029d51009a17362 Mon Sep 17 00:00:00 2001 From: Flenarn Date: Thu, 3 Sep 2026 18:07:17 +0200 Subject: [PATCH 25/28] feat: ExtraRadius --- include/RE/E/ExtraRadius.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 include/RE/E/ExtraRadius.h diff --git a/include/RE/E/ExtraRadius.h b/include/RE/E/ExtraRadius.h new file mode 100644 index 000000000..43690dbe7 --- /dev/null +++ b/include/RE/E/ExtraRadius.h @@ -0,0 +1,19 @@ +#pragma once + +#include "RE/B/BSExtraData.h" + +namespace RE +{ + class __declspec(novtable) ExtraRadius : + public BSExtraData // 00 + { + public: + static constexpr auto RTTI{ RTTI::ExtraRadius }; + static constexpr auto VTABLE{ VTABLE::ExtraRadius }; + static constexpr auto TYPE{ EXTRA_DATA_TYPE::kRadius }; + + // members + float radius; // 18 + }; + static_assert(sizeof(ExtraRadius) == 0x20); +} From d8a3c3e39b9d476596186f26c8924a06730429d2 Mon Sep 17 00:00:00 2001 From: FlenarnDev Date: Thu, 3 Sep 2026 16:07:57 +0000 Subject: [PATCH 26/28] maintenance --- include/RE/E/ExtraRadius.h | 2 +- include/RE/Fallout.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/include/RE/E/ExtraRadius.h b/include/RE/E/ExtraRadius.h index 43690dbe7..727f1bba7 100644 --- a/include/RE/E/ExtraRadius.h +++ b/include/RE/E/ExtraRadius.h @@ -13,7 +13,7 @@ namespace RE static constexpr auto TYPE{ EXTRA_DATA_TYPE::kRadius }; // members - float radius; // 18 + float radius; // 18 }; static_assert(sizeof(ExtraRadius) == 0x20); } diff --git a/include/RE/Fallout.h b/include/RE/Fallout.h index 2f1a4eed8..81fc7203b 100644 --- a/include/RE/Fallout.h +++ b/include/RE/Fallout.h @@ -703,6 +703,7 @@ #include "RE/E/ExtraRadioData.h" #include "RE/E/ExtraRadioReceiver.h" #include "RE/E/ExtraRadioRepeater.h" +#include "RE/E/ExtraRadius.h" #include "RE/E/ExtraRagDollData.h" #include "RE/E/ExtraReferenceHandles.h" #include "RE/E/ExtraStartingWorldOrCell.h" From d69c36124a17507e6d5a8ceb7ce8a6a1cd98f50e Mon Sep 17 00:00:00 2001 From: Flenarn Date: Fri, 4 Sep 2026 21:08:39 +0200 Subject: [PATCH 27/28] feat: Another function, another day --- include/RE/E/EXTRA_DATA_TYPE.h | 2 +- include/RE/IDs.h | 1 + include/RE/T/TESFurniture.h | 7 +++++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/include/RE/E/EXTRA_DATA_TYPE.h b/include/RE/E/EXTRA_DATA_TYPE.h index 3225a8188..5da31c129 100644 --- a/include/RE/E/EXTRA_DATA_TYPE.h +++ b/include/RE/E/EXTRA_DATA_TYPE.h @@ -93,7 +93,7 @@ namespace RE kImageSpace, // kNavmeshPortal, // kModelSwap, // - kRadius, // + kRadius, // ExtraRadius kRadiation, // kFactionChanges, // ExtraFactionChanges kDismemberedLimbs, // diff --git a/include/RE/IDs.h b/include/RE/IDs.h index b8bc40114..1af503bbf 100644 --- a/include/RE/IDs.h +++ b/include/RE/IDs.h @@ -2158,6 +2158,7 @@ namespace RE::ID namespace TESFurniture { inline constexpr REL::ID GetContainer{ 2198043 }; + inline constexpr REL::ID Activate{ 2198054 }; } namespace TESFurnitureEvent diff --git a/include/RE/T/TESFurniture.h b/include/RE/T/TESFurniture.h index 5b4ab96d4..15fc44311 100644 --- a/include/RE/T/TESFurniture.h +++ b/include/RE/T/TESFurniture.h @@ -34,6 +34,13 @@ namespace RE return func(this); } + bool Activate(TESObjectREFR* a_itemActivated, TESObjectREFR* a_actionRef, TESBoundObject* a_formal) + { + using func_t = decltype(&TESFurniture::Activate); + static REL::Relocation func{ ID::TESFurniture::Activate }; + return func(this, a_itemActivated, a_actionRef, a_formal); + } + // members BSTArray entryPointDataArray; // 148 BGSAttachParentArray attachParents; // 160 From fc284e4316861e4b645fa3a8dc733550a6de23db Mon Sep 17 00:00:00 2001 From: Flenarn Date: Sun, 6 Sep 2026 20:29:35 +0200 Subject: [PATCH 28/28] feat: `PipboyMapData::UpdateQuestMarkers` declared. --- include/RE/IDs.h | 1 + include/RE/P/PipboyMapData.h | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/include/RE/IDs.h b/include/RE/IDs.h index 1af503bbf..a45b831fd 100644 --- a/include/RE/IDs.h +++ b/include/RE/IDs.h @@ -1718,6 +1718,7 @@ namespace RE::ID namespace PipboyMapData { inline constexpr REL::ID GetTravelLocationRefr{ 2225515 }; + inline constexpr REL::ID UpdateQuestMarkers{ 2225549 }; } namespace PipboyMapMenu diff --git a/include/RE/P/PipboyMapData.h b/include/RE/P/PipboyMapData.h index c171568f0..964970d5d 100644 --- a/include/RE/P/PipboyMapData.h +++ b/include/RE/P/PipboyMapData.h @@ -11,6 +11,7 @@ namespace RE { class BGSActorCellEvent; class MapMarkerData; + class PipboyArray; class PlayerUpdateEvent; class TESLocationClearedEvent; @@ -34,6 +35,11 @@ namespace RE class Event; } + namespace MapMarker + { + enum class MARKER_SCOPE; + } + namespace PlayerCharacterQuestEvent { class Event; @@ -91,6 +97,13 @@ namespace RE return func(this, a_result, a_markerId); } + void UpdateQuestMarkers(PipboyArray* a_questMarkers, BSTHashMap* a_questMarkerMap, MapMarker::MARKER_SCOPE a_scope, float a_heightReference) + { + using func_t = decltype(&PipboyMapData::UpdateQuestMarkers); + static REL::Relocation func{ ID::PipboyMapData::UpdateQuestMarkers }; + return func(this, a_questMarkers, a_questMarkerMap, a_scope, a_heightReference); + } + // members PipboyObject* mapObject; // E8 BSTHashMap travelLocationsMarkers; // F0