aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2016-12-27 21:36:40 +0100
committerShauren <shauren.trinity@gmail.com>2016-12-27 21:36:40 +0100
commitfe26f8ae48bd2da160ba4cf42900e0983575b96c (patch)
tree043ec6e36594d2df4ea4c873b51e3f593a5d9348 /src/server/game/Server
parent87427321497aad5ba3c6dbc1b7f4838f255e052b (diff)
Core/Loot: Fixed group loot
Closes #17696
Diffstat (limited to 'src/server/game/Server')
-rw-r--r--src/server/game/Server/Packets/LootPackets.cpp78
-rw-r--r--src/server/game/Server/Packets/LootPackets.h67
-rw-r--r--src/server/game/Server/Packets/PartyPackets.h8
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp20
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);