CommonLibSSE NG
Loading...
Searching...
No Matches
PlayerCharacter.h
Go to the documentation of this file.
1#pragma once
2
6#include "RE/B/BSTArray.h"
7#include "RE/B/BSTEvent.h"
8#include "RE/B/BSTHashMap.h"
9#include "RE/B/BSTList.h"
11#include "RE/B/BSTTuple.h"
12#include "RE/C/Character.h"
13#include "RE/C/Crime.h"
14#include "RE/F/FormTypes.h"
15#include "RE/H/hkRefPtr.h"
16#include "RE/N/NiPoint3.h"
17#include "RE/N/NiSmartPointer.h"
18#include "RE/N/NiTMap.h"
20#include "RE/T/TESObjectWEAP.h"
21#include "RE/T/TESQuest.h"
22
23namespace RE
24{
25 enum class AQUIRE_TYPE;
26
27 class Actor;
28 class BGSInstancedQuestObjective;
29 class BGSLocation;
30 class bhkMouseSpringAction;
31 class BipedAnim;
32 class BSFadeNode;
33 class BSLight;
34 class BSTriShape;
35 class CombatGroup;
36 class ImageSpaceModifierInstanceDOF;
37 class InventoryEntryData;
38 class MenuModeChangeEvent;
39 class MenuOpenCloseEvent;
40 class NiAVObject;
41 class NiBillboardNode;
42 class NiNode;
43 class ObjectListItem;
44 class TESObject;
45 class TESObjectREFR;
46 class TintMask;
47 class UserEventEnabledEvent;
48 struct BGSActorCellEvent;
49 struct BGSActorDeathEvent;
50 struct PerkRankData;
51 struct PositionPlayerEvent;
52 struct TESQuestStageItem;
53 struct TESTrackedStatsEvent;
54
55 enum class PLAYER_ACTION
56 {
57 kNone = 0,
70 kShout,
72
73 kTotal,
75 };
76
78 {
79#define VR_NODE_DATA_CONTENT \
80 NiPointer<NiNode> PlayerWorldNode; /* 3F0 */ \
81 NiPointer<NiNode> FollowNode; /* 3F8 */ \
82 NiPointer<NiNode> FollowOffset; /* 400 */ \
83 NiPointer<NiNode> HeightOffsetNode; /* 408 */ \
84 NiPointer<NiNode> SnapWalkOffsetNode; /* 410 */ \
85 NiPointer<NiNode> RoomNode; /* 418 */ \
86 NiPointer<NiNode> BlackSphere; /* 420 */ \
87 NiPointer<NiNode> uiNode; /* 428 */ \
88 NiPointer<BSTriShape> InWorldUIQuadGeo; /* 430 */ \
89 NiPointer<NiNode> UIPointerNode; /* 438 */ \
90 NiPointer<BSTriShape> UIPointerGeo; /* 440 */ \
91 NiPointer<NiNode> DialogueUINode; /* 448 */ \
92 NiPointer<NiNode> TeleportDestinationPreview; /* 450 */ \
93 NiPointer<NiNode> TeleportDestinationFail; /* 458 */ \
94 NiPointer<NiNode> TeleportSprintPreview; /* 460 */ \
95 NiPointer<NiNode> SpellOrigin; /* 468 */ \
96 NiPointer<NiNode> SpellDestination; /* 470 */ \
97 NiPointer<NiNode> ArrowOrigin; /* 478 */ \
98 NiPointer<NiNode> ArrowDestination; /* 480 */ \
99 NiPointer<NiNode> QuestMarker; /* 488 */ \
100 NiPointer<NiNode> LeftWandNode; /* 490 */ \
101 NiPointer<NiNode> LeftWandShakeNode; /* 498 */ \
102 NiPointer<NiNode> LeftValveIndexControllerNode; /* 4A0 */ \
103 NiPointer<NiNode> unkNode4A8; /* 4A8 */ \
104 NiPointer<NiNode> LeftWeaponOffsetNode; /* 4B0 */ \
105 NiPointer<NiNode> LeftCrossbowOffsetNode; /* 4B8 */ \
106 NiPointer<NiNode> LeftMeleeWeaponOffsetNode; /* 4C0 */ \
107 NiPointer<NiNode> LeftStaffWeaponOffsetNode; /* 4C8 */ \
108 NiPointer<NiNode> LeftShieldOffsetNode; /* 4D0 */ \
109 NiPointer<NiNode> RightShieldOffsetNode; /* 4D8 */ \
110 NiPointer<NiNode> SecondaryMagicOffsetNode; /* 4E0 */ \
111 NiPointer<NiNode> SecondaryMagicAimNode; /* 4E8 */ \
112 NiPointer<NiNode> SecondaryStaffMagicOffsetNode; /* 4F0 */ \
113 NiPointer<NiNode> RightWandNode; /* 4F8 */ \
114 NiPointer<NiNode> RightWandShakeNode; /* 500 */ \
115 NiPointer<NiNode> RightValveIndexControllerNode; /* 508 */ \
116 NiPointer<NiNode> unkNode510; /* 510 */ \
117 NiPointer<NiNode> RightWeaponOffsetNode; /* 518 */ \
118 NiPointer<NiNode> RightCrossbowOffsetNode; /* 520 */ \
119 NiPointer<NiNode> RightMeleeWeaponOffsetNode; /* 528 */ \
120 NiPointer<NiNode> RightStaffWeaponOffsetNode; /* 530 */ \
121 NiPointer<NiNode> PrimaryMagicOffsetNode; /* 538 */ \
122 NiPointer<NiNode> PrimaryMagicAimNode; /* 540 */ \
123 NiPointer<NiNode> PrimaryStaffMagicOffsetNode; /* 548 */ \
124 std::uint64_t unk550; /* 550 */ \
125 NiPointer<NiBillboardNode> CrosshairParent; /* 558 */ \
126 NiPointer<NiBillboardNode> CrosshairSecondaryParent; /* 560 */ \
127 NiPointer<NiBillboardNode> TargetLockParent; /* 568 */ \
128 NiPointer<NiNode> unkNode570; /* 570 */ \
129 NiPointer<NiNode> LastSyncPos; /* 578 */ \
130 NiPointer<NiNode> UprightHmdNode; /* 580 */ \
131 NiPointer<NiNode> MapMarkers3D; /* 588 */ \
132 NiPointer<NiNode> NPCLHnd; /* 590 */ \
133 NiPointer<NiNode> NPCRHnd; /* 598 */ \
134 NiPointer<NiNode> NPCLClv; /* 5A0 */ \
135 NiPointer<NiNode> NPCRClv; /* 5A8 */ \
136 std::uint32_t unk5B0; /* 5B0 */ \
137 std::uint32_t unk5B4; /* 5B4 */ \
138 std::uint64_t unk5B8; /* 5B8 */ \
139 std::uint64_t unk5C0; /* 5C0 */ \
140 NiPointer<NiNode> BowAimNode; /* 5C8 */ \
141 NiPointer<NiNode> BowRotationNode; /* 5D0 */ \
142 NiPointer<NiNode> ArrowSnapNode; /* 5D8 */ \
143 NiPointer<BSFadeNode> ArrowNode; /* 5E0 */ \
144 NiPointer<BSFadeNode> ArrowFireNode; /* 5E8 */ \
145 std::uint64_t unk5F0; /* 5F0 */ \
146 NiPointer<NiNode> ArrowHoldOffsetNode; /* 5F8 */ \
147 NiPointer<NiNode> ArrowHoldNode; /* 600 */ \
148 std::uint64_t unk608; /* 608 */ \
149 float unkFloat610; /* 610 */ \
150 std::uint32_t unk614; /* 614 */ \
151 std::uint64_t unk618; /* 618 */ \
152 std::uint64_t unk620; /* 620 */ \
153 std::uint64_t unk628; /* 628 */ \
154 std::uint64_t unk630; /* 630 */ \
155 void* QuestMarkerBillBoardsNodeArray; /* 638 TODO - Make into proper data structure */ \
156 void* TeleportNodeArray; /* 640 TODO - Make into proper data structure */ \
157 void* QuestMarkerBillBoardsNodeArray2; /* 648 TODO - Make into proper data structure -> points to same place as QuestMarkerBillBoardsNodeArray */ \
158 std::uint64_t unk650; /* 650 */ \
159 void* TeleportNodeArray2; /* 658 TODO - Make into proper data structure -> points to same place as TeleportNodeArray */ \
160 void* QuestMarkerBillBoardsNodeArray3; /* 660 TODO - Make into proper data structure -> points to same place as QuestMarkerBillBoardsNodeArray */ \
161 std::uint64_t unk668; /* 668 */ \
162 float unkFloat670; /* 670 */ \
163 std::uint32_t unk674; /* 674 */ \
164 void* TeleportNodeArray3; /* 678 TODO - Make into proper data structure */
165
167 };
168
170 {
171 public:
172 // members
173 float violentCur; // 00
174 float nonViolentCur; // 04
175 float nonViolentInfamy; // 08
176 float violentInfamy; // 0C
177 };
178 static_assert(sizeof(CrimeGoldStruct) == 0x10);
179
181 {
182 public:
183 // members
184 std::int32_t unwitnessed; // 0
185 std::int32_t witnessed; // 4
186 };
187 static_assert(sizeof(StolenItemValueStruct) == 0x8);
188
190 {
191 public:
192 // members
193 std::uint16_t friendCounts[4]; // 0
194 };
195 static_assert(sizeof(FriendshipFactionsStruct) == 0x8);
196
198 {
199 public:
200 using ArrivalFunc_t = void(std::int64_t);
201
202 // members
208 std::int64_t arrivalFuncData; // 30
211 bool resetWeather; // 40
212 bool allowAutoSave; // 41
213 bool isValid; // 42
214 std::uint8_t pad43; // 43
215 std::uint32_t pad44; // 44
216 };
217 static_assert(sizeof(PLAYER_TARGET_LOC) == 0x48);
218
220 {
221 public:
222 // members
223 float timer; // 0
226 };
227 static_assert(sizeof(PlayerActionObject) == 0xC);
228
230#ifndef ENABLE_SKYRIM_AE
231 public Character, // 000
232 public BSTEventSource<BGSActorCellEvent>, // 2D0
233 public BSTEventSource<BGSActorDeathEvent>, // 328
234 public BSTEventSource<PositionPlayerEvent>, // 380
235 public BSTEventSink<MenuOpenCloseEvent>, // 2B0
236 public BSTEventSink<MenuModeChangeEvent>, // 2B8
237 public BSTEventSink<UserEventEnabledEvent>, // 2C0
238 public BSTEventSink<TESTrackedStatsEvent> // 2C8
239#else
240 public Character // 000
241#endif
242 {
243 public:
244 inline static constexpr auto RTTI = RTTI_PlayerCharacter;
245 inline static constexpr auto VTABLE = VTABLE_PlayerCharacter;
246 inline static constexpr auto FORMTYPE = FormType::ActorCharacter;
247
248 enum class EventType
249 {
250 kThief = 3,
251 kContainer = 5,
252 kDeadBody = 6
253 };
254
255 enum class GrabbingType
256 {
257 kNone = 0,
258 kNormal,
260 };
261
262 enum class ByCharGenFlag
263 {
264 kNone = 0,
265 kHandsBound = 1 << 2
266 };
267
269 {
270 // members
271 bool travelUseDoor: 1; // 0:0 - Guess from FO4 given matching logic for Character::WarpFollowers
272 bool fastTraveling: 1; // 0:1 - Set and cleared in the same fast travel function
273 bool overAutoAimTarget: 1; // 0:2 - Crosshair over hostile actor AND equipped WEAPON_TYPE bow, staff, or crossbow, must have weapon out to be accurate
274 bool showQuestItems: 1; // 0:3 - Not used by game, confirmed with console command `SetShowQuestItems`
275 bool unk0_4: 1; // 0:4 - Unused?
276 bool hasQueuedEquipAnim: 1; // 0:5 - Set true in `OnItemEquipped` if a_playAnim && isPaused, false once out of menu
277 bool escaping: 1; // 0:6 - Is Escaping from jail
278 bool forceQuestTargetRepath: 1; // 0:7 - Updates quest target in compass
279 bool unk1_0: 1; // 1:0
280 bool unk1_1: 1; // 1:1
281 bool sleeping: 1; // 1:2
282 bool unk1_3: 1; // 1:3
283 bool unk1_4: 1; // 1:4
284 bool unk1_5: 1; // 1:5
285 bool greetingPlayer: 1; // 1:6 - NPC greeting player
286 bool unk1_7: 1; // 1:7
287 bool unk2_0: 1; // 2:0
288 bool aiControlledToPos: 1; // 2:1 - Guess from FO4, confirmed aiControlled related
289 bool aiControlledFromPos: 1; // 2:2 - Guess from FO4, confirmed aiControlled related
290 bool aiControlledPackage: 1; // 2:3 - Guess from FO4, confirmed aiControlled related
291 bool returnToLastKnownGoodPosition: 1; // 2:4 - return to lastKnownGoodPosition on next Update
292 bool isBeingChased: 1; // 2:5 - unused along with chaseTimer
293 bool unk2_6: 1; // 2:6
294 bool unk2_7: 1; // 2:7
295 bool isInThirdPersonMode: 1; // 3:0
296 bool unk3_1: 1; // 3:1
297 bool unk3_2: 1; // 3:2
298 bool unk3_3: 1; // 3:3
299 bool target3DDistant: 1; // 3:4 - Distance from object in crosshair > 1000
300 bool isInCombat: 1; // 3:5
301 bool attemptedYieldInCurrentCombat: 1; // 3:6 - Set when yielding to guard for arrest dialogue, prevents multiple arrest dialogues
302 bool unk3_7: 1; // 3:7
303 bool isLoading: 1; // 4:0 - Is player loading a new area
304 bool shouldUpdateCrosshair: 1; // 4:1 - If forced off without letting Skyrim update this, crosshair UI won't update,
305 bool unk4_2: 1; // 4:2
306 bool healthTutorialShown: 1; // 4:3
307 bool magickaTutorialShown: 1; // 4:4
308 bool staminaTutorialShown: 1; // 4:5
309 bool goToJailQueued: 1; // 4:6 - Briefly set
310 bool unk4_7: 1; // 4:7
311 bool isSprinting: 1; // 5:0
312 bool isSungazing: 1; // 5:1 - Is staring at the sun
314 bool everModded: 1; // 5:3
315 bool servingJailTime: 1; // 5:4 - Briefly set
316 bool pad5_5: 3; // 5:5
317 std::uint16_t pad6; // 6
318 };
319 static_assert(sizeof(PlayerFlags) == 0x8);
320
322 {
323 public:
324 // members
327 };
328 static_assert(sizeof(QueuedWeapon) == 0x10);
329
330 struct TeleportPath // TODO: Should not be in Player class. Gets used in Pathing and other non-player areas
331 {
332 public:
334 {
335 public:
336 // members
337 bool unk00; // 00 - Determines whether to use worldspace or cell?
338 char pad01[7]; // 01
341 };
342 static_assert(sizeof(Unk00Data) == 0x18);
343
345 {
346 public:
347 // members
349 std::uint64_t unk08; // 08
350 std::uint64_t unk10; // 10
351 };
352 static_assert(sizeof(Unk18Data) == 0x18);
353
354 // members
357 std::uint64_t unk30; // 30
358 std::uint64_t unk38; // 38
359 std::uint64_t unk40; // 40
360 };
361 static_assert(sizeof(TeleportPath) == 0x48);
362
364 {
365 public:
366 // members
371 };
372 static_assert(sizeof(PreTransformationData) == 0x40);
373
375 {
376#define CRIME_VALUE_CONTENT \
377 BSTHashMap<const TESFaction*, CrimeGoldStruct> crimeGoldMap; /* 00 */ \
378 BSTHashMap<const TESFaction*, StolenItemValueStruct> stolenItemValueMap; /* 30 */
379
381 };
382 static_assert(sizeof(CrimeValue) == 0x60);
383
384 struct RaceData
385 {
386#define RACE_DATA_CONTENT \
387 BGSTextureSet* complexion; /* 00 */ \
388 TESRace* charGenRace; /* 08 */ \
389 TESRace* race2; /* 10 */
390
392 };
393 static_assert(sizeof(RaceData) == 0x18);
394
396 {
397#define GAME_STATE_DATA_CONTENT \
398 std::int32_t difficulty; /* 0 */ \
399 ActorHandle assumedIdentity; /* 4 */ \
400 std::int8_t murder; /* 8 */ \
401 std::int8_t perkCount; /* 9 */ \
402 stl::enumeration<ByCharGenFlag, std::uint8_t> byCharGenFlag; /* A */ \
403 std::uint8_t padB; /* B */
404
406 };
407 static_assert(sizeof(GameStateData) == 0xC);
408
410 {
411 public:
412 struct Data
413 {
414 public:
415 struct Skills
416 {
417 enum Skill : std::uint32_t
418 {
437 kTotal
438 };
439 };
441
443 {
444 public:
445 // members
446 float level; // 0
447 float xp; // 4
448 float levelThreshold; // 8
449 };
450 static_assert(sizeof(SkillData) == 0xC);
451
452 // members
453 float xp; // 000
454 float levelThreshold; // 004
455 SkillData skills[Skill::kTotal]; // 008
456 std::uint32_t legendaryLevels[Skill::kTotal]; // 0E0
457 };
458 static_assert(sizeof(Data) == 0x128);
459
460 void AdvanceLevel(bool a_addThreshold);
461
462 // members
463 Data* data; // 0
464 };
465 static_assert(sizeof(PlayerSkills) == 0x8);
466
468 {
469#define INFO_RUNTIME_DATA_CONTENT \
470 float grabDistance; /* 000 */ \
471 float unk004; /* 004 */ \
472 std::uint64_t unk008; /* 008 */ \
473 std::uint32_t unk010; /* 010 */ \
474 std::uint32_t sleepSeconds; /* 014 */ \
475 BSTSmartPointer<BipedAnim> largeBiped; /* 018 */ \
476 NiPointer<NiNode> firstPerson3D; /* 020 */ \
477 float eyeHeight; /* 028 */ \
478 float greetTimer; /* 02C */ \
479 float encumberedTimer; /* 030 */ \
480 float powerAttackTimer; /* 034 */ \
481 std::int32_t hoursToSleep; /* 038 */ \
482 std::int32_t amountStolenSold; /* 03C */ \
483 std::uint32_t valueStolen; /* 040 */ \
484 ActorHandle lastRiddenMount; /* 044 */ \
485 ActorHandle lightTarget; /* 048 */ \
486 float sortActorDistanceTimer; /* 04C */ \
487 float sitHeadingDelta; /* 050 */ \
488 ObjectRefHandle playerMapMarker; /* 054 */ \
489 TeleportPath* playerMarkerPath; /* 058 */ \
490 std::uint32_t skillTrainingsThisLevel; /* 060 */ \
491 std::uint32_t unk064; /* 064 */ \
492 TESClass* defaultClass; /* 068 */ \
493 std::uint64_t unk070; /* 070 */ \
494 std::uint32_t crimeCounts[PackageNS::CRIME_TYPES::kTotal]; /* 078 */ \
495 std::uint32_t unk094; /* 094 */ \
496 AlchemyItem* pendingPoison; /* 098 */ \
497 std::int64_t lastPlayingTimeUpdate; /* 0A0 */ \
498 std::int64_t totalPlayingTime; /* 0A8 */ \
499 std::int32_t characterSeed; /* 0B0 */ \
500 std::uint32_t unk0B4; /* 0B4 */ \
501 TESForm* lastKnownGoodLocation; /* 0B8 */ \
502 std::uint32_t unk0C0; /* 0C0 */ \
503 std::uint32_t unk0C4; /* 0C4 */ \
504 NiPointer<BSLight> firstPersonLight; /* 0C8 */ \
505 NiPointer<BSLight> thirdPersonLight; /* 0D0 */ \
506 float dropAngleMod; /* 0D8 */ \
507 float lastDropAngleMod; /* 0DC */ \
508 PlayerSkills* skills; /* 0E0 */ \
509 ActorHandle autoAimActor; /* 0E8 */ \
510 RefHandle unk0EC; /* 0EC */ \
511 std::uint64_t unk118; /* 0F0 */ \
512 NiPointer<NiAVObject> targeted3D; /* 0F8 */ \
513 CombatGroup* combatGroup; /* 100 */ \
514 BSTArray<ActorHandle> actorsToDisplayOnTheHUDArray; /* 108 */ \
515 TESForm* advanceObject; /* 120 */ \
516 TESBoundObject* lastOneHandItems[2]; /* 128 */ \
517 std::uint32_t teammateCount; /* 138 */ \
518 float combatTimer; /* 13C */ \
519 float yieldTimer; /* 140 */ \
520 float chaseTimer; /* 144 */ \
521 float drawSheatheSafetyTimer; /* 148 */ \
522 std::uint32_t unk14C; /* 14C */
523
525 };
526 static_assert(sizeof(INFO_RUNTIME_DATA) == 0x150);
527
528 ~PlayerCharacter() override; // 000
529
530 // override
531 void RemoveWeapon(BIPED_OBJECT equipIndex) override; // 082
532
533 // add
535 [[nodiscard]] SKYRIM_REL_VR_VIRTUAL std::uint32_t GetViolentCrimeGoldValue(const TESFaction* a_faction) const; // 12B
536 [[nodiscard]] SKYRIM_REL_VR_VIRTUAL std::uint32_t GetNonViolentCrimeGoldValue(const TESFaction* a_faction) const; // 12C
538 SKYRIM_REL_VR_VIRTUAL void Unk_12E(void); // 12E - { return 0; }
539
541 static bool IsGodMode();
542
544 void AddPlayerAddItemEvent(TESObject* a_object, TESForm* a_owner, TESObjectREFR* a_container, AQUIRE_TYPE a_type);
545 void AddSkillExperience(ActorValue a_skill, float a_experience);
546 bool AttemptPickpocket(TESObjectREFR* a_containerRef, InventoryEntryData* a_entry, std::int32_t a_number, bool a_fromContainer = true);
547 bool CenterOnCell(const char* a_cellName);
549 bool CheckCast(MagicItem* a_spell, Effect* a_effect, MagicSystem::CannotCastReason& a_reason);
551#ifndef ENABLE_SKYRIM_VR
553#endif
555 [[nodiscard]] float GetArmorValue(InventoryEntryData* a_form);
556 [[nodiscard]] float GetDamage(InventoryEntryData* a_form);
558 [[nodiscard]] std::int32_t GetItemCount(TESBoundObject* a_object);
559 [[nodiscard]] std::uint32_t GetNumTints(std::uint32_t a_tintType);
560 [[nodiscard]] TintMask* GetOverlayTintMask(TintMask* a_original);
562 [[nodiscard]] TintMask* GetTintMask(std::uint32_t a_tintType, std::uint32_t a_index);
563 [[nodiscard]] bool HasActorDoingCommand() const;
564 [[nodiscard]] bool IsGrabbing() const;
565 void PlayPickupEvent(TESForm* a_item, TESForm* a_containerOwner, TESObjectREFR* a_containerRef, EventType a_eventType);
566 void SetAIDriven(bool a_enable);
567 void SetEscaping(bool a_flag, bool a_escaped);
570
572 return &REL::RelocateMemberIfNewer<BSTEventSource<BGSActorCellEvent>>(SKSE::RUNTIME_SSE_1_6_629, this, 0x2D0, 0x2D8);
573 }
574
575 [[nodiscard]] inline const BSTEventSource<BGSActorCellEvent>* AsBGSActorCellEventSource() const noexcept {
576 return &REL::RelocateMemberIfNewer<BSTEventSource<BGSActorCellEvent>>(SKSE::RUNTIME_SSE_1_6_629, this, 0x2D0, 0x2D8);
577 }
578
580 return &REL::RelocateMemberIfNewer<BSTEventSource<BGSActorDeathEvent>>(SKSE::RUNTIME_SSE_1_6_629, this, 0x328, 0x330);
581 }
582
583 [[nodiscard]] inline const BSTEventSource<BGSActorDeathEvent>* AsBGSActorDeathEventSource() const noexcept {
584 return &REL::RelocateMemberIfNewer<BSTEventSource<BGSActorDeathEvent>>(SKSE::RUNTIME_SSE_1_6_629, this, 0x2D0, 0x330);
585 }
586
588 return &REL::RelocateMemberIfNewer<BSTEventSource<PositionPlayerEvent>>(SKSE::RUNTIME_SSE_1_6_629, this, 0x380, 0x388);
589 }
590
591 [[nodiscard]] inline const BSTEventSource<PositionPlayerEvent>* AsPositionPlayerEventSource() const noexcept {
592 return &REL::RelocateMemberIfNewer<BSTEventSource<PositionPlayerEvent>>(SKSE::RUNTIME_SSE_1_6_629, this, 0x380, 0x388);
593 }
594
596 return &REL::RelocateMemberIfNewer<BSTEventSink<MenuOpenCloseEvent>>(SKSE::RUNTIME_SSE_1_6_629, this, 0x2B0, 0x2B8);
597 }
598
599 [[nodiscard]] inline const BSTEventSink<MenuOpenCloseEvent>* AsMenuOpenCloseEventSink() const noexcept {
600 return &REL::RelocateMemberIfNewer<BSTEventSink<MenuOpenCloseEvent>>(SKSE::RUNTIME_SSE_1_6_629, this, 0x2B0, 0x2B8);
601 }
602
604 return &REL::RelocateMemberIfNewer<BSTEventSink<MenuModeChangeEvent>>(SKSE::RUNTIME_SSE_1_6_629, this, 0x2B8, 0x2C0);
605 }
606
607 [[nodiscard]] inline const BSTEventSink<MenuModeChangeEvent>* AsMenuModeChangeEventSink() const noexcept {
608 return &REL::RelocateMemberIfNewer<BSTEventSink<MenuModeChangeEvent>>(SKSE::RUNTIME_SSE_1_6_629, this, 0x2B8, 0x2C0);
609 }
610
612 return &REL::RelocateMemberIfNewer<BSTEventSink<UserEventEnabledEvent>>(SKSE::RUNTIME_SSE_1_6_629, this, 0x2C0, 0x2C8);
613 }
614
615 [[nodiscard]] inline const BSTEventSink<UserEventEnabledEvent>* AsUserEventEnabledEventSink() const noexcept {
616 return &REL::RelocateMemberIfNewer<BSTEventSink<UserEventEnabledEvent>>(SKSE::RUNTIME_SSE_1_6_629, this, 0x2C0, 0x2C8);
617 }
618
620 return &REL::RelocateMemberIfNewer<BSTEventSink<TESTrackedStatsEvent>>(SKSE::RUNTIME_SSE_1_6_629, this, 0x2C8, 0x2D0);
621 }
622
623 [[nodiscard]] inline const BSTEventSink<TESTrackedStatsEvent>* AsTESTrackedStatsEventSink() const noexcept {
624 return &REL::RelocateMemberIfNewer<BSTEventSink<TESTrackedStatsEvent>>(SKSE::RUNTIME_SSE_1_6_629, this, 0x2C8, 0x2D0);
625 }
626
628 {
629#ifndef ENABLE_SKYRIM_VR // Non-VR
630#define PLAYER_RUNTIME_DATA_CONTENT \
631 mutable BSSpinLock questTargetsLock; /* 3D8, 3E0 */ \
632 CRIME_VALUE_CONTENT; /* 3E0 */ \
633 ObjectRefHandle commandWaitMarker; /* 440 */ \
634 std::uint32_t pad444; /* 444 */ \
635 BSTHashMap<const TESFaction*, FriendshipFactionsStruct> factionOwnerFriendsMap; /* 448 */ \
636 NiPoint3 lastKnownGoodPosition; /* 478 */ \
637 NiPoint3 bulletAutoAim; /* 484 */ \
638 NiPoint3 cachedVelocity; /* 490 */ \
639 float pad49C; /* 49C */ \
640 BGSNote* unusedNote; /* 4A0 */ \
641 BGSNote* unusedNote2; /* 4A8 */ \
642 BSTArray<PerkRankData*> addedPerks; /* 4B0 */ \
643 BSTArray<BGSPerk*> perks; /* 4C8 */ \
644 BSTArray<BGSPerk*> standingStonePerks; /* 4E0 */ \
645 BSTArray<ObjectRefHandle> currentMapMarkers; /* 4F8 */ \
646 BSTArray<BSTTuple<NiPoint3, AITimeStamp>> velocityArray; /* 510 */ \
647 BSTArray<ProjectileHandle> runesCast; /* 528 */ \
648 BSTArray<void*> imageSpaceModifierAnims1; /* 540 */ \
649 BSTArray<void*> imageSpaceModifierAnims2; /* 558 */ \
650 BSSimpleList<TESQuestStageItem*> questLog; /* 570 */ \
651 BSTArray<BGSInstancedQuestObjective> objectives; /* 580 */ \
652 BSTHashMap<TESQuest*, BSTArray<TESQuestTarget*>*> questTargets; /* 598 */ \
653 BSTHashMap<UnkKey, UnkValue> currentSayOnceInfosMap; /* 5C8 */ \
654 BSSimpleList<ObjectRefHandle> droppedRefList; /* 5F8 */ \
655 NiTMap<std::uint32_t, std::uint8_t> randomDoorSpaceMap; /* 608 */ \
656 TESWorldSpace* cachedWorldSpace; /* 628 */ \
657 NiPoint3 exteriorPosition; /* 630 */ \
658 std::uint32_t pad63C; /* 63C */ \
659 PLAYER_TARGET_LOC queuedTargetLoc; /* 640 */ \
660 BSSoundHandle unusedSound; /* 688 */ \
661 BSSoundHandle magicFailureSound; /* 694 */ \
662 BSSoundHandle shoutFailureSound; /* 6A0 */ \
663 std::uint32_t pad6AC; /* 6AC */ \
664 DialoguePackage* closestConversation; /* 6B0 */ \
665 std::uint32_t unk6B8; /* 6B8 */ \
666 std::uint32_t unk6BC; /* 6BC */ \
667 DialoguePackage* aiConversationRunning; /* 6C0 */ \
668 std::int32_t numberofStealWarnings; /* 6C8 */ \
669 float stealWarningTimer; /* 6CC */ \
670 std::int32_t numberofPickpocketWarnings; /* 6D0 */ \
671 float pickPocketWarningTimer; /* 6D4 */ \
672 AITimeStamp warnToLeaveTimeStamp; /* 6D8 */ \
673 std::uint32_t pad6DC; /* 6DC */ \
674 ImageSpaceModifierInstanceDOF* ironsightsDOFInstance; /* 6E0 */ \
675 ImageSpaceModifierInstanceDOF* vatsDOFInstance; /* 6E8 */ \
676 ImageSpaceModifierInstanceDOF* dynamicDOFInstance; /* 6F0 */ \
677 float dynamicDOFFocusTime; /* 6F8 */ \
678 bool dynamicDOFFocused; /* 6FC */ \
679 std::uint8_t unk6FD; /* 6FD */ \
680 std::uint16_t unk6FE; /* 6FE */ \
681 NiPoint3 dynamicDOFLastAngle; /* 700 */ \
682 NiPoint3 dynamicDOFLastPosition; /* 70C */ \
683 TESFaction* currentPrisonFaction; /* 718 */ \
684 std::int32_t jailSentence; /* 720 */ \
685 std::uint32_t pad724; /* 724 */ \
686 void* unk728; /* 728 - smart ptr */ \
687 QueuedWeapon queuedWeaponAttachs[WEAPON_TYPE::kTotal]; /* 730 */ \
688 std::int32_t vampireFeedDetection; /* 7D0 */ \
689 std::uint32_t mapMarkerIterator; /* 7D4 */ \
690 RefHandle forceActivateRef; /* 7D8 */ \
691 PlayerActionObject playerActionObjects[15]; /* 7DC */ \
692 PLAYER_ACTION mostRecentAction; /* 890 */ \
693 ActorHandle actorDoingPlayerCommand; /* 894 */ \
694 BSTSmallArray<hkRefPtr<bhkMouseSpringAction>, 4> grabSpring; /* 898 */ \
695 ObjectRefHandle grabbedObject; /* 8C8 */ \
696 float grabObjectWeight; /* 8CC */ \
697 INFO_RUNTIME_DATA_CONTENT; /* 8D0 */ \
698 std::uint8_t unkA20[0xA0]; /* A20 */ \
699 std::uint32_t unkAC0; /* AC0 */ \
700 std::uint32_t unkAC4; /* AC4 */ \
701 BGSLocation* currentLocation; /* AC8 */ \
702 AITimeStamp cachedVelocityTimeStamp; /* AD0 */ \
703 float telekinesisDistance; /* AD4 */ \
704 float commandTimer; /* AD8 */ \
705 float sunGazeTimer; /* ADC */ \
706 TESImageSpaceModifier* sunGazeImageModifierSpace; /* AE0 */ \
707 ActorValue advanceSkill; /* AE8 */ \
708 std::uint32_t advanceAction; /* AEC */ \
709 stl::enumeration<DEFAULT_OBJECT, std::int32_t> animationObjectAction; /* AF0 */ \
710 stl::enumeration<GrabbingType, std::uint32_t> grabType; /* AF4 */ \
711 GAME_STATE_DATA_CONTENT; /* AF8 */ \
712 std::uint32_t unkB04; /* B04 */ \
713 Crime* resistArrestCrime; /* B08 */ \
714 BSTArray<TintMask*> tintMasks; /* B10 */ \
715 BSTArray<TintMask*>* overlayTintMasks; /* B28 */ \
716 RACE_DATA_CONTENT; /* B30 */ \
717 std::int32_t unkB48; /* B48 */ \
718 std::uint32_t padB4C; /* B4C */ \
719 BSTArray<std::uint64_t> unkB50; /* B50 */ \
720 std::uint64_t unkB68; /* B68 */ \
721 std::uint64_t unkB70; /* B70 */ \
722 std::uint64_t unkB78; /* B78 */ \
723 std::uint64_t unkB80; /* B80 */ \
724 std::int32_t unkB88; /* B88 */ \
725 std::uint32_t padB8C; /* B8C */ \
726 std::uint64_t unkB90; /* B90 */ \
727 TESBoundObject* unkB98; /* B98 */ \
728 BSTSmallArray<void*, 4> unkBA0; /* BA0 */ \
729 PreTransformationData* preTransformationData; /* BD0 */ \
730 PlayerFlags playerFlags; /* BD8 */
731#elif !defined(ENABLE_SKYRIM_AE) && !defined(ENABLE_SKYRIM_SE) // VR
732#define PLAYER_RUNTIME_DATA_CONTENT \
733 std::uint64_t unk3D8; /* 3D8 */ \
734 std::uint64_t unk3E0; /* 3E0 */ \
735 std::uint64_t unk3E8; /* 3E8 */ \
736 VR_NODE_DATA_CONTENT; /* 3F0 */ \
737 std::uint64_t unk680; /* 680 */ \
738 std::uint64_t unk688; /* 688 */ \
739 std::uint64_t unk690; /* 690 */ \
740 std::uint64_t unk698; /* 698 */ \
741 std::uint64_t unk6A0; /* 6A0 */ \
742 std::uint64_t unk6A8[0x65]; /* 6A8 */ \
743 CRIME_VALUE_CONTENT; /* 9D0 */ \
744 std::uint64_t unkA30[0x11]; /* A30 */ \
745 void* perkArray; /* AB8 */ \
746 std::uint64_t unk6C0[0x14]; /* AC0 */ \
747 /*BSTArray<PerkRankData*> addedPerks; // B60 */ \
748 /*BSTArray<BGSPerk*> perks; // B68 */ \
749 /*BSTArray<BGSPerk*> standingStonePerks; // B70 */ \
750 std::uint64_t addedPerks; /* B60 - these 3 here gotta be fixed */ \
751 std::uint64_t perks; /* B68 */ \
752 std::uint64_t standingStonePerks; /* B70 */ \
753 std::uint64_t unkB78; /* B78 */ \
754 std::uint64_t unkB80; /* B80 */ \
755 std::uint64_t unkMessageArrayPtr; /* B88 */ \
756 std::uint64_t unkB90; /* B90 */ \
757 std::uint64_t unkB98; /* B98 */ \
758 std::uint64_t unkBA0; /* BA0 */ \
759 std::uint64_t unkBA8; /* BA8 */ \
760 std::uint64_t unkBB0[0x25]; /* BB0 */ \
761 std::uint64_t imageSpaceModifierAnims1; /* CD8 - Wrong Datatype from Below */ \
762 std::uint64_t imageSpaceModifierAnims2; /* CE0 - Wrong Datatype from below */ \
763 std::uint64_t unkCE8[0x34]; /* CE8 */ \
764 std::uint32_t padE90; /* E88 */ \
765 ActorHandle actorDoingPlayerCommand; /* E8C */ \
766 std::uint64_t unkE90; /* E90 */ \
767 std::uint64_t unkE98[0x27]; /* E98 */ \
768 /* BSTSmallArray<hkRefPtr<bhkMouseSpringAction>, 4> grabSpring; // F00 // not used in vr as far as i can tell F08?????? */ \
769 INFO_RUNTIME_DATA_CONTENT; /* FD0 */ \
770 std::uint64_t unk1120[0x1A]; /* 1120 */ \
771 std::uint32_t unk11F0; /* 11F0 */ \
772 GAME_STATE_DATA_CONTENT; /* 11F4 */ \
773 std::uint64_t unk1200; /* 1200 */ \
774 std::uint64_t unk1208; /* 1208 */ \
775 std::uint64_t unk1210; /* 1210 */ \
776 std::uint64_t unk1218; /* 1218 */ \
777 std::uint64_t unk1220; /* 1220 */ \
778 RACE_DATA_CONTENT; /* 1228 */ \
779 std::uint64_t unk1240[0x12]; /* 1240 */ \
780 std::uint8_t pad12D0; /* 12D0 */ \
781 std::uint8_t flags; /* 12D1 -- TODO MAP THESE FLAGS OUT */ \
782 std::uint16_t pad12D2; /* 12D2 */ \
783 std::uint32_t unk12D4; /* 12D4 */
784#else
785#define PLAYER_RUNTIME_DATA_CONTENT
786#endif
787
789 };
790
791 [[nodiscard]] inline PLAYER_RUNTIME_DATA& GetPlayerRuntimeData() noexcept
792 {
793 return REL::RelocateMemberIfNewer<PLAYER_RUNTIME_DATA>(SKSE::RUNTIME_SSE_1_6_629, this, 0x3D8, 0x3E0);
794 }
795
796 [[nodiscard]] inline const PLAYER_RUNTIME_DATA& GetPlayerRuntimeData() const noexcept
797 {
798 return REL::RelocateMemberIfNewer<PLAYER_RUNTIME_DATA>(SKSE::RUNTIME_SSE_1_6_629, this, 0x3D8, 0x3E0);
799 }
800
801 [[nodiscard]] inline CrimeValue& GetCrimeValue() noexcept
802 {
804 if (REL::Module::get().version().compare(SKSE::RUNTIME_SSE_1_6_629) != std::strong_ordering::less) {
805 return REL::RelocateMember<CrimeValue>(this, 0x3E8);
806 }
807 }
808 return REL::RelocateMember<CrimeValue>(this, 0x3E0, 0x9D0);
809 }
810
811 [[nodiscard]] inline const CrimeValue& GetCrimeValue() const noexcept
812 {
814 if (REL::Module::get().version().compare(SKSE::RUNTIME_SSE_1_6_629) != std::strong_ordering::less) {
815 return REL::RelocateMember<CrimeValue>(this, 0x3E8);
816 }
817 }
818 return REL::RelocateMember<CrimeValue>(this, 0x3E0, 0x9D0);
819 }
820
821 [[nodiscard]] inline RaceData& GetRaceData() noexcept
822 {
824 if (REL::Module::get().version().compare(SKSE::RUNTIME_SSE_1_6_629) != std::strong_ordering::less) {
825 return REL::RelocateMember<RaceData>(this, 0xB38);
826 }
827 }
828 return REL::RelocateMember<RaceData>(this, 0xB30, 0x1228);
829 }
830
831 [[nodiscard]] inline const RaceData& GetRaceData() const noexcept
832 {
834 if (REL::Module::get().version().compare(SKSE::RUNTIME_SSE_1_6_629) != std::strong_ordering::less) {
835 return REL::RelocateMember<RaceData>(this, 0xB38);
836 }
837 }
838 return REL::RelocateMember<RaceData>(this, 0xB30, 0x1228);
839 }
840
841 [[nodiscard]] inline GameStateData& GetGameStatsData() noexcept
842 {
844 if (REL::Module::get().version().compare(SKSE::RUNTIME_SSE_1_6_629) != std::strong_ordering::less) {
845 return REL::RelocateMember<GameStateData>(this, 0xB00);
846 }
847 }
848 return REL::RelocateMember<GameStateData>(this, 0xAF8, 0x11F4);
849 }
850
851 [[nodiscard]] inline const GameStateData& GetGameStatsData() const noexcept
852 {
854 if (REL::Module::get().version().compare(SKSE::RUNTIME_SSE_1_6_629) != std::strong_ordering::less) {
855 return REL::RelocateMember<GameStateData>(this, 0xB00);
856 }
857 }
858 return REL::RelocateMember<GameStateData>(this, 0xAF8, 0x11F4);
859 }
860
861 [[nodiscard]] inline INFO_RUNTIME_DATA& GetInfoRuntimeData() noexcept
862 {
864 if (REL::Module::get().version().compare(SKSE::RUNTIME_SSE_1_6_629) != std::strong_ordering::less) {
865 return REL::RelocateMember<INFO_RUNTIME_DATA>(this, 0x8D8);
866 }
867 }
868 return REL::RelocateMember<INFO_RUNTIME_DATA>(this, 0x8D0, 0xFD0);
869 }
870
871 [[nodiscard]] inline const INFO_RUNTIME_DATA& GetInfoRuntimeData() const noexcept
872 {
874 if (REL::Module::get().version().compare(SKSE::RUNTIME_SSE_1_6_629) != std::strong_ordering::less) {
875 return REL::RelocateMember<INFO_RUNTIME_DATA>(this, 0x8D8);
876 }
877 }
878 return REL::RelocateMember<INFO_RUNTIME_DATA>(this, 0x8D0, 0xFD0);
879 }
880
881 [[nodiscard]] VR_NODE_DATA* GetVRNodeData() noexcept
882 {
884 return nullptr;
885 } else {
886 return &REL::RelocateMember<VR_NODE_DATA>(this, 0, 0x3F0);
887 }
888 }
889
890 [[nodiscard]] const VR_NODE_DATA* GetVRNodeData() const noexcept
891 {
893 return nullptr;
894 } else {
895 return &REL::RelocateMember<VR_NODE_DATA>(this, 0, 0x3F0);
896 }
897 }
898
899 // members
900#if (!defined(ENABLE_SKYRIM_AE) && !defined(ENABLE_SKYRIM_SE)) || (!defined(ENABLE_SKYRIM_AE) && !defined(ENABLE_SKYRIM_VR))
902#endif
903
904 private:
905 bool CenterOnCell_Impl(const char* a_cellName, RE::TESObjectCELL* a_cell);
906 };
907#if !defined(ENABLE_SKYRIM_VR) && !defined(ENABLE_SKYRIM_AE)
908 static_assert(sizeof(PlayerCharacter) == 0xBE0);
909#elif !defined(ENABLE_SKYRIM_AE) && !defined(ENABLE_SKYRIM_SE)
910 static_assert(sizeof(PlayerCharacter) == 0x12D8);
911#endif
912}
913#undef PLAYER_RUNTIME_DATA_CONTENT
914#undef VR_NODE_DATA_CONTENT
915#undef INFO_RUNTIME_DATA_CONTENT
916#undef GAME_STATE_DATA_CONTENT
917#undef RACE_DATA_CONTENT
#define CRIME_VALUE_CONTENT
Definition PlayerCharacter.h:376
#define PLAYER_RUNTIME_DATA_CONTENT
Definition PlayerCharacter.h:630
#define RACE_DATA_CONTENT
Definition PlayerCharacter.h:386
#define VR_NODE_DATA_CONTENT
Definition PlayerCharacter.h:79
#define GAME_STATE_DATA_CONTENT
Definition PlayerCharacter.h:397
#define INFO_RUNTIME_DATA_CONTENT
Definition PlayerCharacter.h:469
#define SKYRIM_REL_VR_CONSTEXPR
Definition Relocation.h:143
#define SKYRIM_REL_VR_VIRTUAL
Definition Relocation.h:152
#define SKYRIM_REL_CONSTEXPR
Definition Relocation.h:105
Definition BSTArray.h:377
Definition BSTEvent.h:143
Definition BSTEvent.h:19
Definition Character.h:8
Definition InventoryEntryData.h:15
Definition MagicItem.h:30
Definition NiPoint3.h:6
Definition NiSmartPointer.h:9
Definition PlayerCharacter.h:198
std::uint32_t pad44
Definition PlayerCharacter.h:215
NiPoint3 angle
Definition PlayerCharacter.h:206
TESObjectCELL * interior
Definition PlayerCharacter.h:204
NiPoint3 location
Definition PlayerCharacter.h:205
bool resetWeather
Definition PlayerCharacter.h:211
bool isValid
Definition PlayerCharacter.h:213
bool allowAutoSave
Definition PlayerCharacter.h:212
RefHandle fastTravelMarker
Definition PlayerCharacter.h:210
std::int64_t arrivalFuncData
Definition PlayerCharacter.h:208
void(std::int64_t) ArrivalFunc_t
Definition PlayerCharacter.h:200
TESWorldSpace * world
Definition PlayerCharacter.h:203
RefHandle furnitureRef
Definition PlayerCharacter.h:209
ArrivalFunc_t * arrivalFunc
Definition PlayerCharacter.h:207
std::uint8_t pad43
Definition PlayerCharacter.h:214
Definition PlayerCharacter.h:242
const BSTEventSource< BGSActorCellEvent > * AsBGSActorCellEventSource() const noexcept
Definition PlayerCharacter.h:575
const INFO_RUNTIME_DATA & GetInfoRuntimeData() const noexcept
Definition PlayerCharacter.h:871
static bool IsGodMode()
const GameStateData & GetGameStatsData() const noexcept
Definition PlayerCharacter.h:851
SKYRIM_REL_VR_VIRTUAL void Unk_12E(void)
BSTEventSink< MenuOpenCloseEvent > * AsMenuOpenCloseEventSink() noexcept
Definition PlayerCharacter.h:595
const BSTEventSink< MenuOpenCloseEvent > * AsMenuOpenCloseEventSink() const noexcept
Definition PlayerCharacter.h:599
ByCharGenFlag
Definition PlayerCharacter.h:263
static constexpr auto RTTI
Definition PlayerCharacter.h:244
TintMask * GetOverlayTintMask(TintMask *a_original)
BSTEventSink< MenuModeChangeEvent > * AsMenuModeChangeEventSink() noexcept
Definition PlayerCharacter.h:603
BSTArray< TintMask * > * GetTintList()
bool CenterOnCell(const char *a_cellName)
NiPointer< TESObjectREFR > GetGrabbedRef()
GameStateData & GetGameStatsData() noexcept
Definition PlayerCharacter.h:841
std::uint32_t GetNumTints(std::uint32_t a_tintType)
void AddPlayerAddItemEvent(TESObject *a_object, TESForm *a_owner, TESObjectREFR *a_container, AQUIRE_TYPE a_type)
SKYRIM_REL_VR_VIRTUAL std::uint32_t GetNonViolentCrimeGoldValue(const TESFaction *a_faction) const
const BSTEventSink< TESTrackedStatsEvent > * AsTESTrackedStatsEventSink() const noexcept
Definition PlayerCharacter.h:623
bool AttemptPickpocket(TESObjectREFR *a_containerRef, InventoryEntryData *a_entry, std::int32_t a_number, bool a_fromContainer=true)
INFO_RUNTIME_DATA & GetInfoRuntimeData() noexcept
Definition PlayerCharacter.h:861
const BSTEventSource< BGSActorDeathEvent > * AsBGSActorDeathEventSource() const noexcept
Definition PlayerCharacter.h:583
BSTEventSource< PositionPlayerEvent > * AsPositionPlayerEventSource() noexcept
Definition PlayerCharacter.h:587
void RemoveWeapon(BIPED_OBJECT equipIndex) override
BSTEventSource< BGSActorDeathEvent > * AsBGSActorDeathEventSource() noexcept
Definition PlayerCharacter.h:579
BSTEventSink< UserEventEnabledEvent > * AsUserEventEnabledEventSink() noexcept
Definition PlayerCharacter.h:611
void SetAIDriven(bool a_enable)
BSTEventSource< BGSActorCellEvent > * AsBGSActorCellEventSource() noexcept
Definition PlayerCharacter.h:571
NiPointer< Actor > GetActorDoingPlayerCommand() const
bool CenterOnCell(TESObjectCELL *a_cell)
SKYRIM_REL_VR_VIRTUAL std::uint32_t GetViolentCrimeGoldValue(const TESFaction *a_faction) const
RaceData & GetRaceData() noexcept
Definition PlayerCharacter.h:821
const BSTEventSink< UserEventEnabledEvent > * AsUserEventEnabledEventSink() const noexcept
Definition PlayerCharacter.h:615
bool HasActorDoingCommand() const
VR_NODE_DATA * GetVRNodeData() noexcept
Definition PlayerCharacter.h:881
float GetDamage(InventoryEntryData *a_form)
~PlayerCharacter() override
void PlayPickupEvent(TESForm *a_item, TESForm *a_containerOwner, TESObjectREFR *a_containerRef, EventType a_eventType)
void SetEscaping(bool a_flag, bool a_escaped)
const CrimeValue & GetCrimeValue() const noexcept
Definition PlayerCharacter.h:811
void AddSkillExperience(ActorValue a_skill, float a_experience)
CrimeValue & GetCrimeValue() noexcept
Definition PlayerCharacter.h:801
TintMask * GetTintMask(std::uint32_t a_tintType, std::uint32_t a_index)
const VR_NODE_DATA * GetVRNodeData() const noexcept
Definition PlayerCharacter.h:890
float GetArmorValue(InventoryEntryData *a_form)
GrabbingType
Definition PlayerCharacter.h:256
static constexpr auto VTABLE
Definition PlayerCharacter.h:245
PLAYER_RUNTIME_DATA & GetPlayerRuntimeData() noexcept
Definition PlayerCharacter.h:791
SKYRIM_REL_VR_VIRTUAL void Unk_12A(void)
bool IsGrabbing() const
static PlayerCharacter * GetSingleton()
const BSTEventSink< MenuModeChangeEvent > * AsMenuModeChangeEventSink() const noexcept
Definition PlayerCharacter.h:607
BSTEventSink< TESTrackedStatsEvent > * AsTESTrackedStatsEventSink() noexcept
Definition PlayerCharacter.h:619
const PLAYER_RUNTIME_DATA & GetPlayerRuntimeData() const noexcept
Definition PlayerCharacter.h:796
bool CheckCast(MagicItem *a_spell, Effect *a_effect, MagicSystem::CannotCastReason &a_reason)
const RaceData & GetRaceData() const noexcept
Definition PlayerCharacter.h:831
static constexpr auto FORMTYPE
Definition PlayerCharacter.h:246
EventType
Definition PlayerCharacter.h:249
const BSTEventSource< PositionPlayerEvent > * AsPositionPlayerEventSource() const noexcept
Definition PlayerCharacter.h:591
std::int32_t GetItemCount(TESBoundObject *a_object)
SKYRIM_REL_VR_VIRTUAL void ClearAllCrimeGold(TESFaction *a_faction)
Definition TESBoundObject.h:24
Definition TESFaction.h:120
Definition TESForm.h:35
Definition TESObjectCELL.h:116
Definition TESObject.h:11
Definition TESObjectREFR.h:112
Definition TESObjectWEAP.h:79
Definition TESRace.h:146
Definition TESWorldSpace.h:118
static SKYRIM_REL_VR bool IsVR() noexcept
Definition Relocation.h:821
static Module & get()
Definition Relocation.h:658
static SKYRIM_REL bool IsAE() noexcept
Definition Relocation.h:807
Definition PCH.h:223
CannotCastReason
Definition MagicSystem.h:10
Definition AbsorbEffect.h:6
constexpr std::array< REL::VariantID, 17 > VTABLE_PlayerCharacter
Definition Offsets_VTABLE.h:2231
constexpr REL::VariantID RTTI_PlayerCharacter(686898, 394747, 0x1f07958)
ActorValue
Definition ActorValues.h:6
PLAYER_ACTION
Definition PlayerCharacter.h:56
AQUIRE_TYPE
Definition BGSAddToPlayerInventoryEvent.h:11
std::uint32_t RefHandle
Definition BSCoreTypes.h:6
constexpr REL::Version RUNTIME_SSE_1_6_629(1, 6, 629, 0)
BIPED_OBJECT
Definition BipedObjects.h:8
Definition PlayerCharacter.h:170
float nonViolentCur
Definition PlayerCharacter.h:174
float violentInfamy
Definition PlayerCharacter.h:176
float nonViolentInfamy
Definition PlayerCharacter.h:175
float violentCur
Definition PlayerCharacter.h:173
Definition Effect.h:11
Definition PlayerCharacter.h:190
std::uint16_t friendCounts[4]
Definition PlayerCharacter.h:193
Definition PlayerCharacter.h:220
RefHandle refObj
Definition PlayerCharacter.h:224
float timer
Definition PlayerCharacter.h:223
stl::enumeration< PLAYER_ACTION, std::uint32_t > next
Definition PlayerCharacter.h:225
Definition PlayerCharacter.h:375
Definition PlayerCharacter.h:396
Definition PlayerCharacter.h:468
Definition PlayerCharacter.h:628
Definition PlayerCharacter.h:269
bool everModded
Definition PlayerCharacter.h:314
bool goToJailQueued
Definition PlayerCharacter.h:309
bool unk1_4
Definition PlayerCharacter.h:283
bool unk3_3
Definition PlayerCharacter.h:298
bool unk2_0
Definition PlayerCharacter.h:287
std::uint16_t pad6
Definition PlayerCharacter.h:317
bool isSungazing
Definition PlayerCharacter.h:312
bool travelUseDoor
Definition PlayerCharacter.h:271
bool aiControlledFromPos
Definition PlayerCharacter.h:289
bool aiControlledPackage
Definition PlayerCharacter.h:290
bool unk1_0
Definition PlayerCharacter.h:279
bool unk4_7
Definition PlayerCharacter.h:310
bool unk1_1
Definition PlayerCharacter.h:280
bool aiControlledToPos
Definition PlayerCharacter.h:288
bool unk3_2
Definition PlayerCharacter.h:297
bool unk0_4
Definition PlayerCharacter.h:275
bool pad5_5
Definition PlayerCharacter.h:316
bool unk1_3
Definition PlayerCharacter.h:282
bool magickaTutorialShown
Definition PlayerCharacter.h:307
bool escaping
Definition PlayerCharacter.h:277
bool unk2_7
Definition PlayerCharacter.h:294
bool isInThirdPersonMode
Definition PlayerCharacter.h:295
bool unk4_2
Definition PlayerCharacter.h:305
bool attemptedYieldInCurrentCombat
Definition PlayerCharacter.h:301
bool greetingPlayer
Definition PlayerCharacter.h:285
bool target3DDistant
Definition PlayerCharacter.h:299
bool returnToLastKnownGoodPosition
Definition PlayerCharacter.h:291
bool unk2_6
Definition PlayerCharacter.h:293
bool shouldUpdateCrosshair
Definition PlayerCharacter.h:304
bool unk3_1
Definition PlayerCharacter.h:296
bool healthTutorialShown
Definition PlayerCharacter.h:306
bool forceQuestTargetRepath
Definition PlayerCharacter.h:278
bool fastTraveling
Definition PlayerCharacter.h:272
bool unk1_5
Definition PlayerCharacter.h:284
bool sleeping
Definition PlayerCharacter.h:281
bool overAutoAimTarget
Definition PlayerCharacter.h:273
bool isInCombat
Definition PlayerCharacter.h:300
bool showQuestItems
Definition PlayerCharacter.h:274
bool servingJailTime
Definition PlayerCharacter.h:315
bool isLoading
Definition PlayerCharacter.h:303
bool isSprinting
Definition PlayerCharacter.h:311
bool unk3_7
Definition PlayerCharacter.h:302
bool unk1_7
Definition PlayerCharacter.h:286
bool hasQueuedEquipAnim
Definition PlayerCharacter.h:276
bool isBeingChased
Definition PlayerCharacter.h:292
bool dragonRideTargetLocked
Definition PlayerCharacter.h:313
bool staminaTutorialShown
Definition PlayerCharacter.h:308
float level
Definition PlayerCharacter.h:446
float levelThreshold
Definition PlayerCharacter.h:448
float xp
Definition PlayerCharacter.h:447
Definition PlayerCharacter.h:416
Skill
Definition PlayerCharacter.h:418
@ kIllusion
Definition PlayerCharacter.h:434
@ kAlchemy
Definition PlayerCharacter.h:429
@ kSneak
Definition PlayerCharacter.h:428
@ kEnchanting
Definition PlayerCharacter.h:436
@ kLightArmor
Definition PlayerCharacter.h:425
@ kArchery
Definition PlayerCharacter.h:421
@ kSmithing
Definition PlayerCharacter.h:423
@ kDestruction
Definition PlayerCharacter.h:433
@ kPickpocket
Definition PlayerCharacter.h:426
@ kLockpicking
Definition PlayerCharacter.h:427
@ kTwoHanded
Definition PlayerCharacter.h:420
@ kOneHanded
Definition PlayerCharacter.h:419
@ kRestoration
Definition PlayerCharacter.h:435
@ kConjuration
Definition PlayerCharacter.h:432
@ kTotal
Definition PlayerCharacter.h:437
@ kAlteration
Definition PlayerCharacter.h:431
@ kBlock
Definition PlayerCharacter.h:422
@ kSpeech
Definition PlayerCharacter.h:430
@ kHeavyArmor
Definition PlayerCharacter.h:424
Definition PlayerCharacter.h:413
SkillData skills[Skill::kTotal]
Definition PlayerCharacter.h:455
float xp
Definition PlayerCharacter.h:453
float levelThreshold
Definition PlayerCharacter.h:454
std::uint32_t legendaryLevels[Skill::kTotal]
Definition PlayerCharacter.h:456
Definition PlayerCharacter.h:410
Data * data
Definition PlayerCharacter.h:463
void AdvanceLevel(bool a_addThreshold)
Definition PlayerCharacter.h:364
TESBoundObject * storedLastOneHandItems[2]
Definition PlayerCharacter.h:370
MagicItem * storedSelectedSpells[4]
Definition PlayerCharacter.h:367
TESRace * storedRace
Definition PlayerCharacter.h:368
TESForm * storedSelectedPower
Definition PlayerCharacter.h:369
Definition PlayerCharacter.h:322
TESObjectWEAP * rightHandWeapon
Definition PlayerCharacter.h:325
TESObjectWEAP * leftHandWeapon
Definition PlayerCharacter.h:326
Definition PlayerCharacter.h:385
Definition PlayerCharacter.h:334
TESWorldSpace * worldspace
Definition PlayerCharacter.h:339
char pad01[7]
Definition PlayerCharacter.h:338
bool unk00
Definition PlayerCharacter.h:337
TESObjectCELL * interiorCell
Definition PlayerCharacter.h:340
Definition PlayerCharacter.h:345
std::uint64_t unk10
Definition PlayerCharacter.h:350
std::uint64_t unk08
Definition PlayerCharacter.h:349
RE::TESObjectREFR * unk00
Definition PlayerCharacter.h:348
Definition PlayerCharacter.h:331
BSTArray< Unk00Data > unk00
Definition PlayerCharacter.h:355
std::uint64_t unk38
Definition PlayerCharacter.h:358
BSTArray< Unk18Data > unk18
Definition PlayerCharacter.h:356
std::uint64_t unk30
Definition PlayerCharacter.h:357
std::uint64_t unk40
Definition PlayerCharacter.h:359
Definition PlayerCharacter.h:181
std::int32_t unwitnessed
Definition PlayerCharacter.h:184
std::int32_t witnessed
Definition PlayerCharacter.h:185
Definition PlayerCharacter.h:78