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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user