aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp28
-rw-r--r--src/server/game/Entities/Unit/Unit.h19
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h17
3 files changed, 47 insertions, 17 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 1f16f9789b1..556b6f5ac74 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -479,6 +479,12 @@ void Unit::Update(uint32 p_time)
UpdateSplineMovement(p_time);
i_motionMaster->Update(p_time);
+ // Wait with the aura interrupts until we have updated our movement generators and position
+ if (GetTypeId() == TYPEID_PLAYER)
+ InterruptMovementBasedAuras();
+ else if (!movespline->Finalized())
+ InterruptMovementBasedAuras();
+
if (!GetAI() && (GetTypeId() != TYPEID_PLAYER || (IsCharmed() && GetCharmerGUID().IsCreature())))
UpdateCharmAI();
RefreshAI();
@@ -543,6 +549,16 @@ void Unit::UpdateSplinePosition()
UpdatePosition(loc.x, loc.y, loc.z, loc.orientation);
}
+void Unit::InterruptMovementBasedAuras()
+{
+ // TODO: Check if orientation transport offset changed instead of only global orientation
+ if (_positionUpdateInfo.Turned)
+ RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags::Turning);
+
+ if (_positionUpdateInfo.Relocated && !GetVehicle())
+ RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags::Moving);
+}
+
void Unit::DisableSpline()
{
m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_FORWARD);
@@ -9999,6 +10015,8 @@ void Unit::UpdateReactives(uint32 p_time)
if (HasAuraState(AURA_STATE_DEFENSIVE_2))
ModifyAuraState(AURA_STATE_DEFENSIVE_2, false);
break;
+ default:
+ break;
}
}
else
@@ -12003,15 +12021,8 @@ bool Unit::UpdatePosition(float x, float y, float z, float orientation, bool tel
std::fabs(GetPositionY() - y) > 0.001f ||
std::fabs(GetPositionZ() - z) > 0.001f);
- // TODO: Check if orientation transport offset changed instead of only global orientation
- if (turn)
- RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags::Turning);
-
if (relocated)
{
- if (!GetVehicle())
- RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags::Moving);
-
// move and update visible state if need
if (GetTypeId() == TYPEID_PLAYER)
GetMap()->PlayerRelocation(ToPlayer(), x, y, z, orientation);
@@ -12023,6 +12034,9 @@ bool Unit::UpdatePosition(float x, float y, float z, float orientation, bool tel
UpdatePositionData();
+ _positionUpdateInfo.Relocated = relocated;
+ _positionUpdateInfo.Turned = turn;
+
bool isInWater = IsInWater();
if (!IsFalling() || isInWater || IsFlying())
RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags2::Ground);
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 1708a6b8a6d..d1a21e06538 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -717,18 +717,15 @@ struct TC_GAME_API CharmInfo
enum ReactiveType
{
REACTIVE_DEFENSE = 0,
- REACTIVE_DEFENSE_2 = 1
+ REACTIVE_DEFENSE_2 = 1,
+ MAX_REACTIVE
};
-#define MAX_REACTIVE 2
-#define SUMMON_SLOT_PET 0
-#define SUMMON_SLOT_TOTEM 1
-#define MAX_TOTEM_SLOT 5
-#define SUMMON_SLOT_MINIPET 5
-#define SUMMON_SLOT_QUEST 6
-#define MAX_SUMMON_SLOT 7
-
-#define MAX_GAMEOBJECT_SLOT 4
+struct PositionUpdateInfo
+{
+ bool Relocated = false;
+ bool Turned = false;
+};
// delay time next attack to prevent client attack animation problems
#define ATTACK_DISPLAY_DELAY 200
@@ -1953,6 +1950,7 @@ class TC_GAME_API Unit : public WorldObject
void UpdateSplineMovement(uint32 t_diff);
void UpdateSplinePosition();
+ void InterruptMovementBasedAuras();
// player or player's pet
float GetCombatRatingReduction(CombatRating cr) const;
@@ -2006,6 +2004,7 @@ class TC_GAME_API Unit : public WorldObject
SpellHistory* _spellHistory;
std::unique_ptr<MovementForces> _movementForces;
+ PositionUpdateInfo _positionUpdateInfo;
};
namespace Trinity
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index 3da7ec97af4..211f13f17be 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -5855,6 +5855,23 @@ enum class SummonTitle : int32
ServantOfNZoth = 44
};
+enum SummonSlot : int32
+{
+ SUMMON_SLOT_ANY_TOTEM = -1,
+ SUMMON_SLOT_PET = 0,
+ SUMMON_SLOT_TOTEM = 1,
+ SUMMON_SLOT_TOTEM_2 = 2,
+ SUMMON_SLOT_TOTEM_3 = 3,
+ SUMMON_SLOT_TOTEM_4 = 4,
+ SUMMON_SLOT_MINIPET = 5,
+ SUMMON_SLOT_QUEST = 6,
+
+ MAX_SUMMON_SLOT
+};
+
+#define MAX_TOTEM_SLOT 5
+#define MAX_GAMEOBJECT_SLOT 4
+
enum EventId
{
EVENT_CHARGE = 1003,