1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-02-10 12:39:53 +00:00

Consolidate item consumption code

This commit is contained in:
uramer 2022-05-12 17:29:12 +02:00
parent fad49a1bd8
commit c3c48f21d7
7 changed files with 16 additions and 37 deletions

View File

@ -1100,12 +1100,14 @@ namespace MWClass
return getNpcStats(ptr).isWerewolf() ? 0.0f : Actor::getEncumbrance(ptr); return getNpcStats(ptr).isWerewolf() ? 0.0f : Actor::getEncumbrance(ptr);
} }
bool Npc::apply (const MWWorld::Ptr& ptr, const std::string& id, bool Npc::consume(const MWWorld::Ptr& consumable, const MWWorld::Ptr& actor) const
const MWWorld::Ptr& actor) const
{ {
MWBase::Environment::get().getLuaManager()->appliedToObject(ptr, id, actor); MWBase::Environment::get().getWorld()->breakInvisibility(actor);
MWMechanics::CastSpell cast(ptr, ptr); MWMechanics::CastSpell cast(actor, actor);
return cast.cast(id); 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 void Npc::skillUsageSucceeded (const MWWorld::Ptr& ptr, int skill, int usageType, float extraFactor) const

View File

@ -110,11 +110,7 @@ namespace MWClass
float getArmorRating (const MWWorld::Ptr& ptr) const override; float getArmorRating (const MWWorld::Ptr& ptr) const override;
///< @return combined armor rating of this actor ///< @return combined armor rating of this actor
bool apply (const MWWorld::Ptr& ptr, const std::string& id, bool consume(const MWWorld::Ptr& consumable, const MWWorld::Ptr& actor) const override;
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?
void adjustScale (const MWWorld::ConstPtr &ptr, osg::Vec3f &scale, bool rendering) 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 /// @param rendering Indicates if the scale to adjust is for the rendering mesh, or for the collision mesh

View File

@ -85,8 +85,7 @@ namespace MWMechanics
void ActionPotion::prepare(const MWWorld::Ptr &actor) void ActionPotion::prepare(const MWWorld::Ptr &actor)
{ {
actor.getClass().apply(actor, mPotion.getCellRef().getRefId(), actor); actor.getClass().consume(mPotion, actor);
actor.getClass().getContainerStore(actor).remove(mPotion, 1, actor);
} }
void ActionWeapon::prepare(const MWWorld::Ptr &actor) void ActionWeapon::prepare(const MWWorld::Ptr &actor)

View File

@ -17,11 +17,7 @@ namespace MWWorld
void ActionApply::executeImp (const Ptr& actor) void ActionApply::executeImp (const Ptr& actor)
{ {
MWBase::Environment::get().getWorld()->breakInvisibility(actor); actor.getClass().consume(getTarget(), actor);
actor.getClass().apply (actor, mId, actor);
actor.getClass().getContainerStore(actor).remove(getTarget(), 1, actor);
} }
@ -32,11 +28,8 @@ namespace MWWorld
void ActionApplyWithSkill::executeImp (const Ptr& actor) void ActionApplyWithSkill::executeImp (const Ptr& actor)
{ {
MWBase::Environment::get().getWorld()->breakInvisibility(actor); bool consumed = actor.getClass().consume(getTarget(), actor);
if (consumed && mUsageType != -1 && actor == MWMechanics::getPlayer())
if (actor.getClass().apply (actor, mId, actor) && mUsageType!=-1 && actor == MWMechanics::getPlayer())
actor.getClass().skillUsageSucceeded (actor, mSkillIndex, mUsageType); actor.getClass().skillUsageSucceeded (actor, mSkillIndex, mUsageType);
actor.getClass().getContainerStore(actor).remove(getTarget(), 1, actor);
} }
} }

View File

@ -12,13 +12,7 @@ namespace MWWorld
{ {
void ActionEat::executeImp (const Ptr& actor) void ActionEat::executeImp (const Ptr& actor)
{ {
// remove used item (assume the item is present in inventory) if (actor.getClass().consume(getTarget(), actor) && actor == MWMechanics::getPlayer())
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())
actor.getClass().skillUsageSucceeded (actor, ESM::Skill::Alchemy, 1); actor.getClass().skillUsageSucceeded (actor, ESM::Skill::Alchemy, 1);
} }

View File

@ -40,7 +40,7 @@ namespace MWWorld
void Class::insertObjectPhysics(const Ptr& ptr, const std::string& mesh, const osg::Quat& rotation, MWPhysics::PhysicsSystem& physics) const 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; return false;
} }

View File

@ -220,13 +220,8 @@ namespace MWWorld
virtual float getNormalizedEncumbrance (const MWWorld::Ptr& ptr) const; virtual float getNormalizedEncumbrance (const MWWorld::Ptr& ptr) const;
///< Returns encumbrance re-scaled to capacity ///< Returns encumbrance re-scaled to capacity
virtual bool apply (const MWWorld::Ptr& ptr, const std::string& id, virtual bool consume(const MWWorld::Ptr& consumable, const MWWorld::Ptr& actor) const;
const MWWorld::Ptr& actor) const; /// Consume an item, e. g. a potion.
///< 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 void skillUsageSucceeded (const MWWorld::Ptr& ptr, int skill, int usageType, float extraFactor=1.f) const; 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. ///< Inform actor \a ptr that a skill use has succeeded.