From 42e139c9fec1496933414edc51652ff41f90b1df Mon Sep 17 00:00:00 2001 From: Kinglykrab Date: Sun, 14 Aug 2022 19:04:55 -0400 Subject: [PATCH] [Commands] Command Status Reloading Currently command status changes require a server restart to take effect, this will allow them to be changed and use `#reload commands` without needing a restart. Added a helper method called GetCommandStatus() for future reference when sending command saylinks to people and making sure if they're high enough status for the command before sending the link. --- common/servertalk.h | 39 +++++++++++++++++++------------------ world/zoneserver.cpp | 1 + zone/client.cpp | 10 ++++++++++ zone/command.cpp | 24 +++++++++++++++-------- zone/command.h | 2 ++ zone/gm_commands/reload.cpp | 7 ++++++- zone/worldserver.cpp | 7 +++++++ 7 files changed, 62 insertions(+), 28 deletions(-) diff --git a/common/servertalk.h b/common/servertalk.h index ee1ead831..3ad54d289 100644 --- a/common/servertalk.h +++ b/common/servertalk.h @@ -226,25 +226,26 @@ #define ServerOP_ReloadAAData 0x4100 #define ServerOP_ReloadAlternateCurrencies 0x4101 #define ServerOP_ReloadBlockedSpells 0x4102 -#define ServerOP_ReloadContentFlags 0x4103 -#define ServerOP_ReloadDoors 0x4104 -#define ServerOP_ReloadGroundSpawns 0x4105 -#define ServerOP_ReloadLevelEXPMods 0x4106 -#define ServerOP_ReloadLogs 0x4107 -#define ServerOP_ReloadMerchants 0x4108 -#define ServerOP_ReloadNPCEmotes 0x4109 -#define ServerOP_ReloadObjects 0x4110 -#define ServerOP_ReloadPerlExportSettings 0x4111 -#define ServerOP_ReloadRules 0x4112 -#define ServerOP_ReloadStaticZoneData 0x4113 -#define ServerOP_ReloadTasks 0x4114 -#define ServerOP_ReloadTitles 0x4115 -#define ServerOP_ReloadTraps 0x4116 -#define ServerOP_ReloadVariables 0x4117 -#define ServerOP_ReloadVeteranRewards 0x4118 -#define ServerOP_ReloadWorld 0x4119 -#define ServerOP_ReloadZonePoints 0x4120 -#define ServerOP_ReloadDzTemplates 0x4121 +#define ServerOP_ReloadCommands 0x4103 +#define ServerOP_ReloadContentFlags 0x4104 +#define ServerOP_ReloadDoors 0x4105 +#define ServerOP_ReloadGroundSpawns 0x4106 +#define ServerOP_ReloadLevelEXPMods 0x4107 +#define ServerOP_ReloadLogs 0x4108 +#define ServerOP_ReloadMerchants 0x4109 +#define ServerOP_ReloadNPCEmotes 0x4110 +#define ServerOP_ReloadObjects 0x4111 +#define ServerOP_ReloadPerlExportSettings 0x4112 +#define ServerOP_ReloadRules 0x4113 +#define ServerOP_ReloadStaticZoneData 0x4114 +#define ServerOP_ReloadTasks 0x4115 +#define ServerOP_ReloadTitles 0x4116 +#define ServerOP_ReloadTraps 0x4117 +#define ServerOP_ReloadVariables 0x4118 +#define ServerOP_ReloadVeteranRewards 0x4119 +#define ServerOP_ReloadWorld 0x4120 +#define ServerOP_ReloadZonePoints 0x4121 +#define ServerOP_ReloadDzTemplates 0x4122 #define ServerOP_CZDialogueWindow 0x4500 #define ServerOP_CZLDoNUpdate 0x4501 diff --git a/world/zoneserver.cpp b/world/zoneserver.cpp index 04549b5b8..2d22e4a55 100644 --- a/world/zoneserver.cpp +++ b/world/zoneserver.cpp @@ -1307,6 +1307,7 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) { case ServerOP_ReloadAAData: case ServerOP_ReloadAlternateCurrencies: case ServerOP_ReloadBlockedSpells: + case ServerOP_ReloadCommands: case ServerOP_ReloadDoors: case ServerOP_ReloadGroundSpawns: case ServerOP_ReloadLevelEXPMods: diff --git a/zone/client.cpp b/zone/client.cpp index 5de9f4c57..ce0432845 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -11301,6 +11301,16 @@ void Client::SendReloadCommandMessages() { ).c_str() ); + auto commands_link = Saylink::Silent("#reload commands"); + + Message( + Chat::White, + fmt::format( + "Usage: {} - Reloads Commands globally", + commands_link + ).c_str() + ); + auto content_flags_link = Saylink::Silent("#reload content_flags"); Message( diff --git a/zone/command.cpp b/zone/command.cpp index cd9647106..22aacec1b 100755 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -53,6 +53,7 @@ int (*command_dispatch)(Client *,std::string) = command_notavail; std::map commandlist; std::map commandaliases; std::vector command_delete_list; +std::map commands_map; /* * command_notavail @@ -82,7 +83,9 @@ int command_notavail(Client *c, std::string message) int command_init(void) { - commandaliases.clear(); + if (!commandaliases.empty()) { + command_deinit(); + } if ( command_add("acceptrules", "[acceptrules] - Accept the EQEmu Agreement", AccountStatus::Player, command_acceptrules) || @@ -468,8 +471,10 @@ int command_init(void) */ void command_deinit(void) { - for (auto &c : command_delete_list) + for (auto &c : command_delete_list) { delete c; + } + command_delete_list.clear(); commandlist.clear(); commandaliases.clear(); @@ -520,6 +525,8 @@ int command_add(std::string command_name, std::string description, uint8 admin, c->description = description; c->function = function; + commands_map[command_name] = admin; + commandlist[command_name] = c; commandaliases[command_name] = command_name; command_delete_list.push_back(c); @@ -528,6 +535,11 @@ int command_add(std::string command_name, std::string description, uint8 admin, return 0; } +uint8 GetCommandStatus(Client *c, std::string command_name) { + auto command_status = commands_map[command_name]; + return command_status; +} + /* * * command_realdispatch @@ -607,11 +619,6 @@ void command_help(Client *c, const Seperator *sep) } command_link = Saylink::Silent( - fmt::format( - "{}{}", - COMMAND_CHAR, - cur.first - ), fmt::format( "{}{}", COMMAND_CHAR, @@ -622,8 +629,9 @@ void command_help(Client *c, const Seperator *sep) c->Message( Chat::White, fmt::format( - "{} | {}", + "{} | Status: {} | {}", command_link, + cur.second->admin, !cur.second->description.empty() ? cur.second->description : "" ).c_str() ); diff --git a/zone/command.h b/zone/command.h index 9c8dcf5d4..3a515e341 100644 --- a/zone/command.h +++ b/zone/command.h @@ -5,6 +5,7 @@ class Client; class Seperator; #include "../common/types.h" +#include #include #define COMMAND_CHAR '#' @@ -27,6 +28,7 @@ int command_add(std::string command_name, std::string description, uint8 admin, int command_notavail(Client *c, std::string message); int command_realdispatch(Client *c, std::string message); void command_logcommand(Client *c, std::string message); +uint8 GetCommandStatus(Client *c, std::string command_name); // Commands void command_acceptrules(Client *c, const Seperator *sep); diff --git a/zone/gm_commands/reload.cpp b/zone/gm_commands/reload.cpp index 6ec0387cd..99d91ed6d 100644 --- a/zone/gm_commands/reload.cpp +++ b/zone/gm_commands/reload.cpp @@ -11,6 +11,7 @@ void command_reload(Client *c, const Seperator *sep) bool is_aa = !strcasecmp(sep->arg[1], "aa"); bool is_alternate_currencies = !strcasecmp(sep->arg[1], "alternate_currencies"); bool is_blocked_spells = !strcasecmp(sep->arg[1], "blocked_spells"); + bool is_commands = !strcasecmp(sep->arg[1], "commands"); bool is_content_flags = !strcasecmp(sep->arg[1], "content_flags"); bool is_doors = !strcasecmp(sep->arg[1], "doors"); bool is_dztemplates = !strcasecmp(sep->arg[1], "dztemplates"); @@ -37,6 +38,7 @@ void command_reload(Client *c, const Seperator *sep) !is_aa && !is_alternate_currencies && !is_blocked_spells && + !is_commands && !is_content_flags && !is_doors && !is_dztemplates && @@ -74,7 +76,10 @@ void command_reload(Client *c, const Seperator *sep) } else if (is_blocked_spells) { c->Message(Chat::White, "Attempting to reload Blocked Spells globally."); pack = new ServerPacket(ServerOP_ReloadBlockedSpells, 0); - } else if (is_content_flags) { + } else if (is_commands) { + c->Message(Chat::White, "Attempting to reload Commands globally."); + pack = new ServerPacket(ServerOP_ReloadCommands, 0); + } else if (is_content_flags) { c->Message(Chat::White, "Attempting to reload Content Flags globally."); pack = new ServerPacket(ServerOP_ReloadContentFlags, 0); } else if (is_doors) { diff --git a/zone/worldserver.cpp b/zone/worldserver.cpp index 4e5ba9f97..099a4d50c 100644 --- a/zone/worldserver.cpp +++ b/zone/worldserver.cpp @@ -40,6 +40,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include "../common/profanity_manager.h" #include "client.h" +#include "command.h" #include "corpse.h" #include "entity.h" #include "expedition.h" @@ -1915,6 +1916,12 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) zone->LoadZoneBlockedSpells(); break; } + case ServerOP_ReloadCommands: + { + zone->SendReloadMessage("Commands"); + command_init(); + break; + } case ServerOP_ReloadContentFlags: { zone->SendReloadMessage("Content Flags");