#pragma once #include "RE/A/ActiveEffectReferenceEffectController.h" #include "RE/B/BSIntrusiveRefCounted.h" #include "RE/B/BSPointerHandle.h" #include "RE/B/BSSimpleList.h" #include "RE/B/BSSoundHandle.h" #include "RE/E/ENUM_FORM_ID.h" #include "RE/N/NiPointer.h" namespace RE { class MagicTarget; class NiNode; class ReferenceEffect; namespace MagicSystem { enum class CastingSource : std::int32_t; } class __declspec(novtable) ActiveEffect : public BSIntrusiveRefCounted { public: static constexpr auto RTTI{ RTTI::ActiveEffect }; static constexpr auto VTABLE{ VTABLE::ActiveEffect }; static constexpr auto FORM_ID{ ENUM_FORM_ID::kActiveEffect }; enum class Flags : std::uint32_t { kNone = 0, kNoHitShader = 1U << 1, kNoHitEffectArt = 1U << 2, kNoInitialFlare = 1U << 4, kApplyingHitEffects = 1U << 5, kApplyingSounds = 1U << 6, kHasConditions = 1U << 7, kRecover = 1U << 9, kDualCasted = 1U << 12, kInactive = 1U << 15, kAppliedEffects = 1U << 16, kRemovedEffects = 1U << 17, kDispelled = 1U << 18, kWornOff = 1U << 31 }; enum class ConditionStatus : std::uint32_t { kNotAvailable = 0xFFFFFFFF, kFalse = 0, kTrue = 1 }; virtual ~ActiveEffect(); bool CheckDisplacementSpellOnTarget() { using func_t = decltype(&ActiveEffect::CheckDisplacementSpellOnTarget); static REL::Relocation func{ ID::ActiveEffect::CheckDisplacementSpellOnTarget }; return func(this); } // members ActiveEffectReferenceEffectController hitEffectController; // 0C BSSoundHandle persistentSound; // 30 ActorHandle caster; // 38 NiPointer sourceNode; // 40 MagicItem* spell; // 48 EffectItem* effect; // 50 MagicTarget* target; // 58 TESBoundObject* source; // 60 BSSimpleList* hitEffects; // 68 MagicItem* displacementSpell; // 70 float elapsedSeconds; // 74 float duration; // 78 float magnitude; // 7C REX::TEnumSet flags; // 80 ConditionStatus conditionStatus; // 84 std::uint16_t uniqueID; // 8C MagicSystem::CastingSource castingSource; // 90 }; static_assert(sizeof(ActiveEffect) == 0x98); }