1.1 --- a/core/TimerSys.cpp Tue Sep 11 15:10:18 2007 +0000
1.2 +++ b/core/TimerSys.cpp Tue Sep 11 18:02:59 2007 +0000
1.3 @@ -34,7 +34,6 @@
1.4 #include "sourcemm_api.h"
1.5
1.6 TimerSystem g_Timers;
1.7 -TickInfo g_SimTicks;
1.8
1.9 ConVar sm_time_adjustment("sm_time_adjustment", "0", 0, "Adjusts the server time in seconds");
1.10
1.11 @@ -50,12 +49,7 @@
1.12
1.13 inline float GetSimulatedTime()
1.14 {
1.15 - if (g_SimTicks.ticking)
1.16 - {
1.17 - return gpGlobals->curtime;
1.18 - } else {
1.19 - return g_SimTicks.ticktime;
1.20 - }
1.21 + return engine->Time();
1.22 }
1.23
1.24 void ITimer::Initialize(ITimedEvent *pCallbacks, float fInterval, float fToExec, void *pData, int flags)
1.25 @@ -110,6 +104,25 @@
1.26 }
1.27 }
1.28
1.29 + if (m_fnTimeLeft != NULL && m_MapEndTimers.size())
1.30 + {
1.31 + float time_left = m_fnTimeLeft();
1.32 + for (iter=m_MapEndTimers.begin(); iter!=m_MapEndTimers.end();)
1.33 + {
1.34 + pTimer = (*iter);
1.35 + if ((*iter)->m_Interval < time_left)
1.36 + {
1.37 + pTimer->m_InExec = true;
1.38 + pTimer->m_Listener->OnTimer(pTimer, pTimer->m_pData);
1.39 + pTimer->m_Listener->OnTimerEnd(pTimer, pTimer->m_pData);
1.40 + iter = m_MapEndTimers.erase(iter);
1.41 + m_FreeTimers.push(pTimer);
1.42 + } else {
1.43 + break;
1.44 + }
1.45 + }
1.46 + }
1.47 +
1.48 ResultType res;
1.49 for (iter=m_LoopTimers.begin(); iter!=m_LoopTimers.end(); )
1.50 {
1.51 @@ -156,27 +169,41 @@
1.52 goto return_timer;
1.53 }
1.54
1.55 - if (m_SingleTimers.size() >= 1)
1.56 + if (flags & TIMER_FLAG_BEFORE_MAP_END)
1.57 {
1.58 - iter = --m_SingleTimers.end();
1.59 - if ((*iter)->m_ToExec <= to_exec)
1.60 + for (iter=m_MapEndTimers.begin(); iter!=m_MapEndTimers.end(); iter++)
1.61 {
1.62 - goto insert_end;
1.63 + if (fInterval >= (*iter)->m_Interval)
1.64 + {
1.65 + m_MapEndTimers.insert(iter, pTimer);
1.66 + goto return_timer;
1.67 + }
1.68 }
1.69 - }
1.70
1.71 - for (iter=m_SingleTimers.begin(); iter!=m_SingleTimers.end(); iter++)
1.72 - {
1.73 - if ((*iter)->m_ToExec >= to_exec)
1.74 + m_MapEndTimers.push_back(pTimer);
1.75 + } else {
1.76 + if (m_SingleTimers.size() >= 1)
1.77 {
1.78 - m_SingleTimers.insert(iter, pTimer);
1.79 - goto return_timer;
1.80 + iter = --m_SingleTimers.end();
1.81 + if ((*iter)->m_ToExec <= to_exec)
1.82 + {
1.83 + goto normal_insert_end;
1.84 + }
1.85 }
1.86 +
1.87 + for (iter=m_SingleTimers.begin(); iter!=m_SingleTimers.end(); iter++)
1.88 + {
1.89 + if ((*iter)->m_ToExec >= to_exec)
1.90 + {
1.91 + m_SingleTimers.insert(iter, pTimer);
1.92 + goto return_timer;
1.93 + }
1.94 + }
1.95 +
1.96 +normal_insert_end:
1.97 + m_SingleTimers.push_back(pTimer);
1.98 }
1.99
1.100 -insert_end:
1.101 - m_SingleTimers.push_back(pTimer);
1.102 -
1.103 return_timer:
1.104 return pTimer;
1.105 }
1.106 @@ -196,7 +223,12 @@
1.107 if (!(pTimer->m_Flags & TIMER_FLAG_REPEAT))
1.108 {
1.109 pTimer->m_Listener->OnTimerEnd(pTimer, pTimer->m_pData);
1.110 - m_SingleTimers.remove(pTimer);
1.111 + if (pTimer->m_Flags & TIMER_FLAG_BEFORE_MAP_END)
1.112 + {
1.113 + m_MapEndTimers.remove(pTimer);
1.114 + } else {
1.115 + m_SingleTimers.remove(pTimer);
1.116 + }
1.117 m_FreeTimers.push(pTimer);
1.118 } else {
1.119 if ((res != Pl_Stop) && !pTimer->m_KillMe)
1.120 @@ -232,7 +264,14 @@
1.121 pTimer->m_InExec = true; /* The timer it's not really executed but this check needs to be done */
1.122 pTimer->m_Listener->OnTimerEnd(pTimer, pTimer->m_pData);
1.123
1.124 - pList = (pTimer->m_Flags & TIMER_FLAG_REPEAT) ? &m_LoopTimers : &m_SingleTimers;
1.125 + if (pTimer->m_Flags & TIMER_FLAG_REPEAT)
1.126 + {
1.127 + m_LoopTimers.remove(pTimer);
1.128 + } else if (pTimer->m_Flags & TIMER_FLAG_BEFORE_MAP_END) {
1.129 + m_MapEndTimers.remove(pTimer);
1.130 + } else {
1.131 + m_SingleTimers.remove(pTimer);
1.132 + }
1.133
1.134 pList->remove(pTimer);
1.135 m_FreeTimers.push(pTimer);
1.136 @@ -266,6 +305,15 @@
1.137 }
1.138 }
1.139
1.140 + if (real_mapchange)
1.141 + {
1.142 + for (iter=m_MapEndTimers.begin(); iter!=m_MapEndTimers.end(); iter++)
1.143 + {
1.144 + pTimer = (*iter);
1.145 + s_tokill.push(pTimer);
1.146 + }
1.147 + }
1.148 +
1.149 while (!s_tokill.empty())
1.150 {
1.151 KillTimer(s_tokill.front());
1.152 @@ -274,3 +322,11 @@
1.153
1.154 m_LastExecTime = GetSimulatedTime();
1.155 }
1.156 +
1.157 +SM_TIMELEFT_FUNCTION TimerSystem::SetTimeLeftFunction(SM_TIMELEFT_FUNCTION fn)
1.158 +{
1.159 + SM_TIMELEFT_FUNCTION old = m_fnTimeLeft;
1.160 + m_fnTimeLeft = fn;
1.161 + return old;
1.162 +}
1.163 +