From d2851a71440ec65e7a6258824da16d260ade8675 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Dejerud=20R=C3=A5dstam?= <68670981+FlenarnDev@users.noreply.github.com> Date: Sat, 25 Apr 2026 10:41:44 +0200 Subject: [PATCH 1/4] feat: Further additions. (#61) * feat: Detection related stuff. * maintenance * fix: Correct pragma. * feat: Misc. findings during development. * feat: AIFormulas::ComputePickpocketSuccess added. * feat: `DETECTION_FORMULA_TYPE` enum. * feat: Misc. additions. * maintenance * fix: Correct pragma. * feat: Helpers for TESTopicInfo. * chore: Cleanup and some additional flag enums. * feat: `DamageLockpick` function declared. * chore: Cleanup TODO. * maintenance * chore: Cleanup. * feat: Flags for grass, --------- Co-authored-by: Flenarn Co-authored-by: FlenarnDev --- include/RE/A/AIFormulas.h | 7 ++++ include/RE/A/AIProcess.h | 7 ++++ include/RE/A/Actor.h | 16 ++++++++ include/RE/B/BGSColorForm.h | 6 +++ include/RE/C/CombatFormulas.h | 7 ++++ include/RE/D/DETECTION_FORMULA_TYPE.h | 12 ++++++ include/RE/D/DETECTION_TYPE.h | 12 ++++++ include/RE/D/DetectionData.h | 21 +++++++++++ include/RE/D/DetectionFormulaData.h | 53 +++++++++++++++++++++++++++ include/RE/D/DialogueMenu.h | 10 ++--- include/RE/Fallout.h | 6 +++ include/RE/IDs.h | 16 ++++++++ include/RE/L/LOADED_REF_DATA.h | 15 ++++---- include/RE/L/LockpickingMenu.h | 7 ++++ include/RE/P/PlayerCharacter.h | 7 ++++ include/RE/R/REFR_LOCK.h | 6 +++ include/RE/R/RadioManager.h | 28 ++++++++++++++ include/RE/S/STAGGER_MAGNITUDE.h | 16 ++++++++ include/RE/T/TESClimate.h | 6 --- include/RE/T/TESEyes.h | 7 ++++ include/RE/T/TESGrass.h | 7 ++++ include/RE/T/TESTopicInfo.h | 2 + include/RE/T/TaskQueueInterface.h | 8 ++++ 23 files changed, 264 insertions(+), 18 deletions(-) create mode 100644 include/RE/D/DETECTION_FORMULA_TYPE.h create mode 100644 include/RE/D/DETECTION_TYPE.h create mode 100644 include/RE/D/DetectionData.h create mode 100644 include/RE/D/DetectionFormulaData.h create mode 100644 include/RE/R/RadioManager.h create mode 100644 include/RE/S/STAGGER_MAGNITUDE.h diff --git a/include/RE/A/AIFormulas.h b/include/RE/A/AIFormulas.h index 705a0ba8..10dc0fd5 100644 --- a/include/RE/A/AIFormulas.h +++ b/include/RE/A/AIFormulas.h @@ -10,5 +10,12 @@ namespace RE static REL::Relocation func{ ID::AIFormulas::GetBarterValue }; return func(a_baseValue, a_charisma, a_selling, a_refTarget); } + + inline std::uint32_t ComputePickpocketSuccess(float a_thiefSkill, float a_targetSkill, std::int32_t a_valueStolen, float a_weightStolen, Actor* a_thief, Actor* a_target, TESForm* a_itemPickpocketing, bool a_placingItem) + { + using func_t = decltype(&AIFormulas::ComputePickpocketSuccess); + static REL::Relocation func{ ID::AIFormulas::ComputePickpocketSuccess }; + return func(a_thiefSkill, a_targetSkill, a_valueStolen, a_weightStolen, a_thief, a_target, a_itemPickpocketing, a_placingItem); + } } } diff --git a/include/RE/A/AIProcess.h b/include/RE/A/AIProcess.h index f24f1fdc..b65f31bf 100644 --- a/include/RE/A/AIProcess.h +++ b/include/RE/A/AIProcess.h @@ -170,6 +170,13 @@ namespace RE return func(this); } + float GetActorLightLevel() + { + using func_t = decltype(&AIProcess::GetActorLightLevel); + static REL::Relocation func{ ID::AIProcess::GetActorLightLevel }; + return func(this); + } + // members MiddleLowProcessData* middleLow; // 00 MiddleHighProcessData* middleHigh; // 08 diff --git a/include/RE/A/Actor.h b/include/RE/A/Actor.h index fccffbf7..bc9c1c6a 100644 --- a/include/RE/A/Actor.h +++ b/include/RE/A/Actor.h @@ -48,6 +48,8 @@ namespace RE class CastPowerItem; class CombatController; class CombatGroup; + class DetectionData; + class HitData; class MovementControllerNPC; class MovementMessageActorCollision; class MovementMessageNewPath; @@ -599,6 +601,20 @@ namespace RE return func(this, a_instance, a_moveActor, a_update3D); } + void CalculateDetectionFormula(Actor* a_target, DetectionData* a_detectionData) + { + using func_t = decltype(&Actor::CalculateDetectionFormula); + static REL::Relocation func{ ID::Actor::CalculateDetectionFormula }; + return func(this, a_target, a_detectionData); + } + + void DoHitMe(const HitData* a_data) + { + using func_t = decltype(&Actor::DoHitMe); + static REL::Relocation func{ ID::Actor::DoHitMe }; + return func(this, a_data); + } + // members NiTFlags niFlags; // 2D0 float updateTargetTimer; // 2D4 diff --git a/include/RE/B/BGSColorForm.h b/include/RE/B/BGSColorForm.h index dca86808..7fabfcfa 100644 --- a/include/RE/B/BGSColorForm.h +++ b/include/RE/B/BGSColorForm.h @@ -15,6 +15,12 @@ namespace RE static constexpr auto VTABLE{ VTABLE::BGSColorForm }; static constexpr auto FORM_ID{ ENUM_FORM_ID::kCLFM }; + enum class Flags : std::int32_t + { + kPlayable = 0x1, + kRemappingIndex = 0x2 + }; + // members union { diff --git a/include/RE/C/CombatFormulas.h b/include/RE/C/CombatFormulas.h index 36c7648c..837403de 100644 --- a/include/RE/C/CombatFormulas.h +++ b/include/RE/C/CombatFormulas.h @@ -55,5 +55,12 @@ namespace RE static REL::Relocation func{ ID::CombatFormulas::CalcScopeSteadyActionPointDrain }; return func(a_actor, a_deltaSec); } + + [[nodiscard]] inline float CalcResistedPercentage(const ActorValueInfo* a_resistance, float a_damage, float a_resistancePoints) + { + using func_t = decltype(&CombatFormulas::CalcResistedPercentage); + static REL::Relocation func{ ID::CombatFormulas::CalcResistedPercentage }; + return func(a_resistance, a_damage, a_resistancePoints); + } } } diff --git a/include/RE/D/DETECTION_FORMULA_TYPE.h b/include/RE/D/DETECTION_FORMULA_TYPE.h new file mode 100644 index 00000000..0290b347 --- /dev/null +++ b/include/RE/D/DETECTION_FORMULA_TYPE.h @@ -0,0 +1,12 @@ +#pragma once + +namespace RE +{ + enum class DETECTION_FORMULA_TYPE : std::uint32_t + { + kFormula = 0x0, + kRange = 0x1, + kVisual_Range = 0x2, + kSound_Range = 0x3, + }; +} diff --git a/include/RE/D/DETECTION_TYPE.h b/include/RE/D/DETECTION_TYPE.h new file mode 100644 index 00000000..c4a28f86 --- /dev/null +++ b/include/RE/D/DETECTION_TYPE.h @@ -0,0 +1,12 @@ +#pragma once + +namespace RE +{ + enum class DETECTION_TYPE + { + kNormal = 0, + kProjectile = 1, + kEvent = 2, + kTotal = 3 + }; +} diff --git a/include/RE/D/DetectionData.h b/include/RE/D/DetectionData.h new file mode 100644 index 00000000..c839efcd --- /dev/null +++ b/include/RE/D/DetectionData.h @@ -0,0 +1,21 @@ +#pragma once + +#include "RE/D/DetectionFormulaData.h" +#include "RE/D/DetectionLevels.h" +#include "RE/N/NiPoint.h" + +namespace RE +{ + enum class DETECTION_TYPE; + + class DetectionData : + public DetectionFormulaData // 00 + { + public: + // members + NiPoint3 detectedLocation; // 74 + DetectionLevels detectionLevel; // 80 + DETECTION_TYPE detectionType; // 84 + }; + static_assert(sizeof(DetectionData) == 0x88); +} diff --git a/include/RE/D/DetectionFormulaData.h b/include/RE/D/DetectionFormulaData.h new file mode 100644 index 00000000..e97eb96f --- /dev/null +++ b/include/RE/D/DetectionFormulaData.h @@ -0,0 +1,53 @@ +#pragma once + +#include "RE/A/ACTOR_LOS_LOCATION.h" +#include "RE/A/AITimeStamp.h" + +namespace RE +{ + class DetectionFormulaData + { + public: + // members + ACTOR_LOS_LOCATION losLocation; // 00 + AITimeStamp timeStamp; // 04 + std::uint32_t ambush; // 08 + std::uint32_t targetRaceSize; // 0C + std::uint32_t targetActionSound; // 10 + float lightLevel; // 14 + float modifiedLightLevel; // 18 + float visualDetectionDistance; // 1C + float soundDetectionDistance; // 20 + float perception; // 24 + float basePerception; // 28 + float blindness; // 2C + float deafness; // 30 + float targetDistance; // 34 + float targetAngle; // 38 + float targetVerticalAngle; // 3C + float targetAgility; // 40 + float targetSneakSkill; // 44 + float targetBaseStealth; // 48 + float targetEquippedWeight; // 4C + float targetMovementNoiseMult; // 50 + float targetStealth; // 54 + float targetVisibility; // 58 + float visualDetectionLevel; // 5C + float soundDetectionLevel; // 60 + bool LOS; // 64 + bool _360LOS; // 65 + bool exterior; // 66 + bool alert; // 67 + bool sleeping; // 68 + bool nightEye; // 69 + bool targetMoving; // 6A + bool targetRunning; // 6B + bool targetSneaking; // 6C + bool targetInvisible; // 6D + bool targetInCover; // 6E + bool targetObserved; // 6F + bool combatTarget; // 70 + bool flying; // 71 + }; + static_assert(sizeof(DetectionFormulaData) == 0x74); +} diff --git a/include/RE/D/DialogueMenu.h b/include/RE/D/DialogueMenu.h index 8684fe8a..52e8d1b0 100644 --- a/include/RE/D/DialogueMenu.h +++ b/include/RE/D/DialogueMenu.h @@ -21,12 +21,12 @@ namespace RE // Members std::unique_ptr dialogueButtonOBJs[4]; std::unique_ptr speechChallengeAnimObj; - BSTValueEventSink CurrentVBPerk; - BSTValueEventSource ShowingSpeechChallenge; + BSTValueEventSink currentVBPerk; + BSTValueEventSource showingSpeechChallenge; BSTSmartPointer inputLayer; - UserEvents::INPUT_CONTEXT_ID CurrentContext; - bool IsLookingAtPlayer; - bool AreButtonsShown; + UserEvents::INPUT_CONTEXT_ID currentContext; + bool isLookingAtPlayer; + bool areButtonsShown; }; static_assert(sizeof(DialogueMenu) == 0x168); } diff --git a/include/RE/Fallout.h b/include/RE/Fallout.h index 29d90854..e972f501 100644 --- a/include/RE/Fallout.h +++ b/include/RE/Fallout.h @@ -593,7 +593,9 @@ #include "RE/D/DEFAULT_OBJECT.h" #include "RE/D/DEFAULT_OBJECT_DATA.h" #include "RE/D/DEFAULT_OBJECT_TYPE.h" +#include "RE/D/DETECTION_FORMULA_TYPE.h" #include "RE/D/DETECTION_PRIORITY.h" +#include "RE/D/DETECTION_TYPE.h" #include "RE/D/DIALOGUE_DATA.h" #include "RE/D/DIALOGUE_SUBTYPE.h" #include "RE/D/DIALOGUE_TYPE.h" @@ -605,7 +607,9 @@ #include "RE/D/DesiredMovementData.h" #include "RE/D/DestructibleObjectData.h" #include "RE/D/DestructibleObjectStage.h" +#include "RE/D/DetectionData.h" #include "RE/D/DetectionEvent.h" +#include "RE/D/DetectionFormulaData.h" #include "RE/D/DetectionLevels.h" #include "RE/D/DeviceConnectEvent.h" #include "RE/D/DialogueItem.h" @@ -1102,6 +1106,7 @@ #include "RE/R/REGION_DATA_BASE.h" #include "RE/R/REGION_DATA_ID.h" #include "RE/R/RESET_3D_FLAGS.h" +#include "RE/R/RadioManager.h" #include "RE/R/RagDollBone.h" #include "RE/R/RagDollData.h" #include "RE/R/ReadyWeaponHandler.h" @@ -1133,6 +1138,7 @@ #include "RE/S/SIT_SLEEP_STATE.h" #include "RE/S/SOUND_LEVEL.h" #include "RE/S/SPECIALMenuEvent.h" +#include "RE/S/STAGGER_MAGNITUDE.h" #include "RE/S/SUBTITLE_PRIORITY.h" #include "RE/S/SWFToCodeFunctionHandler.h" #include "RE/S/SavefileMetadata.h" diff --git a/include/RE/IDs.h b/include/RE/IDs.h index 6742dfc2..d1e31cdc 100644 --- a/include/RE/IDs.h +++ b/include/RE/IDs.h @@ -66,6 +66,8 @@ namespace RE::ID inline constexpr REL::ID GetMobilityCrippled{ 2230996 }; inline constexpr REL::ID SPECIALModifiedCallback{ 2231020 }; inline constexpr REL::ID StopInteractingQuick{ 2231227 }; + inline constexpr REL::ID CalculateDetectionFormula{ 2230213 }; + inline constexpr REL::ID DoHitMe{ 2231148 }; } namespace ActorEquipManager @@ -95,6 +97,7 @@ namespace RE::ID namespace AIFormulas { inline constexpr REL::ID GetBarterValue{ 2208969 }; + inline constexpr REL::ID ComputePickpocketSuccess{ 2208977 }; } namespace AIProcess @@ -116,6 +119,7 @@ namespace RE::ID inline constexpr REL::ID SetRunOncePackage{ 2232344 }; inline constexpr REL::ID AddToProcedureIndexRunning{ 2718412 }; inline constexpr REL::ID ComputeLastTimeProcessed{ 2231541 }; + inline constexpr REL::ID GetActorLightLevel{ 2231981 }; } namespace AITimer @@ -851,6 +855,7 @@ namespace RE::ID inline constexpr REL::ID CalcWeaponDamage{ 2209001 }; inline constexpr REL::ID GetNumCrippledAttackConditions{ 2209041 }; inline constexpr REL::ID CalcScopeSteadyActionPointDrain{ 2209045 }; + inline constexpr REL::ID CalcResistedPercentage{ 2209007 }; } namespace CombatUtilities @@ -1235,6 +1240,7 @@ namespace RE::ID { inline constexpr REL::ID OpenLockpickingMenu{ 2249263 }; inline constexpr REL::ID SendLockInfoToMenu{ 2249267 }; + inline constexpr REL::ID DamageLockpick{ 2249275 }; } namespace LocksPicked @@ -1613,6 +1619,7 @@ namespace RE::ID inline constexpr REL::ID SetPerkCount{ 2233187 }; inline constexpr REL::ID HasLOSToTarget{ 2233004 }; inline constexpr REL::ID TryUnlockObject{ 2233040 }; + inline constexpr REL::ID EnableRadio{ 2233211 }; } namespace PlayerControls @@ -1669,6 +1676,13 @@ namespace RE::ID inline constexpr REL::ID RequestHighestDetectionLevelAgainstActor{ 2234111 }; } + namespace RadioManager + { + inline constexpr REL::ID QPlayerRadioEnabled{ 2227674 }; + inline constexpr REL::ID QCurrentPlayerFreq{ 2227670 }; + inline constexpr REL::ID EnablePlayerRadio{ 2227673 }; + } + namespace REFR_LOCK { inline constexpr REL::ID GetLevel{ 2191019 }; @@ -1783,6 +1797,7 @@ namespace RE::ID inline constexpr REL::ID QueueShowPipboy{ 2229288 }; inline constexpr REL::ID QueueUpdate3D{ 2229234 }; inline constexpr REL::ID QueueWeaponFire{ 2229186 }; + inline constexpr REL::ID TaskUnpackFunc{ 2229323 }; } namespace TerminalHacked @@ -1974,6 +1989,7 @@ namespace RE::ID inline constexpr REL::ID GetFacialBoneMorphIntensity{ 2207416 }; inline constexpr REL::ID SetHairColor{ 2207426 }; inline constexpr REL::ID GetShortName{ 2207405 }; + inline constexpr REL::ID GetXPValue{ 2207384 }; } namespace TESObjectARMO diff --git a/include/RE/L/LOADED_REF_DATA.h b/include/RE/L/LOADED_REF_DATA.h index 9028e47a..c715f355 100644 --- a/include/RE/L/LOADED_REF_DATA.h +++ b/include/RE/L/LOADED_REF_DATA.h @@ -1,5 +1,6 @@ #pragma once +#include "RE/B/BSModelDB.h" #include "RE/N/NiPointer.h" namespace RE @@ -10,13 +11,13 @@ namespace RE { public: // members - void* handleList; // 00 - TODO - NiPointer data3D; // 08 - TESWaterForm* currentWaterType; // 10 - float relevantWaterHeight; // 18 - float cachedRadius; // 1C - std::uint16_t flags; // 20 - std::int16_t underwaterCount; // 22 + BSModelDB::HandelListHead handleList; // 00 + NiPointer data3D; // 08 + TESWaterForm* currentWaterType; // 10 + float relevantWaterHeight; // 18 + float cachedRadius; // 1C + std::uint16_t flags; // 20 + std::int16_t underwaterCount; // 22 }; static_assert(sizeof(LOADED_REF_DATA) == 0x28); } diff --git a/include/RE/L/LockpickingMenu.h b/include/RE/L/LockpickingMenu.h index 28154c62..a136dccb 100644 --- a/include/RE/L/LockpickingMenu.h +++ b/include/RE/L/LockpickingMenu.h @@ -40,6 +40,13 @@ namespace RE return func(a_lockedRef); } + static void DamageLockpick() + { + using func_t = decltype(&LockpickingMenu::DamageLockpick); + static REL::Relocation func{ ID::LockpickingMenu::DamageLockpick }; + return func(); + } + // members NiMatrix3 origPickRotate; // 0E0 NiPoint3 origPickTranslate; // 110 diff --git a/include/RE/P/PlayerCharacter.h b/include/RE/P/PlayerCharacter.h index 4cfc99d9..d23c33cf 100644 --- a/include/RE/P/PlayerCharacter.h +++ b/include/RE/P/PlayerCharacter.h @@ -313,6 +313,13 @@ namespace RE return func(this, a_enable); } + void EnableRadio(bool a_enable) + { + using func_t = decltype(&PlayerCharacter::EnableRadio); + static REL::Relocation func{ ID::PlayerCharacter::EnableRadio }; + return func(this, a_enable); + } + // members BSSpinLock actorToDisplayOnHUDLock; // 628 BSSpinLock questTargetLock; // 630 diff --git a/include/RE/R/REFR_LOCK.h b/include/RE/R/REFR_LOCK.h index fa7cc0c4..501cd232 100644 --- a/include/RE/R/REFR_LOCK.h +++ b/include/RE/R/REFR_LOCK.h @@ -7,6 +7,12 @@ namespace RE class REFR_LOCK { public: + enum class Flags : std::uint8_t + { + kLocked = 0x1, + kLeveled = 0x4 + }; + [[nodiscard]] LOCK_LEVEL GetLockLevel(TESObjectREFR* a_owner) { using func_t = decltype(&REFR_LOCK::GetLockLevel); diff --git a/include/RE/R/RadioManager.h b/include/RE/R/RadioManager.h new file mode 100644 index 00000000..930db61c --- /dev/null +++ b/include/RE/R/RadioManager.h @@ -0,0 +1,28 @@ +#pragma once + +namespace RE +{ + namespace RadioManager + { + inline bool QPlayerRadioEnabled() + { + using func_t = decltype(&RadioManager::QPlayerRadioEnabled); + static REL::Relocation func{ ID::RadioManager::QPlayerRadioEnabled }; + return func(); + } + + inline float QCurrentPlayerFreq() + { + using func_t = decltype(&RadioManager::QCurrentPlayerFreq); + static REL::Relocation func{ ID::RadioManager::QCurrentPlayerFreq }; + return func(); + } + + inline void EnablePlayerRadion(bool a_enable, bool a_playOnOffSound) + { + using func_t = decltype(&RadioManager::EnablePlayerRadion); + static REL::Relocation func{ ID::RadioManager::EnablePlayerRadio }; + return func(a_enable, a_playOnOffSound); + } + } +} diff --git a/include/RE/S/STAGGER_MAGNITUDE.h b/include/RE/S/STAGGER_MAGNITUDE.h new file mode 100644 index 00000000..1b00889b --- /dev/null +++ b/include/RE/S/STAGGER_MAGNITUDE.h @@ -0,0 +1,16 @@ +#pragma once + +namespace RE +{ + enum class STAGGER_MAGNITUDE : std::int32_t + { + kNone = 0x0, + kMagnitudeMin = 0x0, + kSmall = 0x1, + kMedium = 0x2, + kLarge = 0x3, + kExtraLarge = 0x4, + kMagnitudeMax = 0x4, + kCount = 0x5 + }; +} diff --git a/include/RE/T/TESClimate.h b/include/RE/T/TESClimate.h index 4152eb21..348c3e92 100644 --- a/include/RE/T/TESClimate.h +++ b/include/RE/T/TESClimate.h @@ -38,12 +38,6 @@ namespace RE kCount = 0x4 }; - enum class SpellContext - { - kApplyOnLightning = 0x0, - kApplyWhenActive = 0x1 - }; - // members TESModel nightSky; // 20 TESWeatherList weatherList; // 50 diff --git a/include/RE/T/TESEyes.h b/include/RE/T/TESEyes.h index 37ff6b50..cfa80411 100644 --- a/include/RE/T/TESEyes.h +++ b/include/RE/T/TESEyes.h @@ -16,6 +16,13 @@ namespace RE static constexpr auto VTABLE{ VTABLE::TESEyes }; static constexpr auto FORM_ID{ ENUM_FORM_ID::kEYES }; + enum class Flags : std::int8_t + { + kPlayable = 0x1, + kMale = 0x2, + kFemale = 0x4, + }; + // members std::int8_t flags; // 40 }; diff --git a/include/RE/T/TESGrass.h b/include/RE/T/TESGrass.h index edbc951c..a411aae3 100644 --- a/include/RE/T/TESGrass.h +++ b/include/RE/T/TESGrass.h @@ -30,6 +30,13 @@ namespace RE class GRASS_DATA { public: + enum class Flags : std::int8_t + { + kVertexLighting = 0x1, + kUniformScaling = 0x2, + kFitToSlope = 0x4 + }; + // members std::int8_t density; // 00 std::int8_t minSlopeDegrees; // 01 diff --git a/include/RE/T/TESTopicInfo.h b/include/RE/T/TESTopicInfo.h index 9bd458e3..c11d1988 100644 --- a/include/RE/T/TESTopicInfo.h +++ b/include/RE/T/TESTopicInfo.h @@ -96,6 +96,8 @@ namespace RE [[nodiscard]] bool IsRandomEnd() const noexcept { return data.flags.all(TOPIC_INFO_DATA::TOPIC_INFO_FLAGS::kRandomEnd); } [[nodiscard]] bool IsSayOnce() const noexcept { return data.flags.all(TOPIC_INFO_DATA::TOPIC_INFO_FLAGS::kSayOnce); } [[nodiscard]] bool IsStartSceneOnEnd() const noexcept { return data.flags.all(TOPIC_INFO_DATA::TOPIC_INFO_FLAGS::kStartSceneOnEnd); } + [[nodiscard]] bool EndsRunningScene() const noexcept { return data.flags.all(TOPIC_INFO_DATA::TOPIC_INFO_FLAGS::kEndRunningScene); } + [[nodiscard]] bool IsForceGreet() const noexcept { return data.flags.all(TOPIC_INFO_DATA::TOPIC_INFO_FLAGS::kIsForceGreet); } // members TESTopic* parentTopic; // 20 diff --git a/include/RE/T/TaskQueueInterface.h b/include/RE/T/TaskQueueInterface.h index 669018a6..b9131bad 100644 --- a/include/RE/T/TaskQueueInterface.h +++ b/include/RE/T/TaskQueueInterface.h @@ -5,6 +5,7 @@ namespace RE { + class BSPackedTask; class BSPackedTaskQueue; class NiAVObject; @@ -59,6 +60,13 @@ namespace RE return func(this, a_weapon, a_refObject, a_equipIndex, a_ammo); } + void TaskUnpackFunc(const BSPackedTask* a_task) + { + using func_t = decltype(&TaskQueueInterface::TaskUnpackFunc); + static REL::Relocation func{ ID::TaskQueueInterface::TaskUnpackFunc }; + return func(this, a_task); + } + // members BSPackedTaskQueue* queue; // 00 BSPackedTaskQueue* secondaryQueue; // 08 From 96a6df1f8720f61242bbc2335c95752545e3a05c Mon Sep 17 00:00:00 2001 From: FalloutCascadia <54562300+FalloutCascadia@users.noreply.github.com> Date: Sat, 25 Apr 2026 10:59:20 +0200 Subject: [PATCH 2/4] Update RadioManager.h Correct spelling. --- include/RE/R/RadioManager.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/RE/R/RadioManager.h b/include/RE/R/RadioManager.h index 930db61c..e319c31b 100644 --- a/include/RE/R/RadioManager.h +++ b/include/RE/R/RadioManager.h @@ -18,9 +18,9 @@ namespace RE return func(); } - inline void EnablePlayerRadion(bool a_enable, bool a_playOnOffSound) + inline void EnablePlayerRadio(bool a_enable, bool a_playOnOffSound) { - using func_t = decltype(&RadioManager::EnablePlayerRadion); + using func_t = decltype(&RadioManager::EnablePlayerRadio); static REL::Relocation func{ ID::RadioManager::EnablePlayerRadio }; return func(a_enable, a_playOnOffSound); } From 8dcd193d734629cfb5731d6b59fef1283539fab3 Mon Sep 17 00:00:00 2001 From: FalloutCascadia <54562300+FalloutCascadia@users.noreply.github.com> Date: Thu, 30 Apr 2026 09:11:02 +0200 Subject: [PATCH 3/4] Update TESTopicInfo.h --- include/RE/T/TESTopicInfo.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/RE/T/TESTopicInfo.h b/include/RE/T/TESTopicInfo.h index c11d1988..e524b49a 100644 --- a/include/RE/T/TESTopicInfo.h +++ b/include/RE/T/TESTopicInfo.h @@ -96,7 +96,7 @@ namespace RE [[nodiscard]] bool IsRandomEnd() const noexcept { return data.flags.all(TOPIC_INFO_DATA::TOPIC_INFO_FLAGS::kRandomEnd); } [[nodiscard]] bool IsSayOnce() const noexcept { return data.flags.all(TOPIC_INFO_DATA::TOPIC_INFO_FLAGS::kSayOnce); } [[nodiscard]] bool IsStartSceneOnEnd() const noexcept { return data.flags.all(TOPIC_INFO_DATA::TOPIC_INFO_FLAGS::kStartSceneOnEnd); } - [[nodiscard]] bool EndsRunningScene() const noexcept { return data.flags.all(TOPIC_INFO_DATA::TOPIC_INFO_FLAGS::kEndRunningScene); } + [[nodiscard]] bool IsEndRunningScene() const noexcept { return data.flags.all(TOPIC_INFO_DATA::TOPIC_INFO_FLAGS::kEndRunningScene); } [[nodiscard]] bool IsForceGreet() const noexcept { return data.flags.all(TOPIC_INFO_DATA::TOPIC_INFO_FLAGS::kIsForceGreet); } // members From cea61edaef7b853b0f3bae43bf861520934e060f Mon Sep 17 00:00:00 2001 From: FalloutCascadia <54562300+FalloutCascadia@users.noreply.github.com> Date: Thu, 30 Apr 2026 09:11:30 +0200 Subject: [PATCH 4/4] Update DetectionFormulaData.h --- include/RE/D/DetectionFormulaData.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/RE/D/DetectionFormulaData.h b/include/RE/D/DetectionFormulaData.h index e97eb96f..107af963 100644 --- a/include/RE/D/DetectionFormulaData.h +++ b/include/RE/D/DetectionFormulaData.h @@ -35,7 +35,7 @@ namespace RE float visualDetectionLevel; // 5C float soundDetectionLevel; // 60 bool LOS; // 64 - bool _360LOS; // 65 + bool LOS360; // 65 bool exterior; // 66 bool alert; // 67 bool sleeping; // 68