aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Groups/Group.cpp39
-rw-r--r--src/server/game/Groups/Group.h1
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>