core/CoreConfig.cpp
changeset 2166 b2594457bad1
parent 2065 e2e5445a2f9b
child 2235 a44942987c81
     1.1 --- a/core/CoreConfig.cpp	Sun Jul 06 03:30:06 2008 +0000
     1.2 +++ b/core/CoreConfig.cpp	Sun Jul 06 03:35:58 2008 +0000
     1.3 @@ -52,6 +52,61 @@
     1.4  IForward *g_pOnAutoConfigsBuffered = NULL;
     1.5  CoreConfig g_CoreConfig;
     1.6  bool g_bConfigsExecd = false;
     1.7 +bool g_bServerExecd = false;
     1.8 +bool g_bGotServerStart = false;
     1.9 +bool g_bGotTrigger = false;
    1.10 +ConCommand *g_pExecPtr = NULL;
    1.11 +ConVar *g_ServerCfgFile = NULL;
    1.12 +
    1.13 +void CheckAndFinalizeConfigs();
    1.14 +
    1.15 +#if defined ORANGEBOX_BUILD
    1.16 +SH_DECL_EXTERN1_void(ConCommand, Dispatch, SH_NOATTRIB, false, const CCommand &);
    1.17 +void Hook_ExecDispatchPre(const CCommand &cmd)
    1.18 +#else
    1.19 +extern bool __SourceHook_FHAddConCommandDispatch(void *,bool,class fastdelegate::FastDelegate0<void>);
    1.20 +extern bool __SourceHook_FHRemoveConCommandDispatch(void *,bool,class fastdelegate::FastDelegate0<void>);
    1.21 +void Hook_ExecDispatchPre()
    1.22 +#endif
    1.23 +{
    1.24 +#if !defined ORANGEBOX_BUILD
    1.25 +	CCommand cmd;
    1.26 +#endif
    1.27 +
    1.28 +	const char *arg = cmd.Arg(1);
    1.29 +
    1.30 +	if (!g_bServerExecd 
    1.31 +		&& arg != NULL 
    1.32 +		&& strcmp(arg, g_ServerCfgFile->GetString()) == 0)
    1.33 +	{
    1.34 +		g_bGotTrigger = true;
    1.35 +	}
    1.36 +}
    1.37 +
    1.38 +#if defined ORANGEBOX_BUILD
    1.39 +void Hook_ExecDispatchPost(const CCommand &cmd)
    1.40 +#else
    1.41 +void Hook_ExecDispatchPost()
    1.42 +#endif
    1.43 +{
    1.44 +	if (g_bGotTrigger)
    1.45 +	{
    1.46 +		g_bGotTrigger = false;
    1.47 +		g_bServerExecd = true;
    1.48 +		CheckAndFinalizeConfigs();
    1.49 +	}
    1.50 +}
    1.51 +
    1.52 +void CheckAndFinalizeConfigs()
    1.53 +{
    1.54 +	if ((g_bServerExecd || g_ServerCfgFile == NULL) 
    1.55 +		&& g_bGotServerStart)
    1.56 +	{
    1.57 +		/* Order is important here.  We need to buffer things before we send the command out. */
    1.58 +		g_pOnAutoConfigsBuffered->Execute(NULL);
    1.59 +		engine->ServerCommand("sm internal 1\n");
    1.60 +	}
    1.61 +}
    1.62  
    1.63  void CoreConfig::OnSourceModAllInitialized()
    1.64  {
    1.65 @@ -67,11 +122,52 @@
    1.66  	g_Forwards.ReleaseForward(g_pOnServerCfg);
    1.67  	g_Forwards.ReleaseForward(g_pOnConfigsExecuted);
    1.68  	g_Forwards.ReleaseForward(g_pOnAutoConfigsBuffered);
    1.69 +
    1.70 +	if (g_pExecPtr != NULL)
    1.71 +	{
    1.72 +		SH_REMOVE_HOOK_STATICFUNC(ConCommand, Dispatch, g_pExecPtr, Hook_ExecDispatchPre, false);
    1.73 +		SH_REMOVE_HOOK_STATICFUNC(ConCommand, Dispatch, g_pExecPtr, Hook_ExecDispatchPost, true);
    1.74 +		g_pExecPtr = NULL;
    1.75 +	}
    1.76  }
    1.77  
    1.78  void CoreConfig::OnSourceModLevelChange(const char *mapName)
    1.79  {
    1.80 +	static bool already_checked = false;
    1.81 +
    1.82 +	if (!already_checked)
    1.83 +	{
    1.84 +		g_ServerCfgFile = icvar->FindVar("servercfgfile");
    1.85 +		if (g_ServerCfgFile != NULL)
    1.86 +		{
    1.87 +			ConCommandBase *pBase = icvar->GetCommands();
    1.88 +			while (pBase != NULL)
    1.89 +			{
    1.90 +				if (pBase->IsCommand() && strcmp(pBase->GetName(), "exec") == 0)
    1.91 +				{
    1.92 +					break;
    1.93 +				}
    1.94 +				pBase = const_cast<ConCommandBase *>(pBase->GetNext());
    1.95 +			}
    1.96 +
    1.97 +			g_pExecPtr = (ConCommand *)pBase;
    1.98 +			if (g_pExecPtr != NULL)
    1.99 +			{
   1.100 +				SH_ADD_HOOK_STATICFUNC(ConCommand, Dispatch, g_pExecPtr, Hook_ExecDispatchPre, false);
   1.101 +				SH_ADD_HOOK_STATICFUNC(ConCommand, Dispatch, g_pExecPtr, Hook_ExecDispatchPost, true);
   1.102 +			}
   1.103 +			else
   1.104 +			{
   1.105 +				g_ServerCfgFile = NULL;
   1.106 +			}
   1.107 +		}
   1.108 +		already_checked = true;
   1.109 +	}
   1.110 +
   1.111  	g_bConfigsExecd = false;
   1.112 +	g_bServerExecd = false;
   1.113 +	g_bGotServerStart = false;
   1.114 +	g_bGotTrigger = false;
   1.115  }
   1.116  
   1.117  void CoreConfig::OnRootConsoleCommand(const char *cmdname, const CCommand &command)
   1.118 @@ -385,7 +481,7 @@
   1.119  
   1.120  void SM_ExecuteAllConfigs()
   1.121  {
   1.122 -	if (g_bConfigsExecd)
   1.123 +	if (g_bGotServerStart)
   1.124  	{
   1.125  		return;
   1.126  	}
   1.127 @@ -406,9 +502,12 @@
   1.128  	}
   1.129  	iter->Release();
   1.130  
   1.131 -	g_pOnAutoConfigsBuffered->Execute(NULL);
   1.132 +#if defined ORANGEBOX_BUILD
   1.133 +	engine->ServerExecute();
   1.134 +#endif
   1.135  
   1.136 -	engine->ServerCommand("sm internal 1\n");
   1.137 +	g_bGotServerStart = true;
   1.138 +	CheckAndFinalizeConfigs();
   1.139  }
   1.140  
   1.141  void SM_ConfigsExecuted_Global()