From 14939204955d1a24fe465cdfcbf307daf3ce4f09 Mon Sep 17 00:00:00 2001 From: Treeston Date: Fri, 6 Apr 2018 18:09:55 +0200 Subject: Core/Movement: Replace old TargetedMovementGenerator into ChaseMovementGenerator and FollowMovementGenerator, full rewrite for both. - Chase to angle is now functional. Pets use this to chase behind the target. Closes #19925. - Chase to arbitrary range interval works. Not used anywhere, but you can technically make hunter-like mobs. - Pets now follow the hunter cleanly and without stutter stepping. Also fix some other things. Closes #8924. (cherry picked from commit 2a84562dc85516f432bb1e5de9add23c28b26ce4) --- src/server/game/Movement/MotionMaster.cpp | 49 ++++++++++++------------------- 1 file changed, 18 insertions(+), 31 deletions(-) (limited to 'src/server/game/Movement/MotionMaster.cpp') diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index d1cc83b35b0..d65788dcbac 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -16,12 +16,14 @@ */ #include "MotionMaster.h" +#include "ChaseMovementGenerator.h" #include "ConfusedMovementGenerator.h" #include "Creature.h" #include "CreatureAISelector.h" #include "DB2Stores.h" #include "FleeingMovementGenerator.h" #include "FlightPathMovementGenerator.h" +#include "FollowMovementGenerator.h" #include "FormationMovementGenerator.h" #include "HomeMovementGenerator.h" #include "IdleMovementGenerator.h" @@ -36,7 +38,6 @@ #include "RandomMovementGenerator.h" #include "ScriptSystem.h" #include "SplineChainMovementGenerator.h" -#include "TargetedMovementGenerator.h" #include "WaypointMovementGenerator.h" inline MovementGenerator* GetIdleMovementGenerator() @@ -217,7 +218,7 @@ void MotionMaster::MoveTargetedHome() if (target) { TC_LOG_DEBUG("misc", "Following %s", target->GetGUID().ToString().c_str()); - Mutate(new FollowMovementGenerator(target, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE), MOTION_SLOT_ACTIVE); + Mutate(new FollowMovementGenerator(target, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE), MOTION_SLOT_ACTIVE); } } else @@ -235,47 +236,33 @@ void MotionMaster::MoveRandom(float spawndist) } } -void MotionMaster::MoveFollow(Unit* target, float dist, float angle, MovementSlot slot) +void MotionMaster::MoveFollow(Unit* target, float dist, ChaseAngle angle, MovementSlot slot) { // ignore movement request if target not exist if (!target || target == _owner) return; - //_owner->AddUnitState(UNIT_STATE_FOLLOW); - if (_owner->GetTypeId() == TYPEID_PLAYER) - { - TC_LOG_DEBUG("misc", "Player (%s) follows (%s)", _owner->GetGUID().ToString().c_str(), target->GetGUID().ToString().c_str()); - Mutate(new FollowMovementGenerator(target, dist, angle), slot); - } - else - { - TC_LOG_DEBUG("misc", "Creature (Entry: %u %s) follows (%s)", _owner->GetEntry(), _owner->GetGUID().ToString().c_str(), target->GetGUID().ToString().c_str()); - Mutate(new FollowMovementGenerator(target, dist, angle), slot); - } + TC_LOG_DEBUG("misc", "%s (Entry: %u, %s) follows %s (Entry %u, %s).", + _owner->GetTypeId() == TYPEID_PLAYER ? "Player" : "Creature", + _owner->GetEntry(), _owner->GetGUID().ToString().c_str(), + target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature", + target->GetEntry(), target->GetGUID().ToString().c_str()); + + Mutate(new FollowMovementGenerator(target, dist, angle), slot); } -void MotionMaster::MoveChase(Unit* target, float dist, float angle) +void MotionMaster::MoveChase(Unit* target, Optional dist, Optional angle) { // ignore movement request if target not exist if (!target || target == _owner) return; - //_owner->ClearUnitState(UNIT_STATE_FOLLOW); - if (_owner->GetTypeId() == TYPEID_PLAYER) - { - TC_LOG_DEBUG("misc", "Player (%s) chase (%s)", - _owner->GetGUID().ToString().c_str(), - target->GetGUID().ToString().c_str()); - Mutate(new ChaseMovementGenerator(target, dist, angle), MOTION_SLOT_ACTIVE); - } - else - { - TC_LOG_DEBUG("misc", "Creature (Entry: %u %s) chase %s", - _owner->GetEntry(), - _owner->GetGUID().ToString().c_str(), - target->GetGUID().ToString().c_str()); - Mutate(new ChaseMovementGenerator(target, dist, angle), MOTION_SLOT_ACTIVE); - } + TC_LOG_DEBUG("misc", "%s (Entry: %u, %s) chase to %s (Entry: %u, %s)", + _owner->GetTypeId() == TYPEID_PLAYER ? "Player" : "Creature", + _owner->GetEntry(), _owner->GetGUID().ToString().c_str(), + target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature", + target->GetEntry(), target->GetGUID().ToString().c_str()); + Mutate(new ChaseMovementGenerator(target, dist, angle), MOTION_SLOT_ACTIVE); } void MotionMaster::MoveConfused() -- cgit v1.2.3