#pragma once #include "CNShardServer.hpp" #include "Player.hpp" #include "MobAI.hpp" struct CrocPotEntry { int multStats, multLooks; float base, rd0, rd1, rd2, rd3; }; struct Crate { int rarityRatioId; std::vector itemSets; }; struct MobDropChance { int dropChance; std::vector cratesRatio; }; struct MobDrop { std::vector crateIDs; int dropChanceType; int taros; int fm; int boosts; }; namespace ItemManager { enum class SlotType { EQUIP = 0, INVENTORY = 1, BANK = 3 }; struct Item { bool tradeable, sellable; int buyPrice, sellPrice; int stackSize, level, rarity; int pointDamage, groupDamage, fireRate, defense, gender; int weaponType; // TODO: implement more as needed }; // hopefully this is fine since it's never modified after load extern std::map, Item> ItemData; // -> data extern std::map CrocPotTable; // level gap -> entry extern std::map> RarityRatios; extern std::map Crates; // pair -> vector of pointers (map iterators) to records in ItemData (it looks a lot scarier than it is) extern std::map, std::vector, Item>::iterator>> CrateItems; extern std::map>> CodeItems; // code -> vector of // mob drops extern std::map MobDropChances; extern std::map MobDrops; void init(); // mob drops void giveMobDrop(CNSocket *sock, Mob *mob, int rolledBoosts, int rolledPotions, int rolledCrate, int rolledCrateType, int rolledEvent); int findFreeSlot(Player *plr); Item* getItemData(int32_t id, int32_t type); void checkItemExpire(CNSocket* sock, Player* player); void setItemStats(Player* plr); void updateEquips(CNSocket* sock, Player* plr); #ifdef ACADEMY extern std::map NanoCapsules; // crate id -> nano id #endif }