aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-03-02 15:33:16 +0100
committerShauren <shauren.trinity@gmail.com>2024-03-02 15:33:16 +0100
commit7a46f81fd134c41eb58ea66205ec9100a1013b3b (patch)
tree603d6c02e9f5dea1137cf229ae2fc3fd7be935ba
parentf2ce5072d62e2835c4426220ebf8ade5fa67a79b (diff)
Core/Creatures: Implemented CREATURE_STATIC_FLAG_6_ALWAYS_STAND_ON_TOP_OF_TARGET
-rw-r--r--src/server/game/Entities/Creature/Creature.h3
-rw-r--r--src/server/game/Movement/MovementGenerators/ChaseMovementGenerator.cpp12
-rw-r--r--src/server/game/Movement/MovementGenerators/FollowMovementGenerator.cpp11
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);