void Group::ChangeLeader(const uint64 &guid) { _setLeader(guid); WorldPacket data(SMSG_GROUP_SET_LEADER, (m_members[_getMemberIndex(guid)].name.size()+1)); data << m_members[_getMemberIndex(guid)].name; BroadcastPacket(&data); SendUpdate(); }
void Group::ChangeLeader(ObjectGuid guid) { member_citerator slot = _getMemberCSlot(guid); if (slot == m_memberSlots.end()) return; _setLeader(guid); WorldPacket data(SMSG_GROUP_SET_LEADER, slot->name.size() + 1); data << slot->name; BroadcastPacket(&data, true); SendUpdate(); }
void Group::_chooseLeader(bool offline /*= false*/) { if (GetMembersCount() < GetMembersMinCount()) return; ObjectGuid first = ObjectGuid(); // First available: if no suitable canditates are found ObjectGuid chosen = ObjectGuid(); // Player matching prio creteria for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) { if (citr->guid == m_leaderGuid) continue; // Prioritize online players Player* player = sObjectMgr.GetPlayer(citr->guid); if (!player || !player->GetSession() || player->GetGroup() != this) continue; // Prioritize assistants for raids if (isRaidGroup() && !citr->assistant) { if (first.IsEmpty()) first = citr->guid; continue; } chosen = citr->guid; break; } if (chosen.IsEmpty()) chosen = first; // If we are choosing a new leader due to inactivity, check if everyone is offline first if (offline && chosen.IsEmpty()) return; // Still nobody online... if (chosen.IsEmpty()) chosen = m_memberSlots.front().guid; // Do announce if we are choosing a new leader due to old one being offline return (offline ? ChangeLeader(chosen) : _setLeader(chosen)); }
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; }
bool Group::_removeMember(const uint64 &guid) { Player *player = objmgr.GetPlayer(guid); if (player) { player->RemoveAreaAurasByOthers(); player->RemoveAreaAurasFromGroup(); player->groupInfo.group = NULL; } _removeRolls(guid); m_members.erase(m_members.begin()+_getMemberIndex(guid)); sDatabase.PExecute("DELETE FROM `group_member` WHERE `memberGuid`='%u'", GUID_LOPART(guid)); if(m_leaderGuid == guid) // leader was removed { if(m_members.size() > 0) _setLeader(m_members[0].guid); return true; } return false; }