diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartAI.cpp | 4 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 18 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.h | 6 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.h | 14 |
4 files changed, 26 insertions, 16 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index a99fb660383..5c2c48bdf6d 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -236,7 +236,7 @@ void SmartAI::EndPath(bool fail) else GetScript()->SetPathId(0); - ObjectVector const* targets = GetScript()->GetStoredTargetVector(SMART_ESCORT_TARGETS); + ObjectVector const* targets = GetScript()->GetStoredTargetVector(SMART_ESCORT_TARGETS, *me); if (targets && mEscortQuestID) { if (targets->size() == 1 && GetScript()->IsPlayer((*targets->begin()))) @@ -410,7 +410,7 @@ void SmartAI::UpdateAI(uint32 diff) bool SmartAI::IsEscortInvokerInRange() { - if (ObjectVector const* targets = GetScript()->GetStoredTargetVector(SMART_ESCORT_TARGETS)) + if (ObjectVector const* targets = GetScript()->GetStoredTargetVector(SMART_ESCORT_TARGETS, *me)) { float checkDist = me->GetInstanceScript() ? SMART_ESCORT_MAX_PLAYER_DIST * 2 : SMART_ESCORT_MAX_PLAYER_DIST; if (targets->size() == 1 && GetScript()->IsPlayer((*targets->begin()))) diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 39ce2b88022..35e93d57c91 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -1871,7 +1871,14 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u } case SMART_ACTION_SEND_TARGET_TO_TARGET: { - ObjectVector const* storedTargets = GetStoredTargetVector(e.action.sendTargetToTarget.id); + WorldObject* ref = GetBaseObject(); + if (!ref) + ref = unit; + + if (!ref) + break; + + ObjectVector const* storedTargets = GetStoredTargetVector(e.action.sendTargetToTarget.id, *ref); if (!storedTargets) break; @@ -2613,8 +2620,13 @@ void SmartScript::GetTargets(ObjectVector& targets, SmartScriptHolder const& e, } case SMART_TARGET_STORED: { - if (ObjectVector const* stored = GetStoredTargetVector(e.target.stored.id)) - targets.assign(stored->begin(), stored->end()); + WorldObject* ref = GetBaseObject(); + if (!ref) + ref = scriptTrigger; + + if (ref) + if (ObjectVector const* stored = GetStoredTargetVector(e.target.stored.id, *ref)) + targets.assign(stored->begin(), stored->end()); break; } case SMART_TARGET_CLOSEST_CREATURE: diff --git a/src/server/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h index 44575845049..b3be36c0983 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.h +++ b/src/server/game/AI/SmartScripts/SmartScript.h @@ -79,14 +79,14 @@ class TC_GAME_API SmartScript { // insert or replace _storedTargets.erase(id); - _storedTargets.emplace(id, ObjectGuidVector(GetBaseObject(), targets)); + _storedTargets.emplace(id, ObjectGuidVector(targets)); } - ObjectVector const* GetStoredTargetVector(uint32 id) const + ObjectVector const* GetStoredTargetVector(uint32 id, WorldObject const& ref) const { auto itr = _storedTargets.find(id); if (itr != _storedTargets.end()) - return itr->second.GetObjectVector(); + return itr->second.GetObjectVector(ref); return nullptr; } diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index c3eea9fbaf4..71ee2cd236c 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -1554,34 +1554,32 @@ typedef std::vector<WorldObject*> ObjectVector; class ObjectGuidVector { public: - ObjectGuidVector(WorldObject* baseObject, ObjectVector const& objectVector) : _baseObject(baseObject), _objectVector(objectVector) + explicit ObjectGuidVector(ObjectVector const& objectVector) : _objectVector(objectVector) { _guidVector.reserve(_objectVector.size()); for (WorldObject* obj : _objectVector) _guidVector.push_back(obj->GetGUID()); } - ObjectVector const* GetObjectVector() const + ObjectVector const* GetObjectVector(WorldObject const& ref) const { - UpdateObjects(); + UpdateObjects(ref); return &_objectVector; } ~ObjectGuidVector() { } private: - WorldObject* const _baseObject; - mutable ObjectVector _objectVector; - GuidVector _guidVector; + mutable ObjectVector _objectVector; //sanitize vector using _guidVector - void UpdateObjects() const + void UpdateObjects(WorldObject const& ref) const { _objectVector.clear(); for (ObjectGuid const& guid : _guidVector) - if (WorldObject* obj = ObjectAccessor::GetWorldObject(*_baseObject, guid)) + if (WorldObject* obj = ObjectAccessor::GetWorldObject(ref, guid)) _objectVector.push_back(obj); } }; |