inline bool LuaLobby::PushCallIn(lua_State *L, const LuaHashString& name) { // get callin lua function lua_rawgeti(L, LUA_REGISTRYINDEX, luaRefEvents); name.Push(L); lua_rawget(L, -2); // check if the function is valid/set if (lua_isfunction(L, -1)) { return true; } lua_pop(L, 1); return false; }
bool CLuaHandleSynced::SetupUnsynced(const string& code, const string& filename) { if ((L == NULL) || code.empty()) { return false; } // make the UNSYNCED table unsyncedStr.Push(L); lua_newtable(L); lua_rawset(L, LUA_REGISTRYINDEX); unsyncedStr.GetRegistry(L); AddBasicCalls(); // into UNSYNCED // remove Script.Kill() lua_pushstring(L, "Script"); lua_rawget(L, -2); lua_pushstring(L, "Kill"); lua_pushnil(L); lua_rawset(L, -3); LuaPushNamedCFunc(L, "UpdateCallIn", CallOutUnsyncedUpdateCallIn); lua_pop(L, 1); lua_pushstring(L, "_G"); unsyncedStr.GetRegistry(L); lua_rawset(L, -3); LuaPushNamedCFunc(L, "loadstring", LoadStringData); LuaPushNamedCFunc(L, "CallAsTeam", CallAsTeam); // load our libraries if (!LuaSyncedTable::PushEntries(L) || !AddEntriesToTable(L, "VFS", LuaVFS::PushUnsynced) || !AddEntriesToTable(L, "UnitDefs", LuaUnitDefs::PushEntries) || !AddEntriesToTable(L, "WeaponDefs", LuaWeaponDefs::PushEntries) || !AddEntriesToTable(L, "FeatureDefs", LuaFeatureDefs::PushEntries) || !AddEntriesToTable(L, "Script", LuaUnsyncedCall::PushEntries) || !AddEntriesToTable(L, "Script", LuaScream::PushEntries) || !AddEntriesToTable(L, "Spring", LuaSyncedRead::PushEntries) || !AddEntriesToTable(L, "Spring", LuaUnsyncedCtrl::PushEntries) || !AddEntriesToTable(L, "Spring", LuaUnsyncedRead::PushEntries) || !AddEntriesToTable(L, "gl", LuaOpenGL::PushEntries) || !AddEntriesToTable(L, "GL", LuaConstGL::PushEntries) || !AddEntriesToTable(L, "Game", LuaConstGame::PushEntries) || !AddEntriesToTable(L, "CMD", LuaConstCMD::PushEntries) || !AddEntriesToTable(L, "CMDTYPE", LuaConstCMDTYPE::PushEntries)) { KillLua(); return false; } lua_pushstring(L, "math"); lua_newtable(L); lua_getglobal(L, "math"); LightCopyTable(-2, -1); lua_pop(L, 1); lua_rawset(L, -3); lua_pushstring(L, "table"); lua_newtable(L); lua_getglobal(L, "table"); LightCopyTable(-2, -1); lua_pop(L, 1); lua_rawset(L, -3); lua_pushstring(L, "string"); lua_newtable(L); lua_getglobal(L, "string"); LightCopyTable(-2, -1); lua_pop(L, 1); lua_rawset(L, -3); if (!CopyRealRandomFuncs()) { KillLua(); return false; } lua_settop(L, 0); // note the absence of loadstring() -- global access const char* labels[] = { "assert", "error", "print", "next", "pairs", "ipairs", "tonumber", "tostring", "type", "collectgarbage", "gcinfo", "unpack", "getmetatable", "setmetatable", "rawequal", "rawget", "rawset", "getfenv", "setfenv", "pcall", "xpcall", "_VERSION", NULL }; for (const char** l = labels; *l != NULL; l++) { CopyGlobalToUnsynced(*l); } // add code from the sub-class unsyncedStr.GetRegistry(L); if (!AddUnsyncedCode()) { KillLua(); return false; } lua_settop(L, 0); if (!LoadUnsyncedCode(code, filename)) { KillLua(); return false; } if (!SetupUnsyncedFunction("RecvFromSynced") || !SetupUnsyncedFunction("Update") || !SetupUnsyncedFunction("DrawGenesis") || !SetupUnsyncedFunction("DrawWorld") || !SetupUnsyncedFunction("DrawWorldPreUnit") || !SetupUnsyncedFunction("DrawWorldShadow") || !SetupUnsyncedFunction("DrawWorldReflection") || !SetupUnsyncedFunction("DrawWorldRefraction") || !SetupUnsyncedFunction("DrawScreenEffects") || !SetupUnsyncedFunction("DrawScreen") || !SetupUnsyncedFunction("DrawInMiniMap")) { return false; } return true; }