diff --git a/apps/openmw/mwmechanics/aicombat.cpp b/apps/openmw/mwmechanics/aicombat.cpp index 298a3024e..68bcae695 100644 --- a/apps/openmw/mwmechanics/aicombat.cpp +++ b/apps/openmw/mwmechanics/aicombat.cpp @@ -229,8 +229,7 @@ namespace MWMechanics osg::Vec3f vAimDir = MWBase::Environment::get().getWorld()->aimToTarget(actor, target); float distToTarget = MWBase::Environment::get().getWorld()->getHitDistance(actor, target); - bool isPotion = (dynamic_cast(currentAction.get()) != NULL); - storage.mReadyToAttack = (!isPotion && distToTarget <= rangeAttack); + storage.mReadyToAttack = (currentAction->isAttackingOrSpell() && distToTarget <= rangeAttack); // can't fight if attacker can't go where target is. E.g. A fish can't attack person on land. if (distToTarget > rangeAttack diff --git a/apps/openmw/mwmechanics/aicombataction.hpp b/apps/openmw/mwmechanics/aicombataction.hpp index c280d3c11..b36413587 100644 --- a/apps/openmw/mwmechanics/aicombataction.hpp +++ b/apps/openmw/mwmechanics/aicombataction.hpp @@ -19,6 +19,7 @@ namespace MWMechanics virtual float getCombatRange (bool& isRanged) const = 0; virtual float getActionCooldown() { return 0.f; } virtual const ESM::Weapon* getWeapon() const { return NULL; }; + virtual bool isAttackingOrSpell() const { return true; } }; class ActionSpell : public Action @@ -53,6 +54,7 @@ namespace MWMechanics /// Drinks the given potion. virtual void prepare(const MWWorld::Ptr& actor); virtual float getCombatRange (bool& isRanged) const; + virtual bool isAttackingOrSpell() const { return false; } /// Since this action has no animation, apply a small cool down for using it virtual float getActionCooldown() { return 1.f; }