1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Load client mods into memory before execution.

Preperation for server-sent CSM which will eventually need this.
This commit is contained in:
sfan5 2019-11-08 20:01:47 +01:00
parent 5ab546f99b
commit 82a2e02323
4 changed files with 46 additions and 24 deletions

View file

@ -197,18 +197,22 @@ void ScriptApiBase::loadModFromMemory(const std::string &mod_name)
{
ModNameStorer mod_name_storer(getStack(), mod_name);
const std::string *init_filename = getClient()->getModFile(mod_name + ":init.lua");
const std::string display_filename = mod_name + ":init.lua";
if(init_filename == NULL)
throw ModError("Mod:\"" + mod_name + "\" lacks init.lua");
sanity_check(m_type == ScriptingType::Client);
verbosestream << "Loading and running script " << display_filename << std::endl;
const std::string init_filename = mod_name + ":init.lua";
const std::string chunk_name = "@" + init_filename;
const std::string *contents = getClient()->getModFile(init_filename);
if (!contents)
throw ModError("Mod \"" + mod_name + "\" lacks init.lua");
verbosestream << "Loading and running script " << chunk_name << std::endl;
lua_State *L = getStack();
int error_handler = PUSH_ERROR_HANDLER(L);
bool ok = ScriptApiSecurity::safeLoadFile(L, init_filename->c_str(), display_filename.c_str());
bool ok = ScriptApiSecurity::safeLoadString(L, *contents, chunk_name.c_str());
if (ok)
ok = !lua_pcall(L, 0, 0, error_handler);
if (!ok) {

View file

@ -627,16 +627,19 @@ int ScriptApiSecurity::sl_g_loadfile(lua_State *L)
ScriptApiBase *script = (ScriptApiBase *) lua_touserdata(L, -1);
lua_pop(L, 1);
// Client implementation
if (script->getType() == ScriptingType::Client) {
std::string display_path = readParam<std::string>(L, 1);
const std::string *path = script->getClient()->getModFile(display_path);
if (!path) {
std::string error_msg = "Coudln't find script called:" + display_path;
std::string path = readParam<std::string>(L, 1);
const std::string *contents = script->getClient()->getModFile(path);
if (!contents) {
std::string error_msg = "Coudln't find script called: " + path;
lua_pushnil(L);
lua_pushstring(L, error_msg.c_str());
return 2;
}
if (!safeLoadFile(L, path->c_str(), display_path.c_str())) {
std::string chunk_name = "@" + path;
if (!safeLoadString(L, *contents, chunk_name.c_str())) {
lua_pushnil(L);
lua_insert(L, -2);
return 2;
@ -644,6 +647,8 @@ int ScriptApiSecurity::sl_g_loadfile(lua_State *L)
return 1;
}
#endif
// Server implementation
const char *path = NULL;
if (lua_isstring(L, 1)) {
path = lua_tostring(L, 1);