Fix Potion use action removing the potion even when the action is not executed (Fixes #1521)

deque
scrawl 11 years ago
parent 28feb260eb
commit 8ac019611d

@ -166,13 +166,8 @@ namespace MWClass
MWWorld::LiveCellRef<ESM::Potion> *ref = MWWorld::LiveCellRef<ESM::Potion> *ref =
ptr.get<ESM::Potion>(); ptr.get<ESM::Potion>();
MWWorld::Ptr actor = MWBase::Environment::get().getWorld()->getPlayerPtr();
// remove used potion (assume it is present in inventory)
ptr.getContainerStore()->remove(ptr, 1, actor);
boost::shared_ptr<MWWorld::Action> action ( boost::shared_ptr<MWWorld::Action> action (
new MWWorld::ActionApply (actor, ref->mBase->mId)); new MWWorld::ActionApply (ptr, ref->mBase->mId));
action->setSound ("Drink"); action->setSound ("Drink");

@ -6,30 +6,36 @@
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/world.hpp" #include "../mwbase/world.hpp"
#include "../mwworld/containerstore.hpp"
namespace MWWorld namespace MWWorld
{ {
ActionApply::ActionApply (const Ptr& target, const std::string& id) ActionApply::ActionApply (const Ptr& object, const std::string& id)
: Action (false, target), mId (id) : Action (false, object), mId (id)
{} {}
void ActionApply::executeImp (const Ptr& actor) void ActionApply::executeImp (const Ptr& actor)
{ {
MWBase::Environment::get().getWorld()->breakInvisibility(actor); MWBase::Environment::get().getWorld()->breakInvisibility(actor);
getTarget().getClass().apply (getTarget(), mId, actor); actor.getClass().apply (actor, mId, actor);
actor.getClass().getContainerStore(actor).remove(getTarget(), 1, actor);
} }
ActionApplyWithSkill::ActionApplyWithSkill (const Ptr& target, const std::string& id, ActionApplyWithSkill::ActionApplyWithSkill (const Ptr& object, const std::string& id,
int skillIndex, int usageType) int skillIndex, int usageType)
: Action (false, target), mId (id), mSkillIndex (skillIndex), mUsageType (usageType) : Action (false, object), mId (id), mSkillIndex (skillIndex), mUsageType (usageType)
{} {}
void ActionApplyWithSkill::executeImp (const Ptr& actor) void ActionApplyWithSkill::executeImp (const Ptr& actor)
{ {
MWBase::Environment::get().getWorld()->breakInvisibility(actor); MWBase::Environment::get().getWorld()->breakInvisibility(actor);
if (getTarget().getClass().apply (getTarget(), mId, actor) && mUsageType!=-1) if (actor.getClass().apply (actor, mId, actor) && mUsageType!=-1)
getTarget().getClass().skillUsageSucceeded (actor, mSkillIndex, mUsageType); actor.getClass().skillUsageSucceeded (actor, mSkillIndex, mUsageType);
actor.getClass().getContainerStore(actor).remove(getTarget(), 1, actor);
} }
} }

@ -16,7 +16,7 @@ namespace MWWorld
public: public:
ActionApply (const Ptr& target, const std::string& id); ActionApply (const Ptr& object, const std::string& id);
}; };
class ActionApplyWithSkill : public Action class ActionApplyWithSkill : public Action
@ -29,7 +29,7 @@ namespace MWWorld
public: public:
ActionApplyWithSkill (const Ptr& target, const std::string& id, ActionApplyWithSkill (const Ptr& object, const std::string& id,
int skillIndex, int usageType); int skillIndex, int usageType);
}; };
} }

Loading…
Cancel
Save