示例#1
0
_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;
}