diff --git a/apps/openmw/mwlua/types/actor.cpp b/apps/openmw/mwlua/types/actor.cpp index 0de5603ecf..2afe3386ce 100644 --- a/apps/openmw/mwlua/types/actor.cpp +++ b/apps/openmw/mwlua/types/actor.cpp @@ -4,9 +4,11 @@ #include #include +#include #include "apps/openmw/mwbase/mechanicsmanager.hpp" #include "apps/openmw/mwbase/windowmanager.hpp" +#include "apps/openmw/mwmechanics/actorutil.hpp" #include "apps/openmw/mwmechanics/creaturestats.hpp" #include "apps/openmw/mwmechanics/drawstate.hpp" #include "apps/openmw/mwworld/class.hpp" @@ -374,6 +376,24 @@ namespace MWLua result["halfExtents"] = agentBounds.mHalfExtents; return result; }; + actor["isInActorsProcessingRange"] = [](const Object& o) { + const MWWorld::Ptr player = MWMechanics::getPlayer(); + const auto& target = o.ptr(); + if (target == player) + return true; + + if (!target.getClass().isActor()) + throw std::runtime_error("Actor expected"); + + if (target.getCell()->getCell()->getWorldSpace() != player.getCell()->getCell()->getWorldSpace()) + return false; + + const int actorsProcessingRange = Settings::game().mActorsProcessingRange; + const osg::Vec3f playerPos = player.getRefData().getPosition().asVec3(); + + const float dist = (playerPos - target.getRefData().getPosition().asVec3()).length(); + return dist <= actorsProcessingRange; + }; actor["getEncumbrance"] = [](const Object& actor) -> float { const MWWorld::Ptr ptr = actor.ptr(); diff --git a/files/lua_api/openmw/types.lua b/files/lua_api/openmw/types.lua index e44673e13a..87cd462b6f 100644 --- a/files/lua_api/openmw/types.lua +++ b/files/lua_api/openmw/types.lua @@ -21,6 +21,12 @@ -- @param openmw.core#GameObject actor -- @return #table with `shapeType` and `halfExtents` +--- +-- Check if given actor is in the actors processing range. +-- @function [parent=#Actor] isInActorsProcessingRange +-- @param openmw.core#GameObject actor +-- @return #boolean + --- -- Whether the object is an actor. -- @function [parent=#Actor] objectIsInstance