Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
Bag.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6#include "Common.h"
7#include "DatabaseEnv.h"
8#include "ObjectMgr.h"
9
10#include "Bag.h"
11#include "Log.h"
12#include "Player.h"
13#include "UpdateData.h"
14
24
26{
27 for (uint8 i = 0; i < MAX_BAG_SIZE; ++i)
28 if (Item* item = m_bagslot[i])
29 {
30 if (item->IsInWorld())
31 {
32 SF_LOG_FATAL("entities.player.items", "Item %u (slot %u, bag slot %u) in bag %u (slot %u, bag slot %u, m_bagslot %u) is to be deleted but is still in world.",
33 item->GetEntry(), (uint32)item->GetSlot(), (uint32)item->GetBagSlot(),
35 item->RemoveFromWorld();
36 }
37 delete m_bagslot[i];
38 }
39}
40
42{
44
45 for (uint32 i = 0; i < GetBagSize(); ++i)
46 if (m_bagslot[i])
47 m_bagslot[i]->AddToWorld();
48}
49
51{
52 for (uint32 i = 0; i < GetBagSize(); ++i)
53 if (m_bagslot[i])
54 m_bagslot[i]->RemoveFromWorld();
55
57}
58
59bool Bag::Create(uint32 guidlow, uint32 itemid, Player const* owner)
60{
61 ItemTemplate const* itemProto = sObjectMgr->GetItemTemplate(itemid);
62
63 if (!itemProto || itemProto->ContainerSlots > MAX_BAG_SIZE)
64 return false;
65
67
68 SetEntry(itemid);
69 SetObjectScale(1.0f);
70
71 SetUInt64Value(ITEM_FIELD_OWNER, owner ? owner->GetGUID() : 0);
72 SetUInt64Value(ITEM_FIELD_CONTAINED_IN, owner ? owner->GetGUID() : 0);
73
77
78 // Setting the number of Slots the Container has
80
81 // Cleaning 20 slots
82 for (uint8 i = 0; i < MAX_BAG_SIZE; ++i)
83 {
85 m_bagslot[i] = NULL;
86 }
87
88 return true;
89}
90
92{
93 Item::SaveToDB(trans);
94}
95
96bool Bag::LoadFromDB(uint32 guid, uint64 owner_guid, Field* fields, uint32 entry)
97{
98 if (!Item::LoadFromDB(guid, owner_guid, fields, entry))
99 return false;
100
101 ItemTemplate const* itemProto = GetTemplate(); // checked in Item::LoadFromDB
103 // cleanup bag content related item value fields (its will be filled correctly from `character_inventory`)
104 for (uint8 i = 0; i < MAX_BAG_SIZE; ++i)
105 {
107 delete m_bagslot[i];
108 m_bagslot[i] = NULL;
109 }
110
111 return true;
112}
113
115{
116 for (uint8 i = 0; i < MAX_BAG_SIZE; ++i)
117 if (m_bagslot[i])
118 m_bagslot[i]->DeleteFromDB(trans);
119
120 Item::DeleteFromDB(trans);
121}
122
124{
125 uint32 slots = 0;
126 for (uint32 i = 0; i < GetBagSize(); ++i)
127 if (!m_bagslot[i])
128 ++slots;
129
130 return slots;
131}
132
133void Bag::RemoveItem(uint8 slot, bool /*update*/)
134{
135 ASSERT(slot < MAX_BAG_SIZE);
136
137 if (m_bagslot[slot])
138 m_bagslot[slot]->SetContainer(NULL);
139
140 m_bagslot[slot] = NULL;
141 SetUInt64Value(CONTAINER_FIELD_SLOTS + (slot * 2), 0);
142}
143
144void Bag::StoreItem(uint8 slot, Item* pItem, bool /*update*/)
145{
146 ASSERT(slot < MAX_BAG_SIZE);
147
148 if (pItem && pItem->GetGUID() != this->GetGUID())
149 {
150 m_bagslot[slot] = pItem;
151 SetUInt64Value(CONTAINER_FIELD_SLOTS + (slot * 2), pItem->GetGUID());
154 pItem->SetContainer(this);
155 pItem->SetSlot(slot);
156 }
157}
158
160{
162
163 for (uint32 i = 0; i < GetBagSize(); ++i)
164 if (m_bagslot[i])
165 m_bagslot[i]->BuildCreateUpdateBlockForPlayer(data, target);
166}
167
168// If the bag is empty returns true
169bool Bag::IsEmpty() const
170{
171 for (uint32 i = 0; i < GetBagSize(); ++i)
172 if (m_bagslot[i])
173 return false;
174
175 return true;
176}
177
179{
180 Item* pItem;
181 uint32 count = 0;
182 for (uint32 i = 0; i < GetBagSize(); ++i)
183 {
184 pItem = m_bagslot[i];
185 if (pItem && pItem != eItem && pItem->GetEntry() == item)
186 count += pItem->GetCount();
187 }
188
189 if (eItem && eItem->GetTemplate()->GemProperties)
190 {
191 for (uint32 i = 0; i < GetBagSize(); ++i)
192 {
193 pItem = m_bagslot[i];
194 if (pItem && pItem != eItem && pItem->GetTemplate()->Socket[0].Color)
195 count += pItem->GetGemCountWithID(item);
196 }
197 }
198
199 return count;
200}
201
203{
204 uint32 count = 0;
205 for (uint32 i = 0; i < GetBagSize(); ++i)
206 if (Item* pItem = m_bagslot[i])
207 if (pItem != skipItem)
208 if (ItemTemplate const* pProto = pItem->GetTemplate())
209 if (pProto->ItemLimitCategory == limitCategory)
210 count += m_bagslot[i]->GetCount();
211
212 return count;
213}
214
216{
217 for (uint32 i = 0; i < GetBagSize(); ++i)
218 if (m_bagslot[i] != 0)
219 if (m_bagslot[i]->GetGUID() == guid)
220 return i;
221
222 return NULL_SLOT;
223}
224
226{
227 if (slot < GetBagSize())
228 return m_bagslot[slot];
229
230 return NULL;
231}
#define MAX_BAG_SIZE
Definition Bag.h:10
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
std::uint64_t uint64
Definition Define.h:76
#define ASSERT
Definition Errors.h:29
#define SF_LOG_FATAL(filterType__,...)
Definition Log.h:146
@ TYPEID_CONTAINER
Definition Object.h:53
@ TYPEMASK_CONTAINER
Definition Object.h:39
@ HIGHGUID_CONTAINER
#define sObjectMgr
Definition ObjectMgr.h:1617
Skyfire::AutoPtr< Transaction, Skyfire::Mutex > SQLTransaction
Definition Transaction.h:42
@ NULL_SLOT
Definition Unit.h:337
@ CONTAINER_END
@ CONTAINER_FIELD_SLOTS
@ CONTAINER_FIELD_NUM_SLOTS
@ ITEM_FIELD_DURABILITY
@ ITEM_FIELD_CONTAINED_IN
@ ITEM_FIELD_STACK_COUNT
@ ITEM_FIELD_MAX_DURABILITY
@ ITEM_FIELD_OWNER
uint32 GetBagSize() const
Definition Bag.h:36
void StoreItem(uint8 slot, Item *pItem, bool update)
Definition Bag.cpp:144
bool Create(uint32 guidlow, uint32 itemid, Player const *owner) OVERRIDE
Definition Bag.cpp:59
bool IsEmpty() const
Definition Bag.cpp:169
uint8 GetSlotByItemGUID(uint64 guid) const
Definition Bag.cpp:215
uint32 GetItemCountWithLimitCategory(uint32 limitCategory, Item *skipItem=NULL) const
Definition Bag.cpp:202
void BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) const OVERRIDE
Definition Bag.cpp:159
~Bag()
Definition Bag.cpp:25
void RemoveFromWorld() OVERRIDE
Definition Bag.cpp:50
Item * GetItemByPos(uint8 slot) const
Definition Bag.cpp:225
bool LoadFromDB(uint32 guid, uint64 owner_guid, Field *fields, uint32 entry) OVERRIDE
Definition Bag.cpp:96
void AddToWorld() OVERRIDE
Definition Bag.cpp:41
void SaveToDB(SQLTransaction &trans) OVERRIDE
Definition Bag.cpp:91
void DeleteFromDB(SQLTransaction &trans) OVERRIDE
Definition Bag.cpp:114
uint32 GetItemCount(uint32 item, Item *eItem=NULL) const
Definition Bag.cpp:178
void RemoveItem(uint8 slot, bool update)
Definition Bag.cpp:133
Item * m_bagslot[MAX_BAG_SIZE]
Definition Bag.h:50
uint32 GetFreeSlots() const
Definition Bag.cpp:123
Bag()
Definition Bag.cpp:15
Definition Field.h:16
uint8 GetSlot() const
Definition Item.h:265
Item()
Definition Item.cpp:233
uint8 GetGemCountWithID(uint32 GemID) const
Definition Item.cpp:944
virtual void SaveToDB(SQLTransaction &trans)
Definition Item.cpp:305
ItemTemplate const * GetTemplate() const
Definition Item.cpp:528
virtual bool LoadFromDB(uint32 guid, uint64 owner_guid, Field *fields, uint32 entry)
Definition Item.cpp:405
uint64 GetOwnerGUID() const
Definition Item.h:213
void SetSlot(uint8 slot)
Definition Item.h:268
uint32 GetCount() const
Definition Item.h:258
void SetContainer(Bag *container)
Definition Item.h:270
uint8 GetBagSlot() const
Definition Item.cpp:734
static void DeleteFromDB(SQLTransaction &trans, uint32 itemGuid)
Definition Item.cpp:499
uint16 m_objectType
Definition Object.h:242
uint64 GetGUID() const
Definition Object.h:119
virtual void BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) const
Definition Object.cpp:172
void _Create(uint32 guidlow, uint32 entry, HighGuid guidhigh)
Definition Object.cpp:129
uint16 m_valuesCount
Definition Object.h:256
uint32 GetEntry() const
Definition Object.h:125
virtual void AddToWorld()
Definition Object.cpp:148
virtual void RemoveFromWorld()
Definition Object.cpp:161
void SetEntry(uint32 entry)
Definition Object.h:126
virtual void SetObjectScale(float scale)
Definition Object.h:129
void SetUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:1038
TypeID m_objectTypeId
Definition Object.h:244
void SetUInt64Value(uint16 index, uint64 value)
Definition Object.cpp:1079
uint32 Color
uint32 GemProperties
uint32 ContainerSlots
uint32 MaxDurability
_Socket Socket[MAX_ITEM_PROTO_SOCKETS]