CommonLibSSE NG
Projectile.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "RE/B/BGSProjectile.h"
4 #include "RE/B/BSAtomic.h"
5 #include "RE/B/BSPointerHandle.h"
6 #include "RE/B/BSSoundHandle.h"
7 #include "RE/B/BSTList.h"
8 #include "RE/B/BSTSingleton.h"
9 #include "RE/C/CollisionLayers.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 
17 namespace 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 
29  class Projectile : public TESObjectREFR
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:
48  static Manager* GetSingleton();
49 
50  // members
54  mutable BSSpinLock projectileLock; // 50
56  };
57 
59  {
60  public:
61  // members
62  float x;
63  float z;
64  };
65  static_assert(sizeof(ProjectileRot) == 0x08);
66 
67  struct LaunchData
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
95  MagicItem* spell; // 70
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 
113  struct ImpactData
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,
156  kAddedVisualEffectOnGround = 1 << 20,
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; }
214  SKYRIM_REL_VR_VIRTUAL void ReportHavokDeactivation(); // B2 - { return; }
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
226  SKYRIM_REL_VR_VIRTUAL bool HandleHits(hkpCollidable* a_collidable); // BE
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 SKYRIM_REL_VR_VIRTUAL
Definition: Common.h:94
#define PROJECTILE_RUNTIME_DATA_CONTENT
Definition: Projectile.h:243
Definition: ActorCause.h:9
Definition: Actor.h:135
Definition: AlchemyItem.h:24
Definition: BGSKeyword.h:10
Definition: BGSLoadFormBuffer.h:11
Definition: BGSMaterialType.h:12
Definition: BGSProjectile.h:79
Definition: BGSSaveFormBuffer.h:8
Definition: BSAtomic.h:51
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
static Manager * GetSingleton()
BSTArray< WobbleControl > wobble
Definition: Projectile.h:55
BSTArray< ProjectileHandle > pending
Definition: Projectile.h:53
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()
NiNode * GetFireNode() override
Flags
Definition: Projectile.h:134
SKYRIM_REL_VR_VIRTUAL void UpdateImpl(float a_delta)
NiAVObject * Load3D(bool a_backgroundLoading) override
float GetSpeed() const
void InitLoadGame(BGSLoadFormBuffer *a_buf) override
Projectile * AsProjectile() override
bool GetAllowPromoteToPersistent() const override
static ProjectileHandle * LaunchSpell(ProjectileHandle *a_result, Actor *a_shooter, SpellItem *a_spell, const NiPoint3 &a_origin, const ProjectileRot &a_angles) noexcept
void MoveHavok(bool a_forceRec) override
const PROJECTILE_RUNTIME_DATA & GetProjectileRuntimeData() const noexcept
Definition: Projectile.h:296
SKYRIM_REL_VR_VIRTUAL float GetWeaponSpeedMult() const
void LoadGame(BGSLoadFormBuffer *a_buf) override
SKYRIM_REL_VR_VIRTUAL void ReportHavokDeactivation()
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 bhkShape * GetCollisionShape()
SKYRIM_REL_VR_VIRTUAL void OnTriggerEnter()
SKYRIM_REL_VR_VIRTUAL bool IsBeamProjectile()
void FinishLoadGame(BGSLoadFormBuffer *a_buf) override
SKYRIM_REL_VR_VIRTUAL void Process3D()
ActorCause * GetActorCause() const override
SKYRIM_REL_VR_VIRTUAL bool TurnOff(Actor *a_owner, bool a_noDeactivateSound)
static ProjectileHandle * Launch(ProjectileHandle *a_result, LaunchData &a_data) noexcept
bool Load(TESFile *a_mod) override
SKYRIM_REL_VR_VIRTUAL bool RunTargetPick()
void Set3D(NiAVObject *a_object, bool a_queue3DTasks=true) override
PROJECTILE_RUNTIME_DATA & GetProjectileRuntimeData() noexcept
Definition: Projectile.h:291
SKYRIM_REL_VR_VIRTUAL bool IsPermanent() const
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)
BGSProjectile * GetProjectileBase() const
void SaveGame(BGSSaveFormBuffer *a_buf) override
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()
MagicCaster * GetMagicCaster(MagicSystem::CastingSource a_source) override
void InitHavok() override
SKYRIM_REL_VR_VIRTUAL bool ProcessImpacts()
bool DetachHavok(NiAVObject *a_obj3D) override
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
static ProjectileHandle * LaunchSpell(ProjectileHandle *a_result, Actor *a_shooter, SpellItem *a_spell, MagicSystem::CastingSource a_source) noexcept
void Revert(BGSLoadFormBuffer *a_buf) override
SKYRIM_REL_VR_VIRTUAL bool HandleHits(hkpCollidable *a_collidable)
static ProjectileHandle * LaunchArrow(ProjectileHandle *a_result, Actor *a_shooter, TESAmmo *a_ammo, TESObjectWEAP *a_weap) noexcept
SKYRIM_REL_VR_VIRTUAL void Unk_AE(void)
static ProjectileHandle * LaunchArrow(ProjectileHandle *a_result, Actor *a_shooter, TESAmmo *a_ammo, TESObjectWEAP *a_weap, const NiPoint3 &a_origin, const ProjectileRot &a_angles) noexcept
Definition: SpellItem.h:16
Definition: TESAmmo.h:60
Definition: TESFile.h:17
Definition: TESObjectCELL.h:116
Definition: TESObjectREFR.h:113
Definition: TESObjectWEAP.h:79
Definition: bhkShape.h:10
Definition: hkpCollidable.h:13
CastingSource
Definition: MagicSystem.h:24
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