#pragma once #include "RE/B/BGSAttachParentArray.h" #include "RE/B/BGSAttackDataForm.h" #include "RE/B/BGSBehaviorGraphModel.h" #include "RE/B/BGSBipedObjectForm.h" #include "RE/B/BGSCharacterMorph.h" #include "RE/B/BGSCharacterTint.h" #include "RE/B/BGSKeywordForm.h" #include "RE/B/BGSPreloadable.h" #include "RE/B/BGSPropertySheet.h" #include "RE/B/BGSSkinForm.h" #include "RE/B/BGSSoundTagComponent.h" #include "RE/B/BGSTextureModel.h" #include "RE/B/BSFixedString.h" #include "RE/B/BSTArray.h" #include "RE/B/BSTHashMap.h" #include "RE/M/Movement.h" #include "RE/N/NiPoint3.h" #include "RE/R/RACE_DATA.h" #include "RE/T/TESDescription.h" #include "RE/T/TESForm.h" #include "RE/T/TESFullName.h" #include "RE/T/TESModel.h" #include "RE/T/TESSpellList.h" #include "RE/T/TESTexture.h" namespace RE { class EquipSlotData; class __declspec(novtable) TESRace : public TESForm, // 000 public TESFullName, // 020 public TESDescription, // 030 public TESSpellList, // 048 public BGSSkinForm, // 058 public BGSBipedObjectForm, // 068 public BGSKeywordForm, // 078 public BGSAttackDataForm, // 098 public BGSPropertySheet, // 0A8 public BGSPreloadable // 0B8 { public: static constexpr auto RTTI{ RTTI::TESRace }; static constexpr auto VTABLE{ VTABLE::TESRace }; static constexpr auto FORM_ID{ ENUM_FORM_ID::kRACE }; class MOVEMENT_SPEED_OVERRIDE { public: // members BGSMovementType* moveType; // 00 Movement::MaxSpeeds overrideData; // 08 }; static_assert(sizeof(MOVEMENT_SPEED_OVERRIDE) == 0x78); class FaceRelatedData { public: // members BGSCharacterTint::Template::Groups* tintingTemplate; // BSTArray* faceDetailsTextureSets; // BGSTextureSet* defaultFaceDetailsTextureSet; // BSTArray* presetNPCs; // BSTArray* availableHairColors; // BGSColorForm* defaultHairColor; // BSTArray* headParts; // BSTArray* morphGroups; // BSTArray* facialBoneRegions; // BGSCharacterMorph::FacialBoneRegion* neckFatFacialBoneRegion; // NiPoint3 neckFatAdjustmentScales; // BSFixedString wrinkleMapPath; // }; static_assert(sizeof(FaceRelatedData) == 0x68); class BodyMorphData { public: // members BSTHashMap boneBaseScales; // 00 BSTHashMap boneModifiers; // 30 }; static_assert(sizeof(BodyMorphData) == 0x60); // members TESModel skeletonModel[2]; // 0C0 TESModel skeletonChargenModel[2]; // 120 RACE_DATA data; // 180 float clampFaceGeoValue; // 280 float clampFaceGeoValue2; // 284 BGSTextureModel bodyTextureModels[2]; // 288 BGSBehaviorGraphModel behaviorGraph[2]; // 2E8 BSFixedString rootBehaviorGraphName[2]; // 348 BSFixedString behaviorGraphProjectName[2]; // 358 BGSVoiceType* defaultVoiceType[2]; // 368 BGSBodyPartData* bodyPartData; // 378 BGSSoundTagComponent soundTagComponent; // 380 BGSAttachParentArray attachParents; // 388 BSFixedString formEditorID; // 3A0 BGSMaterialType* bloodImpactMaterial; // 3A8 BGSArtObject* dismemberBlood; // 3B0 BGSTextureSet* meatCapTextureSet; // 3B8 BGSTextureSet* meatCollarTextureSet; // 3C0 BGSSoundDescriptorForm* corpseOpenSound; // 3C8 BGSSoundDescriptorForm* corpseCloseSound; // 3D0 BSFixedString bipedObjectNames[32]; // 3D8 ActorValueInfo* bipedObjectConditions[32]; // 4D8 BSTArray equipSlotArray; // 5D8 std::uint32_t validEquipTypes; // 5F0 TESObjectWEAP* unarmedWeapon; // 5F8 TESRace* morphRace; // 600 TESRace* armorParentRace; // 608 TESQuest* dialogueQuest; // 610 BSTArray speedOverrides; // 618 BSTArray phonemeTargets; // 630 BSTHashMap morphSliders; // 648 BGSMovementType* baseMoveTypes[4]; // 678 FaceRelatedData* faceRelatedData[2]; // 698 BodyMorphData* bodyMorphData[2]; // 6A8 TESTexture hairColorLookupTexture; // 6B8 TESTexture hairColorLookupTextureExt; // 6C8 }; static_assert(sizeof(TESRace) == 0x6D8); }