Core/Creatures: Implemented CREATURE_STATIC_FLAG_6_ALWAYS_STAND_ON_TOP_OF_TARGET

This commit is contained in:
Shauren
2024-03-02 15:33:16 +01:00
parent f2ce5072d6
commit 7a46f81fd1
3 changed files with 19 additions and 7 deletions

View File

@@ -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; }

View File

@@ -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())

View File

@@ -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);