Welcome!

Join our community of MMO enthusiasts and game developers! By registering, you'll gain access to discussions on the latest developments in MMO server files and collaborate with like-minded individuals. Join us today and unlock the potential of MMO server development!

Join Today!

Lua 5.3.3 error

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:
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;
}
 
Back
Top