From ba9ce2335e985f8764dff96c664e562a9f765541 Mon Sep 17 00:00:00 2001 From: hg <4683435+hgtw@users.noreply.github.com> Date: Sat, 11 Jul 2020 09:12:32 -0400 Subject: [PATCH] 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 --- zone/expedition.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/zone/expedition.cpp b/zone/expedition.cpp index 7f93204bf..c04d8159b 100644 --- a/zone/expedition.cpp +++ b/zone/expedition.cpp @@ -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();