From 974ca273ae366d36690482e971cfeb656725fe57 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Mon, 4 Mar 2024 11:55:02 -0500 Subject: [PATCH] Core/Creatures: Implemented CREATURE_STATIC_FLAG_6_ALWAYS_STAND_ON_TOP_OF_TARGET Port From (https://github.com/TrinityCore/TrinityCore/commit/7a46f81fd134c41eb58ea66205ec9100a1013b3b) --- Source/Game/Entities/Creature/Creature.cs | 12 +++++++++++- .../Movement/Generators/ChaseMovementGenerator.cs | 9 +++++---- .../Movement/Generators/FollowMovementGenerator.cs | 11 ++++++++--- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/Source/Game/Entities/Creature/Creature.cs b/Source/Game/Entities/Creature/Creature.cs index 58897f085..14d1346f9 100644 --- a/Source/Game/Entities/Creature/Creature.cs +++ b/Source/Game/Entities/Creature/Creature.cs @@ -3066,7 +3066,17 @@ namespace Game.Entities Log.outDebug(LogFilter.Unit, $"Creature::SetCannotReachTarget() called with true. Details: {GetDebugInfo()}"); } - void SetDefaultMount(uint? mountCreatureDisplayId) + public bool IsIgnoringChaseRange() + { + return _staticFlags.HasFlag(CreatureStaticFlags6.AlwaysStandOnTopOfTarget); + } + + public void SetIgnoreChaseRange(bool ignoreChaseRange) + { + _staticFlags.ApplyFlag(CreatureStaticFlags6.AlwaysStandOnTopOfTarget, ignoreChaseRange); + } + + public void SetDefaultMount(uint? mountCreatureDisplayId) { if (mountCreatureDisplayId.HasValue && !CliDB.CreatureDisplayInfoStorage.HasRecord(mountCreatureDisplayId.Value)) mountCreatureDisplayId = null; diff --git a/Source/Game/Movement/Generators/ChaseMovementGenerator.cs b/Source/Game/Movement/Generators/ChaseMovementGenerator.cs index bd93fa1ce..2a23a641f 100644 --- a/Source/Game/Movement/Generators/ChaseMovementGenerator.cs +++ b/Source/Game/Movement/Generators/ChaseMovementGenerator.cs @@ -63,12 +63,13 @@ namespace Game.Movement if (target == null || !target.IsInWorld) return false; + Creature cOwner = owner.ToCreature(); + // the owner might be unable to move (rooted or casting), or we have lost the target, pause movement if (owner.HasUnitState(UnitState.NotMove) || owner.IsMovementPreventedByCasting() || HasLostTarget(owner, target)) { owner.StopMoving(); _lastTargetPosition = null; - Creature cOwner = owner.ToCreature(); if (cOwner != null) cOwner.SetCannotReachTarget(false); return true; @@ -82,6 +83,9 @@ namespace Game.Movement float maxTarget = _range.HasValue ? _range.Value.MaxTolerance + hitboxSum : SharedConst.ContactDistance + hitboxSum; ChaseAngle? angle = mutualChase ? null : _angle; + if (cOwner != null && cOwner.IsIgnoringChaseRange()) + minRange = minTarget = maxRange = maxTarget = 0.0f; + // periodically check if we're already in the expected range... _rangeCheckTimer.Update(diff); if (_rangeCheckTimer.Passed()) @@ -92,7 +96,6 @@ namespace Game.Movement RemoveFlag(MovementGeneratorFlags.InformEnabled); _path = null; - Creature cOwner = owner.ToCreature(); if (cOwner != null) cOwner.SetCannotReachTarget(false); @@ -108,7 +111,6 @@ namespace Game.Movement { RemoveFlag(MovementGeneratorFlags.InformEnabled); _path = null; - Creature cOwner = owner.ToCreature(); if (cOwner != null) cOwner.SetCannotReachTarget(false); owner.ClearUnitState(UnitState.ChaseMove); @@ -123,7 +125,6 @@ namespace Game.Movement _mutualChase = mutualChase; if (owner.HasUnitState(UnitState.ChaseMove) || !PositionOkay(owner, target, minRange, maxRange, angle)) { - Creature cOwner = owner.ToCreature(); // can we get to the target? if (cOwner != null && !target.IsInAccessiblePlaceFor(cOwner)) { diff --git a/Source/Game/Movement/Generators/FollowMovementGenerator.cs b/Source/Game/Movement/Generators/FollowMovementGenerator.cs index 755a8426d..ed2aa2e12 100644 --- a/Source/Game/Movement/Generators/FollowMovementGenerator.cs +++ b/Source/Game/Movement/Generators/FollowMovementGenerator.cs @@ -87,11 +87,16 @@ namespace Game.Movement return true; } + float range = _range; + Creature cOwner = owner.ToCreature(); + if (cOwner != null && cOwner.IsIgnoringChaseRange()) + range = 0.0f; + _checkTimer.Update(diff); if (_checkTimer.Passed()) { _checkTimer.Reset(CHECK_INTERVAL); - if (HasFlag(MovementGeneratorFlags.InformEnabled) && PositionOkay(owner, target, _range, _angle)) + if (HasFlag(MovementGeneratorFlags.InformEnabled) && PositionOkay(owner, target, range, _angle)) { RemoveFlag(MovementGeneratorFlags.InformEnabled); _path = null; @@ -113,7 +118,7 @@ namespace Game.Movement if (_lastTargetPosition == null || _lastTargetPosition.GetExactDistSq(target.GetPosition()) > 0.0f) { _lastTargetPosition = new(target.GetPosition()); - if (owner.HasUnitState(UnitState.FollowMove) || !PositionOkay(owner, target, _range + FOLLOW_RANGE_TOLERANCE)) + if (owner.HasUnitState(UnitState.FollowMove) || !PositionOkay(owner, target, range + FOLLOW_RANGE_TOLERANCE)) { if (_path == null) _path = new PathGenerator(owner); @@ -135,7 +140,7 @@ namespace Game.Movement tAngle = _angle.LowerBound(); } - target.GetNearPoint(owner, out x, out y, out z, _range, target.ToAbsoluteAngle(tAngle)); + target.GetNearPoint(owner, out x, out y, out z, range, target.ToAbsoluteAngle(tAngle)); if (owner.IsHovering()) owner.UpdateAllowedPositionZ(x, y, ref z);