fixed inheritance not being used in the base menu style when removing clients from the watch list
3 * ===============================================================
4 * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
5 * ===============================================================
7 * This file is not open source and may not be copied without explicit
8 * written permission of AlliedModders LLC. This file may not be redistributed
9 * in whole or significant part.
10 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
20 inline float GetSimulatedTime()
22 if (g_SimTicks.ticking)
24 return gpGlobals->curtime;
26 return g_SimTicks.ticktime;
30 void ITimer::Initialize(ITimedEvent *pCallbacks, float fInterval, float fToExec, void *pData, int flags)
32 m_Listener = pCallbacks;
33 m_Interval = fInterval;
41 TimerSystem::~TimerSystem()
43 CStack<ITimer *>::iterator iter;
44 for (iter=m_FreeTimers.begin(); iter!=m_FreeTimers.end(); iter++)
48 m_FreeTimers.popall();
51 void TimerSystem::OnSourceModAllInitialized()
53 g_ShareSys.AddInterface(NULL, this);
56 void TimerSystem::OnSourceModLevelChange(const char *mapName)
61 void TimerSystem::RunFrame()
66 float curtime = GetSimulatedTime();
67 for (iter=m_SingleTimers.begin(); iter!=m_SingleTimers.end(); )
70 if (curtime >= pTimer->m_ToExec)
72 pTimer->m_InExec = true;
73 pTimer->m_Listener->OnTimer(pTimer, pTimer->m_pData);
74 pTimer->m_Listener->OnTimerEnd(pTimer, pTimer->m_pData);
75 iter = m_SingleTimers.erase(iter);
76 m_FreeTimers.push(pTimer);
83 for (iter=m_LoopTimers.begin(); iter!=m_LoopTimers.end(); )
86 if (curtime >= pTimer->m_ToExec)
88 pTimer->m_InExec = true;
89 res = pTimer->m_Listener->OnTimer(pTimer, pTimer->m_pData);
90 if (pTimer->m_KillMe || (res == Pl_Stop))
92 pTimer->m_Listener->OnTimerEnd(pTimer, pTimer->m_pData);
93 iter = m_LoopTimers.erase(iter);
94 m_FreeTimers.push(pTimer);
97 pTimer->m_InExec = false;
98 pTimer->m_ToExec = curtime + pTimer->m_Interval;
103 m_LastExecTime = curtime;
106 ITimer *TimerSystem::CreateTimer(ITimedEvent *pCallbacks, float fInterval, void *pData, int flags)
110 float to_exec = GetSimulatedTime() + fInterval;
112 if (m_FreeTimers.empty())
116 pTimer = m_FreeTimers.front();
120 pTimer->Initialize(pCallbacks, fInterval, to_exec, pData, flags);
122 if (flags & TIMER_FLAG_REPEAT)
124 m_LoopTimers.push_back(pTimer);
128 if (m_SingleTimers.size() >= 1)
130 iter = --m_SingleTimers.end();
131 if ((*iter)->m_ToExec <= to_exec)
137 for (iter=m_SingleTimers.begin(); iter!=m_SingleTimers.end(); iter++)
139 if ((*iter)->m_ToExec >= to_exec)
141 m_SingleTimers.insert(iter, pTimer);
147 m_SingleTimers.push_back(pTimer);
153 void TimerSystem::FireTimerOnce(ITimer *pTimer, bool delayExec)
157 if (pTimer->m_InExec)
162 pTimer->m_InExec = true;
163 res = pTimer->m_Listener->OnTimer(pTimer, pTimer->m_pData);
165 if (!(pTimer->m_Flags & TIMER_FLAG_REPEAT))
167 pTimer->m_Listener->OnTimerEnd(pTimer, pTimer->m_pData);
168 m_SingleTimers.remove(pTimer);
169 m_FreeTimers.push(pTimer);
171 if ((res != Pl_Stop) && !pTimer->m_KillMe)
175 pTimer->m_ToExec = GetSimulatedTime() + pTimer->m_Interval;
177 pTimer->m_InExec = false;
180 pTimer->m_Listener->OnTimerEnd(pTimer, pTimer->m_pData);
181 m_LoopTimers.remove(pTimer);
182 m_FreeTimers.push(pTimer);
186 void TimerSystem::KillTimer(ITimer *pTimer)
190 if (pTimer->m_KillMe)
195 if (pTimer->m_InExec)
197 pTimer->m_KillMe = true;
201 pTimer->m_InExec = true; /* The timer it's not really executed but this check needs to be done */
202 pTimer->m_Listener->OnTimerEnd(pTimer, pTimer->m_pData);
204 pList = (pTimer->m_Flags & TIMER_FLAG_REPEAT) ? &m_LoopTimers : &m_SingleTimers;
206 pList->remove(pTimer);
207 m_FreeTimers.push(pTimer);
210 void TimerSystem::MapChange()
215 for (iter=m_SingleTimers.begin(); iter!=m_SingleTimers.end(); iter++)
218 pTimer->m_ToExec = pTimer->m_ToExec - m_LastExecTime + GetSimulatedTime();
221 for (iter=m_LoopTimers.begin(); iter!=m_LoopTimers.end(); iter++)
224 pTimer->m_ToExec = pTimer->m_ToExec - m_LastExecTime + GetSimulatedTime();
227 m_LastExecTime = GetSimulatedTime();