From 11a81d8e8afb1c5f23ba5062b57f288d131d9a83 Mon Sep 17 00:00:00 2001 From: Alex King <89047260+Kinglykrab@users.noreply.github.com> Date: Sun, 3 Dec 2023 12:40:54 -0500 Subject: [PATCH] [Commands] Cleanup #zonebootup and #zoneshutdown Commands (#3729) # Notes - Cleanup messages and logic. --- common/servertalk.h | 12 +++---- world/console.cpp | 20 ++++++------ world/zoneserver.cpp | 39 +++++++++++----------- zone/gm_commands/zonebootup.cpp | 54 ++++++++++++++++++++++--------- zone/gm_commands/zoneshutdown.cpp | 53 ++++++++++++++++++------------ zone/worldserver.cpp | 35 +++++++++----------- 6 files changed, 123 insertions(+), 90 deletions(-) diff --git a/common/servertalk.h b/common/servertalk.h index 1e286bfc7..1fafb7efa 100644 --- a/common/servertalk.h +++ b/common/servertalk.h @@ -461,12 +461,12 @@ struct SPackSendQueue { uchar buffer[0]; }; -struct ServerZoneStateChange_struct { - uint32 ZoneServerID; - char adminname[64]; - uint32 zoneid; - uint16 instanceid; - bool makestatic; +struct ServerZoneStateChange_Struct { + uint32 zone_server_id; + uint32 zone_id; + uint16 instance_id; + bool is_static; + char admin_name[64]; }; struct ServerZoneIncomingClient_Struct { diff --git a/world/console.cpp b/world/console.cpp index 70356d7a5..24778e02e 100644 --- a/world/console.cpp +++ b/world/console.cpp @@ -578,25 +578,25 @@ void ConsoleZoneShutdown( strcpy(&tmpname[1], connection->UserName().c_str()); auto pack = new ServerPacket; - pack->size = sizeof(ServerZoneStateChange_struct); + pack->size = sizeof(ServerZoneStateChange_Struct); pack->pBuffer = new uchar[pack->size]; - memset(pack->pBuffer, 0, sizeof(ServerZoneStateChange_struct)); - ServerZoneStateChange_struct *s = (ServerZoneStateChange_struct *) pack->pBuffer; + memset(pack->pBuffer, 0, sizeof(ServerZoneStateChange_Struct)); + auto *s = (ServerZoneStateChange_Struct *) pack->pBuffer; pack->opcode = ServerOP_ZoneShutdown; - strcpy(s->adminname, tmpname); + strcpy(s->admin_name, tmpname); if (Strings::IsNumber(args[0])) { - s->ZoneServerID = Strings::ToInt(args[0]); + s->zone_server_id = Strings::ToInt(args[0]); } else { - s->zoneid = ZoneID(args[0].c_str()); + s->zone_id = ZoneID(args[0].c_str()); } ZoneServer *zs = 0; - if (s->ZoneServerID != 0) { - zs = zoneserver_list.FindByID(s->ZoneServerID); + if (s->zone_server_id != 0) { + zs = zoneserver_list.FindByID(s->zone_server_id); } - else if (s->zoneid != 0) { - zs = zoneserver_list.FindByName(ZoneName(s->zoneid)); + else if (s->zone_id != 0) { + zs = zoneserver_list.FindByName(ZoneName(s->zone_id)); } else { connection->SendLine("Error: ZoneShutdown: neither ID nor name specified"); diff --git a/world/zoneserver.cpp b/world/zoneserver.cpp index 07b09f351..4dc1e1609 100644 --- a/world/zoneserver.cpp +++ b/world/zoneserver.cpp @@ -720,15 +720,15 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) { break; } case ServerOP_ZoneShutdown: { - auto s = (ServerZoneStateChange_struct*) pack->pBuffer; + auto *s = (ServerZoneStateChange_Struct*) pack->pBuffer; ZoneServer* zs = 0; - if (s->ZoneServerID) { - zs = zoneserver_list.FindByID(s->ZoneServerID); - } else if (s->zoneid) { - zs = zoneserver_list.FindByName(ZoneName(s->zoneid)); + if (s->zone_server_id) { + zs = zoneserver_list.FindByID(s->zone_server_id); + } else if (s->zone_id) { + zs = zoneserver_list.FindByName(ZoneName(s->zone_id)); } else { zoneserver_list.SendEmoteMessage( - s->adminname, + s->admin_name, 0, AccountStatus::Player, Chat::White, @@ -738,7 +738,7 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) { if (!zs) { zoneserver_list.SendEmoteMessage( - s->adminname, + s->admin_name, 0, AccountStatus::Player, Chat::White, @@ -751,8 +751,8 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) { break; } case ServerOP_ZoneBootup: { - auto s = (ServerZoneStateChange_struct*) pack->pBuffer; - zoneserver_list.SOPZoneBootup(s->adminname, s->ZoneServerID, ZoneName(s->zoneid), s->makestatic); + auto *s = (ServerZoneStateChange_Struct*) pack->pBuffer; + zoneserver_list.SOPZoneBootup(s->admin_name, s->zone_server_id, ZoneName(s->zone_id), s->is_static); break; } case ServerOP_ZoneStatus: { @@ -1606,20 +1606,23 @@ void ZoneServer::ChangeWID(uint32 iCharID, uint32 iWID) { void ZoneServer::TriggerBootup(uint32 in_zone_id, uint32 in_instance_id, const char* admin_name, bool is_static_zone) { - is_booting_up = true; + is_booting_up = true; zone_server_zone_id = in_zone_id; - instance_id = in_instance_id; + instance_id = in_instance_id; + + auto pack = new ServerPacket(ServerOP_ZoneBootup, sizeof(ServerZoneStateChange_Struct)); + auto *s = (ServerZoneStateChange_Struct*) pack->pBuffer; + + s->zone_server_id = zone_server_id; + + s->zone_id = in_zone_id ? in_zone_id : GetZoneID(); + s->instance_id = in_instance_id; + s->is_static = is_static_zone; - auto pack = new ServerPacket(ServerOP_ZoneBootup, sizeof(ServerZoneStateChange_struct)); - auto s = (ServerZoneStateChange_struct*) pack->pBuffer; - s->ZoneServerID = zone_server_id; if (admin_name) { - strn0cpy(s->adminname, admin_name, sizeof(s->adminname)); + strn0cpy(s->admin_name, admin_name, sizeof(s->admin_name)); } - s->zoneid = in_zone_id ? in_zone_id : GetZoneID(); - s->instanceid = in_instance_id; - s->makestatic = is_static_zone; SendPacket(pack); delete pack; LSBootUpdate(in_zone_id, in_instance_id); diff --git a/zone/gm_commands/zonebootup.cpp b/zone/gm_commands/zonebootup.cpp index d071d9426..1a1a91f5d 100755 --- a/zone/gm_commands/zonebootup.cpp +++ b/zone/gm_commands/zonebootup.cpp @@ -5,21 +5,43 @@ extern WorldServer worldserver; void command_zonebootup(Client *c, const Seperator *sep) { - if (!worldserver.Connected()) { - c->Message(Chat::White, "Error: World server disconnected"); + const int arguments = sep->argnum; + if (arguments < 2 || !sep->IsNumber(1)) { + c->Message(Chat::White, "Usage: #zonebootup [Zone Server ID] [Zone ID|Zone Short Name] [Instance ID]"); + return; } - else if (sep->arg[2][0] == 0) { - c->Message(Chat::White, "Usage: #zonebootup ZoneServerID# zoneshortname"); - } - else { - auto pack = new ServerPacket(ServerOP_ZoneBootup, sizeof(ServerZoneStateChange_struct)); - ServerZoneStateChange_struct *s = (ServerZoneStateChange_struct *) pack->pBuffer; - s->ZoneServerID = Strings::ToInt(sep->arg[1]); - strcpy(s->adminname, c->GetName()); - s->zoneid = ZoneID(sep->arg[2]); - s->makestatic = (bool) (strcasecmp(sep->arg[3], "static") == 0); - worldserver.SendPacket(pack); - safe_delete(pack); - } -} + if (!worldserver.Connected()) { + c->Message(Chat::White, "World server disconnected."); + return; + } + + const uint32 zone_server_id = Strings::ToUnsignedInt(sep->arg[1]); + const uint32 zone_id = Strings::IsNumber(sep->arg[2]) ? Strings::ToUnsignedInt(sep->arg[2]) : ZoneID(sep->arg[2]); + const bool is_static = arguments > 2 ? !strcasecmp(sep->arg[3], "static") : false; + const uint16 instance_id = arguments > 3 ? static_cast(Strings::ToUnsignedInt(sep->arg[4])) : 0; + + if (!zone_id) { + c->Message( + Chat::White, + fmt::format( + "Zone '{}' does not exist.", + sep->arg[1] + ).c_str() + ); + return; + } + + auto pack = new ServerPacket(ServerOP_ZoneBootup, sizeof(ServerZoneStateChange_Struct)); + auto *s = (ServerZoneStateChange_Struct *) pack->pBuffer; + + s->zone_server_id = zone_server_id; + s->zone_id = zone_id; + s->instance_id = instance_id; + s->is_static = is_static; + + strn0cpy(s->admin_name, c->GetName(), sizeof(s->admin_name)); + + worldserver.SendPacket(pack); + safe_delete(pack); +} diff --git a/zone/gm_commands/zoneshutdown.cpp b/zone/gm_commands/zoneshutdown.cpp index 31b09849b..b8141faed 100755 --- a/zone/gm_commands/zoneshutdown.cpp +++ b/zone/gm_commands/zoneshutdown.cpp @@ -5,26 +5,37 @@ extern WorldServer worldserver; void command_zoneshutdown(Client *c, const Seperator *sep) { - if (!worldserver.Connected()) { - c->Message(Chat::White, "Error: World server disconnected"); + const int arguments = sep->argnum; + if (!arguments) { + c->Message(Chat::White, "Usage: #zoneshutdown [Zone ID|Zone Short Name]"); + return; } - else if (sep->arg[1][0] == 0) { - c->Message(Chat::White, "Usage: #zoneshutdown zoneshortname"); - } - else { - auto pack = new ServerPacket( - ServerOP_ZoneShutdown, - sizeof(ServerZoneStateChange_struct)); - ServerZoneStateChange_struct *s = (ServerZoneStateChange_struct *) pack->pBuffer; - strcpy(s->adminname, c->GetName()); - if (sep->arg[1][0] >= '0' && sep->arg[1][0] <= '9') { - s->ZoneServerID = Strings::ToInt(sep->arg[1]); - } - else { - s->zoneid = ZoneID(sep->arg[1]); - } - worldserver.SendPacket(pack); - safe_delete(pack); - } -} + if (!worldserver.Connected()) { + c->Message(Chat::White, "World server disconnected."); + return; + } + + const uint32 zone_id = sep->IsNumber(1) ? Strings::ToUnsignedInt(sep->arg[1]) : ZoneID(sep->arg[1]); + + if (!zone_id) { + c->Message( + Chat::White, + fmt::format( + "Zone '{}' does not exist.", + sep->arg[1] + ).c_str() + ); + return; + } + + auto pack = new ServerPacket(ServerOP_ZoneShutdown, sizeof(ServerZoneStateChange_Struct)); + auto *s = (ServerZoneStateChange_Struct *) pack->pBuffer; + + s->zone_id = zone_id; + + strn0cpy(s->admin_name, c->GetName(), sizeof(s->admin_name)); + + worldserver.SendPacket(pack); + safe_delete(pack); +} diff --git a/zone/worldserver.cpp b/zone/worldserver.cpp index 01e03450b..8c81abfdb 100644 --- a/zone/worldserver.cpp +++ b/zone/worldserver.cpp @@ -550,15 +550,14 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) break; } case ServerOP_ZoneShutdown: { - if (pack->size != sizeof(ServerZoneStateChange_struct)) { - std::cout << "Wrong size on ServerOP_ZoneShutdown. Got: " << pack->size << ", Expected: " << sizeof(ServerZoneStateChange_struct) << std::endl; + if (pack->size != sizeof(ServerZoneStateChange_Struct)) { + LogError("Wrong size on ServerOP_ZoneShutdown. Got: [{}] Expected: [{}]", pack->size, sizeof(ServerZoneStateChange_Struct)); break; } - // Annouce the change to the world + if (!is_zone_loaded) { SetZoneData(0); - } - else { + } else { SendEmoteMessage( 0, 0, @@ -569,27 +568,24 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) ).c_str() ); - ServerZoneStateChange_struct* zst = (ServerZoneStateChange_struct *)pack->pBuffer; - std::cout << "Zone shutdown by " << zst->adminname << std::endl; + auto *s = (ServerZoneStateChange_Struct *) pack->pBuffer; + LogInfo("Zone shutdown by {}.", s->admin_name); Zone::Shutdown(); } break; } case ServerOP_ZoneBootup: { - if (pack->size != sizeof(ServerZoneStateChange_struct)) { - std::cout << "Wrong size on ServerOP_ZoneBootup. Got: " << pack->size << ", Expected: " << sizeof(ServerZoneStateChange_struct) << std::endl; + if (pack->size != sizeof(ServerZoneStateChange_Struct)) { + LogError("Wrong size on ServerOP_ZoneShutdown. Got: [{}] Expected: [{}]", pack->size, sizeof(ServerZoneStateChange_Struct)); break; } - ServerZoneStateChange_struct* zst = (ServerZoneStateChange_struct *)pack->pBuffer; + + auto *s = (ServerZoneStateChange_Struct *) pack->pBuffer; if (is_zone_loaded) { SetZoneData(zone->GetZoneID(), zone->GetInstanceID()); - if (zst->zoneid == zone->GetZoneID()) { - // This packet also doubles as "incoming client" notification, lets not shut down before they get here -// zone->StartShutdownTimer(AUTHENTICATION_TIMEOUT * 1000); - } - else { + if (s->zone_id != zone->GetZoneID()) { SendEmoteMessage( - zst->adminname, + s->admin_name, 0, Chat::White, fmt::format( @@ -601,10 +597,11 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) break; } - if (zst->adminname[0] != 0) - std::cout << "Zone bootup by " << zst->adminname << std::endl; + if (s->admin_name[0] != 0) { + LogInfo("Zone bootup by {}.", s->admin_name); + } - Zone::Bootup(zst->zoneid, zst->instanceid, zst->makestatic); + Zone::Bootup(s->zone_id, s->instance_id, s->is_static); break; } case ServerOP_ZoneIncClient: {