#pragma once #include "RE/B/BGSKeywordForm.h" #include "RE/B/BSTArray.h" #include "RE/B/BSTSmartPointer.h" #include "RE/T/TESBoundObject.h" #include "RE/T/TESFullName.h" namespace RE { class QueuedFile; namespace MagicSystem { enum class CastingType; enum class Delivery; enum class SpellType; } class __declspec(novtable) MagicItem : public TESBoundObject, // 00 public TESFullName, // 68 public BGSKeywordForm // 70 { public: static constexpr auto RTTI{ RTTI::MagicItem }; static constexpr auto VTABLE{ VTABLE::MagicItem }; static constexpr auto FORM_ID{ ENUM_FORM_ID::kNONE }; class SkillUsageData { public: // members EffectItem* effect; // 00 ActorValueInfo* skill; // 08 float magnitude; // 10 bool custom; // 14 }; static_assert(sizeof(SkillUsageData) == 0x18); class Data { public: // members std::int32_t costOverride; // 0 std::uint32_t flags; // 4 }; static_assert(sizeof(Data) == 0x8); // add virtual MagicSystem::SpellType GetSpellType() const = 0; // 67 virtual void SetCastingType([[maybe_unused]] MagicSystem::CastingType a_castingType) { return; } // 68 virtual MagicSystem::CastingType GetCastingType() const = 0; // 69 virtual void SetDelivery([[maybe_unused]] MagicSystem::Delivery a_delivery) { return; } // 6A virtual MagicSystem::Delivery GetDelivery() const = 0; // 6B virtual bool IsValidDelivery(MagicSystem::Delivery) { return true; } // 6C virtual float GetFixedCastDuration() const { return 0.0F; } // 6D virtual float GetRange() const { return 0.0F; } // 6E virtual bool IgnoreResistance() const { return false; } // 6F virtual bool IgnoreLOS() const { return false; } // 70 virtual bool IsFood() const { return false; } // 71 virtual bool GetNoAbsorb() const { return false; } // 72 virtual bool GetNoDualCastModifications() const { return false; } // 73 virtual bool GetSkillUsageData([[maybe_unused]] SkillUsageData& a_data) const { return false; } // 74 virtual bool IsPoison() const; // 75 virtual bool IsMedicine() const { return false; } // 76 virtual void AdjustCost(float&, Actor*) const { return; } // 77 virtual float GetChargeTime() const { return 0.0F; } // 78 virtual std::uint32_t GetMaxEffectCount() const { return 0; } // 79 virtual ActorValueInfo* GetAssociatedSkill() const { return nullptr; } // 7A virtual bool IsTwoHanded() const { return false; } // 7B virtual CHUNK_ID GetChunkID() = 0; // 7C virtual void CopyMagicItemData(MagicItem* a_copy) = 0; // 7D virtual void LoadMagicItemChunk([[maybe_unused]] TESFile* a_file, [[maybe_unused]] CHUNK_ID a_chunkID) { return; } // 7E virtual void LoadChunkDataPostProcess([[maybe_unused]] TESFile* a_file) { return; } // 7F virtual Data* GetData() = 0; // 81 virtual const Data* GetData() const = 0; // 80 virtual std::size_t GetDataSize() const = 0; // 82 virtual void InitFromChunk(TESFile* a_file) = 0; // 83 // members BSTArray listOfEffects; // 98 std::int32_t hostileCount; // B0 EffectSetting* avEffectSetting; // B8 std::uint32_t preloadCount; // C0 BSTSmartPointer preloadedItem; // C8 }; static_assert(sizeof(MagicItem) == 0xD0); }