diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/Groups/Group.cpp | 39 | ||||
| -rw-r--r-- | src/server/game/Groups/Group.h | 1 |
2 files changed, 29 insertions, 11 deletions
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 6908d7649d3..053b1e2bd09 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -538,6 +538,7 @@ bool Group::RemoveMember(ObjectGuid guid, const RemoveMethod& method /*= GROUP_R if (GetMembersCount() > ((isBGGroup() || isLFGGroup() || isBFGroup()) ? 1u : 2u)) { Player* player = ObjectAccessor::FindConnectedPlayer(guid); + uint8 partyIndex = 0; if (player) { // Battleground group handling @@ -549,7 +550,10 @@ bool Group::RemoveMember(ObjectGuid guid, const RemoveMethod& method /*= GROUP_R if (player->GetOriginalGroup() == this) player->SetOriginalGroup(NULL); else + { player->SetGroup(NULL); + partyIndex = 1; + } // quest related GO state dependent from raid membership player->UpdateForQuestWorldObjects(); @@ -607,9 +611,11 @@ bool Group::RemoveMember(ObjectGuid guid, const RemoveMethod& method /*= GROUP_R } // Update subgroups + int32 updateSequenceNumber = 1; member_witerator slot = _getMemberWSlot(guid); if (slot != m_memberSlots.end()) { + updateSequenceNumber = slot->updateSequenceNumber; SubGroupCounterDecrease(slot->group); m_memberSlots.erase(slot); } @@ -642,6 +648,11 @@ bool Group::RemoveMember(ObjectGuid guid, const RemoveMethod& method /*= GROUP_R if (m_memberMgr.getSize() < ((isLFGGroup() || isBGGroup()) ? 1u : 2u)) Disband(); + else if (player) + { + // send update to removed player too so party frames are destroyed clientside + SendUpdateDestroyGroupToPlayer(player, partyIndex, updateSequenceNumber); + } return true; } @@ -793,23 +804,17 @@ void Group::Disband(bool hideDestroy /* = false */) if (!hideDestroy) player->SendDirectMessage(WorldPackets::Party::GroupDestroyed().Write()); + uint8 disbandedPartyIndex = 0; + //we already removed player from group and in player->GetGroup() is his original group, send update if (Group* group = player->GetGroup()) { group->SendUpdate(); - } - else - { - WorldPackets::Party::PartyUpdate partyUpdate; - partyUpdate.PartyFlags = GROUP_FLAG_DESTROYED; - partyUpdate.PartyIndex = 0; // this was the original group if player->GetGroup() returned nullptr - partyUpdate.PartyType = GROUP_TYPE_NONE; - partyUpdate.PartyGUID = m_guid; - partyUpdate.MyIndex = -1; - partyUpdate.SequenceNum = citr->updateSequenceNumber; - player->GetSession()->SendPacket(partyUpdate.Write()); + disbandedPartyIndex = 1; } + SendUpdateDestroyGroupToPlayer(player, disbandedPartyIndex, citr->updateSequenceNumber); + _homebindIfInstance(player); } RollId.clear(); @@ -1504,6 +1509,18 @@ void Group::SendUpdateToPlayer(ObjectGuid playerGUID, MemberSlot* slot) player->GetSession()->SendPacket(partyUpdate.Write()); } +void Group::SendUpdateDestroyGroupToPlayer(Player* player, uint8 partyIndex, int32 sequenceNum) const +{ + WorldPackets::Party::PartyUpdate partyUpdate; + partyUpdate.PartyFlags = GROUP_FLAG_DESTROYED; + partyUpdate.PartyIndex = partyIndex; + partyUpdate.PartyType = GROUP_TYPE_NONE; + partyUpdate.PartyGUID = m_guid; + partyUpdate.MyIndex = -1; + partyUpdate.SequenceNum = sequenceNum; + player->GetSession()->SendPacket(partyUpdate.Write()); +} + void Group::UpdatePlayerOutOfRange(Player* player) { if (!player || !player->IsInWorld()) diff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h index 86476d0bb81..6f92ca17fe9 100644 --- a/src/server/game/Groups/Group.h +++ b/src/server/game/Groups/Group.h @@ -347,6 +347,7 @@ class TC_GAME_API Group void SendTargetIconList(WorldSession* session, int8 partyIndex = 0); void SendUpdate(); void SendUpdateToPlayer(ObjectGuid playerGUID, MemberSlot* slot = NULL); + void SendUpdateDestroyGroupToPlayer(Player* player, uint8 partyIndex, int32 sequenceNum) const; void UpdatePlayerOutOfRange(Player* player); template<class Worker> |
