diff options
-rw-r--r-- | src/server/game/Groups/Group.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Server/Packets/LootPackets.cpp | 18 | ||||
-rw-r--r-- | src/server/game/Server/Packets/LootPackets.h | 12 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 |
4 files changed, 38 insertions, 10 deletions
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 2391f152ab3..16aba8426e2 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -36,6 +36,7 @@ #include "LFGMgr.h" #include "UpdateFieldFlags.h" #include "PartyPackets.h" +#include "LootPackets.h" Roll::Roll(ObjectGuid _guid, LootItem const& li) : itemGUID(_guid), itemid(li.itemid), itemRandomPropId(li.randomPropertyId), itemRandomSuffix(li.randomSuffix), itemCount(li.count), @@ -930,20 +931,17 @@ void Group::SendLooter(Creature* creature, Player* groupLooter) { ASSERT(creature); - WorldPacket data(SMSG_LOOT_LIST, (8+8)); - data << creature->GetGUID(); + WorldPackets::Loot::LootList lootList; + + lootList.Owner = creature->GetGUID(); if (GetLootMethod() == MASTER_LOOT && creature->loot.hasOverThresholdItem()) - data << GetMasterLooterGuid(); - else - data << uint8(0); + lootList.Master = GetMasterLooterGuid(); if (groupLooter) - data << groupLooter->GetPackGUID(); - else - data << uint8(0); + lootList.RoundRobinWinner = groupLooter->GetGUID(); - BroadcastPacket(&data, false); + BroadcastPacket(lootList.Write(), false); } void Group::GroupLoot(Loot* loot, WorldObject* pLootedObject) diff --git a/src/server/game/Server/Packets/LootPackets.cpp b/src/server/game/Server/Packets/LootPackets.cpp index 029196d22f7..863179b702e 100644 --- a/src/server/game/Server/Packets/LootPackets.cpp +++ b/src/server/game/Server/Packets/LootPackets.cpp @@ -121,3 +121,21 @@ WorldPacket const* WorldPackets::Loot::LootReleaseResponse::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::Loot::LootList::Write() +{ + _worldPacket << Owner; + + _worldPacket.WriteBit(Master.is_initialized()); + _worldPacket.WriteBit(RoundRobinWinner.is_initialized()); + + _worldPacket.FlushBits(); + + if (Master) + _worldPacket << *Master; + + if (RoundRobinWinner) + _worldPacket << *RoundRobinWinner; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/LootPackets.h b/src/server/game/Server/Packets/LootPackets.h index fd8f545a19f..b3f9e703ba2 100644 --- a/src/server/game/Server/Packets/LootPackets.h +++ b/src/server/game/Server/Packets/LootPackets.h @@ -166,6 +166,18 @@ namespace WorldPackets ObjectGuid LootObj; ObjectGuid Owner; }; + + class LootList final : public ServerPacket + { + public: + LootList() : ServerPacket(SMSG_LOOT_LIST, 3 * 16) { } + + WorldPacket const* Write() override; + + ObjectGuid Owner; + Optional<ObjectGuid> Master; + Optional<ObjectGuid> RoundRobinWinner; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 7e5fe5e5e29..6eda0a0a009 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1307,7 +1307,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ALL_PASSED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_CONTENTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ITEM_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_LIST, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_MONEY_NOTIFY, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RELEASE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RELEASE_ALL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); |