From ea21d8fec327bf448ef06e2eb1680e5d4c81ed18 Mon Sep 17 00:00:00 2001 From: scrawl Date: Wed, 22 Jan 2014 13:30:45 +0100 Subject: [PATCH] Fix CreatureTargetted function --- apps/openmw/mwdialogue/filter.cpp | 2 +- apps/openmw/mwmechanics/aicombat.cpp | 4 ++-- apps/openmw/mwmechanics/aicombat.hpp | 2 +- apps/openmw/mwmechanics/aisequence.cpp | 7 +++---- apps/openmw/mwmechanics/aisequence.hpp | 5 ++--- apps/openmw/mwmechanics/creaturestats.cpp | 4 +++- apps/openmw/mwscript/aiextensions.cpp | 12 +++--------- 7 files changed, 15 insertions(+), 21 deletions(-) diff --git a/apps/openmw/mwdialogue/filter.cpp b/apps/openmw/mwdialogue/filter.cpp index bd64dcf9c1..731fafbf66 100644 --- a/apps/openmw/mwdialogue/filter.cpp +++ b/apps/openmw/mwdialogue/filter.cpp @@ -536,7 +536,7 @@ bool MWDialogue::Filter::getSelectStructBoolean (const SelectWrapper& select) co case SelectWrapper::Function_CreatureTargetted: - return MWWorld::Class::get (mActor).getCreatureStats (mActor).getCreatureTargetted(); + return mActor.getClass().getCreatureStats (mActor).getCreatureTargetted(); case SelectWrapper::Function_Werewolf: diff --git a/apps/openmw/mwmechanics/aicombat.cpp b/apps/openmw/mwmechanics/aicombat.cpp index c01c4096bf..283c7f0426 100644 --- a/apps/openmw/mwmechanics/aicombat.cpp +++ b/apps/openmw/mwmechanics/aicombat.cpp @@ -360,9 +360,9 @@ namespace MWMechanics return 1; } - const std::string &AiCombat::getTargetId() const + MWWorld::Ptr AiCombat::getTarget() const { - return mTarget.getRefData().getHandle(); + return mTarget; } AiCombat *MWMechanics::AiCombat::clone() const diff --git a/apps/openmw/mwmechanics/aicombat.hpp b/apps/openmw/mwmechanics/aicombat.hpp index 27f7f5d95c..a24183c65e 100644 --- a/apps/openmw/mwmechanics/aicombat.hpp +++ b/apps/openmw/mwmechanics/aicombat.hpp @@ -25,7 +25,7 @@ namespace MWMechanics virtual unsigned int getPriority() const; - const std::string &getTargetId() const; + MWWorld::Ptr getTarget() const; private: PathFinder mPathFinder; diff --git a/apps/openmw/mwmechanics/aisequence.cpp b/apps/openmw/mwmechanics/aisequence.cpp index 73caa6ca76..3902b91866 100644 --- a/apps/openmw/mwmechanics/aisequence.cpp +++ b/apps/openmw/mwmechanics/aisequence.cpp @@ -55,13 +55,12 @@ int MWMechanics::AiSequence::getTypeId() const return mPackages.front()->getTypeId(); } -bool MWMechanics::AiSequence::getCombatTarget(std::string &targetActorId) const +MWWorld::Ptr MWMechanics::AiSequence::getCombatTarget() const { if (getTypeId() != AiPackage::TypeIdCombat) - return false; + return MWWorld::Ptr(); const AiCombat *combat = static_cast(mPackages.front()); - targetActorId = combat->getTargetId(); - return true; + return combat->getTarget(); } void MWMechanics::AiSequence::stopCombat() diff --git a/apps/openmw/mwmechanics/aisequence.hpp b/apps/openmw/mwmechanics/aisequence.hpp index d65c316160..075c43ff71 100644 --- a/apps/openmw/mwmechanics/aisequence.hpp +++ b/apps/openmw/mwmechanics/aisequence.hpp @@ -36,9 +36,8 @@ namespace MWMechanics int getTypeId() const; ///< @see enum AiPackage::TypeId - bool getCombatTarget (std::string &targetActorId) const; - ///< Return true and assign target if combat package is currently - /// active, return false otherwise + MWWorld::Ptr getCombatTarget () const; + ///< Return the combat target if a combat package is active, or an empty Ptr otherwise void stopCombat(); ///< Removes all combat packages until first non-combat or stack empty. diff --git a/apps/openmw/mwmechanics/creaturestats.cpp b/apps/openmw/mwmechanics/creaturestats.cpp index 8f84a79797..ec300f6f0e 100644 --- a/apps/openmw/mwmechanics/creaturestats.cpp +++ b/apps/openmw/mwmechanics/creaturestats.cpp @@ -348,7 +348,9 @@ namespace MWMechanics bool CreatureStats::getCreatureTargetted() const { - return false; + if (mAiSequence.getCombatTarget().isEmpty()) + return false; + return mAiSequence.getCombatTarget().getTypeName() == typeid(ESM::Creature).name(); } float CreatureStats::getEvasion() const diff --git a/apps/openmw/mwscript/aiextensions.cpp b/apps/openmw/mwscript/aiextensions.cpp index 759d0ba942..75c6351033 100644 --- a/apps/openmw/mwscript/aiextensions.cpp +++ b/apps/openmw/mwscript/aiextensions.cpp @@ -412,16 +412,10 @@ namespace MWScript std::string testedTargetId = runtime.getStringLiteral (runtime[0].mInteger); runtime.pop(); - const MWMechanics::CreatureStats& creatureStats = MWWorld::Class::get(actor).getCreatureStats(actor); - std::string currentTargetId; + const MWMechanics::CreatureStats& creatureStats = actor.getClass().getCreatureStats(actor); - bool targetsAreEqual = false; - if (creatureStats.getAiSequence().getCombatTarget (currentTargetId)) - { - if (currentTargetId == testedTargetId) - targetsAreEqual = true; - } - runtime.push(int(targetsAreEqual)); + MWWorld::Ptr target = creatureStats.getAiSequence().getCombatTarget(); + runtime.push(Misc::StringUtils::ciEqual(target.getCellRef().mRefID, testedTargetId)); } };