/* * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #ifndef __LOOTITEMSTORAGE_H #define __LOOTITEMSTORAGE_H #include "Define.h" #include "DatabaseEnvFwd.h" #include "DBCEnums.h" #include "ItemEnchantmentMgr.h" #include "LootItemType.h" #include #include #include class Item; class Player; struct Loot; struct LootItem; struct StoredLootItem { explicit StoredLootItem(LootItem const& lootItem); uint32 ItemId; uint32 Count; uint32 ItemIndex; bool FollowRules; bool FFA; bool Blocked; bool Counted; bool UnderThreshold; bool NeedsQuest; ItemRandomBonusListId RandomBonusListId; ItemContext Context; std::vector BonusListIDs; }; class StoredLootContainer { public: typedef std::unordered_multimap StoredLootItemContainer; explicit StoredLootContainer(uint64 containerId) : _containerId(containerId), _money(0) { } void AddLootItem(LootItem const& lootItem, CharacterDatabaseTransaction trans); void AddMoney(uint32 money, CharacterDatabaseTransaction trans); void RemoveMoney(); void RemoveItem(LootItemType type, uint32 itemId, uint32 count, uint32 itemIndex); uint64 GetContainer() const { return _containerId; } uint32 GetMoney() const { return _money; } StoredLootItemContainer const& GetLootItems() const { return _lootItems; } private: StoredLootItemContainer _lootItems; uint64 const _containerId; uint32 _money; }; class LootItemStorage { public: LootItemStorage(LootItemStorage const&) = delete; LootItemStorage(LootItemStorage&&) = delete; LootItemStorage& operator=(LootItemStorage const&) = delete; LootItemStorage& operator=(LootItemStorage&&) = delete; static LootItemStorage* instance(); static std::shared_mutex* GetLock(); void LoadStorageFromDB(); bool LoadStoredLoot(Item* item, Player* player); void RemoveStoredMoneyForContainer(uint64 containerId); void RemoveStoredLootForContainer(uint64 containerId); void RemoveStoredLootItemForContainer(uint64 containerId, LootItemType type, uint32 itemId, uint32 count, uint32 itemIndex); void AddNewStoredLoot(uint64 containerId, Loot* loot, Player* player); private: LootItemStorage() = default; ~LootItemStorage() = default; }; #define sLootItemStorage LootItemStorage::instance() #endif