diff options
| author | Shauren <shauren.trinity@gmail.com> | 2016-12-27 21:36:40 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2016-12-27 21:36:40 +0100 |
| commit | fe26f8ae48bd2da160ba4cf42900e0983575b96c (patch) | |
| tree | 043ec6e36594d2df4ea4c873b51e3f593a5d9348 /src/server/game/Server | |
| parent | 87427321497aad5ba3c6dbc1b7f4838f255e052b (diff) | |
Core/Loot: Fixed group loot
Closes #17696
Diffstat (limited to 'src/server/game/Server')
| -rw-r--r-- | src/server/game/Server/Packets/LootPackets.cpp | 78 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/LootPackets.h | 67 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/PartyPackets.h | 8 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 20 |
4 files changed, 153 insertions, 20 deletions
diff --git a/src/server/game/Server/Packets/LootPackets.cpp b/src/server/game/Server/Packets/LootPackets.cpp index 9e1dfb719a1..ff61790e2fe 100644 --- a/src/server/game/Server/Packets/LootPackets.cpp +++ b/src/server/game/Server/Packets/LootPackets.cpp @@ -17,6 +17,19 @@ #include "LootPackets.h" +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Loot::LootItemData const& lootItem) +{ + data.WriteBits(lootItem.Type, 2); + data.WriteBits(lootItem.UIType, 3); + data.WriteBit(lootItem.CanTradeToTapList); + data.FlushBits(); + data << lootItem.Loot; // WorldPackets::Item::ItemInstance + data << uint32(lootItem.Quantity); + data << uint8(lootItem.LootItemType); + data << uint8(lootItem.LootListID); + return data; +} + void WorldPackets::Loot::LootUnit::Read() { _worldPacket >> Unit; @@ -39,16 +52,7 @@ WorldPacket const* WorldPackets::Loot::LootResponse::Write() _worldPacket.FlushBits(); for (LootItemData const& item : Items) - { - _worldPacket.WriteBits(item.Type, 2); - _worldPacket.WriteBits(item.UIType, 3); - _worldPacket.WriteBit(item.CanTradeToTapList); - _worldPacket.FlushBits(); - _worldPacket << item.Loot; // WorldPackets::Item::ItemInstance - _worldPacket << uint32(item.Quantity); - _worldPacket << uint8(item.LootItemType); - _worldPacket << uint8(item.LootListID); - } + _worldPacket << item; for (LootCurrency const& currency : Currencies) { @@ -142,3 +146,57 @@ void WorldPackets::Loot::SetLootSpecialization::Read() { _worldPacket >> SpecID; } + +WorldPacket const* WorldPackets::Loot::StartLootRoll::Write() +{ + _worldPacket << LootObj; + _worldPacket << int32(MapID); + _worldPacket << uint32(RollTime); + _worldPacket << uint8(ValidRolls); + _worldPacket << uint8(Method); + _worldPacket << Item; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Loot::LootRollBroadcast::Write() +{ + _worldPacket << LootObj; + _worldPacket << Player; + _worldPacket << int32(Roll); + _worldPacket << uint8(RollType); + _worldPacket << Item; + _worldPacket.WriteBit(Autopassed); + _worldPacket.FlushBits(); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Loot::LootRollWon::Write() +{ + _worldPacket << LootObj; + _worldPacket << Winner; + _worldPacket << int32(Roll); + _worldPacket << uint8(RollType); + _worldPacket << Item; + _worldPacket.WriteBit(MainSpec); + _worldPacket.FlushBits(); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Loot::LootAllPassed::Write() +{ + _worldPacket << LootObj; + _worldPacket << Item; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Loot::LootRollsComplete::Write() +{ + _worldPacket << LootObj; + _worldPacket << uint8(LootListID); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/LootPackets.h b/src/server/game/Server/Packets/LootPackets.h index cbe900211a3..9074b58bab1 100644 --- a/src/server/game/Server/Packets/LootPackets.h +++ b/src/server/game/Server/Packets/LootPackets.h @@ -188,6 +188,73 @@ namespace WorldPackets uint32 SpecID = 0; }; + + class StartLootRoll final : public ServerPacket + { + public: + StartLootRoll() : ServerPacket(SMSG_START_LOOT_ROLL) { } + + WorldPacket const* Write() override; + + ObjectGuid LootObj; + int32 MapID = 0; + uint32 RollTime = 0; + uint8 Method = 0; + uint8 ValidRolls = 0; + LootItemData Item; + }; + + class LootRollBroadcast : public ServerPacket + { + public: + LootRollBroadcast() : ServerPacket(SMSG_LOOT_ROLL) { } + + WorldPacket const* Write() override; + + ObjectGuid LootObj; + ObjectGuid Player; + int32 Roll = 0; ///< Roll value can be negative, it means that it is an "offspec" roll but only during roll selection broadcast (not when sending the result) + uint8 RollType = 0; + LootItemData Item; + bool Autopassed = false; ///< Triggers message |HlootHistory:%d|h[Loot]|h: You automatically passed on: %s because you cannot loot that item. + }; + + class LootRollWon : public ServerPacket + { + public: + LootRollWon() : ServerPacket(SMSG_LOOT_ROLL_WON) { } + + WorldPacket const* Write() override; + + ObjectGuid LootObj; + ObjectGuid Winner; + int32 Roll = 0; + uint8 RollType = 0; + LootItemData Item; + bool MainSpec = false; + }; + + class LootAllPassed : public ServerPacket + { + public: + LootAllPassed() : ServerPacket(SMSG_LOOT_ALL_PASSED) { } + + WorldPacket const* Write() override; + + ObjectGuid LootObj; + LootItemData Item; + }; + + class LootRollsComplete : public ServerPacket + { + public: + LootRollsComplete() : ServerPacket(SMSG_LOOT_ROLLS_COMPLETE, 16 + 1) { } + + WorldPacket const* Write() override; + + ObjectGuid LootObj; + uint8 LootListID = 0; + }; } } diff --git a/src/server/game/Server/Packets/PartyPackets.h b/src/server/game/Server/Packets/PartyPackets.h index 847a024138e..757fbdb0e78 100644 --- a/src/server/game/Server/Packets/PartyPackets.h +++ b/src/server/game/Server/Packets/PartyPackets.h @@ -614,6 +614,14 @@ namespace WorldPackets ObjectGuid Player; ObjectGuid Victim; }; + + class GroupDestroyed final : public ServerPacket + { + public: + GroupDestroyed() : ServerPacket(SMSG_GROUP_DESTROYED, 0) { } + + WorldPacket const* Write() override { return &_worldPacket; } + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 1bb358f7f73..74d59b96e78 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1321,17 +1321,17 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGOUT_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGOUT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOG_XP_GAIN, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ALL_PASSED, 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_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); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ALL_PASSED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ITEM_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_LIST, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_MONEY_NOTIFY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RELEASE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RELEASE_ALL, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_REMOVED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ROLL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ROLLS_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ROLL_WON, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ROLL, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ROLLS_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ROLL_WON, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOSS_OF_CONTROL_AURA_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_COMMAND_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_LIST_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1694,7 +1694,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_STAND_STATE_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_ELAPSED_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_ELAPSED_TIMERS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_LOOT_ROLL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_LOOT_ROLL, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_MIRROR_TIMER, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_STOP_ELAPSED_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); |
