diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-03-02 15:33:16 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2024-03-02 15:33:16 +0100 |
commit | 7a46f81fd134c41eb58ea66205ec9100a1013b3b (patch) | |
tree | 603d6c02e9f5dea1137cf229ae2fc3fd7be935ba | |
parent | f2ce5072d62e2835c4426220ebf8ade5fa67a79b (diff) |
Core/Creatures: Implemented CREATURE_STATIC_FLAG_6_ALWAYS_STAND_ON_TOP_OF_TARGET
3 files changed, 19 insertions, 7 deletions
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index e291a14a273..01a8bcfe477 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -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; } diff --git a/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp index e6e68190d80..a46bb1c6ab7 100644 --- a/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp @@ -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()) diff --git a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp index 8185b743e3b..a1ad2219d88 100644 --- a/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp @@ -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); |