mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/Creatures: Implemented CREATURE_STATIC_FLAG_6_ALWAYS_STAND_ON_TOP_OF_TARGET
This commit is contained in:
@@ -353,6 +353,9 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma
|
||||
virtual uint32 GetPetAutoSpellOnPos(uint8 pos) const;
|
||||
float GetPetChaseDistance() const;
|
||||
|
||||
bool IsIgnoringChaseRange() const { return _staticFlags.HasFlag(CREATURE_STATIC_FLAG_6_ALWAYS_STAND_ON_TOP_OF_TARGET); }
|
||||
void SetIgnoreChaseRange(bool ignoreChaseRange) { _staticFlags.ApplyFlag(CREATURE_STATIC_FLAG_6_ALWAYS_STAND_ON_TOP_OF_TARGET, ignoreChaseRange); }
|
||||
|
||||
void SetCannotReachTarget(bool cannotReach);
|
||||
bool CanNotReachTarget() const { return m_cannotReachTarget; }
|
||||
|
||||
|
||||
@@ -114,12 +114,16 @@ bool ChaseMovementGenerator::Update(Unit* owner, uint32 diff)
|
||||
|
||||
bool const mutualChase = IsMutualChase(owner, target);
|
||||
float const hitboxSum = owner->GetCombatReach() + target->GetCombatReach();
|
||||
float const minRange = _range ? _range->MinRange + hitboxSum : CONTACT_DISTANCE;
|
||||
float const minTarget = (_range ? _range->MinTolerance : 0.0f) + hitboxSum;
|
||||
float const maxRange = _range ? _range->MaxRange + hitboxSum : owner->GetMeleeRange(target); // melee range already includes hitboxes
|
||||
float const maxTarget = _range ? _range->MaxTolerance + hitboxSum : CONTACT_DISTANCE + hitboxSum;
|
||||
float minRange = _range ? _range->MinRange + hitboxSum : CONTACT_DISTANCE;
|
||||
float minTarget = (_range ? _range->MinTolerance : 0.0f) + hitboxSum;
|
||||
float maxRange = _range ? _range->MaxRange + hitboxSum : owner->GetMeleeRange(target); // melee range already includes hitboxes
|
||||
float maxTarget = _range ? _range->MaxTolerance + hitboxSum : CONTACT_DISTANCE + hitboxSum;
|
||||
Optional<ChaseAngle> angle = mutualChase ? Optional<ChaseAngle>() : _angle;
|
||||
|
||||
if (Creature* cOwner = owner->ToCreature())
|
||||
if (cOwner->IsIgnoringChaseRange())
|
||||
minRange = minTarget = maxRange = maxTarget = 0.0f;
|
||||
|
||||
// periodically check if we're already in the expected range...
|
||||
_rangeCheckTimer.Update(diff);
|
||||
if (_rangeCheckTimer.Passed())
|
||||
|
||||
@@ -103,11 +103,16 @@ bool FollowMovementGenerator::Update(Unit* owner, uint32 diff)
|
||||
return true;
|
||||
}
|
||||
|
||||
float range = _range;
|
||||
if (Creature* cOwner = owner->ToCreature())
|
||||
if (cOwner->IsIgnoringChaseRange())
|
||||
range = 0.0f;
|
||||
|
||||
_checkTimer.Update(diff);
|
||||
if (_checkTimer.Passed())
|
||||
{
|
||||
_checkTimer.Reset(CHECK_INTERVAL);
|
||||
if (HasFlag(MOVEMENTGENERATOR_FLAG_INFORM_ENABLED) && PositionOkay(owner, target, _range, _angle))
|
||||
if (HasFlag(MOVEMENTGENERATOR_FLAG_INFORM_ENABLED) && PositionOkay(owner, target, range, _angle))
|
||||
{
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_INFORM_ENABLED);
|
||||
_path = nullptr;
|
||||
@@ -129,7 +134,7 @@ bool FollowMovementGenerator::Update(Unit* owner, uint32 diff)
|
||||
if (!_lastTargetPosition || _lastTargetPosition->GetExactDistSq(target->GetPosition()) > 0.0f)
|
||||
{
|
||||
_lastTargetPosition = target->GetPosition();
|
||||
if (owner->HasUnitState(UNIT_STATE_FOLLOW_MOVE) || !PositionOkay(owner, target, _range + FOLLOW_RANGE_TOLERANCE))
|
||||
if (owner->HasUnitState(UNIT_STATE_FOLLOW_MOVE) || !PositionOkay(owner, target, range + FOLLOW_RANGE_TOLERANCE))
|
||||
{
|
||||
if (!_path)
|
||||
_path = std::make_unique<PathGenerator>(owner);
|
||||
@@ -151,7 +156,7 @@ bool FollowMovementGenerator::Update(Unit* owner, uint32 diff)
|
||||
tAngle = _angle.LowerBound();
|
||||
}
|
||||
|
||||
target->GetNearPoint(owner, x, y, z, _range, target->ToAbsoluteAngle(tAngle));
|
||||
target->GetNearPoint(owner, x, y, z, range, target->ToAbsoluteAngle(tAngle));
|
||||
|
||||
if (owner->IsHovering())
|
||||
owner->UpdateAllowedPositionZ(x, y, z);
|
||||
|
||||
Reference in New Issue
Block a user