TrinityCore
Loading...
Searching...
No Matches
LootHandler.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 "WorldSession.h"
19#include "Common.h"
20#include "Corpse.h"
21#include "Creature.h"
22#include "GameObject.h"
23#include "Group.h"
24#include "Item.h"
25#include "Log.h"
26#include "LootItemStorage.h"
27#include "LootMgr.h"
28#include "LootPackets.h"
29#include "Map.h"
30#include "Object.h"
31#include "ObjectAccessor.h"
32#include "Player.h"
33#include "WorldPacket.h"
34
36{
37 TC_LOG_DEBUG("network", "WORLD: CMSG_AUTOSTORE_LOOT_ITEM");
38 Player* player = GetPlayer();
39 ObjectGuid lguid = player->GetLootGUID();
40 Loot* loot = nullptr;
41
42 if (lguid.IsGameObject())
43 {
44 GameObject* go = player->GetMap()->GetGameObject(lguid);
45
46 // not check distance for GO in case owned GO (fishing bobber case, for example) or Fishing hole GO
47 if (!go || ((go->GetOwnerGUID() != _player->GetGUID() && go->GetGoType() != GAMEOBJECT_TYPE_FISHINGHOLE) && !go->IsWithinDistInMap(_player)))
48 {
49 player->SendLootRelease(lguid);
50 return;
51 }
52
53 loot = &go->loot;
54 }
55 else if (lguid.IsItem())
56 {
57 Item* pItem = player->GetItemByGuid(lguid);
58
59 if (!pItem)
60 {
61 player->SendLootRelease(lguid);
62 return;
63 }
64
65 loot = &pItem->loot;
66 }
67 else if (lguid.IsCorpse())
68 {
69 Corpse* bones = ObjectAccessor::GetCorpse(*player, lguid);
70 if (!bones)
71 {
72 player->SendLootRelease(lguid);
73 return;
74 }
75
76 loot = &bones->loot;
77 }
78 else
79 {
80 Creature* creature = GetPlayer()->GetMap()->GetCreature(lguid);
81
82 bool lootAllowed = creature && creature->IsAlive() == (player->GetClass() == CLASS_ROGUE && creature->loot.loot_type == LOOT_PICKPOCKETING);
83 if (!lootAllowed || !creature->IsWithinDistInMap(_player, INTERACTION_DISTANCE))
84 {
85 player->SendLootError(lguid, lootAllowed ? LOOT_ERROR_TOO_FAR : LOOT_ERROR_DIDNT_KILL);
86 return;
87 }
88
89 loot = &creature->loot;
90 }
91
92 player->StoreLootItem(packet.LootListID, loot);
93
94 // If player is removing the last LootItem, delete the empty container.
95 if (loot->isLooted() && lguid.IsItem())
96 player->GetSession()->DoLootRelease(lguid);
97}
98
100{
101 TC_LOG_DEBUG("network", "WORLD: CMSG_LOOT_MONEY");
102
103 Player* player = GetPlayer();
104 ObjectGuid guid = player->GetLootGUID();
105 if (!guid)
106 return;
107
108 Loot* loot = nullptr;
109 bool shareMoney = true;
110
111 switch (guid.GetHigh())
112 {
114 {
115 GameObject* go = GetPlayer()->GetMap()->GetGameObject(guid);
116
117 // do not check distance for GO if player is the owner of it (ex. fishing bobber)
118 if (go && ((go->GetOwnerGUID() == player->GetGUID() || go->IsWithinDistInMap(player))))
119 loot = &go->loot;
120
121 break;
122 }
123 case HighGuid::Corpse: // remove insignia ONLY in BG
124 {
125 Corpse* bones = ObjectAccessor::GetCorpse(*player, guid);
126
127 if (bones && bones->IsWithinDistInMap(player, INTERACTION_DISTANCE))
128 {
129 loot = &bones->loot;
130 shareMoney = false;
131 }
132
133 break;
134 }
135 case HighGuid::Item:
136 {
137 if (Item* item = player->GetItemByGuid(guid))
138 {
139 loot = &item->loot;
140 shareMoney = false;
141 }
142 break;
143 }
144 case HighGuid::Unit:
146 {
147 Creature* creature = player->GetMap()->GetCreature(guid);
148 bool lootAllowed = creature && creature->IsAlive() == (player->GetClass() == CLASS_ROGUE && creature->loot.loot_type == LOOT_PICKPOCKETING);
149 if (lootAllowed && creature->IsWithinDistInMap(player, INTERACTION_DISTANCE))
150 {
151 loot = &creature->loot;
152 if (creature->IsAlive())
153 shareMoney = false;
154 }
155 else
156 player->SendLootError(guid, lootAllowed ? LOOT_ERROR_TOO_FAR : LOOT_ERROR_DIDNT_KILL);
157 break;
158 }
159 default:
160 return; // unlootable type
161 }
162
163 if (loot)
164 {
165 loot->NotifyMoneyRemoved();
166 if (shareMoney && player->GetGroup()) //item, pickpocket and players can be looted only single player
167 {
168 Group* group = player->GetGroup();
169
170 std::vector<Player*> playersNear;
171 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
172 {
173 Player* member = itr->GetSource();
174 if (!member)
175 continue;
176
177 if (player->IsAtGroupRewardDistance(member))
178 playersNear.push_back(member);
179 }
180
181 uint32 goldPerPlayer = uint32((loot->gold) / (playersNear.size()));
182
183 for (std::vector<Player*>::const_iterator i = playersNear.begin(); i != playersNear.end(); ++i)
184 {
185 (*i)->ModifyMoney(goldPerPlayer);
186 (*i)->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY, goldPerPlayer);
187
189 packet.Money = goldPerPlayer;
190 packet.SoleLooter = playersNear.size() <= 1;
191 (*i)->SendDirectMessage(packet.Write());
192 }
193 }
194 else
195 {
196 player->ModifyMoney(loot->gold);
198
200 packet.Money = loot->gold;
201 packet.SoleLooter = true; // "You loot..."
202 SendPacket(packet.Write());
203 }
204
205 loot->gold = 0;
206
207 // Delete the money loot record from the DB
208 if (loot->containerID > 0)
209 sLootItemStorage->RemoveStoredMoneyForContainer(loot->containerID);
210
211 // Delete container if empty
212 if (loot->isLooted() && guid.IsItem())
213 player->GetSession()->DoLootRelease(guid);
214 }
215}
216
218{
219 TC_LOG_DEBUG("network", "WORLD: CMSG_LOOT");
220
221 // Check possible cheat
222 if (!GetPlayer()->IsAlive() || !packet.Unit.IsCreatureOrVehicle())
223 return;
224
225 // interrupt cast
226 if (GetPlayer()->IsNonMeleeSpellCast(false))
228
230
232}
233
235{
236 TC_LOG_DEBUG("network", "WORLD: CMSG_LOOT_RELEASE");
237
238 // cheaters can modify lguid to prevent correct apply loot release code and re-loot
239 // use internal stored guid
240 ObjectGuid lguid = GetPlayer()->GetLootGUID();
241 if (!lguid.IsEmpty())
242 if (lguid == packet.Unit)
243 DoLootRelease(lguid);
244}
245
247{
248 Player *player = GetPlayer();
249 Loot *loot;
250
252 player->SendLootRelease(lguid);
253
255
256 if (!player->IsInWorld())
257 return;
258
259 if (lguid.IsGameObject())
260 {
261 GameObject* go = GetPlayer()->GetMap()->GetGameObject(lguid);
262
263 // not check distance for GO in case owned GO (fishing bobber case, for example) or Fishing hole GO
264 if (!go || ((go->GetOwnerGUID() != _player->GetGUID() && go->GetGoType() != GAMEOBJECT_TYPE_FISHINGHOLE) && !go->IsWithinDistInMap(_player)))
265 return;
266
267 loot = &go->loot;
268
269 if (go->GetGoType() == GAMEOBJECT_TYPE_DOOR)
270 {
271 // locked doors are opened with spelleffect openlock, prevent remove its as looted
272 go->UseDoorOrButton();
273 }
274 else if (loot->isLooted() || go->GetGoType() == GAMEOBJECT_TYPE_FISHINGNODE)
275 {
277 {
278 bool allOpensConsumed = false;
280 {
281 // The fishing hole used once more
282 go->AddUse();
283
284 // If the max usage is reached, will be despawned in next tick
285 allOpensConsumed = go->GetUseCount() >= go->GetGOValue()->FishingHole.MaxOpens;
286 }
287
288 go->SetLootState(allOpensConsumed ? GO_JUST_DEACTIVATED : GO_READY);
289 }
290 else
292
293 loot->clear();
294 }
295 else
296 {
297 // not fully looted object
298 go->SetLootState(GO_ACTIVATED, player);
299
300 // if the round robin player release, reset it.
301 if (player->GetGUID() == loot->roundRobinPlayer)
302 loot->roundRobinPlayer.Clear();
303 }
304 }
305 else if (lguid.IsCorpse()) // ONLY remove insignia at BG
306 {
307 Corpse* corpse = ObjectAccessor::GetCorpse(*player, lguid);
308 if (!corpse || !corpse->IsWithinDistInMap(_player, INTERACTION_DISTANCE))
309 return;
310
311 loot = &corpse->loot;
312
313 if (loot->isLooted())
314 {
315 loot->clear();
317 }
318 }
319 else if (lguid.IsItem())
320 {
321 Item* pItem = player->GetItemByGuid(lguid);
322 if (!pItem)
323 return;
324
325 ItemTemplate const* proto = pItem->GetTemplate();
326
327 // destroy only 5 items from stack in case prospecting and milling
329 {
330 pItem->m_lootGenerated = false;
331 pItem->loot.clear();
332
333 uint32 count = pItem->GetCount();
334
335 // >=5 checked in spell code, but will work for cheating cases also with removing from another stacks.
336 if (count > 5)
337 count = 5;
338
339 player->DestroyItemCount(pItem, count, true);
340 }
341 else
342 {
343 // Only delete item if no loot or money (unlooted loot is saved to db) or if it isn't an openable item
344 if (pItem->loot.isLooted() || !proto->HasFlag(ITEM_FLAG_HAS_LOOT))
345 player->DestroyItem(pItem->GetBagSlot(), pItem->GetSlot(), true);
346 }
347 return; // item can be looted only single player
348 }
349 else
350 {
351 Creature* creature = GetPlayer()->GetMap()->GetCreature(lguid);
352
353 bool lootAllowed = creature && creature->IsAlive() == (player->GetClass() == CLASS_ROGUE && creature->loot.loot_type == LOOT_PICKPOCKETING);
354 if (!lootAllowed || !creature->IsWithinDistInMap(_player, INTERACTION_DISTANCE))
355 return;
356
357 loot = &creature->loot;
358 if (loot->isLooted())
359 {
361
362 // skip pickpocketing loot for speed, skinning timer reduction is no-op in fact
363 if (!creature->IsAlive())
364 creature->AllLootRemovedFromCorpse();
365
366 loot->clear();
367 }
368 else
369 {
370 // if the round robin player release, reset it.
371 if (player->GetGUID() == loot->roundRobinPlayer)
372 {
373 loot->roundRobinPlayer.Clear();
374
375 if (Group* group = player->GetGroup())
376 group->SendLooter(creature, nullptr);
377 }
378 // force dynflag update to update looter and lootable info
380 }
381 }
382
383 //Player is not looking at loot list, he doesn't need to see updates on the loot list
384 loot->RemoveLooter(player->GetGUID());
385}
386
388{
389 uint8 slotid;
390 ObjectGuid lootguid, target_playerguid;
391
392 recvData >> lootguid >> slotid >> target_playerguid;
393
395 {
397 return;
398 }
399
400 // player on other map
401 Player* target = ObjectAccessor::GetPlayer(*_player, target_playerguid);
402 if (!target)
403 {
405 return;
406 }
407
408 TC_LOG_DEBUG("network", "WorldSession::HandleLootMasterGiveOpcode (CMSG_LOOT_MASTER_GIVE, 0x02A3) Target = [{}].", target->GetName());
409
410 if (_player->GetLootGUID() != lootguid)
411 {
413 return;
414 }
415
416 if (!_player->IsInRaidWith(target) || !_player->IsInMap(target))
417 {
419 TC_LOG_INFO("entities.player.cheat", "MasterLootItem: Player {} tried to give an item to ineligible player {} !", GetPlayer()->GetName(), target->GetName());
420 return;
421 }
422
423 Loot* loot = nullptr;
424
425 if (GetPlayer()->GetLootGUID().IsCreatureOrVehicle())
426 {
427 Creature* creature = GetPlayer()->GetMap()->GetCreature(lootguid);
428 if (!creature)
429 return;
430
431 loot = &creature->loot;
432 }
433 else if (GetPlayer()->GetLootGUID().IsGameObject())
434 {
435 GameObject* pGO = GetPlayer()->GetMap()->GetGameObject(lootguid);
436 if (!pGO)
437 return;
438
439 loot = &pGO->loot;
440 }
441
442 if (!loot)
443 return;
444
445 if (slotid >= loot->items.size() + loot->quest_items.size())
446 {
447 TC_LOG_DEBUG("loot", "MasterLootItem: Player {} might be using a hack! (slot {}, size {})",
448 GetPlayer()->GetName(), slotid, (unsigned long)loot->items.size());
449 return;
450 }
451
452 LootItem& item = slotid >= loot->items.size() ? loot->quest_items[slotid - loot->items.size()] : loot->items[slotid];
453
454 ItemPosCountVec dest;
455 InventoryResult msg = target->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, item.itemid, item.count);
456 if (!item.AllowedForPlayer(target, true))
458 if (msg != EQUIP_ERR_OK)
459 {
460 if (msg == EQUIP_ERR_ITEM_MAX_COUNT)
462 else if (msg == EQUIP_ERR_INV_FULL)
464 else
466 return;
467 }
468
469 // now move item from loot to target inventory
470 Item* newitem = target->StoreNewItem(dest, item.itemid, true, item.randomPropertyId, item.GetAllowedLooters());
471 target->SendNewItem(newitem, uint32(item.count), false, false, true);
475
476 // mark as looted
477 item.count = 0;
478 item.is_looted = true;
479
480 loot->NotifyItemRemoved(slotid);
481 --loot->unlootedCount;
482}
@ ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE
Definition DBCEnums.h:229
@ ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM
Definition DBCEnums.h:168
@ ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM
Definition DBCEnums.h:211
@ ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY
Definition DBCEnums.h:191
uint8_t uint8
Definition Define.h:135
uint32_t uint32
Definition Define.h:133
@ GO_ACTIVATED
Definition GameObject.h:78
@ GO_READY
Definition GameObject.h:77
@ GO_JUST_DEACTIVATED
Definition GameObject.h:79
InventoryResult
Definition ItemDefines.h:25
@ EQUIP_ERR_CANT_EQUIP_EVER
Definition ItemDefines.h:36
@ EQUIP_ERR_OK
Definition ItemDefines.h:26
@ EQUIP_ERR_INV_FULL
Definition ItemDefines.h:76
@ EQUIP_ERR_ITEM_MAX_COUNT
Definition ItemDefines.h:43
@ ITEM_FLAG_IS_MILLABLE
@ ITEM_FLAG_IS_PROSPECTABLE
@ ITEM_FLAG_HAS_LOOT
#define TC_LOG_DEBUG(filterType__,...)
Definition Log.h:156
#define TC_LOG_INFO(filterType__,...)
Definition Log.h:159
#define sLootItemStorage
@ LOOT_PICKPOCKETING
Definition Loot.h:93
@ LOOT_CORPSE
Definition Loot.h:92
@ MASTER_LOOT
Definition Loot.h:72
constexpr LootType GetLootTypeForClient(LootType lootType)
Definition Loot.h:106
@ LOOT_ERROR_TOO_FAR
Definition Loot.h:124
@ LOOT_ERROR_MASTER_OTHER
Definition Loot.h:133
@ LOOT_ERROR_MASTER_INV_FULL
Definition Loot.h:131
@ LOOT_ERROR_MASTER_UNIQUE_ITEM
Definition Loot.h:132
@ LOOT_ERROR_DIDNT_KILL
Definition Loot.h:123
@ LOOT_ERROR_PLAYER_NOT_FOUND
Definition Loot.h:129
#define INTERACTION_DISTANCE
std::vector< ItemPosCount > ItemPosCountVec
Definition Player.h:632
@ GAMEOBJECT_TYPE_FISHINGHOLE
@ GAMEOBJECT_TYPE_FISHINGNODE
@ GAMEOBJECT_TYPE_DOOR
@ CORPSE_DYNFLAG_LOOTABLE
@ UNIT_DYNFLAG_LOOTABLE
@ CLASS_ROGUE
@ AURA_INTERRUPT_FLAG_LOOTING
@ UNIT_FLAG_LOOTING
@ NULL_BAG
Definition Unit.h:60
@ NULL_SLOT
Definition Unit.h:61
@ UNIT_DYNAMIC_FLAGS
void RemoveCorpseDynamicFlag(CorpseDynFlags flag)
Definition Corpse.h:78
Loot loot
Definition Corpse.h:115
Loot loot
Definition Creature.h:218
void AllLootRemovedFromCorpse()
ObjectGuid GetOwnerGUID() const override
Definition GameObject.h:141
bool IsWithinDistInMap(Player const *player) const
void UseDoorOrButton(uint32 time_to_restore=0, bool alternative=false, Unit *user=nullptr)
void AddUse()
Definition GameObject.h:214
GameObjectValue const * GetGOValue() const
Definition GameObject.h:106
void SetLootState(LootState s, Unit *unit=nullptr)
GameobjectTypes GetGoType() const
Definition GameObject.h:176
uint32 GetUseCount() const
Definition GameObject.h:216
GroupReference * next()
Definition Group.h:165
ObjectGuid GetMasterLooterGuid() const
Definition Group.cpp:2449
LootMethod GetLootMethod() const
Definition Group.cpp:2437
GroupReference * GetFirstMember()
Definition Group.h:247
Definition Item.h:62
uint8 GetSlot() const
Definition Item.h:143
ItemTemplate const * GetTemplate() const
Definition Item.cpp:541
bool m_lootGenerated
Definition Item.h:183
uint32 GetCount() const
Definition Item.h:136
Loot loot
Definition Item.h:182
uint8 GetBagSlot() const
Definition Item.cpp:717
GameObject * GetGameObject(ObjectGuid const &guid)
Definition Map.cpp:4425
Creature * GetCreature(ObjectGuid const &guid)
Definition Map.cpp:4392
static ObjectGuid const Empty
Definition ObjectGuid.h:140
bool IsCorpse() const
Definition ObjectGuid.h:184
bool IsEmpty() const
Definition ObjectGuid.h:172
bool IsItem() const
Definition ObjectGuid.h:181
bool IsGameObject() const
Definition ObjectGuid.h:182
bool IsCreatureOrVehicle() const
Definition ObjectGuid.h:177
HighGuid GetHigh() const
Definition ObjectGuid.h:154
void Clear()
Definition ObjectGuid.h:150
virtual void RemoveDynamicFlag(uint32 flag)
Definition Object.h:90
bool IsInWorld() const
Definition Object.h:73
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
void ForceValuesUpdateAtIndex(uint32)
Definition Object.cpp:1778
void SendLootRelease(ObjectGuid guid) const
Definition Player.cpp:8077
Item * StoreNewItem(ItemPosCountVec const &pos, uint32 itemId, bool update, int32 randomPropertyId=0, GuidSet const &allowedLooters=GuidSet())
Definition Player.cpp:11619
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, WorldObject *ref=nullptr)
Definition Player.cpp:24914
bool ModifyMoney(int32 amount, bool sendError=true)
Definition Player.cpp:22336
void SetLootGUID(ObjectGuid guid)
Definition Player.h:1701
bool IsAtGroupRewardDistance(WorldObject const *pRewardSource) const
Definition Player.cpp:23639
WorldSession * GetSession() const
Definition Player.h:1705
ObjectGuid GetLootGUID() const
Definition Player.h:1700
void DestroyItem(uint8 bag, uint8 slot, bool update)
Definition Player.cpp:12111
uint32 DestroyItemCount(uint32 item, uint32 count, bool update, bool unequip_check=false)
Definition Player.cpp:12207
void SendLoot(ObjectGuid guid, LootType loot_type)
Definition Player.cpp:8084
Group * GetGroup()
Definition Player.h:2159
void SendNewItem(Item *item, uint32 count, bool received, bool created, bool broadcast=false, bool sendChatMessage=true)
Definition Player.cpp:13857
void SendLootError(ObjectGuid const &owner, LootError error) const
Definition Player.cpp:8467
void StoreLootItem(uint8 lootSlot, Loot *loot)
Definition Player.cpp:24531
Item * GetItemByGuid(ObjectGuid guid) const
Definition Player.cpp:9516
InventoryResult CanStoreNewItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, uint32 item, uint32 count, uint32 *no_space_count=nullptr) const
Definition Player.cpp:9987
uint8 GetClass() const
Definition Unit.h:909
void RemoveAurasWithInterruptFlags(uint32 flag, uint32 except=0)
Definition Unit.cpp:4045
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition Unit.cpp:3116
bool IsAlive() const
Definition Unit.h:1247
bool IsInRaidWith(Unit const *unit) const
Definition Unit.cpp:11863
void RemoveUnitFlag(UnitFlags flags)
Definition Unit.h:969
Map * GetMap() const
Definition Object.h:451
std::string const & GetName() const
Definition Object.h:384
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:1193
bool IsInMap(WorldObject const *obj) const
Definition Object.cpp:1161
size_type size() const
WorldPacket const * Write() override
void HandleLootMasterGiveOpcode(WorldPacket &recvPacket)
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
void HandleLootReleaseOpcode(WorldPackets::Loot::LootRelease &packet)
void HandleLootMoneyOpcode(WorldPackets::Loot::LootMoney &packet)
void HandleLootOpcode(WorldPackets::Loot::LootUnit &packet)
Player * GetPlayer() const
Player * _player
void DoLootRelease(ObjectGuid lguid)
void HandleAutostoreLootItemOpcode(WorldPackets::Loot::LootItem &packet)
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
TC_GAME_API Corpse * GetCorpse(WorldObject const &u, ObjectGuid const &guid)
bool HasFlag(ItemFlags flag) const
uint32 itemid
Definition Loot.h:150
int32 randomPropertyId
Definition Loot.h:153
uint8 count
Definition Loot.h:157
bool is_looted
Definition Loot.h:158
GuidSet const & GetAllowedLooters() const
Definition Loot.h:180
bool AllowedForPlayer(Player const *player, bool isGivenByMasterLooter, ObjectGuid ownerGuid) const
Definition Loot.cpp:69
Definition Loot.h:226
bool isLooted() const
Definition Loot.h:256
void clear()
Definition Loot.cpp:149
void NotifyMoneyRemoved()
Definition Loot.cpp:417
uint8 unlootedCount
Definition Loot.h:234
ObjectGuid roundRobinPlayer
Definition Loot.h:235
uint32 containerID
Definition Loot.h:242
uint32 gold
Definition Loot.h:233
std::vector< LootItem > items
Definition Loot.h:231
void RemoveLooter(ObjectGuid GUID)
Definition Loot.h:262
void NotifyItemRemoved(uint8 lootIndex)
Definition Loot.cpp:401
LootType loot_type
Definition Loot.h:237
std::vector< LootItem > quest_items
Definition Loot.h:232
struct GameObjectValue::@188 FishingHole