aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Player/Player.cpp3
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp38
-rw-r--r--src/server/game/Entities/Unit/Unit.h3
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
-rw-r--r--src/server/game/Spells/Auras/SpellAuraDefines.h2
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp19
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.h1
7 files changed, 62 insertions, 6 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 08cf5471747..469bc289345 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -23464,6 +23464,9 @@ void Player::SendAurasForTarget(Unit* target) const
if (target->HasAuraType(SPELL_AURA_HOVER))
target->SetHover(true, true);
+ if (target->HasAuraType(SPELL_AURA_CAN_TURN_WHILE_FALLING))
+ target->SetCanTurnWhileFalling(true, true);
+
if (target->HasAura(SPELL_DH_DOUBLE_JUMP))
target->SetDoubleJump(true, true);
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 7b6355b4a80..75222e078b0 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -15646,8 +15646,8 @@ bool Unit::SetCanTransitionBetweenSwimAndFly(bool enable)
static OpcodeServer const swimToFlyTransOpcodeTable[2] =
{
- SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY,
- SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY
+ SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY,
+ SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY
};
if (Player* playerMover = GetPlayerMover())
@@ -15665,6 +15665,40 @@ bool Unit::SetCanTransitionBetweenSwimAndFly(bool enable)
return true;
}
+bool Unit::SetCanTurnWhileFalling(bool enable, bool packetOnly /*= false*/)
+{
+ if (!packetOnly)
+ {
+ if (enable == HasExtraUnitMovementFlag(MOVEMENTFLAG2_CAN_TURN_WHILE_FALLING))
+ return false;
+
+ if (enable)
+ AddExtraUnitMovementFlag(MOVEMENTFLAG2_CAN_TURN_WHILE_FALLING);
+ else
+ RemoveExtraUnitMovementFlag(MOVEMENTFLAG2_CAN_TURN_WHILE_FALLING);
+ }
+
+ static OpcodeServer const canTurnWhileFallingOpcodeTable[2] =
+ {
+ SMSG_MOVE_UNSET_CAN_TURN_WHILE_FALLING,
+ SMSG_MOVE_SET_CAN_TURN_WHILE_FALLING
+ };
+
+ if (Player* playerMover = GetPlayerMover())
+ {
+ WorldPackets::Movement::MoveSetFlag packet(canTurnWhileFallingOpcodeTable[enable]);
+ packet.MoverGUID = GetGUID();
+ packet.SequenceIndex = m_movementCounter++;
+ playerMover->SendDirectMessage(packet.Write());
+
+ WorldPackets::Movement::MoveUpdate moveUpdate;
+ moveUpdate.movementInfo = &m_movementInfo;
+ SendMessageToSet(moveUpdate.Write(), playerMover);
+ }
+
+ return true;
+}
+
bool Unit::SetDoubleJump(bool enable, bool packetOnly /*= false*/)
{
if (!packetOnly)
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 030149d1f54..1cc7536ea8c 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -863,7 +863,7 @@ enum MovementFlags2
MOVEMENTFLAG2_UNK9 = 0x00000200,
MOVEMENTFLAG2_CAN_SWIM_TO_FLY_TRANS = 0x00000400,
MOVEMENTFLAG2_UNK11 = 0x00000800,
- MOVEMENTFLAG2_UNK12 = 0x00001000,
+ MOVEMENTFLAG2_CAN_TURN_WHILE_FALLING = 0x00001000,
MOVEMENTFLAG2_INTERPOLATED_MOVEMENT = 0x00002000,
MOVEMENTFLAG2_INTERPOLATED_TURNING = 0x00004000,
MOVEMENTFLAG2_INTERPOLATED_PITCHING = 0x00008000,
@@ -1697,6 +1697,7 @@ class TC_GAME_API Unit : public WorldObject
bool SetHover(bool enable, bool packetOnly = false);
bool SetCollision(bool disable);
bool SetCanTransitionBetweenSwimAndFly(bool enable);
+ bool SetCanTurnWhileFalling(bool enable, bool packetOnly = false);
bool SetDoubleJump(bool enable, bool packetOnly = false);
void SendSetVehicleRecId(uint32 vehicleId);
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index f9e8e740bbc..c242d9ee929 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -1363,7 +1363,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ROOT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ACTIVE_MOVER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_FLY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_TURN_WHILE_FALLING, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_TURN_WHILE_FALLING, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_COLLISION_HEIGHT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_COMPOUND_STATE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_FEATHER_FALL, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h
index 5396a06d941..6273ede6ccd 100644
--- a/src/server/game/Spells/Auras/SpellAuraDefines.h
+++ b/src/server/game/Spells/Auras/SpellAuraDefines.h
@@ -466,7 +466,7 @@ enum AuraType
SPELL_AURA_406 = 406,
SPELL_AURA_MOD_FEAR_2 = 407, // NYI
SPELL_AURA_408 = 408,
- SPELL_AURA_409 = 409,
+ SPELL_AURA_CAN_TURN_WHILE_FALLING = 409,
SPELL_AURA_410 = 410,
SPELL_AURA_MOD_MAX_CHARGES = 411,
SPELL_AURA_412 = 412,
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index 6b35400213c..0b4bdffe334 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -468,7 +468,7 @@ pAuraEffectHandler AuraEffectHandler[TOTAL_AURAS]=
&AuraEffect::HandleNULL, //406
&AuraEffect::HandleNULL, //407 SPELL_AURA_MOD_FEAR_2
&AuraEffect::HandleNULL, //408
- &AuraEffect::HandleNULL, //409
+ &AuraEffect::HandleAuraCanTurnWhileFalling, //409 SPELL_AURA_CAN_TURN_WHILE_FALLING
&AuraEffect::HandleNULL, //410
&AuraEffect::HandleNoImmediateEffect, //411 SPELL_AURA_MOD_MAX_CHARGES implemented in SpellHistory::GetMaxCharges
&AuraEffect::HandleNULL, //412
@@ -2787,6 +2787,23 @@ void AuraEffect::HandleForceMoveForward(AuraApplication const* aurApp, uint8 mod
}
}
+void AuraEffect::HandleAuraCanTurnWhileFalling(AuraApplication const* aurApp, uint8 mode, bool apply) const
+{
+ if (!(mode & AURA_EFFECT_HANDLE_SEND_FOR_CLIENT_MASK))
+ return;
+
+ Unit* target = aurApp->GetTarget();
+
+ if (!apply)
+ {
+ // do not remove unit flag if there are more than this auraEffect of that kind on unit on unit
+ if (target->HasAuraType(GetAuraType()))
+ return;
+ }
+
+ target->SetCanTurnWhileFalling(apply);
+}
+
/****************************/
/*** THREAT ***/
/****************************/
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h
index 0691bfd7de6..04597a76099 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.h
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.h
@@ -182,6 +182,7 @@ class TC_GAME_API AuraEffect
void HandleAuraHover(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleWaterBreathing(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleForceMoveForward(AuraApplication const* aurApp, uint8 mode, bool apply) const;
+ void HandleAuraCanTurnWhileFalling(AuraApplication const* aurApp, uint8 mode, bool apply) const;
// threat
void HandleModThreat(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleAuraModTotalThreat(AuraApplication const* aurApp, uint8 mode, bool apply) const;