void CLuaTimerManager::DoPulse ( CLuaMain* pLuaMain ) { CTickCount llCurrentTime = CTickCount::Now (); m_bIteratingList = true; list < CLuaTimer* > ::iterator iter = m_TimerList.begin (); for ( ; iter != m_TimerList.end (); ) { CLuaTimer* pLuaTimer = *iter; CTickCount llStartTime = pLuaTimer->GetStartTime (); CTickCount llDelay = pLuaTimer->GetDelay (); unsigned int uiRepeats = pLuaTimer->GetRepeats (); // Is the time up and is not being deleted if ( !pLuaTimer->IsBeingDeleted() && llCurrentTime >= ( llStartTime + llDelay ) ) { pLuaTimer->ExecuteTimer ( pLuaMain ); // If this is the last repeat, remove if ( uiRepeats == 1 ) { delete pLuaTimer; iter = m_TimerList.erase ( iter ); } else { // Decrease repeats if not infinite if ( uiRepeats != 0 ) (*iter)->SetRepeats ( uiRepeats - 1 ); pLuaTimer->SetStartTime ( llCurrentTime ); iter++; } } else { iter ++; } } m_bIteratingList = false; TakeOutTheTrash (); }
int CLuaTimerDefs::GetTimerDetails ( lua_State* luaVM ) { // int, int, int getTimerDetails ( timer theTimer ) CLuaTimer* pLuaTimer; CScriptArgReader argStream ( luaVM ); argStream.ReadUserData ( pLuaTimer ); if ( !argStream.HasErrors () ) { lua_pushnumber ( luaVM, pLuaTimer->GetTimeLeft ().ToDouble () ); lua_pushnumber ( luaVM, pLuaTimer->GetRepeats () ); lua_pushnumber ( luaVM, pLuaTimer->GetDelay ().ToDouble () ); return 3; } else m_pScriptDebugging->LogCustom ( luaVM, argStream.GetFullErrorMessage () ); lua_pushboolean ( luaVM, false ); return 1; }