#ifndef RAGNAROK_SOURCE_CONTENTS_ITEMS_NEOPACKAGEITEMMGR_H #define RAGNAROK_SOURCE_CONTENTS_ITEMS_NEOPACKAGEITEMMGR_H #include "Utility/Singleton.h" #include #include #include #include #include #include #include struct lua_State; namespace NEO_PACKAGEITEM { struct PackageEntry { // INLINED PackageEntry(int itemId, const std::string& name, int probability) : itemId(itemId), name(name), probability(probability) { } /* 0000 */ int itemId; /* 0004 */ std::string name; /* 001C */ int probability; }; struct PackageGroup { /* 0000 */ int totalProbability; /* 0004 */ std::list items; }; class CNeoPackageItemMgr : public Singleton { public: static int LuaInsertPackage(lua_State* state); static bool LoadScript(); __declspec(noinline) CNeoPackageItemMgr(); void Init(); void InsertPackage(int packageId, int groupId, int itemId, const std::string& name, int probability); std::optional*> FindPackage(int itemId); bool HasPackage(int itemId); /* 0004 */ std::map> m_packages; }; class CPaidPackageItemMgr : public Singleton { public: static int LuaAddItemSold(lua_State* L); static bool LoadScript(); CPaidPackageItemMgr(); void Init(); void AddItem(int itemId); bool IsPaidItem(int itemId); /* 0004 */ std::set m_items; }; #if defined(_WIN32) && !defined(_WIN64) static_assert(sizeof(PackageEntry) == 0x20); static_assert(sizeof(PackageGroup) == 0xC); static_assert(sizeof(CNeoPackageItemMgr) == 0xC); static_assert(sizeof(CPaidPackageItemMgr) == 0xC); #endif } template <> NEO_PACKAGEITEM::CNeoPackageItemMgr* Singleton::s_instance; template <> NEO_PACKAGEITEM::CPaidPackageItemMgr* Singleton::s_instance; template <> NEO_PACKAGEITEM::CNeoPackageItemMgr* Singleton::GetInstance(); template <> NEO_PACKAGEITEM::CPaidPackageItemMgr* Singleton::GetInstance(); #endif