mirror of
https://github.com/OpenMW/openmw.git
synced 2025-06-28 22:41:34 +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/luastate.hpp>
|
||||
#include <components/lua/utilpackage.hpp>
|
||||
#include <components/misc/finitenumbers.hpp>
|
||||
#include <components/misc/resourcehelpers.hpp>
|
||||
#include <components/settings/values.hpp>
|
||||
|
||||
|
@ -99,6 +100,8 @@ namespace MWLua
|
|||
|
||||
sol::table initAnimationPackage(const Context& context)
|
||||
{
|
||||
using FiniteFloat = Misc::FiniteFloat;
|
||||
|
||||
auto view = context.sol();
|
||||
auto mechanics = MWBase::Environment::get().getMechanicsManager();
|
||||
auto world = MWBase::Environment::get().getWorld();
|
||||
|
@ -197,7 +200,7 @@ namespace MWLua
|
|||
return speed;
|
||||
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);
|
||||
};
|
||||
api["getActiveGroup"] = [](const sol::object& object, MWRender::BoneGroup boneGroup) -> std::string_view {
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <components/esm3/loadskil.hpp>
|
||||
#include <components/esm3/loadweap.hpp>
|
||||
#include <components/lua/luastate.hpp>
|
||||
#include <components/misc/finitenumbers.hpp>
|
||||
|
||||
#include "../mwbase/environment.hpp"
|
||||
#include "../mwbase/statemanager.hpp"
|
||||
|
@ -56,10 +57,12 @@ namespace MWLua
|
|||
|
||||
static void addWorldTimeBindings(sol::table& api, const Context& context)
|
||||
{
|
||||
using FiniteFloat = Misc::FiniteFloat;
|
||||
|
||||
MWWorld::DateTimeManager* timeManager = MWBase::Environment::get().getWorld()->getTimeManager();
|
||||
|
||||
api["setGameTimeScale"] = [timeManager](double scale) { timeManager->setGameTimeScale(scale); };
|
||||
api["setSimulationTimeScale"] = [context, timeManager](float scale) {
|
||||
api["setGameTimeScale"] = [timeManager](const FiniteFloat scale) { timeManager->setGameTimeScale(scale); };
|
||||
api["setSimulationTimeScale"] = [context, timeManager](const FiniteFloat scale) {
|
||||
context.mLuaManager->addAction([scale, timeManager] { timeManager->setSimulationTimeScale(scale); });
|
||||
};
|
||||
|
||||
|
|
|
@ -8,6 +8,18 @@
|
|||
|
||||
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
|
||||
{
|
||||
float mValue;
|
||||
|
@ -23,8 +35,25 @@ namespace Misc
|
|||
|
||||
namespace sol
|
||||
{
|
||||
using FiniteDouble = Misc::FiniteDouble;
|
||||
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>
|
||||
bool sol_lua_check(
|
||||
sol::types<FiniteFloat>, lua_State* L, int index, Handler&& handler, sol::stack::record& tracking)
|
||||
|
|
Loading…
Reference in a new issue