diff --git a/src/script/scripting_server.cpp b/src/script/scripting_server.cpp index 849ea2337..50aed4087 100644 --- a/src/script/scripting_server.cpp +++ b/src/script/scripting_server.cpp @@ -89,23 +89,25 @@ ServerScripting::ServerScripting(Server* server): infostream << "SCRIPTAPI: Initialized game modules" << std::endl; } +void ServerScripting::saveGlobals() +{ + SCRIPTAPI_PRECHECKHEADER + + lua_getglobal(L, "core"); + luaL_checktype(L, -1, LUA_TTABLE); + lua_getfield(L, -1, "get_globals_to_transfer"); + lua_call(L, 0, 1); + auto *data = script_pack(L, -1); + assert(!data->contains_userdata); + getServer()->m_lua_globals_data.reset(data); + // unset the function + lua_pushnil(L); + lua_setfield(L, -3, "get_globals_to_transfer"); + lua_pop(L, 2); // pop 'core', return value +} + void ServerScripting::initAsync() { - // Save globals to transfer - { - lua_State *L = getStack(); - lua_getglobal(L, "core"); - luaL_checktype(L, -1, LUA_TTABLE); - lua_getfield(L, -1, "get_globals_to_transfer"); - lua_call(L, 0, 1); - auto *data = script_pack(L, -1); - assert(!data->contains_userdata); - getServer()->m_async_globals_data.reset(data); - lua_pushnil(L); - lua_setfield(L, -3, "get_globals_to_transfer"); // unset function too - lua_pop(L, 2); // pop 'core', return value - } - infostream << "SCRIPTAPI: Initializing async engine" << std::endl; asyncEngine.registerStateInitializer(InitializeAsync); asyncEngine.registerStateInitializer(ModApiUtil::InitializeAsync); @@ -182,7 +184,8 @@ void ServerScripting::InitializeAsync(lua_State *L, int top) LuaSettings::Register(L); // globals data - auto *data = ModApiBase::getServer(L)->m_async_globals_data.get(); + auto *data = ModApiBase::getServer(L)->m_lua_globals_data.get(); + assert(data); script_unpack(L, data); lua_setfield(L, top, "transferred_globals"); } diff --git a/src/script/scripting_server.h b/src/script/scripting_server.h index 9803397c5..d4eb1c4f2 100644 --- a/src/script/scripting_server.h +++ b/src/script/scripting_server.h @@ -51,6 +51,9 @@ public: // use ScriptApiBase::loadMod() to load mods + // Save globals that are copied into other Lua envs + void saveGlobals(); + // Initialize async engine, call this AFTER loading all mods void initAsync(); diff --git a/src/server.cpp b/src/server.cpp index 9e6685909..7152aeae6 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -460,6 +460,8 @@ void Server::init() m_gamespec.checkAndLog(); m_modmgr->loadMods(m_script); + m_script->saveGlobals(); + // Read Textures and calculate sha1 sums fillMediaCache(); diff --git a/src/server.h b/src/server.h index 75d10b3a5..faa23e74e 100644 --- a/src/server.h +++ b/src/server.h @@ -383,8 +383,8 @@ public: // Lua files registered for init of async env, pair of modname + path std::vector> m_async_init_files; - // Data transferred into async envs at init time - std::unique_ptr m_async_globals_data; + // Data transferred into other Lua envs at init time + std::unique_ptr m_lua_globals_data; // Bind address Address m_bind_addr;