Core/Groups: Send PartyUpdate to all players leaving group, not only on disband
Closes #18757
This commit is contained in:
@@ -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,22 +804,16 @@ 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();
|
||||
disbandedPartyIndex = 1;
|
||||
}
|
||||
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());
|
||||
}
|
||||
|
||||
SendUpdateDestroyGroupToPlayer(player, disbandedPartyIndex, citr->updateSequenceNumber);
|
||||
|
||||
_homebindIfInstance(player);
|
||||
}
|
||||
@@ -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())
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user