From c3c48f21d7f7ff1b7e7c3ae8f770c65955157bf5 Mon Sep 17 00:00:00 2001 From: uramer Date: Thu, 12 May 2022 17:29:12 +0200 Subject: [PATCH 1/4] Consolidate item consumption code --- apps/openmw/mwclass/npc.cpp | 12 +++++++----- apps/openmw/mwclass/npc.hpp | 6 +----- apps/openmw/mwmechanics/aicombataction.cpp | 3 +-- apps/openmw/mwworld/actionapply.cpp | 13 +++---------- apps/openmw/mwworld/actioneat.cpp | 8 +------- apps/openmw/mwworld/class.cpp | 2 +- apps/openmw/mwworld/class.hpp | 9 ++------- 7 files changed, 16 insertions(+), 37 deletions(-) diff --git a/apps/openmw/mwclass/npc.cpp b/apps/openmw/mwclass/npc.cpp index 76e60c7880..d7a74ee7c1 100644 --- a/apps/openmw/mwclass/npc.cpp +++ b/apps/openmw/mwclass/npc.cpp @@ -1100,12 +1100,14 @@ namespace MWClass return getNpcStats(ptr).isWerewolf() ? 0.0f : Actor::getEncumbrance(ptr); } - bool Npc::apply (const MWWorld::Ptr& ptr, const std::string& id, - const MWWorld::Ptr& actor) const + bool Npc::consume(const MWWorld::Ptr& consumable, const MWWorld::Ptr& actor) const { - MWBase::Environment::get().getLuaManager()->appliedToObject(ptr, id, actor); - MWMechanics::CastSpell cast(ptr, ptr); - return cast.cast(id); + MWBase::Environment::get().getWorld()->breakInvisibility(actor); + MWMechanics::CastSpell cast(actor, actor); + std::string recordId = consumable.getCellRef().getRefId(); + MWBase::Environment::get().getLuaManager()->appliedToObject(actor, recordId, actor); + actor.getClass().getContainerStore(actor).remove(consumable, 1, actor); + return cast.cast(recordId); } void Npc::skillUsageSucceeded (const MWWorld::Ptr& ptr, int skill, int usageType, float extraFactor) const diff --git a/apps/openmw/mwclass/npc.hpp b/apps/openmw/mwclass/npc.hpp index ba937a4cfa..d6ae7cbca5 100644 --- a/apps/openmw/mwclass/npc.hpp +++ b/apps/openmw/mwclass/npc.hpp @@ -110,11 +110,7 @@ namespace MWClass float getArmorRating (const MWWorld::Ptr& ptr) const override; ///< @return combined armor rating of this actor - bool apply (const MWWorld::Ptr& ptr, const std::string& id, - const MWWorld::Ptr& actor) const override; - ///< Apply \a id on \a ptr. - /// \param actor Actor that is resposible for the ID being applied to \a ptr. - /// \return Any effect? + bool consume(const MWWorld::Ptr& consumable, const MWWorld::Ptr& actor) const override; void adjustScale (const MWWorld::ConstPtr &ptr, osg::Vec3f &scale, bool rendering) const override; /// @param rendering Indicates if the scale to adjust is for the rendering mesh, or for the collision mesh diff --git a/apps/openmw/mwmechanics/aicombataction.cpp b/apps/openmw/mwmechanics/aicombataction.cpp index 3b3ff1da89..c4d2bf9bec 100644 --- a/apps/openmw/mwmechanics/aicombataction.cpp +++ b/apps/openmw/mwmechanics/aicombataction.cpp @@ -85,8 +85,7 @@ namespace MWMechanics void ActionPotion::prepare(const MWWorld::Ptr &actor) { - actor.getClass().apply(actor, mPotion.getCellRef().getRefId(), actor); - actor.getClass().getContainerStore(actor).remove(mPotion, 1, actor); + actor.getClass().consume(mPotion, actor); } void ActionWeapon::prepare(const MWWorld::Ptr &actor) diff --git a/apps/openmw/mwworld/actionapply.cpp b/apps/openmw/mwworld/actionapply.cpp index e3699a6ac3..1699a6aa53 100644 --- a/apps/openmw/mwworld/actionapply.cpp +++ b/apps/openmw/mwworld/actionapply.cpp @@ -17,11 +17,7 @@ namespace MWWorld void ActionApply::executeImp (const Ptr& actor) { - MWBase::Environment::get().getWorld()->breakInvisibility(actor); - - actor.getClass().apply (actor, mId, actor); - - actor.getClass().getContainerStore(actor).remove(getTarget(), 1, actor); + actor.getClass().consume(getTarget(), actor); } @@ -32,11 +28,8 @@ namespace MWWorld void ActionApplyWithSkill::executeImp (const Ptr& actor) { - MWBase::Environment::get().getWorld()->breakInvisibility(actor); - - if (actor.getClass().apply (actor, mId, actor) && mUsageType!=-1 && actor == MWMechanics::getPlayer()) + bool consumed = actor.getClass().consume(getTarget(), actor); + if (consumed && mUsageType != -1 && actor == MWMechanics::getPlayer()) actor.getClass().skillUsageSucceeded (actor, mSkillIndex, mUsageType); - - actor.getClass().getContainerStore(actor).remove(getTarget(), 1, actor); } } diff --git a/apps/openmw/mwworld/actioneat.cpp b/apps/openmw/mwworld/actioneat.cpp index a1f568383b..c97c83c0c2 100644 --- a/apps/openmw/mwworld/actioneat.cpp +++ b/apps/openmw/mwworld/actioneat.cpp @@ -12,13 +12,7 @@ namespace MWWorld { void ActionEat::executeImp (const Ptr& actor) { - // remove used item (assume the item is present in inventory) - getTarget().getContainerStore()->remove(getTarget(), 1, actor); - - // apply to actor - std::string id = getTarget().getCellRef().getRefId(); - - if (actor.getClass().apply (actor, id, actor) && actor == MWMechanics::getPlayer()) + if (actor.getClass().consume(getTarget(), actor) && actor == MWMechanics::getPlayer()) actor.getClass().skillUsageSucceeded (actor, ESM::Skill::Alchemy, 1); } diff --git a/apps/openmw/mwworld/class.cpp b/apps/openmw/mwworld/class.cpp index f8a9164fa2..f9b5c53ebd 100644 --- a/apps/openmw/mwworld/class.cpp +++ b/apps/openmw/mwworld/class.cpp @@ -40,7 +40,7 @@ namespace MWWorld void Class::insertObjectPhysics(const Ptr& ptr, const std::string& mesh, const osg::Quat& rotation, MWPhysics::PhysicsSystem& physics) const {} - bool Class::apply (const MWWorld::Ptr& ptr, const std::string& id, const MWWorld::Ptr& actor) const + bool Class::consume(const MWWorld::Ptr& consumable, const MWWorld::Ptr& actor) const { return false; } diff --git a/apps/openmw/mwworld/class.hpp b/apps/openmw/mwworld/class.hpp index 8c52021256..dcef942367 100644 --- a/apps/openmw/mwworld/class.hpp +++ b/apps/openmw/mwworld/class.hpp @@ -220,13 +220,8 @@ namespace MWWorld virtual float getNormalizedEncumbrance (const MWWorld::Ptr& ptr) const; ///< Returns encumbrance re-scaled to capacity - virtual bool apply (const MWWorld::Ptr& ptr, const std::string& id, - const MWWorld::Ptr& actor) const; - ///< Apply \a id on \a ptr. - /// \param actor Actor that is resposible for the ID being applied to \a ptr. - /// \return Any effect? - /// - /// (default implementation: ignore and return false) + virtual bool consume(const MWWorld::Ptr& consumable, const MWWorld::Ptr& actor) const; + /// Consume an item, e. g. a potion. virtual void skillUsageSucceeded (const MWWorld::Ptr& ptr, int skill, int usageType, float extraFactor=1.f) const; ///< Inform actor \a ptr that a skill use has succeeded. From 3761e7b24ec235c7afe8bcf1e324c815c5ebd33e Mon Sep 17 00:00:00 2001 From: uramer Date: Thu, 12 May 2022 18:03:50 +0200 Subject: [PATCH 2/4] Pass a 0-count object to onConsume instead of the record id --- apps/openmw/mwbase/luamanager.hpp | 2 +- apps/openmw/mwclass/npc.cpp | 2 +- apps/openmw/mwlua/localscripts.cpp | 2 +- apps/openmw/mwlua/localscripts.hpp | 2 +- apps/openmw/mwlua/luamanagerimp.cpp | 5 +++-- apps/openmw/mwlua/luamanagerimp.hpp | 2 +- docs/source/reference/lua-scripting/engine_handlers.rst | 6 ++++-- 7 files changed, 12 insertions(+), 9 deletions(-) diff --git a/apps/openmw/mwbase/luamanager.hpp b/apps/openmw/mwbase/luamanager.hpp index 6c1ce6a27b..c174dddce3 100644 --- a/apps/openmw/mwbase/luamanager.hpp +++ b/apps/openmw/mwbase/luamanager.hpp @@ -37,7 +37,7 @@ namespace MWBase virtual void deregisterObject(const MWWorld::Ptr& ptr) = 0; virtual void objectAddedToScene(const MWWorld::Ptr& ptr) = 0; virtual void objectRemovedFromScene(const MWWorld::Ptr& ptr) = 0; - virtual void appliedToObject(const MWWorld::Ptr& toPtr, std::string_view recordId, const MWWorld::Ptr& fromPtr) = 0; + virtual void itemConsumed(const MWWorld::Ptr& consumable, const MWWorld::Ptr& actor) = 0; virtual void objectActivated(const MWWorld::Ptr& object, const MWWorld::Ptr& actor) = 0; // TODO: notify LuaManager about other events // virtual void objectOnHit(const MWWorld::Ptr &ptr, float damage, bool ishealth, const MWWorld::Ptr &object, diff --git a/apps/openmw/mwclass/npc.cpp b/apps/openmw/mwclass/npc.cpp index d7a74ee7c1..74de6fb764 100644 --- a/apps/openmw/mwclass/npc.cpp +++ b/apps/openmw/mwclass/npc.cpp @@ -1105,7 +1105,7 @@ namespace MWClass MWBase::Environment::get().getWorld()->breakInvisibility(actor); MWMechanics::CastSpell cast(actor, actor); std::string recordId = consumable.getCellRef().getRefId(); - MWBase::Environment::get().getLuaManager()->appliedToObject(actor, recordId, actor); + MWBase::Environment::get().getLuaManager()->itemConsumed(consumable, actor); actor.getClass().getContainerStore(actor).remove(consumable, 1, actor); return cast.cast(recordId); } diff --git a/apps/openmw/mwlua/localscripts.cpp b/apps/openmw/mwlua/localscripts.cpp index 1224411453..cca31361ff 100644 --- a/apps/openmw/mwlua/localscripts.cpp +++ b/apps/openmw/mwlua/localscripts.cpp @@ -177,7 +177,7 @@ namespace MWLua else { static_assert(std::is_same_v); - callEngineHandlers(mOnConsumeHandlers, arg.mRecordId); + callEngineHandlers(mOnConsumeHandlers, arg.mConsumable); } }, event); } diff --git a/apps/openmw/mwlua/localscripts.hpp b/apps/openmw/mwlua/localscripts.hpp index 58cf421d4a..ff2e2bff25 100644 --- a/apps/openmw/mwlua/localscripts.hpp +++ b/apps/openmw/mwlua/localscripts.hpp @@ -62,7 +62,7 @@ namespace MWLua }; struct OnConsume { - std::string mRecordId; + LObject mConsumable; }; using EngineEvent = std::variant; diff --git a/apps/openmw/mwlua/luamanagerimp.cpp b/apps/openmw/mwlua/luamanagerimp.cpp index b71f5919c3..5854820361 100644 --- a/apps/openmw/mwlua/luamanagerimp.cpp +++ b/apps/openmw/mwlua/luamanagerimp.cpp @@ -374,9 +374,10 @@ namespace MWLua mWorldView.getObjectRegistry()->deregisterPtr(ptr); } - void LuaManager::appliedToObject(const MWWorld::Ptr& toPtr, std::string_view recordId, const MWWorld::Ptr& fromPtr) + void LuaManager::itemConsumed(const MWWorld::Ptr& consumable, const MWWorld::Ptr& actor) { - mLocalEngineEvents.push_back({getId(toPtr), LocalScripts::OnConsume{std::string(recordId)}}); + mWorldView.getObjectRegistry()->registerPtr(consumable); + mLocalEngineEvents.push_back({getId(actor), LocalScripts::OnConsume{LObject(getId(consumable), mWorldView.getObjectRegistry())}}); } void LuaManager::objectActivated(const MWWorld::Ptr& object, const MWWorld::Ptr& actor) diff --git a/apps/openmw/mwlua/luamanagerimp.hpp b/apps/openmw/mwlua/luamanagerimp.hpp index 41eb076783..0e94e37f24 100644 --- a/apps/openmw/mwlua/luamanagerimp.hpp +++ b/apps/openmw/mwlua/luamanagerimp.hpp @@ -51,7 +51,7 @@ namespace MWLua void registerObject(const MWWorld::Ptr& ptr) override; void deregisterObject(const MWWorld::Ptr& ptr) override; void inputEvent(const InputEvent& event) override { mInputEvents.push_back(event); } - void appliedToObject(const MWWorld::Ptr& toPtr, std::string_view recordId, const MWWorld::Ptr& fromPtr) override; + void itemConsumed(const MWWorld::Ptr& consumable, const MWWorld::Ptr& actor) override; void objectActivated(const MWWorld::Ptr& object, const MWWorld::Ptr& actor) override; MWBase::LuaManager::ActorControls* getActorControls(const MWWorld::Ptr&) const override; diff --git a/docs/source/reference/lua-scripting/engine_handlers.rst b/docs/source/reference/lua-scripting/engine_handlers.rst index ca05c9b8e1..a731ceef6f 100644 --- a/docs/source/reference/lua-scripting/engine_handlers.rst +++ b/docs/source/reference/lua-scripting/engine_handlers.rst @@ -66,8 +66,10 @@ Engine handler is a function defined by a script, that can be called by the engi | the item is placed to the actor's inventory, (2) count of | the original item is set to zero, (3) and only then onActivated is | called on the original item, so self.count is already zero. - * - onConsume(recordId) - - Called if `recordId` (e.g. a potion) is consumed. + * - onConsume(item) + - | Called on an actor when they consume an item (e.g. a potion). + | Similarly to onActivated, the item has already been removed + | from the actor's inventory, and the count was set to zero. **Only for local scripts attached to a player** From c1f8d7c20aa0271a9e961deacceac44c8b3f754f Mon Sep 17 00:00:00 2001 From: uramer Date: Sun, 19 Jun 2022 17:31:18 +0200 Subject: [PATCH 3/4] Make comment style consistently inconsistent --- apps/openmw/mwworld/class.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/openmw/mwworld/class.hpp b/apps/openmw/mwworld/class.hpp index dcef942367..8b62d21064 100644 --- a/apps/openmw/mwworld/class.hpp +++ b/apps/openmw/mwworld/class.hpp @@ -221,7 +221,7 @@ namespace MWWorld ///< Returns encumbrance re-scaled to capacity virtual bool consume(const MWWorld::Ptr& consumable, const MWWorld::Ptr& actor) const; - /// Consume an item, e. g. a potion. + ///< Consume an item, e. g. a potion. virtual void skillUsageSucceeded (const MWWorld::Ptr& ptr, int skill, int usageType, float extraFactor=1.f) const; ///< Inform actor \a ptr that a skill use has succeeded. From 36a1e18b6f8890e73687cae8a61c96726769385e Mon Sep 17 00:00:00 2001 From: uramer Date: Sun, 19 Jun 2022 17:31:53 +0200 Subject: [PATCH 4/4] Increment Lua API revision --- apps/openmw/mwlua/luabindings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/openmw/mwlua/luabindings.cpp b/apps/openmw/mwlua/luabindings.cpp index c9bf99462a..e95d415bf5 100644 --- a/apps/openmw/mwlua/luabindings.cpp +++ b/apps/openmw/mwlua/luabindings.cpp @@ -47,7 +47,7 @@ namespace MWLua { auto* lua = context.mLua; sol::table api(lua->sol(), sol::create); - api["API_REVISION"] = 23; + api["API_REVISION"] = 24; api["quit"] = [lua]() { Log(Debug::Warning) << "Quit requested by a Lua script.\n" << lua->debugTraceback();