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; | ||||
| }; | ||||
| typedef List<PlCmdInfo> CmdList; | ||||
| 
 | ||||
| void AddToPlCmdList(CmdList *pList, const PlCmdInfo &info); | ||||
| 
 | ||||
| ConCmdManager::ConCmdManager() : m_Strings(1024) | ||||
| { | ||||
| 	m_pCmds = sm_trie_create(); | ||||
| 	m_pCmdGrps = sm_trie_create(); | ||||
| 	m_bServerCfgDone = true; | ||||
| 	m_pExecCmd = NULL; | ||||
| 	m_pServerCfgFile = NULL; | ||||
| 	m_pServerCfgFwd = NULL; | ||||
| } | ||||
| 
 | ||||
| ConCmdManager::~ConCmdManager() | ||||
| @ -50,15 +55,73 @@ void ConCmdManager::OnSourceModAllInitialized() | ||||
| 	g_PluginSys.AddPluginsListener(this); | ||||
| 	g_RootMenu.AddRootConsoleCommand("cmds", "List console commands", this); | ||||
| 	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() | ||||
| { | ||||
| 	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 */ | ||||
| 	SH_REMOVE_HOOK_MEMFUNC(IServerGameClients, SetCommandClient, serverClients, this, &ConCmdManager::SetCommandClient, false); | ||||
| 	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) | ||||
| { | ||||
| 	List<CmdHook *>::iterator iter = cmdlist.begin(); | ||||
| @ -732,6 +795,16 @@ void ConCmdManager::OnRootConsoleCommand(const char *command, unsigned int argco | ||||
| 	if (argcount >= 3) | ||||
| 	{ | ||||
| 		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); | ||||
| 		CPlugin *pPlugin = g_PluginSys.GetPluginByOrder(id); | ||||
| 
 | ||||
|  | ||||
| @ -84,6 +84,7 @@ public: | ||||
| public: //SMGlobalClass
 | ||||
| 	void OnSourceModAllInitialized(); | ||||
| 	void OnSourceModShutdown(); | ||||
| 	void OnSourceModPluginsLoaded(); | ||||
| public: //IPluginsListener
 | ||||
| 	void OnPluginDestroyed(IPlugin *plugin); | ||||
| public: //IRootConsoleCommand
 | ||||
| @ -99,6 +100,7 @@ public: | ||||
| 						 int flags); | ||||
| 	ResultType DispatchClientCommand(int client, ResultType type); | ||||
| 	void UpdateAdminCmdFlags(const char *cmd, OverrideType type, FlagBits bits); | ||||
| 	void NotifyExecDone(const char *file); | ||||
| private: | ||||
| 	void InternalDispatch(); | ||||
| 	ResultType RunAdminCommand(ConCmdInfo *pInfo, int client, int args); | ||||
| @ -108,12 +110,17 @@ private: | ||||
| 	void RemoveConCmd(ConCmdInfo *info); | ||||
| 	void RemoveConCmds(List<CmdHook *> &cmdlist, IPluginContext *pContext); | ||||
| 	bool CheckAccess(int client, const char *cmd, AdminCmdInfo *pAdmin); | ||||
| 	void OnExecCmd(); | ||||
| private: | ||||
| 	Trie *m_pCmds;					/* command lookup */ | ||||
| 	Trie *m_pCmdGrps;				/* command group lookup */ | ||||
| 	List<ConCmdInfo *> m_CmdList;	/* command list */ | ||||
| 	int m_CmdClient;				/* current client */ | ||||
| 	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; | ||||
|  | ||||
| @ -116,7 +116,7 @@ forward OnGameFrame(); | ||||
| /** | ||||
|  * 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. | ||||
|  */ | ||||
| forward OnMapStart(); | ||||
| @ -126,6 +126,16 @@ forward OnMapStart(); | ||||
|  */ | ||||
| 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. | ||||
|  * | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user