attempted fix for amb243, timers now simulate ticks if gameframe doesn't give changed curtimes
--HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40733
This commit is contained in:
		
							parent
							
								
									9219fbb96c
								
							
						
					
					
						commit
						b8d3ea5196
					
				@ -15,6 +15,17 @@
 | 
				
			|||||||
#include "TimerSys.h"
 | 
					#include "TimerSys.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TimerSystem g_Timers;
 | 
					TimerSystem g_Timers;
 | 
				
			||||||
 | 
					TickInfo g_SimTicks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline float GetSimulatedTime()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (g_SimTicks.ticking)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return gpGlobals->curtime;
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							return g_SimTicks.ticktime;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ITimer::Initialize(ITimedEvent *pCallbacks, float fInterval, float fToExec, void *pData, int flags)
 | 
					void ITimer::Initialize(ITimedEvent *pCallbacks, float fInterval, float fToExec, void *pData, int flags)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -52,10 +63,11 @@ void TimerSystem::RunFrame()
 | 
				
			|||||||
	ITimer *pTimer;
 | 
						ITimer *pTimer;
 | 
				
			||||||
	TimerIter iter;
 | 
						TimerIter iter;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						float curtime = GetSimulatedTime();
 | 
				
			||||||
	for (iter=m_SingleTimers.begin(); iter!=m_SingleTimers.end(); )
 | 
						for (iter=m_SingleTimers.begin(); iter!=m_SingleTimers.end(); )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		pTimer = (*iter);
 | 
							pTimer = (*iter);
 | 
				
			||||||
		if (gpGlobals->curtime >= pTimer->m_ToExec)
 | 
							if (curtime >= pTimer->m_ToExec)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			pTimer->m_InExec = true;
 | 
								pTimer->m_InExec = true;
 | 
				
			||||||
			pTimer->m_Listener->OnTimer(pTimer, pTimer->m_pData);
 | 
								pTimer->m_Listener->OnTimer(pTimer, pTimer->m_pData);
 | 
				
			||||||
@ -71,7 +83,7 @@ void TimerSystem::RunFrame()
 | 
				
			|||||||
	for (iter=m_LoopTimers.begin(); iter!=m_LoopTimers.end(); )
 | 
						for (iter=m_LoopTimers.begin(); iter!=m_LoopTimers.end(); )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		pTimer = (*iter);
 | 
							pTimer = (*iter);
 | 
				
			||||||
		if (gpGlobals->curtime >= pTimer->m_ToExec)
 | 
							if (curtime >= pTimer->m_ToExec)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			pTimer->m_InExec = true;
 | 
								pTimer->m_InExec = true;
 | 
				
			||||||
			res = pTimer->m_Listener->OnTimer(pTimer, pTimer->m_pData);
 | 
								res = pTimer->m_Listener->OnTimer(pTimer, pTimer->m_pData);
 | 
				
			||||||
@ -83,19 +95,19 @@ void TimerSystem::RunFrame()
 | 
				
			|||||||
				continue;
 | 
									continue;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			pTimer->m_InExec = false;
 | 
								pTimer->m_InExec = false;
 | 
				
			||||||
			pTimer->m_ToExec = gpGlobals->curtime + pTimer->m_Interval;
 | 
								pTimer->m_ToExec = curtime + pTimer->m_Interval;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		iter++;
 | 
							iter++;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	m_LastExecTime = gpGlobals->curtime;
 | 
						m_LastExecTime = curtime;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ITimer *TimerSystem::CreateTimer(ITimedEvent *pCallbacks, float fInterval, void *pData, int flags)
 | 
					ITimer *TimerSystem::CreateTimer(ITimedEvent *pCallbacks, float fInterval, void *pData, int flags)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	ITimer *pTimer;
 | 
						ITimer *pTimer;
 | 
				
			||||||
	TimerIter iter;
 | 
						TimerIter iter;
 | 
				
			||||||
	float to_exec = gpGlobals->curtime + fInterval;
 | 
						float to_exec = GetSimulatedTime() + fInterval;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (m_FreeTimers.empty())
 | 
						if (m_FreeTimers.empty())
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@ -160,7 +172,7 @@ void TimerSystem::FireTimerOnce(ITimer *pTimer, bool delayExec)
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
			if (delayExec)
 | 
								if (delayExec)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				pTimer->m_ToExec = gpGlobals->curtime + pTimer->m_Interval;
 | 
									pTimer->m_ToExec = GetSimulatedTime() + pTimer->m_Interval;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			pTimer->m_InExec = false;
 | 
								pTimer->m_InExec = false;
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
@ -203,12 +215,14 @@ void TimerSystem::MapChange()
 | 
				
			|||||||
	for (iter=m_SingleTimers.begin(); iter!=m_SingleTimers.end(); iter++)
 | 
						for (iter=m_SingleTimers.begin(); iter!=m_SingleTimers.end(); iter++)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		pTimer = (*iter);
 | 
							pTimer = (*iter);
 | 
				
			||||||
		pTimer->m_ToExec = pTimer->m_ToExec - m_LastExecTime + gpGlobals->curtime;
 | 
							pTimer->m_ToExec = pTimer->m_ToExec - m_LastExecTime + GetSimulatedTime();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (iter=m_LoopTimers.begin(); iter!=m_LoopTimers.end(); iter++)
 | 
						for (iter=m_LoopTimers.begin(); iter!=m_LoopTimers.end(); iter++)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		pTimer = (*iter);
 | 
							pTimer = (*iter);
 | 
				
			||||||
		pTimer->m_ToExec = pTimer->m_ToExec - m_LastExecTime + gpGlobals->curtime;
 | 
							pTimer->m_ToExec = pTimer->m_ToExec - m_LastExecTime + GetSimulatedTime();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						m_LastExecTime = GetSimulatedTime();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -27,6 +27,13 @@ using namespace SourceMod;
 | 
				
			|||||||
typedef List<ITimer *> TimerList;
 | 
					typedef List<ITimer *> TimerList;
 | 
				
			||||||
typedef List<ITimer *>::iterator TimerIter;
 | 
					typedef List<ITimer *>::iterator TimerIter;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct TickInfo
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						bool ticking;				/* true=game is ticking, false=we're ticking */
 | 
				
			||||||
 | 
						unsigned int tickcount;		/* number of simulated ticks we've done */
 | 
				
			||||||
 | 
						float ticktime;				/* tick time we're maintaining */
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class SourceMod::ITimer
 | 
					class SourceMod::ITimer
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
@ -64,5 +71,6 @@ private:
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern TimerSystem g_Timers;
 | 
					extern TimerSystem g_Timers;
 | 
				
			||||||
 | 
					extern TickInfo g_SimTicks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif //_INCLUDE_SOURCEMOD_CTIMERSYS_H_
 | 
					#endif //_INCLUDE_SOURCEMOD_CTIMERSYS_H_
 | 
				
			||||||
 | 
				
			|||||||
@ -47,6 +47,8 @@ float g_LastAuthCheck = 0.0f;
 | 
				
			|||||||
IForward *g_pOnGameFrame = NULL;
 | 
					IForward *g_pOnGameFrame = NULL;
 | 
				
			||||||
IForward *g_pOnMapEnd = NULL;
 | 
					IForward *g_pOnMapEnd = NULL;
 | 
				
			||||||
bool g_Loaded = false;
 | 
					bool g_Loaded = false;
 | 
				
			||||||
 | 
					int g_StillFrames = 0;
 | 
				
			||||||
 | 
					float g_StillTime = 0.0f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef int (*GIVEENGINEPOINTER)(ISourcePawnEngine *);
 | 
					typedef int (*GIVEENGINEPOINTER)(ISourcePawnEngine *);
 | 
				
			||||||
typedef unsigned int (*GETEXPORTCOUNT)();
 | 
					typedef unsigned int (*GETEXPORTCOUNT)();
 | 
				
			||||||
@ -263,6 +265,10 @@ bool SourceModBase::LevelInit(char const *pMapName, char const *pMapEntities, ch
 | 
				
			|||||||
	m_ExecPluginReload = true;
 | 
						m_ExecPluginReload = true;
 | 
				
			||||||
	g_LastTime = 0.0f;
 | 
						g_LastTime = 0.0f;
 | 
				
			||||||
	g_LastAuthCheck = 0.0f;
 | 
						g_LastAuthCheck = 0.0f;
 | 
				
			||||||
 | 
						g_SimTicks.ticking = true;
 | 
				
			||||||
 | 
						g_SimTicks.tickcount = 0;
 | 
				
			||||||
 | 
						g_StillTime = 0.0f;
 | 
				
			||||||
 | 
						g_StillFrames = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Notify! */
 | 
						/* Notify! */
 | 
				
			||||||
	SMGlobalClass *pBase = SMGlobalClass::head;
 | 
						SMGlobalClass *pBase = SMGlobalClass::head;
 | 
				
			||||||
@ -297,6 +303,27 @@ bool SourceModBase::LevelInit(char const *pMapName, char const *pMapEntities, ch
 | 
				
			|||||||
	RETURN_META_VALUE(MRES_IGNORED, true);
 | 
						RETURN_META_VALUE(MRES_IGNORED, true);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void StartTickSimulation()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						g_SimTicks.ticking = false;
 | 
				
			||||||
 | 
						g_SimTicks.tickcount = 0;
 | 
				
			||||||
 | 
						g_SimTicks.ticktime = gpGlobals->curtime;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void StopTickSimulation()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						g_SimTicks.ticking = true;
 | 
				
			||||||
 | 
						g_Timers.MapChange();
 | 
				
			||||||
 | 
						g_StillFrames = 0;
 | 
				
			||||||
 | 
						g_LastTime = gpGlobals->curtime;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void SimulateTick()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						g_SimTicks.tickcount++;
 | 
				
			||||||
 | 
						g_SimTicks.ticktime = g_StillTime + (g_SimTicks.tickcount * gpGlobals->interval_per_tick);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SourceModBase::GameFrame(bool simulating)
 | 
					void SourceModBase::GameFrame(bool simulating)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
@ -304,6 +331,46 @@ void SourceModBase::GameFrame(bool simulating)
 | 
				
			|||||||
	 * precious CPU cycles.
 | 
						 * precious CPU cycles.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	float curtime = gpGlobals->curtime;
 | 
						float curtime = gpGlobals->curtime;
 | 
				
			||||||
 | 
						int framecount = gpGlobals->framecount;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Verify that we're still ticking */
 | 
				
			||||||
 | 
						if (g_SimTicks.ticking)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (g_StillFrames == 0)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								g_StillFrames = framecount;
 | 
				
			||||||
 | 
								g_StillTime = curtime;
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								/* Try to detect when we've stopped ticking.
 | 
				
			||||||
 | 
								 * We do this once 10 frames pass and there have been no ticks.
 | 
				
			||||||
 | 
								 */
 | 
				
			||||||
 | 
								if (g_StillTime == curtime)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									if (framecount - g_StillFrames >= 5)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										StartTickSimulation();
 | 
				
			||||||
 | 
										return;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									/* We're definitely ticking we get here, 
 | 
				
			||||||
 | 
									 * but update everything as a precaution */
 | 
				
			||||||
 | 
									g_StillFrames = framecount;
 | 
				
			||||||
 | 
									g_StillTime = curtime;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							/* We need to make sure we should still be simulating. */
 | 
				
			||||||
 | 
							if (g_StillTime != curtime)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								/* Wow, we're ticking again! It's time to revert. */
 | 
				
			||||||
 | 
								StopTickSimulation();
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							/* Nope, not ticking.  Simulate! */
 | 
				
			||||||
 | 
							SimulateTick();
 | 
				
			||||||
 | 
							curtime = g_SimTicks.ticktime;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (curtime - g_LastTime >= 0.1f)
 | 
						if (curtime - g_LastTime >= 0.1f)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if (m_CheckingAuth
 | 
							if (m_CheckingAuth
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user