diff --git a/src/script/cpp_api/s_sscsm.cpp b/src/script/cpp_api/s_sscsm.cpp index 70960ef06..154c2d3d8 100644 --- a/src/script/cpp_api/s_sscsm.cpp +++ b/src/script/cpp_api/s_sscsm.cpp @@ -17,8 +17,7 @@ void ScriptApiSSCSM::load_mods(const std::vector &init_paths) actionstream << " " << p << ":\n"; auto f = env->readVFSFile(p); if (!f.has_value()) { - env->setFatalError("load_mods(): File doesn't exist: " + p); - return; + throw ModError("load_mods(): File doesn't exist: " + p); } actionstream << *f << "\n"; } @@ -33,9 +32,5 @@ void ScriptApiSSCSM::environment_step(float dtime) lua_getfield(L, -1, "registered_globalsteps"); // Call callbacks lua_pushnumber(L, dtime); - try { - runCallbacks(1, RUN_CALLBACKS_MODE_FIRST); - } catch (LuaError &e) { - getSSCSMEnv()->setFatalError(e); - } + runCallbacks(1, RUN_CALLBACKS_MODE_FIRST); } diff --git a/src/script/lua_api/l_sscsm.cpp b/src/script/lua_api/l_sscsm.cpp index c676e1588..70e1753c0 100644 --- a/src/script/lua_api/l_sscsm.cpp +++ b/src/script/lua_api/l_sscsm.cpp @@ -13,7 +13,7 @@ #include "mapnode.h" // print(text) -int ModApiSSCSM::l_print(lua_State *L) +int ModApiSSCSM::l_print(lua_State *L) //TODO: not core.print { auto request = SSCSMRequestPrint{}; request.text = luaL_checkstring(L, 1); @@ -22,6 +22,37 @@ int ModApiSSCSM::l_print(lua_State *L) return 0; } +// log([level], text) +int ModApiSSCSM::l_log(lua_State *L) +{ + /* + auto request = SSCSMRequestLog{}; + request.text = luaL_checkstring(L, 1); + getSSCSMEnv(L)->doRequest(std::move(request)); + + std::string_view text; + LogLevel level = LL_NONE; + if (lua_isnoneornil(L, 2)) { + text = readParam(L, 1); + } else { + auto name = readParam(L, 1); + text = readParam(L, 2); + // if (name == "deprecated") { //TODO + // log_deprecated(L, text, 2); + // return 0; + // } + level = Logger::stringToLevel(name); + if (level == LL_MAX) { + warningstream << "Tried to log at unknown level '" << name + << "'. Defaulting to \"none\"." << std::endl; + level = LL_WARNING; + } + } + g_logger.log(level, text); + */ + return 0; +} + // get_node_or_nil(pos) // pos = {x=num, y=num, z=num} int ModApiSSCSM::l_get_node_or_nil(lua_State *L) @@ -46,5 +77,6 @@ int ModApiSSCSM::l_get_node_or_nil(lua_State *L) void ModApiSSCSM::Initialize(lua_State *L, int top) { API_FCT(print); + API_FCT(log); API_FCT(get_node_or_nil); } diff --git a/src/script/lua_api/l_sscsm.h b/src/script/lua_api/l_sscsm.h index 56dd8b67e..d21785ecd 100644 --- a/src/script/lua_api/l_sscsm.h +++ b/src/script/lua_api/l_sscsm.h @@ -12,6 +12,9 @@ private: // print(text) static int l_print(lua_State *L); + // log([level], text) + static int l_log(lua_State *L); + // get_node_or_nil(pos) static int l_get_node_or_nil(lua_State *L); diff --git a/src/script/scripting_sscsm.cpp b/src/script/scripting_sscsm.cpp index 287f79d6d..e92539655 100644 --- a/src/script/scripting_sscsm.cpp +++ b/src/script/scripting_sscsm.cpp @@ -8,7 +8,7 @@ // #include "lua_api/l_util.h" SSCSMScripting::SSCSMScripting(SSCSMEnvironment *env) : - ScriptApiBase(ScriptingType::SSCSM) + ScriptApiBase(ScriptingType::SSCSM) //TODO: use different CUSTOM_RIDX_ERROR_HANDLER, or set debug.traceback { setSSCSMEnv(env); diff --git a/src/script/sscsm/sscsm_environment.cpp b/src/script/sscsm/sscsm_environment.cpp index 7e04f694f..6f6d8d2b7 100644 --- a/src/script/sscsm/sscsm_environment.cpp +++ b/src/script/sscsm/sscsm_environment.cpp @@ -24,7 +24,13 @@ void *SSCSMEnvironment::run() break; } - next_event->exec(this); + try { + next_event->exec(this); + } catch (LuaError &e) { + setFatalError(std::string("Lua error: ") + e.what()); + } catch (ModError &e) { + setFatalError(std::string("Mod error: ") + e.what()); + } } return nullptr; diff --git a/src/script/sscsm/sscsm_environment.h b/src/script/sscsm/sscsm_environment.h index a300fed8a..f055a88b7 100644 --- a/src/script/sscsm/sscsm_environment.h +++ b/src/script/sscsm/sscsm_environment.h @@ -40,10 +40,6 @@ public: std::optional readVFSFile(const std::string &path); void setFatalError(const std::string &reason); - void setFatalError(const LuaError &e) - { - setFatalError(std::string("Lua: ") + e.what()); - } template typename RQ::Answer doRequest(RQ &&rq) diff --git a/src/script/sscsm/sscsm_requests.h b/src/script/sscsm/sscsm_requests.h index 7dee593b1..d82194ffb 100644 --- a/src/script/sscsm/sscsm_requests.h +++ b/src/script/sscsm/sscsm_requests.h @@ -60,6 +60,7 @@ struct SSCSMRequestPrint : public ISSCSMRequest }; // core.log(level, text) +// FIXME: override global loggers to use this in sscsm process struct SSCSMRequestLog : public ISSCSMRequest { struct Answer : public ISSCSMAnswer