diff --git a/Source/Game/Entities/Unit/Unit.Movement.cs b/Source/Game/Entities/Unit/Unit.Movement.cs index fc682d669..242ec53fc 100644 --- a/Source/Game/Entities/Unit/Unit.Movement.cs +++ b/Source/Game/Entities/Unit/Unit.Movement.cs @@ -523,7 +523,7 @@ namespace Game.Entities if (creature.HasUnitTypeMask(UnitTypeMask.Minion) && !creature.IsInCombat()) { - var top = creature.GetMotionMaster().Top(); + var top = creature.GetMotionMaster().TopOrNull(); if (top != null && top.GetMovementGeneratorType() == MovementGeneratorType.Follow) { Unit followed = ((AbstractFollower)top).GetTarget(); diff --git a/Source/Game/Movement/Generators/ChaseMovementGenerator.cs b/Source/Game/Movement/Generators/ChaseMovementGenerator.cs index 14dd457cb..e66c0ed4f 100644 --- a/Source/Game/Movement/Generators/ChaseMovementGenerator.cs +++ b/Source/Game/Movement/Generators/ChaseMovementGenerator.cs @@ -73,12 +73,12 @@ namespace Game.Movement return true; } - bool mutualChase = IsMutualChase(owner, target); - float hitboxSum = owner.GetCombatReach() + target.GetCombatReach(); - float minRange = _range.HasValue ? _range.Value.MinRange + hitboxSum : SharedConst.ContactDistance; - float minTarget = (_range.HasValue ? _range.Value.MinTolerance : 0.0f) + hitboxSum; - float maxRange = _range.HasValue ? _range.Value.MaxRange + hitboxSum : owner.GetMeleeRange(target); // melee range already includes hitboxes - float maxTarget = _range.HasValue ? _range.Value.MaxTolerance + hitboxSum : SharedConst.ContactDistance + hitboxSum; + bool mutualChase = IsMutualChase(owner, target); + float hitboxSum = owner.GetCombatReach() + target.GetCombatReach(); + float minRange = _range.HasValue ? _range.Value.MinRange + hitboxSum : SharedConst.ContactDistance; + float minTarget = (_range.HasValue ? _range.Value.MinTolerance : 0.0f) + hitboxSum; + float maxRange = _range.HasValue ? _range.Value.MaxRange + hitboxSum : owner.GetMeleeRange(target); // melee range already includes hitboxes + float maxTarget = _range.HasValue ? _range.Value.MaxTolerance + hitboxSum : SharedConst.ContactDistance + hitboxSum; ChaseAngle? angle = mutualChase ? null : _angle; // if we're already moving, periodically check if we're already in the expected range... @@ -195,7 +195,7 @@ namespace Game.Movement static bool IsMutualChase(Unit owner, Unit target) { - IMovementGenerator gen = target.GetMotionMaster().Top(); + IMovementGenerator gen = target.GetMotionMaster().TopOrNull(); if (gen == null || gen.GetMovementGeneratorType() != MovementGeneratorType.Chase) return false; return ((ChaseMovementGenerator)gen).GetTarget() == owner; diff --git a/Source/Game/Movement/MotionMaster.cs b/Source/Game/Movement/MotionMaster.cs index caa60eda1..ba2763c60 100644 --- a/Source/Game/Movement/MotionMaster.cs +++ b/Source/Game/Movement/MotionMaster.cs @@ -804,6 +804,11 @@ namespace Game.Movement int Size() { return _top + 1; } + public IMovementGenerator TopOrNull() + { + return Empty() ? null : Top(); + } + public IMovementGenerator Top() { Cypher.Assert(!Empty());