_MEMBER_FUNCTION_IMPL(timer, constructor) { // Check the param count CHECK_PARAMS_MIN("timer", 3); // if( sq_gettype( pVM, 2 ) != OT_NATIVECLOSURE ) CHECK_TYPE("timer", 1, 2, OT_CLOSURE); // Check the params CHECK_TYPE("timer", 2, 3, OT_INTEGER); CHECK_TYPE("timer", 3, 4, OT_INTEGER); SQInteger iInterval = 0; SQInteger iRepeations = 0; // Get the params sq_getinteger( pVM, 3, &iInterval ); sq_getinteger( pVM, 4, &iRepeations ); // Invalid repeations? if( iRepeations < -1 || iRepeations == 0 ) { sq_pushbool( pVM, false ); return 1; } // Get the timer end function SQObjectPtr pFunction = stack_get( pVM, 2 ); // Create the arguments CSquirrelArguments * pArguments = new CSquirrelArguments( pVM, 5 ); // Get the current script instance #ifdef _CLIENT CSquirrel * pScript = pCore->GetClientScriptingManager()->GetScriptingManager()->Get( pVM ); #else CSquirrel * pScript = pCore->GetScriptingManager()->Get( pVM ); #endif // Create the timer instance CTimer * pTimer = new CTimer( pScript, pFunction, iInterval, iRepeations, pArguments ); // Did it fail to set the timer instance? if( SQ_FAILED( sq_setinstance( pVM, pTimer) ) ) { // Delete the timer SAFE_DELETE( pTimer ); sq_pushbool( pVM, false ); return 1; } // Add the timer into the manager pCore->GetTimerManager()->push_back( pTimer ); sq_pushbool( pVM, true ); return 1; }
// TODO: 'Call for this script only' argument // callEvent(eventname, defaultretval, ...) SQInteger CEventNatives::Call(SQVM * pVM) { CHECK_PARAMS_MIN("callEvent", 2); CHECK_TYPE("callEvent", 1, 2, OT_STRING); SQInteger iTop = sq_gettop(pVM); // Get the name const char * szEventName; sq_getstring(pVM, 2, &szEventName); // Grab all arguments CSquirrelArguments pArguments; for(SQInteger i = 3; i <= iTop; ++ i) pArguments.pushFromStack(pVM, i); // Call the event CSquirrelArgument pReturn = CEvents::GetInstance()->Call(szEventName, &pArguments); pReturn.push(pVM); return 1; }
_MEMBER_FUNCTION_IMPL(timer, constructor) { CHECK_PARAMS_MIN("timer", 3); if(sq_gettype(pVM, 2) != OT_NATIVECLOSURE) CHECK_TYPE("timer", 1, 2, OT_CLOSURE); CHECK_TYPE("timer", 2, 3, OT_INTEGER); CHECK_TYPE("timer", 3, 4, OT_INTEGER); SQInteger interval = 0; SQInteger repeations = 0; sq_getinteger(pVM, 3, &interval); sq_getinteger(pVM, 4, &repeations); // Ensure we have a valid repeations value if(repeations < -1 || repeations == 0) { sq_pushbool(pVM, false); return 1; } SQObjectPtr pFunction; pFunction = stack_get(pVM, 2); CSquirrelArguments * pArguments = new CSquirrelArguments(pVM, 5); CScriptTimer * pTimer = new CScriptTimer(CScriptingManager::GetInstance()->Get(pVM), pFunction, interval, repeations, pArguments); if(SQ_FAILED(sq_setinstance(pVM, pTimer))) { delete pTimer; delete pArguments; sq_pushbool(pVM, false); return 1; } CScriptTimerManager::GetInstance()->push_back(pTimer); sq_pushbool(pVM, true); return 1; }