#ifndef RAGNAROK_SOURCE_CONTENTS_EFFECTS_EFFECTLISTS_H #define RAGNAROK_SOURCE_CONTENTS_EFFECTS_EFFECTLISTS_H #include "Contents/Effects/Effect.h" #include #include #include #include #include #include #include "Utility/Math/Vector3d.h" class CRenderObject; struct CAllocator { virtual ~CAllocator() = default; virtual CEffect* Create() = 0; }; class EffectLists { public: /* 0004 */ bool initialized; /* 0008 */ std::map allocators; /* 0010 */ std::map> active; /* 0018 */ std::list retired; /* 0020 */ std::map> indexed; virtual ~EffectLists(); CEffect* Spawn(int actor, int id, float x, float y, float z, std::uint32_t sourceActor, int frame, unsigned char reuse, int instance); CEffect* Find(int actor, int id) const; CEffect* Find(int actor, int instance, int id) const; CEffect* At(int id, unsigned index) const; void Add(int actor, CEffect* effect); void Retire(CEffect* effect, unsigned char removeActive); void Retire(int actor, int id); void Retire(int actor, int instance, int id); void RetireActor(int actor); void Render(); void Clear(); void Release(); void SpawnLevel99(CRenderObject* actor, unsigned char flag, int extra); }; #if defined(_WIN32) && !defined(_WIN64) static_assert(sizeof(EffectLists) == 0x28); static_assert(offsetof(EffectLists, allocators) == 0x08); static_assert(offsetof(EffectLists, active) == 0x10); static_assert(offsetof(EffectLists, retired) == 0x18); static_assert(offsetof(EffectLists, indexed) == 0x20); #endif bool CreateEffectMgr(); void DestroyEffectMgr(); float DirectionAngle(float x, float z); double ScreenAngle(vector3d from, vector3d to); std::string CurrentMapScriptName(); std::string EffectFunctionName(std::string name); extern EffectLists* g_effectMgr; #endif