added amb217 (server.cfg forward)
--HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40729
This commit is contained in:
parent
f498af0190
commit
a5c018724a
@ -31,12 +31,17 @@ struct PlCmdInfo
|
|||||||
CmdType type;
|
CmdType type;
|
||||||
};
|
};
|
||||||
typedef List<PlCmdInfo> CmdList;
|
typedef List<PlCmdInfo> CmdList;
|
||||||
|
|
||||||
void AddToPlCmdList(CmdList *pList, const PlCmdInfo &info);
|
void AddToPlCmdList(CmdList *pList, const PlCmdInfo &info);
|
||||||
|
|
||||||
ConCmdManager::ConCmdManager() : m_Strings(1024)
|
ConCmdManager::ConCmdManager() : m_Strings(1024)
|
||||||
{
|
{
|
||||||
m_pCmds = sm_trie_create();
|
m_pCmds = sm_trie_create();
|
||||||
m_pCmdGrps = sm_trie_create();
|
m_pCmdGrps = sm_trie_create();
|
||||||
|
m_bServerCfgDone = true;
|
||||||
|
m_pExecCmd = NULL;
|
||||||
|
m_pServerCfgFile = NULL;
|
||||||
|
m_pServerCfgFwd = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ConCmdManager::~ConCmdManager()
|
ConCmdManager::~ConCmdManager()
|
||||||
@ -50,15 +55,73 @@ void ConCmdManager::OnSourceModAllInitialized()
|
|||||||
g_PluginSys.AddPluginsListener(this);
|
g_PluginSys.AddPluginsListener(this);
|
||||||
g_RootMenu.AddRootConsoleCommand("cmds", "List console commands", this);
|
g_RootMenu.AddRootConsoleCommand("cmds", "List console commands", this);
|
||||||
SH_ADD_HOOK_MEMFUNC(IServerGameClients, SetCommandClient, serverClients, this, &ConCmdManager::SetCommandClient, false);
|
SH_ADD_HOOK_MEMFUNC(IServerGameClients, SetCommandClient, serverClients, this, &ConCmdManager::SetCommandClient, false);
|
||||||
|
|
||||||
|
ConCommandBase *pCmd = icvar->GetCommands();
|
||||||
|
while (pCmd)
|
||||||
|
{
|
||||||
|
if (pCmd->IsCommand()
|
||||||
|
&& strcmp(pCmd->GetName(), "exec") == 0)
|
||||||
|
{
|
||||||
|
m_pExecCmd = (ConCommand *)pCmd;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
pCmd = const_cast<ConCommandBase *>(pCmd->GetNext());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_pExecCmd)
|
||||||
|
{
|
||||||
|
m_pServerCfgFile = (ConVar *)icvar->FindVar("servercfgfile");
|
||||||
|
SH_ADD_HOOK_MEMFUNC(ConCommand, Dispatch, m_pExecCmd, this, &ConCmdManager::OnExecCmd, true);
|
||||||
|
m_pServerCfgFwd = g_Forwards.CreateForward("OnServerCfg", ET_Ignore, 0, NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConCmdManager::OnSourceModShutdown()
|
void ConCmdManager::OnSourceModShutdown()
|
||||||
{
|
{
|
||||||
|
if (m_pExecCmd)
|
||||||
|
{
|
||||||
|
SH_REMOVE_HOOK_MEMFUNC(ConCommand, Dispatch, m_pExecCmd, this, &ConCmdManager::OnExecCmd, true);
|
||||||
|
g_Forwards.ReleaseForward(m_pServerCfgFwd);
|
||||||
|
m_pServerCfgFwd = NULL;
|
||||||
|
m_pExecCmd = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* All commands should already be removed by the time we're done */
|
/* All commands should already be removed by the time we're done */
|
||||||
SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, SetCommandClient, serverClients, this, &ConCmdManager::SetCommandClient, false);
|
SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, SetCommandClient, serverClients, this, &ConCmdManager::SetCommandClient, false);
|
||||||
g_RootMenu.RemoveRootConsoleCommand("cmds", this);
|
g_RootMenu.RemoveRootConsoleCommand("cmds", this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ConCmdManager::OnSourceModPluginsLoaded()
|
||||||
|
{
|
||||||
|
m_bServerCfgDone = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConCmdManager::OnExecCmd()
|
||||||
|
{
|
||||||
|
const char *arg = engine->Cmd_Argv(1);
|
||||||
|
const char *cfgfile = "server.cfg";
|
||||||
|
|
||||||
|
if (m_pServerCfgFile)
|
||||||
|
{
|
||||||
|
cfgfile = m_pServerCfgFile->GetString();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(arg, cfgfile) == 0)
|
||||||
|
{
|
||||||
|
engine->ServerCommand("sm cmds internal 1\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConCmdManager::NotifyExecDone(const char *file)
|
||||||
|
{
|
||||||
|
if (file == NULL && !m_bServerCfgDone)
|
||||||
|
{
|
||||||
|
/* Server-cfg file */
|
||||||
|
m_bServerCfgDone = true;
|
||||||
|
m_pServerCfgFwd->Execute(NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ConCmdManager::RemoveConCmds(List<CmdHook *> &cmdlist, IPluginContext *pContext)
|
void ConCmdManager::RemoveConCmds(List<CmdHook *> &cmdlist, IPluginContext *pContext)
|
||||||
{
|
{
|
||||||
List<CmdHook *>::iterator iter = cmdlist.begin();
|
List<CmdHook *>::iterator iter = cmdlist.begin();
|
||||||
@ -732,6 +795,16 @@ void ConCmdManager::OnRootConsoleCommand(const char *command, unsigned int argco
|
|||||||
if (argcount >= 3)
|
if (argcount >= 3)
|
||||||
{
|
{
|
||||||
const char *text = engine->Cmd_Argv(2);
|
const char *text = engine->Cmd_Argv(2);
|
||||||
|
|
||||||
|
if (strcmp(text, "internal") == 0)
|
||||||
|
{
|
||||||
|
const char *num = engine->Cmd_Argv(3);
|
||||||
|
if (atoi(num) == 1)
|
||||||
|
{
|
||||||
|
g_ConCmds.NotifyExecDone(NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int id = atoi(text);
|
int id = atoi(text);
|
||||||
CPlugin *pPlugin = g_PluginSys.GetPluginByOrder(id);
|
CPlugin *pPlugin = g_PluginSys.GetPluginByOrder(id);
|
||||||
|
|
||||||
|
@ -84,6 +84,7 @@ public:
|
|||||||
public: //SMGlobalClass
|
public: //SMGlobalClass
|
||||||
void OnSourceModAllInitialized();
|
void OnSourceModAllInitialized();
|
||||||
void OnSourceModShutdown();
|
void OnSourceModShutdown();
|
||||||
|
void OnSourceModPluginsLoaded();
|
||||||
public: //IPluginsListener
|
public: //IPluginsListener
|
||||||
void OnPluginDestroyed(IPlugin *plugin);
|
void OnPluginDestroyed(IPlugin *plugin);
|
||||||
public: //IRootConsoleCommand
|
public: //IRootConsoleCommand
|
||||||
@ -99,6 +100,7 @@ public:
|
|||||||
int flags);
|
int flags);
|
||||||
ResultType DispatchClientCommand(int client, ResultType type);
|
ResultType DispatchClientCommand(int client, ResultType type);
|
||||||
void UpdateAdminCmdFlags(const char *cmd, OverrideType type, FlagBits bits);
|
void UpdateAdminCmdFlags(const char *cmd, OverrideType type, FlagBits bits);
|
||||||
|
void NotifyExecDone(const char *file);
|
||||||
private:
|
private:
|
||||||
void InternalDispatch();
|
void InternalDispatch();
|
||||||
ResultType RunAdminCommand(ConCmdInfo *pInfo, int client, int args);
|
ResultType RunAdminCommand(ConCmdInfo *pInfo, int client, int args);
|
||||||
@ -108,12 +110,17 @@ private:
|
|||||||
void RemoveConCmd(ConCmdInfo *info);
|
void RemoveConCmd(ConCmdInfo *info);
|
||||||
void RemoveConCmds(List<CmdHook *> &cmdlist, IPluginContext *pContext);
|
void RemoveConCmds(List<CmdHook *> &cmdlist, IPluginContext *pContext);
|
||||||
bool CheckAccess(int client, const char *cmd, AdminCmdInfo *pAdmin);
|
bool CheckAccess(int client, const char *cmd, AdminCmdInfo *pAdmin);
|
||||||
|
void OnExecCmd();
|
||||||
private:
|
private:
|
||||||
Trie *m_pCmds; /* command lookup */
|
Trie *m_pCmds; /* command lookup */
|
||||||
Trie *m_pCmdGrps; /* command group lookup */
|
Trie *m_pCmdGrps; /* command group lookup */
|
||||||
List<ConCmdInfo *> m_CmdList; /* command list */
|
List<ConCmdInfo *> m_CmdList; /* command list */
|
||||||
int m_CmdClient; /* current client */
|
int m_CmdClient; /* current client */
|
||||||
BaseStringTable m_Strings; /* string table */
|
BaseStringTable m_Strings; /* string table */
|
||||||
|
ConVar *m_pServerCfgFile; /* servercfgfile cvar */
|
||||||
|
ConCommand *m_pExecCmd; /* "exec" command */
|
||||||
|
IForward *m_pServerCfgFwd; /* server config forward */
|
||||||
|
bool m_bServerCfgDone; /* marks whether a servercfg was detected */
|
||||||
};
|
};
|
||||||
|
|
||||||
extern ConCmdManager g_ConCmds;
|
extern ConCmdManager g_ConCmds;
|
||||||
|
@ -116,7 +116,7 @@ forward OnGameFrame();
|
|||||||
/**
|
/**
|
||||||
* Called when the map is loaded.
|
* Called when the map is loaded.
|
||||||
*
|
*
|
||||||
* Note: This used to be OnServerLoad(), which is now deprecated.
|
* @note This used to be OnServerLoad(), which is now deprecated.
|
||||||
* Plugins still using the old forward will work.
|
* Plugins still using the old forward will work.
|
||||||
*/
|
*/
|
||||||
forward OnMapStart();
|
forward OnMapStart();
|
||||||
@ -126,6 +126,16 @@ forward OnMapStart();
|
|||||||
*/
|
*/
|
||||||
forward OnMapEnd();
|
forward OnMapEnd();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when the map has loaded and the servercfgfile has finished
|
||||||
|
* executing. This is usually 'server.cfg' but most mods allow it to
|
||||||
|
* be set via 'servercfgfile'.
|
||||||
|
*
|
||||||
|
* @note If server.cfg is executed more than once per map, this forward
|
||||||
|
* will only be called the first time (per map).
|
||||||
|
*/
|
||||||
|
forward OnServerCfg();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the calling plugin's Handle.
|
* Returns the calling plugin's Handle.
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user