CommonLibSSE NG
Loading...
Searching...
No Matches
Projectile.h
Go to the documentation of this file.
1#pragma once
2
4#include "RE/B/BSAtomic.h"
7#include "RE/B/BSTList.h"
8#include "RE/B/BSTSingleton.h"
10#include "RE/F/FormTypes.h"
11#include "RE/I/ImpactResults.h"
12#include "RE/M/MagicItem.h"
13#include "RE/N/NiSmartPointer.h"
14#include "RE/N/NiTransform.h"
15#include "RE/T/TESObjectREFR.h"
16
17namespace RE
18{
19 class Actor;
20 class bhkCollisionObject;
21 class bhkShape;
22 class bhkSimpleShapePhantom;
23 class BGSMaterialType;
24 class BSLight;
25 class CombatController;
26 class MagicItem;
27 class QueuedFile;
28
30 {
31 public:
32 inline static constexpr auto RTTI = RTTI_Projectile;
33 inline static constexpr auto VTABLE = VTABLE_Projectile;
34
36 {
37 public:
38 // members
41 float wobble; // 28
42 };
43 static_assert(sizeof(WobbleControl) == 0x2C);
44
45 class Manager : public BSTSingletonSDM<Manager>
46 {
47 public:
49
50 // members
56 };
57
59 {
60 public:
61 // members
62 float x;
63 float z;
64 };
65 static_assert(sizeof(ProjectileRot) == 0x08);
66
68 {
69 public:
70 inline static constexpr auto RTTI = RTTI_Projectile__LaunchData;
71 inline static constexpr auto VTABLE = VTABLE_Projectile__LaunchData;
72
73 virtual ~LaunchData() = default;
74
75 LaunchData() = default;
76 LaunchData(BGSProjectile* a_bproj, Actor* a_shooter, const NiPoint3& a_origin, const ProjectileRot& a_angles);
77 LaunchData(Actor* a_shooter, const NiPoint3& a_origin, const ProjectileRot& a_angles, MagicItem* a_spell);
78 LaunchData(Actor* a_shooter, const NiPoint3& a_origin, const ProjectileRot& a_angles, TESAmmo* a_ammo, TESObjectWEAP* a_weap);
79
80 // members
88 float angleZ; // 48
89 float angleX; // 4C
90 void* unk50; // 50 - maps to Projectile unk110
92 float unk60; // 60 - maps to Projectile unk1A8
93 float unk64; // 64 - maps to Projectile unk1AC
97 std::uint32_t pad7C; // 7C
100 std::int32_t area; // 90
101 float power; // 94
102 float scale; // 98
103 bool alwaysHit; // 9C
105 bool autoAim; // 9E
106 bool chainShatter; // 9F
107 bool useOrigin; // A0
109 bool forceConeOfFire; // A2
110 };
111 static_assert(sizeof(LaunchData) == 0xA8);
112
114 {
115 public:
116 // members
122 std::int32_t damageRootNodeType; // 30
126 std::uint16_t unk44; // 44
127 std::uint16_t unk46; // 46
128 std::uint8_t unk48; // 48
129 std::uint8_t unk49; // 49
130 };
131 static_assert(sizeof(ImpactData) == 0x50);
132
133 enum class Flags
134 {
135 kNone = 0,
136 kUnk0 = 1 << 0,
137 kNotAddThreat = 1 << 1,
138 kUnk2 = 1 << 2,
139 kUnk3 = 1 << 3,
140 kIsTracer = 1 << 4,
141 kFading = 1 << 5,
142 kGravityUpdateModel = 1 << 6,
143 kUnk7 = 1 << 7,
144 kInited = 1 << 8,
145 kChainShatter = 1 << 9,
146 kUnk10 = 1 << 10,
147 kUnk11 = 1 << 11,
148 kAlwaysHit = 1 << 12,
149 kHitScan = 1 << 13,
150 kUnk14 = 1 << 14,
151 kDestroyAfterHit = 1 << 15,
152 kAddedToManager = 1 << 16,
153 kNoDamageOutsideCombat = 1 << 17,
154 kCanStartTrails = 1 << 18,
155 kAggressiveActor = 1 << 19,
157 kAutoAim = 1 << 21,
158 kProcessedImpacts = 1 << 22,
159 kUnk23 = 1 << 23,
160 kUnk24 = 1 << 24,
161 kDestroyed = 1 << 25,
162 kUnk26 = 1 << 26,
163 kUnk27 = 1 << 27,
164 kIsDual = 1 << 28,
165 kUseOrigin = 1 << 29,
166 kUnk30 = 1 << 30,
167 kMoved = 1 << 31
168 };
169
170 ~Projectile() override; // 00
171
172 // override (TESObjectREFR)
173 bool Load(TESFile* a_mod) override; // 06 - { return TESObjectREFR::Load(a_mod); }
174 void SaveGame(BGSSaveFormBuffer* a_buf) override; // 0E
175 void LoadGame(BGSLoadFormBuffer* a_buf) override; // 0F
176 void InitLoadGame(BGSLoadFormBuffer* a_buf) override; // 10
177 void FinishLoadGame(BGSLoadFormBuffer* a_buf) override; // 11
178 void Revert(BGSLoadFormBuffer* a_buf) override; // 12
179 bool GetAllowPromoteToPersistent() const override; // 47 - { return false; }
180 bool HasKeywordHelper(const BGSKeyword* a_keyword) const override; // 48
181 void SetActorCause(ActorCause* a_cause) override; // 50 - { actorCause = a_cause; }
182 ActorCause* GetActorCause() const override; // 51 - { return actorCause; }
184 bool DetachHavok(NiAVObject* a_obj3D) override; // 65
185 void InitHavok() override; // 66
186 NiAVObject* Load3D(bool a_backgroundLoading) override; // 6A
187 void Set3D(NiAVObject* a_object, bool a_queue3DTasks = true) override; // 6C
188#ifndef SKYRIM_CROSS_VR
189 // Override functions past where Skyrim VR breaks compatibility.
190 void MoveHavok(bool a_forceRec) override; // 85 - { return; }
191 void GetLinearVelocity(NiPoint3& a_velocity) const override; // 86
192 NiNode* GetFireNode() override; // 8B
193 [[nodiscard]] Projectile* AsProjectile() override; // 8F - { return this; }
194 bool OnAddCellPerformQueueReference(TESObjectCELL& a_cell) const override; // 90 - { return false; }
195#endif
196
197 // add
198 [[nodiscard]] SKYRIM_REL_VR_VIRTUAL bool IsMissileProjectile(); // A2 - { return 0; }
199 [[nodiscard]] SKYRIM_REL_VR_VIRTUAL bool IsGrenadeProjectile(); // A3 - { return 0; }
200 [[nodiscard]] SKYRIM_REL_VR_VIRTUAL bool IsFlameProjectile(); // A4 - { return 0; }
201 [[nodiscard]] SKYRIM_REL_VR_VIRTUAL bool IsBeamProjectile(); // A5 - { return 0; }
202 SKYRIM_REL_VR_VIRTUAL void Unk_A6(void); // A6 - { return 0; }
203 [[nodiscard]] SKYRIM_REL_VR_VIRTUAL bool IsBarrierProjectile(); // A7 - { return 0; }
204 SKYRIM_REL_VR_VIRTUAL void OnKill(); // A8 - { return; }
205 SKYRIM_REL_VR_VIRTUAL void Process3D(); // A9 - { return; }
207 SKYRIM_REL_VR_VIRTUAL void UpdateImpl(float a_delta); // AB
210 SKYRIM_REL_VR_VIRTUAL void Unk_AE(void); // AE - { return 0; }
211 [[nodiscard]] SKYRIM_REL_VR_VIRTUAL float GetPowerSpeedMult() const; // AF - { if (unk158) return 1.0; else return unk188; } - "float GetSpeed()"?
212 [[nodiscard]] SKYRIM_REL_VR_VIRTUAL float GetWeaponSpeedMult() const; // B0 - { return 1.0; }
213 [[nodiscard]] SKYRIM_REL_VR_VIRTUAL bool GetStopMainSoundAfterImpact(); // B1 - { return 0; }
215 SKYRIM_REL_VR_VIRTUAL bool TurnOff(Actor* a_owner, bool a_noDeactivateSound); // B3
216 [[nodiscard]] SKYRIM_REL_VR_VIRTUAL bool IsPermanent() const; // B4 - { return TESDataHandler::GetSingleton()->IsGeneratedFormID(formID) == 0; }
217 SKYRIM_REL_VR_VIRTUAL float GetGravity(); // B5 - { void* var = unk40; if ((var->unk80 >> 17) & 1) return 1.0; else return var->unk84; }
220 [[nodiscard]] SKYRIM_REL_VR_VIRTUAL bool GetKillOnCollision(); // B8 - { return 1; }
221 [[nodiscard]] SKYRIM_REL_VR_VIRTUAL bool ShouldBeLimited(); // B9 - { return 0; }
222 [[nodiscard]] SKYRIM_REL_VR_VIRTUAL bool TargetsWholeBody(); // BA - { return 0; }
223 [[nodiscard]] SKYRIM_REL_VR_VIRTUAL std::uint32_t GetCollisionGroup(); // BB
225 SKYRIM_REL_VR_VIRTUAL void AddImpact(TESObjectREFR* a_ref, const NiPoint3& a_targetLoc, const NiPoint3& a_velocity, hkpCollidable* a_collidable, std::int32_t a_arg6, std::uint32_t a_arg7); // BD
227 SKYRIM_REL_VR_VIRTUAL void OnTriggerEnter(); // BF - { return; }
228 SKYRIM_REL_VR_VIRTUAL void Handle3DLoaded(); // C0 - { return; }
229 [[nodiscard]] SKYRIM_REL_VR_VIRTUAL bool ShouldUseDesiredTarget(); // C1 - { return 0; }
230
232 float GetHeight() const;
233 float GetSpeed() const;
234
235 static ProjectileHandle* Launch(ProjectileHandle* a_result, LaunchData& a_data) noexcept;
236 static ProjectileHandle* LaunchSpell(ProjectileHandle* a_result, Actor* a_shooter, SpellItem* a_spell, const NiPoint3& a_origin, const ProjectileRot& a_angles) noexcept;
237 static ProjectileHandle* LaunchSpell(ProjectileHandle* a_result, Actor* a_shooter, SpellItem* a_spell, MagicSystem::CastingSource a_source) noexcept;
238 static ProjectileHandle* LaunchArrow(ProjectileHandle* a_result, Actor* a_shooter, TESAmmo* a_ammo, TESObjectWEAP* a_weap, const NiPoint3& a_origin, const ProjectileRot& a_angles) noexcept;
239 static ProjectileHandle* LaunchArrow(ProjectileHandle* a_result, Actor* a_shooter, TESAmmo* a_ammo, TESObjectWEAP* a_weap) noexcept;
240
242 {
243#define PROJECTILE_RUNTIME_DATA_CONTENT \
244 BSSimpleList<ImpactData*> impacts; /* 098, 0A0 */ \
245 NiTransform unk0A8; /* 0A8 */ \
246 float unk0DC; /* 0DC */ \
247 bhkSimpleShapePhantom* unk0E0; /* 0E0 - smart ptr */ \
248 mutable BSSpinLock unk0E8; /* 0E8 */ \
249 NiPoint3 velocity; /* 0F0 */ \
250 NiPoint3 linearVelocity; /* 0FC */ \
251 NiPointer<BSLight> light; /* 108 - smart ptr */ \
252 void* unk110; /* 110 - smart ptr */ \
253 NiPointer<ActorCause> actorCause; /* 118 */ \
254 ObjectRefHandle shooter; /* 120 */ \
255 ObjectRefHandle desiredTarget; /* 124 */ \
256 BSSoundHandle sndHandle; /* 128 */ \
257 BSSoundHandle sndCountdown; /* 134 */ \
258 std::uint32_t* unk140; /* 140 */ \
259 InventoryEntryData* unk148; /* 148 */ \
260 BGSExplosion* explosion; /* 150 */ \
261 MagicItem* spell; /* 158 */ \
262 MagicSystem::CastingSource castingSource; /* 160 */ \
263 std::uint32_t pad164; /* 164 */ \
264 EffectSetting* avEffect; /* 168 */ \
265 NiPointer<QueuedFile> projectileDBFiles; /* 170 */ \
266 std::uint64_t unk178; /* 178 */ \
267 std::uint64_t unk180; /* 180 */ \
268 float power; /* 188 - 14074B774 */ \
269 float speedMult; /* 18C - 1407501B2 */ \
270 float range; /* 190 */ \
271 float livingTime; /* 194 */ \
272 float weaponDamage; /* 198 */ \
273 float transparency; /* 19C - for beam disappearing */ \
274 float explosionTimer; /* 1A0 */ \
275 std::uint32_t unk1A4; /* 1A4 */ \
276 float unk1A8; /* 1A8 */ \
277 float unk1AC; /* 1AC */ \
278 TESObjectWEAP* weaponSource; /* 1B0 */ \
279 TESAmmo* ammoSource; /* 1B8 */ \
280 float distanceMoved; /* 1C0 */ \
281 std::uint32_t unk1C4; /* 1C4 - pad? */ \
282 float scale; /* 1C8 - for double cast model scale */ \
283 std::uint32_t flags; /* 1CC */ \
284 bool unk1D0; /* 1D0 */ \
285 bool unk1D1; /* 1D1 */ \
286 std::uint8_t unk1D2[6]; /* 1D2 */
287
289 };
290
291 [[nodiscard]] inline PROJECTILE_RUNTIME_DATA& GetProjectileRuntimeData() noexcept
292 {
293 return REL::RelocateMemberIfNewer<PROJECTILE_RUNTIME_DATA>(SKSE::RUNTIME_SSE_1_6_629, this, 0x98, 0xA0);
294 }
295
296 [[nodiscard]] inline const PROJECTILE_RUNTIME_DATA& GetProjectileRuntimeData() const noexcept
297 {
298 return REL::RelocateMemberIfNewer<PROJECTILE_RUNTIME_DATA>(SKSE::RUNTIME_SSE_1_6_629, this, 0x98, 0xA0);
299 }
300
301 // members
302#ifndef ENABLE_SKYRIM_AE
304#endif
305 };
306#ifndef ENABLE_SKYRIM_AE
307 static_assert(sizeof(Projectile) == 0x1D8);
308#endif
309}
310#undef PROJECTILE_RUNTIME_DATA_CONTENT
#define PROJECTILE_RUNTIME_DATA_CONTENT
Definition Projectile.h:243
#define SKYRIM_REL_VR_VIRTUAL
Definition Relocation.h:152
Definition ActorCause.h:9
Definition Actor.h:131
Definition AlchemyItem.h:24
Definition BGSKeyword.h:10
Definition BGSLoadFormBuffer.h:11
Definition BGSMaterialType.h:12
Definition BGSProjectile.h:79
Definition BSAtomic.h:49
Definition BSTArray.h:377
Definition CombatController.h:23
Definition EnchantmentItem.h:10
Definition MagicCaster.h:25
Definition MagicItem.h:30
Definition NiAVObject.h:50
Definition NiMatrix3.h:8
Definition NiNode.h:12
Definition NiPoint3.h:6
Definition NiSmartPointer.h:9
Definition Projectile.h:46
BSTArray< WobbleControl > wobble
Definition Projectile.h:55
BSTArray< ProjectileHandle > pending
Definition Projectile.h:53
static Manager * GetSingleton()
BSTArray< ProjectileHandle > limited
Definition Projectile.h:52
BSTArray< ProjectileHandle > unlimited
Definition Projectile.h:51
BSSpinLock projectileLock
Definition Projectile.h:54
Definition Projectile.h:30
SKYRIM_REL_VR_VIRTUAL void Unk_A6(void)
~Projectile() override
SKYRIM_REL_VR_VIRTUAL void OnKill()
SKYRIM_REL_VR_VIRTUAL void CleanUpPointersOnDisable()
Flags
Definition Projectile.h:134
SKYRIM_REL_VR_VIRTUAL void UpdateImpl(float a_delta)
float GetSpeed() const
PROJECTILE_RUNTIME_DATA & GetProjectileRuntimeData() noexcept
Definition Projectile.h:291
void InitLoadGame(BGSLoadFormBuffer *a_buf) override
SKYRIM_REL_VR_VIRTUAL bhkShape * GetCollisionShape()
static ProjectileHandle * LaunchArrow(ProjectileHandle *a_result, Actor *a_shooter, TESAmmo *a_ammo, TESObjectWEAP *a_weap) noexcept
bool GetAllowPromoteToPersistent() const override
BGSProjectile * GetProjectileBase() const
void MoveHavok(bool a_forceRec) override
NiNode * GetFireNode() override
SKYRIM_REL_VR_VIRTUAL float GetWeaponSpeedMult() const
void LoadGame(BGSLoadFormBuffer *a_buf) override
SKYRIM_REL_VR_VIRTUAL void ReportHavokDeactivation()
static ProjectileHandle * LaunchSpell(ProjectileHandle *a_result, Actor *a_shooter, SpellItem *a_spell, const NiPoint3 &a_origin, const ProjectileRot &a_angles) noexcept
SKYRIM_REL_VR_VIRTUAL float GetGravity()
SKYRIM_REL_VR_VIRTUAL bool IsBarrierProjectile()
SKYRIM_REL_VR_VIRTUAL bool GetStopMainSoundAfterImpact()
SKYRIM_REL_VR_VIRTUAL bool GetKillOnCollision()
SKYRIM_REL_VR_VIRTUAL void OnTriggerEnter()
SKYRIM_REL_VR_VIRTUAL bool IsBeamProjectile()
void FinishLoadGame(BGSLoadFormBuffer *a_buf) override
SKYRIM_REL_VR_VIRTUAL void Process3D()
SKYRIM_REL_VR_VIRTUAL bool TurnOff(Actor *a_owner, bool a_noDeactivateSound)
bool Load(TESFile *a_mod) override
SKYRIM_REL_VR_VIRTUAL bool RunTargetPick()
void Set3D(NiAVObject *a_object, bool a_queue3DTasks=true) override
NiAVObject * Load3D(bool a_backgroundLoading) override
SKYRIM_REL_VR_VIRTUAL bool IsPermanent() const
const PROJECTILE_RUNTIME_DATA & GetProjectileRuntimeData() const noexcept
Definition Projectile.h:296
SKYRIM_REL_VR_VIRTUAL float GetPowerSpeedMult() const
SKYRIM_REL_VR_VIRTUAL bool IsMissileProjectile()
SKYRIM_REL_VR_VIRTUAL bool IsFlameProjectile()
static constexpr auto RTTI
Definition Projectile.h:32
SKYRIM_REL_VR_VIRTUAL bool ShouldUseDesiredTarget()
SKYRIM_REL_VR_VIRTUAL bool IsGrenadeProjectile()
SKYRIM_REL_VR_VIRTUAL void AddImpact(TESObjectREFR *a_ref, const NiPoint3 &a_targetLoc, const NiPoint3 &a_velocity, hkpCollidable *a_collidable, std::int32_t a_arg6, std::uint32_t a_arg7)
void SaveGame(BGSSaveFormBuffer *a_buf) override
static ProjectileHandle * Launch(ProjectileHandle *a_result, LaunchData &a_data) noexcept
static ProjectileHandle * LaunchSpell(ProjectileHandle *a_result, Actor *a_shooter, SpellItem *a_spell, MagicSystem::CastingSource a_source) noexcept
SKYRIM_REL_VR_VIRTUAL void PostLoad3D(NiAVObject *a_root)
SKYRIM_REL_VR_VIRTUAL void Handle3DLoaded()
bool OnAddCellPerformQueueReference(TESObjectCELL &a_cell) const override
float GetHeight() const
static constexpr auto VTABLE
Definition Projectile.h:33
void SetActorCause(ActorCause *a_cause) override
SKYRIM_REL_VR_VIRTUAL bool ShouldBeLimited()
void InitHavok() override
SKYRIM_REL_VR_VIRTUAL bool ProcessImpacts()
bool DetachHavok(NiAVObject *a_obj3D) override
static ProjectileHandle * LaunchArrow(ProjectileHandle *a_result, Actor *a_shooter, TESAmmo *a_ammo, TESObjectWEAP *a_weap, const NiPoint3 &a_origin, const ProjectileRot &a_angles) noexcept
SKYRIM_REL_VR_VIRTUAL void Update3D()
bool HasKeywordHelper(const BGSKeyword *a_keyword) const override
SKYRIM_REL_VR_VIRTUAL std::uint32_t GetCollisionGroup()
SKYRIM_REL_VR_VIRTUAL bool TargetsWholeBody()
void GetLinearVelocity(NiPoint3 &a_velocity) const override
MagicCaster * GetMagicCaster(MagicSystem::CastingSource a_source) override
Projectile * AsProjectile() override
void Revert(BGSLoadFormBuffer *a_buf) override
SKYRIM_REL_VR_VIRTUAL bool HandleHits(hkpCollidable *a_collidable)
ActorCause * GetActorCause() const override
SKYRIM_REL_VR_VIRTUAL void Unk_AE(void)
Definition SpellItem.h:16
Definition TESAmmo.h:60
Definition TESFile.h:15
Definition TESObjectCELL.h:116
Definition TESObjectREFR.h:112
Definition TESObjectWEAP.h:79
Definition bhkShape.h:10
Definition hkpCollidable.h:13
Definition PCH.h:223
CastingSource
Definition MagicSystem.h:23
Definition AbsorbEffect.h:6
constexpr REL::VariantID RTTI_Projectile__LaunchData(684852, 392556, 0x1edadd8)
constexpr std::array< REL::VariantID, 4 > VTABLE_Projectile
Definition Offsets_VTABLE.h:2788
ImpactResult
Definition ImpactResults.h:6
constexpr REL::VariantID RTTI_Projectile(514046, 394480, 0x1f02a60)
constexpr std::array< REL::VariantID, 1 > VTABLE_Projectile__LaunchData
Definition Offsets_VTABLE.h:273
constexpr REL::Version RUNTIME_SSE_1_6_629(1, 6, 629, 0)
Definition BSTSingleton.h:50
Definition Projectile.h:114
stl::enumeration< COL_LAYER, std::int32_t > collidedLayer
Definition Projectile.h:123
BGSMaterialType * material
Definition Projectile.h:121
std::int32_t damageRootNodeType
Definition Projectile.h:122
NiPoint3 desiredTargetLoc
Definition Projectile.h:117
std::uint16_t unk46
Definition Projectile.h:127
NiPointer< bhkCollisionObject > colObj
Definition Projectile.h:120
ImpactResult impactResult
Definition Projectile.h:125
std::uint8_t unk49
Definition Projectile.h:129
ObjectRefHandle collidee
Definition Projectile.h:119
std::uint8_t unk48
Definition Projectile.h:128
NiPoint3 negativeVelocity
Definition Projectile.h:118
NiNode * damageRootNode
Definition Projectile.h:124
std::uint16_t unk44
Definition Projectile.h:126
Definition Projectile.h:68
static constexpr auto RTTI
Definition Projectile.h:70
bool chainShatter
Definition Projectile.h:106
EnchantmentItem * enchantItem
Definition Projectile.h:98
MagicItem * spell
Definition Projectile.h:95
float unk60
Definition Projectile.h:92
TESAmmo * ammoSource
Definition Projectile.h:87
virtual ~LaunchData()=default
TESObjectREFR * desiredTarget
Definition Projectile.h:91
float unk64
Definition Projectile.h:93
BGSProjectile * projectileBase
Definition Projectile.h:83
NiPoint3 origin
Definition Projectile.h:81
std::uint32_t pad7C
Definition Projectile.h:97
bool noDamageOutsideCombat
Definition Projectile.h:104
std::int32_t area
Definition Projectile.h:100
void * unk50
Definition Projectile.h:90
bool useOrigin
Definition Projectile.h:107
TESObjectWEAP * weaponSource
Definition Projectile.h:86
NiPoint3 contactNormal
Definition Projectile.h:82
LaunchData(Actor *a_shooter, const NiPoint3 &a_origin, const ProjectileRot &a_angles, MagicItem *a_spell)
float angleZ
Definition Projectile.h:88
float power
Definition Projectile.h:101
TESObjectREFR * shooter
Definition Projectile.h:84
float scale
Definition Projectile.h:102
MagicSystem::CastingSource castingSource
Definition Projectile.h:96
float angleX
Definition Projectile.h:89
CombatController * combatController
Definition Projectile.h:85
bool alwaysHit
Definition Projectile.h:103
LaunchData(Actor *a_shooter, const NiPoint3 &a_origin, const ProjectileRot &a_angles, TESAmmo *a_ammo, TESObjectWEAP *a_weap)
LaunchData(BGSProjectile *a_bproj, Actor *a_shooter, const NiPoint3 &a_origin, const ProjectileRot &a_angles)
bool forceConeOfFire
Definition Projectile.h:109
static constexpr auto VTABLE
Definition Projectile.h:71
bool deferInitialization
Definition Projectile.h:108
TESObjectCELL * parentCell
Definition Projectile.h:94
bool autoAim
Definition Projectile.h:105
AlchemyItem * poison
Definition Projectile.h:99
Definition Projectile.h:242
Definition Projectile.h:59
float z
Definition Projectile.h:63
float x
Definition Projectile.h:62
Definition Projectile.h:36
NiMatrix3 unk00
Definition Projectile.h:39
float wobble
Definition Projectile.h:41
ProjectileHandle handle
Definition Projectile.h:40