15 float ClampPositive(
float value)
17 return value > 0.0f ? value : 0.0f;
23 return isHunterPet && isControlled && isAlive && ownerMatches;
28 float const maxOffset = ClampPositive(limit);
29 return std::isfinite(x) && std::isfinite(y) && std::isfinite(z)
30 && std::fabs(x) <= maxOffset && std::fabs(y) <= maxOffset && std::fabs(z) <= maxOffset;
35 return !petAlreadyOnOwnerTransport || petPassengerOffsetInvalid;
39 bool targetOnSameTransport,
bool hasFollowOffset)
41 return followerIsPet && targetIsOwner && followerHasTransport && targetOnSameTransport && hasFollowOffset;
45 float desiredX,
float desiredY,
float desiredZ,
float tolerance)
47 if (!std::isfinite(currentX) || !std::isfinite(currentY) || !std::isfinite(currentZ)
48 || !std::isfinite(desiredX) || !std::isfinite(desiredY) || !std::isfinite(desiredZ))
51 float const allowed = ClampPositive(tolerance);
52 float const dx = currentX - desiredX;
53 float const dy = currentY - desiredY;
54 float const dz = currentZ - desiredZ;
55 return dx * dx + dy * dy + dz * dz > allowed * allowed;
60 return ownerHasTransport && petOnOwnerTransport && petInWorld;
65 return ownerMounted && ownerHasTransport && petStunned;
70 return petInWorld && petOnOwnerTransport && offsetRefreshed;
75 return isCreature && !isFalling && !hasTransport;
80 return ownerHasTransport && petExists && !petOnOwnerTransport;
84 bool isWithinVisibilityRange,
bool transportExitGraceActive)
86 return petExists && !petPossessed && !petOnOwnerTransport && !isWithinVisibilityRange && !transportExitGraceActive;
91 return inBattleground || hasFlyingMountSpeedAura;
95 bool petIsAlive,
bool ownerMatches,
bool sameMap)
97 return ownerHasTransport && sameMap &&
ShouldMirrorOwnerPet(petIsHunterPet, petIsControlled, petIsAlive, ownerMatches);
101 bool petIsControlled,
bool petIsAlive,
bool ownerMatches,
bool petOnOwnerTransport)
103 return ownerHasTransport && !petOnOwnerTransport
109 return !ownerStillOnTransport;
113 float ownerObjectSize,
float petObjectSize,
float followDistance,
float followAngle)
115 float const distance = ClampPositive(ownerObjectSize) + ClampPositive(petObjectSize) + ClampPositive(followDistance);
116 float const angle = ownerO + followAngle;
119 offset.
X = ownerX + std::cos(angle) * distance;
120 offset.
Y = ownerY + std::sin(angle) * distance;
bool ShouldResumePetFollowOnTransport(bool ownerHasTransport, bool petOnOwnerTransport, bool petInWorld)
bool ShouldTemporarilyUnsummonMountedPet(bool inBattleground, bool hasFlyingMountSpeedAura)
bool ShouldApplySplineGroundClamp(bool hasTransport, bool isCreature, bool isFalling)
bool ShouldRefreshPetTransportOffset(bool petAlreadyOnOwnerTransport, bool petPassengerOffsetInvalid)
bool ShouldPlacePetNearOwnerOnTransportExit(bool ownerStillOnTransport)
bool ShouldRemovePetForOwnerRange(bool petExists, bool petPossessed, bool petOnOwnerTransport, bool isWithinVisibilityRange, bool transportExitGraceActive)
bool ShouldMoveTransportPetToFollowOffset(float currentX, float currentY, float currentZ, float desiredX, float desiredY, float desiredZ, float tolerance)
PassengerOffset CalculateFollowerPosition(float ownerX, float ownerY, float ownerZ, float ownerO, float ownerObjectSize, float petObjectSize, float followDistance, float followAngle)
bool ShouldTryBoardPetBeforeOwnerRangeRemoval(bool ownerHasTransport, bool petExists, bool petOnOwnerTransport)
bool ShouldSendTransportEnterSpline(bool petInWorld, bool petOnOwnerTransport, bool offsetRefreshed)
bool ShouldReattachPetDuringOwnerTransportUpdate(bool ownerHasTransport, bool petIsHunterPet, bool petIsControlled, bool petIsAlive, bool ownerMatches, bool petOnOwnerTransport)
bool ShouldMirrorOwnerPet(bool isHunterPet, bool isControlled, bool isAlive, bool ownerMatches)
bool IsPassengerOffsetWithinLimit(float x, float y, float z, float limit)
bool ShouldAttachHunterPetToOwnerTransport(bool ownerHasTransport, bool petIsHunterPet, bool petIsControlled, bool petIsAlive, bool ownerMatches, bool sameMap)
bool ShouldClearMountedPetStunForTransport(bool ownerMounted, bool ownerHasTransport, bool petStunned)
bool ShouldUseTransportLocalPetFollow(bool followerIsPet, bool targetIsOwner, bool followerHasTransport, bool targetOnSameTransport, bool hasFollowOffset)