CKeyAutoBinder::CKeyAutoBinder() : CLuaHandle("KeyAutoBinder", 1234, false, NULL) { if (L == NULL) { return; } LoadCompareFunc(); // load the standard libraries LUA_OPEN_LIB(L, luaopen_base); LUA_OPEN_LIB(L, luaopen_math); LUA_OPEN_LIB(L, luaopen_table); LUA_OPEN_LIB(L, luaopen_string); LUA_OPEN_LIB(L, luaopen_debug); //LUA_OPEN_LIB(L, luaopen_io); //LUA_OPEN_LIB(L, luaopen_os); //LUA_OPEN_LIB(L, luaopen_package); // load the spring libraries lua_pushvalue(L, LUA_GLOBALSINDEX); if (!AddEntriesToTable(L, "Game", LuaConstGame::PushEntries) || !AddEntriesToTable(L, "UnitDefs", LuaUnitDefs::PushEntries) || !AddEntriesToTable(L, "WeaponDefs", LuaWeaponDefs::PushEntries)) { logOutput.Print("KeyAutoBinder: error loading lua libraries\n"); } lua_settop(L, 0); }
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; }
bool CLuaHandleSynced::SetupSynced(const string& code, const string& filename) { if ((L == NULL) || code.empty()) { return false; } lua_pushvalue(L, LUA_GLOBALSINDEX); AddBasicCalls(); // into Global lua_pushstring(L, "Script"); lua_rawget(L, -2); LuaPushNamedCFunc(L, "AddActionFallback", AddSyncedActionFallback); LuaPushNamedCFunc(L, "RemoveActionFallback", RemoveSyncedActionFallback); LuaPushNamedCFunc(L, "UpdateCallIn", CallOutSyncedUpdateCallIn); LuaPushNamedCFunc(L, "GetWatchWeapon", GetWatchWeapon); LuaPushNamedCFunc(L, "SetWatchWeapon", SetWatchWeapon); lua_pop(L, 1); // add the custom file loader LuaPushNamedCFunc(L, "SendToUnsynced", SendToUnsynced); LuaPushNamedCFunc(L, "loadstring", LoadStringData); LuaPushNamedCFunc(L, "CallAsTeam", CallAsTeam); LuaPushNamedCFunc(L, "AllowUnsafeChanges", AllowUnsafeChanges); LuaPushNamedNumber(L, "COBSCALE", COBSCALE); // load our libraries (LuaSyncedCtrl overrides some LuaUnsyncedCtrl entries) if (!AddEntriesToTable(L, "VFS", LuaVFS::PushSynced) || !AddEntriesToTable(L, "UnitDefs", LuaUnitDefs::PushEntries) || !AddEntriesToTable(L, "WeaponDefs", LuaWeaponDefs::PushEntries) || !AddEntriesToTable(L, "FeatureDefs", LuaFeatureDefs::PushEntries) || !AddEntriesToTable(L, "Script", LuaSyncedCall::PushEntries) || !AddEntriesToTable(L, "Spring", LuaUnsyncedCtrl::PushEntries) || !AddEntriesToTable(L, "Spring", LuaSyncedCtrl::PushEntries) || !AddEntriesToTable(L, "Spring", LuaSyncedRead::PushEntries) || !AddEntriesToTable(L, "Game", LuaConstGame::PushEntries) || !AddEntriesToTable(L, "CMD", LuaConstCMD::PushEntries) || !AddEntriesToTable(L, "CMDTYPE", LuaConstCMDTYPE::PushEntries)) { KillLua(); return false; } // add code from the sub-class if (!AddSyncedCode()) { KillLua(); return false; } lua_settop(L, 0); if (!LoadCode(code, filename)) { KillLua(); return false; } return true; }
CLuaIntro::CLuaIntro() : CLuaHandle("LuaIntro", LUA_HANDLE_ORDER_INTRO, true) { LuaIntro = this; if (!IsValid()) { return; } const std::string file = "LuaIntro/main.lua"; const string code = LoadFile(file); if (code.empty()) { KillLua(); return; } // load the standard libraries LUA_OPEN_LIB(L, luaopen_base); LUA_OPEN_LIB(L, luaopen_io); LUA_OPEN_LIB(L, luaopen_os); LUA_OPEN_LIB(L, luaopen_math); LUA_OPEN_LIB(L, luaopen_table); LUA_OPEN_LIB(L, luaopen_string); LUA_OPEN_LIB(L, luaopen_debug); // setup the lua IO access check functions lua_set_fopen(L, LuaIO::fopen); lua_set_popen(L, LuaIO::popen, LuaIO::pclose); lua_set_system(L, LuaIO::system); lua_set_remove(L, LuaIO::remove); lua_set_rename(L, LuaIO::rename); // remove a few dangerous calls lua_getglobal(L, "io"); lua_pushstring(L, "popen"); lua_pushnil(L); lua_rawset(L, -3); lua_pop(L, 1); lua_getglobal(L, "os"); { lua_pushliteral(L, "exit"); lua_pushnil(L); lua_rawset(L, -3); lua_pushliteral(L, "execute"); lua_pushnil(L); lua_rawset(L, -3); //lua_pushliteral(L, "remove"); lua_pushnil(L); lua_rawset(L, -3); //lua_pushliteral(L, "rename"); lua_pushnil(L); lua_rawset(L, -3); lua_pushliteral(L, "tmpname"); lua_pushnil(L); lua_rawset(L, -3); lua_pushliteral(L, "getenv"); lua_pushnil(L); lua_rawset(L, -3); //lua_pushliteral(L, "setlocale"); lua_pushnil(L); lua_rawset(L, -3); } lua_pop(L, 1); // os lua_pushvalue(L, LUA_GLOBALSINDEX); AddBasicCalls(L); // into Global // load the spring libraries if ( !AddEntriesToTable(L, "Spring", LoadUnsyncedCtrlFunctions) || !AddEntriesToTable(L, "Spring", LoadUnsyncedReadFunctions) || !AddEntriesToTable(L, "Spring", LoadSyncedReadFunctions) || !AddEntriesToTable(L, "VFS", LuaVFS::PushUnsynced) || !AddEntriesToTable(L, "VFS", LuaZipFileReader::PushUnsynced) || !AddEntriesToTable(L, "VFS", LuaZipFileWriter::PushUnsynced) || !AddEntriesToTable(L, "Script", LuaScream::PushEntries) || //!AddEntriesToTable(L, "Script", LuaInterCall::PushEntriesUnsynced) || //!AddEntriesToTable(L, "Script", LuaLobby::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) || !AddEntriesToTable(L, "LOG", LuaUtils::PushLogEntries) ) { KillLua(); return; } RemoveSomeOpenGLFunctions(L); lua_settop(L, 0); if (!LoadCode(L, code, file)) { KillLua(); return; } lua_settop(L, 0); // register for call-ins eventHandler.AddClient(this); }
bool CUnsyncedLuaHandle::Init(const string& code, const string& file) { if (!IsValid()) { return false; } // load the standard libraries LUA_OPEN_LIB(L, luaopen_base); LUA_OPEN_LIB(L, luaopen_math); LUA_OPEN_LIB(L, luaopen_table); LUA_OPEN_LIB(L, luaopen_string); //LUA_OPEN_LIB(L, luaopen_io); //LUA_OPEN_LIB(L, luaopen_os); //LUA_OPEN_LIB(L, luaopen_package); //LUA_OPEN_LIB(L, luaopen_debug); // delete some dangerous functions lua_pushnil(L); lua_setglobal(L, "dofile"); lua_pushnil(L); lua_setglobal(L, "loadfile"); lua_pushnil(L); lua_setglobal(L, "loadlib"); lua_pushnil(L); lua_setglobal(L, "loadstring"); // replaced lua_pushnil(L); lua_setglobal(L, "require"); lua_pushvalue(L, LUA_GLOBALSINDEX); AddBasicCalls(L); // remove Script.Kill() lua_getglobal(L, "Script"); LuaPushNamedNil(L, "Kill"); lua_pop(L, 1); LuaPushNamedCFunc(L, "loadstring", CLuaHandleSynced::LoadStringData); LuaPushNamedCFunc(L, "CallAsTeam", CLuaHandleSynced::CallAsTeam); LuaPushNamedNumber(L, "COBSCALE", COBSCALE); // load our libraries if (!LuaSyncedTable::PushEntries(L) || !AddEntriesToTable(L, "VFS", LuaVFS::PushUnsynced) || !AddEntriesToTable(L, "VFS", LuaZipFileReader::PushUnsynced) || !AddEntriesToTable(L, "VFS", LuaZipFileWriter::PushUnsynced) || !AddEntriesToTable(L, "UnitDefs", LuaUnitDefs::PushEntries) || !AddEntriesToTable(L, "WeaponDefs", LuaWeaponDefs::PushEntries) || !AddEntriesToTable(L, "FeatureDefs", LuaFeatureDefs::PushEntries) || !AddEntriesToTable(L, "Script", LuaInterCall::PushEntriesUnsynced) || !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) || !AddEntriesToTable(L, "LOG", LuaUtils::PushLogEntries) ) { KillLua(); return false; } lua_settop(L, 0); // add code from the sub-class if (!base.AddUnsyncedCode(L)) { KillLua(); return false; } lua_settop(L, 0); if (!LoadCode(L, code, file)) { KillLua(); return false; } lua_settop(L, 0); eventHandler.AddClient(this); return true; }
bool CSyncedLuaHandle::Init(const string& code, const string& file) { if (!IsValid()) return false; watchUnitDefs.resize(unitDefHandler->unitDefs.size() + 1, false); watchFeatureDefs.resize(featureHandler->GetFeatureDefs().size(), false); watchWeaponDefs.resize(weaponDefHandler->weaponDefs.size(), false); // load the standard libraries LUA_OPEN_LIB(L, luaopen_base); LUA_OPEN_LIB(L, luaopen_math); LUA_OPEN_LIB(L, luaopen_table); LUA_OPEN_LIB(L, luaopen_string); //LUA_OPEN_LIB(L, luaopen_io); //LUA_OPEN_LIB(L, luaopen_os); //LUA_OPEN_LIB(L, luaopen_package); //LUA_OPEN_LIB(L, luaopen_debug); lua_getglobal(L, "next"); origNextRef = luaL_ref(L, LUA_REGISTRYINDEX); // delete/replace some dangerous functions lua_pushnil(L); lua_setglobal(L, "dofile"); lua_pushnil(L); lua_setglobal(L, "loadfile"); lua_pushnil(L); lua_setglobal(L, "loadlib"); lua_pushnil(L); lua_setglobal(L, "require"); lua_pushnil(L); lua_setglobal(L, "rawequal"); //FIXME not unsafe anymore since split? lua_pushnil(L); lua_setglobal(L, "rawget"); //FIXME not unsafe anymore since split? lua_pushnil(L); lua_setglobal(L, "rawset"); //FIXME not unsafe anymore since split? // lua_pushnil(L); lua_setglobal(L, "getfenv"); // lua_pushnil(L); lua_setglobal(L, "setfenv"); lua_pushnil(L); lua_setglobal(L, "newproxy"); // sync unsafe cause of __gc lua_pushnil(L); lua_setglobal(L, "gcinfo"); lua_pushnil(L); lua_setglobal(L, "collectgarbage"); lua_pushvalue(L, LUA_GLOBALSINDEX); LuaPushNamedCFunc(L, "loadstring", CLuaHandleSynced::LoadStringData); LuaPushNamedCFunc(L, "pairs", SyncedPairs); LuaPushNamedCFunc(L, "next", SyncedNext); lua_pop(L, 1); lua_pushvalue(L, LUA_GLOBALSINDEX); AddBasicCalls(L); // into Global // adjust the math.random() and math.randomseed() calls lua_getglobal(L, "math"); LuaPushNamedCFunc(L, "random", SyncedRandom); LuaPushNamedCFunc(L, "randomseed", SyncedRandomSeed); lua_pop(L, 1); // pop the global math table lua_getglobal(L, "Script"); LuaPushNamedCFunc(L, "AddActionFallback", AddSyncedActionFallback); LuaPushNamedCFunc(L, "RemoveActionFallback", RemoveSyncedActionFallback); LuaPushNamedCFunc(L, "GetWatchUnit", GetWatchUnitDef); LuaPushNamedCFunc(L, "SetWatchUnit", SetWatchUnitDef); LuaPushNamedCFunc(L, "GetWatchFeature", GetWatchFeatureDef); LuaPushNamedCFunc(L, "SetWatchFeature", SetWatchFeatureDef); LuaPushNamedCFunc(L, "GetWatchWeapon", GetWatchWeaponDef); LuaPushNamedCFunc(L, "SetWatchWeapon", SetWatchWeaponDef); lua_pop(L, 1); // add the custom file loader LuaPushNamedCFunc(L, "SendToUnsynced", SendToUnsynced); LuaPushNamedCFunc(L, "CallAsTeam", CLuaHandleSynced::CallAsTeam); LuaPushNamedNumber(L, "COBSCALE", COBSCALE); // load our libraries (LuaSyncedCtrl overrides some LuaUnsyncedCtrl entries) if ( !AddEntriesToTable(L, "VFS", LuaVFS::PushSynced) || !AddEntriesToTable(L, "VFS", LuaZipFileReader::PushSynced) || !AddEntriesToTable(L, "VFS", LuaZipFileWriter::PushSynced) || !AddEntriesToTable(L, "UnitDefs", LuaUnitDefs::PushEntries) || !AddEntriesToTable(L, "WeaponDefs", LuaWeaponDefs::PushEntries) || !AddEntriesToTable(L, "FeatureDefs", LuaFeatureDefs::PushEntries) || !AddEntriesToTable(L, "Script", LuaInterCall::PushEntriesSynced) || !AddEntriesToTable(L, "Spring", LuaUnsyncedCtrl::PushEntries) || !AddEntriesToTable(L, "Spring", LuaSyncedCtrl::PushEntries) || !AddEntriesToTable(L, "Spring", LuaSyncedRead::PushEntries) || !AddEntriesToTable(L, "Game", LuaConstGame::PushEntries) || !AddEntriesToTable(L, "CMD", LuaConstCMD::PushEntries) || !AddEntriesToTable(L, "CMDTYPE", LuaConstCMDTYPE::PushEntries) || !AddEntriesToTable(L, "COB", LuaConstCOB::PushEntries) || !AddEntriesToTable(L, "SFX", LuaConstSFX::PushEntries) || !AddEntriesToTable(L, "LOG", LuaUtils::PushLogEntries) ) { KillLua(); return false; } // add code from the sub-class if (!base.AddSyncedCode(L)) { KillLua(); return false; } lua_settop(L, 0); if (!LoadCode(L, code, file)) { KillLua(); return false; } lua_settop(L, 0); eventHandler.AddClient(this); return true; }
bool CLuaHandleSynced::SetupSynced(lua_State *L, const string& code, const string& filename) { if (!IsValid() || code.empty()) { return false; } lua_pushvalue(L, LUA_GLOBALSINDEX); HSTR_PUSH(L, "EXPORT"); lua_newtable(L); lua_rawset(L, -3); AddBasicCalls(L); // into Global lua_pushliteral(L, "Script"); lua_rawget(L, -2); LuaPushNamedCFunc(L, "AddActionFallback", AddSyncedActionFallback); LuaPushNamedCFunc(L, "RemoveActionFallback", RemoveSyncedActionFallback); LuaPushNamedCFunc(L, "UpdateCallIn", CallOutSyncedUpdateCallIn); LuaPushNamedCFunc(L, "GetWatchUnit", GetWatchUnitDef); LuaPushNamedCFunc(L, "SetWatchUnit", SetWatchUnitDef); LuaPushNamedCFunc(L, "GetWatchFeature", GetWatchFeatureDef); LuaPushNamedCFunc(L, "SetWatchFeature", SetWatchFeatureDef); LuaPushNamedCFunc(L, "GetWatchWeapon", GetWatchWeaponDef); LuaPushNamedCFunc(L, "SetWatchWeapon", SetWatchWeaponDef); lua_pop(L, 1); // add the custom file loader LuaPushNamedCFunc(L, "SendToUnsynced", SendToUnsynced); LuaPushNamedCFunc(L, "loadstring", LoadStringData); LuaPushNamedCFunc(L, "CallAsTeam", CallAsTeam); LuaPushNamedNumber(L, "COBSCALE", COBSCALE); // load our libraries (LuaSyncedCtrl overrides some LuaUnsyncedCtrl entries) if (!AddEntriesToTable(L, "VFS", LuaVFS::PushSynced) || !AddEntriesToTable(L, "VFS", LuaZipFileReader::PushSynced) || !AddEntriesToTable(L, "VFS", LuaZipFileWriter::PushSynced) || !AddEntriesToTable(L, "UnitDefs", LuaUnitDefs::PushEntries) || !AddEntriesToTable(L, "WeaponDefs", LuaWeaponDefs::PushEntries) || !AddEntriesToTable(L, "FeatureDefs", LuaFeatureDefs::PushEntries) || !AddEntriesToTable(L, "Script", LuaSyncedCall::PushEntries) || !AddEntriesToTable(L, "Spring", LuaUnsyncedCtrl::PushEntries) || !AddEntriesToTable(L, "Spring", LuaSyncedCtrl::PushEntries) || !AddEntriesToTable(L, "Spring", LuaSyncedRead::PushEntries) || !AddEntriesToTable(L, "Game", LuaConstGame::PushEntries) || !AddEntriesToTable(L, "CMD", LuaConstCMD::PushEntries) || !AddEntriesToTable(L, "CMDTYPE", LuaConstCMDTYPE::PushEntries) || !AddEntriesToTable(L, "COB", LuaConstCOB::PushEntries) || !AddEntriesToTable(L, "SFX", LuaConstSFX::PushEntries) || !AddEntriesToTable(L, "LOG", LuaUtils::PushLogEntries) ) { KillLua(); return false; } // add code from the sub-class if (!AddSyncedCode(L)) { KillLua(); return false; } lua_settop(L, 0); if (!LoadCode(L, code, filename)) { KillLua(); return false; } return true; }