bool Group::_removeMember(ObjectGuid guid) { Player* player = sObjectMgr.GetPlayer(guid); if (player) { // if we are removing player from battleground raid if (isBGGroup()) player->RemoveFromBattleGroundRaid(); else { // we can remove player who is in battleground from his original group if (player->GetOriginalGroup() == this) player->SetOriginalGroup(nullptr); else player->SetGroup(nullptr); } } member_witerator slot = _getMemberWSlot(guid); if (slot != m_memberSlots.end()) { SubGroupCounterDecrease(slot->group); m_memberSlots.erase(slot); } if (!isBGGroup()) CharacterDatabase.PExecute("DELETE FROM group_member WHERE memberGuid='%u'", guid.GetCounter()); if (m_leaderGuid == guid) // leader was removed { _updateLeaderFlag(true); if (GetMembersCount() > 0) _setLeader(m_memberSlots.front().guid); return true; } return false; }
// allows setting subgroup for offline members void Group::ChangeMembersGroup(ObjectGuid guid, uint8 group) { if (!isRaidGroup()) return; Player* player = sObjectMgr.GetPlayer(guid); if (!player) { uint8 prevSubGroup = GetMemberGroup(guid); if (prevSubGroup == group) return; if (_setMembersGroup(guid, group)) { SubGroupCounterDecrease(prevSubGroup); SendUpdate(); } } else // This methods handles itself groupcounter decrease ChangeMembersGroup(player, group); }
// only for online members void Group::ChangeMembersGroup(Player* player, uint8 group) { if (!player || !isRaidGroup()) return; uint8 prevSubGroup = player->GetSubGroup(); if (prevSubGroup == group) return; if (_setMembersGroup(player->GetObjectGuid(), group)) { if (player->GetGroup() == this) player->GetGroupRef().setSubGroup(group); // if player is in BG raid, it is possible that he is also in normal raid - and that normal raid is stored in m_originalGroup reference else { prevSubGroup = player->GetOriginalSubGroup(); player->GetOriginalGroupRef().setSubGroup(group); } SubGroupCounterDecrease(prevSubGroup); SendUpdate(); } }