/* ============ G_InitLua ============ */ void G_InitLua() { char buf[MAX_STRING_CHARS]; char filename[MAX_QPATH]; G_Printf("------- Lua Initialization -------\n"); g_luaState = lua_open(); // Lua standard lib luaopen_base(g_luaState); luaopen_string(g_luaState); // Quake lib luaopen_entity(g_luaState); luaopen_game(g_luaState); luaopen_qmath(g_luaState); luaopen_vector(g_luaState); // load map specific Lua script as default trap_Cvar_VariableStringBuffer("mapname", buf, sizeof(buf)); Com_sprintf(filename, sizeof(filename), "scripts/lua/%s.lua", buf); G_LoadLuaScript(NULL, filename); G_Printf("-----------------------------------\n"); }
/* ============ G_InitLua ============ */ void G_InitLua() { char buf[MAX_STRING_CHARS]; G_Printf( "------- Game Lua Initialization -------\n" ); g_luaState = lua_open(); // Lua standard lib luaopen_base( g_luaState ); luaopen_string( g_luaState ); // Quake lib luaopen_entity( g_luaState ); luaopen_game( g_luaState ); luaopen_qmath( g_luaState ); luaopen_vector( g_luaState ); // Create the callback table (at location 1 in the registry) lua_pushnumber( g_luaState, 1 ); lua_newtable( g_luaState ); lua_settable( g_luaState, LUA_REGISTRYINDEX ); // load global scripts G_Printf( "global lua scripts:\n" ); G_InitLua_Global(); // load map-specific lua scripts G_Printf( "map specific lua scripts:\n" ); g_cvars->Cvar_VariableStringBuffer( "mapname", buf, sizeof( buf ) ); G_InitLua_Local( buf ); G_LoadLuaScript( va( "maps/%s.lua", buf ) ); G_Printf( "-----------------------------------\n" ); G_RunLuaFunction( g_luaState, "G_InitGame", "" ); }
/** G_LuaStartVM( vm ) * Starts one individual virtual machine. */ qboolean G_LuaStartVM(lua_vm_t * vm) { int res = 0; char homepath[MAX_QPATH], gamepath[MAX_QPATH]; // Open a new lua state vm->L = luaL_newstate(); if(!vm->L) { LOG("Lua API: Lua failed to initialise.\n"); return qfalse; } // Initialise the lua state luaL_openlibs(vm->L); // set LUA_PATH and LUA_CPATH // TODO: add "fs_basepath/fs_game/?.lua;" to LUA_PATH // and LUA_CPATH for linux machines trap_Cvar_VariableStringBuffer("fs_homepath", homepath, sizeof(homepath)); trap_Cvar_VariableStringBuffer("fs_game", gamepath, sizeof(gamepath)); lua_getglobal(vm->L, LUA_LOADLIBNAME); if(lua_istable(vm->L, -1)) { lua_pushstring(vm->L, va("%s%s%s%s?.lua;%s%s%s%slualib%slua%s?.lua", homepath, LUA_DIRSEP, gamepath, LUA_DIRSEP, homepath, LUA_DIRSEP, gamepath, LUA_DIRSEP, LUA_DIRSEP, LUA_DIRSEP)); lua_setfield(vm->L, -2, "path"); lua_pushstring(vm->L, va("%s%s%s%s?.%s;%s%s%s%slualib%sclibs%s?.%s", homepath, LUA_DIRSEP, gamepath, LUA_DIRSEP, EXTENSION, homepath, LUA_DIRSEP, gamepath, LUA_DIRSEP, LUA_DIRSEP, LUA_DIRSEP, EXTENSION)); lua_setfield(vm->L, -2, "cpath"); } lua_pop(vm->L, 1); // register globals lua_registerglobal(vm->L, "LUA_PATH", va("%s%s%s%s?.lua;%s%s%s%slualib%slua%s?.lua", homepath, LUA_DIRSEP, gamepath, LUA_DIRSEP, homepath, LUA_DIRSEP, gamepath, LUA_DIRSEP, LUA_DIRSEP, LUA_DIRSEP)); lua_registerglobal(vm->L, "LUA_CPATH", va("%s%s%s%s?.%s;%s%s%s%slualib%sclibs%s?.%s", homepath, LUA_DIRSEP, gamepath, LUA_DIRSEP, EXTENSION, homepath, LUA_DIRSEP, gamepath, LUA_DIRSEP, LUA_DIRSEP, LUA_DIRSEP, EXTENSION)); lua_registerglobal(vm->L, "LUA_DIRSEP", LUA_DIRSEP); // register predefined constants lua_newtable(vm->L); lua_regconstinteger(vm->L, CS_PLAYERS); lua_regconstinteger(vm->L, EXEC_NOW); lua_regconstinteger(vm->L, EXEC_INSERT); lua_regconstinteger(vm->L, EXEC_APPEND); lua_regconstinteger(vm->L, FS_READ); lua_regconstinteger(vm->L, FS_WRITE); lua_regconstinteger(vm->L, FS_APPEND); lua_regconstinteger(vm->L, FS_APPEND_SYNC); lua_regconstinteger(vm->L, SAY_ALL); lua_regconstinteger(vm->L, SAY_TEAM); //xreal //lua_regconstinteger(vm->L, SAY_BUDDY); //lua_regconstinteger(vm->L, SAY_TEAMNL); lua_regconststring(vm->L, HOSTARCH); lua_setglobal(vm->L, "et"); // register functions luaopen_et(vm->L); luaopen_game(vm->L); luaopen_qmath(vm->L); luaopen_mover(vm->L); luaopen_vector(vm->L); // Load the code res = luaL_loadbuffer(vm->L, vm->code, vm->code_size, vm->file_name); if(res == LUA_ERRSYNTAX) { LOG("Lua API: syntax error during pre-compilation: %s\n", lua_tostring(vm->L, -1)); lua_pop(vm->L, 1); vm->err++; return qfalse; } else if(res == LUA_ERRMEM) { LOG("Lua API: memory allocation error #1 ( %s )\n", vm->file_name); vm->err++; return qfalse; } // Execute the code if(!G_LuaCall(vm, "G_LuaStartVM", 0, 0)) return qfalse; LOG("Lua API: Loading %s\n", vm->file_name); return qtrue; }