int CLuaTimerDefs::GetTimers ( lua_State* luaVM ) { // table getTimers ( [ time ] ) double dTime; CScriptArgReader argStream ( luaVM ); argStream.ReadNumber ( dTime, 0 ); if ( !argStream.HasErrors () ) { // Find our VM CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine ( luaVM ); if ( pLuaMain ) { // Create a new table lua_newtable ( luaVM ); // Add all the timers with less than ulTime left CLuaTimerManager* pLuaTimerManager = pLuaMain->GetTimerManager (); CTickCount llCurrentTime = CTickCount::Now (); unsigned int uiIndex = 0; CFastList < CLuaTimer* > ::const_iterator iter = pLuaTimerManager->IterBegin (); for ( ; iter != pLuaTimerManager->IterEnd (); iter++ ) { CLuaTimer* pLuaTimer = *iter; // If the time left is less than the time specified, or the time specifed is 0 CTickCount llTimeLeft = ( pLuaTimer->GetStartTime () + pLuaTimer->GetDelay () ) - llCurrentTime; if ( dTime == 0 || llTimeLeft.ToDouble () <= dTime ) { // Add it to the table lua_pushnumber ( luaVM, ++uiIndex ); lua_pushtimer ( luaVM, pLuaTimer ); lua_settable ( luaVM, -3 ); } } return 1; } } else m_pScriptDebugging->LogCustom ( luaVM, argStream.GetFullErrorMessage () ); lua_pushboolean ( luaVM, false ); return 1; }
CLuaTimer* CLuaTimerManager::AddTimer ( const CLuaFunctionRef& iLuaFunction, CTickCount llTimeDelay, unsigned int uiRepeats, const CLuaArguments& Arguments ) { // Check for the minimum interval if ( llTimeDelay.ToLongLong () < LUA_TIMER_MIN_INTERVAL ) return NULL; if ( VERIFY_FUNCTION ( iLuaFunction ) ) { // Add the timer CLuaTimer* pLuaTimer = new CLuaTimer ( iLuaFunction, Arguments ); pLuaTimer->SetStartTime ( CTickCount::Now () ); pLuaTimer->SetDelay ( llTimeDelay ); pLuaTimer->SetRepeats ( uiRepeats ); m_TimerList.push_back ( pLuaTimer ); return pLuaTimer; } return NULL; }
int CLuaTimerDefs::SetTimer ( lua_State* luaVM ) { // timer setTimer ( function theFunction, int timeInterval, int timesToExecute, [ var arguments... ] ) CLuaFunctionRef iLuaFunction; double dTimeInterval; uint uiTimesToExecute; CLuaArguments Arguments; CScriptArgReader argStream ( luaVM ); argStream.ReadFunction ( iLuaFunction ); argStream.ReadNumber ( dTimeInterval ); argStream.ReadNumber ( uiTimesToExecute ); argStream.ReadLuaArguments ( Arguments ); argStream.ReadFunctionComplete (); if ( !argStream.HasErrors () ) { CLuaMain * luaMain = m_pLuaManager->GetVirtualMachine ( luaVM ); if ( luaMain ) { // Check for the minimum interval if ( dTimeInterval < LUA_TIMER_MIN_INTERVAL ) { argStream.SetCustomError ( "Interval is below 50" ); } else { CLuaTimer* pLuaTimer = luaMain->GetTimerManager ()->AddTimer ( iLuaFunction, CTickCount ( dTimeInterval ), uiTimesToExecute, Arguments ); if ( pLuaTimer ) { // Set our timer debug info (in case we don't have any debug info which is usually when you do setTimer(destroyElement, 50, 1) or such) pLuaTimer->SetLuaDebugInfo ( g_pClientGame->GetScriptDebugging ()->GetLuaDebugInfo ( luaVM ) ); lua_pushtimer ( luaVM, pLuaTimer ); return 1; } } } } if ( argStream.HasErrors () ) m_pScriptDebugging->LogCustom ( luaVM, argStream.GetFullErrorMessage () ); lua_pushboolean ( luaVM, false ); return 1; }
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; }
CLuaTimer* CLuaTimerManager::AddTimer ( lua_State* luaVM ) { if ( luaVM ) { int iArgument2 = lua_type ( luaVM, 2 ); int iArgument3 = lua_type ( luaVM, 3 ); if ( lua_type ( luaVM, 1 ) && (( iArgument2 == LUA_TNUMBER || iArgument2 == LUA_TSTRING ) || ( iArgument3 == LUA_TNUMBER || iArgument3 == LUA_TSTRING ) )) { // Grab the string argument, start-time, delay and repeats unsigned long ulTimeDelay = static_cast < unsigned long > ( lua_tonumber ( luaVM, 2 ) ); unsigned int uiRepeats = static_cast < unsigned int > ( lua_tonumber ( luaVM, 3 ) ); // Check for the minimum interval if ( ulTimeDelay < LUA_TIMER_MIN_INTERVAL ) return NULL; // Grab the arguments from argument 4 and up CLuaArguments Arguments; Arguments.ReadArguments ( luaVM, 4 ); int iLuaFunction = luaM_toref ( luaVM, 1 ); if ( iLuaFunction != LUA_REFNIL ) { // Add the timer CLuaTimer* pLuaTimer = new CLuaTimer ( iLuaFunction, Arguments ); pLuaTimer->SetStartTime ( GetTime () ); pLuaTimer->SetDelay ( ulTimeDelay ); pLuaTimer->SetRepeats ( uiRepeats ); m_TimerList.push_back ( pLuaTimer ); return pLuaTimer; } } } return false; }
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 (); }