Let dz handle client removal timers

Remove all clients inside a dz, not just those assigned to instance
This commit is contained in:
hg
2020-05-07 18:38:43 -04:00
parent 9102bb1478
commit eccc79e4ce
6 changed files with 54 additions and 15 deletions
+48 -4
View File
@@ -353,13 +353,40 @@ void DynamicZone::RemoveCharacter(uint32_t character_id)
SendInstanceCharacterChange(character_id, true); // start client kick timer
}
void DynamicZone::RemoveAllCharacters()
void DynamicZone::RemoveAllCharacters(bool enable_removal_timers)
{
// caller has to notify clients of instance change since we don't hold members here
if (m_instance_id != 0)
if (GetInstanceID() == 0)
{
database.RemoveClientsFromInstance(m_instance_id);
return;
}
if (enable_removal_timers)
{
// just remove all clients in bulk instead of only characters assigned to the instance
if (IsCurrentZoneDzInstance())
{
for (const auto& client_iter : entity_list.GetClientList())
{
if (client_iter.second)
{
client_iter.second->SetDzRemovalTimer(true);
}
}
}
else if (GetInstanceID() != 0)
{
uint32_t packsize = sizeof(ServerDzCharacter_Struct);
auto pack = std::unique_ptr<ServerPacket>(new ServerPacket(ServerOP_DzRemoveAllCharacters, packsize));
auto packbuf = reinterpret_cast<ServerDzCharacter_Struct*>(pack->pBuffer);
packbuf->zone_id = GetZoneID();
packbuf->instance_id = GetInstanceID();
packbuf->remove = true;
packbuf->character_id = 0;
worldserver.SendPacket(pack.get());
}
}
database.RemoveClientsFromInstance(GetInstanceID());
}
void DynamicZone::SaveInstanceMembersToDatabase(const std::unordered_set<uint32_t> character_ids)
@@ -402,6 +429,7 @@ void DynamicZone::SendInstanceCharacterChange(uint32_t character_id, bool remove
uint32_t packsize = sizeof(ServerDzCharacter_Struct);
auto pack = std::unique_ptr<ServerPacket>(new ServerPacket(ServerOP_DzCharacterChange, packsize));
auto packbuf = reinterpret_cast<ServerDzCharacter_Struct*>(pack->pBuffer);
packbuf->zone_id = GetZoneID();
packbuf->instance_id = GetInstanceID();
packbuf->remove = removed;
packbuf->character_id = character_id;
@@ -503,5 +531,21 @@ void DynamicZone::HandleWorldMessage(ServerPacket* pack)
}
break;
}
case ServerOP_DzRemoveAllCharacters:
{
auto buf = reinterpret_cast<ServerDzCharacter_Struct*>(pack->pBuffer);
if (buf->remove)
{
for (const auto& client_list_iter : entity_list.GetClientList())
{
Client* client = client_list_iter.second;
if (client)
{
client->SetDzRemovalTimer(true);
}
}
}
break;
}
}
}
+1 -1
View File
@@ -83,7 +83,7 @@ public:
bool IsCurrentZoneDzInstance() const;
bool IsInstanceID(uint32_t instance_id) const;
bool IsValid() const { return m_instance_id != 0; }
void RemoveAllCharacters();
void RemoveAllCharacters(bool enable_removal_timers = true);
void RemoveCharacter(uint32_t character_id);
void SendInstanceCharacterChange(uint32_t character_id, bool removed);
void SetCompass(const DynamicZoneLocation& location, bool update_db = false);
+1 -10
View File
@@ -494,16 +494,7 @@ bool Expedition::AddMember(const std::string& add_char_name, uint32_t add_char_i
void Expedition::RemoveAllMembers(bool enable_removal_timers, bool update_dz_expire_time)
{
m_dynamiczone.RemoveAllCharacters();
if (enable_removal_timers)
{
// expedition holds member list (not dz) so inform dz members to start kick timers
for (const auto& member : m_members)
{
m_dynamiczone.SendInstanceCharacterChange(member.char_id, true);
}
}
m_dynamiczone.RemoveAllCharacters(enable_removal_timers);
if (update_dz_expire_time && RuleB(Expedition, EmptyDzShutdownEnabled))
{
+1
View File
@@ -2917,6 +2917,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
break;
}
case ServerOP_DzCharacterChange:
case ServerOP_DzRemoveAllCharacters:
{
DynamicZone::HandleWorldMessage(pack);
break;