Core/Creatures: Implemented CREATURE_STATIC_FLAG_6_ALWAYS_STAND_ON_TOP_OF_TARGET

Port From (https://github.com/TrinityCore/TrinityCore/commit/7a46f81fd134c41eb58ea66205ec9100a1013b3b)
This commit is contained in:
hondacrx
2024-03-04 11:55:02 -05:00
parent 3a976b2353
commit 974ca273ae
3 changed files with 24 additions and 8 deletions
+11 -1
View File
@@ -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;
@@ -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))
{
@@ -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);