/*
* 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