Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
PetTransportSupport.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
7#include <cmath>
8
9namespace Skyfire
10{
11namespace PetTransport
12{
13 namespace
14 {
15 float ClampPositive(float value)
16 {
17 return value > 0.0f ? value : 0.0f;
18 }
19 }
20
21 bool ShouldMirrorOwnerPet(bool isHunterPet, bool isControlled, bool isAlive, bool ownerMatches)
22 {
23 return isHunterPet && isControlled && isAlive && ownerMatches;
24 }
25
26 bool IsPassengerOffsetWithinLimit(float x, float y, float z, float limit)
27 {
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;
31 }
32
33 bool ShouldRefreshPetTransportOffset(bool petAlreadyOnOwnerTransport, bool petPassengerOffsetInvalid)
34 {
35 return !petAlreadyOnOwnerTransport || petPassengerOffsetInvalid;
36 }
37
38 bool ShouldUseTransportLocalPetFollow(bool followerIsPet, bool targetIsOwner, bool followerHasTransport,
39 bool targetOnSameTransport, bool hasFollowOffset)
40 {
41 return followerIsPet && targetIsOwner && followerHasTransport && targetOnSameTransport && hasFollowOffset;
42 }
43
44 bool ShouldMoveTransportPetToFollowOffset(float currentX, float currentY, float currentZ,
45 float desiredX, float desiredY, float desiredZ, float tolerance)
46 {
47 if (!std::isfinite(currentX) || !std::isfinite(currentY) || !std::isfinite(currentZ)
48 || !std::isfinite(desiredX) || !std::isfinite(desiredY) || !std::isfinite(desiredZ))
49 return false;
50
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;
56 }
57
58 bool ShouldResumePetFollowOnTransport(bool ownerHasTransport, bool petOnOwnerTransport, bool petInWorld)
59 {
60 return ownerHasTransport && petOnOwnerTransport && petInWorld;
61 }
62
63 bool ShouldClearMountedPetStunForTransport(bool ownerMounted, bool ownerHasTransport, bool petStunned)
64 {
65 return ownerMounted && ownerHasTransport && petStunned;
66 }
67
68 bool ShouldSendTransportEnterSpline(bool petInWorld, bool petOnOwnerTransport, bool offsetRefreshed)
69 {
70 return petInWorld && petOnOwnerTransport && offsetRefreshed;
71 }
72
73 bool ShouldApplySplineGroundClamp(bool hasTransport, bool isCreature, bool isFalling)
74 {
75 return isCreature && !isFalling && !hasTransport;
76 }
77
78 bool ShouldTryBoardPetBeforeOwnerRangeRemoval(bool ownerHasTransport, bool petExists, bool petOnOwnerTransport)
79 {
80 return ownerHasTransport && petExists && !petOnOwnerTransport;
81 }
82
83 bool ShouldRemovePetForOwnerRange(bool petExists, bool petPossessed, bool petOnOwnerTransport,
84 bool isWithinVisibilityRange, bool transportExitGraceActive)
85 {
86 return petExists && !petPossessed && !petOnOwnerTransport && !isWithinVisibilityRange && !transportExitGraceActive;
87 }
88
89 bool ShouldTemporarilyUnsummonMountedPet(bool inBattleground, bool hasFlyingMountSpeedAura)
90 {
91 return inBattleground || hasFlyingMountSpeedAura;
92 }
93
94 bool ShouldAttachHunterPetToOwnerTransport(bool ownerHasTransport, bool petIsHunterPet, bool petIsControlled,
95 bool petIsAlive, bool ownerMatches, bool sameMap)
96 {
97 return ownerHasTransport && sameMap && ShouldMirrorOwnerPet(petIsHunterPet, petIsControlled, petIsAlive, ownerMatches);
98 }
99
100 bool ShouldReattachPetDuringOwnerTransportUpdate(bool ownerHasTransport, bool petIsHunterPet,
101 bool petIsControlled, bool petIsAlive, bool ownerMatches, bool petOnOwnerTransport)
102 {
103 return ownerHasTransport && !petOnOwnerTransport
104 && ShouldMirrorOwnerPet(petIsHunterPet, petIsControlled, petIsAlive, ownerMatches);
105 }
106
107 bool ShouldPlacePetNearOwnerOnTransportExit(bool ownerStillOnTransport)
108 {
109 return !ownerStillOnTransport;
110 }
111
112 PassengerOffset CalculateFollowerPosition(float ownerX, float ownerY, float ownerZ, float ownerO,
113 float ownerObjectSize, float petObjectSize, float followDistance, float followAngle)
114 {
115 float const distance = ClampPositive(ownerObjectSize) + ClampPositive(petObjectSize) + ClampPositive(followDistance);
116 float const angle = ownerO + followAngle;
117
118 PassengerOffset offset;
119 offset.X = ownerX + std::cos(angle) * distance;
120 offset.Y = ownerY + std::sin(angle) * distance;
121 offset.Z = ownerZ;
122 offset.O = ownerO;
123 return offset;
124 }
125}
126}
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)