diff options
| author | et65 <et65@ashbringer.fr> | 2015-05-19 02:55:53 +0100 |
|---|---|---|
| committer | et65 <et65@ashbringer.fr> | 2015-05-19 13:10:29 +0200 |
| commit | c6ab951025b0be3b0f64dc8bb0703d4aa8bdb003 (patch) | |
| tree | 721c10ff9d69f5c70b743e3fb4d87250dc479a06 /src/server/game/Handlers/GroupHandler.cpp | |
| parent | 7382c7d5d3ecfce7ae8d59390ba3ffa17eea81a9 (diff) | |
Core/PacketsIO: Implemented or updated most of party related packets.
Packets updated or implemented :
- SMSG_INSTANCE_INFO : updated
- CMSG_SAVE_CUF_PROFILES : updated
- SMSG_LOAD_CUF_PROFILES : updated
- SMSG_PARTY_COMMAND_RESULT : updated
- CMSG_PARTY_INVITE : updated
- SMSG_PARTY_INVITE : updated
- CMSG_PARTY_INVITE_RESPONSE : updated
- CMSG_PARTY_UNINVITE : updated
- SMSG_GROUP_UNINVITE : updated
- CMSG_LEAVE_GROUP : updated
- SMSG_GROUP_DECLINE : updated
- SMSG_GROUP_DESTROYED : updated
- CMSG_MINIMAP_PING : updated
- SMSG_MINIMAP_PING : updated
- CMSG_CONVERT_RAID : updated
- CMSG_SET_EVERYONE_IS_ASSISTANT
- CMSG_DO_READY_CHECK : updated
- CMSG_READY_CHECK_RESPONSE : updated
- SMSG_READY_CHECK_COMPLETED : updated
- SMSG_READY_CHECK_RESPONSE : updated
- SMSG_READY_CHECK_STARTED : updated
- CMSG_REQUEST_PARTY_JOIN_UPDATES : implemented (source : sniffs)
- CMSG_REQUEST_PARTY_MEMBER_STATE : updated
- SMSG_PARTY_MEMBER_STATE : updated
- SMSG_PARTY_UPDATE : updated
- CMSG_REQUEST_RAID_INFO : updated
- CMSG_INITIATE_ROLE_POLL : updated
- SMSG_ROLE_POLL_INFORM : updated
- CMSG_SET_ROLE : updated
- SMSG_ROLE_CHANGED_INFORM : updated
- CMSG_CHANGE_SUB_GROUP : updated
- CMSG_SWAP_SUB_GROUPS : implemented
- CMSG_SET_ASSISTANT_LEADER : updated
- CMSG_SET_PARTY_LEADER : updated
- SMSG_GROUP_NEW_LEADER : updated
- CMSG_CLEAR_RAID_MARKER : implemented
- SMSG_RAID_MARKERS_CHANGED : implemented
- CMSG_UPDATE_RAID_TARGET : updated
- SMSG_SEND_RAID_TARGET_UPDATE_ALL : updated
- SMSG_SEND_RAID_TARGET_UPDATE_SINGLE : updated
- CMSG_OPT_OUT_OF_LOOT : updated
- CMSG_SET_LOOT_METHOD : updated
About group update flags:
- Not sure they are use for now.
- Pets now have their group update flags.
- Pets'power is no send to client anymore.
- Changes about them are inspired from SMSG_PARTY_MEMBER_STATS parsing of WowPacketParser, but it seems this packet is not use anymore.
CHAT_MSG_RAID has been fixed.
About Ready check:
- Correctly implemented this function.
- An update function has been added to Group class, and to GroupMgr class in order to manage the ready check expiration (when 35 seconds were gone, players who have not answered must be reported as AFK)
About Raid markers:
- Old spell effect SPELL_EFFECT_SUMMON_OBJECT_SLOT3 has been renamed to SPELL_EFFECT_CHANGE_RAID_MARKER and implemented. I'm sure about that because raid markers spells are the only spells that have this effect type.
Source: WowPacketParser, and sniffs from official.
Diffstat (limited to 'src/server/game/Handlers/GroupHandler.cpp')
| -rw-r--r-- | src/server/game/Handlers/GroupHandler.cpp | 983 |
1 files changed, 157 insertions, 826 deletions
diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index 9552c9a0655..4aef42fed8d 100644 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -35,6 +35,7 @@ #include "SpellAuraEffects.h" #include "MiscPackets.h" #include "LootPackets.h" +#include "PartyPackets.h" class Aura; @@ -51,103 +52,59 @@ class Aura; void WorldSession::SendPartyResult(PartyOperation operation, const std::string& member, PartyResult res, uint32 val /* = 0 */) { - WorldPacket data(SMSG_PARTY_COMMAND_RESULT, 4 + member.size() + 1 + 4 + 4 + 8); - data << uint32(operation); - data << member; - data << uint32(res); - data << uint32(val); // LFD cooldown related (used with ERR_PARTY_LFG_BOOT_COOLDOWN_S and ERR_PARTY_LFG_BOOT_NOT_ELIGIBLE_S) - data << uint64(0); // player who caused error (in some cases). - - SendPacket(&data); -} - -void WorldSession::HandleGroupInviteOpcode(WorldPacket& recvData) -{ - ObjectGuid crossRealmGuid; // unused - - recvData.read_skip<uint32>(); // Non-zero in cross realm invites - recvData.read_skip<uint32>(); // Always 0 - - crossRealmGuid[2] = recvData.ReadBit(); - crossRealmGuid[7] = recvData.ReadBit(); - - uint8 realmLen = recvData.ReadBits(9); - - crossRealmGuid[3] = recvData.ReadBit(); - - uint8 nameLen = recvData.ReadBits(10); - - crossRealmGuid[5] = recvData.ReadBit(); - crossRealmGuid[4] = recvData.ReadBit(); - crossRealmGuid[6] = recvData.ReadBit(); - crossRealmGuid[0] = recvData.ReadBit(); - crossRealmGuid[1] = recvData.ReadBit(); + WorldPackets::Party::PartyCommandResult packet; - recvData.ReadByteSeq(crossRealmGuid[4]); - recvData.ReadByteSeq(crossRealmGuid[7]); - recvData.ReadByteSeq(crossRealmGuid[6]); + packet.Name = member; + packet.Command = uint8(operation); + packet.Result = uint8(res); + packet.ResultData = val; + packet.ResultGUID = ObjectGuid::Empty; - std::string memberName, realmName; - memberName = recvData.ReadString(nameLen); - realmName = recvData.ReadString(realmLen); // unused - - recvData.ReadByteSeq(crossRealmGuid[1]); - recvData.ReadByteSeq(crossRealmGuid[0]); - recvData.ReadByteSeq(crossRealmGuid[5]); - recvData.ReadByteSeq(crossRealmGuid[3]); - recvData.ReadByteSeq(crossRealmGuid[2]); - - // attempt add selected player - - // cheating - if (!normalizePlayerName(memberName)) - { - SendPartyResult(PARTY_OP_INVITE, memberName, ERR_BAD_PLAYER_NAME_S); - return; - } + SendPacket(packet.Write()); +} - Player* player = ObjectAccessor::FindPlayerByName(memberName); +void WorldSession::HandlePartyInviteOpcode(WorldPackets::Party::PartyInviteClient& packet) +{ + Player* player = ObjectAccessor::FindPlayerByName(packet.TargetName); // no player if (!player) { - SendPartyResult(PARTY_OP_INVITE, memberName, ERR_BAD_PLAYER_NAME_S); + SendPartyResult(PARTY_OP_INVITE, packet.TargetName, ERR_BAD_PLAYER_NAME_S); return; } // restrict invite to GMs if (!sWorld->getBoolConfig(CONFIG_ALLOW_GM_GROUP) && !GetPlayer()->IsGameMaster() && player->IsGameMaster()) { - SendPartyResult(PARTY_OP_INVITE, memberName, ERR_BAD_PLAYER_NAME_S); + SendPartyResult(PARTY_OP_INVITE, player->GetName(), ERR_BAD_PLAYER_NAME_S); return; } // can't group with if (!GetPlayer()->IsGameMaster() && !sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && GetPlayer()->GetTeam() != player->GetTeam()) { - SendPartyResult(PARTY_OP_INVITE, memberName, ERR_PLAYER_WRONG_FACTION); + SendPartyResult(PARTY_OP_INVITE, player->GetName(), ERR_PLAYER_WRONG_FACTION); return; } if (GetPlayer()->GetInstanceId() != 0 && player->GetInstanceId() != 0 && GetPlayer()->GetInstanceId() != player->GetInstanceId() && GetPlayer()->GetMapId() == player->GetMapId()) { - SendPartyResult(PARTY_OP_INVITE, memberName, ERR_TARGET_NOT_IN_INSTANCE_S); + SendPartyResult(PARTY_OP_INVITE, player->GetName(), ERR_TARGET_NOT_IN_INSTANCE_S); return; } // just ignore us if (player->GetInstanceId() != 0 && player->GetDungeonDifficultyID() != GetPlayer()->GetDungeonDifficultyID()) { - SendPartyResult(PARTY_OP_INVITE, memberName, ERR_IGNORING_YOU_S); + SendPartyResult(PARTY_OP_INVITE, player->GetName(), ERR_IGNORING_YOU_S); return; } if (player->GetSocial()->HasIgnore(GetPlayer()->GetGUID())) { - SendPartyResult(PARTY_OP_INVITE, memberName, ERR_IGNORING_YOU_S); + SendPartyResult(PARTY_OP_INVITE, player->GetName(), ERR_IGNORING_YOU_S); return; } - ObjectGuid invitedGuid = player->GetGUID(); - Group* group = GetPlayer()->GetGroup(); if (group && group->isBGGroup()) group = GetPlayer()->GetOriginalGroup(); @@ -155,67 +112,18 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket& recvData) Group* group2 = player->GetGroup(); if (group2 && group2->isBGGroup()) group2 = player->GetOriginalGroup(); + // player already in another group or invited if (group2 || player->GetGroupInvite()) { - SendPartyResult(PARTY_OP_INVITE, memberName, ERR_ALREADY_IN_GROUP_S); + SendPartyResult(PARTY_OP_INVITE, player->GetName(), ERR_ALREADY_IN_GROUP_S); if (group2) { // tell the player that they were invited but it failed as they were already in a group - WorldPacket data(SMSG_PARTY_INVITE, 45); - - data.WriteBit(0); - - data.WriteBit(invitedGuid[0]); - data.WriteBit(invitedGuid[3]); - data.WriteBit(invitedGuid[2]); - - data.WriteBit(0); // Inverse already in group - - data.WriteBit(invitedGuid[6]); - data.WriteBit(invitedGuid[5]); - - data.WriteBits(0, 9); // Realm name - - data.WriteBit(invitedGuid[4]); - - data.WriteBits(GetPlayer()->GetName().size(), 7); // Inviter name length - - data.WriteBits(0, 24); // Count 2 - - data.WriteBit(0); - - data.WriteBit(invitedGuid[1]); - data.WriteBit(invitedGuid[7]); - - data.FlushBits(); - - data.WriteByteSeq(invitedGuid[1]); - data.WriteByteSeq(invitedGuid[4]); - - data << int32(getMSTime()); - data << int32(0); - data << int32(0); - - data.WriteByteSeq(invitedGuid[6]); - data.WriteByteSeq(invitedGuid[0]); - data.WriteByteSeq(invitedGuid[2]); - data.WriteByteSeq(invitedGuid[3]); - - // for count2 { int32(0) } - - data.WriteByteSeq(invitedGuid[5]); - - // data.append(realm name); - - data.WriteByteSeq(invitedGuid[7]); - - data.WriteString(GetPlayer()->GetName()); // inviter name - - data << int32(0); - - player->GetSession()->SendPacket(&data); + WorldPackets::Party::PartyInvite partyInvite; + partyInvite.Initialize(GetPlayer(), packet.ProposedRoles, false); + player->GetSession()->SendPacket(partyInvite.Write()); } return; @@ -264,79 +172,21 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket& recvData) } } - // ok, we do it - WorldPacket data(SMSG_PARTY_INVITE, 45); - - data.WriteBit(0); - - data.WriteBit(invitedGuid[0]); - data.WriteBit(invitedGuid[3]); - data.WriteBit(invitedGuid[2]); - - data.WriteBit(1); // Inverse already in group - - data.WriteBit(invitedGuid[6]); - data.WriteBit(invitedGuid[5]); - - data.WriteBits(0, 9); // Realm name - - data.WriteBit(invitedGuid[4]); - - data.WriteBits(GetPlayer()->GetName().size(), 7); // Inviter name length - - data.WriteBits(0, 24); // Count 2 - - data.WriteBit(0); - - data.WriteBit(invitedGuid[1]); - data.WriteBit(invitedGuid[7]); - - data.FlushBits(); + WorldPackets::Party::PartyInvite partyInvite; + partyInvite.Initialize(GetPlayer(), packet.ProposedRoles, true); + player->GetSession()->SendPacket(partyInvite.Write()); - data.WriteByteSeq(invitedGuid[1]); - data.WriteByteSeq(invitedGuid[4]); - - data << int32(getMSTime()); - data << int32(0); - data << int32(0); - - data.WriteByteSeq(invitedGuid[6]); - data.WriteByteSeq(invitedGuid[0]); - data.WriteByteSeq(invitedGuid[2]); - data.WriteByteSeq(invitedGuid[3]); - - // for count2 { int32(0) } - - data.WriteByteSeq(invitedGuid[5]); - - // data.append(realm name); - - data.WriteByteSeq(invitedGuid[7]); - - data.WriteString(GetPlayer()->GetName()); - - data << int32(0); - - player->GetSession()->SendPacket(&data); - - SendPartyResult(PARTY_OP_INVITE, memberName, ERR_PARTY_RESULT_OK); + SendPartyResult(PARTY_OP_INVITE, player->GetName(), ERR_PARTY_RESULT_OK); } -void WorldSession::HandleGroupInviteResponseOpcode(WorldPacket& recvData) +void WorldSession::HandlePartyInviteResponseOpcode(WorldPackets::Party::PartyInviteResponse& packet) { - recvData.ReadBit(); // unk always 0 - bool accept = recvData.ReadBit(); - - // Never actually received? - /*if (accept) - recvData.read_skip<uint32>(); // unk*/ - Group* group = GetPlayer()->GetGroupInvite(); if (!group) return; - if (accept) + if (packet.Accept) { // Remove player from invitees in any case group->RemoveInvite(GetPlayer()); @@ -391,28 +241,22 @@ void WorldSession::HandleGroupInviteResponseOpcode(WorldPacket& recvData) return; // report - WorldPacket data(SMSG_GROUP_DECLINE, GetPlayer()->GetName().size()); - data << GetPlayer()->GetName(); - leader->GetSession()->SendPacket(&data); + WorldPackets::Party::GroupDecline decline(GetPlayer()->GetName()); + leader->GetSession()->SendPacket(decline.Write()); } } -void WorldSession::HandleGroupUninviteOpcode(WorldPacket& recvData) +void WorldSession::HandlePartyUninviteOpcode(WorldPackets::Party::PartyUninvite& packet) { - ObjectGuid guid; - std::string reason; - recvData >> guid; - recvData >> reason; - - //can't uninvite yourself - if (guid == GetPlayer()->GetGUID()) + // can't uninvite yourself + if (packet.TargetGUID == GetPlayer()->GetGUID()) { TC_LOG_ERROR("network", "WorldSession::HandleGroupUninviteGuidOpcode: leader %s (%s) tried to uninvite himself from the group.", GetPlayer()->GetName().c_str(), GetPlayer()->GetGUID().ToString().c_str()); return; } - PartyResult res = GetPlayer()->CanUninviteFromGroup(guid); + PartyResult res = GetPlayer()->CanUninviteFromGroup(packet.TargetGUID); if (res != ERR_PARTY_RESULT_OK) { SendPartyResult(PARTY_OP_UNINVITE, "", res); @@ -423,13 +267,13 @@ void WorldSession::HandleGroupUninviteOpcode(WorldPacket& recvData) // grp is checked already above in CanUninviteFromGroup() ASSERT(grp); - if (grp->IsMember(guid)) + if (grp->IsMember(packet.TargetGUID)) { - Player::RemoveFromGroup(grp, guid, GROUP_REMOVEMETHOD_KICK, GetPlayer()->GetGUID(), reason.c_str()); + Player::RemoveFromGroup(grp, packet.TargetGUID, GROUP_REMOVEMETHOD_KICK, GetPlayer()->GetGUID(), packet.Reason.c_str()); return; } - if (Player* player = grp->GetInvited(guid)) + if (Player* player = grp->GetInvited(packet.TargetGUID)) { player->UninviteFromGroup(); return; @@ -438,12 +282,9 @@ void WorldSession::HandleGroupUninviteOpcode(WorldPacket& recvData) SendPartyResult(PARTY_OP_UNINVITE, "", ERR_TARGET_NOT_IN_GROUP_S); } -void WorldSession::HandleGroupSetLeaderOpcode(WorldPacket& recvData) +void WorldSession::HandleSetPartyLeaderOpcode(WorldPackets::Party::SetPartyLeader& packet) { - ObjectGuid guid; - recvData >> guid; - - Player* player = ObjectAccessor::FindConnectedPlayer(guid); + Player* player = ObjectAccessor::FindConnectedPlayer(packet.TargetGUID); Group* group = GetPlayer()->GetGroup(); if (!group || !player) @@ -453,87 +294,35 @@ void WorldSession::HandleGroupSetLeaderOpcode(WorldPacket& recvData) return; // Everything's fine, accepted. - group->ChangeLeader(guid); + group->ChangeLeader(packet.TargetGUID, packet.PartyIndex); group->SendUpdate(); } -void WorldSession::HandleGroupSetRolesOpcode(WorldPacket& recvData) +void WorldSession::HandleSetRoleOpcode(WorldPackets::Party::SetRole& packet) { - uint32 newRole; - ObjectGuid guid1; // Assigner GUID - ObjectGuid guid2; // Target GUID - - guid1 = GetPlayer()->GetGUID(); - - 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_ROLE_CHANGED_INFORM, 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()) + WorldPackets::Party::RoleChangedInform roleChangedInform; + + Group* group = GetPlayer()->GetGroup(); + uint8 oldRole = group ? group->GetLfgRoles(packet.TargetGUID) : 0; + if (oldRole == packet.Role) + return; + + roleChangedInform.PartyIndex = packet.PartyIndex; + roleChangedInform.From = GetPlayer()->GetGUID(); + roleChangedInform.ChangedUnit = packet.TargetGUID; + roleChangedInform.OldRole = oldRole; + roleChangedInform.NewRole = packet.Role; + + 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.TargetGUID, packet.Role); } else - SendPacket(&data); + SendPacket(roleChangedInform.Write()); } -void WorldSession::HandleGroupDisbandOpcode(WorldPacket& /*recvData*/) +void WorldSession::HandleLeaveGroupOpcode(WorldPackets::Party::LeaveGroup& /*packet*/) { Group* grp = GetPlayer()->GetGroup(); if (!grp) @@ -554,13 +343,8 @@ void WorldSession::HandleGroupDisbandOpcode(WorldPacket& /*recvData*/) GetPlayer()->RemoveFromGroup(GROUP_REMOVEMETHOD_LEAVE); } -void WorldSession::HandleLootMethodOpcode(WorldPacket& recvData) +void WorldSession::HandleSetLootMethodOpcode(WorldPackets::Party::SetLootMethod& packet) { - uint32 lootMethod; - ObjectGuid lootMaster; - uint32 lootThreshold; - recvData >> lootMethod >> lootMaster >> lootThreshold; - Group* group = GetPlayer()->GetGroup(); if (!group) return; @@ -569,20 +353,20 @@ void WorldSession::HandleLootMethodOpcode(WorldPacket& recvData) if (!group->IsLeader(GetPlayer()->GetGUID())) return; - if (lootMethod > NEED_BEFORE_GREED) + if (packet.LootMethod > NEED_BEFORE_GREED) return; - if (lootThreshold < ITEM_QUALITY_UNCOMMON || lootThreshold > ITEM_QUALITY_ARTIFACT) + if (packet.LootThreshold < ITEM_QUALITY_UNCOMMON || packet.LootThreshold > ITEM_QUALITY_ARTIFACT) return; - if (lootMethod == MASTER_LOOT && !group->IsMember(lootMaster)) + if (packet.LootMethod == MASTER_LOOT && !group->IsMember(packet.LootMasterGUID)) return; /********************/ // everything's fine, do it - group->SetLootMethod((LootMethod)lootMethod); - group->SetMasterLooterGuid(lootMaster); - group->SetLootThreshold((ItemQualities)lootThreshold); + group->SetLootMethod((LootMethod)packet.LootMethod); + group->SetMasterLooterGuid(packet.LootMasterGUID); + group->SetLootThreshold((ItemQualities)packet.LootThreshold); group->SendUpdate(); } @@ -605,28 +389,16 @@ void WorldSession::HandleLootRoll(WorldPackets::Loot::LootRoll& packet) } } -void WorldSession::HandleMinimapPingOpcode(WorldPacket& recvData) +void WorldSession::HandleMinimapPingOpcode(WorldPackets::Party::MinimapPingClient& packet) { - TC_LOG_DEBUG("network", "WORLD: Received MSG_MINIMAP_PING"); - if (!GetPlayer()->GetGroup()) return; - float x, y; - recvData >> x; - recvData >> y; - - //TC_LOG_DEBUG("misc", "Received opcode MSG_MINIMAP_PING X: %f, Y: %f", x, y); - - /** error handling **/ - /********************/ - - // everything's fine, do it - WorldPacket data(SMSG_MINIMAP_PING, (8+4+4)); - data << GetPlayer()->GetGUID(); - data << float(x); - data << float(y); - GetPlayer()->GetGroup()->BroadcastPacket(&data, true, -1, GetPlayer()->GetGUID()); + WorldPackets::Party::MinimapPing minimapPing; + minimapPing.Sender = GetPlayer()->GetGUID(); + minimapPing.PositionX = packet.PositionX; + minimapPing.PositionY = packet.PositionY; + GetPlayer()->GetGroup()->BroadcastPacket(minimapPing.Write(), true, -1, GetPlayer()->GetGUID()); } void WorldSession::HandleRandomRollOpcode(WorldPackets::Misc::RandomRollClient& packet) @@ -643,8 +415,6 @@ void WorldSession::HandleRandomRollOpcode(WorldPackets::Misc::RandomRollClient& // everything's fine, do it roll = urand(minimum, maximum); - //TC_LOG_DEBUG("misc", "ROLL: MIN: %u, MAX: %u, ROLL: %u", minimum, maximum, roll); - WorldPackets::Misc::RandomRoll randomRoll; randomRoll.Min = minimum; randomRoll.Max = maximum; @@ -657,44 +427,31 @@ void WorldSession::HandleRandomRollOpcode(WorldPackets::Misc::RandomRollClient& SendPacket(randomRoll.Write()); } -void WorldSession::HandleRaidTargetUpdateOpcode(WorldPacket& recvData) +void WorldSession::HandleUpdateRaidTargetOpcode(WorldPackets::Party::UpdateRaidTarget& packet) { - TC_LOG_DEBUG("network", "WORLD: Received MSG_RAID_TARGET_UPDATE"); - Group* group = GetPlayer()->GetGroup(); if (!group) return; - uint8 x; - recvData >> x; - - /** error handling **/ - /********************/ - - // everything's fine, do it - if (x == 0xFF) // target icon request - group->SendTargetIconList(this); - else // target icon update + if (packet.Symbol == 0xFF) // target icon request + group->SendTargetIconList(this, packet.PartyIndex); + else // target icon update { if (group->isRaidGroup() && !group->IsLeader(GetPlayer()->GetGUID()) && !group->IsAssistant(GetPlayer()->GetGUID())) return; - ObjectGuid guid; - recvData >> guid; - - if (guid.IsPlayer()) + if (packet.Target.IsPlayer()) { - Player* target = ObjectAccessor::FindConnectedPlayer(guid); - + Player* target = ObjectAccessor::FindConnectedPlayer(packet.Target); if (!target || target->IsHostileTo(GetPlayer())) return; } - group->SetTargetIcon(x, _player->GetGUID(), guid); + group->SetTargetIcon(packet.Symbol, packet.Target, GetPlayer()->GetGUID(), packet.PartyIndex); } } -void WorldSession::HandleGroupRaidConvertOpcode(WorldPacket& recvData) +void WorldSession::HandleConvertRaidOpcode(WorldPackets::Party::ConvertRaid& packet) { Group* group = GetPlayer()->GetGroup(); if (!group) @@ -711,71 +468,56 @@ void WorldSession::HandleGroupRaidConvertOpcode(WorldPacket& recvData) SendPartyResult(PARTY_OP_INVITE, "", ERR_PARTY_RESULT_OK); // New 4.x: it is now possible to convert a raid to a group if member count is 5 or less - - bool toRaid; - recvData >> toRaid; - - if (toRaid) + if (packet.Raid) group->ConvertToRaid(); else group->ConvertToGroup(); } -void WorldSession::HandleGroupRequestJoinUpdates(WorldPacket& /*recvData*/) +void WorldSession::HandleRequestPartyJoinUpdates(WorldPackets::Party::RequestPartyJoinUpdates& packet) { Group* group = GetPlayer()->GetGroup(); if (!group) return; - // does some stuff. dunno what. + group->SendTargetIconList(this, packet.PartyIndex); + group->SendRaidMarkersChanged(this, packet.PartyIndex); } -void WorldSession::HandleGroupChangeSubGroupOpcode(WorldPacket& recvData) +void WorldSession::HandleChangeSubGroupOpcode(WorldPackets::Party::ChangeSubGroup& packet) { // we will get correct pointer for group here, so we don't have to check if group is BG raid Group* group = GetPlayer()->GetGroup(); if (!group) return; - std::string name; - uint8 groupNr; - recvData >> name; - recvData >> groupNr; - - if (groupNr >= MAX_RAID_SUBGROUPS) + if (packet.NewSubGroup >= MAX_RAID_SUBGROUPS) return; ObjectGuid senderGuid = GetPlayer()->GetGUID(); if (!group->IsLeader(senderGuid) && !group->IsAssistant(senderGuid)) return; - if (!group->HasFreeSlotSubGroup(groupNr)) + if (!group->HasFreeSlotSubGroup(packet.NewSubGroup)) return; - Player* movedPlayer = ObjectAccessor::FindConnectedPlayerByName(name); - ObjectGuid guid; - - if (movedPlayer) - guid = movedPlayer->GetGUID(); - else - { - CharacterDatabase.EscapeString(name); - guid = ObjectMgr::GetPlayerGUIDByName(name.c_str()); - } - - group->ChangeMembersGroup(guid, groupNr); + group->ChangeMembersGroup(packet.TargetGUID, packet.NewSubGroup); } -void WorldSession::HandleGroupSwapSubGroupOpcode(WorldPacket& recvData) +void WorldSession::HandleSwapSubGroupsOpcode(WorldPackets::Party::SwapSubGroups& packet) { - std::string unk1; - std::string unk2; + Group* group = GetPlayer()->GetGroup(); + if (!group) + return; - recvData >> unk1; - recvData >> unk2; + ObjectGuid senderGuid = GetPlayer()->GetGUID(); + if (!group->IsLeader(senderGuid) && !group->IsAssistant(senderGuid)) + return; + + group->SwapMembersGroups(packet.FirstTarget, packet.SecondTarget); } -void WorldSession::HandleGroupAssistantLeaderOpcode(WorldPacket& recvData) +void WorldSession::HandleSetAssistantLeaderOpcode(WorldPackets::Party::SetAssistantLeader& packet) { Group* group = GetPlayer()->GetGroup(); if (!group) @@ -784,12 +526,7 @@ void WorldSession::HandleGroupAssistantLeaderOpcode(WorldPacket& recvData) if (!group->IsLeader(GetPlayer()->GetGUID())) return; - ObjectGuid guid; - bool apply; - recvData >> guid; - recvData >> apply; - - group->SetGroupMemberFlag(guid, apply, MEMBER_FLAG_ASSISTANT); + group->SetGroupMemberFlag(packet.Target, packet.Apply, MEMBER_FLAG_ASSISTANT); } void WorldSession::HandlePartyAssignmentOpcode(WorldPacket& recvData) @@ -826,509 +563,103 @@ void WorldSession::HandlePartyAssignmentOpcode(WorldPacket& recvData) group->SendUpdate(); } -void WorldSession::HandleRaidReadyCheckOpcode(WorldPacket& recvData) +void WorldSession::HandleDoReadyCheckOpcode(WorldPackets::Party::DoReadyCheck& packet) { Group* group = GetPlayer()->GetGroup(); if (!group) return; - if (recvData.empty()) // request - { - /** error handling **/ - if (!group->IsLeader(GetPlayer()->GetGUID()) && !group->IsAssistant(GetPlayer()->GetGUID())) - return; - /********************/ - - // everything's fine, do it - WorldPacket data(SMSG_READY_CHECK_STARTED, 8); - data << GetPlayer()->GetGUID(); - group->BroadcastPacket(&data, false, -1); + /** error handling **/ + if (!group->IsLeader(GetPlayer()->GetGUID()) && !group->IsAssistant(GetPlayer()->GetGUID())) + return; + /********************/ - group->OfflineReadyCheck(); - } - else // answer - { - uint8 state; - recvData >> state; - - // everything's fine, do it - WorldPacket data(SMSG_READY_CHECK_RESPONSE, 9); - data << GetPlayer()->GetGUID(); - data << uint8(state); - group->BroadcastReadyCheck(&data); - } + // everything's fine, do it + group->StartReadyCheck(GetPlayer()->GetGUID(), packet.PartyIndex); } -void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacket* data) +void WorldSession::HandleReadyCheckResponseOpcode(WorldPackets::Party::ReadyCheckResponseClient& packet) { - uint32 mask = player->GetGroupUpdateFlag(); - - if (mask == GROUP_UPDATE_FLAG_NONE) + Group* group = GetPlayer()->GetGroup(); + if (!group) return; - std::set<uint32> const& phases = player->GetPhases(); - - if (mask & GROUP_UPDATE_FLAG_POWER_TYPE) // if update power type, update current/max power also - mask |= (GROUP_UPDATE_FLAG_CUR_POWER | GROUP_UPDATE_FLAG_MAX_POWER); - - if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE) // same for pets - mask |= (GROUP_UPDATE_FLAG_PET_CUR_POWER | GROUP_UPDATE_FLAG_PET_MAX_POWER); - - data->Initialize(SMSG_PARTY_MEMBER_STATE, 80); // average value - *data << player->GetPackGUID(); - *data << uint32(mask); - - if (mask & GROUP_UPDATE_FLAG_STATUS) - { - uint16 playerStatus = MEMBER_STATUS_ONLINE; - if (player->IsPvP()) - playerStatus |= MEMBER_STATUS_PVP; - - if (!player->IsAlive()) - { - if (player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST)) - playerStatus |= MEMBER_STATUS_GHOST; - else - playerStatus |= MEMBER_STATUS_DEAD; - } - - if (player->IsFFAPvP()) - playerStatus |= MEMBER_STATUS_PVP_FFA; - - if (player->isAFK()) - playerStatus |= MEMBER_STATUS_AFK; - - if (player->isDND()) - playerStatus |= MEMBER_STATUS_DND; - - *data << uint16(playerStatus); - } - - if (mask & GROUP_UPDATE_FLAG_CUR_HP) - *data << uint32(player->GetHealth()); - - if (mask & GROUP_UPDATE_FLAG_MAX_HP) - *data << uint32(player->GetMaxHealth()); - - Powers powerType = player->getPowerType(); - if (mask & GROUP_UPDATE_FLAG_POWER_TYPE) - *data << uint8(powerType); - - if (mask & GROUP_UPDATE_FLAG_CUR_POWER) - *data << uint16(player->GetPower(powerType)); - - if (mask & GROUP_UPDATE_FLAG_MAX_POWER) - *data << uint16(player->GetMaxPower(powerType)); - - if (mask & GROUP_UPDATE_FLAG_LEVEL) - *data << uint16(player->getLevel()); - - if (mask & GROUP_UPDATE_FLAG_ZONE) - *data << uint16(player->GetZoneId()); - - if (mask & GROUP_UPDATE_FLAG_UNK100) - *data << uint16(0); - - if (mask & GROUP_UPDATE_FLAG_POSITION) - { - *data << uint16(player->GetPositionX()); - *data << uint16(player->GetPositionY()); - *data << uint16(player->GetPositionZ()); - } - - if (mask & GROUP_UPDATE_FLAG_AURAS) - { - *data << uint8(0); - uint64 auramask = player->GetAuraUpdateMaskForRaid(); - *data << uint64(auramask); - *data << uint32(MAX_AURAS); // count - for (uint32 i = 0; i < MAX_AURAS; ++i) - { - if (auramask & (uint64(1) << i)) - { - AuraApplication const* aurApp = player->GetVisibleAura(i); - if (!aurApp) - { - *data << uint32(0); - *data << uint16(0); - continue; - } - - *data << uint32(aurApp->GetBase()->GetId()); - *data << uint16(aurApp->GetFlags()); - - if (aurApp->GetFlags() & AFLAG_SCALABLE) - { - for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) - { - if (AuraEffect const* eff = aurApp->GetBase()->GetEffect(i)) - *data << int32(eff->GetAmount()); - else - *data << int32(0); - } - } - } - } - } - - Pet* pet = player->GetPet(); - if (mask & GROUP_UPDATE_FLAG_PET_GUID) - { - if (pet) - *data << pet->GetGUID(); - else - *data << ObjectGuid::Empty; - } - - if (mask & GROUP_UPDATE_FLAG_PET_NAME) - { - if (pet) - *data << pet->GetName(); - else - *data << uint8(0); - } - - if (mask & GROUP_UPDATE_FLAG_PET_MODEL_ID) - { - if (pet) - *data << uint16(pet->GetDisplayId()); - else - *data << uint16(0); - } - - if (mask & GROUP_UPDATE_FLAG_PET_CUR_HP) - { - if (pet) - *data << uint32(pet->GetHealth()); - else - *data << uint32(0); - } - - if (mask & GROUP_UPDATE_FLAG_PET_MAX_HP) - { - if (pet) - *data << uint32(pet->GetMaxHealth()); - else - *data << uint32(0); - } - - if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE) - { - if (pet) - *data << uint8(pet->getPowerType()); - else - *data << uint8(0); - } - - if (mask & GROUP_UPDATE_FLAG_PET_CUR_POWER) - { - if (pet) - *data << uint16(pet->GetPower(pet->getPowerType())); - else - *data << uint16(0); - } - - if (mask & GROUP_UPDATE_FLAG_PET_MAX_POWER) - { - if (pet) - *data << uint16(pet->GetMaxPower(pet->getPowerType())); - else - *data << uint16(0); - } - - if (mask & GROUP_UPDATE_FLAG_PET_AURAS) - { - if (pet) - { - *data << uint8(0); - uint64 auramask = pet->GetAuraUpdateMaskForRaid(); - *data << uint64(auramask); - *data << uint32(MAX_AURAS); // count - for (uint32 i = 0; i < MAX_AURAS; ++i) - { - if (auramask & (uint64(1) << i)) - { - AuraApplication const* aurApp = pet->GetVisibleAura(i); - if (!aurApp) - { - *data << uint32(0); - *data << uint16(0); - continue; - } - - *data << uint32(aurApp->GetBase()->GetId()); - *data << uint16(aurApp->GetFlags()); - - if (aurApp->GetFlags() & AFLAG_SCALABLE) - { - for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) - { - if (AuraEffect const* eff = aurApp->GetBase()->GetEffect(i)) - *data << int32(eff->GetAmount()); - else - *data << int32(0); - } - } - } - } - } - else - { - *data << uint8(0); - *data << uint64(0); - } - } - - if (mask & GROUP_UPDATE_FLAG_VEHICLE_SEAT) - { - if (Vehicle* veh = player->GetVehicle()) - *data << uint32(veh->GetVehicleInfo()->SeatID[player->m_movementInfo.transport.seat]); - else - *data << uint32(0); - - } - - if (mask & GROUP_UPDATE_FLAG_PHASE) - { - *data << uint32(phases.empty() ? 8 : 0); - *data << uint32(phases.size()); - for (std::set<uint32>::const_iterator itr = phases.begin(); itr != phases.end(); ++itr) - *data << uint16(*itr); - } + // everything's fine, do it + group->SetMemberReadyCheck(GetPlayer()->GetGUID(), packet.IsReady); } -/*this procedure handles clients CMSG_REQUEST_PARTY_MEMBER_STATS request*/ -void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket& recvData) +void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPackets::Party::RequestPartyMemberStats& packet) { - ObjectGuid Guid; - recvData >> Guid; + WorldPackets::Party::PartyMemberStats partyMemberStats; - Player* player = ObjectAccessor::FindConnectedPlayer(Guid); + Player* player = ObjectAccessor::FindConnectedPlayer(packet.TargetGUID); if (!player) { - WorldPacket data(SMSG_PARTY_MEMBER_STATE, 3 + 4 + 2); - data << uint8(0); // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related - data << Guid.WriteAsPacked(); - data << uint32(GROUP_UPDATE_FLAG_STATUS); - data << uint16(MEMBER_STATUS_OFFLINE); - SendPacket(&data); - return; - } - - Pet* pet = player->GetPet(); - Powers powerType = player->getPowerType(); - std::set<uint32> const& phases = player->GetPhases(); - - WorldPacket data(SMSG_PARTY_MEMBER_STATE, 4 + 2 + 2 + 2 + 1 + 2 * 6 + 8 + 1 + 8); - data << uint8(0); // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related - data << player->GetPackGUID(); - - uint32 updateFlags = GROUP_UPDATE_FLAG_STATUS | GROUP_UPDATE_FLAG_CUR_HP | GROUP_UPDATE_FLAG_MAX_HP - | GROUP_UPDATE_FLAG_CUR_POWER | GROUP_UPDATE_FLAG_MAX_POWER | GROUP_UPDATE_FLAG_LEVEL - | GROUP_UPDATE_FLAG_ZONE | GROUP_UPDATE_FLAG_POSITION | GROUP_UPDATE_FLAG_AURAS - | GROUP_UPDATE_FLAG_PET_NAME | GROUP_UPDATE_FLAG_PET_MODEL_ID | GROUP_UPDATE_FLAG_PET_AURAS; - - if (powerType != POWER_MANA) - updateFlags |= GROUP_UPDATE_FLAG_POWER_TYPE; - - if (pet) - updateFlags |= GROUP_UPDATE_FLAG_PET_GUID | GROUP_UPDATE_FLAG_PET_CUR_HP | GROUP_UPDATE_FLAG_PET_MAX_HP - | GROUP_UPDATE_FLAG_PET_POWER_TYPE | GROUP_UPDATE_FLAG_PET_CUR_POWER | GROUP_UPDATE_FLAG_PET_MAX_POWER; - - if (player->GetVehicle()) - updateFlags |= GROUP_UPDATE_FLAG_VEHICLE_SEAT; - - if (!phases.empty()) - updateFlags |= GROUP_UPDATE_FLAG_PHASE; - - uint16 playerStatus = MEMBER_STATUS_ONLINE; - if (player->IsPvP()) - playerStatus |= MEMBER_STATUS_PVP; - - if (!player->IsAlive()) - { - if (player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST)) - playerStatus |= MEMBER_STATUS_GHOST; - else - playerStatus |= MEMBER_STATUS_DEAD; - } - - if (player->IsFFAPvP()) - playerStatus |= MEMBER_STATUS_PVP_FFA; - - if (player->isAFK()) - playerStatus |= MEMBER_STATUS_AFK; - - if (player->isDND()) - playerStatus |= MEMBER_STATUS_DND; - - data << uint32(updateFlags); - data << uint16(playerStatus); // GROUP_UPDATE_FLAG_STATUS - data << uint32(player->GetHealth()); // GROUP_UPDATE_FLAG_CUR_HP - data << uint32(player->GetMaxHealth()); // GROUP_UPDATE_FLAG_MAX_HP - if (updateFlags & GROUP_UPDATE_FLAG_POWER_TYPE) - data << uint8(powerType); - - data << uint16(player->GetPower(powerType)); // GROUP_UPDATE_FLAG_CUR_POWER - data << uint16(player->GetMaxPower(powerType)); // GROUP_UPDATE_FLAG_MAX_POWER - data << uint16(player->getLevel()); // GROUP_UPDATE_FLAG_LEVEL - data << uint16(player->GetZoneId()); // GROUP_UPDATE_FLAG_ZONE - data << uint16(player->GetPositionX()); // GROUP_UPDATE_FLAG_POSITION - data << uint16(player->GetPositionY()); // GROUP_UPDATE_FLAG_POSITION - data << uint16(player->GetPositionZ()); // GROUP_UPDATE_FLAG_POSITION - - // GROUP_UPDATE_FLAG_AURAS - data << uint8(1); - uint64 auramask = 0; - size_t maskPos = data.wpos(); - data << uint64(auramask); // placeholder - data << uint32(MAX_AURAS); // count - - for (uint8 i = 0; i < MAX_AURAS; ++i) - { - if (AuraApplication const* aurApp = player->GetVisibleAura(i)) - { - auramask |= (uint64(1) << i); - - data << uint32(aurApp->GetBase()->GetId()); - data << uint16(aurApp->GetFlags()); - - if (aurApp->GetFlags() & AFLAG_SCALABLE) - { - for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) - { - if (AuraEffect const* eff = aurApp->GetBase()->GetEffect(i)) - data << int32(eff->GetAmount()); - else - data << int32(0); - } - } - } - } - - data.put<uint64>(maskPos, auramask); // GROUP_UPDATE_FLAG_AURAS - - if (updateFlags & GROUP_UPDATE_FLAG_PET_GUID) - data << pet->GetGUID(); - - data << std::string(pet ? pet->GetName() : ""); // GROUP_UPDATE_FLAG_PET_NAME - data << uint16(pet ? pet->GetDisplayId() : 0); // GROUP_UPDATE_FLAG_PET_MODEL_ID - - if (updateFlags & GROUP_UPDATE_FLAG_PET_CUR_HP) - data << uint32(pet->GetHealth()); - - if (updateFlags & GROUP_UPDATE_FLAG_PET_MAX_HP) - data << uint32(pet->GetMaxHealth()); - - if (updateFlags & GROUP_UPDATE_FLAG_PET_POWER_TYPE) - data << (uint8)pet->getPowerType(); - - if (updateFlags & GROUP_UPDATE_FLAG_PET_CUR_POWER) - data << uint16(pet->GetPower(pet->getPowerType())); - - if (updateFlags & GROUP_UPDATE_FLAG_PET_MAX_POWER) - data << uint16(pet->GetMaxPower(pet->getPowerType())); - - // GROUP_UPDATE_FLAG_PET_AURAS - uint64 petAuraMask = 0; - data << uint8(1); - maskPos = data.wpos(); - data << uint64(petAuraMask); // placeholder - data << uint32(MAX_AURAS); // count - if (pet) - { - for (uint8 i = 0; i < MAX_AURAS; ++i) - { - if (AuraApplication const* aurApp = pet->GetVisibleAura(i)) - { - petAuraMask |= (uint64(1) << i); - - data << uint32(aurApp->GetBase()->GetId()); - data << uint16(aurApp->GetFlags()); - - if (aurApp->GetFlags() & AFLAG_SCALABLE) - { - for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) - { - if (AuraEffect const* eff = aurApp->GetBase()->GetEffect(i)) - data << int32(eff->GetAmount()); - else - data << int32(0); - } - } - } - } - } - - data.put<uint64>(maskPos, petAuraMask); // GROUP_UPDATE_FLAG_PET_AURAS - - if (updateFlags & GROUP_UPDATE_FLAG_VEHICLE_SEAT) - data << uint32(player->GetVehicle()->GetVehicleInfo()->SeatID[player->m_movementInfo.transport.seat]); - - if (updateFlags & GROUP_UPDATE_FLAG_PHASE) - { - data << uint32(phases.empty() ? 8 : 0); - data << uint32(phases.size()); - for (std::set<uint32>::const_iterator itr = phases.begin(); itr != phases.end(); ++itr) - data << uint16(*itr); + partyMemberStats.MemberStats.GUID = packet.TargetGUID; + partyMemberStats.MemberStats.Status = MEMBER_STATUS_OFFLINE; } + else + partyMemberStats.Initialize(player); - SendPacket(&data); + SendPacket(partyMemberStats.Write()); } -void WorldSession::HandleRequestRaidInfoOpcode(WorldPacket& /*recvData*/) +void WorldSession::HandleRequestRaidInfoOpcode(WorldPackets::Party::RequestRaidInfo& /*packet*/) { // every time the player checks the character screen _player->SendRaidInfo(); } -void WorldSession::HandleOptOutOfLootOpcode(WorldPacket& recvData) +void WorldSession::HandleOptOutOfLootOpcode(WorldPackets::Party::OptOutOfLoot& packet) { - bool passOnLoot; - recvData >> passOnLoot; // 1 always pass, 0 do not pass - // ignore if player not loaded if (!GetPlayer()) // needed because STATUS_AUTHED { - if (passOnLoot) + if (packet.PassOnLoot) TC_LOG_ERROR("network", "CMSG_OPT_OUT_OF_LOOT value<>0 for not-loaded character!"); return; } - GetPlayer()->SetPassOnGroupLoot(passOnLoot != 0); + GetPlayer()->SetPassOnGroupLoot(packet.PassOnLoot); } -void WorldSession::HandleRolePollBeginOpcode(WorldPacket& recvData) +void WorldSession::HandleInitiateRolePoll(WorldPackets::Party::InitiateRolePoll& packet) { Group* group = GetPlayer()->GetGroup(); if (!group) return; - if (recvData.empty()) - { - if (!group->IsLeader(GetPlayer()->GetGUID()) && !group->IsAssistant(GetPlayer()->GetGUID())) - return; + if (!group->IsLeader(GetPlayer()->GetGUID()) && !group->IsAssistant(GetPlayer()->GetGUID())) + return; - ObjectGuid guid = GetPlayer()->GetGUID(); - - WorldPacket data(SMSG_ROLE_POLL_INFORM, 8); - data.WriteBit(guid[1]); - data.WriteBit(guid[5]); - data.WriteBit(guid[7]); - data.WriteBit(guid[3]); - data.WriteBit(guid[2]); - data.WriteBit(guid[4]); - data.WriteBit(guid[0]); - data.WriteBit(guid[6]); - data.WriteByteSeq(guid[4]); - data.WriteByteSeq(guid[7]); - data.WriteByteSeq(guid[0]); - data.WriteByteSeq(guid[5]); - data.WriteByteSeq(guid[1]); - data.WriteByteSeq(guid[6]); - data.WriteByteSeq(guid[2]); - data.WriteByteSeq(guid[3]); - - GetPlayer()->GetGroup()->BroadcastPacket(&data, true); - } + ObjectGuid guid = GetPlayer()->GetGUID(); + + WorldPackets::Party::RolePollInform rolePollInform; + rolePollInform.From = GetPlayer()->GetGUID(); + rolePollInform.PartyIndex = packet.PartyIndex; + group->BroadcastPacket(rolePollInform.Write(), true); +} + +void WorldSession::HandleSetEveryoneIsAssistant(WorldPackets::Party::SetEveryoneIsAssistant& packet) +{ + Group* group = GetPlayer()->GetGroup(); + if (!group) + return; + + if (!group->IsLeader(GetPlayer()->GetGUID())) + return; + + group->SetEveryoneIsAssistant(packet.EveryoneIsAssistant); +} + +void WorldSession::HandleClearRaidMarker(WorldPackets::Party::ClearRaidMarker& packet) +{ + Group* group = GetPlayer()->GetGroup(); + if (!group) + return; + + if (group->isRaidGroup() && !group->IsLeader(GetPlayer()->GetGUID()) && !group->IsAssistant(GetPlayer()->GetGUID())) + return; + + group->DeleteRaidMarker(packet.MarkerId); } |
