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:
commit
093b562f58
3 changed files with 38 additions and 3 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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); });
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue