From b0405714274bb201117377accba940f451e594a6 Mon Sep 17 00:00:00 2001 From: Alex King <89047260+Kinglykrab@users.noreply.github.com> Date: Sat, 29 Mar 2025 15:44:08 -0400 Subject: [PATCH] [Commands] Add Instance Support to #zoneshutdown (#4807) * [Commands] Add Instance Support to #zoneshutdown * Update zoneserver.cpp * Update zoneshutdown.cpp --- world/zoneserver.cpp | 4 +- zone/command.cpp | 2 +- zone/gm_commands/zoneshutdown.cpp | 68 +++++++++++++++++++++++++------ 3 files changed, 59 insertions(+), 15 deletions(-) diff --git a/world/zoneserver.cpp b/world/zoneserver.cpp index 9716bc7c7..4fcdbccd5 100644 --- a/world/zoneserver.cpp +++ b/world/zoneserver.cpp @@ -729,13 +729,15 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) { zs = zoneserver_list.FindByID(s->zone_server_id); } else if (s->zone_id) { zs = zoneserver_list.FindByName(ZoneName(s->zone_id)); + } else if (s->instance_id) { + zs = zoneserver_list.FindByInstanceID(s->instance_id); } else { zoneserver_list.SendEmoteMessage( s->admin_name, 0, AccountStatus::Player, Chat::White, - "Error: SOP_ZoneShutdown: neither ID nor name specified" + "Error: SOP_ZoneShutdown: Zone ID, Instance ID, nor Zone Short Name specified" ); } diff --git a/zone/command.cpp b/zone/command.cpp index c34e37c7c..569d846bc 100644 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -245,7 +245,7 @@ int command_init(void) command_add("zonebootup", "[ZoneServerID] [shortname] - Make a zone server boot a specific zone", AccountStatus::GMLeadAdmin, command_zonebootup) || command_add("zoneinstance", "[Instance ID] [X] [Y] [Z] - Teleport to specified Instance by ID (coordinates are optional)", AccountStatus::Guide, command_zone_instance) || command_add("zoneshard", "[zone] [instance_id] - Teleport explicitly to a zone shard", AccountStatus::Player, command_zone_shard) || - command_add("zoneshutdown", "[shortname] - Shut down a zone server", AccountStatus::GMLeadAdmin, command_zoneshutdown) || + command_add("zoneshutdown", "[instance|zone] [Instance ID|Zone ID|Zone Short Name] - Shut down a zone server by Instance ID, Zone ID, or Zone Short Name", AccountStatus::GMLeadAdmin, command_zoneshutdown) || command_add("zsave", " Saves zheader to the database", AccountStatus::QuestTroupe, command_zsave) ) { command_deinit(); diff --git a/zone/gm_commands/zoneshutdown.cpp b/zone/gm_commands/zoneshutdown.cpp index b8141faed..c62e5a0b9 100755 --- a/zone/gm_commands/zoneshutdown.cpp +++ b/zone/gm_commands/zoneshutdown.cpp @@ -6,8 +6,18 @@ extern WorldServer worldserver; void command_zoneshutdown(Client *c, const Seperator *sep) { const int arguments = sep->argnum; - if (!arguments) { - c->Message(Chat::White, "Usage: #zoneshutdown [Zone ID|Zone Short Name]"); + if (arguments < 2) { + c->Message(Chat::White, "Usage: #zoneshutdown instance [Instance ID]"); + c->Message(Chat::White, "Usage: #zoneshutdown zone [Zone ID|Zone Short Name]"); + return; + } + + bool is_instance = !strcasecmp(sep->arg[1], "instance"); + bool is_zone = !strcasecmp(sep->arg[1], "zone"); + + if (!is_instance && !is_zone) { + c->Message(Chat::White, "Usage: #zoneshutdown instance [Instance ID]"); + c->Message(Chat::White, "Usage: #zoneshutdown zone [Zone ID|Zone Short Name]"); return; } @@ -16,23 +26,55 @@ void command_zoneshutdown(Client *c, const Seperator *sep) return; } - const uint32 zone_id = sep->IsNumber(1) ? Strings::ToUnsignedInt(sep->arg[1]) : ZoneID(sep->arg[1]); + uint32 zone_id = 0; + uint16 instance_id = 0; + std::string message = ""; - if (!zone_id) { - c->Message( - Chat::White, - fmt::format( - "Zone '{}' does not exist.", - sep->arg[1] - ).c_str() - ); - return; + if (is_instance) { + instance_id = sep->IsNumber(2) ? Strings::ToUnsignedInt(sep->arg[2]) : 0; + + if (!database.CheckInstanceExists(instance_id)) { + c->Message( + Chat::White, + fmt::format( + "Instance ID '{}' does not exist.", + instance_id + ).c_str() + ); + return; + } + + message = fmt::format("Instance ID {}", instance_id); + } else if (is_zone) { + zone_id = sep->IsNumber(2) ? Strings::ToUnsignedInt(sep->arg[2]) : ZoneID(sep->arg[2]); + + if (!zone_id) { + c->Message( + Chat::White, + fmt::format( + "Zone '{}' does not exist.", + sep->arg[1] + ).c_str() + ); + return; + } + + message = fmt::format("{} (ID {})", ZoneLongName(zone_id), zone_id); } + c->Message( + Chat::White, + fmt::format( + "Attempting to shut down {}.", + message + ).c_str() + ); + auto pack = new ServerPacket(ServerOP_ZoneShutdown, sizeof(ServerZoneStateChange_Struct)); auto *s = (ServerZoneStateChange_Struct *) pack->pBuffer; - s->zone_id = zone_id; + s->zone_id = zone_id; + s->instance_id = instance_id; strn0cpy(s->admin_name, c->GetName(), sizeof(s->admin_name));