2013-04-16 3 views
0

Предположим, у меня есть функция обратного вызова, которая выполняется, когда указанный игрок умирает.Преобразование функции C в функцию Lua

function OnPlayerDeath(playerid) 

end 

Я хочу, чтобы эта функция будет называться внутри модуля Lua C, не помещая его в Lua скрипт:

static int l_OnPlayerConnect (lua_State * L) { 
    enum { lc_nformalargs = 1 }; 
    lua_settop(L,1); 

    // so here I can use playerid argument - 1 arg 

    return 0; 
} 

Это как-то можно получить этот аргумент обратного вызова в C?

#define LUA extern "C" __declspec(dllexport) int __cdecl 

LUA luaopen_mymodule(lua_State *L) 
{ 
    /* function OnPlayerConnect(playerid) 
    *  
    * end */ 
    lua_pushcfunction(L,l_OnPlayerConnect); 
    lua_setfield(L,LUA_GLOBALSINDEX,"OnPlayerConnect"); //there's already OnPlayerConnect I just want to also call it here but I don't know how. 
    assert(lua_gettop(L) - lc_nextra == 0); 

    return 1; 
} 

Я не хочу нажимать эту функцию на стек lua, потому что эта функция уже существует. Я просто хочу, чтобы это уже существовала функция Lua.

ответ

0

Решено. Это возможно W.B.

Решение: Вызовите loadstring из C.

+0

Правильно, но это толкает функцию/кусок в стеке ... –

1

Вам нужно было нажать его в стек так или иначе, если вы хотите запустить его в Lua из C API. Если он уже существует где-то в глобальной таблице, вы можете нажать его, вызвав lua_getglobal. lua_call (lua_pcall) требует, чтобы вызываемая функция и ее аргументы существовали поверх стека перед выполнением вызова.

Если вы чувствуете, что вы можете проверить функцию обратного вызова LuaJIT ffi, но это не просто Lua.

Смежные вопросы