1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-02-07 02:15:33 +00:00

Merge branch 'fix_use' into 'master'

Fix regression added in  !3354: Set `force` to false when applying UseItem from inventory.

See merge request OpenMW/openmw!3422
This commit is contained in:
psi29a 2023-09-15 07:03:34 +00:00
commit ed022a6c14
9 changed files with 24 additions and 19 deletions

View file

@ -51,7 +51,7 @@ namespace MWBase
virtual void objectTeleported(const MWWorld::Ptr& ptr) = 0; virtual void objectTeleported(const MWWorld::Ptr& ptr) = 0;
virtual void itemConsumed(const MWWorld::Ptr& consumable, const MWWorld::Ptr& actor) = 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; virtual void objectActivated(const MWWorld::Ptr& object, const MWWorld::Ptr& actor) = 0;
virtual void useItem(const MWWorld::Ptr& object, const MWWorld::Ptr& actor) = 0; virtual void useItem(const MWWorld::Ptr& object, const MWWorld::Ptr& actor, bool force) = 0;
virtual void exteriorCreated(MWWorld::CellStore& cell) = 0; virtual void exteriorCreated(MWWorld::CellStore& cell) = 0;
virtual void questUpdated(const ESM::RefId& questId, int stage) = 0; virtual void questUpdated(const ESM::RefId& questId, int stage) = 0;

View file

@ -601,7 +601,7 @@ namespace MWGui
} }
} }
else else
MWBase::Environment::get().getLuaManager()->useItem(ptr, MWMechanics::getPlayer()); MWBase::Environment::get().getLuaManager()->useItem(ptr, MWMechanics::getPlayer(), false);
// If item is ingredient or potion don't stop drag and drop to simplify action of taking more than one 1 // If item is ingredient or potion don't stop drag and drop to simplify action of taking more than one 1
// item // item

View file

@ -71,7 +71,7 @@ namespace MWLua
MWWorld::Ptr actor = getPtr(event.mActor); MWWorld::Ptr actor = getPtr(event.mActor);
if (actor.isEmpty() || obj.isEmpty()) if (actor.isEmpty() || obj.isEmpty())
return; return;
mGlobalScripts.onUseItem(GObject(obj), GObject(actor)); mGlobalScripts.onUseItem(GObject(obj), GObject(actor), event.mForce);
} }
void operator()(const OnConsume& event) const void operator()(const OnConsume& event) const

View file

@ -40,6 +40,7 @@ namespace MWLua
{ {
ESM::RefNum mActor; ESM::RefNum mActor;
ESM::RefNum mObject; ESM::RefNum mObject;
bool mForce;
}; };
struct OnConsume struct OnConsume
{ {

View file

@ -40,7 +40,10 @@ namespace MWLua
{ {
callEngineHandlers(mOnActivateHandlers, obj, actor); callEngineHandlers(mOnActivateHandlers, obj, actor);
} }
void onUseItem(const GObject& obj, const GObject& actor) { callEngineHandlers(mOnUseItemHandlers, obj, actor); } void onUseItem(const GObject& obj, const GObject& actor, bool force)
{
callEngineHandlers(mOnUseItemHandlers, obj, actor, force);
}
void onNewExterior(const GCell& cell) { callEngineHandlers(mOnNewExteriorHandlers, cell); } void onNewExterior(const GCell& cell) { callEngineHandlers(mOnNewExteriorHandlers, cell); }
private: private:

View file

@ -330,16 +330,16 @@ namespace MWLua
}, },
"_runStandardActivationAction"); "_runStandardActivationAction");
}; };
api["_runStandardUseAction"] = [context](const GObject& object, const GObject& actor) { api["_runStandardUseAction"] = [context](const GObject& object, const GObject& actor, bool force) {
context.mLuaManager->addAction( context.mLuaManager->addAction(
[object, actor] { [object, actor, force] {
const MWWorld::Ptr& actorPtr = actor.ptr(); const MWWorld::Ptr& actorPtr = actor.ptr();
const MWWorld::Ptr& objectPtr = object.ptr(); const MWWorld::Ptr& objectPtr = object.ptr();
if (actorPtr == MWBase::Environment::get().getWorld()->getPlayerPtr()) if (actorPtr == MWBase::Environment::get().getWorld()->getPlayerPtr())
MWBase::Environment::get().getWindowManager()->useItem(objectPtr, true); MWBase::Environment::get().getWindowManager()->useItem(objectPtr, force);
else else
{ {
std::unique_ptr<MWWorld::Action> action = objectPtr.getClass().use(objectPtr, true); std::unique_ptr<MWWorld::Action> action = objectPtr.getClass().use(objectPtr, force);
action->execute(actorPtr, true); action->execute(actorPtr, true);
} }
}, },

View file

@ -77,9 +77,9 @@ namespace MWLua
{ {
mEngineEvents.addToQueue(EngineEvents::OnActivate{ getId(actor), getId(object) }); mEngineEvents.addToQueue(EngineEvents::OnActivate{ getId(actor), getId(object) });
} }
void useItem(const MWWorld::Ptr& object, const MWWorld::Ptr& actor) override void useItem(const MWWorld::Ptr& object, const MWWorld::Ptr& actor, bool force) override
{ {
mEngineEvents.addToQueue(EngineEvents::OnUseItem{ getId(actor), getId(object) }); mEngineEvents.addToQueue(EngineEvents::OnUseItem{ getId(actor), getId(object), force });
} }
void exteriorCreated(MWWorld::CellStore& cell) override void exteriorCreated(MWWorld::CellStore& cell) override
{ {

View file

@ -20,14 +20,14 @@ Examples:
**UseItem** **UseItem**
Any script can send global event ``UseItem`` with arguments ``object`` and ``actor``. Any script can send global event ``UseItem`` with arguments ``object``, ``actor``, and optional boolean ``force``.
The actor will use (e.g. equip or consume) the object. The object should be in the actor's inventory. The actor will use (e.g. equip or consume) the object. The object should be in the actor's inventory.
Example: Example:
.. code-block:: Lua .. code-block:: Lua
core.sendGlobalEvent('UseItem', {object = potion, actor = player}) core.sendGlobalEvent('UseItem', {object = potion, actor = player, force = true})
UI events UI events
--------- ---------

View file

@ -4,11 +4,12 @@ local world = require('openmw.world')
local handlersPerObject = {} local handlersPerObject = {}
local handlersPerType = {} local handlersPerType = {}
local function useItem(obj, actor) local function useItem(obj, actor, force)
local options = { force = force or false }
local handlers = handlersPerObject[obj.id] local handlers = handlersPerObject[obj.id]
if handlers then if handlers then
for i = #handlers, 1, -1 do for i = #handlers, 1, -1 do
if handlers[i](obj, actor) == false then if handlers[i](obj, actor, options) == false then
return -- skip other handlers return -- skip other handlers
end end
end end
@ -16,12 +17,12 @@ local function useItem(obj, actor)
handlers = handlersPerType[obj.type] handlers = handlersPerType[obj.type]
if handlers then if handlers then
for i = #handlers, 1, -1 do for i = #handlers, 1, -1 do
if handlers[i](obj, actor) == false then if handlers[i](obj, actor, options) == false then
return -- skip other handlers return -- skip other handlers
end end
end end
end end
world._runStandardUseAction(obj, actor) world._runStandardUseAction(obj, actor, force)
end end
return { return {
@ -53,7 +54,7 @@ return {
version = 0, version = 0,
--- Add new use action handler for a specific object. --- Add new use action handler for a specific object.
-- If `handler(object, actor)` returns false, other handlers for -- If `handler(object, actor, options)` returns false, other handlers for
-- the same object (including type handlers) will be skipped. -- the same object (including type handlers) will be skipped.
-- @function [parent=#ItemUsage] addHandlerForObject -- @function [parent=#ItemUsage] addHandlerForObject
-- @param openmw.core#GameObject obj The object. -- @param openmw.core#GameObject obj The object.
@ -68,7 +69,7 @@ return {
end, end,
--- Add new use action handler for a type of objects. --- Add new use action handler for a type of objects.
-- If `handler(object, actor)` returns false, other handlers for -- If `handler(object, actor, options)` returns false, other handlers for
-- the same object (including type handlers) will be skipped. -- the same object (including type handlers) will be skipped.
-- @function [parent=#ItemUsage] addHandlerForType -- @function [parent=#ItemUsage] addHandlerForType
-- @param #any type A type from the `openmw.types` package. -- @param #any type A type from the `openmw.types` package.
@ -91,7 +92,7 @@ return {
if not data.actor or not types.Actor.objectIsInstance(data.actor) then if not data.actor or not types.Actor.objectIsInstance(data.actor) then
error('UseItem: invalid argument "actor"') error('UseItem: invalid argument "actor"')
end end
useItem(data.object, data.actor) useItem(data.object, data.actor, data.force)
end end
} }
} }