TrinityCore
Loading...
Searching...
No Matches
Bag.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "Bag.h"
19#include "Common.h"
20#include "DatabaseEnv.h"
21#include "Log.h"
22#include "ObjectMgr.h"
23#include "Player.h"
24#include "UpdateData.h"
25#include "WorldPacket.h"
26
35
37{
38 for (uint8 i = 0; i < MAX_BAG_SIZE; ++i)
39 if (Item* item = m_bagslot[i])
40 {
41 if (item->IsInWorld())
42 {
43 TC_LOG_FATAL("entities.player.items", "Item {} (slot {}, bag slot {}) in bag {} (slot {}, bag slot {}, m_bagslot {}) is to be deleted but is still in world.",
44 item->GetEntry(), (uint32)item->GetSlot(), (uint32)item->GetBagSlot(),
46 item->RemoveFromWorld();
47 }
48 delete m_bagslot[i];
49 }
50}
51
53{
55
56 for (uint32 i = 0; i < GetBagSize(); ++i)
57 if (m_bagslot[i])
59}
60
62{
63 for (uint32 i = 0; i < GetBagSize(); ++i)
64 if (m_bagslot[i])
66
68}
69
70bool Bag::Create(ObjectGuid::LowType guidlow, uint32 itemid, ItemContext context, Player const* owner)
71{
72 ItemTemplate const* itemProto = sObjectMgr->GetItemTemplate(itemid);
73
74 if (!itemProto || itemProto->GetContainerSlots() > MAX_BAG_SIZE)
75 return false;
76
77 _Create(ObjectGuid::Create<HighGuid::Item>(guidlow));
78
79 _bonusData.Initialize(itemProto);
80
81 SetEntry(itemid);
82 SetObjectScale(1.0f);
83
84 if (owner)
85 {
86 SetOwnerGUID(owner->GetGUID());
87 SetContainedIn(owner->GetGUID());
88 }
89
91 SetDurability(itemProto->MaxDurability);
92 SetCount(1);
93 SetContext(context);
94
95 // Setting the number of Slots the Container has
96 SetBagSize(itemProto->GetContainerSlots());
97
98 // Cleaning 20 slots
99 for (uint8 i = 0; i < MAX_BAG_SIZE; ++i)
100 {
102 m_bagslot[i] = nullptr;
103 }
104
105 return true;
106}
107
112
113bool Bag::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid owner_guid, Field* fields, uint32 entry)
114{
115 if (!Item::LoadFromDB(guid, owner_guid, fields, entry))
116 return false;
117
118 ItemTemplate const* itemProto = GetTemplate(); // checked in Item::LoadFromDB
119 SetBagSize(itemProto->GetContainerSlots());
120 // cleanup bag content related item value fields (its will be filled correctly from `character_inventory`)
121 for (uint8 i = 0; i < MAX_BAG_SIZE; ++i)
122 {
124 delete m_bagslot[i];
125 m_bagslot[i] = nullptr;
126 }
127
128 return true;
129}
130
132{
133 for (uint8 i = 0; i < MAX_BAG_SIZE; ++i)
134 if (m_bagslot[i])
135 m_bagslot[i]->DeleteFromDB(trans);
136
137 Item::DeleteFromDB(trans);
138}
139
141{
142 uint32 slots = 0;
143 for (uint32 i=0; i < GetBagSize(); ++i)
144 if (!m_bagslot[i])
145 ++slots;
146
147 return slots;
148}
149
150void Bag::RemoveItem(uint8 slot, bool /*update*/)
151{
152 ASSERT(slot < MAX_BAG_SIZE);
153
154 if (m_bagslot[slot])
155 m_bagslot[slot]->SetContainer(nullptr);
156
157 m_bagslot[slot] = nullptr;
159}
160
161void Bag::StoreItem(uint8 slot, Item* pItem, bool /*update*/)
162{
163 ASSERT(slot < MAX_BAG_SIZE);
164
165 if (pItem && pItem->GetGUID() != GetGUID())
166 {
167 m_bagslot[slot] = pItem;
168 SetSlot(slot, pItem->GetGUID());
169 pItem->SetContainedIn(GetGUID());
170 pItem->SetOwnerGUID(GetOwnerGUID());
171 pItem->SetContainer(this);
172 pItem->SetSlot(slot);
173 }
174}
175
177{
179
180 for (uint32 i = 0; i < GetBagSize(); ++i)
181 if (m_bagslot[i])
183}
184
186{
187 m_objectData->WriteCreate(flags, data, target, this);
188 m_itemData->WriteCreate(flags, data, target, this);
189 m_containerData->WriteCreate(flags, data, target, this);
190}
191
193{
195
197 m_objectData->WriteUpdate(flags, data, target, this);
198
200 m_itemData->WriteUpdate(flags, data, target, this);
201
203 m_containerData->WriteUpdate(flags, data, target, this);
204}
205
207 UF::ItemData::Mask const& requestedItemMask, UF::ContainerData::Mask const& requestedContainerMask,
208 Player const* target, bool ignoreNestedChangesMask) const
209{
212 if (requestedObjectMask.IsAnySet())
213 valuesMask.Set(TYPEID_OBJECT);
214
215 UF::ItemData::Mask itemMask = requestedItemMask;
217 if (itemMask.IsAnySet())
218 valuesMask.Set(TYPEID_ITEM);
219
220 if (requestedContainerMask.IsAnySet())
221 valuesMask.Set(TYPEID_CONTAINER);
222
224 std::size_t sizePos = buffer.wpos();
225 buffer << uint32(0);
227 buffer << uint32(valuesMask.GetBlock(0));
228
229 if (valuesMask[TYPEID_OBJECT])
230 m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, ignoreNestedChangesMask);
231
232 if (valuesMask[TYPEID_ITEM])
233 m_itemData->WriteUpdate(itemMask, buffer, target, this, ignoreNestedChangesMask);
234
235 if (valuesMask[TYPEID_CONTAINER])
236 m_containerData->WriteUpdate(requestedContainerMask, buffer, target, this, ignoreNestedChangesMask);
237
238 buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4);
239
240 data->AddUpdateBlock();
241}
242
244{
245 UpdateData udata(player->GetMapId());
246 WorldPacket packet;
247
250
251 udata.BuildPacket(&packet);
252 player->SendDirectMessage(&packet);
253}
254
260
261// If the bag is empty returns true
262bool Bag::IsEmpty() const
263{
264 for (uint32 i = 0; i < GetBagSize(); ++i)
265 if (m_bagslot[i])
266 return false;
267
268 return true;
269}
270
272{
273 for (uint32 i = 0; i < GetBagSize(); ++i)
274 if (m_bagslot[i] != nullptr)
275 if (m_bagslot[i]->GetGUID() == guid)
276 return i;
277
278 return NULL_SLOT;
279}
280
282{
283 if (slot < GetBagSize())
284 return m_bagslot[slot];
285
286 return nullptr;
287}
288
290{
291 return bag->GetBagSize();
292}
293
294Item* GetItemInBag(Bag const* bag, uint8 slot)
295{
296 return bag->GetItemByPos(slot);
297}
Item * GetItemInBag(Bag const *bag, uint8 slot)
Definition Bag.cpp:294
#define MAX_BAG_SIZE
Definition Bag.h:22
ItemContext
Definition DBCEnums.h:1315
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
uint8_t uint8
Definition Define.h:156
uint32_t uint32
Definition Define.h:154
uint16 flags
#define ASSERT
Definition Errors.h:80
#define TC_LOG_FATAL(filterType__, message__,...)
Definition Log.h:193
@ TYPEID_OBJECT
Definition ObjectGuid.h:38
@ TYPEID_ITEM
Definition ObjectGuid.h:39
@ TYPEID_CONTAINER
Definition ObjectGuid.h:40
#define sObjectMgr
Definition ObjectMgr.h:1885
@ NULL_SLOT
Definition Unit.h:64
Definition Bag.h:27
uint32 GetBagSize() const
Definition Bag.h:45
void ClearValuesChangesMask() override
Definition Bag.cpp:255
void AddToWorld() override
Definition Bag.cpp:52
void StoreItem(uint8 slot, Item *pItem, bool update)
Definition Bag.cpp:161
void RemoveFromWorld() override
Definition Bag.cpp:61
bool IsEmpty() const
Definition Bag.cpp:262
void SaveToDB(CharacterDatabaseTransaction trans) override
Definition Bag.cpp:108
UF::UpdateField< UF::ContainerData, int32(WowCS::EntityFragment::CGObject), TYPEID_CONTAINER > m_containerData
Definition Bag.h:78
void BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) const override
Definition Bag.cpp:176
void SetSlot(uint32 slot, ObjectGuid guid)
Definition Bag.h:82
~Bag()
Definition Bag.cpp:36
void SetBagSize(uint32 numSlots)
Definition Bag.h:81
Item * GetItemByPos(uint8 slot) const
Definition Bag.cpp:281
void BuildValuesCreate(UF::UpdateFieldFlag flags, ByteBuffer &data, Player const *target) const override
Definition Bag.cpp:185
void RemoveItem(uint8 slot, bool update)
Definition Bag.cpp:150
void DeleteFromDB(CharacterDatabaseTransaction trans) override
Definition Bag.cpp:131
bool Create(ObjectGuid::LowType guidlow, uint32 itemid, ItemContext context, Player const *owner) override
Definition Bag.cpp:70
Item * m_bagslot[MAX_BAG_SIZE]
Definition Bag.h:85
uint32 GetFreeSlots() const
Definition Bag.cpp:140
uint8 GetSlotByItemGUID(ObjectGuid guid) const
Definition Bag.cpp:271
Bag()
Definition Bag.cpp:27
bool LoadFromDB(ObjectGuid::LowType guid, ObjectGuid owner_guid, Field *fields, uint32 entry) override
Definition Bag.cpp:113
void BuildValuesUpdate(UF::UpdateFieldFlag flags, ByteBuffer &data, Player const *target) const override
Definition Bag.cpp:192
void BuildValuesUpdateForPlayerWithMask(UpdateData *data, UF::ObjectData::Mask const &requestedObjectMask, UF::ItemData::Mask const &requestedItemMask, UF::ContainerData::Mask const &requestedContainerMask, Player const *target, bool ignoreNestedChangesMask) const
Definition Bag.cpp:206
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
void SetUpdateFieldValue(UF::UpdateFieldPrivateSetter< T > setter, typename UF::UpdateFieldPrivateSetter< T >::value_type value)
Definition BaseEntity.h:221
WowCS::EntityFragmentsHolder m_entityFragments
Definition BaseEntity.h:353
UF::UpdateFieldHolder m_values
Definition BaseEntity.h:205
virtual void RemoveFromWorld()
void _Create(ObjectGuid const &guid)
Definition BaseEntity.h:218
virtual void AddToWorld()
virtual void BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) const
ByteBuffer & PrepareValuesUpdateBuffer(UpdateData *data) const
TypeID m_objectTypeId
Definition BaseEntity.h:351
size_t wpos() const
Definition ByteBuffer.h:461
void put(std::size_t pos, T value)
Definition ByteBuffer.h:260
Class used to access individual fields of database query result.
Definition Field.h:94
Definition Item.h:179
uint8 GetSlot() const
Definition Item.h:290
virtual void SaveToDB(CharacterDatabaseTransaction trans)
Definition Item.cpp:639
void ClearValuesChangesMask() override
Definition Item.cpp:1877
void SetContext(ItemContext context)
Definition Item.h:452
void SetCount(uint32 value)
Definition Item.cpp:1367
void SetDurability(uint32 durability)
Definition Item.h:268
ItemTemplate const * GetTemplate() const
Definition Item.cpp:1233
UF::UpdateField< UF::ItemData, uint32(WowCS::EntityFragment::CGObject), TYPEID_ITEM > m_itemData
Definition Item.h:459
ObjectGuid GetOwnerGUID() const
Definition Item.h:197
BonusData _bonusData
Definition Item.h:462
void SetContainedIn(ObjectGuid guid)
Definition Item.h:200
UF::UpdateFieldFlag GetUpdateFieldFlagsFor(Player const *target) const final
Definition Item.cpp:1799
void SetSlot(uint8 slot)
Definition Item.h:293
virtual bool LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field *fields, uint32 entry)
Definition Item.cpp:907
void SetOwnerGUID(ObjectGuid guid)
Definition Item.h:198
void SetContainer(Bag *container)
Definition Item.h:295
uint8 GetBagSlot() const
Definition Item.cpp:1331
static void DeleteFromDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
Definition Item.cpp:1180
static ObjectGuid const Empty
Definition ObjectGuid.h:314
uint64 LowType
Definition ObjectGuid.h:321
void AddToWorld() override
Definition Object.cpp:83
uint32 GetEntry() const
Definition Object.h:89
void BuildEntityFragmentsForValuesUpdateForPlayerWithMask(ByteBuffer &data, EnumFlag< UF::UpdateFieldFlag > flags) const
Definition Object.cpp:113
void SetEntry(uint32 entry)
Definition Object.h:90
void RemoveFromWorld() override
Definition Object.cpp:93
virtual void SetObjectScale(float scale)
Definition Object.h:93
UF::UpdateField< UF::ObjectData, int32(WowCS::EntityFragment::CGObject), TYPEID_OBJECT > m_objectData
Definition Object.h:161
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:6283
Mask const & GetChangesMask() const
MutableFieldReference< T, false > ModifyValue(UpdateField< T, BlockBit, Bit >(Derived::*field))
void ClearChangesMask(UpdateField< T, BlockBit, Bit >(Derived::*field))
bool HasChanged(uint32 index) const
Definition BaseEntity.h:83
uint32 GetChangedObjectTypeMask() const
Definition BaseEntity.h:81
bool BuildPacket(WorldPacket *packet)
void AddUpdateBlock()
Definition UpdateData.h:46
constexpr uint32 GetBlock(uint32 index) const
Definition UpdateMask.h:59
constexpr void Set(uint32 index)
Definition UpdateMask.h:91
constexpr uint32 GetMapId() const
Definition Position.h:216
UpdateFieldFlag
Definition UpdateField.h:37
UF::ObjectData::Base ObjectMask
Definition Bag.h:70
void operator()(Player const *player) const
Definition Bag.cpp:243
UF::ContainerData::Base ContainerMask
Definition Bag.h:72
void Initialize(ItemTemplate const *proto)
Definition Item.cpp:2886
uint32 GetContainerSlots() const
uint32 MaxDurability
static void FilterDisallowedFieldsMaskForFlag(Mask &changesMask, EnumFlag< UpdateFieldFlag > fieldVisibilityFlags)
UpdateField< uint32, 0, 11 > MaxDurability
void Add(EntityFragment fragment, bool update, void const *data=nullptr)