CommonLibSSE (Parapets fork)
Loading...
Searching...
No Matches
TESForm.h
Go to the documentation of this file.
1#pragma once
2
3#include "RE/B/BSAtomic.h"
5#include "RE/B/BSTArray.h"
6#include "RE/B/BSTHashMap.h"
8#include "RE/F/FormTypes.h"
9
10namespace RE
11{
12 class BGSLoadFormBuffer;
13 class BGSSaveFormBuffer;
14 class TESBoundObject;
15 class TESFile;
16 struct FORM;
17 struct FORM_GROUP;
18
19 class TESFileArray : public BSStaticArray<TESFile*>
20 {
21 public:
22 };
23 static_assert(sizeof(TESFileArray) == 0x10);
24
26 {
27 public:
28 // members
30 };
31 static_assert(sizeof(TESFileContainer) == 0x8);
32
34 {
35 public:
36 inline static constexpr auto RTTI = RTTI_TESForm;
37 inline static constexpr auto FORMTYPE = FormType::None;
38
40 {
41 enum ChangeFlag : std::uint32_t
42 {
44 kFlags = 1 << 0
45 };
46 };
47
49 {
50 enum RecordFlag : std::uint32_t
51 {
52 kDestructible = 1 << 0,
53 kMaster = 1 << 0,
54 kUnlocked = 1 << 0,
55
56 kAltered = 1 << 1,
57 kPlayable = 1 << 2,
58 kInitialized = 1 << 3,
59 kNonOccluder = 1 << 4,
60 kDeleted = 1 << 5,
61
62 kBorderRegion = 1 << 6,
65 kKnown = 1 << 6,
67
68 kFireOff = 1 << 7,
69 kMustUpdate = 1 << 8,
70 kOnLocalMap = 1 << 9,
71 kPersistent = 1 << 10,
72
73 kDisabled = 1 << 11,
75
76 kIgnored = 1 << 12,
77
78 kEmpty = 1 << 13,
80
81 kTemporary = 1 << 14,
83 kRandomAnim = 1 << 16,
84 kDangerous = 1 << 17,
85 kHasCurrents = 1 << 19,
87 kStillLoading = 1 << 21,
88 kFormRetainsID = 1 << 22,
89 kDestroyed = 1 << 23,
90
91 kNoAIAcquire = 1 << 25,
92 kObstacle = 1 << 25,
93
95 kDisableFade = 1 << 27,
96
98 kShowOnWorldMap = 1 << 28,
99
100 kChildCanUse = 1 << 29
101 };
102 };
103
104 enum class InGameFormFlag
105 {
106 kNone = 0,
107 kWantsDelete = 1 << 0,
108 kForcedPersistent = 1 << 1,
109 kNoFavorAllowed = 1 << 4,
110 kIsSkyObject = 1 << 5,
111 kRefOriginalPersistent = 1 << 6,
113 };
114
115 ~TESForm() override; // 00
116
117 // override (BaseFormComponent)
118 void InitializeDataComponent() override; // 01 - { return; }
119 void ClearDataComponent() override; // 02 - { SetEditorID(""); }
120 void CopyComponent(BaseFormComponent* a_rhs) override; // 03
121
122 // add
123 virtual void InitializeData(); // 04 - { return; }
124 virtual void ClearData(); // 05 - { return; }
125 virtual bool Load(TESFile* a_mod); // 06 - { return true; }
126 virtual bool LoadPartial(TESFile* a_mod); // 07 - { return true; }
127 virtual bool LoadEdit(TESFile* a_mod); // 08 - { return Load(a_mod); }
128 virtual TESForm* CreateDuplicateForm(bool a_createEditorID, void* a_arg2); // 09
129 virtual bool AddChange(std::uint32_t a_changeFlags); // 0A
130 virtual void RemoveChange(std::uint32_t a_changeFlags); // 0B
131 virtual bool FindInFileFast(TESFile* a_mod); // 0C - { return false; }
132 virtual bool CheckSaveGame(BGSSaveFormBuffer* a_buf); // 0D - { return true; }
133 virtual void SaveGame(BGSSaveFormBuffer* a_buf); // 0E
134 virtual void LoadGame(BGSLoadFormBuffer* a_buf); // 0F
135 virtual void InitLoadGame(BGSLoadFormBuffer* a_buf); // 10 - { return; }
136 virtual void FinishLoadGame(BGSLoadFormBuffer* a_buf); // 11 - { return; }
137 virtual void Revert(BGSLoadFormBuffer* a_buf); // 12 - { return; }
138 virtual void InitItemImpl(); // 13 - { return; }
139 [[nodiscard]] virtual TESFile* GetDescriptionOwnerFile() const; // 14 - returns the file that last modified this form
140 [[nodiscard]] virtual FormType GetSavedFormType() const; // 15 - { return formType; }
141 virtual void GetFormDetailedString(char* a_buf, std::uint32_t a_bufLen); // 16 - { return std::sprintf_s(a_buf, a_bufLen, "%s Form '%s' (%08X)", g_formStrings[3 * formID], "", formID); }
142 [[nodiscard]] virtual bool GetKnown() const; // 17 - { return (flags >> 6 ) & 1; }
143 [[nodiscard]] virtual bool GetRandomAnim() const; // 18 - { return (flags >> 16) & 1; }
144 [[nodiscard]] virtual bool GetPlayable() const; // 19 - { return (flags >> 2) & 1; }
145 [[nodiscard]] virtual bool IsHeadingMarker() const; // 1A - { return false; }
146 [[nodiscard]] virtual bool GetDangerous() const; // 1B - { return (flags >> 17) & 1; }
147 [[nodiscard]] virtual bool QHasCurrents() const; // 1C - { return (flags >> 19) & 1; }
148 [[nodiscard]] virtual bool GetObstacle() const; // 1D - { return (flags >> 25) & 1; }
149 [[nodiscard]] virtual bool QIsLODLandObject() const; // 1E - { return false; }
150 [[nodiscard]] virtual bool GetOnLocalMap() const; // 1F - { return (flags >> 9) & 1; }
151 [[nodiscard]] virtual bool GetMustUpdate() const; // 20 - { return (flags >> 8) & 1; }
152 virtual void SetOnLocalMap(bool a_set); // 21 - { if (a_set) flags &= 0xFFFFFDFF; else flags |= 0x200; }
153 [[nodiscard]] virtual bool GetIgnoredBySandbox() const; // 22 - { return false; }
154 virtual void SetDelete(bool a_set); // 23 - { bool result = (flags >> 5) & 1; if (result != a_set) { if (a_set) flags |= 0x20; else flags &= 0xFFFFFFDF; AddChange(1); return result; }
155 virtual void SetAltered(bool a_set); // 24
156 virtual void SaveObjectBound(); // 25 - { return; }
157 virtual void LoadObjectBound(TESFile* a_mod); // 26 - { return; }
158 [[nodiscard]] virtual bool IsBoundObject() const; // 27 - { return false; }
159 [[nodiscard]] virtual bool IsObject() const; // 28 - { return false; }
160 [[nodiscard]] virtual bool IsMagicItem() const; // 29 - { return false; }
161 [[nodiscard]] virtual bool IsWater() const; // 2A - { return false; }
162 virtual TESObjectREFR* AsReference1(); // 2B - { return 0; }
163 [[nodiscard]] virtual const TESObjectREFR* AsReference2() const; // 2C - { return 0; }
164 [[nodiscard]] virtual std::uint32_t GetRefCount() const; // 2D - { return 0; }
165 [[nodiscard]] virtual const char* GetTextForParsedSubTag(const BSFixedString& a_tag) const; // 2E
166 virtual void Copy(TESForm* a_srcForm); // 2F - { return; }
167 virtual bool BelongsInGroup(FORM* a_form, bool a_allowParentGroups, bool a_currentOnly); // 30
168 virtual void CreateGroupData(FORM* a_form, FORM_GROUP* a_group); // 31
169 [[nodiscard]] virtual const char* GetFormEditorID() const; // 32 - { return ""; }
170 virtual bool SetFormEditorID(const char* a_str); // 33 - { return true; }
171 virtual bool IsParentForm(); // 34 - { return false; }
172 virtual bool IsParentFormTree(); // 35 - { return false; }
173 virtual bool IsFormTypeChild(FormType a_type); // 36 - { return false; }
174 virtual bool Activate(TESObjectREFR* a_targetRef, TESObjectREFR* a_activatorRef, std::uint8_t a_arg3, TESBoundObject* a_object, std::int32_t a_targetCount); // 37 - { return false; }
175 virtual void SetFormID(FormID a_id, bool a_updateFile); // 38
176 [[nodiscard]] virtual const char* GetObjectTypeName() const; // 39 - { return ""; }
177 [[nodiscard]] virtual bool QAvailableInGame() const; // 3A - { return true; }
178
179 static void AddCompileIndex(FormID& a_id, TESFile* a_file)
180 {
181 using func_t = decltype(&TESForm::AddCompileIndex);
183 return func(a_id, a_file);
184 }
185
186 [[nodiscard]] static auto GetAllForms()
187 -> std::pair<
189 std::reference_wrapper<BSReadWriteLock>>
190 {
193 return { *allForms, std::ref(*allFormsMapLock) };
194 }
195
196 [[nodiscard]] static auto GetAllFormsByEditorID()
197 -> std::pair<
199 std::reference_wrapper<BSReadWriteLock>>
200 {
203 return { *allFormsByEditorID, std::ref(*allFormsEditorIDMapLock) };
204 }
205
206 [[nodiscard]] static TESForm* LookupByID(FormID a_formID)
207 {
208 const auto& [map, lock] = GetAllForms();
209 const BSReadWriteLock l{ lock };
210 if (map) {
211 const auto it = map->find(a_formID);
212 return it != map->end() ? it->second : nullptr;
213 } else {
214 return nullptr;
215 }
216 }
217
218 template <class T>
219 [[nodiscard]] static T* LookupByID(FormID a_formID)
220 {
221 const auto form = LookupByID(a_formID);
222 return form ? form->As<T>() : nullptr;
223 }
224
225 [[nodiscard]] static TESForm* LookupByEditorID(const std::string_view& a_editorID)
226 {
227 const auto& [map, lock] = GetAllFormsByEditorID();
228 const BSReadWriteLock l{ lock };
229 if (map) {
230 const auto it = map->find(a_editorID);
231 return it != map->end() ? it->second : nullptr;
232 } else {
233 return nullptr;
234 }
235 }
236
237 template <class T>
238 [[nodiscard]] static T* LookupByEditorID(const std::string_view& a_editorID)
239 {
240 const auto form = LookupByEditorID(a_editorID);
241 return form ? form->As<T>() : nullptr;
242 }
243
244 template <
245 class T,
246 class = std::enable_if_t<
247 std::negation_v<
248 std::disjunction<
249 std::is_pointer<T>,
250 std::is_reference<T>,
251 std::is_const<T>,
252 std::is_volatile<T>>>>>
253 [[nodiscard]] T* As() noexcept;
254
255 template <
256 class T,
257 class = std::enable_if_t<
258 std::negation_v<
259 std::disjunction<
260 std::is_pointer<T>,
261 std::is_reference<T>,
262 std::is_const<T>,
263 std::is_volatile<T>>>>>
264 [[nodiscard]] const T* As() const noexcept;
265
266 [[nodiscard]] TESObjectREFR* AsReference() { return AsReference1(); }
267 [[nodiscard]] const TESObjectREFR* AsReference() const { return AsReference2(); }
268
269 [[nodiscard]] TESFile* GetFile(std::int32_t a_idx = -1) const
270 {
271 const auto array = sourceFiles.array;
272 if (!array || array->empty()) {
273 return nullptr;
274 }
275
276 if (a_idx < 0 || static_cast<std::uint32_t>(a_idx) >= array->size()) {
277 return array->back();
278 } else {
279 return (*array)[a_idx];
280 }
281 }
282
283 [[nodiscard]] std::uint32_t GetFormFlags() const noexcept { return formFlags; }
284 [[nodiscard]] FormID GetFormID() const noexcept { return formID; }
285 [[nodiscard]] FormType GetFormType() const noexcept { return *formType; }
286 [[nodiscard]] std::int32_t GetGoldValue() const;
287 [[nodiscard]] const char* GetName() const;
288 [[nodiscard]] float GetWeight() const;
289 [[nodiscard]] bool HasVMAD() const;
290 [[nodiscard]] bool HasWorldModel() const noexcept;
291 void InitItem() { InitItemImpl(); }
292
293 [[nodiscard]] bool Is(FormType a_type) const noexcept { return GetFormType() == a_type; }
294
295 template <class... Args>
296 [[nodiscard]] bool Is(Args... a_args) const noexcept //
297 requires(std::same_as<Args, FormType>&&...)
298 {
299 return (Is(a_args) || ...);
300 }
301
302 [[nodiscard]] bool IsAmmo() const noexcept { return Is(FormType::Ammo); }
303 [[nodiscard]] bool IsArmor() const noexcept { return Is(FormType::Armor); }
304 [[nodiscard]] bool IsBook() const noexcept { return Is(FormType::Book); }
305 [[nodiscard]] bool IsDeleted() const noexcept { return (GetFormFlags() & RecordFlags::kDeleted) != 0; }
306 [[nodiscard]] bool IsDynamicForm() const noexcept { return GetFormID() >= 0xFF000000; }
307 [[nodiscard]] bool IsGold() const noexcept { return GetFormID() == 0x0000000F; }
308 [[nodiscard]] bool IsIgnored() const noexcept { return (GetFormFlags() & RecordFlags::kIgnored) != 0; }
309 [[nodiscard]] bool IsInitialized() const noexcept { return (GetFormFlags() & RecordFlags::kInitialized) != 0; }
310 [[nodiscard]] bool IsKey() const noexcept { return Is(FormType::KeyMaster); }
311 [[nodiscard]] bool IsLockpick() const noexcept { return GetFormID() == 0x0000000A; }
312
313 [[nodiscard]] bool IsNot(FormType a_type) const noexcept { return !Is(a_type); }
314
315 template <class... Args>
316 [[nodiscard]] bool IsNot(Args... a_args) const noexcept //
317 requires(std::same_as<Args, FormType>&&...)
318 {
319 return (IsNot(a_args) && ...);
320 }
321
322 [[nodiscard]] bool IsNote() const noexcept { return Is(FormType::Note); }
323 [[nodiscard]] bool IsPlayer() const noexcept { return GetFormID() == 0x00000007; }
324 [[nodiscard]] bool IsPlayerRef() const noexcept { return GetFormID() == 0x00000014; }
325 [[nodiscard]] bool IsSoulGem() const noexcept { return Is(FormType::SoulGem); }
326 [[nodiscard]] bool IsWeapon() const noexcept { return Is(FormType::Weapon); }
327
328 // members
330 std::uint32_t formFlags; // 10
334 std::uint8_t pad1B; // 1B
335 std::uint32_t pad1C; // 1C
336 };
337 static_assert(sizeof(TESForm) == 0x20);
338}
Definition: BSAtomic.h:69
Definition: BSTArray.h:656
constexpr reference back() noexcept
Definition: BSTArray.h:682
Definition: BSTHashMap.h:21
Definition: BaseFormComponent.h:8
Definition: TESBoundObject.h:24
Definition: TESForm.h:20
Definition: TESForm.h:26
TESFileArray * array
Definition: TESForm.h:29
Definition: TESFile.h:14
Definition: TESForm.h:34
bool IsLockpick() const noexcept
Definition: TESForm.h:311
virtual void InitItemImpl()
static TESForm * LookupByEditorID(const std::string_view &a_editorID)
Definition: TESForm.h:225
virtual void SaveGame(BGSSaveFormBuffer *a_buf)
virtual bool LoadEdit(TESFile *a_mod)
virtual bool IsFormTypeChild(FormType a_type)
virtual void LoadGame(BGSLoadFormBuffer *a_buf)
virtual bool IsBoundObject() const
virtual void SetAltered(bool a_set)
virtual bool QAvailableInGame() const
virtual void SetFormID(FormID a_id, bool a_updateFile)
static void AddCompileIndex(FormID &a_id, TESFile *a_file)
Definition: TESForm.h:179
void CopyComponent(BaseFormComponent *a_rhs) override
virtual bool QHasCurrents() const
virtual void InitializeData()
virtual bool GetIgnoredBySandbox() const
virtual bool GetMustUpdate() const
virtual bool GetDangerous() const
virtual bool SetFormEditorID(const char *a_str)
bool IsDeleted() const noexcept
Definition: TESForm.h:305
InGameFormFlag
Definition: TESForm.h:105
std::uint8_t pad1B
Definition: TESForm.h:334
bool IsWeapon() const noexcept
Definition: TESForm.h:326
virtual bool GetPlayable() const
virtual void SetOnLocalMap(bool a_set)
virtual const char * GetFormEditorID() const
virtual bool AddChange(std::uint32_t a_changeFlags)
bool HasWorldModel() const noexcept
stl::enumeration< FormType, std::uint8_t > formType
Definition: TESForm.h:333
virtual TESFile * GetDescriptionOwnerFile() const
virtual void Copy(TESForm *a_srcForm)
virtual void RemoveChange(std::uint32_t a_changeFlags)
virtual bool IsParentFormTree()
static T * LookupByID(FormID a_formID)
Definition: TESForm.h:219
bool IsInitialized() const noexcept
Definition: TESForm.h:309
virtual void CreateGroupData(FORM *a_form, FORM_GROUP *a_group)
bool IsArmor() const noexcept
Definition: TESForm.h:303
virtual void InitLoadGame(BGSLoadFormBuffer *a_buf)
FormType GetFormType() const noexcept
Definition: TESForm.h:285
virtual bool IsHeadingMarker() const
virtual bool IsObject() const
virtual void Revert(BGSLoadFormBuffer *a_buf)
virtual void LoadObjectBound(TESFile *a_mod)
virtual bool IsWater() const
bool Is(Args... a_args) const noexcept
Definition: TESForm.h:296
static constexpr auto RTTI
Definition: TESForm.h:36
bool IsAmmo() const noexcept
Definition: TESForm.h:302
virtual void FinishLoadGame(BGSLoadFormBuffer *a_buf)
virtual bool GetRandomAnim() const
virtual TESObjectREFR * AsReference1()
virtual bool Activate(TESObjectREFR *a_targetRef, TESObjectREFR *a_activatorRef, std::uint8_t a_arg3, TESBoundObject *a_object, std::int32_t a_targetCount)
const char * GetName() const
static auto GetAllFormsByEditorID() -> std::pair< BSTHashMap< BSFixedString, TESForm * > *, std::reference_wrapper< BSReadWriteLock > >
Definition: TESForm.h:196
virtual bool BelongsInGroup(FORM *a_form, bool a_allowParentGroups, bool a_currentOnly)
stl::enumeration< InGameFormFlag, std::uint16_t > inGameFormFlags
Definition: TESForm.h:332
virtual void GetFormDetailedString(char *a_buf, std::uint32_t a_bufLen)
virtual bool IsParentForm()
void ClearDataComponent() override
virtual void SetDelete(bool a_set)
virtual bool CheckSaveGame(BGSSaveFormBuffer *a_buf)
bool IsIgnored() const noexcept
Definition: TESForm.h:308
FormID formID
Definition: TESForm.h:331
virtual std::uint32_t GetRefCount() const
const TESObjectREFR * AsReference() const
Definition: TESForm.h:267
bool IsNot(FormType a_type) const noexcept
Definition: TESForm.h:313
virtual void ClearData()
FormID GetFormID() const noexcept
Definition: TESForm.h:284
std::uint32_t pad1C
Definition: TESForm.h:335
static auto GetAllForms() -> std::pair< BSTHashMap< FormID, TESForm * > *, std::reference_wrapper< BSReadWriteLock > >
Definition: TESForm.h:186
bool Is(FormType a_type) const noexcept
Definition: TESForm.h:293
std::int32_t GetGoldValue() const
bool IsPlayerRef() const noexcept
Definition: TESForm.h:324
virtual bool FindInFileFast(TESFile *a_mod)
float GetWeight() const
bool IsNot(Args... a_args) const noexcept
Definition: TESForm.h:316
virtual const char * GetObjectTypeName() const
TESFile * GetFile(std::int32_t a_idx=-1) const
Definition: TESForm.h:269
virtual bool GetKnown() const
virtual void SaveObjectBound()
bool HasVMAD() const
virtual bool GetObstacle() const
virtual bool IsMagicItem() const
virtual bool Load(TESFile *a_mod)
virtual bool QIsLODLandObject() const
virtual const TESObjectREFR * AsReference2() const
bool IsDynamicForm() const noexcept
Definition: TESForm.h:306
TESFileContainer sourceFiles
Definition: TESForm.h:329
std::uint32_t GetFormFlags() const noexcept
Definition: TESForm.h:283
void InitItem()
Definition: TESForm.h:291
std::uint32_t formFlags
Definition: TESForm.h:330
static constexpr auto FORMTYPE
Definition: TESForm.h:37
bool IsGold() const noexcept
Definition: TESForm.h:307
virtual FormType GetSavedFormType() const
void InitializeDataComponent() override
bool IsSoulGem() const noexcept
Definition: TESForm.h:325
bool IsNote() const noexcept
Definition: TESForm.h:322
static TESForm * LookupByID(FormID a_formID)
Definition: TESForm.h:206
T * As() noexcept
Definition: FormTraits.h:146
bool IsPlayer() const noexcept
Definition: TESForm.h:323
static T * LookupByEditorID(const std::string_view &a_editorID)
Definition: TESForm.h:238
TESObjectREFR * AsReference()
Definition: TESForm.h:266
bool IsBook() const noexcept
Definition: TESForm.h:304
virtual TESForm * CreateDuplicateForm(bool a_createEditorID, void *a_arg2)
virtual const char * GetTextForParsedSubTag(const BSFixedString &a_tag) const
~TESForm() override
virtual bool LoadPartial(TESFile *a_mod)
virtual bool GetOnLocalMap() const
bool IsKey() const noexcept
Definition: TESForm.h:310
Definition: TESObjectREFR.h:105
Definition: Relocation.h:858
Definition: PCH.h:216
constexpr REL::ID AllFormsByEditorID(static_cast< std::uint64_t >(400509))
constexpr REL::ID AddCompileIndex(static_cast< std::uint64_t >(14667))
constexpr REL::ID AllFormsEditorIDMapLock(static_cast< std::uint64_t >(400518))
constexpr REL::ID AllForms(static_cast< std::uint64_t >(400507))
constexpr REL::ID AllFormsMapLock(static_cast< std::uint64_t >(400517))
Definition: AbsorbEffect.h:6
FormType
Definition: FormTypes.h:139
std::uint32_t FormID
Definition: BSCoreTypes.h:5
constexpr REL::ID RTTI_TESForm
Definition: Offsets_RTTI.h:5995
Definition: NiBinaryStream.h:94
Definition: FORM.h:20
Definition: FORM.h:6
Definition: TESForm.h:40
ChangeFlag
Definition: TESForm.h:42
@ kCreated
Definition: TESForm.h:43
@ kFlags
Definition: TESForm.h:44
Definition: TESForm.h:49
RecordFlag
Definition: TESForm.h:51
@ kTemporary
Definition: TESForm.h:81
@ kStillLoading
Definition: TESForm.h:87
@ kOnLocalMap
Definition: TESForm.h:70
@ kMaster
Definition: TESForm.h:53
@ kRandomAnim
Definition: TESForm.h:83
@ kResetDestruction
Definition: TESForm.h:79
@ kUsedAsMovingPlatform
Definition: TESForm.h:74
@ kFireOff
Definition: TESForm.h:68
@ kDeleted
Definition: TESForm.h:60
@ kUnlocked
Definition: TESForm.h:54
@ kMustBeVisibleDistant
Definition: TESForm.h:82
@ kReflectedByAutoWater
Definition: TESForm.h:97
@ kInPlaceableWater
Definition: TESForm.h:66
@ kVATSTargetOverride
Definition: TESForm.h:94
@ kDisabled
Definition: TESForm.h:73
@ kNoAIAcquire
Definition: TESForm.h:91
@ kAltered
Definition: TESForm.h:56
@ kIgnoreFriendlyHits
Definition: TESForm.h:86
@ kDisableFade
Definition: TESForm.h:95
@ kFormRetainsID
Definition: TESForm.h:88
@ kShowOnWorldMap
Definition: TESForm.h:98
@ kInitialized
Definition: TESForm.h:58
@ kDangerous
Definition: TESForm.h:84
@ kEmpty
Definition: TESForm.h:78
@ kMustUpdate
Definition: TESForm.h:69
@ kDestructible
Definition: TESForm.h:52
@ kIgnored
Definition: TESForm.h:76
@ kObstacle
Definition: TESForm.h:92
@ kChildCanUse
Definition: TESForm.h:100
@ kHasCurrents
Definition: TESForm.h:85
@ kBorderRegion
Definition: TESForm.h:62
@ kGlobalConstant
Definition: TESForm.h:63
@ kPlayable
Definition: TESForm.h:57
@ kKnown
Definition: TESForm.h:65
@ kPersistent
Definition: TESForm.h:71
@ kDestroyed
Definition: TESForm.h:89
@ kNonOccluder
Definition: TESForm.h:59
@ kHasSpokenFlag
Definition: TESForm.h:64