From 70a594f354e7437efece8964dfcd25fe2dcbff3f Mon Sep 17 00:00:00 2001 From: David Anderson Date: Sat, 23 Aug 2008 19:51:02 +0000 Subject: [PATCH] Fixed bug 1750 and bug 1801. Orange Box changes the command processing heuristics without telling anyone, it looks like executing commands during the command buffer processing causes insertion to the beginning of the stream rather than end. Moving our callbacks to occur in a new frame seems to alleviate this. --HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%402468 --- core/CoreConfig.cpp | 18 +++++++++++------- core/CoreConfig.h | 1 + core/frame_hooks.cpp | 8 ++++++++ core/frame_hooks.h | 2 ++ 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/core/CoreConfig.cpp b/core/CoreConfig.cpp index 2b0fc95cc..07de47162 100644 --- a/core/CoreConfig.cpp +++ b/core/CoreConfig.cpp @@ -40,6 +40,7 @@ #include "Logger.h" #include "PluginSys.h" #include "ForwardSys.h" +#include "frame_hooks.h" #ifdef PLATFORM_WINDOWS ConVar sm_corecfgfile("sm_corecfgfile", "addons\\sourcemod\\configs\\core.cfg", 0, "SourceMod core configuration file"); @@ -102,9 +103,7 @@ void CheckAndFinalizeConfigs() if ((g_bServerExecd || g_ServerCfgFile == NULL) && g_bGotServerStart) { - /* Order is important here. We need to buffer things before we send the command out. */ - g_pOnAutoConfigsBuffered->Execute(NULL); - engine->ServerCommand("sm internal 1\n"); + g_PendingInternalPush = true; } } @@ -502,10 +501,6 @@ void SM_ExecuteAllConfigs() } iter->Release(); -#if defined ORANGEBOX_BUILD - engine->ServerExecute(); -#endif - g_bGotServerStart = true; CheckAndFinalizeConfigs(); } @@ -522,3 +517,12 @@ void SM_ConfigsExecuted_Global() g_pOnServerCfg->Execute(NULL); g_pOnConfigsExecuted->Execute(NULL); } + +void SM_InternalCmdTrigger() +{ + /* Order is important here. We need to buffer things before we send the command out. */ + g_pOnAutoConfigsBuffered->Execute(NULL); + engine->ServerCommand("sm internal 1\n"); + g_PendingInternalPush = false; +} + diff --git a/core/CoreConfig.h b/core/CoreConfig.h index 8a1732b71..5b1c605d1 100644 --- a/core/CoreConfig.h +++ b/core/CoreConfig.h @@ -68,6 +68,7 @@ extern void SM_ExecuteAllConfigs(); extern void SM_ExecuteForPlugin(IPluginContext *ctx); extern void SM_ConfigsExecuted_Global(); extern void SM_ConfigsExecuted_Plugin(unsigned int serial); +extern void SM_InternalCmdTrigger(); extern CoreConfig g_CoreConfig; diff --git a/core/frame_hooks.cpp b/core/frame_hooks.cpp index 4573af5a1..fa7a98f42 100644 --- a/core/frame_hooks.cpp +++ b/core/frame_hooks.cpp @@ -35,9 +35,11 @@ #include "MenuStyle_Valve.h" #include "MenuStyle_Radio.h" #include "PlayerManager.h" +#include "CoreConfig.h" float g_LastMenuTime = 0.0f; float g_LastAuthCheck = 0.0f; +bool g_PendingInternalPush = false; void RunFrameHooks(bool simulating) { @@ -45,6 +47,12 @@ void RunFrameHooks(bool simulating) g_DBMan.RunFrame(); g_HL2.ProcessFakeCliCmdQueue(); g_HL2.ProcessDelayedKicks(); + + if (g_PendingInternalPush) + { + SM_InternalCmdTrigger(); + } + g_SourceMod.ProcessGameFrameHooks(simulating); float curtime = *g_pUniversalTime; diff --git a/core/frame_hooks.h b/core/frame_hooks.h index 3bcb05b3e..8e27acd51 100644 --- a/core/frame_hooks.h +++ b/core/frame_hooks.h @@ -32,6 +32,8 @@ #ifndef _INCLUDE_SOURCEMOD_FRAME_HOOKS_H_ #define _INCLUDE_SOURCEMOD_FRAME_HOOKS_H_ +extern bool g_PendingInternalPush; + void RunFrameHooks(bool simulating); #endif //_INCLUDE_SOURCEMOD_FRAME_HOOKS_H_