From 4562b8c06b2d2bfcc0cb6a0e34f70f3d19e23862 Mon Sep 17 00:00:00 2001 From: Petr Mikheev Date: Sat, 22 Apr 2023 13:10:20 +0200 Subject: [PATCH] Add headers for all `.cpp` files in mwlua; move packages initilaization from LuaManager to luabindings.cpp --- apps/openmw/mwlua/camerabindings.cpp | 9 +-- apps/openmw/mwlua/camerabindings.hpp | 11 +++ apps/openmw/mwlua/cellbindings.cpp | 2 +- apps/openmw/mwlua/cellbindings.hpp | 12 ++++ apps/openmw/mwlua/inputbindings.cpp | 3 +- apps/openmw/mwlua/inputbindings.hpp | 13 ++++ apps/openmw/mwlua/luabindings.cpp | 71 +++++++++++++------- apps/openmw/mwlua/luabindings.hpp | 46 +++---------- apps/openmw/mwlua/luamanagerimp.cpp | 56 ++++++--------- apps/openmw/mwlua/luamanagerimp.hpp | 14 +--- apps/openmw/mwlua/nearbybindings.cpp | 2 +- apps/openmw/mwlua/nearbybindings.hpp | 13 ++++ apps/openmw/mwlua/objectbindings.cpp | 2 +- apps/openmw/mwlua/objectbindings.hpp | 12 ++++ apps/openmw/mwlua/postprocessingbindings.cpp | 2 +- apps/openmw/mwlua/postprocessingbindings.hpp | 13 ++++ apps/openmw/mwlua/uibindings.cpp | 2 + apps/openmw/mwlua/uibindings.hpp | 13 ++++ components/lua/luastate.cpp | 2 +- components/lua/scriptscontainer.cpp | 2 +- components/lua/storage.cpp | 28 ++++++++ components/lua/storage.hpp | 3 + 22 files changed, 214 insertions(+), 117 deletions(-) create mode 100644 apps/openmw/mwlua/camerabindings.hpp create mode 100644 apps/openmw/mwlua/cellbindings.hpp create mode 100644 apps/openmw/mwlua/inputbindings.hpp create mode 100644 apps/openmw/mwlua/nearbybindings.hpp create mode 100644 apps/openmw/mwlua/objectbindings.hpp create mode 100644 apps/openmw/mwlua/postprocessingbindings.hpp create mode 100644 apps/openmw/mwlua/uibindings.hpp diff --git a/apps/openmw/mwlua/camerabindings.cpp b/apps/openmw/mwlua/camerabindings.cpp index 3b13e02936..a62f743b5d 100644 --- a/apps/openmw/mwlua/camerabindings.cpp +++ b/apps/openmw/mwlua/camerabindings.cpp @@ -1,5 +1,6 @@ #include "luabindings.hpp" +#include #include #include @@ -13,15 +14,15 @@ namespace MWLua using CameraMode = MWRender::Camera::Mode; - sol::table initCameraPackage(const Context& context) + sol::table initCameraPackage(sol::state_view& lua) { MWRender::Camera* camera = MWBase::Environment::get().getWorld()->getCamera(); MWRender::RenderingManager* renderingManager = MWBase::Environment::get().getWorld()->getRenderingManager(); - sol::table api(context.mLua->sol(), sol::create); + sol::table api(lua, sol::create); api["MODE"] = LuaUtil::makeStrictReadOnly( - context.mLua->sol().create_table_with("Static", CameraMode::Static, "FirstPerson", CameraMode::FirstPerson, - "ThirdPerson", CameraMode::ThirdPerson, "Vanity", CameraMode::Vanity, "Preview", CameraMode::Preview)); + lua.create_table_with("Static", CameraMode::Static, "FirstPerson", CameraMode::FirstPerson, "ThirdPerson", + CameraMode::ThirdPerson, "Vanity", CameraMode::Vanity, "Preview", CameraMode::Preview)); api["getMode"] = [camera]() -> int { return static_cast(camera->getMode()); }; api["getQueuedMode"] = [camera]() -> sol::optional { diff --git a/apps/openmw/mwlua/camerabindings.hpp b/apps/openmw/mwlua/camerabindings.hpp new file mode 100644 index 0000000000..be468495e1 --- /dev/null +++ b/apps/openmw/mwlua/camerabindings.hpp @@ -0,0 +1,11 @@ +#ifndef MWLUA_CAMERABINDINGS_H +#define MWLUA_CAMERABINDINGS_H + +#include + +namespace MWLua +{ + sol::table initCameraPackage(sol::state_view& lua); +} + +#endif // MWLUA_CAMERABINDINGS_H diff --git a/apps/openmw/mwlua/cellbindings.cpp b/apps/openmw/mwlua/cellbindings.cpp index d8d4e66d91..2021bca728 100644 --- a/apps/openmw/mwlua/cellbindings.cpp +++ b/apps/openmw/mwlua/cellbindings.cpp @@ -1,4 +1,4 @@ -#include "luabindings.hpp" +#include "cellbindings.hpp" #include #include diff --git a/apps/openmw/mwlua/cellbindings.hpp b/apps/openmw/mwlua/cellbindings.hpp new file mode 100644 index 0000000000..0d8e90e989 --- /dev/null +++ b/apps/openmw/mwlua/cellbindings.hpp @@ -0,0 +1,12 @@ +#ifndef MWLUA_CELLBINDINGS_H +#define MWLUA_CELLBINDINGS_H + +#include "context.hpp" + +namespace MWLua +{ + void initCellBindingsForLocalScripts(const Context&); + void initCellBindingsForGlobalScripts(const Context&); +} + +#endif // MWLUA_CELLBINDINGS_H diff --git a/apps/openmw/mwlua/inputbindings.cpp b/apps/openmw/mwlua/inputbindings.cpp index ae3ce82fcb..9384eccdbc 100644 --- a/apps/openmw/mwlua/inputbindings.cpp +++ b/apps/openmw/mwlua/inputbindings.cpp @@ -1,9 +1,10 @@ -#include "luabindings.hpp" +#include "inputbindings.hpp" #include #include #include +#include #include #include "../mwbase/environment.hpp" diff --git a/apps/openmw/mwlua/inputbindings.hpp b/apps/openmw/mwlua/inputbindings.hpp new file mode 100644 index 0000000000..195f69f5f9 --- /dev/null +++ b/apps/openmw/mwlua/inputbindings.hpp @@ -0,0 +1,13 @@ +#ifndef MWLUA_INPUTBINDINGS_H +#define MWLUA_INPUTBINDINGS_H + +#include + +#include "context.hpp" + +namespace MWLua +{ + sol::table initInputPackage(const Context&); +} + +#endif // MWLUA_INPUTBINDINGS_H diff --git a/apps/openmw/mwlua/luabindings.cpp b/apps/openmw/mwlua/luabindings.cpp index d62b1c10ba..d0c38f31b1 100644 --- a/apps/openmw/mwlua/luabindings.cpp +++ b/apps/openmw/mwlua/luabindings.cpp @@ -3,11 +3,12 @@ #include #include -#include #include #include + #include #include +#include #include "../mwbase/environment.hpp" #include "../mwbase/statemanager.hpp" @@ -22,7 +23,16 @@ #include "luamanagerimp.hpp" #include "worldview.hpp" +#include "camerabindings.hpp" +#include "cellbindings.hpp" +#include "debugbindings.hpp" +#include "inputbindings.hpp" #include "magicbindings.hpp" +#include "nearbybindings.hpp" +#include "objectbindings.hpp" +#include "postprocessingbindings.hpp" +#include "types/types.hpp" +#include "uibindings.hpp" namespace MWLua { @@ -54,7 +64,7 @@ namespace MWLua // api["resume"] = []() {}; } - sol::table initCorePackage(const Context& context) + static sol::table initCorePackage(const Context& context) { auto* lua = context.mLua; sol::table api(lua->sol(), sol::create); @@ -96,7 +106,7 @@ namespace MWLua return LuaUtil::makeReadOnly(api); } - sol::table initWorldPackage(const Context& context) + static sol::table initWorldPackage(const Context& context) { sol::table api(context.mLua->sol(), sol::create); WorldView* worldView = context.mWorldView; @@ -137,33 +147,48 @@ namespace MWLua return LuaUtil::makeReadOnly(api); } - sol::table initGlobalStoragePackage(const Context& context, LuaUtil::LuaStorage* globalStorage) + std::map initCommonPackages(const Context& context) { - sol::table res(context.mLua->sol(), sol::create); - res["globalSection"] - = [globalStorage](std::string_view section) { return globalStorage->getMutableSection(section); }; - res["allGlobalSections"] = [globalStorage]() { return globalStorage->getAllSections(); }; - return LuaUtil::makeReadOnly(res); + sol::state_view lua = context.mLua->sol(); + WorldView* w = context.mWorldView; + return { + { "openmw.async", + LuaUtil::getAsyncPackageInitializer( + lua, [w] { return w->getSimulationTime(); }, [w] { return w->getGameTime(); }) }, + { "openmw.core", initCorePackage(context) }, + { "openmw.types", initTypesPackage(context) }, + { "openmw.util", LuaUtil::initUtilPackage(lua) }, + }; } - sol::table initLocalStoragePackage(const Context& context, LuaUtil::LuaStorage* globalStorage) + std::map initGlobalPackages(const Context& context) { - sol::table res(context.mLua->sol(), sol::create); - res["globalSection"] - = [globalStorage](std::string_view section) { return globalStorage->getReadOnlySection(section); }; - return LuaUtil::makeReadOnly(res); + initObjectBindingsForGlobalScripts(context); + initCellBindingsForGlobalScripts(context); + return { + { "openmw.world", initWorldPackage(context) }, + }; } - sol::table initPlayerStoragePackage( - const Context& context, LuaUtil::LuaStorage* globalStorage, LuaUtil::LuaStorage* playerStorage) + std::map initLocalPackages(const Context& context) { - sol::table res(context.mLua->sol(), sol::create); - res["globalSection"] - = [globalStorage](std::string_view section) { return globalStorage->getReadOnlySection(section); }; - res["playerSection"] - = [playerStorage](std::string_view section) { return playerStorage->getMutableSection(section); }; - res["allPlayerSections"] = [playerStorage]() { return playerStorage->getAllSections(); }; - return LuaUtil::makeReadOnly(res); + initObjectBindingsForLocalScripts(context); + initCellBindingsForLocalScripts(context); + LocalScripts::initializeSelfPackage(context); + return { + { "openmw.nearby", initNearbyPackage(context) }, + }; + } + + std::map initPlayerPackages(const Context& context) + { + return { + { "openmw.camera", initCameraPackage(context.mLua->sol()) }, + { "openmw.debug", initDebugPackage(context) }, + { "openmw.input", initInputPackage(context) }, + { "openmw.postprocessing", initPostprocessingPackage(context) }, + { "openmw.ui", initUserInterfacePackage(context) }, + }; } } diff --git a/apps/openmw/mwlua/luabindings.hpp b/apps/openmw/mwlua/luabindings.hpp index d4706c3e1e..e5d481d1eb 100644 --- a/apps/openmw/mwlua/luabindings.hpp +++ b/apps/openmw/mwlua/luabindings.hpp @@ -1,49 +1,25 @@ #ifndef MWLUA_LUABINDINGS_H #define MWLUA_LUABINDINGS_H -#include -#include +#include +#include +#include #include "context.hpp" -namespace MWWorld -{ - class CellStore; -} - namespace MWLua { + // Initialize Lua packages that are available for all scripts. + std::map initCommonPackages(const Context&); - sol::table initCorePackage(const Context&); - sol::table initWorldPackage(const Context&); - sol::table initPostprocessingPackage(const Context&); + // Initialize Lua packages that are available only for global scripts. + std::map initGlobalPackages(const Context&); - sol::table initGlobalStoragePackage(const Context&, LuaUtil::LuaStorage* globalStorage); - sol::table initLocalStoragePackage(const Context&, LuaUtil::LuaStorage* globalStorage); - sol::table initPlayerStoragePackage( - const Context&, LuaUtil::LuaStorage* globalStorage, LuaUtil::LuaStorage* playerStorage); + // Initialize Lua packages that are available only for local scripts (including player scripts). + std::map initLocalPackages(const Context&); - // Implemented in nearbybindings.cpp - sol::table initNearbyPackage(const Context&); - - // Implemented in objectbindings.cpp - void initObjectBindingsForLocalScripts(const Context&); - void initObjectBindingsForGlobalScripts(const Context&); - - // Implemented in cellbindings.cpp - void initCellBindingsForLocalScripts(const Context&); - void initCellBindingsForGlobalScripts(const Context&); - - // Implemented in camerabindings.cpp - sol::table initCameraPackage(const Context&); - - // Implemented in uibindings.cpp - sol::table initUserInterfacePackage(const Context&); - - // Implemented in inputbindings.cpp - sol::table initInputPackage(const Context&); - - // openmw.self package is implemented in localscripts.cpp + // Initialize Lua packages that are available only for local scripts on the player. + std::map initPlayerPackages(const Context&); } #endif // MWLUA_LUABINDINGS_H diff --git a/apps/openmw/mwlua/luamanagerimp.cpp b/apps/openmw/mwlua/luamanagerimp.cpp index 35d1d0be4d..16b919b43f 100644 --- a/apps/openmw/mwlua/luamanagerimp.cpp +++ b/apps/openmw/mwlua/luamanagerimp.cpp @@ -16,9 +16,6 @@ #include -#include -#include - #include #include @@ -31,7 +28,6 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/scene.hpp" -#include "debugbindings.hpp" #include "luabindings.hpp" #include "playerscripts.hpp" #include "types/types.hpp" @@ -88,31 +84,21 @@ namespace MWLua localContext.mIsGlobal = false; localContext.mSerializer = mLocalSerializer.get(); - initObjectBindingsForGlobalScripts(context); - initCellBindingsForGlobalScripts(context); - initObjectBindingsForLocalScripts(localContext); - initCellBindingsForLocalScripts(localContext); - LocalScripts::initializeSelfPackage(localContext); + for (const auto& [name, package] : initCommonPackages(context)) + mLua.addCommonPackage(name, package); + for (const auto& [name, package] : initGlobalPackages(context)) + mGlobalScripts.addPackage(name, package); + + mLocalPackages = initLocalPackages(localContext); + mPlayerPackages = initPlayerPackages(localContext); + mPlayerPackages.insert(mLocalPackages.begin(), mLocalPackages.end()); + LuaUtil::LuaStorage::initLuaBindings(mLua.sol()); - - mLua.addCommonPackage("openmw.async", - LuaUtil::getAsyncPackageInitializer( - mLua.sol(), [this] { return mWorldView.getSimulationTime(); }, - [this] { return mWorldView.getGameTime(); })); - mLua.addCommonPackage("openmw.util", LuaUtil::initUtilPackage(mLua.sol())); - mLua.addCommonPackage("openmw.core", initCorePackage(context)); - mLua.addCommonPackage("openmw.types", initTypesPackage(context)); - mGlobalScripts.addPackage("openmw.world", initWorldPackage(context)); - mGlobalScripts.addPackage("openmw.storage", initGlobalStoragePackage(context, &mGlobalStorage)); - - mCameraPackage = initCameraPackage(localContext); - mUserInterfacePackage = initUserInterfacePackage(localContext); - mInputPackage = initInputPackage(localContext); - mNearbyPackage = initNearbyPackage(localContext); - mLocalStoragePackage = initLocalStoragePackage(localContext, &mGlobalStorage); - mPlayerStoragePackage = initPlayerStoragePackage(localContext, &mGlobalStorage, &mPlayerStorage); - mPostprocessingPackage = initPostprocessingPackage(localContext); - mDebugPackage = initDebugPackage(localContext); + mGlobalScripts.addPackage( + "openmw.storage", LuaUtil::LuaStorage::initGlobalPackage(mLua.sol(), &mGlobalStorage)); + mLocalPackages["openmw.storage"] = LuaUtil::LuaStorage::initLocalPackage(mLua.sol(), &mGlobalStorage); + mPlayerPackages["openmw.storage"] + = LuaUtil::LuaStorage::initPlayerPackage(mLua.sol(), &mGlobalStorage, &mPlayerStorage); initConfiguration(); mInitialized = true; @@ -147,7 +133,7 @@ namespace MWLua MWWorld::Ptr newPlayerPtr = MWBase::Environment::get().getWorld()->getPlayerPtr(); if (!(getId(mPlayer) == getId(newPlayerPtr))) - throw std::logic_error("Player Refnum was changed unexpectedly"); + throw std::logic_error("Player RefNum was changed unexpectedly"); if (!mPlayer.isInCell() || !newPlayerPtr.isInCell() || mPlayer.getCell() != newPlayerPtr.getCell()) { mPlayer = newPlayerPtr; // player was moved to another cell, update ptr in registry @@ -352,12 +338,8 @@ namespace MWLua { scripts = std::make_shared(&mLua, LObject(getId(ptr))); scripts->setAutoStartConf(mConfiguration.getPlayerConf()); - scripts->addPackage("openmw.ui", mUserInterfacePackage); - scripts->addPackage("openmw.camera", mCameraPackage); - scripts->addPackage("openmw.input", mInputPackage); - scripts->addPackage("openmw.storage", mPlayerStoragePackage); - scripts->addPackage("openmw.postprocessing", mPostprocessingPackage); - scripts->addPackage("openmw.debug", mDebugPackage); + for (const auto& [name, package] : mPlayerPackages) + scripts->addPackage(name, package); } else { @@ -365,9 +347,9 @@ namespace MWLua if (!autoStartConf.has_value()) autoStartConf = mConfiguration.getLocalConf(type, ptr.getCellRef().getRefId(), getId(ptr)); scripts->setAutoStartConf(std::move(*autoStartConf)); - scripts->addPackage("openmw.storage", mLocalStoragePackage); + for (const auto& [name, package] : mLocalPackages) + scripts->addPackage(name, package); } - scripts->addPackage("openmw.nearby", mNearbyPackage); scripts->setSerializer(mLocalSerializer.get()); MWWorld::RefData& refData = ptr.getRefData(); diff --git a/apps/openmw/mwlua/luamanagerimp.hpp b/apps/openmw/mwlua/luamanagerimp.hpp index 7f56301edc..ffae2f2bf5 100644 --- a/apps/openmw/mwlua/luamanagerimp.hpp +++ b/apps/openmw/mwlua/luamanagerimp.hpp @@ -1,16 +1,14 @@ #ifndef MWLUA_LUAMANAGERIMP_H #define MWLUA_LUAMANAGERIMP_H +#include #include #include #include #include - #include - #include -#include #include "../mwbase/luamanager.hpp" @@ -157,14 +155,8 @@ namespace MWLua LuaUtil::ScriptsConfiguration mConfiguration; LuaUtil::LuaState mLua; LuaUi::ResourceManager mUiResourceManager; - sol::table mNearbyPackage; - sol::table mUserInterfacePackage; - sol::table mCameraPackage; - sol::table mInputPackage; - sol::table mLocalStoragePackage; - sol::table mPlayerStoragePackage; - sol::table mPostprocessingPackage; - sol::table mDebugPackage; + std::map mLocalPackages; + std::map mPlayerPackages; GlobalScripts mGlobalScripts{ &mLua }; std::set mActiveLocalScripts; diff --git a/apps/openmw/mwlua/nearbybindings.cpp b/apps/openmw/mwlua/nearbybindings.cpp index 5c2572c0e5..c9f9163648 100644 --- a/apps/openmw/mwlua/nearbybindings.cpp +++ b/apps/openmw/mwlua/nearbybindings.cpp @@ -1,4 +1,4 @@ -#include "luabindings.hpp" +#include "nearbybindings.hpp" #include #include diff --git a/apps/openmw/mwlua/nearbybindings.hpp b/apps/openmw/mwlua/nearbybindings.hpp new file mode 100644 index 0000000000..ee0022898e --- /dev/null +++ b/apps/openmw/mwlua/nearbybindings.hpp @@ -0,0 +1,13 @@ +#ifndef MWLUA_NEARBYBINDINGS_H +#define MWLUA_NEARBYBINDINGS_H + +#include + +#include "context.hpp" + +namespace MWLua +{ + sol::table initNearbyPackage(const Context&); +} + +#endif // MWLUA_NEARBYBINDINGS_H diff --git a/apps/openmw/mwlua/objectbindings.cpp b/apps/openmw/mwlua/objectbindings.cpp index e99648f1ed..53092f195c 100644 --- a/apps/openmw/mwlua/objectbindings.cpp +++ b/apps/openmw/mwlua/objectbindings.cpp @@ -1,4 +1,4 @@ -#include "luabindings.hpp" +#include "objectbindings.hpp" #include #include diff --git a/apps/openmw/mwlua/objectbindings.hpp b/apps/openmw/mwlua/objectbindings.hpp new file mode 100644 index 0000000000..5f69c54da3 --- /dev/null +++ b/apps/openmw/mwlua/objectbindings.hpp @@ -0,0 +1,12 @@ +#ifndef MWLUA_OBJECTBINDINGS_H +#define MWLUA_OBJECTBINDINGS_H + +#include "context.hpp" + +namespace MWLua +{ + void initObjectBindingsForLocalScripts(const Context&); + void initObjectBindingsForGlobalScripts(const Context&); +} + +#endif // MWLUA_OBJECTBINDINGS_H diff --git a/apps/openmw/mwlua/postprocessingbindings.cpp b/apps/openmw/mwlua/postprocessingbindings.cpp index 4d8212b749..72543709a1 100644 --- a/apps/openmw/mwlua/postprocessingbindings.cpp +++ b/apps/openmw/mwlua/postprocessingbindings.cpp @@ -1,4 +1,4 @@ -#include "luabindings.hpp" +#include "postprocessingbindings.hpp" #include "../mwbase/environment.hpp" #include "../mwrender/postprocessor.hpp" diff --git a/apps/openmw/mwlua/postprocessingbindings.hpp b/apps/openmw/mwlua/postprocessingbindings.hpp new file mode 100644 index 0000000000..50cd84fa24 --- /dev/null +++ b/apps/openmw/mwlua/postprocessingbindings.hpp @@ -0,0 +1,13 @@ +#ifndef MWLUA_POSTPROCESSINGBINDINGS_H +#define MWLUA_POSTPROCESSINGBINDINGS_H + +#include + +#include "context.hpp" + +namespace MWLua +{ + sol::table initPostprocessingPackage(const Context&); +} + +#endif // MWLUA_POSTPROCESSINGBINDINGS_H diff --git a/apps/openmw/mwlua/uibindings.cpp b/apps/openmw/mwlua/uibindings.cpp index 282892213a..24448a0d40 100644 --- a/apps/openmw/mwlua/uibindings.cpp +++ b/apps/openmw/mwlua/uibindings.cpp @@ -1,3 +1,5 @@ +#include "uibindings.hpp" + #include #include #include diff --git a/apps/openmw/mwlua/uibindings.hpp b/apps/openmw/mwlua/uibindings.hpp new file mode 100644 index 0000000000..930ba7f3d8 --- /dev/null +++ b/apps/openmw/mwlua/uibindings.hpp @@ -0,0 +1,13 @@ +#ifndef MWLUA_UIBINDINGS_H +#define MWLUA_UIBINDINGS_H + +#include + +#include "context.hpp" + +namespace MWLua +{ + sol::table initUserInterfacePackage(const Context&); +} + +#endif // MWLUA_UIBINDINGS_H diff --git a/components/lua/luastate.cpp b/components/lua/luastate.cpp index 453e9d1586..e07f93cde0 100644 --- a/components/lua/luastate.cpp +++ b/components/lua/luastate.cpp @@ -316,7 +316,7 @@ namespace LuaUtil { if (!package.is()) package = makeReadOnly(std::move(package)); - mCommonPackages.emplace(std::move(packageName), std::move(package)); + mCommonPackages.insert_or_assign(std::move(packageName), std::move(package)); } sol::protected_function_result LuaState::runInNewSandbox(const std::string& path, const std::string& namePrefix, diff --git a/components/lua/scriptscontainer.cpp b/components/lua/scriptscontainer.cpp index eaf8c27af5..34d9921b8d 100644 --- a/components/lua/scriptscontainer.cpp +++ b/components/lua/scriptscontainer.cpp @@ -35,7 +35,7 @@ namespace LuaUtil void ScriptsContainer::addPackage(std::string packageName, sol::object package) { - mAPI.emplace(std::move(packageName), makeReadOnly(std::move(package))); + mAPI.insert_or_assign(std::move(packageName), makeReadOnly(std::move(package))); } bool ScriptsContainer::addCustomScript(int scriptId, std::string_view initData) diff --git a/components/lua/storage.cpp b/components/lua/storage.cpp index 3932a43280..45e6a1b8a6 100644 --- a/components/lua/storage.cpp +++ b/components/lua/storage.cpp @@ -138,6 +138,34 @@ namespace LuaUtil }; } + sol::table LuaStorage::initGlobalPackage(lua_State* lua, LuaStorage* globalStorage) + { + sol::table res(lua, sol::create); + res["globalSection"] + = [globalStorage](std::string_view section) { return globalStorage->getMutableSection(section); }; + res["allGlobalSections"] = [globalStorage]() { return globalStorage->getAllSections(); }; + return LuaUtil::makeReadOnly(res); + } + + sol::table LuaStorage::initLocalPackage(lua_State* lua, LuaStorage* globalStorage) + { + sol::table res(lua, sol::create); + res["globalSection"] + = [globalStorage](std::string_view section) { return globalStorage->getReadOnlySection(section); }; + return LuaUtil::makeReadOnly(res); + } + + sol::table LuaStorage::initPlayerPackage(lua_State* lua, LuaStorage* globalStorage, LuaStorage* playerStorage) + { + sol::table res(lua, sol::create); + res["globalSection"] + = [globalStorage](std::string_view section) { return globalStorage->getReadOnlySection(section); }; + res["playerSection"] + = [playerStorage](std::string_view section) { return playerStorage->getMutableSection(section); }; + res["allPlayerSections"] = [playerStorage]() { return playerStorage->getAllSections(); }; + return LuaUtil::makeReadOnly(res); + } + void LuaStorage::clearTemporaryAndRemoveCallbacks() { auto it = mData.begin(); diff --git a/components/lua/storage.hpp b/components/lua/storage.hpp index 7f3c10dd0d..9998af9430 100644 --- a/components/lua/storage.hpp +++ b/components/lua/storage.hpp @@ -14,6 +14,9 @@ namespace LuaUtil { public: static void initLuaBindings(lua_State*); + static sol::table initGlobalPackage(lua_State* lua, LuaStorage* globalStorage); + static sol::table initLocalPackage(lua_State* lua, LuaStorage* globalStorage); + static sol::table initPlayerPackage(lua_State* lua, LuaStorage* globalStorage, LuaStorage* playerStorage); explicit LuaStorage(lua_State* lua) : mLua(lua)