Set new expedition leader on leader disconnect

Only choose an online member as new leader on leader changes

Keep leader online status updated in zone expedition caches

Currently this will also trigger a leader change if the leader goes
linkdead. On live the character retains leadership while linkdead
and a new one is only chosen once kicked offline
This commit is contained in:
hg 2020-07-11 09:12:32 -04:00
parent 15235d77f7
commit ba9ce2335e

View File

@ -581,6 +581,13 @@ void Expedition::SetMemberStatus(Client* client, ExpeditionMemberStatus status)
{
UpdateMemberStatus(client->CharacterID(), status);
SendWorldMemberStatus(client->CharacterID(), status);
// we either changed leader status here or leader was already offline and
// a member coming online needs to trigger a leader change
if (m_leader.status == ExpeditionMemberStatus::Offline)
{
ChooseNewLeader();
}
}
}
@ -607,13 +614,18 @@ void Expedition::UpdateMemberStatus(uint32_t update_member_id, ExpeditionMemberS
member_client->QueuePacket(outapp_member_status.get());
}
}
if (update_member_id == m_leader.char_id)
{
m_leader.status = status;
}
}
bool Expedition::ChooseNewLeader()
{
for (const auto& member : m_members)
{
if (member.char_id != m_leader.char_id)
if (member.char_id != m_leader.char_id && member.status == ExpeditionMemberStatus::Online)
{
LogExpeditionsModerate("Replacing leader [{}] with [{}]", m_leader.name, member.name);
SetNewLeader(member.char_id, member.name);
@ -1111,8 +1123,7 @@ void Expedition::SetNewLeader(uint32_t new_leader_id, const std::string& new_lea
void Expedition::ProcessLeaderChanged(uint32_t new_leader_id, const std::string& new_leader_name)
{
m_leader.char_id = new_leader_id;
m_leader.name = new_leader_name;
m_leader = { new_leader_id, new_leader_name, ExpeditionMemberStatus::Online };
// update each client's expedition window in this zone
auto outapp_leader = CreateLeaderNamePacket();