mirror of
https://github.com/OpenMW/openmw.git
synced 2025-04-13 08:58:35 +00:00
Ensure class members are tied to the main Lua state
This commit is contained in:
parent
f0cee09b7c
commit
b0e9df0139
@ -71,7 +71,8 @@ namespace MWLua
|
||||
{
|
||||
SelfObject* obj = mObject.asSelfObject();
|
||||
addStatUpdateAction(context.mLuaManager, *obj);
|
||||
obj->mStatsCache[SelfObject::CachedStat{ &ItemData::setValue, std::monostate{}, prop }] = value;
|
||||
obj->mStatsCache[SelfObject::CachedStat{ &ItemData::setValue, std::monostate{}, prop }]
|
||||
= sol::main_object(value);
|
||||
}
|
||||
else
|
||||
throw std::runtime_error("Only global or self scripts can set the value");
|
||||
|
@ -54,7 +54,7 @@ namespace MWLua
|
||||
{
|
||||
}
|
||||
MWBase::LuaManager::ActorControls mControls;
|
||||
std::map<CachedStat, sol::object> mStatsCache;
|
||||
std::map<CachedStat, sol::main_object> mStatsCache;
|
||||
bool mIsActive;
|
||||
};
|
||||
|
||||
|
@ -123,7 +123,8 @@ namespace MWLua
|
||||
|
||||
SelfObject* obj = mObject.asSelfObject();
|
||||
addStatUpdateAction(context.mLuaManager, *obj);
|
||||
obj->mStatsCache[SelfObject::CachedStat{ &setNpcValue, attributeId, "skillIncreasesForAttribute" }] = value;
|
||||
obj->mStatsCache[SelfObject::CachedStat{ &setNpcValue, attributeId, "skillIncreasesForAttribute" }]
|
||||
= sol::main_object(value);
|
||||
}
|
||||
};
|
||||
|
||||
@ -159,7 +160,7 @@ namespace MWLua
|
||||
SelfObject* obj = mObject.asSelfObject();
|
||||
addStatUpdateAction(context.mLuaManager, *obj);
|
||||
obj->mStatsCache[SelfObject::CachedStat{ &setNpcValue, specialization, "skillIncreasesForSpecialization" }]
|
||||
= value;
|
||||
= sol::main_object(value);
|
||||
}
|
||||
};
|
||||
|
||||
@ -183,7 +184,8 @@ namespace MWLua
|
||||
{
|
||||
SelfObject* obj = mObject.asSelfObject();
|
||||
addStatUpdateAction(context.mLuaManager, *obj);
|
||||
obj->mStatsCache[SelfObject::CachedStat{ &setCreatureValue, std::monostate{}, "current" }] = value;
|
||||
obj->mStatsCache[SelfObject::CachedStat{ &setCreatureValue, std::monostate{}, "current" }]
|
||||
= sol::main_object(value);
|
||||
}
|
||||
|
||||
sol::object getProgress(const Context& context) const
|
||||
@ -204,7 +206,8 @@ namespace MWLua
|
||||
|
||||
SelfObject* obj = mObject.asSelfObject();
|
||||
addStatUpdateAction(context.mLuaManager, *obj);
|
||||
obj->mStatsCache[SelfObject::CachedStat{ &setNpcValue, std::monostate{}, "progress" }] = value;
|
||||
obj->mStatsCache[SelfObject::CachedStat{ &setNpcValue, std::monostate{}, "progress" }]
|
||||
= sol::main_object(value);
|
||||
}
|
||||
|
||||
SkillIncreasesForAttributeStats getSkillIncreasesForAttributeStats() const
|
||||
@ -258,7 +261,7 @@ namespace MWLua
|
||||
{
|
||||
SelfObject* obj = mObject.asSelfObject();
|
||||
addStatUpdateAction(context.mLuaManager, *obj);
|
||||
obj->mStatsCache[SelfObject::CachedStat{ &DynamicStat::setValue, mIndex, prop }] = value;
|
||||
obj->mStatsCache[SelfObject::CachedStat{ &DynamicStat::setValue, mIndex, prop }] = sol::main_object(value);
|
||||
}
|
||||
|
||||
static void setValue(Index i, std::string_view prop, const MWWorld::Ptr& ptr, const sol::object& value)
|
||||
@ -318,7 +321,7 @@ namespace MWLua
|
||||
{
|
||||
SelfObject* obj = mObject.asSelfObject();
|
||||
addStatUpdateAction(context.mLuaManager, *obj);
|
||||
obj->mStatsCache[SelfObject::CachedStat{ &AttributeStat::setValue, mId, prop }] = value;
|
||||
obj->mStatsCache[SelfObject::CachedStat{ &AttributeStat::setValue, mId, prop }] = sol::main_object(value);
|
||||
}
|
||||
|
||||
static void setValue(Index i, std::string_view prop, const MWWorld::Ptr& ptr, const sol::object& value)
|
||||
@ -402,7 +405,7 @@ namespace MWLua
|
||||
{
|
||||
SelfObject* obj = mObject.asSelfObject();
|
||||
addStatUpdateAction(context.mLuaManager, *obj);
|
||||
obj->mStatsCache[SelfObject::CachedStat{ &SkillStat::setValue, mId, prop }] = value;
|
||||
obj->mStatsCache[SelfObject::CachedStat{ &SkillStat::setValue, mId, prop }] = sol::main_object(value);
|
||||
}
|
||||
|
||||
static void setValue(Index index, std::string_view prop, const MWWorld::Ptr& ptr, const sol::object& value)
|
||||
@ -465,7 +468,8 @@ namespace MWLua
|
||||
{
|
||||
SelfObject* obj = mObject.asSelfObject();
|
||||
addStatUpdateAction(context.mLuaManager, *obj);
|
||||
obj->mStatsCache[SelfObject::CachedStat{ &AIStat::setValue, static_cast<int>(mIndex), prop }] = value;
|
||||
obj->mStatsCache[SelfObject::CachedStat{ &AIStat::setValue, static_cast<int>(mIndex), prop }]
|
||||
= sol::main_object(value);
|
||||
}
|
||||
|
||||
static void setValue(Index i, std::string_view prop, const MWWorld::Ptr& ptr, const sol::object& value)
|
||||
|
@ -310,7 +310,7 @@ namespace MWLua
|
||||
return res.str();
|
||||
};
|
||||
element["layout"] = sol::property([](const LuaUi::Element& element) { return element.mLayout; },
|
||||
[](LuaUi::Element& element, const sol::table& layout) { element.mLayout = layout; });
|
||||
[](LuaUi::Element& element, const sol::main_table& layout) { element.mLayout = layout; });
|
||||
element["update"] = [luaManager = context.mLuaManager](const std::shared_ptr<LuaUi::Element>& element) {
|
||||
if (element->mState != LuaUi::Element::Created)
|
||||
return;
|
||||
|
@ -343,7 +343,8 @@ namespace LuaUtil
|
||||
}
|
||||
|
||||
sol::protected_function_result LuaState::runInNewSandbox(const VFS::Path::Normalized& path,
|
||||
const std::string& envName, const std::map<std::string, sol::object>& packages, const sol::object& hiddenData)
|
||||
const std::string& envName, const std::map<std::string, sol::main_object>& packages,
|
||||
const sol::main_object& hiddenData)
|
||||
{
|
||||
// TODO
|
||||
sol::protected_function script = loadScriptAndCache(path);
|
||||
|
@ -148,8 +148,8 @@ namespace LuaUtil
|
||||
// should be either a sol::table or a sol::function. If it is a function, it will be evaluated
|
||||
// (once per sandbox) with the argument 'hiddenData' the first time when requested.
|
||||
sol::protected_function_result runInNewSandbox(const VFS::Path::Normalized& path,
|
||||
const std::string& envName = "unnamed", const std::map<std::string, sol::object>& packages = {},
|
||||
const sol::object& hiddenData = sol::nil);
|
||||
const std::string& envName = "unnamed", const std::map<std::string, sol::main_object>& packages = {},
|
||||
const sol::main_object& hiddenData = sol::nil);
|
||||
|
||||
void dropScriptCache() { mCompiledScripts.clear(); }
|
||||
|
||||
|
@ -52,7 +52,7 @@ namespace LuaUtil
|
||||
Log(Debug::Error) << mNamePrefix << "[" << scriptPath(scriptId) << "] " << msg << ": " << e.what();
|
||||
}
|
||||
|
||||
void ScriptsContainer::addPackage(std::string packageName, sol::object package)
|
||||
void ScriptsContainer::addPackage(std::string packageName, sol::main_object package)
|
||||
{
|
||||
if (!package.is<sol::userdata>())
|
||||
throw std::logic_error("Expected package to be read-only: " + packageName);
|
||||
@ -312,7 +312,7 @@ namespace LuaUtil
|
||||
{
|
||||
if (next->mOnOverride)
|
||||
{
|
||||
sol::object prevInterface = sol::nil;
|
||||
sol::main_object prevInterface = sol::nil;
|
||||
if (prev)
|
||||
prevInterface = *prev->mInterface;
|
||||
try
|
||||
|
@ -90,7 +90,7 @@ namespace LuaUtil
|
||||
|
||||
// Adds package that will be available (via `require`) for all scripts in the container.
|
||||
// Automatically applies LuaUtil::makeReadOnly to the package.
|
||||
void addPackage(std::string packageName, sol::object package);
|
||||
void addPackage(std::string packageName, sol::main_object package);
|
||||
|
||||
// Gets script with given id from ScriptsConfiguration, finds the source in the virtual file system, starts as a
|
||||
// new script, adds it to the container, and calls onInit for this script. Returns `true` if the script was
|
||||
@ -168,7 +168,7 @@ namespace LuaUtil
|
||||
struct Handler
|
||||
{
|
||||
int mScriptId;
|
||||
sol::function mFn;
|
||||
sol::main_function mFn;
|
||||
};
|
||||
|
||||
struct EngineHandlerList
|
||||
@ -212,11 +212,11 @@ namespace LuaUtil
|
||||
private:
|
||||
struct Script
|
||||
{
|
||||
std::optional<sol::function> mOnSave;
|
||||
std::optional<sol::function> mOnOverride;
|
||||
std::optional<sol::table> mInterface;
|
||||
std::optional<sol::main_function> mOnSave;
|
||||
std::optional<sol::main_function> mOnOverride;
|
||||
std::optional<sol::main_table> mInterface;
|
||||
std::string mInterfaceName;
|
||||
sol::table mHiddenData;
|
||||
sol::main_table mHiddenData;
|
||||
std::map<std::string, sol::main_protected_function> mRegisteredCallbacks;
|
||||
std::map<int64_t, sol::main_protected_function> mTemporaryCallbacks;
|
||||
VFS::Path::Normalized mPath;
|
||||
@ -268,11 +268,11 @@ namespace LuaUtil
|
||||
const UserdataSerializer* mSerializer = nullptr;
|
||||
const UserdataSerializer* mSavedDataDeserializer = nullptr;
|
||||
|
||||
std::map<std::string, sol::object> mAPI;
|
||||
std::map<std::string, sol::main_object> mAPI;
|
||||
struct LoadedData
|
||||
{
|
||||
std::map<int, Script> mScripts;
|
||||
sol::table mPublicInterfaces;
|
||||
sol::main_table mPublicInterfaces;
|
||||
|
||||
std::map<std::string, EventHandlerList, std::less<>> mEventHandlers;
|
||||
|
||||
|
@ -37,7 +37,7 @@ namespace LuaUtil
|
||||
sol::object LuaStorage::Value::getReadOnly(lua_State* L) const
|
||||
{
|
||||
if (mReadOnlyValue == sol::nil && !mSerializedValue.empty())
|
||||
mReadOnlyValue = deserialize(L, mSerializedValue, nullptr, true);
|
||||
mReadOnlyValue = sol::main_object(deserialize(L, mSerializedValue, nullptr, true));
|
||||
return mReadOnlyValue;
|
||||
}
|
||||
|
||||
|
@ -74,7 +74,7 @@ namespace LuaUtil
|
||||
|
||||
private:
|
||||
std::string mSerializedValue;
|
||||
mutable sol::object mReadOnlyValue = sol::nil;
|
||||
mutable sol::main_object mReadOnlyValue = sol::nil;
|
||||
};
|
||||
|
||||
struct Section
|
||||
|
@ -18,7 +18,7 @@ namespace LuaUi
|
||||
{
|
||||
public:
|
||||
// accepts only Lua tables returned by ui.content
|
||||
explicit ContentView(sol::table table)
|
||||
explicit ContentView(sol::main_table table)
|
||||
: mTable(std::move(table))
|
||||
{
|
||||
if (!isValidContent(mTable))
|
||||
@ -94,7 +94,7 @@ namespace LuaUi
|
||||
sol::table getMetatable() const { return mTable[sol::metatable_key].get<sol::table>(); }
|
||||
|
||||
private:
|
||||
sol::table mTable;
|
||||
sol::main_table mTable;
|
||||
|
||||
template <typename... Arg>
|
||||
sol::object callMethod(std::string_view name, Arg&&... arg) const
|
||||
|
@ -324,7 +324,7 @@ namespace LuaUi
|
||||
destroyRoot(mRoot);
|
||||
mRoot = nullptr;
|
||||
}
|
||||
mLayout = sol::make_object(mLayout.lua_state(), sol::nil);
|
||||
mLayout.reset();
|
||||
}
|
||||
mState = Destroyed;
|
||||
}
|
||||
|
@ -19,7 +19,7 @@ namespace LuaUi
|
||||
}
|
||||
|
||||
WidgetExtension* mRoot;
|
||||
sol::object mLayout;
|
||||
sol::main_object mLayout;
|
||||
std::string mLayer;
|
||||
|
||||
enum State
|
||||
|
@ -281,7 +281,7 @@ namespace LuaUi
|
||||
updateChildrenCoord();
|
||||
}
|
||||
|
||||
void WidgetExtension::setProperties(const sol::object& props)
|
||||
void WidgetExtension::setProperties(const sol::main_object& props)
|
||||
{
|
||||
mProperties = props;
|
||||
updateProperties();
|
||||
|
@ -50,10 +50,10 @@ namespace LuaUi
|
||||
void setCallback(const std::string&, const LuaUtil::Callback&);
|
||||
void clearCallbacks();
|
||||
|
||||
void setProperties(const sol::object& props);
|
||||
void setTemplateProperties(const sol::object& props) { mTemplateProperties = props; }
|
||||
void setProperties(const sol::main_object& props);
|
||||
void setTemplateProperties(const sol::main_object& props) { mTemplateProperties = props; }
|
||||
|
||||
void setExternal(const sol::object& external) { mExternal = external; }
|
||||
void setExternal(const sol::main_object& external) { mExternal = external; }
|
||||
|
||||
MyGUI::IntCoord forcedCoord();
|
||||
void forceCoord(const MyGUI::IntCoord& offset);
|
||||
@ -63,7 +63,7 @@ namespace LuaUi
|
||||
|
||||
virtual void updateCoord();
|
||||
|
||||
const sol::table& getLayout() { return mLayout; }
|
||||
const sol::main_table& getLayout() { return mLayout; }
|
||||
void setLayout(const sol::table& layout) { mLayout = layout; }
|
||||
|
||||
template <typename T>
|
||||
@ -150,10 +150,10 @@ namespace LuaUi
|
||||
std::vector<WidgetExtension*> mTemplateChildren;
|
||||
WidgetExtension* mSlot;
|
||||
std::map<std::string, LuaUtil::Callback, std::less<>> mCallbacks;
|
||||
sol::table mLayout;
|
||||
sol::object mProperties;
|
||||
sol::object mTemplateProperties;
|
||||
sol::object mExternal;
|
||||
sol::main_table mLayout;
|
||||
sol::main_object mProperties;
|
||||
sol::main_object mTemplateProperties;
|
||||
sol::main_object mExternal;
|
||||
WidgetExtension* mParent;
|
||||
bool mTemplateChild;
|
||||
bool mElementRoot;
|
||||
|
Loading…
x
Reference in New Issue
Block a user