void Group::_setLeader(ObjectGuid guid) { member_citerator slot = _getMemberCSlot(guid); if (slot == m_memberSlots.end()) return; if (!isBGGroup()) { uint32 slot_lowguid = slot->guid.GetCounter(); uint32 leader_lowguid = m_leaderGuid.GetCounter(); // TODO: set a time limit to have this function run rarely cause it can be slow CharacterDatabase.BeginTransaction(); // update the group's bound instances when changing leaders // remove all permanent binds from the group // in the DB also remove solo binds that will be replaced with permbinds // from the new leader CharacterDatabase.PExecute( "DELETE FROM group_instance WHERE leaderguid='%u' AND (permanent = 1 OR " "instance IN (SELECT instance FROM character_instance WHERE guid = '%u')" ")", leader_lowguid, slot_lowguid); Player* player = sObjectMgr.GetPlayer(slot->guid); if (player) { for (BoundInstancesMap::iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end();) { if (itr->second.perm) { itr->second.state->RemoveGroup(this); m_boundInstances.erase(itr++); } else ++itr; } } // update the group's solo binds to the new leader CharacterDatabase.PExecute("UPDATE group_instance SET leaderGuid='%u' WHERE leaderGuid = '%u'", slot_lowguid, leader_lowguid); // copy the permanent binds from the new leader to the group // overwriting the solo binds with permanent ones if necessary // in the DB those have been deleted already Player::ConvertInstancesToGroup(player, this, slot->guid); // update the group leader CharacterDatabase.PExecute("UPDATE groups SET leaderGuid='%u' WHERE groupId='%u'", slot_lowguid, m_Id); CharacterDatabase.CommitTransaction(); } _updateLeaderFlag(true); m_leaderGuid = slot->guid; m_leaderName = slot->name; _updateLeaderFlag(); }
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(); }
bool Group::_setMainTank(ObjectGuid guid) { if (m_mainTankGuid == guid) return false; if (guid) { member_citerator slot = _getMemberCSlot(guid); if (slot == m_memberSlots.end()) return false; if (m_mainAssistantGuid == guid) _setMainAssistant(ObjectGuid()); } m_mainTankGuid = guid; if (!isBGGroup()) CharacterDatabase.PExecute("UPDATE groups SET mainTank='%u' WHERE groupId='%u'", m_mainTankGuid.GetCounter(), m_Id); return true; }