diff options
author | Sorikoff <46191832+Sorikoff@users.noreply.github.com> | 2019-02-25 08:36:36 +0000 |
---|---|---|
committer | Giacomo Pozzoni <giacomopoz@gmail.com> | 2019-02-25 09:36:36 +0100 |
commit | c2f2db08aa4f729fbd5b21528a215f6df0c131b6 (patch) | |
tree | 45c4d1d79271204fc73ad39e713e145aa8ff9a70 /src | |
parent | 47e1816bf78ea3050150fa3d4b0a93d8b9b10807 (diff) |
Allow walk when chasing (#23069)
Diffstat (limited to 'src')
6 files changed, 20 insertions, 9 deletions
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 50ab36fba84..7fd49a1d359 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -585,14 +585,14 @@ void MotionMaster::MoveFollow(Unit* target, float dist, ChaseAngle angle, Moveme Add(new FollowMovementGenerator(target, dist, angle), slot); } -void MotionMaster::MoveChase(Unit* target, Optional<ChaseRange> dist, Optional<ChaseAngle> angle) +void MotionMaster::MoveChase(Unit* target, Optional<ChaseRange> dist, Optional<ChaseAngle> angle, bool walk) { // Ignore movement request if target not exist if (!target || target == _owner) return; TC_LOG_DEBUG("movement.motionmaster", "MotionMaster::MoveChase: '%s', starts chasing '%s'", _owner->GetGUID().ToString().c_str(), target->GetGUID().ToString().c_str()); - Add(new ChaseMovementGenerator(target, dist, angle)); + Add(new ChaseMovementGenerator(target, dist, angle, walk)); } void MotionMaster::MoveConfused() diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h index 5f89f2304da..b3a61d833e8 100644 --- a/src/server/game/Movement/MotionMaster.h +++ b/src/server/game/Movement/MotionMaster.h @@ -140,7 +140,7 @@ class TC_GAME_API MotionMaster void MoveTargetedHome(); void MoveRandom(float spawndist = 0.0f); void MoveFollow(Unit* target, float dist, ChaseAngle angle, MovementSlot slot = MOTION_SLOT_ACTIVE); - void MoveChase(Unit* target, Optional<ChaseRange> dist = {}, Optional<ChaseAngle> angle = {}); + void MoveChase(Unit* target, Optional<ChaseRange> dist = {}, Optional<ChaseAngle> angle = {}, bool walk = false); void MoveChase(Unit* target, float dist, float angle) { MoveChase(target, ChaseRange(dist), ChaseAngle(angle)); } void MoveChase(Unit* target, float dist) { MoveChase(target, ChaseRange(dist)); } void MoveConfused(); diff --git a/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp index 60584653630..a723b5dc3fe 100644 --- a/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp @@ -56,7 +56,9 @@ static void DoMovementInform(Unit* owner, Unit* target) AI->MovementInform(CHASE_MOTION_TYPE, target->GetGUID().GetCounter()); } -ChaseMovementGenerator::ChaseMovementGenerator(Unit* target, Optional<ChaseRange> range, Optional<ChaseAngle> angle) : AbstractFollower(ASSERT_NOTNULL(target)), _range(range), _angle(angle) +ChaseMovementGenerator::ChaseMovementGenerator(Unit *target, Optional<ChaseRange> range, Optional<ChaseAngle> angle, + bool walk) : AbstractFollower(ASSERT_NOTNULL(target)), _range(range), + _angle(angle), _walk(walk) { Mode = MOTION_MODE_DEFAULT; Priority = MOTION_PRIORITY_NORMAL; @@ -70,7 +72,7 @@ void ChaseMovementGenerator::Initialize(Unit* owner) RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_DEACTIVATED); AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED); - owner->SetWalk(false); + owner->SetWalk(_walk); _path = nullptr; _lastTargetPosition.reset(); } @@ -203,7 +205,7 @@ bool ChaseMovementGenerator::Update(Unit* owner, uint32 diff) Movement::MoveSplineInit init(owner); init.MovebyPath(_path->GetPath()); - init.SetWalk(false); + init.SetWalk(_walk); init.SetFacing(target); init.Launch(); diff --git a/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h b/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h index f4fc1d4a1e5..e390465b441 100644 --- a/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.h @@ -30,7 +30,7 @@ class Unit; class ChaseMovementGenerator : public MovementGenerator, public AbstractFollower { public: - explicit ChaseMovementGenerator(Unit* target, Optional<ChaseRange> range = {}, Optional<ChaseAngle> angle = {}); + explicit ChaseMovementGenerator(Unit* target, Optional<ChaseRange> range = {}, Optional<ChaseAngle> angle = {}, bool walk = false); ~ChaseMovementGenerator(); void Initialize(Unit*) override; @@ -47,6 +47,7 @@ class ChaseMovementGenerator : public MovementGenerator, public AbstractFollower Optional<ChaseRange> const _range; Optional<ChaseAngle> const _angle; + bool _walk; std::unique_ptr<PathGenerator> _path; Optional<Position> _lastTargetPosition; diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp index fe2204b0354..c312bca4268 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp @@ -670,9 +670,8 @@ struct npc_dark_rider_of_acherus : public ScriptedAI { case EVENT_START_MOVING: me->SetTarget(_horseGUID); - me->SetWalk(true); if (Creature* horse = ObjectAccessor::GetCreature(*me, _horseGUID)) - me->GetMotionMaster()->MoveChase(horse); + me->GetMotionMaster()->MoveChase(horse, {}, {}, true); _events.ScheduleEvent(EVENT_DESPAWN_HORSE, 5s); break; case EVENT_DESPAWN_HORSE: diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp index 0e606ec8830..aca35a0c537 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp @@ -908,6 +908,15 @@ class boss_thaladred_the_darkener : public CreatureScript advisorbase_ai::Reset(); } + void AttackStart(Unit* who) override + { + if (!who || _inFakeDeath || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) + return; + + if (me->Attack(who, true)) + me->GetMotionMaster()->MoveChase(who, {}, {}, true); + } + void JustEngagedWith(Unit* who) override { Talk(SAY_THALADRED_AGGRO); |