docs: add plugin setup guide

This commit is contained in:
2026-05-30 18:33:24 +12:00
parent f3db41c402
commit b61043a3fe
1776 changed files with 122386 additions and 2 deletions
@@ -0,0 +1,166 @@
#pragma once
#include "RE/B/BGSBodyPartDefs.h"
#include "RE/B/BGSEquipIndex.h"
#include "RE/B/BGSObjectInstance.h"
#include "RE/B/BSPointerHandle.h"
#include "RE/B/BSSoundHandle.h"
#include "RE/B/BSTArray.h"
#include "RE/B/bhkCollisionQueryResultHandle.h"
#include "RE/C/CELLJobs.h"
#include "RE/C/CFilter.h"
#include "RE/H/hknpBodyId.h"
#include "RE/N/NiPoint3.h"
#include "RE/N/NiPointer.h"
#include "RE/N/NiTransform.h"
#include "RE/T/TESObjectREFR.h"
namespace RE
{
enum class COL_LAYER;
enum class ImpactResult;
class bhkNPCollisionObject;
class BSMagicShaderParticles;
class hknpAllHitsCollector;
class hknpShape;
class NiAVObject;
class NiLight;
class NiNode;
class QueuedFile;
namespace MagicSystem
{
enum class CastingSource;
}
class __declspec(novtable) Projectile :
public TESObjectREFR // 000
{
public:
static constexpr auto RTTI{ RTTI::Projectile };
static constexpr auto VTABLE{ VTABLE::Projectile };
static constexpr auto FORM_ID{ ENUM_FORM_ID::kREFR };
class ImpactCreation
{
public:
// members
NiPoint3A contactPoint; // 00
NiPoint3A contactNormal; // 10
TESObjectREFR* collidee; // 20
CFilter collisionFilter; // 28
hknpBodyId collisionBodyId; // 2C
std::uint32_t collisionShapeKey; // 30
bool spellCast; // 34
bool backface; // 35
bool trigger; // 36
};
static_assert(sizeof(ImpactCreation) == 0x40);
class ImpactData
{
public:
// members
NiPoint3 location; // 00
NiPoint3 normal; // 0C
bhkCollisionQueryResultHandle impactDecalQuery; // 18
ObjectRefHandle collidee; // 20
NiPointer<bhkNPCollisionObject> colObj; // 28
BGSMaterialType* materialType; // 30
BGSBodyPartDefs::LIMB_ENUM damageLimb; // 38
COL_LAYER collisionLayer; // 3C
NiPointer<NiNode> closestBone; // 40
ImpactResult resultOverride; // 48
float decalSize; // 4C
std::uint32_t collisionShapeKey; // 50
std::int16_t targetWorldObjectCount; // 54
std::int16_t targetWorldObjectIndex; // 56
bool processed; // 58
bool spellCast; // 59
bool effectSpawned; // 5A
bool backface; // 5B
};
static_assert(sizeof(ImpactData) == 0x60);
// add
virtual bool IsMissileProjectile() const { return false; } // C6
virtual bool IsGrenadeProjectile() const { return false; } // C7
virtual bool IsFlameProjectile() const { return false; } // C8
virtual bool IsBeamProjectile() const { return false; } // C9
virtual bool IsFogProjectile() const { return false; } // CA
virtual bool IsBarrierProjectile() const { return false; } // CB
virtual void OnKill() { return; } // CC
virtual void Process3D() { return; } // CD
virtual void PostLoad3D(NiAVObject* a_obj3D); // CE
virtual void UpdateImpl(float a_delta) = 0; // CF
virtual bool ProcessImpacts(); // D0
virtual void Update3D(CELLJobs::AnimatedRefJobData* a_data); // D1
virtual bool IsMine() const { return false; } // D2
virtual float GetPowerSpeedMult() const { return spell ? 1.0F : power; } // D3
virtual float GetWeaponSpeedMult() const { return 1.0F; } // D4
virtual bool GetStopMainSoundAfterImpact() const { return false; } // D5
virtual void ReportHavokDeactivation() { return; } // D6
virtual bool TurnOff(Actor* a_actionActor, bool a_silent); // D7
virtual bool IsPermanent(); // D8
virtual float GetGravity() const; // D9
virtual void CleanUpPointersOnDisable(); // DA
virtual bool RunTargetPick(); // DB
virtual bool GetKillOnCollision() const { return true; } // DC
virtual bool ShouldBeLimited() const { return false; } // DD
virtual bool TargetsWholeBody() const { return false; } // DE
virtual bool GetAllowMovement() const; // DF
virtual std::uint32_t GetCollisionGroup() const; // E0
virtual hknpShape* GetCollisionShape(); // E1
virtual void InitializeImpl() { return; } // E2
virtual void Relaunch() { return; } // E3
virtual std::uint32_t AddImpact(const ImpactCreation& a_data); // E4
virtual bool HandleHits(const hknpAllHitsCollector& a_collector, const NiPoint3& a_from, const NiPoint3& a_to); // E5
virtual void OnEnterTrigger() { return; } // E6
virtual void AddInitialVelocity(); // E7
virtual void Handle3DLoaded() { return; } // E8
virtual bool ShouldUseDesiredTarget() { return false; } // E9
// members
BSTArray<ImpactData> impacts; // 110
NiTransform followOffset; // 130
NiPointer<bhkNPCollisionObject> collisionObject; // 170
NiPointer<TESObjectREFR> droppedRefr; // 178
NiPoint3 movementDirection; // 180
NiPoint3 velocity; // 18C
NiPointer<NiLight> light; // 198
NiPointer<ActorCause> actorCause; // 1A0
ObjectRefHandle shooter; // 1A8
ObjectRefHandle desiredTarget; // 1AC
BSSoundHandle sndHandle; // 1B0
BSSoundHandle sndCountdown; // 1B8
BGSExplosion* explosion; // 1C0
MagicItem* spell; // 1C8
REX::TEnumSet<MagicSystem::CastingSource, std::int32_t> castingSource; // 1D0
EffectSetting* avEffect; // 1D8
NiPointer<QueuedFile> projectileDBFiles; // 1E0
void* muzzleFlashDBHandle; // 1E8 - TODO
NiPointer<NiNode> muzzleFlashArt; // 1F0
BSMagicShaderParticles* particles; // 1F8
REX::TEnumSet<BGSBodyPartDefs::LIMB_ENUM, std::uint32_t> targetLimb; // 200
NiPointer<NiAVObject> targetLimbObj; // 208
NiAVObject* clonePoolKey; // 210
float power; // 218
float speedMult; // 21C
float range; // 220
float age; // 224
float damage; // 228
float alpha; // 22C
float explosionTimer; // 230
float blinkTimer; // 234
BGSObjectInstanceT<TESObjectWEAP> weaponSource; // 238
TESAmmo* ammoSource; // 248
BGSEquipIndex equipIndex; // 250
float distanceMoved; // 254
float movementDelta; // 258
float scale; // 25C
std::uint64_t flags; // 260
bool artRequested; // 268
bool animationsLoaded; // 269
};
static_assert(sizeof(Projectile) == 0x270);
}