From c5871a5a7a5a8bffd1f59e2c8082674d5bc393df Mon Sep 17 00:00:00 2001 From: Petr Mikheev Date: Sat, 22 Jul 2023 16:57:39 +0200 Subject: [PATCH 1/2] Allow to handle activation in Lua even for mwscripted objects --- apps/openmw/mwlua/luabindings.cpp | 2 ++ apps/openmw/mwworld/worldimp.cpp | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwlua/luabindings.cpp b/apps/openmw/mwlua/luabindings.cpp index e922eb7db5..efb64244e8 100644 --- a/apps/openmw/mwlua/luabindings.cpp +++ b/apps/openmw/mwlua/luabindings.cpp @@ -274,6 +274,8 @@ namespace MWLua }); api["_runStandardActivationAction"] = [context](const GObject& object, const GObject& actor) { + if (!object.ptr().getRefData().activate()) + return; context.mLuaManager->addAction( [object, actor] { const MWWorld::Ptr& objPtr = object.ptr(); diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index 4c090b2701..033c6d5afc 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -3707,8 +3707,7 @@ namespace MWWorld void World::activate(const Ptr& object, const Ptr& actor) { breakInvisibility(actor); - if (object.getRefData().activate()) - MWBase::Environment::get().getLuaManager()->objectActivated(object, actor); + MWBase::Environment::get().getLuaManager()->objectActivated(object, actor); } struct ResetActorsVisitor From 2c212b18e4a5bacd8f32c4d80584991d28181f8e Mon Sep 17 00:00:00 2001 From: Petr Mikheev Date: Sat, 22 Jul 2023 17:22:43 +0200 Subject: [PATCH 2/2] Remove World::activate since all activation now goes trough LuaManager --- apps/openmw/mwbase/world.hpp | 2 -- apps/openmw/mwmechanics/aiactivate.cpp | 3 ++- apps/openmw/mwmechanics/aipackage.cpp | 12 +++++------- apps/openmw/mwworld/player.cpp | 3 ++- apps/openmw/mwworld/worldimp.cpp | 6 ------ apps/openmw/mwworld/worldimp.hpp | 2 -- files/data/scripts/omw/activationhandlers.lua | 1 + 7 files changed, 10 insertions(+), 19 deletions(-) diff --git a/apps/openmw/mwbase/world.hpp b/apps/openmw/mwbase/world.hpp index 1194402b91..a57bb70134 100644 --- a/apps/openmw/mwbase/world.hpp +++ b/apps/openmw/mwbase/world.hpp @@ -540,8 +540,6 @@ namespace MWBase const osg::Vec3f& worldPos, float scale = 1.f, bool isMagicVFX = true) = 0; - virtual void activate(const MWWorld::Ptr& object, const MWWorld::Ptr& actor) = 0; - /// @see MWWorld::WeatherManager::isInStorm virtual bool isInStorm() const = 0; diff --git a/apps/openmw/mwmechanics/aiactivate.cpp b/apps/openmw/mwmechanics/aiactivate.cpp index 5c47813d6d..31abda44c2 100644 --- a/apps/openmw/mwmechanics/aiactivate.cpp +++ b/apps/openmw/mwmechanics/aiactivate.cpp @@ -3,6 +3,7 @@ #include #include "../mwbase/environment.hpp" +#include "../mwbase/luamanager.hpp" #include "../mwbase/world.hpp" #include "../mwworld/class.hpp" @@ -44,7 +45,7 @@ namespace MWMechanics { // Note: we intentionally do not cancel package after activation here for backward compatibility with // original engine. - MWBase::Environment::get().getWorld()->activate(target, actor); + MWBase::Environment::get().getLuaManager()->objectActivated(target, actor); } return false; } diff --git a/apps/openmw/mwmechanics/aipackage.cpp b/apps/openmw/mwmechanics/aipackage.cpp index f1c5d62a36..e51ff35012 100644 --- a/apps/openmw/mwmechanics/aipackage.cpp +++ b/apps/openmw/mwmechanics/aipackage.cpp @@ -8,6 +8,7 @@ #include #include "../mwbase/environment.hpp" +#include "../mwbase/luamanager.hpp" #include "../mwbase/world.hpp" #include "../mwworld/cellstore.hpp" @@ -265,8 +266,7 @@ void MWMechanics::AiPackage::evadeObstacles(const MWWorld::Ptr& actor) return; // first check if obstacle is a door - static float distance = MWBase::Environment::get().getWorld()->getMaxActivationDistance(); - + float distance = MWBase::Environment::get().getWorld()->getMaxActivationDistance(); const MWWorld::Ptr door = getNearbyDoor(actor, distance); if (!door.isEmpty() && canOpenDoors(actor)) { @@ -300,9 +300,7 @@ void MWMechanics::AiPackage::openDoors(const MWWorld::Ptr& actor) if (mPathFinder.getPathSize() == 0) return; - MWBase::World* world = MWBase::Environment::get().getWorld(); - static float distance = world->getMaxActivationDistance(); - + float distance = MWBase::Environment::get().getWorld()->getMaxActivationDistance(); const MWWorld::Ptr door = getNearbyDoor(actor, distance); if (door == MWWorld::Ptr()) return; @@ -314,7 +312,7 @@ void MWMechanics::AiPackage::openDoors(const MWWorld::Ptr& actor) if (door.getCellRef().getTrap().empty() && !door.getCellRef().isLocked()) { - world->activate(door, actor); + MWBase::Environment::get().getLuaManager()->objectActivated(door, actor); return; } @@ -326,7 +324,7 @@ void MWMechanics::AiPackage::openDoors(const MWWorld::Ptr& actor) MWWorld::Ptr keyPtr = invStore.search(keyId); if (!keyPtr.isEmpty()) - world->activate(door, actor); + MWBase::Environment::get().getLuaManager()->objectActivated(door, actor); } } diff --git a/apps/openmw/mwworld/player.cpp b/apps/openmw/mwworld/player.cpp index ad0cc92ad8..5fc020eab4 100644 --- a/apps/openmw/mwworld/player.cpp +++ b/apps/openmw/mwworld/player.cpp @@ -18,6 +18,7 @@ #include "../mwworld/worldmodel.hpp" #include "../mwbase/environment.hpp" +#include "../mwbase/luamanager.hpp" #include "../mwbase/mechanicsmanager.hpp" #include "../mwbase/windowmanager.hpp" #include "../mwbase/world.hpp" @@ -194,7 +195,7 @@ namespace MWWorld if (!toActivate.getClass().hasToolTip(toActivate)) return; - MWBase::Environment::get().getWorld()->activate(toActivate, player); + MWBase::Environment::get().getLuaManager()->objectActivated(toActivate, player); } bool Player::wasTeleported() const diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index 033c6d5afc..f4212c220a 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -3704,12 +3704,6 @@ namespace MWWorld mRendering->spawnEffect(model, textureOverride, worldPos, scale, isMagicVFX); } - void World::activate(const Ptr& object, const Ptr& actor) - { - breakInvisibility(actor); - MWBase::Environment::get().getLuaManager()->objectActivated(object, actor); - } - struct ResetActorsVisitor { World& mWorld; diff --git a/apps/openmw/mwworld/worldimp.hpp b/apps/openmw/mwworld/worldimp.hpp index 30d3102cc2..d2af6f294f 100644 --- a/apps/openmw/mwworld/worldimp.hpp +++ b/apps/openmw/mwworld/worldimp.hpp @@ -620,8 +620,6 @@ namespace MWWorld void spawnEffect(const std::string& model, const std::string& textureOverride, const osg::Vec3f& worldPos, float scale = 1.f, bool isMagicVFX = true) override; - void activate(const MWWorld::Ptr& object, const MWWorld::Ptr& actor) override; - /// @see MWWorld::WeatherManager::isInStorm bool isInStorm() const override; diff --git a/files/data/scripts/omw/activationhandlers.lua b/files/data/scripts/omw/activationhandlers.lua index 7bc7ee04e1..ea69777582 100644 --- a/files/data/scripts/omw/activationhandlers.lua +++ b/files/data/scripts/omw/activationhandlers.lua @@ -23,6 +23,7 @@ local handlersPerType = {} handlersPerType[types.ESM4Door] = { ESM4DoorActivation } local function onActivate(obj, actor) + types.Actor.activeEffects(actor):remove('invisibility') local handlers = handlersPerObject[obj.id] if handlers then for i = #handlers, 1, -1 do