docs: add plugin setup guide
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
#pragma once
|
||||
|
||||
#include "RE/A/ACTOR_BASE_DATA.h"
|
||||
#include "RE/B/BSTArray.h"
|
||||
#include "RE/B/BaseFormComponent.h"
|
||||
#include "RE/F/FACTION_RANK.h"
|
||||
|
||||
namespace RE
|
||||
{
|
||||
class __declspec(novtable) TESActorBaseData :
|
||||
public BaseFormComponent // 00
|
||||
{
|
||||
public:
|
||||
static constexpr auto RTTI{ RTTI::TESActorBaseData };
|
||||
static constexpr auto VTABLE{ VTABLE::TESActorBaseData };
|
||||
|
||||
enum class ALIGNMENT : std::uint32_t
|
||||
{
|
||||
kGood = 0x0,
|
||||
kNeutral = 0x1,
|
||||
kEvil = 0x2,
|
||||
kVeryGood = 0x3,
|
||||
kVeryEvil = 0x4
|
||||
};
|
||||
|
||||
// add
|
||||
virtual void CopyFromTemplateForms([[maybe_unused]] TESActorBase** a_forceTemplates) { return; } // 07
|
||||
virtual bool GetIsGhost() const; // 08
|
||||
virtual bool GetInvulnerable() const; // 09
|
||||
|
||||
[[nodiscard]] constexpr bool AffectsStealthMeter() const noexcept { return actorData.actorBaseFlags.none(ACTOR_BASE_DATA::Flag::kDoesntAffectStealthMeter); }
|
||||
[[nodiscard]] constexpr bool Bleeds() const noexcept { return actorData.actorBaseFlags.none(ACTOR_BASE_DATA::Flag::kDoesntBleed); }
|
||||
[[nodiscard]] constexpr bool IsEssential() const noexcept { return actorData.actorBaseFlags.all(ACTOR_BASE_DATA::Flag::kEssential); }
|
||||
[[nodiscard]] constexpr bool IsFemale() const noexcept { return actorData.actorBaseFlags.all(ACTOR_BASE_DATA::Flag::kFemale); }
|
||||
[[nodiscard]] inline bool IsGhost() const { return GetIsGhost(); }
|
||||
[[nodiscard]] constexpr bool IsPreset() const noexcept { return actorData.actorBaseFlags.all(ACTOR_BASE_DATA::Flag::kIsChargenFacePreset); }
|
||||
[[nodiscard]] constexpr bool IsProtected() const noexcept { return actorData.actorBaseFlags.all(ACTOR_BASE_DATA::Flag::kProtected); }
|
||||
[[nodiscard]] constexpr bool IsSimpleActor() const noexcept { return actorData.actorBaseFlags.all(ACTOR_BASE_DATA::Flag::kSimpleActor); }
|
||||
[[nodiscard]] constexpr bool IsSummonable() const noexcept { return actorData.actorBaseFlags.all(ACTOR_BASE_DATA::Flag::kSummonable); }
|
||||
[[nodiscard]] constexpr bool IsUnique() const noexcept { return actorData.actorBaseFlags.all(ACTOR_BASE_DATA::Flag::kUnique); }
|
||||
[[nodiscard]] inline bool IsInvulnerable() const { return GetInvulnerable(); }
|
||||
[[nodiscard]] constexpr bool HasAutoCalcStats() const noexcept { return actorData.actorBaseFlags.all(ACTOR_BASE_DATA::Flag::kAutoCalcStats); }
|
||||
[[nodiscard]] constexpr bool HasBleedoutOverride() const noexcept { return actorData.actorBaseFlags.all(ACTOR_BASE_DATA::Flag::kBleedoutOverride); }
|
||||
[[nodiscard]] constexpr bool HasPCLevelMult() const noexcept { return actorData.actorBaseFlags.all(ACTOR_BASE_DATA::Flag::kPCLevelMult); }
|
||||
[[nodiscard]] constexpr bool Respawns() const noexcept { return actorData.actorBaseFlags.all(ACTOR_BASE_DATA::Flag::kRespawn); }
|
||||
[[nodiscard]] constexpr bool UsesOppositeGenderAnims() const noexcept { return actorData.actorBaseFlags.all(ACTOR_BASE_DATA::Flag::kOppositeGenderanims); }
|
||||
[[nodiscard]] constexpr bool UsesTemplate() const noexcept { return actorData.actorBaseFlags.all(ACTOR_BASE_DATA::Flag::kUsesTemplate); }
|
||||
|
||||
std::uint16_t GetLevel() const
|
||||
{
|
||||
using func_t = decltype(&TESActorBaseData::GetLevel);
|
||||
static REL::Relocation<func_t> func{ ID::TESActorBaseData::GetLevel };
|
||||
return func(this);
|
||||
}
|
||||
|
||||
// members
|
||||
ACTOR_BASE_DATA actorData; // 08
|
||||
std::int32_t changeFlags; // 1C
|
||||
TESLevItem* deathItem; // 20
|
||||
BGSVoiceType* voiceType; // 28
|
||||
TESForm* baseTemplateForm; // 30
|
||||
TESForm** templateForms; // 38
|
||||
TESGlobal* legendChance; // 40
|
||||
TESForm* legendTemplate; // 48
|
||||
BSTArray<FACTION_RANK> factions; // 50
|
||||
};
|
||||
static_assert(sizeof(TESActorBaseData) == 0x68);
|
||||
}
|
||||
Reference in New Issue
Block a user