[Commands] Cleanup #zonebootup and #zoneshutdown Commands (#3729)

# Notes
- Cleanup messages and logic.
This commit is contained in:
Alex King 2023-12-03 12:40:54 -05:00 committed by GitHub
parent e719aa43cf
commit 11a81d8e8a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 123 additions and 90 deletions

View File

@ -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 {

View File

@ -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");

View File

@ -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);

View File

@ -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<uint16>(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);
}

View File

@ -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);
}

View File

@ -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: {