int CLuaVector2Defs::Create ( lua_State* luaVM ) { CVector2D vector; CScriptArgReader argStream ( luaVM ); if ( argStream.NextIsTable () ) { lua_pushvalue ( luaVM, 1 ); lua_pushstring ( luaVM, "x" ); lua_rawget ( luaVM, -2 ); if ( lua_isnumber ( luaVM, -1 ) ) { vector.fX = ( float ) lua_tonumber ( luaVM, -1 ); lua_pop ( luaVM, 1 ); } else { lua_pop ( luaVM, 1 ); lua_rawgeti ( luaVM, -1, 1 ); if ( lua_isnumber ( luaVM, -1 ) ) vector.fX = ( float ) lua_tonumber ( luaVM, -1 ); lua_pop ( luaVM, 1 ); } lua_pushstring ( luaVM, "y" ); lua_rawget ( luaVM, -2 ); if ( lua_isnumber ( luaVM, -1 ) ) { vector.fY = ( float ) lua_tonumber ( luaVM, -1 ); lua_pop ( luaVM, 1 ); } else { lua_pop ( luaVM, 1 ); lua_rawgeti ( luaVM, -1, 2 ); if ( lua_isnumber ( luaVM, -1 ) ) vector.fY = ( float ) lua_tonumber ( luaVM, -1 ); lua_pop ( luaVM, 1 ); } } else if ( argStream.NextIsNumber () ) { argStream.ReadNumber ( vector.fX ); if ( argStream.NextIsNumber () ) { argStream.ReadNumber ( vector.fY ); } } else if ( argStream.NextIsVector2D () ) { argStream.ReadVector2D ( vector ); } lua_pushvector ( luaVM, vector ); return 1; }
int CLuaDatabaseDefs::OOP_DbQuery ( lua_State* luaVM ) { // handle dbQuery ( [ function callbackFunction, [ table callbackArguments, ] ] element connection, string query, ... ) CLuaFunctionRef iLuaFunction; CLuaArguments callbackArgs; CDatabaseConnectionElement* pElement; SString strQuery; CLuaArguments Args; CScriptArgReader argStream ( luaVM ); argStream.ReadUserData ( pElement ); if ( argStream.NextIsFunction () ) { argStream.ReadFunction ( iLuaFunction ); if ( argStream.NextIsTable () ) { argStream.ReadLuaArgumentsTable( callbackArgs ); } } argStream.ReadString ( strQuery ); argStream.ReadLuaArguments ( Args ); argStream.ReadFunctionComplete (); if ( !argStream.HasErrors () ) { // Start async query CDbJobData* pJobData = g_pGame->GetDatabaseManager ()->QueryStart ( pElement->GetConnectionHandle (), strQuery, &Args ); if ( !pJobData ) { if ( !g_pGame->GetDatabaseManager ()->IsLastErrorSuppressed () ) m_pScriptDebugging->LogWarning ( luaVM, "%s failed; %s", lua_tostring ( luaVM, lua_upvalueindex ( 1 ) ), *g_pGame->GetDatabaseManager ()->GetLastErrorMessage () ); lua_pushboolean ( luaVM, false ); return 1; } // Make callback function if required if ( VERIFY_FUNCTION ( iLuaFunction ) ) { CLuaMain* pLuaMain = m_pLuaManager->GetVirtualMachine ( luaVM ); if ( pLuaMain ) { CLuaArguments Arguments; Arguments.PushDbQuery ( pJobData ); Arguments.PushArguments ( callbackArgs ); pJobData->SetCallback ( CLuaDatabaseDefs::DbQueryCallback, g_pGame->GetLuaCallbackManager ()->CreateCallback ( pLuaMain, iLuaFunction, Arguments ) ); } } // Add debug info incase query result does not get collected pJobData->SetLuaDebugInfo ( g_pGame->GetScriptDebugging ()->GetLuaDebugInfo ( luaVM ) ); lua_pushquery ( luaVM, pJobData ); return 1; } else m_pScriptDebugging->LogCustom ( luaVM, argStream.GetFullErrorMessage () ); lua_pushboolean ( luaVM, false ); return 1; }
int CLuaFunctionDefs::Reference ( lua_State* luaVM ) { CScriptArgReader argStream ( luaVM ); if ( argStream.NextIsTable ( ) || argStream.NextIsFunction ( ) || argStream.NextIsUserData ( ) ) { int iPointer = lua_ref ( luaVM, 1 ); lua_pushnumber ( luaVM, iPointer ); return 1; } lua_pushboolean ( luaVM, false ); return 1; }