aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Groups/Group.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Groups/Group.cpp')
-rw-r--r--src/server/game/Groups/Group.cpp46
1 files changed, 19 insertions, 27 deletions
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp
index 24b2111796d..b6a1903da95 100644
--- a/src/server/game/Groups/Group.cpp
+++ b/src/server/game/Groups/Group.cpp
@@ -55,7 +55,7 @@ Loot* Roll::getLoot()
return getTarget();
}
-Group::Group() : m_leaderGuid(), m_leaderName(""), m_groupFlags(GROUP_FLAG_NONE),
+Group::Group() : m_leaderGuid(), m_leaderName(""), m_groupFlags(GROUP_FLAG_NONE), m_groupCategory(GROUP_CATEGORY_HOME),
m_dungeonDifficulty(DIFFICULTY_NORMAL), m_raidDifficulty(DIFFICULTY_NORMAL_RAID), m_legacyRaidDifficulty(DIFFICULTY_10_N),
m_bgGroup(nullptr), m_bfGroup(nullptr), m_lootMethod(FREE_FOR_ALL), m_lootThreshold(ITEM_QUALITY_UNCOMMON), m_looterGuid(),
m_masterLooterGuid(), m_subGroupsCounts(nullptr), m_guid(), m_maxEnchantingLevel(0), m_dbStoreId(0),
@@ -105,7 +105,10 @@ bool Group::Create(Player* leader)
leader->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_GROUP_LEADER);
if (isBGGroup() || isBFGroup())
+ {
m_groupFlags = GROUP_MASK_BGRAID;
+ m_groupCategory = GROUP_CATEGORY_INSTANCE;
+ }
if (m_groupFlags & GROUP_FLAG_RAID)
_initRaidSubGroupsCounter();
@@ -227,6 +230,7 @@ void Group::LoadMemberFromDB(ObjectGuid::LowType guidLow, uint8 memberFlags, uin
void Group::ConvertToLFG()
{
m_groupFlags = GroupFlags(m_groupFlags | GROUP_FLAG_LFG | GROUP_FLAG_LFG_RESTRICTED);
+ m_groupCategory = GROUP_CATEGORY_INSTANCE;
m_lootMethod = GROUP_LOOT;
if (!isBGGroup() && !isBFGroup())
{
@@ -392,7 +396,6 @@ bool Group::AddMember(Player* player)
member.group = subGroup;
member.flags = 0;
member.roles = 0;
- member.updateSequenceNumber = 1;
member.readyChecked = false;
m_memberSlots.push_back(member);
@@ -409,6 +412,9 @@ bool Group::AddMember(Player* player)
else //if player is not in group, then call set group
player->SetGroup(this, subGroup);
+ player->SetPartyType(m_groupCategory, GROUP_TYPE_NORMAL);
+ player->ResetGroupUpdateSequenceIfNeeded(this);
+
// if the same group invites the player back, cancel the homebind timer
player->m_InstanceValid = player->CheckInstanceValidity(false);
@@ -538,7 +544,6 @@ 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
@@ -550,15 +555,14 @@ 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();
}
+ player->SetPartyType(m_groupCategory, GROUP_TYPE_NONE);
+
WorldPacket data;
if (method == GROUP_REMOVEMETHOD_KICK || method == GROUP_REMOVEMETHOD_KICK_LFG)
@@ -611,11 +615,9 @@ 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);
}
@@ -651,7 +653,7 @@ bool Group::RemoveMember(ObjectGuid guid, const RemoveMethod& method /*= GROUP_R
else if (player)
{
// send update to removed player too so party frames are destroyed clientside
- SendUpdateDestroyGroupToPlayer(player, partyIndex, updateSequenceNumber);
+ SendUpdateDestroyGroupToPlayer(player);
}
return true;
@@ -794,26 +796,16 @@ void Group::Disband(bool hideDestroy /* = false */)
player->SetGroup(NULL);
}
+ player->SetPartyType(m_groupCategory, GROUP_TYPE_NONE);
+
// quest related GO state dependent from raid membership
if (isRaidGroup())
player->UpdateForQuestWorldObjects();
- if (!player->GetSession())
- continue;
-
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;
- }
-
- SendUpdateDestroyGroupToPlayer(player, disbandedPartyIndex, citr->updateSequenceNumber);
+ SendUpdateDestroyGroupToPlayer(player);
_homebindIfInstance(player);
}
@@ -1428,13 +1420,13 @@ void Group::SendUpdateToPlayer(ObjectGuid playerGUID, MemberSlot* slot)
WorldPackets::Party::PartyUpdate partyUpdate;
partyUpdate.PartyFlags = m_groupFlags;
- partyUpdate.PartyIndex = (player->GetOriginalGroup() && player->GetOriginalGroup() != this) ? 1 : 0; // 0 = original group, 1 = instance/bg group
+ partyUpdate.PartyIndex = m_groupCategory;
partyUpdate.PartyType = IsCreated() ? GROUP_TYPE_NORMAL : GROUP_TYPE_NONE;
partyUpdate.PartyGUID = m_guid;
partyUpdate.LeaderGUID = m_leaderGuid;
- partyUpdate.SequenceNum = slot->updateSequenceNumber++; // 3.3, value increases every time this packet gets sent
+ partyUpdate.SequenceNum = player->NextGroupUpdateSequenceNumber(m_groupCategory);
partyUpdate.MyIndex = -1;
uint8 index = 0;
@@ -1509,15 +1501,15 @@ void Group::SendUpdateToPlayer(ObjectGuid playerGUID, MemberSlot* slot)
player->GetSession()->SendPacket(partyUpdate.Write());
}
-void Group::SendUpdateDestroyGroupToPlayer(Player* player, uint8 partyIndex, int32 sequenceNum) const
+void Group::SendUpdateDestroyGroupToPlayer(Player* player) const
{
WorldPackets::Party::PartyUpdate partyUpdate;
partyUpdate.PartyFlags = GROUP_FLAG_DESTROYED;
- partyUpdate.PartyIndex = partyIndex;
+ partyUpdate.PartyIndex = m_groupCategory;
partyUpdate.PartyType = GROUP_TYPE_NONE;
partyUpdate.PartyGUID = m_guid;
partyUpdate.MyIndex = -1;
- partyUpdate.SequenceNum = sequenceNum;
+ partyUpdate.SequenceNum = player->NextGroupUpdateSequenceNumber(m_groupCategory);
player->GetSession()->SendPacket(partyUpdate.Write());
}