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