diff --git a/apps/openmw/mwlua/luabindings.cpp b/apps/openmw/mwlua/luabindings.cpp index 24640c1863..9d978ddd52 100644 --- a/apps/openmw/mwlua/luabindings.cpp +++ b/apps/openmw/mwlua/luabindings.cpp @@ -5,6 +5,8 @@ #include #include +#include "../mwbase/environment.hpp" +#include "../mwbase/statemanager.hpp" #include "../mwworld/inventorystore.hpp" #include "eventqueue.hpp" @@ -31,7 +33,13 @@ namespace MWLua { auto* lua = context.mLua; sol::table api(lua->sol(), sol::create); - api["API_REVISION"] = 2; + api["API_REVISION"] = 3; + api["quit"] = [lua]() + { + std::string traceback = lua->sol()["debug"]["traceback"]().get(); + Log(Debug::Warning) << "Quit requested by a Lua script.\n" << traceback; + MWBase::Environment::get().getStateManager()->requestQuit(); + }; api["sendGlobalEvent"] = [context](std::string eventName, const sol::object& eventData) { context.mGlobalEventQueue->push_back({std::move(eventName), LuaUtil::serialize(eventData, context.mSerializer)}); diff --git a/components/lua/luastate.cpp b/components/lua/luastate.cpp index 753e3369f6..1b52db11ad 100644 --- a/components/lua/luastate.cpp +++ b/components/lua/luastate.cpp @@ -24,7 +24,8 @@ namespace LuaUtil LuaState::LuaState(const VFS::Manager* vfs) : mVFS(vfs) { - mLua.open_libraries(sol::lib::base, sol::lib::coroutine, sol::lib::math, sol::lib::string, sol::lib::table); + mLua.open_libraries(sol::lib::base, sol::lib::coroutine, sol::lib::math, + sol::lib::string, sol::lib::table, sol::lib::debug); mLua["math"]["randomseed"](static_cast(std::time(nullptr))); mLua["math"]["randomseed"] = sol::nil; diff --git a/files/lua_api/openmw/core.lua b/files/lua_api/openmw/core.lua index 040e6968dd..affd052700 100644 --- a/files/lua_api/openmw/core.lua +++ b/files/lua_api/openmw/core.lua @@ -10,6 +10,10 @@ -- The revision of OpenMW Lua API. It is an integer that is incremented every time the API is changed. -- @field [parent=#core] #number API_REVISION +------------------------------------------------------------------------------- +-- Terminates the game and quits to the OS. Should be used only for testing purposes. +-- @function [parent=#core] quit + ------------------------------------------------------------------------------- -- Send an event to global scripts. -- @function [parent=#core] sendGlobalEvent