mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-11 16:51:29 +00:00
[Commands] Cleanup #zonebootup and #zoneshutdown Commands (#3729)
# Notes - Cleanup messages and logic.
This commit is contained in:
parent
e719aa43cf
commit
11a81d8e8a
@ -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 {
|
||||
|
||||
@ -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");
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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: {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user