1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-10-19 05:16:38 +00:00

Merge branch 'moreFiniteFreezes' into 'master'

Protect more bindings from non-finite numbers

See merge request OpenMW/openmw!4704
This commit is contained in:
psi29a 2025-06-05 11:31:39 +00:00
commit 093b562f58
3 changed files with 38 additions and 3 deletions

View file

@ -5,6 +5,7 @@
#include <components/lua/asyncpackage.hpp> #include <components/lua/asyncpackage.hpp>
#include <components/lua/luastate.hpp> #include <components/lua/luastate.hpp>
#include <components/lua/utilpackage.hpp> #include <components/lua/utilpackage.hpp>
#include <components/misc/finitenumbers.hpp>
#include <components/misc/resourcehelpers.hpp> #include <components/misc/resourcehelpers.hpp>
#include <components/settings/values.hpp> #include <components/settings/values.hpp>
@ -99,6 +100,8 @@ namespace MWLua
sol::table initAnimationPackage(const Context& context) sol::table initAnimationPackage(const Context& context)
{ {
using FiniteFloat = Misc::FiniteFloat;
auto view = context.sol(); auto view = context.sol();
auto mechanics = MWBase::Environment::get().getMechanicsManager(); auto mechanics = MWBase::Environment::get().getMechanicsManager();
auto world = MWBase::Environment::get().getWorld(); auto world = MWBase::Environment::get().getWorld();
@ -197,7 +200,7 @@ namespace MWLua
return speed; return speed;
return sol::nullopt; return sol::nullopt;
}; };
api["setSpeed"] = [](const sol::object& object, std::string groupname, float speed) { api["setSpeed"] = [](const sol::object& object, std::string groupname, const FiniteFloat speed) {
getMutableAnimationOrThrow(ObjectVariant(object))->adjustSpeedMult(groupname, speed); getMutableAnimationOrThrow(ObjectVariant(object))->adjustSpeedMult(groupname, speed);
}; };
api["getActiveGroup"] = [](const sol::object& object, MWRender::BoneGroup boneGroup) -> std::string_view { api["getActiveGroup"] = [](const sol::object& object, MWRender::BoneGroup boneGroup) -> std::string_view {

View file

@ -10,6 +10,7 @@
#include <components/esm3/loadskil.hpp> #include <components/esm3/loadskil.hpp>
#include <components/esm3/loadweap.hpp> #include <components/esm3/loadweap.hpp>
#include <components/lua/luastate.hpp> #include <components/lua/luastate.hpp>
#include <components/misc/finitenumbers.hpp>
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/statemanager.hpp" #include "../mwbase/statemanager.hpp"
@ -56,10 +57,12 @@ namespace MWLua
static void addWorldTimeBindings(sol::table& api, const Context& context) static void addWorldTimeBindings(sol::table& api, const Context& context)
{ {
using FiniteFloat = Misc::FiniteFloat;
MWWorld::DateTimeManager* timeManager = MWBase::Environment::get().getWorld()->getTimeManager(); MWWorld::DateTimeManager* timeManager = MWBase::Environment::get().getWorld()->getTimeManager();
api["setGameTimeScale"] = [timeManager](double scale) { timeManager->setGameTimeScale(scale); }; api["setGameTimeScale"] = [timeManager](const FiniteFloat scale) { timeManager->setGameTimeScale(scale); };
api["setSimulationTimeScale"] = [context, timeManager](float scale) { api["setSimulationTimeScale"] = [context, timeManager](const FiniteFloat scale) {
context.mLuaManager->addAction([scale, timeManager] { timeManager->setSimulationTimeScale(scale); }); context.mLuaManager->addAction([scale, timeManager] { timeManager->setSimulationTimeScale(scale); });
}; };

View file

@ -8,6 +8,18 @@
namespace Misc namespace Misc
{ {
struct FiniteDouble
{
double mValue;
FiniteDouble(double v)
{
if (!std::isfinite(v))
throw std::invalid_argument("Value must be a finite number");
mValue = v;
}
operator double() const { return mValue; }
};
struct FiniteFloat struct FiniteFloat
{ {
float mValue; float mValue;
@ -23,8 +35,25 @@ namespace Misc
namespace sol namespace sol
{ {
using FiniteDouble = Misc::FiniteDouble;
using FiniteFloat = Misc::FiniteFloat; using FiniteFloat = Misc::FiniteFloat;
template <typename Handler>
bool sol_lua_check(
sol::types<FiniteDouble>, lua_State* L, int index, Handler&& handler, sol::stack::record& tracking)
{
bool success = sol::stack::check<double>(L, lua_absindex(L, index), handler);
tracking.use(1);
return success;
}
static FiniteDouble sol_lua_get(sol::types<FiniteDouble>, lua_State* L, int index, sol::stack::record& tracking)
{
double val = sol::stack::get<double>(L, lua_absindex(L, index));
tracking.use(1);
return FiniteDouble(val);
}
template <typename Handler> template <typename Handler>
bool sol_lua_check( bool sol_lua_check(
sol::types<FiniteFloat>, lua_State* L, int index, Handler&& handler, sol::stack::record& tracking) sol::types<FiniteFloat>, lua_State* L, int index, Handler&& handler, sol::stack::record& tracking)