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()}");
|
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))
|
if (mountCreatureDisplayId.HasValue && !CliDB.CreatureDisplayInfoStorage.HasRecord(mountCreatureDisplayId.Value))
|
||||||
mountCreatureDisplayId = null;
|
mountCreatureDisplayId = null;
|
||||||
|
|||||||
@@ -63,12 +63,13 @@ namespace Game.Movement
|
|||||||
if (target == null || !target.IsInWorld)
|
if (target == null || !target.IsInWorld)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
Creature cOwner = owner.ToCreature();
|
||||||
|
|
||||||
// the owner might be unable to move (rooted or casting), or we have lost the target, pause movement
|
// 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))
|
if (owner.HasUnitState(UnitState.NotMove) || owner.IsMovementPreventedByCasting() || HasLostTarget(owner, target))
|
||||||
{
|
{
|
||||||
owner.StopMoving();
|
owner.StopMoving();
|
||||||
_lastTargetPosition = null;
|
_lastTargetPosition = null;
|
||||||
Creature cOwner = owner.ToCreature();
|
|
||||||
if (cOwner != null)
|
if (cOwner != null)
|
||||||
cOwner.SetCannotReachTarget(false);
|
cOwner.SetCannotReachTarget(false);
|
||||||
return true;
|
return true;
|
||||||
@@ -82,6 +83,9 @@ namespace Game.Movement
|
|||||||
float maxTarget = _range.HasValue ? _range.Value.MaxTolerance + hitboxSum : SharedConst.ContactDistance + hitboxSum;
|
float maxTarget = _range.HasValue ? _range.Value.MaxTolerance + hitboxSum : SharedConst.ContactDistance + hitboxSum;
|
||||||
ChaseAngle? angle = mutualChase ? null : _angle;
|
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...
|
// periodically check if we're already in the expected range...
|
||||||
_rangeCheckTimer.Update(diff);
|
_rangeCheckTimer.Update(diff);
|
||||||
if (_rangeCheckTimer.Passed())
|
if (_rangeCheckTimer.Passed())
|
||||||
@@ -92,7 +96,6 @@ namespace Game.Movement
|
|||||||
RemoveFlag(MovementGeneratorFlags.InformEnabled);
|
RemoveFlag(MovementGeneratorFlags.InformEnabled);
|
||||||
_path = null;
|
_path = null;
|
||||||
|
|
||||||
Creature cOwner = owner.ToCreature();
|
|
||||||
if (cOwner != null)
|
if (cOwner != null)
|
||||||
cOwner.SetCannotReachTarget(false);
|
cOwner.SetCannotReachTarget(false);
|
||||||
|
|
||||||
@@ -108,7 +111,6 @@ namespace Game.Movement
|
|||||||
{
|
{
|
||||||
RemoveFlag(MovementGeneratorFlags.InformEnabled);
|
RemoveFlag(MovementGeneratorFlags.InformEnabled);
|
||||||
_path = null;
|
_path = null;
|
||||||
Creature cOwner = owner.ToCreature();
|
|
||||||
if (cOwner != null)
|
if (cOwner != null)
|
||||||
cOwner.SetCannotReachTarget(false);
|
cOwner.SetCannotReachTarget(false);
|
||||||
owner.ClearUnitState(UnitState.ChaseMove);
|
owner.ClearUnitState(UnitState.ChaseMove);
|
||||||
@@ -123,7 +125,6 @@ namespace Game.Movement
|
|||||||
_mutualChase = mutualChase;
|
_mutualChase = mutualChase;
|
||||||
if (owner.HasUnitState(UnitState.ChaseMove) || !PositionOkay(owner, target, minRange, maxRange, angle))
|
if (owner.HasUnitState(UnitState.ChaseMove) || !PositionOkay(owner, target, minRange, maxRange, angle))
|
||||||
{
|
{
|
||||||
Creature cOwner = owner.ToCreature();
|
|
||||||
// can we get to the target?
|
// can we get to the target?
|
||||||
if (cOwner != null && !target.IsInAccessiblePlaceFor(cOwner))
|
if (cOwner != null && !target.IsInAccessiblePlaceFor(cOwner))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -87,11 +87,16 @@ namespace Game.Movement
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float range = _range;
|
||||||
|
Creature cOwner = owner.ToCreature();
|
||||||
|
if (cOwner != null && cOwner.IsIgnoringChaseRange())
|
||||||
|
range = 0.0f;
|
||||||
|
|
||||||
_checkTimer.Update(diff);
|
_checkTimer.Update(diff);
|
||||||
if (_checkTimer.Passed())
|
if (_checkTimer.Passed())
|
||||||
{
|
{
|
||||||
_checkTimer.Reset(CHECK_INTERVAL);
|
_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);
|
RemoveFlag(MovementGeneratorFlags.InformEnabled);
|
||||||
_path = null;
|
_path = null;
|
||||||
@@ -113,7 +118,7 @@ namespace Game.Movement
|
|||||||
if (_lastTargetPosition == null || _lastTargetPosition.GetExactDistSq(target.GetPosition()) > 0.0f)
|
if (_lastTargetPosition == null || _lastTargetPosition.GetExactDistSq(target.GetPosition()) > 0.0f)
|
||||||
{
|
{
|
||||||
_lastTargetPosition = new(target.GetPosition());
|
_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)
|
if (_path == null)
|
||||||
_path = new PathGenerator(owner);
|
_path = new PathGenerator(owner);
|
||||||
@@ -135,7 +140,7 @@ namespace Game.Movement
|
|||||||
tAngle = _angle.LowerBound();
|
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())
|
if (owner.IsHovering())
|
||||||
owner.UpdateAllowedPositionZ(x, y, ref z);
|
owner.UpdateAllowedPositionZ(x, y, ref z);
|
||||||
|
|||||||
Reference in New Issue
Block a user