mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-16 05:11:29 +00:00
Let dz handle client removal timers
Remove all clients inside a dz, not just those assigned to instance
This commit is contained in:
parent
9102bb1478
commit
eccc79e4ce
@ -156,6 +156,7 @@
|
|||||||
#define ServerOP_ExpeditionDzZoneIn 0x040c
|
#define ServerOP_ExpeditionDzZoneIn 0x040c
|
||||||
|
|
||||||
#define ServerOP_DzCharacterChange 0x0450
|
#define ServerOP_DzCharacterChange 0x0450
|
||||||
|
#define ServerOP_DzRemoveAllCharacters 0x0451
|
||||||
|
|
||||||
#define ServerOP_LSInfo 0x1000
|
#define ServerOP_LSInfo 0x1000
|
||||||
#define ServerOP_LSStatus 0x1001
|
#define ServerOP_LSStatus 0x1001
|
||||||
@ -2072,6 +2073,7 @@ struct ServerDzLocation_Struct {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct ServerDzCharacter_Struct {
|
struct ServerDzCharacter_Struct {
|
||||||
|
uint16 zone_id;
|
||||||
uint16 instance_id;
|
uint16 instance_id;
|
||||||
uint8 remove; // 0: added 1: removed
|
uint8 remove; // 0: added 1: removed
|
||||||
uint32 character_id;
|
uint32 character_id;
|
||||||
|
|||||||
@ -1398,6 +1398,7 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ServerOP_DzCharacterChange:
|
case ServerOP_DzCharacterChange:
|
||||||
|
case ServerOP_DzRemoveAllCharacters:
|
||||||
{
|
{
|
||||||
auto buf = reinterpret_cast<ServerDzCharacter_Struct*>(pack->pBuffer);
|
auto buf = reinterpret_cast<ServerDzCharacter_Struct*>(pack->pBuffer);
|
||||||
ZoneServer* instance_zs = zoneserver_list.FindByInstanceID(buf->instance_id);
|
ZoneServer* instance_zs = zoneserver_list.FindByInstanceID(buf->instance_id);
|
||||||
|
|||||||
@ -353,13 +353,40 @@ void DynamicZone::RemoveCharacter(uint32_t character_id)
|
|||||||
SendInstanceCharacterChange(character_id, true); // start client kick timer
|
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 (GetInstanceID() == 0)
|
||||||
if (m_instance_id != 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)
|
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);
|
uint32_t packsize = sizeof(ServerDzCharacter_Struct);
|
||||||
auto pack = std::unique_ptr<ServerPacket>(new ServerPacket(ServerOP_DzCharacterChange, packsize));
|
auto pack = std::unique_ptr<ServerPacket>(new ServerPacket(ServerOP_DzCharacterChange, packsize));
|
||||||
auto packbuf = reinterpret_cast<ServerDzCharacter_Struct*>(pack->pBuffer);
|
auto packbuf = reinterpret_cast<ServerDzCharacter_Struct*>(pack->pBuffer);
|
||||||
|
packbuf->zone_id = GetZoneID();
|
||||||
packbuf->instance_id = GetInstanceID();
|
packbuf->instance_id = GetInstanceID();
|
||||||
packbuf->remove = removed;
|
packbuf->remove = removed;
|
||||||
packbuf->character_id = character_id;
|
packbuf->character_id = character_id;
|
||||||
@ -503,5 +531,21 @@ void DynamicZone::HandleWorldMessage(ServerPacket* pack)
|
|||||||
}
|
}
|
||||||
break;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -83,7 +83,7 @@ public:
|
|||||||
bool IsCurrentZoneDzInstance() const;
|
bool IsCurrentZoneDzInstance() const;
|
||||||
bool IsInstanceID(uint32_t instance_id) const;
|
bool IsInstanceID(uint32_t instance_id) const;
|
||||||
bool IsValid() const { return m_instance_id != 0; }
|
bool IsValid() const { return m_instance_id != 0; }
|
||||||
void RemoveAllCharacters();
|
void RemoveAllCharacters(bool enable_removal_timers = true);
|
||||||
void RemoveCharacter(uint32_t character_id);
|
void RemoveCharacter(uint32_t character_id);
|
||||||
void SendInstanceCharacterChange(uint32_t character_id, bool removed);
|
void SendInstanceCharacterChange(uint32_t character_id, bool removed);
|
||||||
void SetCompass(const DynamicZoneLocation& location, bool update_db = false);
|
void SetCompass(const DynamicZoneLocation& location, bool update_db = false);
|
||||||
|
|||||||
@ -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)
|
void Expedition::RemoveAllMembers(bool enable_removal_timers, bool update_dz_expire_time)
|
||||||
{
|
{
|
||||||
m_dynamiczone.RemoveAllCharacters();
|
m_dynamiczone.RemoveAllCharacters(enable_removal_timers);
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (update_dz_expire_time && RuleB(Expedition, EmptyDzShutdownEnabled))
|
if (update_dz_expire_time && RuleB(Expedition, EmptyDzShutdownEnabled))
|
||||||
{
|
{
|
||||||
|
|||||||
@ -2917,6 +2917,7 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ServerOP_DzCharacterChange:
|
case ServerOP_DzCharacterChange:
|
||||||
|
case ServerOP_DzRemoveAllCharacters:
|
||||||
{
|
{
|
||||||
DynamicZone::HandleWorldMessage(pack);
|
DynamicZone::HandleWorldMessage(pack);
|
||||||
break;
|
break;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user