diff --git a/core/TimerSys.cpp b/core/TimerSys.cpp index abb6a60c..2084b153 100644 --- a/core/TimerSys.cpp +++ b/core/TimerSys.cpp @@ -35,7 +35,6 @@ #include "frame_hooks.h" #include "ConVarManager.h" #include "logic_bridge.h" -#include #define TIMER_MIN_ACCURACY 0.1 @@ -171,8 +170,9 @@ void ITimer::Initialize(ITimedEvent *pCallbacks, float fInterval, float fToExec, TimerSystem::TimerSystem() { m_pMapTimer = NULL; + m_bHasMapTickedYet = false; + m_bHasMapSimulatedYet = false; m_fLastTickedTime = 0.0f; - OnSourceModLevelEnd(); } TimerSystem::~TimerSystem() @@ -213,28 +213,29 @@ void TimerSystem::OnSourceModLevelEnd() { m_bHasMapTickedYet = false; m_bHasMapSimulatedYet = false; - m_bWasSimulating = false; - m_uFramesAhead = 0; } -/* Think is called before gpGlobals is updated every frame, even if the server is hibernating */ -void TimerSystem::Think(bool unused) +void TimerSystem::GameFrame(bool simulating) { - m_uFramesAhead++; - bool simulating = m_bWasSimulating && m_uFramesAhead == 1; - - if (m_bHasMapTickedYet) { - g_fUniversalTime += gpGlobals->realtime - m_fLastTickedTime; - } else { + if (simulating && m_bHasMapTickedYet) + { + g_fUniversalTime += gpGlobals->curtime - m_fLastTickedTime; + if (!m_bHasMapSimulatedYet) + { + m_bHasMapSimulatedYet = true; + MapTimeLeftChanged(); + } + } + else + { g_fUniversalTime += gpGlobals->interval_per_tick; } - m_fLastTickedTime = gpGlobals->realtime; + m_fLastTickedTime = gpGlobals->curtime; m_bHasMapTickedYet = true; - logicore.callbacks->OnThink(simulating); - - if (g_fUniversalTime >= g_fTimerThink) { + if (g_fUniversalTime >= g_fTimerThink) + { RunFrame(); g_fTimerThink = CalcNextThink(g_fTimerThink, TIMER_MIN_ACCURACY); @@ -242,19 +243,9 @@ void TimerSystem::Think(bool unused) RunFrameHooks(simulating); - m_pOnGameFrame->Execute(); -} - -/* GameFrame is called after gpGlobals is updated, and may not be called when the server is hibernating */ -void TimerSystem::GameFrame(bool simulating) -{ - m_bWasSimulating = simulating; - m_uFramesAhead = 0; - - if (simulating && !m_bHasMapSimulatedYet) + if (m_pOnGameFrame->GetFunctionCount()) { - m_bHasMapSimulatedYet = true; - MapTimeLeftChanged(); + m_pOnGameFrame->Execute(NULL); } } diff --git a/core/TimerSys.h b/core/TimerSys.h index 62ee5e58..c5a9b758 100644 --- a/core/TimerSys.h +++ b/core/TimerSys.h @@ -82,7 +82,6 @@ public: //ITimerSystem public: void RunFrame(); void RemoveMapChangeTimers(); - void Think(bool unused); void GameFrame(bool simulating); private: List m_SingleTimers; @@ -93,8 +92,6 @@ private: /* This is stuff for our manual ticking escapades. */ bool m_bHasMapTickedYet; /** Has the map ticked yet? */ bool m_bHasMapSimulatedYet; /** Has the map simulated yet? */ - bool m_bWasSimulating; /** Was the last GameFrame simulating */ - unsigned m_uFramesAhead; /** Number of frames Think is ahead of GameFrame */ float m_fLastTickedTime; /** Last time that the game currently gave us while ticking. */ diff --git a/core/sourcemod.cpp b/core/sourcemod.cpp index a46cd1cb..eb55ed75 100644 --- a/core/sourcemod.cpp +++ b/core/sourcemod.cpp @@ -46,6 +46,7 @@ #include #include #include +#include #include SH_DECL_HOOK6(IServerGameDLL, LevelInit, SH_NOATTRIB, false, bool, const char *, const char *, const char *, const char *, bool, bool); @@ -290,7 +291,6 @@ bool SourceModBase::InitializeSourceMod(char *error, size_t maxlength, bool late void SourceModBase::StartSourceMod(bool late) { SH_ADD_HOOK(IServerGameDLL, LevelShutdown, gamedll, SH_MEMBER(this, &SourceModBase::LevelShutdown), false); - SH_ADD_HOOK(IServerGameDLL, Think, gamedll, SH_MEMBER(&g_Timers, &TimerSystem::Think), false); SH_ADD_HOOK(IServerGameDLL, GameFrame, gamedll, SH_MEMBER(&g_Timers, &TimerSystem::GameFrame), false); enginePatch = SH_GET_CALLCLASS(engine); @@ -362,6 +362,8 @@ void SourceModBase::StartSourceMod(bool late) { g_pSourcePawn2->InstallWatchdogTimer(atoi(timeout) * 1000); } + + SH_ADD_HOOK(IServerGameDLL, Think, gamedll, SH_MEMBER(logicore.callbacks, &IProviderCallbacks::OnThink), false); } static bool g_LevelEndBarrier = false; @@ -596,8 +598,8 @@ void SourceModBase::ShutdownServices() } SH_REMOVE_HOOK(IServerGameDLL, LevelShutdown, gamedll, SH_MEMBER(this, &SourceModBase::LevelShutdown), false); - SH_REMOVE_HOOK(IServerGameDLL, Think, gamedll, SH_MEMBER(&g_Timers, &TimerSystem::Think), false); SH_REMOVE_HOOK(IServerGameDLL, GameFrame, gamedll, SH_MEMBER(&g_Timers, &TimerSystem::GameFrame), false); + SH_REMOVE_HOOK(IServerGameDLL, Think, gamedll, SH_MEMBER(logicore.callbacks, &IProviderCallbacks::OnThink), false); } void SourceModBase::LogMessage(IExtension *pExt, const char *format, ...)