1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-03-29 04:06:40 +00:00

Add Lua package 'openmw.settings'

This commit is contained in:
Petr Mikheev 2021-06-01 23:18:42 +02:00
parent 68b8a148d7
commit 3e4c0b775d
10 changed files with 114 additions and 2 deletions

View file

@ -57,7 +57,7 @@ add_openmw_dir (mwscript
add_openmw_dir (mwlua add_openmw_dir (mwlua
luamanagerimp actions object worldview userdataserializer eventqueue query luamanagerimp actions object worldview userdataserializer eventqueue query
luabindings localscripts objectbindings cellbindings asyncbindings camerabindings uibindings luabindings localscripts objectbindings cellbindings asyncbindings camerabindings uibindings settingsbindings
) )
add_openmw_dir (mwsound add_openmw_dir (mwsound

View file

@ -31,7 +31,7 @@ namespace MWLua
{ {
auto* lua = context.mLua; auto* lua = context.mLua;
sol::table api(lua->sol(), sol::create); sol::table api(lua->sol(), sol::create);
api["API_VERSION"] = 0; api["API_VERSION"] = 1;
api["sendGlobalEvent"] = [context](std::string eventName, const sol::object& eventData) api["sendGlobalEvent"] = [context](std::string eventName, const sol::object& eventData)
{ {
context.mGlobalEventQueue->push_back({std::move(eventName), LuaUtil::serialize(eventData, context.mSerializer)}); context.mGlobalEventQueue->push_back({std::move(eventName), LuaUtil::serialize(eventData, context.mSerializer)});

View file

@ -59,6 +59,11 @@ namespace MWLua
// Implemented in uibindings.cpp // Implemented in uibindings.cpp
sol::table initUserInterfacePackage(const Context&); sol::table initUserInterfacePackage(const Context&);
// Implemented in settingsbindings.cpp
sol::table initGlobalSettingsPackage(const Context&);
sol::table initLocalSettingsPackage(const Context&);
sol::table initPlayerSettingsPackage(const Context&);
// openmw.self package is implemented in localscripts.cpp // openmw.self package is implemented in localscripts.cpp
} }

View file

@ -60,9 +60,12 @@ namespace MWLua
mLua.addCommonPackage("openmw.core", initCorePackage(context)); mLua.addCommonPackage("openmw.core", initCorePackage(context));
mLua.addCommonPackage("openmw.query", initQueryPackage(context)); mLua.addCommonPackage("openmw.query", initQueryPackage(context));
mGlobalScripts.addPackage("openmw.world", initWorldPackage(context)); mGlobalScripts.addPackage("openmw.world", initWorldPackage(context));
mGlobalScripts.addPackage("openmw.settings", initGlobalSettingsPackage(context));
mCameraPackage = initCameraPackage(localContext); mCameraPackage = initCameraPackage(localContext);
mUserInterfacePackage = initUserInterfacePackage(localContext); mUserInterfacePackage = initUserInterfacePackage(localContext);
mNearbyPackage = initNearbyPackage(localContext); mNearbyPackage = initNearbyPackage(localContext);
mLocalSettingsPackage = initLocalSettingsPackage(localContext);
mPlayerSettingsPackage = initPlayerSettingsPackage(localContext);
mKeyPressEvents.clear(); mKeyPressEvents.clear();
for (const std::string& path : mGlobalScriptList) for (const std::string& path : mGlobalScriptList)
@ -291,9 +294,13 @@ namespace MWLua
scripts = std::make_shared<PlayerScripts>(&mLua, LObject(getId(ptr), mWorldView.getObjectRegistry())); scripts = std::make_shared<PlayerScripts>(&mLua, LObject(getId(ptr), mWorldView.getObjectRegistry()));
scripts->addPackage("openmw.ui", mUserInterfacePackage); scripts->addPackage("openmw.ui", mUserInterfacePackage);
scripts->addPackage("openmw.camera", mCameraPackage); scripts->addPackage("openmw.camera", mCameraPackage);
scripts->addPackage("openmw.settings", mPlayerSettingsPackage);
} }
else else
{
scripts = std::make_shared<LocalScripts>(&mLua, LObject(getId(ptr), mWorldView.getObjectRegistry())); scripts = std::make_shared<LocalScripts>(&mLua, LObject(getId(ptr), mWorldView.getObjectRegistry()));
scripts->addPackage("openmw.settings", mLocalSettingsPackage);
}
scripts->addPackage("openmw.nearby", mNearbyPackage); scripts->addPackage("openmw.nearby", mNearbyPackage);
scripts->setSerializer(mLocalSerializer.get()); scripts->setSerializer(mLocalSerializer.get());

View file

@ -75,6 +75,8 @@ namespace MWLua
sol::table mNearbyPackage; sol::table mNearbyPackage;
sol::table mUserInterfacePackage; sol::table mUserInterfacePackage;
sol::table mCameraPackage; sol::table mCameraPackage;
sol::table mLocalSettingsPackage;
sol::table mPlayerSettingsPackage;
std::vector<std::string> mGlobalScriptList; std::vector<std::string> mGlobalScriptList;
GlobalScripts mGlobalScripts{&mLua}; GlobalScripts mGlobalScripts{&mLua};

View file

@ -0,0 +1,72 @@
#include "luabindings.hpp"
#include <components/settings/settings.hpp>
#include "../mwworld/esmstore.hpp"
#include "../mwworld/store.hpp"
namespace MWLua
{
static sol::table initSettingsPackage(const Context& context, bool /*global*/, bool player)
{
LuaUtil::LuaState* lua = context.mLua;
sol::table config(lua->sol(), sol::create);
// Access to settings.cfg. Temporary, will be removed at some point.
auto checkRead = [player](std::string_view category)
{
if ((category == "Camera" || category == "GUI" || category == "Hud" ||
category == "Windows" || category == "Input") && !player)
throw std::runtime_error("This setting is only available in player scripts");
};
config["_getBoolFromSettingsCfg"] = [=](const std::string& category, const std::string& setting)
{
checkRead(category);
return Settings::Manager::getBool(setting, category);
};
config["_getIntFromSettingsCfg"] = [=](const std::string& category, const std::string& setting)
{
checkRead(category);
return Settings::Manager::getInt(setting, category);
};
config["_getFloatFromSettingsCfg"] = [=](const std::string& category, const std::string& setting)
{
checkRead(category);
return Settings::Manager::getFloat(setting, category);
};
config["_getStringFromSettingsCfg"] = [=](const std::string& category, const std::string& setting)
{
checkRead(category);
return Settings::Manager::getString(setting, category);
};
config["_getVector2FromSettingsCfg"] = [=](const std::string& category, const std::string& setting)
{
checkRead(category);
return Settings::Manager::getVector2(setting, category);
};
config["_getVector3FromSettingsCfg"] = [=](const std::string& category, const std::string& setting)
{
checkRead(category);
return Settings::Manager::getVector3(setting, category);
};
const MWWorld::Store<ESM::GameSetting>* gmst = &MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>();
config["getGMST"] = [lua, gmst](const std::string setting) -> sol::object
{
const ESM::Variant& value = gmst->find(setting)->mValue;
if (value.getType() == ESM::VT_String)
return sol::make_object<std::string>(lua->sol(), value.getString());
else if (value.getType() == ESM::VT_Int)
return sol::make_object<int>(lua->sol(), value.getInteger());
else
return sol::make_object<float>(lua->sol(), value.getFloat());
};
return lua->makeReadOnly(config);
}
sol::table initGlobalSettingsPackage(const Context& context) { return initSettingsPackage(context, true, false); }
sol::table initLocalSettingsPackage(const Context& context) { return initSettingsPackage(context, false, false); }
sol::table initPlayerSettingsPackage(const Context& context) { return initSettingsPackage(context, false, true); }
}

View file

@ -7,6 +7,7 @@ Lua API reference
engine_handlers engine_handlers
openmw_util openmw_util
openmw_settings
openmw_core openmw_core
openmw_async openmw_async
openmw_query openmw_query
@ -37,6 +38,9 @@ Player scripts are local scripts that are attached to a player.
|:ref:`openmw.util <Package openmw.util>` | everywhere | | Defines utility functions and classes like 3D vectors, | |:ref:`openmw.util <Package openmw.util>` | everywhere | | Defines utility functions and classes like 3D vectors, |
| | | | that don't depend on the game world. | | | | | that don't depend on the game world. |
+---------------------------------------------------------+--------------------+---------------------------------------------------------------+ +---------------------------------------------------------+--------------------+---------------------------------------------------------------+
|:ref:`openmw.settings <Package openmw.settings>` | everywhere | | Access to GMST records in content files (implemented) and |
| | | | to mod settings (not implemented). |
+---------------------------------------------------------+--------------------+---------------------------------------------------------------+
|:ref:`openmw.core <Package openmw.core>` | everywhere | | Functions that are common for both global and local scripts | |:ref:`openmw.core <Package openmw.core>` | everywhere | | Functions that are common for both global and local scripts |
+---------------------------------------------------------+--------------------+---------------------------------------------------------------+ +---------------------------------------------------------+--------------------+---------------------------------------------------------------+
|:ref:`openmw.async <Package openmw.async>` | everywhere | | Timers (implemented) and coroutine utils (not implemented) | |:ref:`openmw.async <Package openmw.async>` | everywhere | | Timers (implemented) and coroutine utils (not implemented) |

View file

@ -0,0 +1,5 @@
Package openmw.settings
=======================
.. raw:: html
:file: generated_html/openmw_settings.html

View file

@ -299,6 +299,9 @@ Player scripts are local scripts that are attached to a player.
|:ref:`openmw.util <Package openmw.util>` | everywhere | | Defines utility functions and classes like 3D vectors, | |:ref:`openmw.util <Package openmw.util>` | everywhere | | Defines utility functions and classes like 3D vectors, |
| | | | that don't depend on the game world. | | | | | that don't depend on the game world. |
+---------------------------------------------------------+--------------------+---------------------------------------------------------------+ +---------------------------------------------------------+--------------------+---------------------------------------------------------------+
|:ref:`openmw.settings <Package openmw.settings>` | everywhere | | Access to GMST records in content files (implemented) and |
| | | | to mod settings (not implemented). |
+---------------------------------------------------------+--------------------+---------------------------------------------------------------+
|:ref:`openmw.core <Package openmw.core>` | everywhere | | Functions that are common for both global and local scripts | |:ref:`openmw.core <Package openmw.core>` | everywhere | | Functions that are common for both global and local scripts |
+---------------------------------------------------------+--------------------+---------------------------------------------------------------+ +---------------------------------------------------------+--------------------+---------------------------------------------------------------+
|:ref:`openmw.async <Package openmw.async>` | everywhere | | Timers (implemented) and coroutine utils (not implemented) | |:ref:`openmw.async <Package openmw.async>` | everywhere | | Timers (implemented) and coroutine utils (not implemented) |

View file

@ -0,0 +1,14 @@
-------------------------------------------------------------------------------
-- `openmw.settings` provides read-only access to GMST records in content files.
-- @module settings
-- @usage
-- local settings = require('openmw.settings')
-------------------------------------------------------------------------------
-- Get a GMST setting from content files.
-- @function [parent=#settings] getGMST
-- @param #string setting
return nil