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()