From e1249f6a31087e6a127b5d8d3dd3218d87ee1b58 Mon Sep 17 00:00:00 2001 From: mrcheko Date: Sun, 18 May 2014 20:13:46 +0400 Subject: [PATCH] actor handle and id confusing fix --- apps/openmw/mwmechanics/aisequence.cpp | 11 +++-------- apps/openmw/mwmechanics/aisequence.hpp | 2 +- apps/openmw/mwmechanics/creaturestats.cpp | 6 ++---- apps/openmw/mwscript/aiextensions.cpp | 5 +++-- 4 files changed, 9 insertions(+), 15 deletions(-) diff --git a/apps/openmw/mwmechanics/aisequence.cpp b/apps/openmw/mwmechanics/aisequence.cpp index f0f6bffc16..9dc2380f85 100644 --- a/apps/openmw/mwmechanics/aisequence.cpp +++ b/apps/openmw/mwmechanics/aisequence.cpp @@ -59,14 +59,13 @@ int AiSequence::getTypeId() const return mPackages.front()->getTypeId(); } -bool AiSequence::getCombatTarget(std::string &targetActorId) const +bool AiSequence::getCombatTarget(MWWorld::Ptr &targetActor) const { if (getTypeId() != AiPackage::TypeIdCombat) return false; const AiCombat *combat = static_cast(mPackages.front()); - MWWorld::Ptr target = combat->getTarget(); - targetActorId = target.getClass().getCreatureStats(target).getActorId(); + targetActor = combat->getTarget(); return true; } @@ -138,15 +137,11 @@ void AiSequence::execute (const MWWorld::Ptr& actor,float duration) float nearestDist = std::numeric_limits::max(); Ogre::Vector3 vActorPos = Ogre::Vector3(actor.getRefData().getPosition().pos); - const AiCombat *package; - for(std::list::iterator it = mPackages.begin(); it != mPackages.end(); ++it) { - package = static_cast(*it); - if ((*it)->getTypeId() != AiPackage::TypeIdCombat) break; - ESM::Position &targetPos = package->getTarget().getRefData().getPosition(); + ESM::Position &targetPos = static_cast(*it)->getTarget().getRefData().getPosition(); float distTo = (Ogre::Vector3(targetPos.pos) - vActorPos).length(); if (distTo < nearestDist) diff --git a/apps/openmw/mwmechanics/aisequence.hpp b/apps/openmw/mwmechanics/aisequence.hpp index 7e977cf581..41a280da80 100644 --- a/apps/openmw/mwmechanics/aisequence.hpp +++ b/apps/openmw/mwmechanics/aisequence.hpp @@ -53,7 +53,7 @@ namespace MWMechanics int getLastRunTypeId() const { return mLastAiPackage; } /// Return true and assign target if combat package is currently active, return false otherwise - bool getCombatTarget (std::string &targetActorId) const; + bool getCombatTarget (MWWorld::Ptr &targetActor) const; bool canAddTarget(const ESM::Position& actorPos, float distToTarget) const; ///< Function assumes that actor can have only 1 target apart player diff --git a/apps/openmw/mwmechanics/creaturestats.cpp b/apps/openmw/mwmechanics/creaturestats.cpp index 57618e6e93..d8dfa158db 100644 --- a/apps/openmw/mwmechanics/creaturestats.cpp +++ b/apps/openmw/mwmechanics/creaturestats.cpp @@ -322,11 +322,9 @@ namespace MWMechanics bool CreatureStats::getCreatureTargetted() const { - std::string target; - if (mAiSequence.getCombatTarget(target)) + MWWorld::Ptr targetPtr; + if (mAiSequence.getCombatTarget(targetPtr)) { - MWWorld::Ptr targetPtr; - targetPtr = MWBase::Environment::get().getWorld()->getPtr(target, true); return targetPtr.getTypeName() == typeid(ESM::Creature).name(); } return false; diff --git a/apps/openmw/mwscript/aiextensions.cpp b/apps/openmw/mwscript/aiextensions.cpp index 8ed19925ec..695954bc20 100644 --- a/apps/openmw/mwscript/aiextensions.cpp +++ b/apps/openmw/mwscript/aiextensions.cpp @@ -419,9 +419,10 @@ namespace MWScript std::string currentTargetId; bool targetsAreEqual = false; - if (creatureStats.getAiSequence().getCombatTarget (currentTargetId)) + MWWorld::Ptr targetPtr; + if (creatureStats.getAiSequence().getCombatTarget (targetPtr)) { - if (currentTargetId == testedTargetId) + if (targetPtr.getRefData().getHandle() == testedTargetId) targetsAreEqual = true; } runtime.push(int(targetsAreEqual));