- Joined
- Sep 27, 2006
- Messages
- 557
- Reaction score
- 88
I've been working on a project and wanted to update my lua to use 5.3.3 and LUA_GLOBALSINDEX is no longer used in lua so the work around from what i've read online is now stored at a special index in the registry.
CODE:
CODE:
Code:
std::unordered_map< QString, QType::TypeTable >::iterator i;
for( i = QType::type_hash.begin(); i != QType::type_hash.end(); ++i )
{
QType::TypeTable& type = i->second;
std::unordered_map<QString,int>::iterator j;
for( j = type.str_to_id_.begin(); j != type.str_to_id_.end(); ++j )
{
lua_pushstring( gState, j->first.c_str() );
lua_pushnumber( gState, j->second );
lua_settable( gState, LUA_GLOBALSINDEX );
}
}
Code:
//
// Register unit props.
//
for( u_int i = 0; i < IMAX; i++ )
{
lua_pushstring( gState, QUnit::unit_props_[i]->name_.c_str() );
lua_pushnumber( gState, i );
lua_settable( gState, LUA_GLOBALSINDEX );
//fix maybe lua_settable( gState, i );
}
Code:
void QScriptEnv::setGlobalInt( const char* varName, int i )
{
CHK_LUA_STACK;
lua_pushstring( gState, varName );
lua_pushnumber( gState, i );
lua_settable( gState, LUA_GLOBALSINDEX );
}
void QScriptEnv::setGlobalFloat( const char* varName, float f )
{
lua_pushstring( gState, varName );
lua_pushnumber( gState, f );
lua_settable( gState, LUA_GLOBALSINDEX );
}
void QScriptEnv::setGlobalBool( const char* varName, bool b )
{
CHK_LUA_STACK;
lua_pushstring( gState, varName );
lua_pushboolean( gState, b?1:0 );
lua_settable( gState, LUA_GLOBALSINDEX );
}
void QScriptEnv::setGlobalString( const char* varName, const char* s )
{
CHK_LUA_STACK;
lua_pushstring( gState, varName );
lua_pushstring( gState, s );
lua_settable( gState, LUA_GLOBALSINDEX );
}
int QScriptEnv::getGlobalInt( const char* varName )
{
CHK_LUA_STACK;
lua_pushstring(gState, varName );
lua_gettable( gState, LUA_GLOBALSINDEX );
int r = (int)lua_tonumber( gState, -1 );
lua_pop( gState, 1 );
return r;
}
float QScriptEnv::getGlobalFloat( const char* varName )
{
CHK_LUA_STACK;
lua_pushstring(gState, varName );
lua_gettable( gState, LUA_GLOBALSINDEX );
float r = (float)lua_tonumber( gState, -1 );
lua_pop( gState, 1 );
return r;
}
bool QScriptEnv::getGlobalBool( const char* varName )
{
CHK_LUA_STACK;
lua_pushstring(gState, varName );
lua_gettable( gState, LUA_GLOBALSINDEX );
int r = lua_toboolean( gState, -1 );
lua_pop( gState, 1 );
return r?true:false;
}
QString QScriptEnv::getGlobalString( const char* varName )
{
CHK_LUA_STACK;
lua_pushstring(gState, varName );
lua_gettable( gState, LUA_GLOBALSINDEX );
QString r = lua_tostring( gState, -1 );
lua_pop( gState, 1 );
return r;
}
void QScriptEnv::removeGlobal( const char* varName )
{
CHK_LUA_STACK;
lua_pushstring( gState, varName );
lua_pushnil( gState );
lua_settable( gState, LUA_GLOBALSINDEX );
}
bool QScriptEnv::callGEProc( const char* procName, QController* receiver, GEParam* params, int param_num, bool& ret, QString& errMsg )
{
CHK_LUA_STACK;
lua_pushstring( gState, procName );
lua_gettable( gState, LUA_GLOBALSINDEX );
// pass receiver.
lua_pushnumber( gState, receiver->script_handle_ );
// pass the parameters
for(int i = 0; i < param_num; i++)
{
switch(params[i].type_)
{
case GEP_FLOAT:
lua_pushnumber( gState, params[i].value_.f );
break;
case GEP_INT:
lua_pushnumber( gState, params[i].value_.i );
break;
case GEP_BOOL:
lua_pushboolean( gState, params[i].value_.b?1:0 );
break;
case GEP_PTR:
if( params[i].value_.p == NULL)
lua_pushnil( gState );
else
lua_pushnumber( gState, params[i].value_.p->script_handle_ );
break;
}
}
int r = lua_pcall( gState, param_num+1, 1, 0 );
SCRIPT_CHK_ERR;
// Get return.
ret = lua_toboolean( gState, -1 )?true:false;
lua_pop( gState, 1 );
return true;
}
bool QScriptEnv::callGEProc( const char* procName, int id, GEParam* params, int param_num, QString& errMsg )
{
CHK_LUA_STACK;
lua_pushstring( gState, procName );
lua_gettable( gState, LUA_GLOBALSINDEX );
// pass receiver.
lua_pushnumber( gState, id );
// pass the parameters
for(int i = 0; i < param_num; i++)
{
switch(params[i].type_)
{
case GEP_FLOAT:
lua_pushnumber( gState, params[i].value_.f );
break;
case GEP_INT:
lua_pushnumber( gState, params[i].value_.i );
break;
case GEP_BOOL:
lua_pushboolean( gState, params[i].value_.b?1:0 );
break;
case GEP_PTR:
if( params[i].value_.p == NULL)
lua_pushnil( gState );
else
lua_pushnumber( gState, params[i].value_.p->script_handle_ );// for safe.
break;
}
}
int r = lua_pcall( gState, param_num+1, 0, 0 );
SCRIPT_CHK_ERR;
return true;
}
bool QScriptEnv::callGMCmd( QPlayerController* player, const char* cmd, const char* params, QString& errMsg )
{
CHK_LUA_STACK;
lua_pushstring( gState, cmd );
lua_gettable( gState, LUA_GLOBALSINDEX );
// Parse params.
lua_pushnumber( gState, player->script_handle_ );
int param_num = 1;
QString param;
while( QParser::getToken( params, param ) )
{
if( param.length() && param[0] >= 48 && param[0] <= 57 )
lua_pushnumber( gState, atof( param.c_str() ) );
else
lua_pushstring( gState, param.c_str() );
param_num++;
}
int r = lua_pcall( gState, param_num, 0, 0 );
SCRIPT_CHK_ERR;
return true;
}