Implement world cache to monitor expeditions

This implements a small cache in world to track expedition states.

This fixes expired expeditions being left in zone caches unless the
expedition's dz instance was running to detect it (or unless an
expedition was deleted via a client using /kickplayers). This was also
leaving clients in a ghost expedition that no longer actually existed
This commit is contained in:
hg
2020-05-25 22:05:02 -04:00
parent 33f2336244
commit dcbcc5a156
9 changed files with 299 additions and 25 deletions
+6 -3
View File
@@ -1272,7 +1272,7 @@ void Expedition::ProcessLockoutUpdate(
}
}
void Expedition::SendUpdatesToZoneMembers(bool clear)
void Expedition::SendUpdatesToZoneMembers(bool clear, bool message_on_clear)
{
if (!m_members.empty())
{
@@ -1289,7 +1289,7 @@ void Expedition::SendUpdatesToZoneMembers(bool clear)
member_client->QueuePacket(outapp_info.get());
member_client->QueuePacket(outapp_members.get());
member_client->SendExpeditionLockoutTimers();
if (clear)
if (clear && message_on_clear)
{
member_client->MessageString(
Chat::Yellow, EXPEDITION_REMOVED, member_client->GetName(), m_expedition_name.c_str()
@@ -1605,6 +1605,7 @@ void Expedition::HandleWorldMessage(ServerPacket* pack)
break;
}
case ServerOP_ExpeditionDeleted:
case ServerOP_ExpeditionExpired:
{
auto buf = reinterpret_cast<ServerExpeditionID_Struct*>(pack->pBuffer);
auto expedition = Expedition::FindCachedExpeditionByID(buf->expedition_id);
@@ -1612,7 +1613,9 @@ void Expedition::HandleWorldMessage(ServerPacket* pack)
{
if (!zone->IsZone(buf->sender_zone_id, buf->sender_instance_id))
{
expedition->SendUpdatesToZoneMembers(true);
// expired deletions should be silent
bool notify_members = (pack->opcode == ServerOP_ExpeditionDeleted);
expedition->SendUpdatesToZoneMembers(true, notify_members);
}
// remove even from sender zone
+1 -1
View File
@@ -154,7 +154,7 @@ private:
void SaveMembers(ExpeditionRequest& request);
void SendClientExpeditionInvite(Client* client, const std::string& inviter_name, const std::string& swap_remove_name);
void SendLeaderMessage(Client* leader_client, uint16_t chat_type, uint32_t string_id, const std::initializer_list<std::string>& parameters = {});
void SendUpdatesToZoneMembers(bool clear = false);
void SendUpdatesToZoneMembers(bool clear = false, bool message_on_clear = true);
void SendWorldDzLocationUpdate(uint16_t server_opcode, const DynamicZoneLocation& location);
void SendWorldExpeditionUpdate(bool destroyed = false);
void SendWorldGetOnlineMembers();
+1
View File
@@ -2901,6 +2901,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
}
case ServerOP_ExpeditionCreate:
case ServerOP_ExpeditionDeleted:
case ServerOP_ExpeditionExpired:
case ServerOP_ExpeditionLeaderChanged:
case ServerOP_ExpeditionLockout:
case ServerOP_ExpeditionLockState: