diff --git a/zone/command.cpp b/zone/command.cpp index 5d5187769..be724e859 100755 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -402,7 +402,7 @@ int command_init(void) command_add("zoneshutdown", "[shortname] - Shut down a zone server", AccountStatus::GMLeadAdmin, command_zoneshutdown) || command_add("zonestatus", "- Show connected zoneservers, synonymous with /servers", AccountStatus::GMLeadAdmin, command_zonestatus) || command_add("zopp", "Troubleshooting command - Sends a fake item packet to you. No server reference is created.", AccountStatus::GMImpossible, command_zopp) || - command_add("zsafecoords", "[x] [y] [z] - Set safe coords", AccountStatus::QuestTroupe, command_zsafecoords) || + command_add("zsafecoords", "[X] [Y] [Z] [Heading] [Permanent (0 = False, 1 = True)] - Set the current zone's safe coordinates", AccountStatus::QuestTroupe, command_zsafecoords) || command_add("zsave", " - Saves zheader to the database", AccountStatus::QuestTroupe, command_zsave) || command_add("zsky", "[Sky Type] [Permanent (0 = False, 1 = True)] - Change zone sky type", AccountStatus::QuestTroupe, command_zsky) || command_add("zstats", "- Show info about zone header", AccountStatus::QuestTroupe, command_zstats) || diff --git a/zone/gm_commands/zsafecoords.cpp b/zone/gm_commands/zsafecoords.cpp index 237f288da..bce0ea743 100755 --- a/zone/gm_commands/zsafecoords.cpp +++ b/zone/gm_commands/zsafecoords.cpp @@ -2,25 +2,65 @@ void command_zsafecoords(Client *c, const Seperator *sep) { - // modifys and resends zhdr packet - if (sep->arg[3][0] == 0) { - c->Message(Chat::White, "Usage: #zsafecoords "); + int arguments = sep->argnum; + if ( + !arguments || + !sep->IsNumber(1) || + !sep->IsNumber(2) || + !sep->IsNumber(3) + ) { + c->Message(Chat::White, "Usage: #zsafecoords [X] [Y] [Z] [Heading] [Permanent (0 = False, 1 = True)]"); + c->Message(Chat::White, "Not sending Heading defaults to current Heading and the change is temporary."); + return; } - else { - zone->newzone_data.safe_x = atof(sep->arg[1]); - zone->newzone_data.safe_y = atof(sep->arg[2]); - zone->newzone_data.safe_z = atof(sep->arg[3]); - //float newdatax = atof(sep->arg[1]); - //float newdatay = atof(sep->arg[2]); - //float newdataz = atof(sep->arg[3]); - //memcpy(&zone->zone_header_data[114], &newdatax, sizeof(float)); - //memcpy(&zone->zone_header_data[118], &newdatay, sizeof(float)); - //memcpy(&zone->zone_header_data[122], &newdataz, sizeof(float)); - //zone->SetSafeCoords(); - auto outapp = new EQApplicationPacket(OP_NewZone, sizeof(NewZone_Struct)); - memcpy(outapp->pBuffer, &zone->newzone_data, outapp->size); - entity_list.QueueClients(c, outapp); - safe_delete(outapp); + + auto x = std::stof(sep->arg[1]); + auto y = std::stof(sep->arg[2]); + auto z = std::stof(sep->arg[3]); + auto heading = sep->arg[3] ? std::stof(sep->arg[3]) : c->GetHeading(); + auto permanent = sep->arg[4] ? atobool(sep->arg[4]) : false; + if (permanent) { + auto query = fmt::format( + "UPDATE zone SET safe_x = {:.2f}, safe_y = {:.2f}, safe_z = {:.2f}, safe_heading = {:.2f} WHERE zoneidnumber = {} AND version = {}", + x, + y, + z, + heading, + zone->GetZoneID(), + zone->GetInstanceVersion() + ); + database.QueryDatabase(query); } + + zone->newzone_data.safe_x = x; + zone->newzone_data.safe_y = y; + zone->newzone_data.safe_z = z; + + auto outapp = new EQApplicationPacket(OP_NewZone, sizeof(NewZone_Struct)); + memcpy(outapp->pBuffer, &zone->newzone_data, outapp->size); + entity_list.QueueClients(c, outapp); + safe_delete(outapp); + + c->Message( + Chat::White, + fmt::format( + "Safe Coordinates Changed | Zone: {} ({}){} XYZ: {:.2f}, {:.2f}, {:.2f} Heading: {:.2f} Permanent: {} ", + zone->GetLongName(), + zone->GetZoneID(), + ( + zone->GetInstanceVersion() ? + fmt::format( + " Version: {}", + zone->GetInstanceVersion() + ) : + "" + ), + x, + y, + z, + heading, + permanent ? "Yes" : "No" + ).c_str() + ); }