faluco@216: #include "sm_srvcmds.h" faluco@216: faluco@216: ConVarAccessor g_ConCmdAccessor; faluco@216: faluco@216: void ConVarAccessor::OnSourceModStartup(bool late) faluco@216: { faluco@216: ConCommandBaseMgr::OneTimeInit(&g_ConCmdAccessor); faluco@216: } faluco@216: faluco@216: bool ConVarAccessor::RegisterConCommandBase(ConCommandBase *pCommand) faluco@216: { faluco@216: META_REGCVAR(pCommand); faluco@216: faluco@216: return true; faluco@216: } faluco@216: faluco@217: inline const char *StatusToStr(PluginStatus st) faluco@217: { faluco@217: switch (st) faluco@217: { faluco@217: case Plugin_Running: faluco@217: return "Running"; faluco@217: case Plugin_Paused: faluco@217: return "Paused"; faluco@217: case Plugin_Error: faluco@217: return "Error"; faluco@217: case Plugin_Uncompiled: faluco@217: return "Uncompiled"; faluco@217: case Plugin_BadLoad: faluco@217: return "Bad Load"; faluco@217: default: dvander@223: assert(false); faluco@217: return "-"; faluco@217: } faluco@217: } faluco@217: faluco@224: #define IS_STR_FILLED(var) (var[0] != '\0') faluco@216: CON_COMMAND(sm, "SourceMod Menu") faluco@216: { faluco@216: int argnum = engine->Cmd_Argc(); faluco@216: faluco@216: if (argnum >= 2) faluco@216: { faluco@216: const char *cmd = engine->Cmd_Argv(1); faluco@216: if (!strcmp("plugins", cmd)) faluco@216: { faluco@216: if (argnum >= 3) faluco@216: { faluco@216: const char *cmd2 = engine->Cmd_Argv(2); faluco@216: if (!strcmp("list", cmd2)) faluco@216: { faluco@216: char buffer[256]; faluco@216: unsigned int id = 1; faluco@216: int plnum = g_PluginSys.GetPluginCount(); faluco@216: faluco@216: if (!plnum) faluco@216: { faluco@216: META_CONPRINT("[SM] No plugins loaded\n"); faluco@216: return; faluco@216: } else { faluco@216: META_CONPRINTF("[SM] Displaying %d plugin%s:\n", g_PluginSys.GetPluginCount(), (plnum > 1) ? "s" : ""); faluco@216: } faluco@216: faluco@216: IPluginIterator *iter = g_PluginSys.GetPluginIterator(); faluco@216: for (; iter->MorePlugins(); iter->NextPlugin(), id++) faluco@216: { faluco@217: IPlugin *pl = iter->GetPlugin(); faluco@217: assert(pl->GetStatus() != Plugin_Created); faluco@216: int len = 0; faluco@217: const sm_plugininfo_t *info = pl->GetPublicInfo(); faluco@216: faluco@217: len += snprintf(&buffer[len], sizeof(buffer)-len, " %02d <%s>", id, StatusToStr(pl->GetStatus())); faluco@224: len += snprintf(&buffer[len], sizeof(buffer)-len, " \"%s\"", (IS_STR_FILLED(info->name)) ? info->name : pl->GetFilename()); faluco@224: if (IS_STR_FILLED(info->version)) faluco@216: { faluco@216: len += snprintf(&buffer[len], sizeof(buffer)-len, " (%s)", info->version); faluco@216: } faluco@224: if (IS_STR_FILLED(info->author)) faluco@216: { faluco@216: snprintf(&buffer[len], sizeof(buffer)-len, " by %s", info->author); faluco@216: } faluco@216: META_CONPRINTF("%s\n", buffer); faluco@216: } faluco@216: faluco@216: iter->Release(); faluco@216: return; faluco@216: } else if (!strcmp("load", cmd2)) { faluco@216: if (argnum < 4) faluco@216: { faluco@216: META_CONPRINT("Usage: sm plugins load \n"); faluco@216: return; faluco@216: } faluco@216: faluco@217: char error[128]; faluco@216: const char *filename = engine->Cmd_Argv(3); faluco@216: IPlugin *pl = g_PluginSys.LoadPlugin(filename, false, PluginType_MapUpdated, error, sizeof(error)); faluco@216: faluco@216: if (pl) faluco@216: { faluco@216: META_CONPRINTF("Loaded plugin %s successfully.\n", filename); faluco@216: } else { faluco@216: META_CONPRINTF("Plugin %s failed to load: %s.\n", filename, error); faluco@216: } faluco@216: faluco@216: return; faluco@216: } else if (!strcmp("unload", cmd2)) { faluco@216: if (argnum < 4) faluco@216: { faluco@216: META_CONPRINT("Usage: sm plugins unload <#>\n"); faluco@216: return; faluco@216: } faluco@216: faluco@216: int id = 1; faluco@216: int num = atoi(engine->Cmd_Argv(3)); faluco@216: if (num < 1 || num > (int)g_PluginSys.GetPluginCount()) faluco@216: { faluco@216: META_CONPRINT("Plugin index not found.\n"); faluco@216: return; faluco@216: } faluco@216: faluco@216: IPluginIterator *iter = g_PluginSys.GetPluginIterator(); faluco@216: for (; iter->MorePlugins() && idNextPlugin(), id++) {} faluco@224: IPlugin *pl = iter->GetPlugin(); faluco@216: faluco@216: char name[64]; faluco@216: const sm_plugininfo_t *info = pl->GetPublicInfo(); faluco@224: strcpy(name, (IS_STR_FILLED(info->name)) ? info->name : pl->GetFilename()); faluco@216: faluco@216: if (g_PluginSys.UnloadPlugin(pl)) faluco@216: { faluco@216: META_CONPRINTF("Plugin %s unloaded successfully.\n", name); faluco@216: } else { faluco@216: META_CONPRINTF("Failed to unload plugin %s.\n", name); faluco@216: } faluco@216: faluco@216: iter->Release(); faluco@216: return; faluco@216: } else if (!strcmp("info", cmd2)) { faluco@216: if (argnum < 4) faluco@216: { faluco@216: META_CONPRINT("Usage: sm plugins info <#>\n"); faluco@216: return; faluco@216: } faluco@216: faluco@216: int id = 1; faluco@216: int num = atoi(engine->Cmd_Argv(3)); faluco@216: if (num < 1 || num > (int)g_PluginSys.GetPluginCount()) faluco@216: { faluco@216: META_CONPRINT("Plugin index not found.\n"); faluco@216: return; faluco@216: } faluco@216: faluco@216: IPluginIterator *iter = g_PluginSys.GetPluginIterator(); faluco@216: for (; iter->MorePlugins() && idNextPlugin(), id++) {} faluco@224: faluco@224: IPlugin *pl = iter->GetPlugin(); faluco@216: const sm_plugininfo_t *info = pl->GetPublicInfo(); faluco@216: faluco@216: META_CONPRINTF(" Filename: %s\n", pl->GetFilename()); faluco@224: if (IS_STR_FILLED(info->name)) faluco@216: { faluco@216: META_CONPRINTF(" Title: %s\n", info->name); faluco@216: } faluco@224: if (IS_STR_FILLED(info->author)) faluco@216: { faluco@216: META_CONPRINTF(" Author: %s\n", info->author); faluco@216: } faluco@224: if (IS_STR_FILLED(info->version)) faluco@216: { faluco@216: META_CONPRINTF(" Version: %s\n", info->version); faluco@216: } faluco@224: if (IS_STR_FILLED(info->description)) faluco@216: { faluco@216: META_CONPRINTF(" Description: %s\n", info->description); faluco@216: } faluco@224: if (IS_STR_FILLED(info->url)) faluco@216: { faluco@216: META_CONPRINTF(" URL: %s\n", info->url); faluco@216: } faluco@216: //:TODO: write if it's in debug mode, or do it inside LIST ? faluco@216: faluco@216: iter->Release(); faluco@216: return; faluco@216: } faluco@216: } faluco@216: //:TODO: print plugins cmd list faluco@216: } faluco@216: } faluco@216: //:TODO: print cmd list or something faluco@216: }