docs: add plugin setup guide

This commit is contained in:
2026-05-30 18:33:24 +12:00
parent f3db41c402
commit b61043a3fe
1776 changed files with 122386 additions and 2 deletions
@@ -0,0 +1,17 @@
#pragma once
namespace RE
{
class PACKAGE_DATA
{
public:
// members
std::uint32_t packFlags; // 0
std::int8_t packType; // 4
std::int8_t interruptOverrideType; // 5
std::int8_t maxSpeed; // 6
std::uint16_t foBehaviorFlags; // 8
std::uint16_t packageSpecificFlags; // A
};
static_assert(sizeof(PACKAGE_DATA) == 0xC);
}
@@ -0,0 +1,38 @@
#pragma once
namespace RE
{
enum class PACKAGE_OBJECT_TYPE : std::int32_t
{
kNone = 0x0,
kActi = 0x1,
kArmo = 0x2,
kBook = 0x3,
kCont = 0x4,
kDoor = 0x5,
kIngr = 0x6,
kLigh = 0x7,
kMisc = 0x8,
kFlor = 0x9,
kFurn = 0xA,
kWeap = 0xB,
kAmmo = 0xC,
kKeym = 0xD,
kAlch = 0xE,
kFood = 0xF,
kClot = 0x10,
kWear = 0x11,
kWeapNone = 0x12,
kWeapMelee = 0x13,
kWeapRanged = 0x14,
kSpell = 0x15,
kSpellRanged = 0x16,
kSpellTouch = 0x17,
kSpellSelf = 0x18,
kActor = 0x19,
kFurnBed = 0x1A,
kFurnChair = 0x1B,
kShout = 0x1C,
kHeadtrack = 0x1D,
};
}
@@ -0,0 +1,13 @@
#pragma once
namespace RE
{
enum class PACK_EVENT_ACTION_TYPE
{
kBegin = 0x0,
kEnd = 0x1,
kChange = 0x2,
kPatrol = 0x3,
kTotal = 0x4
};
}
@@ -0,0 +1,17 @@
#pragma once
namespace RE
{
class PACK_SCHED_DATA
{
public:
// members
std::int8_t month; // 0
std::int8_t dayOfWeek; // 1
std::int8_t date; // 2
std::int8_t hour; // 3
std::int8_t min; // 4
std::int32_t duration; // 8
};
static_assert(sizeof(PACK_SCHED_DATA) == 0xC);
}
@@ -0,0 +1,44 @@
#pragma once
#include "RE/N/NiPoint3.h"
namespace RE
{
class PART_DATA
{
public:
// members
float damageMult; // 00
BGSDebris* explosionGenericDebris; // 08
BGSExplosion* explosion; // 10
float explosionGenericDebrisScale; // 18
BGSDebris* dismemberGenericDebris; // 20
BGSExplosion* dismemberExplosion; // 28
float dismemberGenericDebrisScale; // 30
BGSDebris* onCrippleGenericDebris; // 38
BGSExplosion* onCrippleExplosion; // 40
float onCrippleGenericDebrisScale; // 48
NiPoint3 goreTranslate; // 4C
NiPoint3 goreRotate; // 58
BGSImpactDataSet* dismemberImpactDataSet; // 68
BGSImpactDataSet* explosionImpactDataSet; // 70
BGSImpactDataSet* onCrippleImpactDataSet; // 78
ActorValueInfo* actorValue; // 80
BGSArtObject* artObject; // 88
float explosionSpecialDebrisScale; // 90
std::uint8_t flags; // 94
std::uint8_t type; // 95
std::uint8_t healthPercent; // 96
std::uint8_t toHitChance; // 97
std::uint8_t explosionChance; // 98
std::uint8_t nonLethalDismembermentChance; // 99
std::uint8_t dismemberGenericDebrisCount; // 9A
std::uint8_t onCrippleGenericDebrisCount; // 9B
std::uint8_t explosionGenericDebrisCount; // 9C
std::uint8_t dismemberDecalCount; // 9D
std::uint8_t onCrippleDecalCount; // 9E
std::uint8_t explosionDecalCount; // 9F
std::uint8_t geometrySegmentIndex; // A0
};
static_assert(sizeof(PART_DATA) == 0xA8);
}
@@ -0,0 +1,12 @@
#pragma once
namespace RE
{
class PATH_DATA
{
public:
// members
std::int8_t flags; // 0
};
static_assert(sizeof(PATH_DATA) == 0x1);
}
@@ -0,0 +1,12 @@
#pragma once
namespace RE
{
enum class PC_GAMEPAD_TYPE : std::int32_t
{
kDirectX = 0x0,
kOrbis = 0x1,
kTotal
};
}
@@ -0,0 +1,10 @@
namespace RE
{
enum class PERK_ENTRY_TYPE
{
kQuest = 0x0,
kAbility = 0x1,
kEntryPoint = 0x2,
kTotal = 0x3
};
}
@@ -0,0 +1,13 @@
#pragma once
namespace RE
{
enum class PIPBOY_PAGES : std::int32_t
{
kStat = 0x0,
kInv = 0x1,
kData = 0x2,
kMap = 0x3,
kRadio = 0x4
};
}
@@ -0,0 +1,24 @@
#pragma once
namespace RE
{
enum class PLAYER_ACTION : std::int32_t
{
kNone = 0x0,
kSwingMeleeWeapon = 0x1,
kCastProjectileSpell = 0x2,
kShootBow = 0x3,
kZKeyObject = 0x4,
kJumping = 0x5,
kKnockingOverObjects = 0x6,
kStandOnTableChair = 0x7,
kIronSights = 0x8,
kDestroyObject = 0x9,
kLockedObject = 0xA,
kPickpocket = 0xB,
kCastSelfSpell = 0xC,
kShout = 0xD,
kActorCollision = 0xE,
kInvalidMarker = 0x10,
};
}
@@ -0,0 +1,34 @@
#pragma once
#include "RE/B/BSPointerHandle.h"
#include "RE/N/NiPoint3.h"
namespace RE
{
class DoorTeleportData;
class PLAYER_TARGET_LOC
{
public:
using ArrivalFunc_t = void(void*);
// members
TESWorldSpace* world; // 00
TESObjectCELL* interior; // 08
DoorTeleportData* transitionTel; // 10
NiPoint3 location; // 18
NiPoint3 angle; // 24
TESObjectREFR* walkThroughDoor; // 30
ArrivalFunc_t* arrivalFunc; // 38
void* arrivalFuncData; // 40
ObjectRefHandle furnitureRef; // 48
ObjectRefHandle fastTravelMarker; // 4C
float fastTravelDist; // 50
bool resetWeather; // 54
bool allowAutoSave; // 55
bool preventLoadMenu; // 56
bool skyTransition; // 57
bool isValid; // 58
};
static_assert(sizeof(PLAYER_TARGET_LOC) == 0x60);
}
@@ -0,0 +1,11 @@
#pragma once
namespace RE
{
enum class POWER_ARMOR_HUD_VISIBILITY_RULE : std::int32_t
{
kIgnoresPAHUDVisibility = 0x0,
kOnlyWithPAHUDVisible = 0x1,
kOnlyWithPAHUDNotVisible = 0x2
};
}
@@ -0,0 +1,54 @@
#pragma once
namespace RE
{
enum class PTYPE : std::int32_t
{
kExplore = 0x0,
kFollow = 0x1,
kEscore = 0x2,
kEat = 0x3,
kSleep = 0x4,
kWander = 0x5,
kTravel = 0x6,
kAccompany = 0x7,
kUseItemAt = 0x8,
kAmbush = 0x9,
kFleeNonCombat = 0xA,
kCastMagic = 0xB,
kSandbox = 0xC,
kPatrol = 0xD,
kGuard = 0xE,
kDialogue = 0xF,
kUseWeapon = 0x10,
kFind = 0x11,
kCustom = 0x12,
kTemplate = 0x13,
kActivate = 0x14,
kAlarm = 0x15,
kFlee = 0x16,
kTrespass = 0x17,
kSpectator = 0x18,
kGreet = 0x19,
kGetUp = 0x1A,
kDoNothing = 0x1B,
kInGameDialogue = 0x1C,
kSurface = 0x1D,
kSearchForAttacker = 0x1E,
kAvoidReference = 0x1F,
kBumpReaction = 0x20,
kGrenadeMineReaction = 0x21,
kStealWarning = 0x22,
kPickpocketWarning = 0x23,
kMovementBlocked = 0x24,
kVampireFeed = 0x25,
kCannibal = 0x26,
kLand = 0x27,
kUnused = 0x28,
kMountActor = 0x29,
kDismountActor = 0x2A,
kClearMountPosition = 0x2B,
kClearPowerArmorExit = 0x2C,
kCount = 0x2D
};
}
@@ -0,0 +1,17 @@
#pragma once
#include "RE/B/BGSTopicSubtypeUnion.h"
#include "RE/P/PACK_EVENT_ACTION_TYPE.h"
namespace RE
{
class PackageEventAction
{
public:
// members
TESIdleForm* idle; // 00
REX::TEnumSet<PACK_EVENT_ACTION_TYPE, std::int32_t> type; // 08
BGSTopicSubtypeUnion topicSubtypeUnion; // 0C
};
static_assert(sizeof(PackageEventAction) == 0x18);
}
@@ -0,0 +1,14 @@
#pragma once
#include "RE/B/BSSimpleList.h"
namespace RE
{
class PackageList
{
public:
// members
BSSimpleList<TESPackage*> listPackages;
};
static_assert(sizeof(PackageList) == 0x10);
}
@@ -0,0 +1,18 @@
#pragma once
namespace RE
{
namespace PackageNS
{
enum class CRIME_TYPE
{
kSteal = 0x0,
kPickpocket = 0x1,
kTrespass = 0x2,
kAttack = 0x3,
kMurder = 0x4,
kEscape = 0x5,
kUnused = 0x6
};
}
}
@@ -0,0 +1,14 @@
#pragma once
#include "RE/P/PACK_SCHED_DATA.h"
namespace RE
{
class PackageSchedule
{
public:
// members
PACK_SCHED_DATA psData; // 0
};
static_assert(sizeof(PackageSchedule) == 0xC);
}
@@ -0,0 +1,14 @@
#pragma once
namespace RE
{
struct ParentSpaceNode
{
public:
// members
bool worldspace; // 00
TESWorldSpace* worldSpace; // 08
TESObjectCELL* interiorCell; // 10
};
static_assert(sizeof(ParentSpaceNode) == 0x18);
}
@@ -0,0 +1,34 @@
#pragma once
#include "RE/R/Rumble.h"
#include "RE/S/StartMenuBase.h"
namespace RE
{
class __declspec(novtable) PauseMenu :
public StartMenuBase // 00
{
public:
static constexpr auto RTTI{ RTTI::PauseMenu };
static constexpr auto VTABLE{ VTABLE::PauseMenu };
static constexpr auto MENU_NAME{ "PauseMenu"sv };
// members
std::unique_ptr<BSGFxShaderFXTarget> helpTopicList; // 228
std::unique_ptr<BSGFxShaderFXTarget> helpPanelBrackets; // 230
std::unique_ptr<BSGFxShaderFXTarget> helpListBrackets; // 238
std::unique_ptr<BSGFxShaderFXTarget> helpText; // 240
std::unique_ptr<BSGFxShaderFXTarget> helpTitleText; // 248
std::unique_ptr<BSGFxShaderFXTarget> helpScrollUp; // 250
std::unique_ptr<BSGFxShaderFXTarget> helpScrollDown; // 258
Rumble::AutoRumblePause rumbleLock; // 260
bool hideScreen3D; // 261
bool modMenuShaderWasEnabled; // 262
bool vatsWasEnabled; // 263
bool vatsDepthTestMask; // 264
bool quitToMainMenuQueued; // 265
bool quitToDesktopQueued; // 266
bool noProfileSelected; // 267
};
static_assert(sizeof(PauseMenu) == 0x268);
}
@@ -0,0 +1,16 @@
#pragma once
namespace RE
{
namespace PerkAdded
{
class Event
{
public:
const Actor* adder;
const BGSPerk* perk;
std::uint8_t rank;
};
static_assert(sizeof(Event) == 0x18);
}
}
@@ -0,0 +1,16 @@
#pragma once
namespace RE
{
class PerkData
{
public:
// members
bool trait; // 0
std::int8_t level; // 1
std::int8_t numRanks; // 2
bool playable; // 3
bool hidden; // 4
};
static_assert(sizeof(PerkData) == 0x5);
}
@@ -0,0 +1,30 @@
#pragma once
#include "RE/B/BSTEvent.h"
namespace RE
{
class PerkPointIncreaseEvent
{
private:
using EventSource_t = BSTGlobalEvent::EventSource<PerkPointIncreaseEvent>;
public:
PerkPointIncreaseEvent(std::uint8_t a_perkCount) :
perkCount(a_perkCount)
{}
[[nodiscard]] static EventSource_t* GetEventSource()
{
static REL::Relocation<EventSource_t**> singleton{ ID::PerkPointIncreaseEvent::GetEventSource };
if (!*singleton) {
*singleton = new EventSource_t(&BSTGlobalEvent::GetSingleton()->eventSourceSDMKiller);
}
return *singleton;
}
// members
std::uint8_t perkCount{ 0 }; // 00
};
static_assert(sizeof(PerkPointIncreaseEvent) == 0x1);
}
@@ -0,0 +1,21 @@
#pragma once
#include "RE/M/MemoryManager.h"
namespace RE
{
class PerkRankData
{
public:
PerkRankData(BGSPerk* a_perk, std::int8_t a_rank) :
perk(a_perk), currentRank(a_rank)
{}
F4_HEAP_REDEFINE_NEW(PerkRankData);
// members
BGSPerk* perk; // 00
std::int8_t currentRank; // 08
};
static_assert(sizeof(PerkRankData) == 0x10);
}
@@ -0,0 +1,14 @@
#pragma once
namespace RE
{
namespace PerkUtilities
{
inline void RemoveGrenadeTrajectory()
{
using func_t = decltype(&RemoveGrenadeTrajectory);
static REL::Relocation<func_t> func{ ID::PerkUtilities::RemoveGrenadeTrajectory };
return func();
}
}
}
@@ -0,0 +1,37 @@
#pragma once
#include "RE/B/BSPointerHandle.h"
namespace RE
{
class BGSPerkEntry;
namespace PerkValueEvents
{
enum class Type : std::int32_t
{
kAdd = 0x0,
kRemove = 0x1
};
class PerkValueChangedEvent
{
public:
// members
Type changeType; // 00
ActorHandle owner; // 04
BGSPerk* perk; // 08
std::uint8_t rank; // 10
};
static_assert(sizeof(PerkValueChangedEvent) == 0x18);
class PerkEntryUpdatedEvent
{
public:
// members
ActorHandle owner; // 00
BGSPerkEntry* perkEntry; // 08
};
static_assert(sizeof(PerkEntryUpdatedEvent) == 0x10);
}
}
@@ -0,0 +1,15 @@
#pragma once
namespace RE
{
class BSRenderPass;
class PersistentPassList
{
public:
// members
BSRenderPass* head; // 00
BSRenderPass* tail; // 08
};
static_assert(sizeof(PersistentPassList) == 0x10);
}
@@ -0,0 +1,23 @@
#pragma once
#include "RE/B/BSTArray.h"
#include "RE/B/BSTHashMap.h"
#include "RE/P/PipboyValue.h"
namespace RE
{
class PipboyArray :
public PipboyValue // 00
{
public:
static constexpr auto RTTI{ RTTI::PipboyArray };
static constexpr auto VTABLE{ VTABLE::PipboyArray };
// members
BSTArray<PipboyValue*> elements; // 18
BSTSet<std::uint32_t> addedElementIDs; // 30
BSTArray<std::uint32_t> removedElementIDs; // 60
bool newlyCreated; // 78
};
static_assert(sizeof(PipboyArray) == 0x80);
}
@@ -0,0 +1,32 @@
#pragma once
namespace RE
{
class PipboyCommandResult;
class __declspec(novtable) PipboyCommand
{
public:
static constexpr auto RTTI{ RTTI::PipboyCommand };
static constexpr auto VTABLE{ VTABLE::PipboyCommand };
PipboyCommand(std::uint32_t a_id) :
id(a_id)
{
REX::EMPLACE_VTABLE(this);
}
// add
virtual ~PipboyCommand(); // 00
virtual void Init(Json::Value* a_json) = 0; // 01
virtual const PipboyCommandResult* DoValidate(); // 02
virtual const PipboyCommandResult* DoExecute(); // 03
// members
const std::uint32_t id; // 0x08
const PipboyCommandResult* validationResult{ nullptr }; // 0x10
const PipboyCommandResult* executionResult{ nullptr }; // 0x18
bool isReadonOnly{ false }; // 0x20
};
static_assert(sizeof(PipboyCommand) == 0x28);
}
@@ -0,0 +1,27 @@
#pragma once
namespace RE
{
class __declspec(novtable) PipboyCommandResult
{
public:
static constexpr auto RTTI{ RTTI::PipboyCommandResult };
static constexpr auto VTABLE{ VTABLE::PipboyCommandResult };
PipboyCommandResult(std::uint32_t a_commandId, bool a_succeeded, bool a_shouldReply) :
commandId(a_commandId), succeeded(a_succeeded), shouldReply(a_shouldReply)
{
REX::EMPLACE_VTABLE(this);
}
// add
virtual ~PipboyCommandResult(); // 00
virtual void Serialize(Json::Value* a_json) = 0; // 01
// members
const std::uint32_t commandId; // 08
const bool succeeded; // 0C
const bool shouldReply; // 0D
};
static_assert(sizeof(PipboyCommandResult) == 0x10);
}
@@ -0,0 +1,50 @@
#pragma once
#include "RE/B/BSTEvent.h"
namespace RE
{
class PipboyArray;
class PipboyObject;
class PipboyThrottleManager;
class PipboyValue;
class PipboyValueChangedEvent;
class PipboyDataGroup :
public BSTEventSource<PipboyValueChangedEvent> // 00
{
public:
static constexpr auto RTTI{ RTTI::PipboyDataGroup };
static constexpr auto VTABLE{ VTABLE::PipboyDataGroup };
virtual ~PipboyDataGroup() = default; // 00
// override
virtual BSEventNotifyControl ProcessEvent(const PipboyValueChangedEvent& a_event, BSTEventSource<PipboyValueChangedEvent>* a_source); // 01
// add
virtual void Populate(bool a_arg1) = 0; // 02
virtual void DoClearData() = 0; // 03
virtual void DoClearSink() = 0; // 04
void LockDataGroup()
{
using func_t = decltype(&PipboyDataGroup::LockDataGroup);
static REL::Relocation<func_t> func{ ID::PipboyDataGroup::LockDataGroup };
return func(this);
}
void UnlockDataGroup()
{
using func_t = decltype(&PipboyDataGroup::UnlockDataGroup);
static REL::Relocation<func_t> func{ ID::PipboyDataGroup::UnlockDataGroup };
return func(this);
}
// members
REX::W32::CRITICAL_SECTION pipboyDataMutex; // 60
PipboyThrottleManager* throttleManager; // 88
PipboyValue* rootValue; // 90
};
static_assert(sizeof(PipboyDataGroup) == 0x98);
}
@@ -0,0 +1,47 @@
#pragma once
#include "RE/B/BSTSingleton.h"
#include "RE/P/PipboyInventoryData.h"
#include "RE/P/PipboyLogData.h"
#include "RE/P/PipboyMapData.h"
#include "RE/P/PipboyObject.h"
#include "RE/P/PipboyPerksData.h"
#include "RE/P/PipboyPlayerInfoData.h"
#include "RE/P/PipboyQuestData.h"
#include "RE/P/PipboyRadioData.h"
#include "RE/P/PipboySpecialData.h"
#include "RE/P/PipboyStatsData.h"
#include "RE/P/PipboyStatusData.h"
#include "RE/P/PipboyThrottleManager.h"
#include "RE/P/PipboyWorkshopData.h"
namespace RE
{
class _declspec(novtable) PipboyDataManager :
public BSTSingletonSDM<PipboyDataManager> // 00
{
public:
[[nodiscard]] static PipboyDataManager* GetSingleton()
{
static REL::Relocation<PipboyDataManager**> singleton{ ID::PipboyDataManager::Singleton };
return *singleton;
}
// members
PipboyObject rootObject; // 008
PipboyStatsData statsData; // 0A0
PipboySpecialData specialData; // 1D8
PipboyPerksData perksData; // 280
PipboyInventoryData inventoryData; // 358
PipboyQuestData questData; // 4F0
PipboyWorkshopData workshopData; // 5D8
PipboyLogData logData; // 718
PipboyMapData mapData; // 7F0
PipboyRadioData radioData; // A28
PipboyPlayerInfoData playerInfoData; // AD8
PipboyStatusData statusData; // BE0
PipboyDataGroup* dataGroups[11]; // CC0
PipboyThrottleManager throttleManager; // D18
};
static_assert(sizeof(PipboyDataManager) == 0xD48);
}
@@ -0,0 +1,24 @@
#pragma once
#include "RE/H/HolotapeMenu.h"
namespace RE
{
class __declspec(novtable) PipboyHolotapeMenu :
public HolotapeMenu // 00
{
public:
static constexpr auto RTTI{ RTTI::PipboyHolotapeMenu };
static constexpr auto VTABLE{ VTABLE::PipboyHolotapeMenu };
static constexpr auto MENU_NAME{ "PipboyHolotapeMenu"sv };
virtual ~PipboyHolotapeMenu(); // 00
// override (HolotapeMenu)
virtual void ProcessCancel() override; // 14
// members
bool wasPipboyActive; // 108
};
static_assert(sizeof(PipboyHolotapeMenu) == 0x110);
}
@@ -0,0 +1,240 @@
#pragma once
#include "RE/B/BGSInventoryItem.h"
#include "RE/B/BSFixedString.h"
#include "RE/B/BSTArray.h"
#include "RE/B/BSTEvent.h"
#include "RE/B/BSTHashMap.h"
#include "RE/E/ENUM_FORM_ID.h"
#include "RE/I/InventoryInterface.h"
#include "RE/P/PipboyDataGroup.h"
namespace RE
{
namespace ActorEquipManagerEvent
{
class Event;
}
namespace ActorValueEvents
{
class ActorValueChangedEvent;
}
namespace BGSInventoryItemEvent
{
class Event;
}
namespace BGSInventoryListEvent
{
class Event;
}
namespace HolotapeStateChanged
{
class Event;
}
namespace InventoryInterface
{
class FavoriteChangedEvent;
}
namespace FavoriteMgr_Events
{
class ComponentFavoriteEvent;
}
namespace PerkValueEvents
{
class PerkValueChangedEvent;
class PerkEntryUpdatedEvent;
}
namespace PlayerDifficultySettingChanged
{
class Event;
}
class PipboyInventoryData :
public PipboyDataGroup, // 00
public BSTEventSink<BGSInventoryListEvent::Event>, // 98
public BSTEventSink<ActorEquipManagerEvent::Event>, // A0
public BSTEventSink<ActorValueEvents::ActorValueChangedEvent>, // A8
public BSTEventSink<PerkValueEvents::PerkEntryUpdatedEvent>, // B0
public BSTEventSink<PerkValueEvents::PerkValueChangedEvent>, // B8
public BSTEventSink<InventoryInterface::FavoriteChangedEvent>, // C0
public BSTEventSink<HolotapeStateChanged::Event>, // C8
public BSTEventSink<BGSInventoryItemEvent::Event>, // D0
public BSTEventSink<FavoriteMgr_Events::ComponentFavoriteEvent>, // D8
public BSTEventSink<PlayerDifficultySettingChanged::Event> // E0
{
public:
static constexpr auto RTTI{ RTTI::PipboyInventoryData };
static constexpr auto VTABLE{ VTABLE::PipboyInventoryData };
virtual ~PipboyInventoryData();
enum class ENTRY_TYPE
{
kInt = 0x0,
kFixedString = 0x1,
kFloat = 0x1
};
enum class ITEM_ICON_ID
{
kNone = 0x1,
kBasicPistol = 0x2,
kLaserPistol = 0x3,
kPlasmaPistol = 0x4,
kShotgun = 0x5,
kBasicRifle = 0x6,
kAssaultRifle = 0x7,
kGaussRifle = 0x8,
kLaserMusket = 0x9,
kLaserRifle = 0xA,
kPlasmaRifle = 0xB,
k1hMelee = 0xC,
k2hMelee = 0xD,
kH2hWeap = 0xE,
kMissileLauncher = 0xF,
kFatman = 0x10,
kMinigun = 0x11,
kGatlingLaser = 0x12,
kCryolator = 0x13,
kFlamer = 0x14,
kFlareGun = 0x15,
kGammaGun = 0x16,
kJunkJet = 0x17,
kRailwayRifle = 0x18,
kSyringer = 0x19,
kBroadsider = 0x1A,
kAlienBlaster = 0x1B,
kRipper = 0x1C,
kShishkebab = 0x1D,
kThrownWeap = 0x1E,
kExplosiveMine = 0x1F,
kBottlecapMine = 0x20,
kCryoMine = 0x21,
kCryoGrenade = 0x22,
kPlasmaMine = 0x23,
kPlasmaGrenade = 0x24,
kPulseMine = 0x25,
kPulseGrenade = 0x26,
kMolotov = 0x27,
kNukaGrenade = 0x28,
kRepairKit = 0x29,
kSurgeryKit = 0x2A,
kArmor = 0x2B,
kGloves = 0x2C,
kHelmet = 0x2D,
kBook = 0x2E,
kClothes = 0x2F,
kAmmo = 0x30,
kAdrenaline = 0x31,
kDisease = 0x32,
kSleep = 0x33,
kHunger = 0x34,
kThirst = 0x35,
kChems = 0x36,
kStimpak = 0x37,
kFood = 0x38,
kAlcohol = 0x39,
kStealthBoy = 0x3A,
kUnknown = 0x3B,
kMax = 0x3B
};
enum class SORT_ON_FIELD
{
kAlphabetically = 0x0,
kDamage = 0x1,
kRof = 0x2,
kRange = 0x3,
kAccuracy = 0x4,
kValue = 0x5,
kWeight = 0x6
};
class StackEntry
{
public:
// members
PipboyObject* linkedObject; // 00
const InventoryInterface::Handle inventoryHandle; // 08
};
static_assert(sizeof(StackEntry) == 0x10);
class ItemEntry
{
public:
// members
void* stackEntries; // 00 - BSTList<PipboyInventoryData::StackEntry*>
};
static_assert(sizeof(ItemEntry) == 0x8);
// override
virtual BSEventNotifyControl ProcessEvent(const PipboyValueChangedEvent& a_event, BSTEventSource<PipboyValueChangedEvent>* a_source); // 01
// add
virtual BSEventNotifyControl ProcessEvent(const BGSInventoryListEvent::Event& a_event, BSTEventSource<BGSInventoryListEvent::Event>* a_source); // 02
virtual BSEventNotifyControl ProcessEvent(const ActorEquipManagerEvent::Event& a_event, BSTEventSource<ActorEquipManagerEvent::Event>* a_source); // 03
virtual BSEventNotifyControl ProcessEvent(const ActorValueEvents::ActorValueChangedEvent& a_event, BSTEventSource<ActorValueEvents::ActorValueChangedEvent>* a_source); // 04
virtual BSEventNotifyControl ProcessEvent(const PerkValueEvents::PerkEntryUpdatedEvent& a_event, BSTEventSource<PerkValueEvents::PerkEntryUpdatedEvent>* a_source); // 05
virtual BSEventNotifyControl ProcessEvent(const PerkValueEvents::PerkValueChangedEvent& a_event, BSTEventSource<PerkValueEvents::PerkValueChangedEvent>* a_source); // 06
virtual BSEventNotifyControl ProcessEvent(const InventoryInterface::FavoriteChangedEvent& a_event, BSTEventSource<InventoryInterface::FavoriteChangedEvent>* a_source); // 07
virtual BSEventNotifyControl ProcessEvent(const HolotapeStateChanged::Event& a_event, BSTEventSource<HolotapeStateChanged::Event>* a_source); // 08
virtual BSEventNotifyControl ProcessEvent(const BGSInventoryItemEvent::Event& a_event, BSTEventSource<BGSInventoryItemEvent::Event>* a_source); // 09
virtual BSEventNotifyControl ProcessEvent(const FavoriteMgr_Events::ComponentFavoriteEvent& a_event, BSTEventSource<FavoriteMgr_Events::ComponentFavoriteEvent>* a_source); // 0A
virtual BSEventNotifyControl ProcessEvent(const PlayerDifficultySettingChanged::Event& a_event, BSTEventSource<PlayerDifficultySettingChanged::Event>* a_source); // 0B
virtual void Populate(bool a_arg1); // 0C
virtual void DoClearData(); // 0D
virtual void DoClearSink(); // 0E
void AddItemCardInfoEntry(const BSFixedStringCS* a_string, float a_value, PipboyArray* a_itemCardSection)
{
using func_t = decltype(&PipboyInventoryData::AddItemCardInfoEntry);
static REL::Relocation<func_t> func{ ID::PipboyInventoryData::AddItemCardInfoEntry };
return func(this, a_string, a_value, a_itemCardSection);
}
PipboyObject* BaseAddItemCardInfoEntry(const BSFixedStringCS* a_string, PipboyArray* a_itemCardSection)
{
using func_t = decltype(&PipboyInventoryData::BaseAddItemCardInfoEntry);
static REL::Relocation<func_t> func{ ID::PipboyInventoryData::BaseAddItemCardInfoEntry };
return func(this, a_string, a_itemCardSection);
}
void PopulateItemCardInfo(const BGSInventoryItem* a_inventoryItem, const BGSInventoryItem::Stack* a_stack, PipboyObject* a_data)
{
using func_t = decltype(&PipboyInventoryData::PopulateItemCardInfo);
static REL::Relocation<func_t> func{ ID::PipboyInventoryData::PopulateItemCardInfo };
return func(this, a_inventoryItem, a_stack, a_data);
}
void QueueItemCardRepopulate(ENUM_FORM_ID a_formType)
{
using func_t = decltype(&PipboyInventoryData::QueueItemCardRepopulate);
static REL::Relocation<func_t> func{ ID::PipboyInventoryData::QueueItemCardRepopulate };
return func(this, a_formType);
}
void RepopulateItemCardOnSection(ENUM_FORM_ID a_itemTypeID)
{
using func_t = decltype(&PipboyInventoryData::RepopulateItemCardOnSection);
static REL::Relocation<func_t> func{ ID::PipboyInventoryData::RepopulateItemCardOnSection };
return func(this, a_itemTypeID);
}
// members
PipboyObject* inventoryObject; // E8
BSTHashMap<std::uint32_t, PipboyInventoryData::ItemEntry> itemEntries; // F0
BSTHashMap<const BGSComponent*, PipboyObject*> invComponents; // 120
BSTArray<PipboyObject*> sortedItems; // 150
BSTSet<ENUM_FORM_ID> queuedRepopulateCategories; // 168
};
static_assert(sizeof(PipboyInventoryData) == 0x198);
}
@@ -0,0 +1,30 @@
#pragma once
#include "RE/P/PipboySubMenu.h"
namespace RE
{
class __declspec(novtable) PipboyInventoryMenu :
public PipboySubMenu // 00
{
public:
static constexpr auto RTTI{ RTTI::PipboyInventoryMenu };
static constexpr auto VTABLE{ VTABLE::PipboyInventoryMenu };
// override (PipboySubMenu)
void UpdateData() override
{
using func_t = decltype(&PipboyInventoryMenu::UpdateData);
static REL::Relocation<func_t> func{ ID::PipboyInventoryMenu::UpdateData };
return func(this);
}
void SetQuickkey(int a_selectedIndex, int a_quickkeyIndex)
{
using func_t = decltype(&PipboyInventoryMenu::SetQuickkey);
static REL::Relocation<func_t> func{ ID::PipboyInventoryMenu::SetQuickkey };
return func(this, a_selectedIndex, a_quickkeyIndex);
}
};
static_assert(sizeof(PipboyInventoryMenu) == 0x18);
}
@@ -0,0 +1,45 @@
#pragma once
#include "RE/B/BGSInventoryItem.h"
#include "RE/B/BSTArray.h"
#include "RE/B/BSTTuple.h"
namespace RE
{
namespace PipboyInventoryUtils
{
enum class PAPER_DOLL_ARMOR_SLOTS
{
kUnderwear = 0x0,
kLeftLeg = 0x1,
kRightLeg = 0x2,
kLeftArm = 0x3,
kRightArm = 0x4,
kTorso = 0x5,
kHelmet = 0x6,
kGoggles = 0x7,
kGasMask = 0x8
};
inline bool DoSlotsOverlap(const TESObjectARMO* a_armor1, const TESObjectARMO* a_armor2)
{
using func_t = decltype(&DoSlotsOverlap);
static REL::Relocation<func_t> func{ ID::PipboyInventoryUtils::DoSlotsOverlap };
return func(a_armor1, a_armor2);
}
inline void FillDamageTypeInfo(const BGSInventoryItem& a_item, const BGSInventoryItem::Stack* a_stack, BSScrapArray<BSTTuple<std::uint32_t, float>>& a_damageValuesPerType)
{
using func_t = decltype(&FillDamageTypeInfo);
static REL::Relocation<func_t> func{ ID::PipboyInventoryUtils::FillDamageTypeInfo };
return func(a_item, a_stack, a_damageValuesPerType);
}
inline void FillResistTypeInfo(const BGSInventoryItem& a_item, const BGSInventoryItem::Stack* a_stack, BSScrapArray<BSTTuple<std::uint32_t, float>>& a_resistValuesPerType, float a_scale)
{
using func_t = decltype(&FillResistTypeInfo);
static REL::Relocation<func_t> func{ ID::PipboyInventoryUtils::FillResistTypeInfo };
return func(a_item, a_stack, a_resistValuesPerType, a_scale);
}
}
}
@@ -0,0 +1,24 @@
#pragma once
#include "RE/B/BSTEvent.h"
namespace RE
{
class PipboyLightEvent :
public BSTValueEvent<bool>
{
private:
using EventSource_t = BSTGlobalEvent::EventSource<PipboyLightEvent>;
public:
[[nodiscard]] static EventSource_t* GetEventSource()
{
static REL::Relocation<EventSource_t**> singleton{ ID::PipboyLightEvent::GetEventSource };
if (!*singleton) {
*singleton = new EventSource_t(&BSTGlobalEvent::GetSingleton()->eventSourceSDMKiller);
}
return *singleton;
}
};
static_assert(sizeof(PipboyLightEvent) == 0x2);
}
@@ -0,0 +1,33 @@
#pragma once
#include "RE/B/BSFixedString.h"
#include "RE/B/BSTEvent.h"
#include "RE/B/BSTHashMap.h"
#include "RE/P/PipboyDataGroup.h"
namespace RE
{
class TESTrackedStatsEvent;
class __declspec(novtable) PipboyLogData :
public PipboyDataGroup, // 00
public BSTEventSink<TESTrackedStatsEvent> // 98
{
public:
static constexpr auto RTTI{ RTTI::PipboyLogData };
static constexpr auto VTABLE{ VTABLE::PipboyLogData };
virtual ~PipboyLogData() = default; // 00
virtual BSEventNotifyControl ProcessEvent(const TESTrackedStatsEvent& a_event, BSTEventSource<TESTrackedStatsEvent>* a_source); // 01
virtual void Populate(bool a_arg1) override; // 02
virtual void DoClearData() override; // 03
virtual void DoClearSink() override; // 04
// members
PipboyArray* statTypeArray; // A0
BSTHashMap<BSFixedString, PipboyObject*> statMap; // A8
};
static_assert(sizeof(PipboyLogData) == 0xD8);
}
@@ -0,0 +1,23 @@
#pragma once
#include "RE/P/PipboySubMenu.h"
namespace RE
{
class __declspec(novtable) PipboyLogMenu :
public PipboySubMenu // 00
{
public:
static constexpr auto RTTI{ RTTI::PipboyLogMenu };
static constexpr auto VTABLE{ VTABLE::PipboyLogMenu };
// override (PipboySubMenu)
void UpdateData() override
{
using func_t = decltype(&PipboyLogMenu::UpdateData);
static REL::Relocation<func_t> func{ ID::PipboyLogMenu::UpdateData };
return func(this);
}
};
static_assert(sizeof(PipboyLogMenu) == 0x18);
}
@@ -0,0 +1,262 @@
#pragma once
#include "RE/B/BSFixedString.h"
#include "RE/B/BSInputEventUser.h"
#include "RE/B/BSPointerHandle.h"
#include "RE/B/BSSoundHandle.h"
#include "RE/B/BSTEvent.h"
#include "RE/B/BSTPoint.h"
#include "RE/B/BSTSingleton.h"
#include "RE/I/Inventory3DManager.h"
#include "RE/I/InventoryInterface.h"
#include "RE/I/IsPipboyActiveEvent.h"
#include "RE/N/NiPointer.h"
#include "RE/N/NiRect.h"
#include "RE/P/PipboyRadioController.h"
namespace RE
{
class BSTriShape;
class IMenu;
class BSAnimationGraphEvent;
class __declspec(novtable) PipboyManager :
public BSTEventSink<BSAnimationGraphEvent>, // 00
public BSInputEventUser, // 08
public BSTSingletonSDM<PipboyManager> // 18
{
public:
static constexpr auto RTTI{ RTTI::PipboyManager };
static constexpr auto VTABLE{ VTABLE::PipboyManager };
enum class LOWER_REASON
{
kNone = 0x0,
kBook = 0x1,
kPerkGrid = 0x2,
kInspect = 0x3
};
enum class PipboyScreenEffectTriggerType
{
kPipboyOpen = 0x0,
kTabChange = 0x1,
kCategoryChange = 0x2,
kSmallTransition = 0x3,
kMapChange = 0x4
};
virtual ~PipboyManager(); // 00
// override
virtual BSEventNotifyControl ProcessEvent(const BSAnimationGraphEvent& a_event, BSTEventSource<BSAnimationGraphEvent>* a_source) override; // 01
virtual bool ShouldHandleEvent(const InputEvent*) override; // 02
virtual void OnButtonEvent(const ButtonEvent*) override; // 09
virtual void OnMouseMoveEvent(const MouseMoveEvent*) override; // 07
virtual void OnThumbstickEvent(const ThumbstickEvent*) override; // 05
[[nodiscard]] static PipboyManager* GetSingleton()
{
static REL::Relocation<PipboyManager**> singleton{ ID::PipboyManager::Singleton };
return *singleton;
}
void AddMenuToPipboy(IMenu& a_menu, const NiRect<float>& a_standVP, const NiRect<float>& a_powerVP)
{
using func_t = decltype(&PipboyManager::AddMenuToPipboy);
static REL::Relocation<func_t> func{ ID::PipboyManager::AddMenuToPipboy };
func(this, a_menu, a_standVP, a_powerVP);
}
void ClosedownPipboy()
{
using func_t = decltype(&PipboyManager::ClosedownPipboy);
static REL::Relocation<func_t> func{ ID::PipboyManager::ClosedownPipboy };
func(this);
}
void EnablePipboyShader()
{
using func_t = decltype(&PipboyManager::EnablePipboyShader);
static REL::Relocation<func_t> func{ ID::PipboyManager::EnablePipboyShader };
func(this);
}
void InitPipboy()
{
using func_t = decltype(&PipboyManager::InitPipboy);
static REL::Relocation<func_t> func{ ID::PipboyManager::InitPipboy };
func(this);
}
void LowerPipboy(LOWER_REASON a_reason)
{
using func_t = decltype(&PipboyManager::LowerPipboy);
static REL::Relocation<func_t> func{ ID::PipboyManager::LowerPipboy };
func(this, a_reason);
}
void OnPipboyCloseAnim()
{
using func_t = decltype(&PipboyManager::OnPipboyCloseAnim);
static REL::Relocation<func_t> func{ ID::PipboyManager::OnPipboyCloseAnim };
func(this);
}
void OnPipboyCloseAnimFailed()
{
using func_t = decltype(&PipboyManager::OnPipboyCloseAnimFailed);
static REL::Relocation<func_t> func{ ID::PipboyManager::OnPipboyCloseAnimFailed };
func(this);
}
void OnPipboyClosed()
{
using func_t = decltype(&PipboyManager::OnPipboyClosed);
static REL::Relocation<func_t> func{ ID::PipboyManager::OnPipboyClosed };
func(this);
}
void OnPipboyOpenAnim()
{
using func_t = decltype(&PipboyManager::OnPipboyOpenAnim);
static REL::Relocation<func_t> func{ ID::PipboyManager::OnPipboyOpenAnim };
func(this);
}
void OnPipboyOpenAnimFailed()
{
using func_t = decltype(&PipboyManager::OnPipboyOpenAnimFailed);
static REL::Relocation<func_t> func{ ID::PipboyManager::OnPipboyOpenAnimFailed };
func(this);
}
void OnPipboyOpened()
{
using func_t = decltype(&PipboyManager::OnPipboyOpened);
static REL::Relocation<func_t> func{ ID::PipboyManager::OnPipboyOpened };
func(this);
}
void PlayItemAnimOnClose()
{
using func_t = decltype(&PipboyManager::PlayItemAnimOnClose);
static REL::Relocation<func_t> func{ ID::PipboyManager::PlayItemAnimOnClose };
func(this);
}
void PlayPipboyCloseAnim(bool a_noAnim)
{
using func_t = decltype(&PipboyManager::PlayPipboyCloseAnim);
static REL::Relocation<func_t> func{ ID::PipboyManager::PlayPipboyCloseAnim };
func(this, a_noAnim);
}
void PlayPipboyGenericOpenAnim(const BSFixedString& a_menu, const BSFixedString& a_anim, bool a_noAnim)
{
using func_t = decltype(&PipboyManager::PlayPipboyGenericOpenAnim);
static REL::Relocation<func_t> func{ ID::PipboyManager::PlayPipboyGenericOpenAnim };
func(this, a_menu, a_anim, a_noAnim);
}
void PlayPipboyLoadHolotapeAnim(BGSNote* a_holotape, bool a_noAnim)
{
using func_t = decltype(&PipboyManager::PlayPipboyLoadHolotapeAnim);
static REL::Relocation<func_t> func{ ID::PipboyManager::PlayPipboyLoadHolotapeAnim };
func(this, a_holotape, a_noAnim);
}
void PlayPipboyOpenAnim(const BSFixedString& a_menuName)
{
using func_t = decltype(&PipboyManager::PlayPipboyOpenAnim);
static REL::Relocation<func_t> func{ ID::PipboyManager::PlayPipboyOpenAnim };
func(this, a_menuName);
}
void PlayPipboyOpenTerminalAnim(BGSTerminal* a_terminal)
{
using func_t = decltype(&PipboyManager::PlayPipboyOpenTerminalAnim);
static REL::Relocation<func_t> func{ ID::PipboyManager::PlayPipboyOpenTerminalAnim };
func(this, a_terminal);
}
void ProcessLoweringReason()
{
using func_t = decltype(&PipboyManager::ProcessLoweringReason);
static REL::Relocation<func_t> func{ ID::PipboyManager::ProcessLoweringReason };
func(this);
}
bool QPipboyActive()
{
using func_t = decltype(&PipboyManager::QPipboyActive);
static REL::Relocation<func_t> func{ ID::PipboyManager::QPipboyActive };
return func(this);
}
void RaisePipboy()
{
using func_t = decltype(&PipboyManager::RaisePipboy);
static REL::Relocation<func_t> func{ ID::PipboyManager::RaisePipboy };
func(this);
}
void RefreshPipboyRenderSurface()
{
using func_t = decltype(&PipboyManager::RefreshPipboyRenderSurface);
static REL::Relocation<func_t> func{ ID::PipboyManager::RefreshPipboyRenderSurface };
func(this);
}
void StartAnimationGraphListening()
{
using func_t = decltype(&PipboyManager::StartAnimationGraphListening);
static REL::Relocation<func_t> func{ ID::PipboyManager::StartAnimationGraphListening };
func(this);
}
void StopAnimationGraphListening()
{
using func_t = decltype(&PipboyManager::StopAnimationGraphListening);
static REL::Relocation<func_t> func{ ID::PipboyManager::StopAnimationGraphListening };
func(this);
}
void UpdateCursorConstraint(bool a_enable)
{
using func_t = decltype(&PipboyManager::UpdateCursorConstraint);
static REL::Relocation<func_t> func{ ID::PipboyManager::UpdateCursorConstraint };
func(this, a_enable);
}
// members
BSSoundHandle pipboyHumSound; // 01C
BSTPoint2<float> inputVector; // 024
BSTPoint2<float> newInput; // 02C
NiPointer<BSTriShape> debugModeGeom; // 038
Inventory3DManager inv3DModelManager; // 040
BGSNote* holotapeToLoad; // 180
BGSTerminal* terminalToLoad; // 188
BSFixedString menuToOpen; // 190
BSFixedString openAnimEvent; // 198
BSFixedString closeAnimEvent; // 1A0
REX::TEnumSet<LOWER_REASON, std::int32_t> loweringReason; // 1A8
PipboyRadioController radioController; // 1AC
TESBoundObject* itemAnimOnClose; // 1B0
ObjectRefHandle fastTravelLocation; // 1B8
InventoryInterface::Handle inspectRequestItem; // 1BC
std::uint32_t inspectRequestStack; // 1C0
bool pipboyExamineMode; // 1C4
bool pipboyExamineDirtyFlag; // 1C5
bool pipboyOpening; // 1C6
bool pipboyClosing; // 1C7
BSTValueEventSource<IsPipboyActiveEvent> pipboyActive; // 1C8
bool ignoreOpeningFlag; // 1E0
bool autoSaveOnClose; // 1E1
bool pipboyMenuCloseQueued; // 1E2
bool pipboyRaising; // 1E3
bool wasMotionBlurActive; // 1E4
bool wasPipboyLightActive; // 1E5
};
static_assert(sizeof(PipboyManager) == 0x1F0);
}
@@ -0,0 +1,107 @@
#pragma once
#include "RE/B/BSPointerHandle.h"
#include "RE/B/BSTArray.h"
#include "RE/B/BSTEvent.h"
#include "RE/B/BSTHashMap.h"
#include "RE/N/NiPoint3.h"
#include "RE/P/PipboyDataGroup.h"
namespace RE
{
class BGSActorCellEvent;
class MapMarkerData;
class PlayerUpdateEvent;
class TESLocationClearedEvent;
namespace ActorValueEvents
{
class ActorValueChangedEvent;
}
namespace CustomMarkerUpdate
{
class Event;
}
namespace LocalMapCameraUpdate
{
class Event;
}
namespace LocationMarkerArrayUpdate
{
class Event;
}
namespace PlayerCharacterQuestEvent
{
class Event;
}
namespace TESQuestEvent
{
class Event;
}
namespace TravelMarkerStateChange
{
class Event;
}
class __declspec(novtable) PipboyMapData :
public PipboyDataGroup, // 00
public BSTEventSink<TravelMarkerStateChange::Event>, // 98
public BSTEventSink<PlayerUpdateEvent>, // A0
public BSTEventSink<BGSActorCellEvent>, // A8
public BSTEventSink<TESQuestEvent::Event>, // B0
public BSTEventSink<PlayerCharacterQuestEvent::Event>, // B8
public BSTEventSink<CustomMarkerUpdate::Event>, // C0
public BSTEventSink<LocationMarkerArrayUpdate::Event>, // C8
public BSTEventSink<LocalMapCameraUpdate::Event>, // D0
public BSTEventSink<TESLocationClearedEvent>, // D8
public BSTEventSink<ActorValueEvents::ActorValueChangedEvent> // E0
{
public:
static constexpr auto RTTI{ RTTI::PipboyMapData };
static constexpr auto VTABLE{ VTABLE::PipboyMapData };
virtual ~PipboyMapData() = default;
virtual BSEventNotifyControl ProcessEvent(const TravelMarkerStateChange::Event& a_event, BSTEventSource<TravelMarkerStateChange::Event>* a_source); // 01
virtual BSEventNotifyControl ProcessEvent(const PlayerUpdateEvent& a_event, BSTEventSource<PlayerUpdateEvent>* a_source); // 02
virtual BSEventNotifyControl ProcessEvent(const BGSActorCellEvent& a_event, BSTEventSource<BGSActorCellEvent>* a_source); // 03
virtual BSEventNotifyControl ProcessEvent(const TESQuestEvent::Event& a_event, BSTEventSource<TESQuestEvent::Event>* a_source); // 04
virtual BSEventNotifyControl ProcessEvent(const PlayerCharacterQuestEvent::Event& a_event, BSTEventSource<PlayerCharacterQuestEvent::Event>* a_source); // 05
virtual BSEventNotifyControl ProcessEvent(const CustomMarkerUpdate::Event& a_event, BSTEventSource<CustomMarkerUpdate::Event>* a_source); // 06
virtual BSEventNotifyControl ProcessEvent(const LocationMarkerArrayUpdate::Event& a_event, BSTEventSource<LocationMarkerArrayUpdate::Event>* a_source); // 07
virtual BSEventNotifyControl ProcessEvent(const LocalMapCameraUpdate::Event& a_event, BSTEventSource<LocalMapCameraUpdate::Event>* a_source); // 08
virtual BSEventNotifyControl ProcessEvent(const TESLocationClearedEvent& a_event, BSTEventSource<TESLocationClearedEvent>* a_source); // 09
virtual BSEventNotifyControl ProcessEvent(const ActorValueEvents::ActorValueChangedEvent& a_event, BSTEventSource<ActorValueEvents::ActorValueChangedEvent>* a_source); // 0A
// override
virtual void Populate(bool a_arg1) override; // 0B
virtual void DoClearData() override; // 0C
virtual void DoClearSink() override; // 0D
// members
PipboyObject* mapObject; // E8
BSTHashMap<const MapMarkerData*, PipboyObject*> travelLocationsMarkers; // F0
BSTHashMap<std::uint32_t, ObjectRefHandle> travelLocationRefrHandles; // 120
BSTArray<PipboyObject*> doorMarkers; // 150
BSTArray<ObjectRefHandle> doorRefHandles; // 168
BSTHashMap<ObjectRefHandle, PipboyObject*> localQuestMarkers; // 180
BSTHashMap<ObjectRefHandle, PipboyObject*> worldQuestMarkers; // 1B0
NiPoint3 playerLastLocationPosition; // 1E0
NiPoint3 playerLastWorldPosition; // 1EC
PipboyObject* localPlayerMarker; // 1F8
PipboyObject* worldPlayerMarker; // 200
PipboyObject* localCustomMarker; // 208
PipboyObject* worldCustomMarker; // 210
PipboyObject* localPowerArmorMarker; // 218
PipboyObject* worldPowerArmorMarker; // 220
PipboyObject* worldMapExtents; // 230
PipboyObject* localMapExtents; // 238
};
static_assert(sizeof(PipboyMapData) == 0x238);
}
@@ -0,0 +1,33 @@
#pragma once
#include "RE/B/BSScaleformExternalTexture.h"
#include "RE/P/PipboySubMenu.h"
namespace RE
{
class __declspec(novtable) PipboyMapMenu :
public PipboySubMenu // 00
{
public:
static constexpr auto RTTI{ RTTI::PipboyMapMenu };
static constexpr auto VTABLE{ VTABLE::PipboyMapMenu };
// override (PipboySubMenu)
void UpdateData() override
{
using func_t = decltype(&PipboyMapMenu::UpdateData);
static REL::Relocation<func_t> func{ ID::PipboyMapMenu::UpdateData };
return func(this);
}
// members
BSScaleformExternalTexture worldMapTexture; // 18
Scaleform::GFx::Value mapPageObj; // 30
std::uint32_t centeredQuestMarkerID; // 50
std::uint32_t centeredMapMarkerID; // 54
std::uint32_t queuedFastTravelId; // 58
bool mapTexturesSentToMenu; // 5C
bool requestedDelayedLocalMapRender; // 5D
};
static_assert(sizeof(PipboyMapMenu) == 0x60);
}
@@ -0,0 +1,57 @@
#pragma once
#include "RE/B/BSTEvent.h"
#include "RE/G/GameMenuBase.h"
#include "RE/P/PipboyInventoryMenu.h"
#include "RE/P/PipboyLogMenu.h"
#include "RE/P/PipboyMapMenu.h"
#include "RE/P/PipboyPerksMenu.h"
#include "RE/P/PipboyPlayerInfoMenu.h"
#include "RE/P/PipboyQuestMenu.h"
#include "RE/P/PipboyRadioMenu.h"
#include "RE/P/PipboySpecialMenu.h"
#include "RE/P/PipboyStatsMenu.h"
#include "RE/P/PipboyWorkshopMenu.h"
namespace RE
{
class IdleInputEvent;
class MenuOpenCloseEvent;
class __declspec(novtable) PipboyMenu :
public GameMenuBase, // 000
public BSTEventSink<MenuOpenCloseEvent>, // 0E0
public BSTEventSink<IdleInputEvent> // 0E8
{
public:
static constexpr auto RTTI{ RTTI::PipboyMenu };
static constexpr auto VTABLE{ VTABLE::PipboyMenu };
static constexpr auto MENU_NAME{ "PipboyMenu"sv };
void RefreshMapMarkers(std::uint32_t a_markerID)
{
using func_t = decltype(&PipboyMenu::RefreshMapMarkers);
static REL::Relocation<func_t> func{ ID::PipboyMenu::RefreshMapMarkers };
return func(this, a_markerID);
}
// members
Scaleform::GFx::Value dataObj; // 0F0
PipboyStatsMenu statsMenuObj; // 110
PipboySpecialMenu specialMenuObj; // 130
PipboyPerksMenu perksMenuObj; // 148
PipboyInventoryMenu inventoryMenuObj; // 160
PipboyQuestMenu questMenuObj; // 178
PipboyWorkshopMenu workshopMenuObj; // 190
PipboyLogMenu logMenuObj; // 1A8
PipboyMapMenu mapMenuObj; // 1C0
PipboyRadioMenu radioMenuObj; // 220
PipboyPlayerInfoMenu playerInfoMenuObj; // 240
std::int8_t disableInputCounter; // 258
bool pipboyCursorEnabled; // 259
bool showingModalMessage; // 25A
bool pipboyHiddenByAnotherMenu; // 25B
bool performFastTravelCheck; // 25C
};
static_assert(sizeof(PipboyMenu) == 0x260);
}
@@ -0,0 +1,46 @@
#pragma once
#include "RE/B/BSFixedString.h"
#include "RE/B/BSTArray.h"
#include "RE/B/BSTHashMap.h"
#include "RE/P/PipboyValue.h"
namespace RE
{
class __declspec(novtable) PipboyObject :
public PipboyValue
{
public:
static constexpr auto RTTI{ RTTI::PipboyObject };
static constexpr auto VTABLE{ VTABLE::PipboyObject };
virtual ~PipboyObject(); // 00
// override
virtual void CleanDirtyToGame() override; // 01
virtual void Serialize(Json::Value* a_json) override; // 02
virtual void SerializeChanges(BSBinarySerializer& a_serializer, bool a_fullSerialize) override; // 03
virtual SERIALIZATION_DATA_TYPE GetType() override; // 04
template <typename T>
T GetMember(const BSFixedString& a_name)
{
const auto it = memberMap.find(a_name);
return (it != memberMap.end()) ? static_cast<T>(it->second) : nullptr;
}
void AddMember(const BSFixedString* a_name, PipboyValue* a_member)
{
using func_t = decltype(&PipboyObject::AddMember);
static REL::Relocation<func_t> func{ ID::PipboyObject::AddMember };
return func(this, a_name, a_member);
}
// members
BSTHashMap<BSFixedString, PipboyValue*> memberMap; // 18
BSTSet<std::uint32_t> addedMemberIDs; // 48
BSTArray<std::uint32_t> removedMemberIDs; // 78
bool newlyCreated; // 90
};
static_assert(sizeof(PipboyObject) == 0x98);
}
@@ -0,0 +1,36 @@
#pragma once
#include "RE/B/BSTArray.h"
#include "RE/B/BSTEvent.h"
#include "RE/P/PipboyDataGroup.h"
namespace RE
{
namespace PerkValueEvents
{
class PerkValueChangedEvent;
}
class __declspec(novtable) PipboyPerksData :
public PipboyDataGroup, // 00
public BSTEventSink<PerkValueEvents::PerkValueChangedEvent> // 98
{
public:
static constexpr auto RTTI{ RTTI::PipboyPerksData };
static constexpr auto VTABLE{ VTABLE::PipboyPerksData };
virtual ~PipboyPerksData() = default;
virtual BSEventNotifyControl ProcessEvent(const PerkValueEvents::PerkValueChangedEvent& a_event, BSTEventSource<PerkValueEvents::PerkValueChangedEvent>* a_source); // 01
// override
virtual void Populate(bool a_arg1) override; // 02
virtual void DoClearData() override; // 03
virtual void DoClearSink() override; // 04
PipboyArray* perkChains; // A0
BSTArray<const BGSPerk*> perkChainRoots; // A8
BSTArray<PipboyObject*> perksArray; // C0
};
static_assert(sizeof(PipboyPerksData) == 0xD8);
}
@@ -0,0 +1,23 @@
#pragma once
#include "RE/P/PipboySubMenu.h"
namespace RE
{
class __declspec(novtable) PipboyPerksMenu :
public PipboySubMenu // 00
{
public:
static constexpr auto RTTI{ RTTI::PipboyPerksMenu };
static constexpr auto VTABLE{ VTABLE::PipboyPerksMenu };
// override (PipboySubMenu)
void UpdateData() override
{
using func_t = decltype(&PipboyPerksMenu::UpdateData);
static REL::Relocation<func_t> func{ ID::PipboyPerksMenu::UpdateData };
return func(this);
}
};
static_assert(sizeof(PipboyPerksMenu) == 0x18);
}
@@ -0,0 +1,118 @@
#pragma once
#include "RE/B/BSTEvent.h"
#include "RE/P/PipboyDataGroup.h"
namespace RE
{
class PerkPointIncreaseEvent;
class PlayerUpdateEvent;
namespace ActorEquipManagerEvent
{
class Event;
}
namespace ActorValueEvents
{
class ActorValueChangedEvent;
}
namespace BGSInventoryItemEvent
{
class Event;
}
namespace BGSInventoryListEvent
{
class Event;
}
namespace HourPassed
{
class Event;
}
namespace LevelIncrease
{
class Event;
}
namespace PerkValueEvents
{
class PerkEntryUpdatedEvent;
}
namespace PlayerActiveEffectChanged
{
class Event;
}
namespace PlayerCharacterQuestEvent
{
class Event;
}
namespace PlayerDifficultySettingChanged
{
class Event;
}
namespace SPECIALMenuEvent
{
class NameChangedEvent;
}
class __declspec(novtable) PipboyPlayerInfoData :
public PipboyDataGroup, // 00
public BSTEventSink<ActorValueEvents::ActorValueChangedEvent>, // 98
public BSTEventSink<BGSInventoryListEvent::Event>, // A0
public BSTEventSink<ActorEquipManagerEvent::Event>, // A8
public BSTEventSink<LevelIncrease::Event>, // B0
public BSTEventSink<PerkPointIncreaseEvent>, // B8
public BSTEventSink<PerkValueEvents::PerkEntryUpdatedEvent>, // C0
public BSTEventSink<HourPassed::Event>, // C8
public BSTEventSink<SPECIALMenuEvent::NameChangedEvent>, // D0
public BSTEventSink<PlayerUpdateEvent>, // D8
public BSTEventSink<BGSInventoryItemEvent::Event>, // E0
public BSTEventSink<PlayerActiveEffectChanged::Event>, // E8
public BSTEventSink<PlayerCharacterQuestEvent::Event>, // F0
public BSTEventSink<PlayerDifficultySettingChanged::Event> // F8
{
public:
static constexpr auto RTTI{ RTTI::PipboyPlayerInfoData };
static constexpr auto VTABLE{ VTABLE::PipboyPlayerInfoData };
virtual ~PipboyPlayerInfoData() = default;
virtual BSEventNotifyControl ProcessEvent(const ActorValueEvents::ActorValueChangedEvent& a_event, BSTEventSource<ActorValueEvents::ActorValueChangedEvent>* a_source); // 01
virtual BSEventNotifyControl ProcessEvent(const BGSInventoryListEvent::Event& a_event, BSTEventSource<BGSInventoryListEvent::Event>* a_source); // 02
virtual BSEventNotifyControl ProcessEvent(const ActorEquipManagerEvent::Event& a_event, BSTEventSource<ActorEquipManagerEvent::Event>* a_source); // 03
virtual BSEventNotifyControl ProcessEvent(const LevelIncrease::Event& a_event, BSTEventSource<LevelIncrease::Event>* a_source); // 04
virtual BSEventNotifyControl ProcessEvent(const PerkPointIncreaseEvent& a_event, BSTEventSource<PerkPointIncreaseEvent>* a_source); // 05
virtual BSEventNotifyControl ProcessEvent(const PerkValueEvents::PerkEntryUpdatedEvent& a_event, BSTEventSource<PerkValueEvents::PerkEntryUpdatedEvent>* a_source); // 06
virtual BSEventNotifyControl ProcessEvent(const HourPassed::Event& a_event, BSTEventSource<HourPassed::Event>* a_source); // 07
virtual BSEventNotifyControl ProcessEvent(const SPECIALMenuEvent::NameChangedEvent& a_event, BSTEventSource<SPECIALMenuEvent::NameChangedEvent>* a_source); // 08
virtual BSEventNotifyControl ProcessEvent(const PlayerUpdateEvent& a_event, BSTEventSource<PlayerUpdateEvent>* a_source); // 09
virtual BSEventNotifyControl ProcessEvent(const BGSInventoryItemEvent::Event& a_event, BSTEventSource<BGSInventoryItemEvent::Event>* a_source); // 0A
virtual BSEventNotifyControl ProcessEvent(const PlayerActiveEffectChanged::Event& a_event, BSTEventSource<PlayerActiveEffectChanged::Event>* a_source); // 0B
virtual BSEventNotifyControl ProcessEvent(const PlayerCharacterQuestEvent::Event& a_event, BSTEventSource<PlayerCharacterQuestEvent::Event>* a_source); // 0C
virtual BSEventNotifyControl ProcessEvent(const PlayerDifficultySettingChanged::Event& a_event, BSTEventSource<PlayerDifficultySettingChanged::Event>* a_source); // 0D
// override
virtual void Populate(bool a_arg1) override; // 0E
virtual void DoClearData() override; // 0F
virtual void DoClearSink() override; // 10
void UpdateCarryWeightData()
{
using func_t = decltype(&PipboyPlayerInfoData::UpdateCarryWeightData);
static REL::Relocation<func_t> func{ ID::PipboyPlayerInfoData::UpdateCarryWeightData };
return func(this);
}
// members
PipboyObject* playerInfoObject;
};
static_assert(sizeof(PipboyPlayerInfoData) == 0x108);
}
@@ -0,0 +1,23 @@
#pragma once
#include "RE/P/PipboySubMenu.h"
namespace RE
{
class __declspec(novtable) PipboyPlayerInfoMenu :
public PipboySubMenu // 00
{
public:
static constexpr auto RTTI{ RTTI::PipboyPlayerInfoMenu };
static constexpr auto VTABLE{ VTABLE::PipboyPlayerInfoMenu };
// override (PipboySubMenu)
void UpdateData() override
{
using func_t = decltype(&PipboyPlayerInfoMenu::UpdateData);
static REL::Relocation<func_t> func{ ID::PipboyPlayerInfoMenu::UpdateData };
return func(this);
}
};
static_assert(sizeof(PipboyPlayerInfoMenu) == 0x18);
}
@@ -0,0 +1,75 @@
#pragma once
#include "RE/P/PipboyValue.h"
namespace RE
{
template <class T>
class PipboyPrimitiveValue; // Forward declaration for specialization **only**
template <>
class __declspec(novtable) PipboyPrimitiveValue<std::uint32_t> :
public PipboyValue
{
public:
virtual ~PipboyPrimitiveValue() {} // 00
// override
virtual void CleanDirtyToGame() override {} // 00
virtual void Serialize([[maybe_unused]] Json::Value* a_json) override {} // 01
virtual void SerializeChanges([[maybe_unused]] BSBinarySerializer& a_serializer, [[maybe_unused]] bool a_fullSerialization) override {} // 03
virtual SERIALIZATION_DATA_TYPE GetType() override { return SERIALIZATION_DATA_TYPE::kUint32; }
PipboyPrimitiveValue(std::uint32_t a_value, PipboyValue* a_parentValue) :
PipboyValue(a_parentValue), value(a_value) {}
void ctor(std::uint32_t a_value, PipboyValue* a_parentValue)
{
using func_t = decltype(&PipboyPrimitiveValue<std::uint32_t>::ctor);
static REL::Relocation<func_t> func{ ID::PipboyPrimitiveValue::uint32::ctor };
func(this, a_value, a_parentValue);
}
operator std::uint32_t() const
{
return value;
}
// members
std::uint32_t value; // 18
};
static_assert(sizeof(PipboyPrimitiveValue<std::uint32_t>) == 0x20);
template <>
class __declspec(novtable) PipboyPrimitiveValue<bool> :
public PipboyValue
{
public:
virtual ~PipboyPrimitiveValue() {} // 00
// override
virtual void CleanDirtyToGame() override {} // 00
virtual void Serialize([[maybe_unused]] Json::Value* a_json) override {} // 01
virtual void SerializeChanges([[maybe_unused]] BSBinarySerializer& a_serializer, [[maybe_unused]] bool a_fullSerialization) override {} // 03
virtual SERIALIZATION_DATA_TYPE GetType() override { return SERIALIZATION_DATA_TYPE::kBool; }
PipboyPrimitiveValue(bool a_value, PipboyValue* a_parentValue) :
PipboyValue(a_parentValue), value(a_value) {}
void ctor(bool a_value, PipboyValue* a_parentValue)
{
using func_t = decltype(&PipboyPrimitiveValue<bool>::ctor);
static REL::Relocation<func_t> func{ ID::PipboyPrimitiveValue::boolean::ctor };
func(this, a_value, a_parentValue);
}
operator bool() const
{
return value;
}
// members
bool value; // 18
};
static_assert(sizeof(PipboyPrimitiveValue<bool>) == 0x20);
}
@@ -0,0 +1,42 @@
#pragma once
#include "RE/B/BSTEvent.h"
#include "RE/P/PipboyDataGroup.h"
namespace RE
{
namespace PlayerCharacterQuestEvent
{
class Event;
}
namespace TESQuestEvent
{
class Event;
}
class __declspec(novtable) PipboyQuestData :
public PipboyDataGroup, // 00
public BSTEventSink<PlayerCharacterQuestEvent::Event>, // 89
public BSTEventSink<TESQuestEvent::Event> // A0
{
public:
static constexpr auto RTTI{ RTTI::PipboyQuestData };
static constexpr auto VTABLE{ VTABLE::PipboyQuestData };
virtual ~PipboyQuestData();
virtual BSEventNotifyControl ProcessEvent(const PlayerCharacterQuestEvent::Event& a_event, BSTEventSource<PlayerCharacterQuestEvent::Event>* a_source); // 01
virtual BSEventNotifyControl ProcessEvent(const TESQuestEvent::Event& a_event, BSTEventSource<TESQuestEvent::Event>* a_source); // 02
virtual void Populate(bool a_arg1) override; // 03
virtual void DoClearData() override; // 04
virtual void DoClearSink() override; // 05
// members
std::uint32_t sortIndex; // A8
PipboyArray* questArray; // B0
void* objectivesByQuest[6]; // B8 - BSTHashMap<BSTTuple<TESQuest*, std::uint64_t>, BSTArray<BGSInstancedQuestObjective>*>
};
static_assert(sizeof(PipboyQuestData) == 0xE8);
}
@@ -0,0 +1,23 @@
#pragma once
#include "RE/P/PipboySubMenu.h"
namespace RE
{
class __declspec(novtable) PipboyQuestMenu :
public PipboySubMenu // 00
{
public:
static constexpr auto RTTI{ RTTI::PipboyQuestMenu };
static constexpr auto VTABLE{ VTABLE::PipboyQuestMenu };
// override (PipboySubMenu)
void UpdateData() override
{
using func_t = decltype(&PipboyQuestMenu::UpdateData);
static REL::Relocation<func_t> func{ ID::PipboyQuestMenu::UpdateData };
return func(this);
}
};
static_assert(sizeof(PipboyQuestMenu) == 0x18);
}
@@ -0,0 +1,12 @@
#pragma once
namespace RE
{
class PipboyRadioController
{
public:
// members
float chaseStation; // 00
};
static_assert(sizeof(PipboyRadioController) == 0x04);
}
@@ -0,0 +1,36 @@
#pragma once
#include "RE/B/BSTEvent.h"
#include "RE/P/PipboyDataGroup.h"
namespace RE
{
namespace RadioManager
{
class PipboyFrequencyDetectionEvent;
class PipboyRadioTuningEvent;
}
class __declspec(novtable) PipboyRadioData :
public PipboyDataGroup, // 00
public BSTEventSink<RadioManager::PipboyFrequencyDetectionEvent>, // 98
public BSTEventSink<RadioManager::PipboyRadioTuningEvent> // A0
{
public:
static constexpr auto RTTI{ RTTI::PipboyRadioData };
static constexpr auto VTABLE{ VTABLE::PipboyRadioData };
virtual ~PipboyRadioData() = default;
virtual BSEventNotifyControl ProcessEvent(const RadioManager::PipboyFrequencyDetectionEvent& a_event, BSTEventSource<RadioManager::PipboyFrequencyDetectionEvent>* a_source); // 01
virtual BSEventNotifyControl ProcessEvent(const RadioManager::PipboyRadioTuningEvent& a_event, BSTEventSource<RadioManager::PipboyRadioTuningEvent>* a_source); // 02
virtual void Populate(bool a_arg1) override; // 03
virtual void DoClearData() override; // 04
virtual void DoClearSink() override; // 05
// members
PipboyArray* radioStations; // A8
};
static_assert(sizeof(PipboyRadioData) == 0xB0);
}
@@ -0,0 +1,25 @@
#pragma once
#include "RE/P/PipboySubMenu.h"
namespace RE
{
class __declspec(novtable) PipboyRadioMenu :
public PipboySubMenu // 00
{
public:
static constexpr auto RTTI{ RTTI::PipboyRadioMenu };
static constexpr auto VTABLE{ VTABLE::PipboyRadioMenu };
// override (PipboySubMenu)
void UpdateData() override
{
using func_t = decltype(&PipboyRadioMenu::UpdateData);
static REL::Relocation<func_t> func{ ID::PipboyRadioMenu::UpdateData };
return func(this);
}
bool radioModeOn; // 18
};
static_assert(sizeof(PipboyRadioMenu) == 0x20);
}
@@ -0,0 +1,35 @@
#pragma once
#include "RE/B/BSTEvent.h"
#include "RE/P/PipboyDataGroup.h"
namespace RE
{
namespace ActorValueEvents
{
class ActorValueChangedEvent;
}
class __declspec(novtable) PipboySpecialData :
public PipboyDataGroup, // 00
public BSTEventSink<ActorValueEvents::ActorValueChangedEvent> // 98
{
public:
static constexpr auto RTTI{ RTTI::PipboySpecialData };
static constexpr auto VTABLE{ VTABLE::PipboySpecialData };
virtual ~PipboySpecialData();
// override
virtual void Populate(bool a_arg1) override; // 01
virtual void DoClearData() override; // 02
virtual void DoClearSink() override; // 03
// add
virtual BSEventNotifyControl ProcessEvent(const ActorValueEvents::ActorValueChangedEvent& a_event, BSTEventSource<ActorValueEvents::ActorValueChangedEvent>* a_source); // 04
// members
PipboyArray* specialsArray; // A0
};
static_assert(sizeof(PipboySpecialData) == 0xA8);
}
@@ -0,0 +1,23 @@
#pragma once
#include "RE/P/PipboySubMenu.h"
namespace RE
{
class __declspec(novtable) PipboySpecialMenu :
public PipboySubMenu // 00
{
public:
static constexpr auto RTTI{ RTTI::PipboySpecialMenu };
static constexpr auto VTABLE{ VTABLE::PipboySpecialMenu };
// override (PipboySubMenu)
void UpdateData() override
{
using func_t = decltype(&PipboySpecialMenu::UpdateData);
static REL::Relocation<func_t> func{ ID::PipboySpecialMenu::UpdateData };
return func(this);
}
};
static_assert(sizeof(PipboySpecialMenu) == 0x18);
}
@@ -0,0 +1,71 @@
#pragma once
#include "RE/B/BSTEvent.h"
#include "RE/B/BSTHashMap.h"
#include "RE/B/BSTSmartPointer.h"
#include "RE/P/PipboyDataGroup.h"
namespace RE
{
class ConditionBoyEvent;
namespace ActorItemEquipped
{
class Event;
}
namespace ActorValueEvents
{
class ActorValueChangedEvent;
}
namespace BGSInventoryItemEvent
{
class Event;
}
namespace BGSInventoryListEvent
{
class Event;
}
namespace PlayerActiveEffectChanged
{
class Event;
}
class __declspec(novtable) PipboyStatsData :
public PipboyDataGroup, // 00
public BSTEventSink<ActorValueEvents::ActorValueChangedEvent>, // 98
public BSTEventSink<BGSInventoryListEvent::Event>, // A0
public BSTEventSink<PlayerActiveEffectChanged::Event>, // A8
public BSTEventSink<ConditionBoyEvent>, // B0
public BSTEventSink<ActorItemEquipped::Event>, // B8
public BSTEventSink<BGSInventoryItemEvent::Event> // C0
{
public:
static constexpr auto RTTI{ RTTI::PipboyStatsData };
static constexpr auto VTABLE{ VTABLE::PipboyStatsData };
virtual ~PipboyStatsData() = default;
virtual BSEventNotifyControl ProcessEvent(const ActorValueEvents::ActorValueChangedEvent& a_event, BSTEventSource<ActorValueEvents::ActorValueChangedEvent>* a_source); // 01
virtual BSEventNotifyControl ProcessEvent(const BGSInventoryListEvent::Event& a_event, BSTEventSource<BGSInventoryListEvent::Event>* a_source); // 02
virtual BSEventNotifyControl ProcessEvent(const PlayerActiveEffectChanged::Event& a_event, BSTEventSource<PlayerActiveEffectChanged::Event>* a_source); // 03
virtual BSEventNotifyControl ProcessEvent(const ConditionBoyEvent& a_event, BSTEventSource<ConditionBoyEvent>* a_source); // 04
virtual BSEventNotifyControl ProcessEvent(const ActorItemEquipped::Event& a_event, BSTEventSource<ActorItemEquipped::Event>* a_source); // 05
virtual BSEventNotifyControl ProcessEvent(const BGSInventoryItemEvent::Event& a_event, BSTEventSource<BGSInventoryItemEvent::Event>* a_source); // 06
// override
virtual void Populate(bool a_arg1) override; // 07
virtual void DoClearData() override; // 08
virtual void DoClearSink() override; // 09
// members
PipboyObject* playerStatsObject; // C8
PipboyArray* activeEffectsArray; // D0
BSTHashMap<MagicItem*, PipboyObject*> activeEffectsMap; // D8
BSTHashMap<BSTSmartPointer<ActiveEffect>, PipboyObject*> activeEffectEntriesMap; // 108
};
static_assert(sizeof(PipboyStatsData) == 0x138);
}
@@ -0,0 +1,27 @@
#pragma once
#include "RE/B/BSSoundHandle.h"
#include "RE/P/PipboySubMenu.h"
namespace RE
{
class __declspec(novtable) PipboyStatsMenu :
public PipboySubMenu // 00
{
public:
static constexpr auto RTTI{ RTTI::PipboyStatsMenu };
static constexpr auto VTABLE{ VTABLE::PipboyStatsMenu };
// override (PipboySubMenu)
void UpdateData() override
{
using func_t = decltype(&PipboyStatsMenu::UpdateData);
static REL::Relocation<func_t> func{ ID::PipboyStatsMenu::UpdateData };
return func(this);
}
// members
BSSoundHandle perkSound; // 18
};
static_assert(sizeof(PipboyStatsMenu) == 0x20);
}
@@ -0,0 +1,70 @@
#pragma once
#include "RE/B/BSTEvent.h"
#include "RE/P/PipboyDataGroup.h"
namespace RE
{
class MenuOpenCloseEvent;
class UserEventEnabledEvent;
namespace BGSInventoryListEvent
{
class Event;
}
namespace LoadingStatusChanged
{
class Event;
}
namespace PlayerInDialogueChanged
{
class Event;
}
namespace PlayerLifeStateChanged
{
class Event;
}
namespace VATSEvents
{
class ModeChange;
}
class __declspec(novtable) PipboyStatusData :
public PipboyDataGroup, // 00
public BSTEventSink<PlayerLifeStateChanged::Event>, // 98
public BSTEventSink<PlayerInDialogueChanged::Event>, // A0
public BSTEventSink<MenuOpenCloseEvent>, // A8
public BSTEventSink<BGSInventoryListEvent::Event>, // B0
public BSTEventSink<LoadingStatusChanged::Event>, // B8
public BSTEventSink<VATSEvents::ModeChange>, // C0
public BSTEventSink<UserEventEnabledEvent> // C8
{
public:
static constexpr auto RTTI{ RTTI::PipboyStatusData };
static constexpr auto VTABLE{ VTABLE::PipboyStatusData };
virtual ~PipboyStatusData() = default;
virtual BSEventNotifyControl ProcessEvent(const PlayerLifeStateChanged::Event& a_event, BSTEventSource<PlayerLifeStateChanged::Event>* a_source); // 01
virtual BSEventNotifyControl ProcessEvent(const PlayerInDialogueChanged::Event& a_event, BSTEventSource<PlayerInDialogueChanged::Event>* a_source); // 02
virtual BSEventNotifyControl ProcessEvent(const MenuOpenCloseEvent& a_event, BSTEventSource<MenuOpenCloseEvent>* a_source); // 03
virtual BSEventNotifyControl ProcessEvent(const BGSInventoryListEvent::Event& a_event, BSTEventSource<BGSInventoryListEvent::Event>* a_source); // 04
virtual BSEventNotifyControl ProcessEvent(const LoadingStatusChanged::Event& a_event, BSTEventSource<LoadingStatusChanged::Event>* a_source); // 05
virtual BSEventNotifyControl ProcessEvent(const VATSEvents::ModeChange& a_event, BSTEventSource<VATSEvents::ModeChange>* a_source); // 06
virtual BSEventNotifyControl ProcessEvent(const UserEventEnabledEvent& a_event, BSTEventSource<UserEventEnabledEvent>* a_source); // 07
// override
virtual void Populate(bool a_arg1) override; // 08
virtual void DoClearData() override; // 09
virtual void DoClearSink() override; // 0A
// members
PipboyObject* statusObject;
PipboyArray* pipboyEffectColorArray;
};
static_assert(sizeof(PipboyStatusData) == 0xE0);
}
@@ -0,0 +1,33 @@
#pragma once
#include "RE/B/BSTEvent.h"
#include "Scaleform/G/GFx_Value.h"
namespace RE
{
class PipboyValueChangedEvent;
class __declspec(novtable) PipboySubMenu :
public BSTEventSink<PipboyValueChangedEvent> // 00
{
public:
static constexpr auto RTTI{ RTTI::PipboySubMenu };
static constexpr auto VTABLE{ VTABLE::PipboySubMenu };
// override (BSTEventSink<PipboyValueChangedEvent>)
BSEventNotifyControl ProcessEvent(const PipboyValueChangedEvent& a_event, BSTEventSource<PipboyValueChangedEvent>* a_source) override
{
using func_t = decltype(&PipboySubMenu::ProcessEvent);
static REL::Relocation<func_t> func{ ID::PipboySubMenu::ProcessEvent };
return func(this, a_event, a_source);
}
// add
virtual void UpdateData() = 0; // 02
// members
Scaleform::GFx::Value* dataObj; // 08
Scaleform::GFx::Value* menuObj; // 10
};
static_assert(sizeof(PipboySubMenu) == 0x18);
}
@@ -0,0 +1,14 @@
#pragma once
#include "RE/B/BSTHashMap.h"
#include "RE/I/IPipboyThrottledValue.h"
namespace RE
{
class PipboyThrottleManager
{
public:
BSTHashMap<std::uint32_t, IPipboyThrottledValue*> valueMap; // 00
};
static_assert(sizeof(PipboyThrottleManager) == 0x30);
}
@@ -0,0 +1,58 @@
#pragma once
namespace Json
{
class Value;
}
namespace RE
{
class BSBinarySerializer;
class __declspec(novtable) PipboyValue
{
public:
static constexpr auto RTTI{ RTTI::PipboyValue };
static constexpr auto VTABLE{ VTABLE::PipboyValue };
enum SERIALIZATION_DATA_TYPE : std::uint8_t
{
kBool = 0x0,
kInt8 = 0x1,
kUint8 = 0x2,
kInt32 = 0x3,
kUint32 = 0x4,
kFloat = 0x5,
kString = 0x6,
kArray = 0x7,
kObject = 0x8,
};
virtual ~PipboyValue() = default; // 00
// add
virtual void CleanDirtyToGame(); // 01
virtual void Serialize(Json::Value* a_json) = 0; // 02
virtual void SerializeChanges(BSBinarySerializer& a_serializer, bool a_fullSerialize); // 03
virtual SERIALIZATION_DATA_TYPE GetType() = 0; // 04
PipboyValue(PipboyValue* a_parentValue)
{
ctor(a_parentValue);
};
void ctor(PipboyValue* a_parentValue)
{
using func_t = decltype(&PipboyValue::ctor);
static REL::Relocation<func_t> func{ ID::PipboyValue::ctor };
return func(this, a_parentValue);
}
// members
std::uint32_t id; // 08
bool isDirtyGame; // 0C
bool isDirtyToCompanion; // 0D
PipboyValue* parentValue; // 10
};
static_assert(sizeof(PipboyValue) == 0x18);
}
@@ -0,0 +1,46 @@
#pragma once
#include "RE/B/BSFixedString.h"
#include "RE/B/BSTEvent.h"
#include "RE/B/BSTHashMap.h"
#include "RE/P/PipboyDataGroup.h"
namespace RE
{
namespace ActorValueEvents
{
class ActorValueChangedEvent;
}
namespace Workshop
{
class WorkshopModeEvent;
}
class __declspec(novtable) PipboyWorkshopData :
public PipboyDataGroup,
public BSTEventSink<ActorValueEvents::ActorValueChangedEvent>,
public BSTEventSink<Workshop::WorkshopModeEvent>
{
public:
static constexpr auto RTTI{ RTTI::PipboyWorkshopData };
static constexpr auto VTABLE{ VTABLE::PipboyStatusData };
virtual ~PipboyWorkshopData() = default;
virtual BSEventNotifyControl ProcessEvent(const ActorValueEvents::ActorValueChangedEvent& a_event, BSTEventSource<ActorValueEvents::ActorValueChangedEvent>* a_source); // 01
virtual BSEventNotifyControl ProcessEvent(const Workshop::WorkshopModeEvent& a_event, BSTEventSource<Workshop::WorkshopModeEvent>* a_source); // 02
// override
virtual void Populate(bool a_arg1) override; // 03
virtual void DoClearData() override; // 04
virtual void DoClearSink() override; // 05
// members
PipboyArray* workshopArray; // A8
BSTHashMap<std::uint32_t, PipboyObject*> workshopMap; // B0
BSTHashMap<BSFixedStringCS, std::int32_t> ratingUpdateFunctions; // E0
BSTHashMap<BSFixedStringCS, std::uint32_t> getValueFunctions; // 110
};
static_assert(sizeof(PipboyWorkshopData) == 0x140);
}
@@ -0,0 +1,23 @@
#pragma once
#include "RE/P/PipboySubMenu.h"
namespace RE
{
class __declspec(novtable) PipboyWorkshopMenu :
public PipboySubMenu // 00
{
public:
static constexpr auto RTTI{ RTTI::PipboyWorkshopMenu };
static constexpr auto VTABLE{ VTABLE::PipboyWorkshopMenu };
// override (PipboySubMenu)
void UpdateData() override
{
using func_t = decltype(&PipboyWorkshopMenu::UpdateData);
static REL::Relocation<func_t> func{ ID::PipboyWorkshopMenu::UpdateData };
return func(this);
}
};
static_assert(sizeof(PipboyWorkshopMenu) == 0x18);
}
@@ -0,0 +1,24 @@
#pragma once
#include "RE/B/BSTSmartPointer.h"
namespace RE
{
namespace PlayerActiveEffectChanged
{
enum Status : std::int32_t
{
kAdded = 0x0,
kRemoved = 0x1,
kStatusChanged = 0x2
};
class Event
{
public:
// members
BSTSmartPointer<ActiveEffect, BSTSmartPointerIntrusiveRefCount> effect; // 00
PlayerActiveEffectChanged::Status status; // 08
};
}
}
@@ -0,0 +1,15 @@
#pragma once
namespace RE
{
namespace PlayerAddicted
{
class Event
{
public:
// members
const AlchemyItem* chem; // 00
};
static_assert(sizeof(Event) == 0x8);
}
}
@@ -0,0 +1,14 @@
#pragma once
#include "RE/B/BSTEvent.h"
#include "RE/P/PlayerAmmoCounts.h"
namespace RE
{
class PlayerAmmoCountEvent :
public BSTValueEvent<PlayerAmmoCounts>
{
public:
};
static_assert(sizeof(PlayerAmmoCountEvent) == 0xC);
}
@@ -0,0 +1,13 @@
#pragma once
namespace RE
{
class PlayerAmmoCounts
{
public:
// members
std::uint32_t clipAmmo; // 00
std::uint32_t reserveAmmo; // 04
};
static_assert(sizeof(PlayerAmmoCounts) == 0x8);
}
@@ -0,0 +1,14 @@
#pragma once
#include "RE/B/BSPointerHandle.h"
#include "RE/B/BSTEvent.h"
namespace RE
{
class PlayerAutoAimActorEvent :
public BSTValueEvent<ActorHandle> // 0
{
public:
};
static_assert(sizeof(PlayerAutoAimActorEvent) == 0x8);
}
@@ -0,0 +1,154 @@
#pragma once
#include "RE/B/BSInputEventReceiver.h"
#include "RE/B/BSPointerHandle.h"
#include "RE/B/BSTArray.h"
#include "RE/B/BSTEvent.h"
#include "RE/B/BSTSingleton.h"
#include "RE/B/BSTSmartPointer.h"
#include "RE/C/CameraStates.h"
#include "RE/H/hknpBodyId.h"
#include "RE/N/NiPoint3.h"
#include "RE/T/TESCamera.h"
#include "RE/T/TESCameraState.h"
namespace RE
{
class hknpBSWorld;
class hknpShape;
class IdleInputEvent;
class OtherEventEnabledEvent;
class UserEventEnabledEvent;
class __declspec(novtable) PlayerCamera :
public TESCamera, // 000
public BSInputEventReceiver, // 038
public BSTEventSink<IdleInputEvent>, // 048
public BSTEventSink<UserEventEnabledEvent>, // 050
public BSTEventSink<OtherEventEnabledEvent>, // 058
public BSTSingletonSDM<PlayerCamera> // 060
{
public:
static constexpr auto RTTI{ RTTI::PlayerCamera };
static constexpr auto VTABLE{ VTABLE::PlayerCamera };
[[nodiscard]] static PlayerCamera* GetSingleton()
{
static REL::Relocation<PlayerCamera**> singleton{ ID::PlayerCamera::Singleton };
return *singleton;
}
[[nodiscard]] BSTSmartPointer<TESCameraState> GetCameraCurrentState() const
{
return currentState;
}
bool GetCameraPosition(NiPoint3& a_position, bool a_addPlayerPos) const
{
using func_t = decltype(&PlayerCamera::GetCameraPosition);
static REL::Relocation<func_t> func{ ID::PlayerCamera::GetCameraPosition };
return func(this, a_position, a_addPlayerPos);
}
[[nodiscard]] BSTSmartPointer<TESCameraState> GetState(CameraState a_state) const
{
return cameraStates[a_state];
}
template <class T>
[[nodiscard]] BSTSmartPointer<T> GetState() const
requires(std::derived_from<T, TESCameraState>)
{
return BSTSmartPointer{ static_cast<T*>(cameraStates[T::STATE].get()) };
}
TESCameraState* PopState()
{
using func_t = decltype(&PlayerCamera::PopState);
static REL::Relocation<func_t> func{ ID::PlayerCamera::PopState };
return func(this);
}
TESCameraState* PushState(CameraState a_state)
{
using func_t = decltype(&PlayerCamera::PushState);
static REL::Relocation<func_t> func{ ID::PlayerCamera::PushState };
return func(this, a_state);
}
void ToggleFreeCameraMode(bool a_freezeTime)
{
using func_t = decltype(&PlayerCamera::ToggleFreeCameraMode);
static REL::Relocation<func_t> func{ ID::PlayerCamera::ToggleFreeCameraMode };
return func(this, a_freezeTime);
}
void SetState(TESCameraState* a_newstate)
{
using func_t = decltype(&PlayerCamera::SetState);
static REL::Relocation<func_t> func{ ID::PlayerCamera::SetState };
return func(this, a_newstate);
}
void StartFurnitureMode(TESObjectREFR* a_furniture)
{
using func_t = decltype(&PlayerCamera::StartFurnitureMode);
static REL::Relocation<func_t> func{ ID::PlayerCamera::StartFurnitureMode };
return func(this, a_furniture);
}
void StartPipboyMode(bool a_forcePipboyModeCamera)
{
using func_t = decltype(&PlayerCamera::StartPipboyMode);
static REL::Relocation<func_t> func{ ID::PlayerCamera::StartPipboyMode };
return func(this, a_forcePipboyModeCamera);
}
void StopPipboyMode()
{
using func_t = decltype(&PlayerCamera::StopPipboyMode);
static REL::Relocation<func_t> func{ ID::PlayerCamera::StopPipboyMode };
return func(this);
}
bool QCameraEquals(CameraState a_state) const
{
using func_t = decltype(&PlayerCamera::QCameraEquals);
static REL::Relocation<func_t> func{ ID::PlayerCamera::QCameraEquals };
return func(this, a_state);
}
// members
ActorHandle cameraTarget; // 064
BSTSmallArray<BSTSmartPointer<TESCameraState>, CameraStates::kTotal> tempReturnStates; // 068
BSTSmartPointer<TESCameraState> cameraStates[CameraStates::kTotal]; // 0E0
hknpBodyId cameraBodyID; // 148
hkRefPtr<hknpShape> cameraShape; // 150
hkRefPtr<hknpBSWorld> physicsWorld; // 158
ActorHandle savedCollidedActor; // 160
ObjectRefHandle collisionIgnoredReference; // 164
float worldFOV; // 168
float firstPersonFOV; // 16C
float fovAdjustCurrent; // 170
float fovAdjustTarget; // 174
float fovAdjustPerSec; // 178
float fovAnimatorAdjust; // 17C
float collisionDistPercent; // 180
float curPlayerVisible; // 184
NiPoint3 bufferedCameraPos; // 188
float heading; // 194
float timeInPitchZero; // 198
float originalPitchToZero; // 19C
std::uint32_t furnitureCollisionGroup; // 1A0
bool allowAutoVanityMode; // 1A4
bool bowZoomedIn; // 1A5
bool freeRotationReady; // 1A6
bool cameraPosBuffered; // 1A7
bool zeroOutPitch; // 1A8
bool adjustFOV; // 1A9
bool trailerCameraMode; // 1AA
bool pipboyMode; // 1AB
bool savedFadeOutCloseActors; // 1AC
};
static_assert(sizeof(PlayerCamera) == 0x1B0);
}
@@ -0,0 +1,537 @@
#pragma once
#include "RE/A/AITimeStamp.h"
#include "RE/A/Actor.h"
#include "RE/B/BGSCharacterTint.h"
#include "RE/B/BGSEquipIndex.h"
#include "RE/B/BGSObjectInstance.h"
#include "RE/B/BSPointerHandle.h"
#include "RE/B/BSSimpleList.h"
#include "RE/B/BSSoundHandle.h"
#include "RE/B/BSSpinLock.h"
#include "RE/B/BSTArray.h"
#include "RE/B/BSTEvent.h"
#include "RE/B/BSTHashMap.h"
#include "RE/B/BSTSmartPointer.h"
#include "RE/B/BSTTuple.h"
#include "RE/C/CrimeGoldStruct.h"
#include "RE/D/DifficultyLevel.h"
#include "RE/F/FriendshipFactionsStruct.h"
#include "RE/I/IMovementPlayerControlsFilter.h"
#include "RE/N/NiPoint3.h"
#include "RE/N/NiPointer.h"
#include "RE/N/NiTMap.h"
#include "RE/P/PLAYER_TARGET_LOC.h"
#include "RE/P/PlayerAutoAimActorEvent.h"
#include "RE/P/PlayerCommandTypeEvent.h"
#include "RE/P/PlayerCoverData.h"
#include "RE/S/SCENE_ACTION_PLAYER_RESPONSE_TYPE.h"
#include "RE/S/SayOnceTimeStampStruct.h"
#include "RE/S/StolenItemValueStruct.h"
#include "RE/S/SubgraphHandle.h"
#include "RE/T/TeleportPath.h"
#include "RE/X/XPChangeData.h"
namespace RE
{
enum class DEFAULT_OBJECT;
enum class PLAYER_ACTION;
class BGSActorCellEvent;
class BGSActorDeathEvent;
class BGSInstancedQuestObjective;
class BipedAnim;
class BSLight;
class BSPathingSolution;
class Crime;
class EquippedItem;
class ImageSpaceModifierInstanceDOF;
class ImageSpaceModifierInstanceForm;
class ItemChange;
class MenuModeChangeEvent;
class MenuOpenCloseEvent;
class NiAVObject;
class NiLight;
class NiNode;
class OtherEventEnabledEvent;
class PickRefUpdateEvent;
class PlayerActionObject;
class PositionPlayerEvent;
class QuestTargetArray;
class TESHitEvent;
class TESQuestStageItem;
class UserEventEnabledEvent;
namespace PerkValueEvents
{
class PerkEntryUpdatedEvent;
}
inline bool IsPlayerInDialogue()
{
using func_t = decltype(&IsPlayerInDialogue);
static REL::Relocation<func_t> func{ ID::IsPlayerInDialogue };
return func();
}
class __declspec(novtable) PlayerCharacter :
public Actor, // 000
public BSTEventSource<BGSActorCellEvent>, // 4C8
public BSTEventSource<BGSActorDeathEvent>, // 520
public BSTEventSource<PositionPlayerEvent>, // 578
public BSTEventSource<PickRefUpdateEvent>, // 5D0
public BSTEventSink<MenuOpenCloseEvent>, // 490
public BSTEventSink<MenuModeChangeEvent>, // 498
public BSTEventSink<UserEventEnabledEvent>, // 4A0
public BSTEventSink<OtherEventEnabledEvent>, // 4A8
public BSTEventSink<TESHitEvent>, // 4B0
public BSTEventSink<PerkValueEvents::PerkEntryUpdatedEvent>, // 4B8
public IMovementPlayerControlsFilter // 4C0
{
public:
static constexpr auto RTTI{ RTTI::PlayerCharacter };
static constexpr auto VTABLE{ VTABLE::PlayerCharacter };
static constexpr auto FORM_ID{ ENUM_FORM_ID::kACHR };
enum class CHAR_GEN_DISABLE_FLAGS
{
kDisableSave = 0x1,
kDisableWait = 0x2,
kShowControlsDisabledMessage = 0x4
};
enum class GrabbingType
{
kNone = 0x0,
kNormal = 0x1,
kTelekinesis = 0x2
};
enum class PROGRESS_EVENT
{
kLevelUp = 0x0,
kDeath = 0x1,
kChargen = 0x2
};
class PlayerActionObject
{
public:
// members
float timer; // 0
ObjectRefHandle refObj; // 4
REX::TEnumSet<PLAYER_ACTION, std::int32_t> next; // 8
};
static_assert(sizeof(PlayerActionObject) == 0xC);
class ScopedInventoryChangeMessageContext
{
public:
ScopedInventoryChangeMessageContext(bool a_suppressMessages, bool a_suppressAudio) :
suppressMessages(a_suppressMessages), suppressAudio(a_suppressAudio)
{
ctor(suppressMessages, suppressAudio);
}
~ScopedInventoryChangeMessageContext()
{
dtor();
}
// members
const bool suppressMessages{ false }; // 00
const bool suppressAudio{ false }; // 01
private:
void ctor(bool a_suppressMessages, bool a_suppressAudio)
{
using func_t = decltype(&ScopedInventoryChangeMessageContext::ctor);
static REL::Relocation<func_t> func{ ID::PlayerCharacter::ScopedInventoryChangeMessageContext::ctor };
return func(this, a_suppressMessages, a_suppressAudio);
}
void dtor()
{
using func_t = decltype(&ScopedInventoryChangeMessageContext::dtor);
static REL::Relocation<func_t> func{ ID::PlayerCharacter::ScopedInventoryChangeMessageContext::dtor };
return func(this);
}
};
static_assert(sizeof(ScopedInventoryChangeMessageContext) == 0x2);
// add
virtual void InitiateSpectator(Actor*) { return; } // 133
virtual std::uint32_t GetViolentCrimeGoldValue(const TESFaction* a_faction); // 134
virtual std::uint32_t GetNonViolentCrimeGoldValue(const TESFaction* a_faction); // 135
virtual void ClearAllCrimeGold(TESFaction* a_faction); // 136
[[nodiscard]] static PlayerCharacter* GetSingleton()
{
static REL::Relocation<NiPointer<PlayerCharacter>*> singleton{ ID::PlayerCharacter::Singleton };
return singleton->get();
}
[[nodiscard]] static ActorHandle GetPlayerHandle()
{
static REL::Relocation<ActorHandle*> singleton{ ID::PlayerCharacter::GetPlayerHandle };
return *singleton;
}
DifficultyLevel GetDifficultyLevel()
{
using func_t = decltype(&PlayerCharacter::GetDifficultyLevel);
static REL::Relocation<func_t> func{ ID::PlayerCharacter::GetDifficultyLevel };
return func(this);
}
bool IsGodMode()
{
using func_t = decltype(&PlayerCharacter::IsGodMode);
static REL::Relocation<func_t> func{ ID::PlayerCharacter::IsGodMode };
return func(this);
}
bool IsHolotapePlaying(BGSNote* a_holotape)
{
using func_t = decltype(&PlayerCharacter::IsHolotapePlaying);
static REL::Relocation<func_t> func{ ID::PlayerCharacter::IsHolotapePlaying };
return func(this, a_holotape);
}
bool IsImmortal()
{
using func_t = decltype(&PlayerCharacter::IsImmortal);
static REL::Relocation<func_t> func{ ID::PlayerCharacter::IsImmortal };
return func(this);
}
bool IsLockedOutOfTerminal(ObjectRefHandle a_handle);
bool IsPipboyLightOn()
{
using func_t = decltype(&PlayerCharacter::IsPipboyLightOn);
static REL::Relocation<func_t> func{ ID::PlayerCharacter::IsPipboyLightOn };
return func(this);
}
void LockOutOfTerminal(ObjectRefHandle a_handle);
void PauseHolotape(BGSNote* a_holotape)
{
using func_t = decltype(&PlayerCharacter::PauseHolotape);
static REL::Relocation<func_t> func{ ID::PlayerCharacter::PauseHolotape };
return func(this, a_holotape);
}
void PlayHolotape(BGSNote* a_holotape)
{
using func_t = decltype(&PlayerCharacter::PlayHolotape);
static REL::Relocation<func_t> func{ ID::PlayerCharacter::PlayHolotape };
return func(this, a_holotape);
}
void QueueFastTravel(ObjectRefHandle a_marker, bool a_allowAutoSave)
{
using func_t = decltype(&PlayerCharacter::QueueFastTravel);
static REL::Relocation<func_t> func{ ID::PlayerCharacter::QueueFastTravel };
return func(this, a_marker, a_allowAutoSave);
}
void RemoveLastUsedPowerArmor()
{
using func_t = decltype(&PlayerCharacter::RemoveLastUsedPowerArmor);
static REL::Relocation<func_t> func{ ID::PlayerCharacter::RemoveLastUsedPowerArmor };
return func(this);
}
void SelectPerk(TESFormID a_formID, std::int8_t a_rank = 0)
{
using func_t = decltype(&PlayerCharacter::SelectPerk);
static REL::Relocation<func_t> func{ ID::PlayerCharacter::SelectPerk };
return func(this, a_formID, a_rank);
}
void SetEscaping(bool a_flag, bool a_escaped)
{
using func_t = decltype(&PlayerCharacter::SetEscaping);
static REL::Relocation<func_t> func{ ID::PlayerCharacter::SetEscaping };
return func(this, a_flag, a_escaped);
}
void SetVATSCriticalCount(uint32_t a_critCount)
{
using func_t = decltype(&PlayerCharacter::SetVATSCriticalCount);
static REL::Relocation<func_t> func{ ID::PlayerCharacter::SetVATSCriticalCount };
return func(this, a_critCount);
}
void ShowPipboyLight(bool a_show, bool a_skipEffects)
{
using func_t = decltype(&PlayerCharacter::ShowPipboyLight);
static REL::Relocation<func_t> func{ ID::PlayerCharacter::ShowPipboyLight };
return func(this, a_show, a_skipEffects);
}
void SetLastDialogueInput(uint32_t dialogueOption)
{
using func_t = decltype(&PlayerCharacter::SetLastDialogueInput);
static REL::Relocation<func_t> func{ ID::PlayerCharacter::SetLastDialogueInput };
return func(this, dialogueOption);
}
void ClearPrison()
{
using func_t = decltype(&PlayerCharacter::ClearPrison);
static REL::Relocation<func_t> func{ ID::PlayerCharacter::ClearPrison };
return func(this);
}
bool ReloadWeapon(const BGSObjectInstanceT<TESObjectWEAP>* a_weapon, BGSEquipIndex a_equipIndex)
{
using func_t = decltype(&PlayerCharacter::ReloadWeapon);
static REL::Relocation<func_t> func{ ID::PlayerCharacter::ReloadWeapon };
return func(this, a_weapon, a_equipIndex);
}
void SetPerkCount(std::uint8_t a_count)
{
using func_t = decltype(&PlayerCharacter::SetPerkCount);
static REL::Relocation<func_t> func{ ID::PlayerCharacter::SetPerkCount };
return func(this, a_count);
}
bool HasLOSToTarget(Actor* a_targetRef, bool* pickPerformed)
{
using func_t = decltype(&PlayerCharacter::HasLOSToTarget);
static REL::Relocation<func_t> func{ ID::PlayerCharacter::HasLOSToTarget };
return func(this, a_targetRef, pickPerformed);
}
void SetAIControlledPackage(bool a_enable)
{
using func_t = decltype(&PlayerCharacter::SetAIControlledPackage);
static REL::Relocation<func_t> func{ ID::PlayerCharacter::SetAIControlledPackage };
return func(this, a_enable);
}
void EnableRadio(bool a_enable)
{
using func_t = decltype(&PlayerCharacter::EnableRadio);
static REL::Relocation<func_t> func{ ID::PlayerCharacter::EnableRadio };
return func(this, a_enable);
}
// members
BSSpinLock actorToDisplayOnHUDLock; // 628
BSSpinLock questTargetLock; // 630
BSTHashMap<const TESFaction*, CrimeGoldStruct> crimeGoldMap; // 638
BSTHashMap<const TESFaction*, StolenItemValueStruct> stolenItemValueMap; // 668
PlayerCoverData coverData; // 698
ObjectRefHandle commandWaitMarker; // 6C4
BSTHashMap<const TESFaction*, FriendshipFactionsStruct> factionOwnerFriendsMap; // 6C8
NiPoint3A lastKnownGoodPosition; // 700
NiPoint3A lastKnownGoodNavmeshPosition; // 710
NiPoint3 bulletAutoAim; // 720
NiPoint3 cachedVelocity; // 72C
BSTArray<ObjectRefHandle> currentMapMarkers; // 738
BSTArray<BSTTuple<NiPoint3, AITimeStamp>> velocityArray; // 750
BSTArray<ProjectileHandle> runesCast; // 768
BSTArray<TESImageSpaceModifier*> animationImageSpaceModifiers; // 78-
BSTArray<ImageSpaceModifierInstanceForm*> animationImageSpaceInstances; // 798
BSTArray<BSTTuple<NiPointer<NiLight>, bool>> playerLights; // 7B0
BSSimpleList<TESQuestStageItem*> questLog; // 7C8
BSTArray<BGSInstancedQuestObjective> objectives; // 7D9
BSTHashMap<TESQuest*, QuestTargetArray*> questTargets; // 7F0
BSTHashMap<std::uint32_t, SayOnceTimeStampStruct> currentSayOnceInfosMap; // 820
BSTHashMap<std::uint32_t, SayOnceTimeStampStruct> currentSpeechRepeatMap; // 850
BSSimpleList<ObjectRefHandle> droppedRefList; // 880
NiTMap<std::uint32_t, std::uint8_t> randomDoorSpaceMap; // 890
TESWorldSpace* cachedWorldspace; // 8B0
NiPoint3 exteriorPosition; // 8B8
BSTSmallArray<SubgraphHandle, 2> pipboyAnimSubGraph; // 8C8
PLAYER_TARGET_LOC queuedTargetLoc; // 8E8
PLAYER_TARGET_LOC queuedFlightLoc; // 948
NiPoint3A flightGridCenter; // 9B0
BSPathingSolution* flightMountPathingSolution; // 9C0
const TESObjectCELL* flightMountPreloadCell; // 9C8
BSSoundHandle magicFailureSound; // 9D0
BSTArray<std::uint32_t> rumorTopicInfoList; // 9D8
std::uint32_t testChallangeInfoID; // 9F0
DialoguePackage* closestConversation; // 9F8
DialoguePackage* aiConversationRunning; // A00
std::int32_t numberofStealWarnings; // A08
float stealWarningTimer; // A0C
std::int32_t numberofPickpocketWarnings; // A10
float pickPocketWarningTimer; // A14
AITimeStamp warnToLeaveTimeStamp; // A18
AITimeStamp usingTeleportDoorTimeStamp; // A1C
NiPointer<ImageSpaceModifierInstanceDOF> ironsightsDOFInstance; // A20
TESFaction* currentPrisonFaction; // A28
std::uint32_t jailSentence; // A30
NiPointer<NiAVObject> autoAimDebugSphere; // A38
BGSNote* currHolotape; // A40
BSSoundHandle soundHand; // A48
std::int32_t vampireFeedDetection; // A50
std::uint32_t mapMarkerIterator; // A54
ObjectRefHandle forceActivateRef; // A58
ObjectRefHandle loopingActivateRef; // A5C
std::uint32_t dialogueCameraLastSceneID; // A60
PlayerActionObject playerActionObjects[15]; // A64
REX::TEnumSet<PLAYER_ACTION, std::int32_t> mostRecentAction; // B18
ActorHandle actorDoingPlayerCommand; // B1C
BSTValueEventSource<PlayerCommandTypeEvent> playerCurrentCommandType; // B20
BSTArray<void*> grabSprings; // B38 - hkRefPtr<hknpBSMouseSpringAction>
NiPoint3 grabUserRotation; // B50
ObjectRefHandle grabbedObject; // B5C
float grabObjectWeight; // B60
float grabDistance; // B64
std::uint32_t secondsToSleepPerUpdate; // B68
std::uint32_t sleepSeconds; // B6C
BSTSmartPointer<BipedAnim> firstPersonBipedAnim; // B70
NiPointer<NiNode> firstPerson3D; // B78
NiAVObject* firstPersonTorso; // B80
NiAVObject* firstPersonEye; // B88
float eyeHeight; // B90
float greetTimer; // B94
float encumberedTimer; // B98
float powerAttackTimer; // B9C
float autoReloadTimer; // BA0
float pivotToFaceCamera; // BA4
std::int32_t hourstosleep; // BA8
std::int32_t amountStolenSold; // BAC
std::uint32_t valueStolen; // BB0
ActorHandle lastRiddenMount; // BB4
ActorHandle lightTarget; // BB8
float sortActorDistanceTimer; // BBC
float sitHeadingDelta; // BC0
ObjectRefHandle playerMapMarker; // BC4
TeleportPath* playerMarkerPath; // BC8
std::uint32_t skillTrainingsThisLevel; // BD0
TESClass* defaultClass; // BD8
std::uint32_t crimeCounts[7]; // BE0
AlchemyItem* pendingPoison; // C00
std::time_t lastPlayingTimeUpdate; // C08
std::time_t totalPlayingTime; // C10
std::uint32_t characterSeed; // C18
TESForm* lastKnownGoodLocation; // C20
NiPointer<BSLight> firstPersonLight; // C28
NiPointer<BSLight> thirdPersonLight; // C30
NiPointer<BSLight> pipboyLight; // C38
NiPointer<NiLight> niPipboyLight; // C40
float dropAngleMod; // C48
float lastDropAngleMod; // C4C
BSTValueEventSource<PlayerAutoAimActorEvent> autoAimActor; // C50
ObjectRefHandle homingTarget; // C68
float homingTargetTimer; // C6C
NiPointer<NiAVObject> targeted3D; // C70
CombatGroup* combatGroup; // C78
BSTArray<ActorHandle> actorsToDisplayOnTheHUD; // C80
BSTArray<EquippedItem> lastOneHandItems; // C98
std::uint32_t teammateCount; // CB0
float combatTimer; // CB4
float yieldTimer; // CB8
float chaseTimer; // CBC
float drawSheatheSafetyTimer; // CC0
std::uint32_t activeCombatantCount; // CC4
BGSLocation* currentLocation; // CC8
AITimeStamp cachedVelocityTimeStamp; // CD0
float telekinesisDistance; // CD4
float commandTimer; // CD8
float dialogueCameraChangeRate; // CDC
float fireWeaponEventTimer; // CE0
REX::TEnumSet<DEFAULT_OBJECT, std::int32_t> animationObjectAction; // CE4
REX::TEnumSet<GrabbingType, std::int32_t> grabType; // CE8
ActorHandle assumedIdentity; // CEC
std::int8_t murder; // CF0
std::int8_t perkCount; // CF1
std::int8_t byCharGenFlag; // CF2
Crime* resistArrestCrime; // CF8
BGSCharacterTint::Entries* tintingData; // D00
BGSTextureSet* complexion; // D08
TESRace* charGenRace; // D10
EffectSetting* currentAlchemyEffect; // D18
ItemChange* currentTemperingInventoryItem; // D20
TESObjectREFR* commandTarget; // D28
TESObjectREFR* walkThroughDoor; // D30
REX::TEnumSet<COMMAND_TYPE, std::int32_t> currentCommand; // D38
REX::TEnumSet<SCENE_ACTION_PLAYER_RESPONSE_TYPE, std::int32_t> playerDialogueInput; // D3C
ActorValueInfo* stimpakTarget; // D40
float vatsCriticalCharge; // D48
std::uint32_t vatsCriticalCount; // D4C
std::uint32_t maxVATSCriticalCount; // D50
float timeBlendingOutFirstPersonOffset; // D54
ActorHandle lastMagnetismActor; // D58
NiPoint3 magnetismActorPos; // D5C
ObjectRefHandle workstationBeingLeft; // D68
ActorHandle actorLeavingWorkstation; // D6C
BGSScene* allowDialogueCameraScene; // D70
ActorHandle helloActor; // D78
TESObjectREFR* weaponAmmoRef; // D80
std::int32_t equippingAmmoCount; // D88
float dialogueCameraResumeTimer; // D8C
ObjectRefHandle lastUsedPowerArmor; // D90
TeleportPath* lastUsedPowerArmorMarkerPath; // D98
TESObjectWEAP* lastUsedThrownWeapon; // DA0
BSSoundHandle powerArmorInteriorSoundHandle; // DA8
BSTArray<BSTTuple<ObjectRefHandle, float>> lockedTerminals; // DB0
BSTArray<BSTTuple<std::int32_t, std::int32_t>> boneMapping1stTo3rd; // DC8
BSTOptional<XPChangeData> syncedXPChange; // DE0
std::int32_t queuedSwitch: 1; // DF4:00
std::uint32_t charGenHUDMode; // DF8
bool insideMemoryHUDMode: 1; // DFC:0
bool xpSyncedWithHUDNotification: 1; // DFC:1
bool travelUseDoor: 1; // DFC:2
bool transporting: 1; // DFC:3
bool overAutoAimTarget: 1; // DFC:4
bool showQuestItemsInInventory: 1; // DFC:5
bool hostileDetection: 1; // DFC:6
bool escaping: 1; // DFC:7
bool forceQuestTargetRepath: 1; // DFD:0
bool speaking: 1; // DFD:1
bool isSleeping: 1; // DFD:2
bool actorinSneakRange: 1; // DFD:3
bool greetingPlayer: 1; // DFD:4
bool beenAttacked: 1; // DFD:5
bool allowEGMCacheClear: 1; // DFD:6
bool aiControlledToPos: 1; // DFD:7
bool aiControlledFromPos: 1; // DFE:0
bool aiControlledPackage: 1; // DFE:1
bool returnToLastKnownGoodPosition: 1; // DFE:2
bool beingChased: 1; // DFE:3
bool is3rdPersonModelShown: 1; // DFE:4
bool hideFirstPersonGeometry: 1; // DFE:5
bool insufficientChargeMessageShownL: 1; // DFE:6
bool insufficientChargeMessageShownR: 1; // DFE:7
bool target3DDistant: 1; // DFF:0
bool playerInCombat: 1; // DFF:1
bool attemptedYieldInCurrentCombat: 1; // DFF:2
bool currentAlchemyIsPoison: 1; // DFF:3
bool positioning: 1; // DFF:4
bool crimeReporting: 1; // DFF:5
bool healthTutorialShown: 1; // DFF:6
bool magickaTutorialShown: 1; // DFF:7
bool staminaTutorialShown: 1; // E00:0
bool goToJailQueued: 1; // E00:1
bool doorAutosaveQueued: 1; // E00:2
bool sprintToggled: 1; // E00:3
bool useHighSpeedLoading: 1; // E00:4
bool sceneActionActive: 1; // E00:5
bool sayingHello: 1; // E00:6
bool disabledRadio: 1; // E00:7
bool updateAutoAimActor: 1; // E01:0
bool autoReload: 1; // E01:1
bool usingScopeWithOverlay: 1; // E01:2
bool steadyingWeapon: 1; // E01:3
bool speechChallengeReward: 1; // E01:4
bool blendOutFirstPersonOffset: 1; // E01:5
bool dialogueCameraConsiderResume: 1; // E01:6
bool shouldFollowerSupressIdleChatter: 1; // E01:7
bool idleChatter: 1; // E02:0
bool switchingPerspectives: 1; // E02:1
bool onElevator: 1; // E02:2
bool sayCommandResponse: 1; // E02:3
bool inLooksMenu: 1; // E02:4
bool playingTimeFrozen: 1; // E02:5
bool everModded: 1; // E02:6
};
static_assert(sizeof(PlayerCharacter) == 0xE10);
}
@@ -0,0 +1,27 @@
#pragma once
namespace RE
{
class BGSInstancedQuestObjective;
namespace PlayerCharacterQuestEvent
{
enum Type : std::int32_t
{
kAddObjective = 0x0,
kUpdateObjective = 0x1,
kRemoveQuest = 0x2,
kRemoveQuestTarget = 0x3,
kUpdateQuestTarget = 0x4
};
class Event
{
public:
// members
PlayerCharacterQuestEvent::Type changeType; // 00
BGSInstancedQuestObjective* questObjective; // 08
};
static_assert(sizeof(Event) == 0x10);
}
}
@@ -0,0 +1,15 @@
#pragma once
#include "RE/B/BSTEvent.h"
namespace RE
{
enum class COMMAND_TYPE;
class PlayerCommandTypeEvent :
public BSTValueEvent<COMMAND_TYPE> // 0
{
public:
};
static_assert(sizeof(PlayerCommandTypeEvent) == 0x8);
}
@@ -0,0 +1,110 @@
#pragma once
#include "RE/A/ActionInput.h"
#include "RE/B/BSInputEventReceiver.h"
#include "RE/B/BSPointerHandle.h"
#include "RE/B/BSSpinLock.h"
#include "RE/B/BSTArray.h"
#include "RE/B/BSTEvent.h"
#include "RE/B/BSTSingleton.h"
#include "RE/H/HeldStateHandler.h"
#include "RE/I/IMovementPlayerControls.h"
#include "RE/P/PlayerInputHandler.h"
namespace RE
{
enum class DEFAULT_OBJECT;
class ActivateHandler;
class AttackBlockHandler;
class AutoMoveHandler;
class GrabRotationHandler;
class JumpHandler;
class LookHandler;
class MeleeThrowHandler;
class MenuModeChangeEvent;
class MenuOpenCloseEvent;
class MovementHandler;
class QuickContainerStateEvent;
class ReadyWeaponHandler;
class RunHandler;
class SneakHandler;
class SprintHandler;
class TogglePOVHandler;
class ToggleRunHandler;
class UserEventEnabledEvent;
class TESFurnitureEvent;
class __declspec(novtable) PlayerControls :
public BSInputEventReceiver, // 000
public BSTEventSink<MenuOpenCloseEvent>, // 010
public BSTEventSink<MenuModeChangeEvent>, // 018
public BSTEventSink<TESFurnitureEvent>, // 020
public BSTEventSink<UserEventEnabledEvent>, // 028
public IMovementPlayerControls, // 030
public BSTEventSink<QuickContainerStateEvent>, // 038
public BSTSingletonSDM<PlayerControls> // 040
{
public:
static constexpr auto RTTI{ RTTI::PlayerControls };
static constexpr auto VTABLE{ VTABLE::PlayerControls };
enum class LERP_GRAPH
{
kMovementThird = 0x0,
kMovementFirst = 0x1,
kLooking = 0x2
};
static PlayerControls* GetSingleton()
{
static REL::Relocation<PlayerControls**> singleton{ ID::PlayerControls::Singleton };
return *singleton;
}
bool DoAction(DEFAULT_OBJECT a_action, ActionInput::ACTIONPRIORITY a_priority)
{
using func_t = decltype(&PlayerControls::DoAction);
static REL::Relocation<func_t> func{ ID::PlayerControls::DoAction };
return func(this, a_action, a_priority);
}
void RegisterHandler(PlayerInputHandler* a_handler) { DoRegisterHandler(a_handler, false); }
void RegisterHandler(HeldStateHandler* a_handler) { DoRegisterHandler(a_handler, true); }
// members
PlayerControlsData data; // 044
BSTArray<PlayerInputHandler*> handlers; // 090
BSTArray<HeldStateHandler*> heldStateHandlers; // 0A8
std::uint32_t topGraphPoint[3]; // 0C0
float graphPoints[3][10][2]; // 0CC
BSTArray<ActorHandle> actionInterestedActors; // 1C0
BSSpinLock actorArraySpinLock; // 1D8
MovementHandler* movementHandler; // 1E0
LookHandler* lookHandler; // 1E8
SprintHandler* sprintHandler; // 1F0
ReadyWeaponHandler* readyWeaponHandler; // 1F8
AutoMoveHandler* autoMoveHandler; // 200
ToggleRunHandler* toggleRunHandler; // 208
ActivateHandler* activateHandler; // 210
JumpHandler* jumpHandler; // 218
AttackBlockHandler* attackHandler; // 220
RunHandler* runHandler; // 228
SneakHandler* sneakHandler; // 230
TogglePOVHandler* togglePOVHandler; // 238
MeleeThrowHandler* meleeThrowHandler; // 240
GrabRotationHandler* grabRotationHandler; // 248
bool notifyingHandlers; // 250
bool blockPlayerInput; // 251
float cameraAutoRotationX; // 254
float cameraAutoRotationY; // 258
private:
void DoRegisterHandler(PlayerInputHandler* a_handler, bool a_isHeldStateHandler)
{
using func_t = decltype(&PlayerControls::DoRegisterHandler);
static REL::Relocation<func_t> func{ ID::PlayerControls::DoRegisterHandler };
return func(this, a_handler, a_isHeldStateHandler);
}
};
static_assert(sizeof(PlayerControls) == 0x260);
}
@@ -0,0 +1,26 @@
#pragma once
#include "RE/B/BSSpring_SpringState.h"
#include "RE/N/NiPoint2.h"
namespace RE
{
class PlayerControlsData
{
public:
// members
NiPoint2 moveInputVec; // 00
NiPoint2 lookInputVec; // 08
NiPoint2 lookInputVecNormalized; // 10
NiPoint2 prevMoveVec; // 18
NiPoint2 prevLookVec; // 20
BSSpring::SpringState<NiPoint3> rotationSpeedSpring; // 28
bool autoMove; // 44
bool running; // 45
bool togglePOV; // 46
bool vanityModeEnabled; // 47
bool checkHeldStates; // 48
bool setupHeldStatesForRelease; // 49
};
static_assert(sizeof(PlayerControlsData) == 0x4C);
}
@@ -0,0 +1,16 @@
#pragma once
#include "RE/M/MovementData.h"
#include "RE/N/NiPoint3.h"
namespace RE
{
class PlayerControlsMovementData :
public MovementData // 00
{
public:
// members
NiPoint3A targetAngle; // 30
};
static_assert(sizeof(PlayerControlsMovementData) == 0x40);
}
@@ -0,0 +1,22 @@
#pragma once
#include "RE/N/NiPoint3.h"
namespace RE
{
class PlayerCoverData
{
public:
enum class PEEK_STATE : std::int32_t;
// members
NiPoint3 coverLocation; // 00
NiPoint3 peekLocation; // 0C
float peekTimer; // 18
float updateTimer; // 2C
float blockedTimer; // 20
PEEK_STATE peekState; // 24
bool gunBlocked; // 28
};
static_assert(sizeof(PlayerCoverData) == 0x2C);
}
@@ -0,0 +1,24 @@
#pragma once
namespace RE
{
enum class CrosshairMode;
class PlayerCrosshairModeEvent :
public BSTValueEvent<CrosshairMode>
{
private:
using EventSource_t = BSTGlobalEvent::EventSource<PlayerCrosshairModeEvent>;
public:
[[nodiscard]] static EventSource_t* GetEventSource()
{
static REL::Relocation<EventSource_t**> singleton{ ID::PlayerCrosshairModeEvent::GetEventSource };
if (!*singleton) {
*singleton = new EventSource_t(&BSTGlobalEvent::GetSingleton()->eventSourceSDMKiller);
}
return *singleton;
}
};
static_assert(sizeof(PlayerCrosshairModeEvent) == 0x08);
}
@@ -0,0 +1,16 @@
#pragma once
namespace RE
{
namespace PlayerDifficultySettingChanged
{
class Event
{
public:
// members
std::uint32_t oldDifficulty; // 00
std::uint32_t newDifficulty; // 04
};
static_assert(sizeof(Event) == 0x8);
}
}
@@ -0,0 +1,15 @@
#pragma once
namespace RE
{
namespace PlayerInDialogueChanged
{
class Event
{
public:
// members
bool isPlayerInDialogue; // 00
};
static_assert(sizeof(Event) == 0x1);
}
}
@@ -0,0 +1,30 @@
#pragma once
#include "RE/B/BSInputEventUser.h"
#include "RE/P/PlayerControlsData.h"
namespace RE
{
class PlayerInputHandler :
public BSInputEventUser // 00
{
public:
static constexpr auto RTTI{ RTTI::PlayerInputHandler };
static constexpr auto VTABLE{ VTABLE::PlayerInputHandler };
explicit constexpr PlayerInputHandler(PlayerControlsData& a_data) noexcept :
data(a_data)
{}
// NOLINTNEXTLINE(modernize-use-override)
virtual ~PlayerInputHandler() = default; // 00
// add
virtual void PerFrameUpdate() { return; }; // 09
// members
PlayerControlsData& data; // 10
bool inQuickContainer{ false }; // 18
};
static_assert(sizeof(PlayerInputHandler) == 0x20);
}
@@ -0,0 +1,17 @@
#pragma once
namespace RE
{
enum class ACTOR_LIFE_STATE;
namespace PlayerLifeStateChanged
{
class Event
{
public:
// members
ACTOR_LIFE_STATE lifeState; // 00
};
static_assert(sizeof(Event) == 0x4);
}
}
@@ -0,0 +1,10 @@
#pragma once
namespace RE
{
class PlayerUpdateEvent
{
public:
};
static_assert(std::is_empty_v<PlayerUpdateEvent>);
}
@@ -0,0 +1,13 @@
#pragma once
#include "RE/B/BSTEvent.h"
namespace RE
{
class PlayerWeaponReloadEvent :
public BSTValueEvent<bool>
{
public:
};
static_assert(sizeof(PlayerWeaponReloadEvent) == 0x2);
}
@@ -0,0 +1,22 @@
#pragma once
namespace RE
{
class PositionPlayerEvent
{
public:
enum EVENT_TYPE : std::int32_t
{
kPrePositionPlayer = 0x0,
kPositionPlayerPreUpdatePackages = 0x1,
kPositionPlayerPostUpdatePackages = 0x2,
kPostPositionPlayer = 0x3,
kFinishPositionPlayer = 0x4,
};
// members
EVENT_TYPE type; // 00
bool NoLoadScreen; // 04
};
static_assert(sizeof(PositionPlayerEvent) == 0x8);
}
@@ -0,0 +1,66 @@
#pragma once
#include "RE/P/PlayerCharacter.h"
#include "RE/S/Setting.h"
namespace RE
{
class BGSInventoryItem;
namespace PowerArmor
{
[[nodiscard]] inline bool ActorInPowerArmor(const Actor& a_actor)
{
using func_t = decltype(&ActorInPowerArmor);
static REL::Relocation<func_t> func{ ID::PowerArmor::ActorInPowerArmor };
return func(a_actor);
}
[[nodiscard]] inline bool PlayerInPowerArmor()
{
auto PlayerCharacter = PlayerCharacter::GetSingleton();
return PlayerCharacter ? ActorInPowerArmor(*PlayerCharacter) : false;
}
[[nodiscard]] inline BGSKeyword* GetArmorKeyword()
{
using func_t = decltype(&GetArmorKeyword);
static REL::Relocation<func_t> func{ ID::PowerArmor::GetArmorKeyword };
return func();
}
[[nodiscard]] inline BGSKeyword* GetBatteryKeyword()
{
using func_t = decltype(&GetBatteryKeyword);
static REL::Relocation<func_t> func{ ID::PowerArmor::GetBatteryKeyword };
return func();
}
[[nodiscard]] inline TESAmmo* GetDefaultBatteryObject()
{
using func_t = decltype(&GetDefaultBatteryObject);
static REL::Relocation<func_t> func{ ID::PowerArmor::GetDefaultBatteryObject };
return func();
}
[[nodiscard]] inline bool IsPowerArmorBattery(const TESBoundObject* a_itemData)
{
using func_t = decltype(&IsPowerArmorBattery);
static REL::Relocation<func_t> func{ ID::PowerArmor::IsPowerArmorBattery };
return func(a_itemData);
}
inline void SyncFurnitureVisualsToInventory(TESObjectREFR* a_furniture, bool a_force3DUpdate, BGSInventoryItem* a_tempItemToAdd, bool a_hideCore)
{
using func_t = decltype(&SyncFurnitureVisualsToInventory);
static REL::Relocation<func_t> func{ ID::PowerArmor::SyncFurnitureVisualsToInventory };
return func(a_furniture, a_force3DUpdate, a_tempItemToAdd, a_hideCore);
}
[[nodiscard]] inline SettingT<GameSettingCollection>* GetNewBatteryCapacity()
{
static REL::Relocation<SettingT<GameSettingCollection>*> value{ ID::PowerArmor::fNewBatteryCapacity };
return value.get();
}
}
}
@@ -0,0 +1,99 @@
#pragma once
#include "RE/B/BSIntrusiveRefCounted.h"
#include "RE/B/BSTArray.h"
#include "RE/B/BSTEvent.h"
#include "RE/B/BSTSingleton.h"
#include "RE/C/CurrentRadiationSourceCount.h"
#include "RE/C/CurrentRadsDisplayMagnitude.h"
#include "RE/C/CurrentRadsPercentOfLethal.h"
#include "RE/H/HUDModes.h"
#include "RE/N/NiPointer.h"
#include "RE/P/PipboyLightEvent.h"
#include "RE/P/PlayerAmmoCountEvent.h"
#include "RE/P/PlayerWeaponReloadEvent.h"
#include "RE/S/SimpleAnimationGraphManagerHolder.h"
namespace RE
{
class NiAVObject;
class NiNode;
namespace ExitPowerArmor
{
class Event;
}
namespace PreloadPowerArmor
{
class Event;
}
class __declspec(novtable) PowerArmorGeometry :
public SimpleAnimationGraphManagerHolder, // 00
public BSTEventSink<PreloadPowerArmor::Event>, // 18
public BSTEventSink<ExitPowerArmor::Event>, // 20
public BSIntrusiveRefCounted, // 28
public BSTSingletonSDM<PowerArmorGeometry> // 2C
{
public:
static constexpr auto RTTI{ RTTI::PowerArmorGeometry };
static constexpr auto VTABLE{ VTABLE::PowerArmorGeometry };
virtual ~PowerArmorGeometry(); // 00
// override
virtual void BackgroundTaskFinishedLoading() override; // 01
virtual BSEventNotifyControl ProcessEvent(const PreloadPowerArmor::Event& a_event, BSTEventSource<PreloadPowerArmor::Event>* a_source) override; // 02
virtual BSEventNotifyControl ProcessEvent(const ExitPowerArmor::Event& a_event, BSTEventSource<ExitPowerArmor::Event>* a_source) override; // 03
[[nodiscard]] static PowerArmorGeometry* GetSingleton()
{
static REL::Relocation<PowerArmorGeometry**> singleton{ ID::PowerArmorGeometry::Singleton };
return *singleton;
}
void HidePipboyPAGeometry()
{
using func_t = decltype(&PowerArmorGeometry::HidePipboyPAGeometry);
static REL::Relocation<func_t> func{ ID::PowerArmorGeometry::HidePipboyPAGeometry };
return func(this);
}
void ShowPipboyPAGeometry()
{
using func_t = decltype(&PowerArmorGeometry::ShowPipboyPAGeometry);
static REL::Relocation<func_t> func{ ID::PowerArmorGeometry::ShowPipboyPAGeometry };
return func(this);
}
// members
BSTValueEventSink<PipboyLightEvent> pipboySpotLightEvent; // 030
BSTValueEventSink<PlayerAmmoCountEvent> nextAmmoCount; // 048
BSTValueEventSink<PlayerWeaponReloadEvent> playerReloaded; // 068
BSTValueEventSink<CurrentRadsDisplayMagnitude> radsCount; // 080
BSTValueEventSink<CurrentRadsPercentOfLethal> radsPercentOfLethal; // 0A0
BSTValueEventSink<CurrentRadiationSourceCount> radiationSourceCount; // 0C0
TESImageSpaceModifier* paPipboyEffect; // 0E0
NiPointer<NiNode> paDashDials; // 0E8
NiPointer<NiNode> pipboyPAGlass; // 0F0
NiAVObject* paDashLightSpot; // 0F8
NiAVObject* paDashLightScope; // 100
NiAVObject* paDashLightAux; // 108
NiAVObject* paDash; // 110
NiAVObject* plane; // 118
NiAVObject* compass; // 120
BSTArray<void*> queued3D; // 128
HUDModes validHUDModes; // 140
float radiationSmoother; // 160
NiPointer<NiNode> dbHUDRain; // 168
bool hudRain; // 170
bool prevShouldBeVisible; // 171
bool powerArmorEmergencyLightOn; // 172
bool queueInit; // 173
bool prevIsFirstPerson; // 174
bool ammoDirty; // 175
bool initialized; // 176
};
static_assert(sizeof(PowerArmorGeometry) == 0x178);
}
@@ -0,0 +1,26 @@
#pragma once
#include "RE/B/BSTEvent.h"
namespace RE
{
class PowerArmorLightData
{
private:
using EventSource_t = BSTGlobalEvent::EventSource<PowerArmorLightData>;
public:
[[nodiscard]] static EventSource_t* GetEventSource()
{
static REL::Relocation<EventSource_t**> singleton{ ID::PowerArmorLightData::GetEventSource };
if (!*singleton) {
*singleton = new EventSource_t(&BSTGlobalEvent::GetSingleton()->eventSourceSDMKiller);
}
return *singleton;
}
// members
bool lightOn; // 00
};
static_assert(sizeof(PowerArmorLightData) == 0x1);
}
@@ -0,0 +1,49 @@
#pragma once
#include "RE/E/ExamineMenu.h"
namespace RE
{
class __declspec(novtable) PowerArmorModMenu :
public ExamineMenu
{
public:
static constexpr auto RTTI{ RTTI::PowerArmorModMenu };
static constexpr auto VTABLE{ VTABLE::PowerArmorModMenu };
static constexpr auto MENU_NAME{ "PowerArmorModMenu"sv };
virtual ~PowerArmorModMenu(); // 00
// override (ExamineMenu)
virtual void PreDisplay() override;
virtual void BuildCanceled() override; // 16
virtual void BuildConfirmed(bool a_ownerIsWorkbench) override; // 17
virtual bool GetWorkbenchHasInventory() override; // 18
virtual const ModChoiceData* QCurrentModChoiceData() override; // 19
virtual void ShowBuildFailureMessage() override; // 1A
virtual EQUIP_TYPE GetInventoryEntryEquipState(const InventoryUserUIInterfaceEntry& a_entry) override; // 1C
virtual void ShowCurrent3D() override; // 1D
virtual void HighlightWeaponPart() override; // 28
virtual void ResetHighlight() override; // 29
virtual void CreateModdedInventoryItem() override; // 2A
virtual const char* GetBuildConfirmButtonLabel() override; // 30
virtual void GetBuildConfirmQuestion(char* a_buffer, std::uint32_t a_bufferLength) override; // 31
virtual bool GetCanRepairSelectedItem() override; // 32
virtual NiAVObject* GetCurrent3D() override; // 33
virtual bool GetCurrent3DLoaded() override; // 34
virtual bool GetIsValidInventoryItem(const BGSInventoryItem& a_item, std::uint32_t a_stackID) override; // 35
virtual const char* GetMenuName() override; // 36
virtual void OnSwitchBaseItem() override; // 37
virtual void PopulateInventoryItemObj(ObjectRefHandle a_owner, const InventoryUserUIInterfaceEntry& a_entry, Scaleform::GFx::Value& a_itemObj) override; // 38
virtual void RegisterMenuComponents(const Scaleform::GFx::FunctionHandler::Params& a_params) override; // 39
virtual void RepairSelectedItem() override; // 3A
virtual void SetFilter() override; // 3B
virtual void ToggleItemEquipped() override; // 3D
virtual void UpdateModChoiceList() override; // 3F
// members
WorkbenchMenuBase::ModChoiceData repairData; // 810
bool queuePreviewedPieceAttatch; // 848
};
static_assert(sizeof(PowerArmorModMenu) == 0x850);
}
@@ -0,0 +1,81 @@
#pragma once
#include "RE/B/BSCRC32.h"
#include "RE/B/BSTArray.h"
#include "RE/B/BSTHashMap.h"
namespace RE
{
namespace PowerUtils
{
class GridConnection
{
public:
~GridConnection() noexcept {} // NOLINT(modernize-use-equals-default)
// members
std::uint32_t connection{ 0 }; // 0 - the powered object
std::uint32_t connector{ 0 }; // 4 - how the object is connected
};
static_assert(sizeof(GridConnection) == 0x8);
class GridSaveLoadData
{
public:
// members
std::uint32_t node{ 0 }; // 0
GridConnection connection; // 4
};
static_assert(sizeof(GridSaveLoadData) == 0xC);
class PowerGrid
{
public:
// members
BSTHashMap<std::uint32_t, BSTSet<GridConnection>*> adjacencyMap; // 00 - maps powered objects to the objects they connect to
BSTArray<GridSaveLoadData> loadGameData; // 30
std::uint32_t loadElement{ 0 }; // 48
BSTArray<std::uint32_t> currentlyPowered; // 50
float capacity{ 0.0 }; // 68
float load{ 0.0 }; // 6C
};
static_assert(sizeof(PowerGrid) == 0x70);
class TraverseConnectionsOptions
{
public:
// members
std::uint32_t ignoreMode; // 00
bool wiredOnly; // 04
bool inputsOnly; // 05
};
static_assert(sizeof(TraverseConnectionsOptions) == 0x8);
inline bool ItemIsPowerConnection(const TESObjectREFR* a_refr)
{
using func_t = decltype(&PowerUtils::ItemIsPowerConnection);
static REL::Relocation<func_t> func{ ID::PowerUtils::ItemIsPowerConnection };
return func(a_refr);
}
inline bool ItemIsPowerReceiver(const TESObjectREFR* a_refr)
{
using func_t = decltype(&PowerUtils::ItemIsPowerReceiver);
static REL::Relocation<func_t> func{ ID::PowerUtils::ItemIsPowerReceiver };
return func(a_refr);
}
}
template <>
struct BSCRC32<PowerUtils::GridConnection>
{
public:
[[nodiscard]] std::uint32_t operator()(const PowerUtils::GridConnection& a_connection) const noexcept
{
return detail::GenerateCRC32(
std::span(
reinterpret_cast<const std::uint8_t*>(std::addressof(a_connection)),
sizeof(PowerUtils::GridConnection)));
}
};
}
@@ -0,0 +1,14 @@
#pragma once
#include "RE/B/BSPrecomputedNavmeshInfoPathMap.h"
namespace RE
{
class PrecomputedNavmeshInfoPathMap :
public BSPrecomputedNavmeshInfoPathMap // 00
{
public:
static constexpr auto RTTI{ RTTI::PrecomputedNavmeshInfoPathMap };
};
static_assert(sizeof(PrecomputedNavmeshInfoPathMap) == 0x48);
}
@@ -0,0 +1,149 @@
#pragma once
#include "RE/B/BSContainer.h"
#include "RE/B/BSPointerHandle.h"
#include "RE/B/BSSemaphore.h"
#include "RE/B/BSSimpleList.h"
#include "RE/B/BSSpinLock.h"
#include "RE/B/BSTArray.h"
#include "RE/B/BSTEvent.h"
#include "RE/B/BSTSingleton.h"
#include "RE/B/BSTSmartPointer.h"
#include "RE/B/BSTempEffect.h"
#include "RE/M/ModelReferenceEffect.h"
#include "RE/N/NiPointer.h"
#include "RE/P/PTYPE.h"
#include "RE/S/ShaderReferenceEffect.h"
namespace RE
{
class Crime;
class MuzzleFlash;
class PositionPlayerEvent;
class SyncQueueObj;
class __declspec(novtable) ProcessLists :
public BSTEventSink<PositionPlayerEvent>, // 000
public BSTSingletonSDM<ProcessLists> // 008
{
public:
static constexpr auto RTTI{ RTTI::ProcessLists };
static constexpr auto VTABLE{ VTABLE::ProcessLists };
virtual ~ProcessLists(); // 00
// override
virtual BSEventNotifyControl ProcessEvent(const PositionPlayerEvent&, BSTEventSource<PositionPlayerEvent>*) override; // 01
[[nodiscard]] static ProcessLists* GetSingleton()
{
static REL::Relocation<ProcessLists**> singleton{ ID::ProcessLists::Singleton };
return *singleton;
}
[[nodiscard]] bool AreHostileActorsNear(BSScrapArray<ActorHandle>* a_hostileActorArray)
{
using func_t = decltype(&ProcessLists::AreHostileActorsNear);
static REL::Relocation<func_t> func{ ID::ProcessLists::AreHostileActorsNear };
return func(this, a_hostileActorArray);
}
void ForEachMagicTempEffect(std::function<BSContainer::ForEachResult(BSTempEffect*)> a_callback)
{
BSAutoLock locker(magicEffectsLock);
for (auto& tempEffectPtr : magicEffects) {
const auto& tempEffect = tempEffectPtr.get();
if (tempEffect && a_callback(tempEffect) == BSContainer::ForEachResult::kStop) {
break;
}
}
}
void ForEachModelEffect(std::function<BSContainer::ForEachResult(ModelReferenceEffect*)> a_callback)
{
ForEachMagicTempEffect([a_callback](BSTempEffect* a_tempEffect) {
const auto modelEffect = a_tempEffect->As<ModelReferenceEffect>();
if (modelEffect && a_callback(modelEffect) == BSContainer::ForEachResult::kStop) {
return BSContainer::ForEachResult::kStop;
}
return BSContainer::ForEachResult::kContinue;
});
}
void ForEachShaderEffect(std::function<BSContainer::ForEachResult(ShaderReferenceEffect*)> a_callback)
{
ForEachMagicTempEffect([a_callback](BSTempEffect* a_tempEffect) {
const auto shaderEffect = a_tempEffect->As<ShaderReferenceEffect>();
if (shaderEffect && a_callback(shaderEffect) == BSContainer::ForEachResult::kStop) {
return BSContainer::ForEachResult::kStop;
}
return BSContainer::ForEachResult::kContinue;
});
}
[[nodiscard]] bool IsActorTargetingREFinPackage(const TESObjectREFR* a_actor, PTYPE a_type, bool a_onlyHigh)
{
using func_t = decltype(&ProcessLists::IsActorTargetingREFinPackage);
static REL::Relocation<func_t> func{ ID::ProcessLists::IsActorTargetingREFinPackage };
return func(this, a_actor, a_type, a_onlyHigh);
}
[[nodiscard]] std::int16_t RequestHighestDetectionLevelAgainstActor(Actor* a_actor, std::uint32_t& a_LOSCount)
{
using func_t = decltype(&ProcessLists::RequestHighestDetectionLevelAgainstActor);
static REL::Relocation<func_t> func{ ID::ProcessLists::RequestHighestDetectionLevelAgainstActor };
return func(this, a_actor, a_LOSCount);
}
// members
BSSemaphore movementSyncSema; // 010
float crimeUpdateTimer; // 018
float removeExcessDeadTimer; // 01C
std::int32_t numberHighActors; // 020
std::int32_t numberFullyEnabledHighActors; // 024
std::int32_t crimeNumber; // 028
ActorHandle statdetect; // 02C
bool runDetection; // 030
bool showDetectionStats; // 031
bool processHigh; // 032
bool processLow; // 033
bool processMHigh; // 034
bool processMLow; // 035
bool processSche; // 036
bool showSubtitle; // 037
bool updatingLowList; // 038
float secondsPassedNoProcess; // 03C
BSTArray<ActorHandle> highActorHandles; // 040
BSTArray<ActorHandle> lowActorHandles; // 058
BSTArray<ActorHandle> middleHighActorHandles; // 070
BSTArray<ActorHandle> middleLowActorHandles; // 088
BSTArray<ActorHandle>* allProcesss[4]; // 0A0
BSSimpleList<Crime*>* globalCrimes[7]; // 0C0
BSTArray<NiPointer<BSTempEffect>> globalTempEffects; // 0F8
BSSpinLock globalEffectsLock; // 110
BSTArray<NiPointer<BSTempEffect>> magicEffects; // 118
BSSpinLock magicEffectsLock; // 130
BSTArray<NiPointer<BSTempEffect>> interfaceEffects; // 138
BSSpinLock interfaceEffectsLock; // 150
BSSimpleList<MuzzleFlash*> referenceMuzzleFlashes; // 158
BSTArray<ObjectRefHandle> tempShouldMoves; // 168
BSSimpleList<ActorHandle> aliveActors; // 180
BSSimpleList<ActorHandle> idleChatterActors; // 190
BSSimpleList<ActorHandle> randomDialogueActors; // 1A0
BSTArray<ActorHandle> initPackageLocationsQueue; // 1B0
BSSpinLock packageLocationsQueueLock; // 1C8
BSTArray<ActorHandle> initAnimPositionQueue; // 1D0
BSTArray<BSTSmartPointer<SyncQueueObj>> syncPositionQueue; // 1E8
float playerActionCommentTimer; // 200
float playerKnockObjectCommentTimer; // 204
std::uint32_t currentLowActor; // 208
std::uint32_t currentMiddleHighActor; // 20C
std::uint32_t currentMiddleLowActor; // 210
bool runSchedules; // 214
bool runMovement; // 215
bool runAnimations; // 216
bool updateActorsInPlayerCell; // 217
};
static_assert(sizeof(ProcessLists) == 0x218);
}
@@ -0,0 +1,166 @@
#pragma once
#include "RE/B/BGSBodyPartDefs.h"
#include "RE/B/BGSEquipIndex.h"
#include "RE/B/BGSObjectInstance.h"
#include "RE/B/BSPointerHandle.h"
#include "RE/B/BSSoundHandle.h"
#include "RE/B/BSTArray.h"
#include "RE/B/bhkCollisionQueryResultHandle.h"
#include "RE/C/CELLJobs.h"
#include "RE/C/CFilter.h"
#include "RE/H/hknpBodyId.h"
#include "RE/N/NiPoint3.h"
#include "RE/N/NiPointer.h"
#include "RE/N/NiTransform.h"
#include "RE/T/TESObjectREFR.h"
namespace RE
{
enum class COL_LAYER;
enum class ImpactResult;
class bhkNPCollisionObject;
class BSMagicShaderParticles;
class hknpAllHitsCollector;
class hknpShape;
class NiAVObject;
class NiLight;
class NiNode;
class QueuedFile;
namespace MagicSystem
{
enum class CastingSource;
}
class __declspec(novtable) Projectile :
public TESObjectREFR // 000
{
public:
static constexpr auto RTTI{ RTTI::Projectile };
static constexpr auto VTABLE{ VTABLE::Projectile };
static constexpr auto FORM_ID{ ENUM_FORM_ID::kREFR };
class ImpactCreation
{
public:
// members
NiPoint3A contactPoint; // 00
NiPoint3A contactNormal; // 10
TESObjectREFR* collidee; // 20
CFilter collisionFilter; // 28
hknpBodyId collisionBodyId; // 2C
std::uint32_t collisionShapeKey; // 30
bool spellCast; // 34
bool backface; // 35
bool trigger; // 36
};
static_assert(sizeof(ImpactCreation) == 0x40);
class ImpactData
{
public:
// members
NiPoint3 location; // 00
NiPoint3 normal; // 0C
bhkCollisionQueryResultHandle impactDecalQuery; // 18
ObjectRefHandle collidee; // 20
NiPointer<bhkNPCollisionObject> colObj; // 28
BGSMaterialType* materialType; // 30
BGSBodyPartDefs::LIMB_ENUM damageLimb; // 38
COL_LAYER collisionLayer; // 3C
NiPointer<NiNode> closestBone; // 40
ImpactResult resultOverride; // 48
float decalSize; // 4C
std::uint32_t collisionShapeKey; // 50
std::int16_t targetWorldObjectCount; // 54
std::int16_t targetWorldObjectIndex; // 56
bool processed; // 58
bool spellCast; // 59
bool effectSpawned; // 5A
bool backface; // 5B
};
static_assert(sizeof(ImpactData) == 0x60);
// add
virtual bool IsMissileProjectile() const { return false; } // C6
virtual bool IsGrenadeProjectile() const { return false; } // C7
virtual bool IsFlameProjectile() const { return false; } // C8
virtual bool IsBeamProjectile() const { return false; } // C9
virtual bool IsFogProjectile() const { return false; } // CA
virtual bool IsBarrierProjectile() const { return false; } // CB
virtual void OnKill() { return; } // CC
virtual void Process3D() { return; } // CD
virtual void PostLoad3D(NiAVObject* a_obj3D); // CE
virtual void UpdateImpl(float a_delta) = 0; // CF
virtual bool ProcessImpacts(); // D0
virtual void Update3D(CELLJobs::AnimatedRefJobData* a_data); // D1
virtual bool IsMine() const { return false; } // D2
virtual float GetPowerSpeedMult() const { return spell ? 1.0F : power; } // D3
virtual float GetWeaponSpeedMult() const { return 1.0F; } // D4
virtual bool GetStopMainSoundAfterImpact() const { return false; } // D5
virtual void ReportHavokDeactivation() { return; } // D6
virtual bool TurnOff(Actor* a_actionActor, bool a_silent); // D7
virtual bool IsPermanent(); // D8
virtual float GetGravity() const; // D9
virtual void CleanUpPointersOnDisable(); // DA
virtual bool RunTargetPick(); // DB
virtual bool GetKillOnCollision() const { return true; } // DC
virtual bool ShouldBeLimited() const { return false; } // DD
virtual bool TargetsWholeBody() const { return false; } // DE
virtual bool GetAllowMovement() const; // DF
virtual std::uint32_t GetCollisionGroup() const; // E0
virtual hknpShape* GetCollisionShape(); // E1
virtual void InitializeImpl() { return; } // E2
virtual void Relaunch() { return; } // E3
virtual std::uint32_t AddImpact(const ImpactCreation& a_data); // E4
virtual bool HandleHits(const hknpAllHitsCollector& a_collector, const NiPoint3& a_from, const NiPoint3& a_to); // E5
virtual void OnEnterTrigger() { return; } // E6
virtual void AddInitialVelocity(); // E7
virtual void Handle3DLoaded() { return; } // E8
virtual bool ShouldUseDesiredTarget() { return false; } // E9
// members
BSTArray<ImpactData> impacts; // 110
NiTransform followOffset; // 130
NiPointer<bhkNPCollisionObject> collisionObject; // 170
NiPointer<TESObjectREFR> droppedRefr; // 178
NiPoint3 movementDirection; // 180
NiPoint3 velocity; // 18C
NiPointer<NiLight> light; // 198
NiPointer<ActorCause> actorCause; // 1A0
ObjectRefHandle shooter; // 1A8
ObjectRefHandle desiredTarget; // 1AC
BSSoundHandle sndHandle; // 1B0
BSSoundHandle sndCountdown; // 1B8
BGSExplosion* explosion; // 1C0
MagicItem* spell; // 1C8
REX::TEnumSet<MagicSystem::CastingSource, std::int32_t> castingSource; // 1D0
EffectSetting* avEffect; // 1D8
NiPointer<QueuedFile> projectileDBFiles; // 1E0
void* muzzleFlashDBHandle; // 1E8 - TODO
NiPointer<NiNode> muzzleFlashArt; // 1F0
BSMagicShaderParticles* particles; // 1F8
REX::TEnumSet<BGSBodyPartDefs::LIMB_ENUM, std::uint32_t> targetLimb; // 200
NiPointer<NiAVObject> targetLimbObj; // 208
NiAVObject* clonePoolKey; // 210
float power; // 218
float speedMult; // 21C
float range; // 220
float age; // 224
float damage; // 228
float alpha; // 22C
float explosionTimer; // 230
float blinkTimer; // 234
BGSObjectInstanceT<TESObjectWEAP> weaponSource; // 238
TESAmmo* ammoSource; // 248
BGSEquipIndex equipIndex; // 250
float distanceMoved; // 254
float movementDelta; // 258
float scale; // 25C
std::uint64_t flags; // 260
bool artRequested; // 268
bool animationsLoaded; // 269
};
static_assert(sizeof(Projectile) == 0x270);
}
@@ -0,0 +1,55 @@
#pragma once
#include "RE/B/BGSBodyPartDefs.h"
#include "RE/B/BGSEquipIndex.h"
#include "RE/B/BGSObjectInstance.h"
#include "RE/N/NiPoint3.h"
namespace RE
{
class CombatController;
namespace MagicSystem
{
enum class CastingSource;
}
class ProjectileLaunchData
{
public:
// members
NiPoint3 origin; // 00
NiPoint3 contactNormal; // 0C
BGSProjectile* projectileBase; // 18
TESObjectREFR* shooter; // 20
CombatController* shooterCombatController; // 28
BGSObjectInstanceT<TESObjectWEAP> fromWeapon; // 30
TESAmmo* fromAmmo; // 40
BGSEquipIndex equipIndex; // 48
float zAngle; // 4C
float xAngle; // 50
float yAngle; // 54
TESObjectREFR* homingTarget; // 58
TESObjectCELL* parentCell; // 60
MagicItem* spell; // 68
MagicSystem::CastingSource castingSource; // 70
AlchemyItem* poison; // 78
std::int32_t area; // 80
float power; // 84
float scale; // 88
float coneOfFireRadiusMult; // 8C
BGSBodyPartDefs::LIMB_ENUM targetLimb; // 90
bool alwaysHit; // 94
bool noDamageOutsideCombat; // 95
bool autoAim; // 96
bool useOrigin; // 97
bool deferInitialization; // 98
bool tracer; // 99
bool forceConeOfFire; // 9A
bool intentionalMiss; // 9B
bool allow3D; // 9C
bool penetrates; // 9D
bool ignoreNearCollisions; // 9E
};
static_assert(sizeof(ProjectileLaunchData) == 0xA0);
}