From 056248cef117c49e2c765eb8a7c86a1f5df279d8 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Mon, 30 Oct 2023 22:30:14 +0100 Subject: [PATCH] Core/Packets: converted CMSG_SET_ROLE and SMSG_ROLE_CHANGED_INFORM to packet class --- src/server/game/Handlers/GroupHandler.cpp | 83 ++++--------------- .../game/Server/Packets/PartyPackets.cpp | 67 +++++++++++++++ src/server/game/Server/Packets/PartyPackets.h | 24 ++++++ src/server/game/Server/Protocol/Opcodes.cpp | 4 +- src/server/game/Server/Protocol/Opcodes.h | 4 +- src/server/game/Server/WorldSession.h | 3 +- 6 files changed, 111 insertions(+), 74 deletions(-) diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index 305706357b..23dec9c218 100644 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -392,82 +392,27 @@ void WorldSession::HandleGroupSetLeaderOpcode(WorldPacket& recvData) group->SendUpdate(); } -void WorldSession::HandleGroupSetRolesOpcode(WorldPacket& recvData) +void WorldSession::HandleSetRoleOpcode(WorldPackets::Party::SetRole& packet) { - TC_LOG_DEBUG("network", "WORLD: Received CMSG_GROUP_SET_ROLES"); + WorldPackets::Party::RoleChangedInform roleChangedInform; - uint32 newRole; - ObjectGuid guid1; // Assigner GUID - ObjectGuid guid2; // Target GUID + Group* group = GetPlayer()->GetGroup(); + uint8 oldRole = group ? group->GetLfgRoles(packet.ChangedUnit) : 0; + if (oldRole == packet.Role) + return; - guid1 = GetPlayer()->GetGUID(); + roleChangedInform.From = GetPlayer()->GetGUID(); + roleChangedInform.ChangedUnit = packet.ChangedUnit; + roleChangedInform.OldRole = oldRole; + roleChangedInform.NewRole = packet.Role; - recvData >> newRole; - - guid2[2] = recvData.ReadBit(); - guid2[6] = recvData.ReadBit(); - guid2[3] = recvData.ReadBit(); - guid2[7] = recvData.ReadBit(); - guid2[5] = recvData.ReadBit(); - guid2[1] = recvData.ReadBit(); - guid2[0] = recvData.ReadBit(); - guid2[4] = recvData.ReadBit(); - - recvData.ReadByteSeq(guid2[6]); - recvData.ReadByteSeq(guid2[4]); - recvData.ReadByteSeq(guid2[1]); - recvData.ReadByteSeq(guid2[3]); - recvData.ReadByteSeq(guid2[0]); - recvData.ReadByteSeq(guid2[5]); - recvData.ReadByteSeq(guid2[2]); - recvData.ReadByteSeq(guid2[7]); - - WorldPacket data(SMSG_GROUP_SET_ROLE, 24); - - data.WriteBit(guid1[1]); - data.WriteBit(guid2[0]); - data.WriteBit(guid2[2]); - data.WriteBit(guid2[4]); - data.WriteBit(guid2[7]); - data.WriteBit(guid2[3]); - data.WriteBit(guid1[7]); - data.WriteBit(guid2[5]); - data.WriteBit(guid1[5]); - data.WriteBit(guid1[4]); - data.WriteBit(guid1[3]); - data.WriteBit(guid2[6]); - data.WriteBit(guid1[2]); - data.WriteBit(guid1[6]); - data.WriteBit(guid2[1]); - data.WriteBit(guid1[0]); - - data.WriteByteSeq(guid1[7]); - data.WriteByteSeq(guid2[3]); - data.WriteByteSeq(guid1[6]); - data.WriteByteSeq(guid2[4]); - data.WriteByteSeq(guid2[0]); - data << uint32(newRole); // New Role - data.WriteByteSeq(guid2[6]); - data.WriteByteSeq(guid2[2]); - data.WriteByteSeq(guid1[0]); - data.WriteByteSeq(guid1[4]); - data.WriteByteSeq(guid2[1]); - data.WriteByteSeq(guid1[3]); - data.WriteByteSeq(guid1[5]); - data.WriteByteSeq(guid1[2]); - data.WriteByteSeq(guid2[5]); - data.WriteByteSeq(guid2[7]); - data.WriteByteSeq(guid1[1]); - data << uint32(0); // Old Role - - if (Group* group = GetPlayer()->GetGroup()) + if (group) { - /// @todo probably should be sent only if (oldRole != newRole) - group->BroadcastPacket(&data, false); - group->SetLfgRoles(guid2, newRole); + group->BroadcastPacket(roleChangedInform.Write(), false); + group->SetLfgRoles(packet.ChangedUnit, packet.Role); } else - SendPacket(&data); + SendPacket(roleChangedInform.Write()); } void WorldSession::HandleGroupDisbandOpcode(WorldPacket& /*recvData*/) diff --git a/src/server/game/Server/Packets/PartyPackets.cpp b/src/server/game/Server/Packets/PartyPackets.cpp index 26f4240d77..c731defc06 100644 --- a/src/server/game/Server/Packets/PartyPackets.cpp +++ b/src/server/game/Server/Packets/PartyPackets.cpp @@ -549,3 +549,70 @@ WorldPacket const* WorldPackets::Party::SummonRaidMemberValidateFailed::Write() return &_worldPacket; } + +void WorldPackets::Party::SetRole::Read() +{ + _worldPacket >> Role; + + ChangedUnit[2] = _worldPacket.ReadBit(); + ChangedUnit[6] = _worldPacket.ReadBit(); + ChangedUnit[3] = _worldPacket.ReadBit(); + ChangedUnit[7] = _worldPacket.ReadBit(); + ChangedUnit[5] = _worldPacket.ReadBit(); + ChangedUnit[1] = _worldPacket.ReadBit(); + ChangedUnit[0] = _worldPacket.ReadBit(); + ChangedUnit[4] = _worldPacket.ReadBit(); + + _worldPacket.ReadByteSeq(ChangedUnit[6]); + _worldPacket.ReadByteSeq(ChangedUnit[4]); + _worldPacket.ReadByteSeq(ChangedUnit[1]); + _worldPacket.ReadByteSeq(ChangedUnit[3]); + _worldPacket.ReadByteSeq(ChangedUnit[0]); + _worldPacket.ReadByteSeq(ChangedUnit[5]); + _worldPacket.ReadByteSeq(ChangedUnit[3]); + _worldPacket.ReadByteSeq(ChangedUnit[7]); +} + +WorldPacket const* WorldPackets::Party::RoleChangedInform::Write() +{ + _worldPacket.WriteBit(From[1]); + _worldPacket.WriteBit(ChangedUnit[0]); + _worldPacket.WriteBit(ChangedUnit[2]); + _worldPacket.WriteBit(ChangedUnit[4]); + _worldPacket.WriteBit(ChangedUnit[7]); + _worldPacket.WriteBit(ChangedUnit[3]); + _worldPacket.WriteBit(From[7]); + _worldPacket.WriteBit(ChangedUnit[5]); + _worldPacket.WriteBit(From[5]); + _worldPacket.WriteBit(From[4]); + _worldPacket.WriteBit(From[3]); + _worldPacket.WriteBit(ChangedUnit[6]); + _worldPacket.WriteBit(From[2]); + _worldPacket.WriteBit(From[6]); + _worldPacket.WriteBit(ChangedUnit[1]); + _worldPacket.WriteBit(From[0]); + + _worldPacket.WriteByteSeq(From[7]); + _worldPacket.WriteByteSeq(ChangedUnit[3]); + _worldPacket.WriteByteSeq(From[6]); + _worldPacket.WriteByteSeq(ChangedUnit[4]); + _worldPacket.WriteByteSeq(ChangedUnit[0]); + + _worldPacket << uint32(NewRole); + + _worldPacket.WriteByteSeq(ChangedUnit[6]); + _worldPacket.WriteByteSeq(ChangedUnit[2]); + _worldPacket.WriteByteSeq(From[0]); + _worldPacket.WriteByteSeq(From[4]); + _worldPacket.WriteByteSeq(ChangedUnit[1]); + _worldPacket.WriteByteSeq(From[3]); + _worldPacket.WriteByteSeq(From[5]); + _worldPacket.WriteByteSeq(From[2]); + _worldPacket.WriteByteSeq(ChangedUnit[6]); + _worldPacket.WriteByteSeq(ChangedUnit[7]); + _worldPacket.WriteByteSeq(From[1]); + + _worldPacket << uint32(OldRole); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/PartyPackets.h b/src/server/game/Server/Packets/PartyPackets.h index fd4efd4c7a..8b178269a3 100644 --- a/src/server/game/Server/Packets/PartyPackets.h +++ b/src/server/game/Server/Packets/PartyPackets.h @@ -245,6 +245,30 @@ namespace WorldPackets std::vector Members; }; + + class SetRole final : public ClientPacket + { + public: + SetRole(WorldPacket&& packet) : ClientPacket(CMSG_SET_ROLE, std::move(packet)) { } + + void Read() override; + + ObjectGuid ChangedUnit; + uint32 Role = 0; + }; + + class RoleChangedInform final : public ServerPacket + { + public: + RoleChangedInform() : ServerPacket(SMSG_GROUP_DECLINE, 8 + 8 + 4 + 4) { } + + WorldPacket const* Write() override; + + ObjectGuid ChangedUnit; + ObjectGuid From; + uint32 NewRole = 0; + uint32 OldRole = 0; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 423951e524..8e901ae0b9 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -327,7 +327,6 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_GROUP_RAID_CONVERT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupRaidConvertOpcode ); DEFINE_HANDLER(CMSG_GROUP_REQUEST_JOIN_UPDATES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupRequestJoinUpdates ); DEFINE_HANDLER(CMSG_GROUP_SET_LEADER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupSetLeaderOpcode ); - DEFINE_HANDLER(CMSG_GROUP_SET_ROLES, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleGroupSetRolesOpcode ); DEFINE_HANDLER(CMSG_GROUP_SWAP_SUB_GROUP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupSwapSubGroupOpcode ); DEFINE_HANDLER(CMSG_GROUP_UNINVITE_GUID, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupUninviteGuidOpcode ); DEFINE_HANDLER(CMSG_GUILD_ACCEPT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildAcceptOpcode ); @@ -582,6 +581,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_SET_PREFERED_CEMETERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_SET_PRIMARY_TALENT_TREE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_SET_RELATIVE_POSITION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + DEFINE_HANDLER(CMSG_SET_ROLE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSetRoleOpcode ); DEFINE_HANDLER(CMSG_SET_SAVED_INSTANCE_EXTEND, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetSavedInstanceExtend ); DEFINE_HANDLER(CMSG_SET_SELECTION, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSetSelectionOpcode ); DEFINE_HANDLER(CMSG_SET_TAXI_BENCHMARK_MODE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetTaxiBenchmarkOpcode ); @@ -881,7 +881,6 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_INVITE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_SET_LEADER, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_SET_ROLE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_UNINVITE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_DATA, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_DELETED, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1183,6 +1182,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESURRECT_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESURRECT_REQUEST, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESYNC_RUNES, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ROLE_CHANGED_INFORM, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ROLE_POLL_BEGIN, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RWHOIS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SELL_ITEM, STATUS_NEVER, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index f9fef68c7c..e5155796b2 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -227,7 +227,6 @@ enum OpcodeClient : uint16 CMSG_GROUP_RAID_CONVERT = 0x6E27, CMSG_GROUP_REQUEST_JOIN_UPDATES = 0x2583, CMSG_GROUP_SET_LEADER = 0x4C17, - CMSG_GROUP_SET_ROLES = 0x25B1, CMSG_GROUP_SWAP_SUB_GROUP = 0x0034, CMSG_GROUP_UNINVITE = 0x0000, CMSG_GROUP_UNINVITE_GUID = 0x2E07, @@ -506,6 +505,7 @@ enum OpcodeClient : uint16 CMSG_SET_PREFERED_CEMETERY = 0x311E, CMSG_SET_PRIMARY_TALENT_TREE = 0x4524, CMSG_SET_RELATIVE_POSITION = 0x311A, + CMSG_SET_ROLE = 0x25B1, CMSG_SET_SAVED_INSTANCE_EXTEND = 0x6706, CMSG_SET_SELECTION = 0x0506, CMSG_SET_SKILL_CHEAT = 0x0000, @@ -819,7 +819,6 @@ enum OpcodeServer SMSG_PARTY_INVITE = 0x31B2, SMSG_PARTY_UPDATE = 0x4C24, SMSG_GROUP_SET_LEADER = 0x0526, - SMSG_GROUP_SET_ROLE = 0x39A6, SMSG_GROUP_UNINVITE = 0x0A07, SMSG_GUILD_ACHIEVEMENT_DATA = 0x54B7, SMSG_GUILD_ACHIEVEMENT_DELETED = 0x35A0, @@ -1141,6 +1140,7 @@ enum OpcodeServer SMSG_RESURRECT_FAILED = 0x6705, SMSG_RESURRECT_REQUEST = 0x2905, SMSG_RESYNC_RUNES = 0x6224, + SMSG_ROLE_CHANGED_INFORM = 0x39A6, SMSG_ROLE_POLL_BEGIN = 0x70B0, SMSG_RWHOIS = 0x2437, SMSG_SELL_ITEM = 0x6105, diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index c810df8ab5..1a617533bc 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -196,6 +196,7 @@ namespace WorldPackets class SetEveryoneIsAssistant; class PartyInviteClient; class PartyInviteResponse; + class SetRole; } namespace Quest @@ -818,7 +819,7 @@ class TC_GAME_API WorldSession void HandleGroupUninviteOpcode(WorldPacket& recvPacket); void HandleGroupUninviteGuidOpcode(WorldPacket& recvPacket); void HandleGroupSetLeaderOpcode(WorldPacket& recvPacket); - void HandleGroupSetRolesOpcode(WorldPacket& recvData); + void HandleSetRoleOpcode(WorldPackets::Party::SetRole& packet); void HandleGroupDisbandOpcode(WorldPacket& recvPacket); void HandleOptOutOfLootOpcode(WorldPacket& recvData); void HandleLootMethodOpcode(WorldPacket& recvPacket);