From 8b4f27a0388db6d8c2708a5ab5cc551998a8714e Mon Sep 17 00:00:00 2001 From: David Anderson Date: Thu, 10 Sep 2015 23:43:29 -0700 Subject: [PATCH 1/6] Add infrastructure to let logic define ConCommands. --- bridge/include/BridgeAPI.h | 2 +- bridge/include/CoreProvider.h | 8 +++++++ core/logic_bridge.cpp | 42 +++++++++++++++++++++++++++++++++++ core/provider.h | 14 ++++++++++++ 4 files changed, 65 insertions(+), 1 deletion(-) diff --git a/bridge/include/BridgeAPI.h b/bridge/include/BridgeAPI.h index 80cc0331..3d03fd9c 100644 --- a/bridge/include/BridgeAPI.h +++ b/bridge/include/BridgeAPI.h @@ -35,7 +35,7 @@ namespace SourceMod { // Add 1 to the RHS of this expression to bump the intercom file // This is to prevent mismatching core/logic binaries -static const uint32_t SM_LOGIC_MAGIC = 0x0F47C0DE - 50; +static const uint32_t SM_LOGIC_MAGIC = 0x0F47C0DE - 51; } // namespace SourceMod diff --git a/bridge/include/CoreProvider.h b/bridge/include/CoreProvider.h index 887d80a0..1bc93108 100644 --- a/bridge/include/CoreProvider.h +++ b/bridge/include/CoreProvider.h @@ -30,6 +30,7 @@ #include #include #include +#include namespace SourcePawn { class ISourcePawnEngine; @@ -64,6 +65,9 @@ class IGameHelpers; class IMenuManager; struct DatabaseInfo; class IPlayerInfoBridge; +class ICommandArgs; + +typedef ke::Lambda CommandFunc; class CoreProvider { @@ -92,6 +96,9 @@ public: virtual const char *GetCvarString(ConVar *cvar) = 0; virtual bool GetCvarBool(ConVar* cvar) = 0; + // Command functions. + virtual void DefineCommand(const char *cmd, const char *help, const CommandFunc &callback) = 0; + // Game description functions. virtual bool GetGameName(char *buffer, size_t maxlength) = 0; virtual const char *GetGameDescription() = 0; @@ -105,6 +112,7 @@ public: virtual bool DescribePlayer(int index, const char **namep, const char **authp, int *useridp) = 0; virtual void LogToGame(const char *message) = 0; virtual void ConPrint(const char *message) = 0; + virtual void ConsolePrint(const char *fmt, ...) = 0; virtual void ConsolePrintVa(const char *fmt, va_list ap) = 0; // Game engine helper functions. diff --git a/core/logic_bridge.cpp b/core/logic_bridge.cpp index e4b9076d..fcfe9499 100644 --- a/core/logic_bridge.cpp +++ b/core/logic_bridge.cpp @@ -564,6 +564,14 @@ void CoreProviderImpl::ConPrint(const char *message) META_CONPRINT(message); } +void CoreProviderImpl::ConsolePrint(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + UTIL_ConsolePrintVa(fmt, ap); + va_end(ap); +} + void CoreProviderImpl::ConsolePrintVa(const char *message, va_list ap) { UTIL_ConsolePrintVa(message, ap); @@ -754,6 +762,39 @@ CoreProviderImpl::AddPostCommandHook(ConCommand *cmd, const CommandHook::Callbac return hooks_.AddPostCommandHook(cmd, callback); } +CoreProviderImpl::CommandImpl::CommandImpl(ConCommand *cmd, CommandHook *hook) +: cmd_(cmd), + hook_(hook) +{ +} + +CoreProviderImpl::CommandImpl::~CommandImpl() +{ + hook_ = nullptr; + + g_SMAPI->UnregisterConCommandBase(g_PLAPI, cmd_); + delete [] const_cast(cmd_->GetHelpText()); + delete [] const_cast(cmd_->GetName()); + delete cmd_; +} + +void +CoreProviderImpl::DefineCommand(const char *name, const char *help, const CommandFunc &callback) +{ + char *new_name = sm_strdup(name); + char *new_help = sm_strdup(help); + int flags = 0; + + auto ignore_callback = [] (DISPATCH_ARGS) -> void { + }; + + ConCommand *cmd = new ConCommand(new_name, ignore_callback, new_help, flags); + ke::Ref hook = AddCommandHook(cmd, callback); + + ke::Ref impl = new CommandImpl(cmd, hook); + commands_.append(impl); +} + void CoreProviderImpl::InitializeHooks() { hooks_.Start(); @@ -766,6 +807,7 @@ void CoreProviderImpl::OnVSPReceived() void CoreProviderImpl::ShutdownHooks() { + commands_.clear(); hooks_.Shutdown(); } diff --git a/core/provider.h b/core/provider.h index 4f592f90..8199a820 100644 --- a/core/provider.h +++ b/core/provider.h @@ -59,11 +59,13 @@ public: bool DescribePlayer(int index, const char **namep, const char **authp, int *useridp) override; void LogToGame(const char *message) override; void ConPrint(const char *message) override; + void ConsolePrint(const char *fmt, ...) override; void ConsolePrintVa(const char *fmt, va_list ap) override; int LoadMMSPlugin(const char *file, bool *ok, char *error, size_t maxlength) override; void UnloadMMSPlugin(int id) override; int QueryClientConVar(int client, const char *cvar) override; bool IsClientConVarQueryingSupported() override; + void DefineCommand(const char *cmd, const char *help, const SourceMod::CommandFunc &callback) override; ke::PassRef AddCommandHook(ConCommand *cmd, const CommandHook::Callback &callback); ke::PassRef AddPostCommandHook(ConCommand *cmd, const CommandHook::Callback &callback); @@ -76,6 +78,18 @@ private: ke::Ref logic_; LogicInitFunction logic_init_; GameHooks hooks_; + + struct CommandImpl : public ke::Refcounted + { + public: + CommandImpl(ConCommand *cmd, CommandHook *hook); + ~CommandImpl(); + + private: + ConCommand *cmd_; + ke::Ref hook_; + }; + ke::Vector> commands_; }; extern CoreProviderImpl sCoreProviderImpl; From c614d19af079a1a10cebaac2be2879056e151ea8 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Thu, 10 Sep 2015 23:43:52 -0700 Subject: [PATCH 2/6] Move sm_dump_admcache to AdminCache. --- bridge/include/BridgeAPI.h | 2 +- bridge/include/LogicProvider.h | 1 - core/logic/AdminCache.cpp | 15 +++++++++++++++ core/logic/common_logic.cpp | 6 ------ core/sm_srvcmds.cpp | 15 --------------- 5 files changed, 16 insertions(+), 23 deletions(-) diff --git a/bridge/include/BridgeAPI.h b/bridge/include/BridgeAPI.h index 3d03fd9c..b8057ac9 100644 --- a/bridge/include/BridgeAPI.h +++ b/bridge/include/BridgeAPI.h @@ -35,7 +35,7 @@ namespace SourceMod { // Add 1 to the RHS of this expression to bump the intercom file // This is to prevent mismatching core/logic binaries -static const uint32_t SM_LOGIC_MAGIC = 0x0F47C0DE - 51; +static const uint32_t SM_LOGIC_MAGIC = 0x0F47C0DE - 52; } // namespace SourceMod diff --git a/bridge/include/LogicProvider.h b/bridge/include/LogicProvider.h index 34f58826..e7574058 100644 --- a/bridge/include/LogicProvider.h +++ b/bridge/include/LogicProvider.h @@ -69,7 +69,6 @@ struct sm_logic_t void (*GenerateError)(IPluginContext *, cell_t, int, const char *, ...); void (*AddNatives)(sp_nativeinfo_t *natives); void (*DumpHandles)(void (*dumpfn)(const char *fmt, ...)); - bool (*DumpAdminCache)(const char *filename); void (*RegisterProfiler)(IProfilingTool *tool); void (*OnRootCommand)(const ICommandArgs *args); IDataPack * (*CreateDataPack)(); diff --git a/core/logic/AdminCache.cpp b/core/logic/AdminCache.cpp index b55b892a..5ae0b02d 100644 --- a/core/logic/AdminCache.cpp +++ b/core/logic/AdminCache.cpp @@ -271,6 +271,21 @@ void AdminCache::OnSourceModStartup(bool late) NameFlag("custom4", Admin_Custom4); NameFlag("custom5", Admin_Custom5); NameFlag("custom6", Admin_Custom6); + + auto sm_dump_admcache = [this] (int client, const ICommandArgs *args) -> bool { + char buffer[PLATFORM_MAX_PATH]; + g_pSM->BuildPath(Path_SM, buffer, sizeof(buffer), "data/admin_cache_dump.txt"); + + if (!DumpCache(buffer)) { + bridge->ConsolePrint("Could not open file for writing: %s", buffer); + return true; + } + + bridge->ConsolePrint("Admin cache dumped to: %s", buffer); + return true; + }; + + bridge->DefineCommand("sm_dump_admcache", "Dumps the admin cache for debugging", sm_dump_admcache); } void AdminCache::OnSourceModAllInitialized() diff --git a/core/logic/common_logic.cpp b/core/logic/common_logic.cpp index 5f3c6a8f..675dd49e 100644 --- a/core/logic/common_logic.cpp +++ b/core/logic/common_logic.cpp @@ -114,11 +114,6 @@ static void DumpHandles(void (*dumpfn)(const char *fmt, ...)) g_HandleSys.Dump(dumpfn); } -static bool DumpAdminCache(const char *filename) -{ - return g_Admins.DumpCache(filename); -} - static void RegisterProfiler(IProfilingTool *tool) { g_ProfileToolManager.RegisterTool(tool); @@ -160,7 +155,6 @@ static sm_logic_t logic = GenerateError, AddNatives, DumpHandles, - DumpAdminCache, RegisterProfiler, OnRootCommand, CDataPack::New, diff --git a/core/sm_srvcmds.cpp b/core/sm_srvcmds.cpp index c3d01f49..74410aa1 100644 --- a/core/sm_srvcmds.cpp +++ b/core/sm_srvcmds.cpp @@ -139,18 +139,3 @@ CON_COMMAND(sm_reload_translations, "Reparses all loaded translation files") { translator->RebuildLanguageDatabase(); } - -CON_COMMAND(sm_dump_admcache, "Dumps the admin cache for debugging") -{ - char buffer[PLATFORM_MAX_PATH]; - g_SourceMod.BuildPath(Path_SM, buffer, sizeof(buffer), "data/admin_cache_dump.txt"); - - if (!logicore.DumpAdminCache(buffer)) - { - UTIL_ConsolePrint("Could not open file for writing: %s", buffer); - return; - } - - UTIL_ConsolePrint("Admin cache dumped to: %s", buffer); -} - From c8530502652dae51c3094ab22c784fc9546e6d30 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Thu, 10 Sep 2015 23:45:55 -0700 Subject: [PATCH 3/6] Move sm_reload_translations to Translator. --- core/logic/Translator.cpp | 7 +++++++ core/sm_srvcmds.cpp | 5 ----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/core/logic/Translator.cpp b/core/logic/Translator.cpp index dbd49ac0..8a294517 100644 --- a/core/logic/Translator.cpp +++ b/core/logic/Translator.cpp @@ -749,6 +749,13 @@ void Translator::OnSourceModAllInitialized() g_pCorePhrases->AddPhraseFile("core.phrases"); sharesys->AddInterface(NULL, this); + + auto sm_reload_translations = [this] (int client, const ICommandArgs *args) -> bool { + RebuildLanguageDatabase(); + return true; + }; + bridge->DefineCommand("sm_reload_translations", "Reparses all loaded translation files", + sm_reload_translations); } void Translator::OnSourceModShutdown() diff --git a/core/sm_srvcmds.cpp b/core/sm_srvcmds.cpp index 74410aa1..59c23223 100644 --- a/core/sm_srvcmds.cpp +++ b/core/sm_srvcmds.cpp @@ -134,8 +134,3 @@ CON_COMMAND(sm_dump_handles, "Dumps Handle usage to a file for finding Handle le logicore.DumpHandles(write_handles_to_game); } } - -CON_COMMAND(sm_reload_translations, "Reparses all loaded translation files") -{ - translator->RebuildLanguageDatabase(); -} From 168b7797866363db0a021a7e4f4333126e1b575d Mon Sep 17 00:00:00 2001 From: David Anderson Date: Fri, 11 Sep 2015 01:33:43 -0700 Subject: [PATCH 4/6] Move sm_dump_handles to core/logic. --- bridge/include/BridgeAPI.h | 2 +- bridge/include/LogicProvider.h | 1 - core/logic/HandleSys.cpp | 24 +++++++++---- core/logic/HandleSys.h | 7 ++-- core/logic/RootConsoleMenu.cpp | 50 ++++++++++++++++++++++++++ core/logic/common_logic.cpp | 6 ---- core/sm_srvcmds.cpp | 64 ---------------------------------- public/amtl | 2 +- 8 files changed, 74 insertions(+), 82 deletions(-) diff --git a/bridge/include/BridgeAPI.h b/bridge/include/BridgeAPI.h index b8057ac9..702a0b4e 100644 --- a/bridge/include/BridgeAPI.h +++ b/bridge/include/BridgeAPI.h @@ -35,7 +35,7 @@ namespace SourceMod { // Add 1 to the RHS of this expression to bump the intercom file // This is to prevent mismatching core/logic binaries -static const uint32_t SM_LOGIC_MAGIC = 0x0F47C0DE - 52; +static const uint32_t SM_LOGIC_MAGIC = 0x0F47C0DE - 53; } // namespace SourceMod diff --git a/bridge/include/LogicProvider.h b/bridge/include/LogicProvider.h index e7574058..4817379c 100644 --- a/bridge/include/LogicProvider.h +++ b/bridge/include/LogicProvider.h @@ -68,7 +68,6 @@ struct sm_logic_t IDebugListener *debugger; void (*GenerateError)(IPluginContext *, cell_t, int, const char *, ...); void (*AddNatives)(sp_nativeinfo_t *natives); - void (*DumpHandles)(void (*dumpfn)(const char *fmt, ...)); void (*RegisterProfiler)(IProfilingTool *tool); void (*OnRootCommand)(const ICommandArgs *args); IDataPack * (*CreateDataPack)(); diff --git a/core/logic/HandleSys.cpp b/core/logic/HandleSys.cpp index afa37850..10c9791c 100644 --- a/core/logic/HandleSys.cpp +++ b/core/logic/HandleSys.cpp @@ -1066,11 +1066,23 @@ bool HandleSystem::TryAndFreeSomeHandles() return scripts->UnloadPlugin(highest_owner); } -void HandleSystem::Dump(HANDLE_REPORTER rep) +static void rep(const HandleReporter &fn, const char *fmt, ...) +{ + va_list ap; + char buffer[1024]; + + va_start(ap, fmt); + ke::SafeVsprintf(buffer, sizeof(buffer), fmt, ap); + va_end(ap); + + fn(buffer); +} + +void HandleSystem::Dump(const HandleReporter &fn) { unsigned int total_size = 0; - rep("%-10.10s\t%-20.20s\t%-20.20s\t%-10.10s", "Handle", "Owner", "Type", "Memory"); - rep("--------------------------------------------------------------------------"); + rep(fn, "%-10.10s\t%-20.20s\t%-20.20s\t%-10.10s", "Handle", "Owner", "Type", "Memory"); + rep(fn, "--------------------------------------------------------------------------"); for (unsigned int i = 1; i <= m_HandleTail; i++) { if (m_Handles[i].set != HandleSet_Used) @@ -1141,16 +1153,16 @@ void HandleSystem::Dump(HANDLE_REPORTER rep) if (pType->dispatch->GetDispatchVersion() < HANDLESYS_MEMUSAGE_MIN_VERSION || !bresult) { - rep("0x%08x\t%-20.20s\t%-20.20s\t%-10.10s", index, owner, type, "-1"); + rep(fn, "0x%08x\t%-20.20s\t%-20.20s\t%-10.10s", index, owner, type, "-1"); } else { char buffer[32]; ke::SafeSprintf(buffer, sizeof(buffer), "%d", size); - rep("0x%08x\t%-20.20s\t%-20.20s\t%-10.10s", index, owner, type, buffer); + rep(fn, "0x%08x\t%-20.20s\t%-20.20s\t%-10.10s", index, owner, type, buffer); total_size += size; } } - rep("-- Approximately %d bytes of memory are in use by Handles.\n", total_size); + rep(fn, "-- Approximately %d bytes of memory are in use by Handles.\n", total_size); } diff --git a/core/logic/HandleSys.h b/core/logic/HandleSys.h index 670f5602..a549c251 100644 --- a/core/logic/HandleSys.h +++ b/core/logic/HandleSys.h @@ -35,7 +35,8 @@ #include #include #include -#include +#include +#include #include "common_logic.h" #define HANDLESYS_MAX_HANDLES (1<<15) @@ -111,7 +112,7 @@ struct QHandleType } }; -typedef void (HANDLE_REPORTER)(const char *str, ...); +typedef ke::Lambda HandleReporter; class HandleSystem : public IHandleSys @@ -163,7 +164,7 @@ public: //IHandleSystem const HandleAccess *pAccess, HandleError *err); - void Dump(HANDLE_REPORTER rep); + void Dump(const HandleReporter &reporter); /* Bypasses security checks. */ Handle_t FastCloneHandle(Handle_t hndl); diff --git a/core/logic/RootConsoleMenu.cpp b/core/logic/RootConsoleMenu.cpp index b6cacc7c..265c8494 100644 --- a/core/logic/RootConsoleMenu.cpp +++ b/core/logic/RootConsoleMenu.cpp @@ -27,10 +27,15 @@ #include "RootConsoleMenu.h" #include #include +#include #include +#include "HandleSys.h" RootConsoleMenu g_RootMenu; +// Some top-level commands that are just thrown in here. +static bool sm_dump_handles(int client, const ICommandArgs *args); + RootConsoleMenu::RootConsoleMenu() { } @@ -49,6 +54,9 @@ void RootConsoleMenu::OnSourceModStartup(bool late) { AddRootConsoleCommand3("version", "Display version information", this); AddRootConsoleCommand3("credits", "Display credits listing", this); + + bridge->DefineCommand("sm_dump_handles", "Dumps Handle usage to a file for finding Handle leaks", + sm_dump_handles); } void RootConsoleMenu::OnSourceModAllInitialized() @@ -232,3 +240,45 @@ void RootConsoleMenu::OnRootConsoleCommand(const char *cmdname, const ICommandAr ConsolePrint(" http://www.sourcemod.net/"); } } + +static bool sm_dump_handles(int client, const ICommandArgs *args) +{ + if (args->ArgC() < 2) { + bridge->ConsolePrint("Usage: sm_dump_handles or for game logs"); + return true; + } + + if (strcmp(args->Arg(1), "log") == 0) { + auto write_handles_to_game = [] (const char *str) -> void + { + char buffer[1024]; + size_t len = ke::SafeSprintf(buffer, sizeof(buffer)-2, "%s", str); + + buffer[len] = '\n'; + buffer[len+1] = '\0'; + + bridge->LogToGame(buffer); + }; + g_HandleSys.Dump(write_handles_to_game); + return true; + } + + FILE *fp = nullptr; + auto write_handles_to_log = [&fp] (const char *str) -> void + { + fprintf(fp, "%s\n", str); + }; + + char filename[PLATFORM_MAX_PATH]; + const char *arg = args->Arg(1); + g_pSM->BuildPath(Path_Game, filename, sizeof(filename), "%s", arg); + + fp = fopen(filename, "wt"); + if (!fp) { + bridge->ConsolePrint("Failed to open \"%s\" for writing", filename); + return true; + } + + g_HandleSys.Dump(write_handles_to_log); + fclose(fp); +} diff --git a/core/logic/common_logic.cpp b/core/logic/common_logic.cpp index 675dd49e..d45c1ee7 100644 --- a/core/logic/common_logic.cpp +++ b/core/logic/common_logic.cpp @@ -109,11 +109,6 @@ static void AddNatives(sp_nativeinfo_t *natives) g_CoreNatives.AddNatives(natives); } -static void DumpHandles(void (*dumpfn)(const char *fmt, ...)) -{ - g_HandleSys.Dump(dumpfn); -} - static void RegisterProfiler(IProfilingTool *tool) { g_ProfileToolManager.RegisterTool(tool); @@ -154,7 +149,6 @@ static sm_logic_t logic = &g_DbgReporter, GenerateError, AddNatives, - DumpHandles, RegisterProfiler, OnRootCommand, CDataPack::New, diff --git a/core/sm_srvcmds.cpp b/core/sm_srvcmds.cpp index 59c23223..28662c9e 100644 --- a/core/sm_srvcmds.cpp +++ b/core/sm_srvcmds.cpp @@ -70,67 +70,3 @@ CON_COMMAND(sm, "SourceMod Menu") logicore.OnRootCommand(&cargs); } - -FILE *g_pHndlLog = NULL; - -void write_handles_to_log(const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - vfprintf(g_pHndlLog, fmt, ap); - fprintf(g_pHndlLog, "\n"); - va_end(ap); -} - -void write_handles_to_game(const char *fmt, ...) -{ - size_t len; - va_list ap; - char buffer[1024]; - - va_start(ap, fmt); - len = ke::SafeSprintf(buffer, sizeof(buffer)-2, fmt, ap); - va_end(ap); - - buffer[len] = '\n'; - buffer[len+1] = '\0'; - - engine->LogPrint(buffer); -} - -CON_COMMAND(sm_dump_handles, "Dumps Handle usage to a file for finding Handle leaks") -{ -#if SOURCE_ENGINE <= SE_DARKMESSIAH - CCommand args; -#endif - if (args.ArgC() < 2) - { - UTIL_ConsolePrint("Usage: sm_dump_handles or for game logs"); - return; - } - - if (strcmp(args.Arg(1), "log") != 0) - { - char filename[PLATFORM_MAX_PATH]; - const char *arg = args.Arg(1); - g_SourceMod.BuildPath(Path_Game, filename, sizeof(filename), "%s", arg); - - FILE *fp = fopen(filename, "wt"); - if (!fp) - { - UTIL_ConsolePrint("Failed to open \"%s\" for writing", filename); - return; - } - - g_pHndlLog = fp; - logicore.DumpHandles(write_handles_to_log); - g_pHndlLog = NULL; - - fclose(fp); - } - else - { - logicore.DumpHandles(write_handles_to_game); - } -} diff --git a/public/amtl b/public/amtl index c4c2aa3e..298217cb 160000 --- a/public/amtl +++ b/public/amtl @@ -1 +1 @@ -Subproject commit c4c2aa3e97157407c3832b40fed43ba9cd24a2c1 +Subproject commit 298217cbbfac16851bb58574bc6744f58b260b15 From 1a7b708df8691036b3d441edfda5d4ae4d8b5881 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Fri, 11 Sep 2015 01:48:25 -0700 Subject: [PATCH 5/6] Split command buffer peeking hacks out of the "sm" command. --- core/CoreConfig.cpp | 21 +++++++++++++++++++-- core/sm_srvcmds.cpp | 24 ------------------------ 2 files changed, 19 insertions(+), 26 deletions(-) diff --git a/core/CoreConfig.cpp b/core/CoreConfig.cpp index 6869401d..664bf085 100644 --- a/core/CoreConfig.cpp +++ b/core/CoreConfig.cpp @@ -538,7 +538,7 @@ void SM_ExecuteForPlugin(IPluginContext *ctx) can_create = SM_ExecuteConfig(plugin, plugin->GetConfig(i), can_create); } char cmd[255]; - ke::SafeSprintf(cmd, sizeof(cmd), "sm internal 2 %d\n", plugin->GetSerial()); + ke::SafeSprintf(cmd, sizeof(cmd), "sm_internal 2 %d\n", plugin->GetSerial()); engine->ServerCommand(cmd); } } @@ -585,7 +585,24 @@ void SM_InternalCmdTrigger() { /* Order is important here. We need to buffer things before we send the command out. */ g_pOnAutoConfigsBuffered->Execute(NULL); - engine->ServerCommand("sm internal 1\n"); + engine->ServerCommand("sm_internal 1\n"); g_PendingInternalPush = false; } +CON_COMMAND(sm_internal, "") +{ +#if SOURCE_ENGINE <= SE_DARKMESSIAH + CCommand args; +#endif + + if (args.ArgC() < 1) + return; + + const char *arg = args.Arg(1); + if (strcmp(arg, "1") == 0) { + SM_ConfigsExecuted_Global(); + } else if (strcmp(arg, "2") == 0) { + if (args.ArgC() >= 3) + SM_ConfigsExecuted_Plugin(atoi(args.Arg(2))); + } +} diff --git a/core/sm_srvcmds.cpp b/core/sm_srvcmds.cpp index 28662c9e..4e3ac856 100644 --- a/core/sm_srvcmds.cpp +++ b/core/sm_srvcmds.cpp @@ -44,29 +44,5 @@ CON_COMMAND(sm, "SourceMod Menu") #endif EngineArgs cargs(args); - if (cargs.ArgC() >= 2) { - const char *cmdname = cargs.Arg(1); - if (strcmp(cmdname, "internal") == 0) - { - if (cargs.ArgC() >= 3) - { - const char *arg = cargs.Arg(2); - if (strcmp(arg, "1") == 0) - { - SM_ConfigsExecuted_Global(); - } - else if (strcmp(arg, "2") == 0) - { - if (cargs.ArgC() >= 4) - { - SM_ConfigsExecuted_Plugin(atoi(cargs.Arg(3))); - } - } - } - return; - } - - } - logicore.OnRootCommand(&cargs); } From 8a7dfdbc1116f6d7a00b14edeb40667a0c7845bd Mon Sep 17 00:00:00 2001 From: David Anderson Date: Fri, 11 Sep 2015 01:52:39 -0700 Subject: [PATCH 6/6] Move the "sm" command to core/logic. --- bridge/include/BridgeAPI.h | 2 +- bridge/include/LogicProvider.h | 1 - core/AMBuilder | 1 - core/logic/RootConsoleMenu.cpp | 5 ++++ core/logic/common_logic.cpp | 6 ----- core/sm_srvcmds.cpp | 48 ---------------------------------- 6 files changed, 6 insertions(+), 57 deletions(-) delete mode 100644 core/sm_srvcmds.cpp diff --git a/bridge/include/BridgeAPI.h b/bridge/include/BridgeAPI.h index 702a0b4e..3845963e 100644 --- a/bridge/include/BridgeAPI.h +++ b/bridge/include/BridgeAPI.h @@ -35,7 +35,7 @@ namespace SourceMod { // Add 1 to the RHS of this expression to bump the intercom file // This is to prevent mismatching core/logic binaries -static const uint32_t SM_LOGIC_MAGIC = 0x0F47C0DE - 53; +static const uint32_t SM_LOGIC_MAGIC = 0x0F47C0DE - 54; } // namespace SourceMod diff --git a/bridge/include/LogicProvider.h b/bridge/include/LogicProvider.h index 4817379c..253084f8 100644 --- a/bridge/include/LogicProvider.h +++ b/bridge/include/LogicProvider.h @@ -69,7 +69,6 @@ struct sm_logic_t void (*GenerateError)(IPluginContext *, cell_t, int, const char *, ...); void (*AddNatives)(sp_nativeinfo_t *natives); void (*RegisterProfiler)(IProfilingTool *tool); - void (*OnRootCommand)(const ICommandArgs *args); IDataPack * (*CreateDataPack)(); void (*FreeDataPack)(IDataPack *pack); IScriptManager *scripts; diff --git a/core/AMBuilder b/core/AMBuilder index b4488a0c..7b25a9ce 100644 --- a/core/AMBuilder +++ b/core/AMBuilder @@ -36,7 +36,6 @@ project.sources += [ 'EventManager.cpp', 'MenuStyle_Radio.cpp', 'sm_autonatives.cpp', - 'sm_srvcmds.cpp', 'ConsoleDetours.cpp', 'vprof_tool.cpp', 'smn_commandline.cpp', diff --git a/core/logic/RootConsoleMenu.cpp b/core/logic/RootConsoleMenu.cpp index 265c8494..063ff4c7 100644 --- a/core/logic/RootConsoleMenu.cpp +++ b/core/logic/RootConsoleMenu.cpp @@ -57,6 +57,10 @@ void RootConsoleMenu::OnSourceModStartup(bool late) bridge->DefineCommand("sm_dump_handles", "Dumps Handle usage to a file for finding Handle leaks", sm_dump_handles); + bridge->DefineCommand("sm", "SourceMod Menu", [this] (int client, const ICommandArgs *args) -> bool { + GotRootCmd(args); + return true; + }); } void RootConsoleMenu::OnSourceModAllInitialized() @@ -281,4 +285,5 @@ static bool sm_dump_handles(int client, const ICommandArgs *args) g_HandleSys.Dump(write_handles_to_log); fclose(fp); + return true; } diff --git a/core/logic/common_logic.cpp b/core/logic/common_logic.cpp index d45c1ee7..a39ed8bd 100644 --- a/core/logic/common_logic.cpp +++ b/core/logic/common_logic.cpp @@ -114,11 +114,6 @@ static void RegisterProfiler(IProfilingTool *tool) g_ProfileToolManager.RegisterTool(tool); } -static void OnRootCommand(const ICommandArgs *args) -{ - g_RootMenu.GotRootCmd(args); -} - // Defined in smn_filesystem.cpp. extern bool OnLogPrint(const char *msg); @@ -150,7 +145,6 @@ static sm_logic_t logic = GenerateError, AddNatives, RegisterProfiler, - OnRootCommand, CDataPack::New, CDataPack::Free, &g_PluginSys, diff --git a/core/sm_srvcmds.cpp b/core/sm_srvcmds.cpp deleted file mode 100644 index 4e3ac856..00000000 --- a/core/sm_srvcmds.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/** - * vim: set ts=4 sw=4 tw=99 noet : - * ============================================================================= - * SourceMod - * Copyright (C) 2004-2009 AlliedModders LLC. All rights reserved. - * ============================================================================= - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, version 3.0, as published by the - * Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. - * - * You should have received a copy of the GNU General Public License along with - * this program. If not, see . - * - * As a special exception, AlliedModders LLC gives you permission to link the - * code of this program (as well as its derivative works) to "Half-Life 2," the - * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software - * by the Valve Corporation. You must obey the GNU General Public License in - * all respects for all other code used. Additionally, AlliedModders LLC grants - * this exception to all derivative works. AlliedModders LLC defines further - * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), - * or . - * - * Version: $Id$ - */ -#include "sourcemod.h" -#include "sourcemm_api.h" -#include "logic_bridge.h" -#include "sm_globals.h" -#include "CoreConfig.h" -#include "command_args.h" -#include -#include - -CON_COMMAND(sm, "SourceMod Menu") -{ -#if SOURCE_ENGINE <= SE_DARKMESSIAH - CCommand args; -#endif - EngineArgs cargs(args); - - logicore.OnRootCommand(&cargs); -}