aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-10-07 16:08:13 +0200
committerShauren <shauren.trinity@gmail.com>2024-10-07 16:08:13 +0200
commit43c7965d6b97a919ddd7e97a1f6e3f5750553f09 (patch)
tree0d32a61c3b2a79766e8885a0c957b21bff30080e
parent9c6a5947de5e27755ec81f530882d6d1171fb97b (diff)
Core/Movement: Store adv flying speeds instead of hardcoding them in SMSG_UPDATE_OBJECT and enable packets modifying them
-rw-r--r--src/server/game/Entities/Object/Object.cpp34
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp117
-rw-r--r--src/server/game/Entities/Unit/Unit.h9
-rw-r--r--src/server/game/Entities/Unit/UnitDefines.h23
-rw-r--r--src/server/game/Handlers/MovementHandler.cpp10
-rw-r--r--src/server/game/Server/Packets/MovementPackets.cpp24
-rw-r--r--src/server/game/Server/Packets/MovementPackets.h37
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp52
-rw-r--r--src/server/game/Server/WorldSession.h3
9 files changed, 266 insertions, 43 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 069db552f3f..1cc56f3969f 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -372,23 +372,23 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe
*data << float(1.0f); // MovementForcesModMagnitude
}
- *data << float(2.0f); // advFlyingAirFriction
- *data << float(65.0f); // advFlyingMaxVel
- *data << float(1.0f); // advFlyingLiftCoefficient
- *data << float(3.0f); // advFlyingDoubleJumpVelMod
- *data << float(10.0f); // advFlyingGlideStartMinHeight
- *data << float(100.0f); // advFlyingAddImpulseMaxSpeed
- *data << float(90.0f); // advFlyingMinBankingRate
- *data << float(140.0f); // advFlyingMaxBankingRate
- *data << float(180.0f); // advFlyingMinPitchingRateDown
- *data << float(360.0f); // advFlyingMaxPitchingRateDown
- *data << float(90.0f); // advFlyingMinPitchingRateUp
- *data << float(270.0f); // advFlyingMaxPitchingRateUp
- *data << float(30.0f); // advFlyingMinTurnVelocityThreshold
- *data << float(80.0f); // advFlyingMaxTurnVelocityThreshold
- *data << float(2.75f); // advFlyingSurfaceFriction
- *data << float(7.0f); // advFlyingOverMaxDeceleration
- *data << float(0.4f); // advFlyingLaunchSpeedCoefficient
+ *data << float(unit->GetAdvFlyingSpeed(ADV_FLYING_AIR_FRICTION));
+ *data << float(unit->GetAdvFlyingSpeed(ADV_FLYING_MAX_VEL));
+ *data << float(unit->GetAdvFlyingSpeed(ADV_FLYING_LIFT_COEFFICIENT));
+ *data << float(unit->GetAdvFlyingSpeed(ADV_FLYING_DOUBLE_JUMP_VEL_MOD));
+ *data << float(unit->GetAdvFlyingSpeed(ADV_FLYING_GLIDE_START_MIN_HEIGHT));
+ *data << float(unit->GetAdvFlyingSpeed(ADV_FLYING_ADD_IMPULSE_MAX_SPEED));
+ *data << float(unit->GetAdvFlyingSpeedMin(ADV_FLYING_BANKING_RATE));
+ *data << float(unit->GetAdvFlyingSpeedMax(ADV_FLYING_BANKING_RATE));
+ *data << float(unit->GetAdvFlyingSpeedMin(ADV_FLYING_PITCHING_RATE_DOWN));
+ *data << float(unit->GetAdvFlyingSpeedMax(ADV_FLYING_PITCHING_RATE_DOWN));
+ *data << float(unit->GetAdvFlyingSpeedMin(ADV_FLYING_PITCHING_RATE_UP));
+ *data << float(unit->GetAdvFlyingSpeedMax(ADV_FLYING_PITCHING_RATE_UP));
+ *data << float(unit->GetAdvFlyingSpeedMin(ADV_FLYING_TURN_VELOCITY_THRESHOLD));
+ *data << float(unit->GetAdvFlyingSpeedMax(ADV_FLYING_TURN_VELOCITY_THRESHOLD));
+ *data << float(unit->GetAdvFlyingSpeed(ADV_FLYING_SURFACE_FRICTION));
+ *data << float(unit->GetAdvFlyingSpeed(ADV_FLYING_OVER_MAX_DECELERATION));
+ *data << float(unit->GetAdvFlyingSpeed(ADV_FLYING_LAUNCH_SPEED_COEFFICIENT));
data->WriteBit(HasSpline);
data->FlushBits();
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 1d003ecc2b1..965568f819f 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -365,6 +365,7 @@ Unit::Unit(bool isWorldObject) :
m_baseSpellCritChance = 5.0f;
m_speed_rate.fill(1.0f);
+ SetFlightCapabilityID(0, false);
// remove aurastates allowing special moves
m_reactiveTimer = { };
@@ -8738,6 +8739,122 @@ void Unit::SetSpeedRate(UnitMoveType mtype, float rate)
}
}
+void Unit::SetFlightCapabilityID(int32 flightCapabilityId, bool clientUpdate)
+{
+ if (flightCapabilityId && !sFlightCapabilityStore.HasRecord(flightCapabilityId))
+ return;
+
+ SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::FlightCapabilityID), flightCapabilityId);
+
+ UpdateAdvFlyingSpeed(ADV_FLYING_AIR_FRICTION, clientUpdate);
+ UpdateAdvFlyingSpeed(ADV_FLYING_MAX_VEL, clientUpdate);
+ UpdateAdvFlyingSpeed(ADV_FLYING_LIFT_COEFFICIENT, clientUpdate);
+ UpdateAdvFlyingSpeed(ADV_FLYING_DOUBLE_JUMP_VEL_MOD, clientUpdate);
+ UpdateAdvFlyingSpeed(ADV_FLYING_GLIDE_START_MIN_HEIGHT, clientUpdate);
+ UpdateAdvFlyingSpeed(ADV_FLYING_ADD_IMPULSE_MAX_SPEED, clientUpdate);
+ UpdateAdvFlyingSpeed(ADV_FLYING_BANKING_RATE, clientUpdate);
+ UpdateAdvFlyingSpeed(ADV_FLYING_PITCHING_RATE_DOWN, clientUpdate);
+ UpdateAdvFlyingSpeed(ADV_FLYING_PITCHING_RATE_UP, clientUpdate);
+ UpdateAdvFlyingSpeed(ADV_FLYING_TURN_VELOCITY_THRESHOLD, clientUpdate);
+ UpdateAdvFlyingSpeed(ADV_FLYING_SURFACE_FRICTION, clientUpdate);
+ UpdateAdvFlyingSpeed(ADV_FLYING_OVER_MAX_DECELERATION, clientUpdate);
+ UpdateAdvFlyingSpeed(ADV_FLYING_LAUNCH_SPEED_COEFFICIENT, clientUpdate);
+}
+
+void Unit::UpdateAdvFlyingSpeed(AdvFlyingRateTypeSingle speedType, bool clientUpdate)
+{
+ FlightCapabilityEntry const* flightCapabilityEntry = sFlightCapabilityStore.LookupEntry(GetFlightCapabilityID());
+ if (!flightCapabilityEntry)
+ flightCapabilityEntry = sFlightCapabilityStore.AssertEntry(1);
+
+ auto [opcode, newValue] = [&]
+ {
+ switch (speedType)
+ {
+ case ADV_FLYING_AIR_FRICTION:
+ return std::pair(SMSG_MOVE_SET_ADV_FLYING_AIR_FRICTION, flightCapabilityEntry->AirFriction);
+ case ADV_FLYING_MAX_VEL:
+ return std::pair(SMSG_MOVE_SET_ADV_FLYING_MAX_VEL, flightCapabilityEntry->MaxVel);
+ case ADV_FLYING_LIFT_COEFFICIENT:
+ return std::pair(SMSG_MOVE_SET_ADV_FLYING_LIFT_COEFFICIENT, flightCapabilityEntry->LiftCoefficient);
+ case ADV_FLYING_DOUBLE_JUMP_VEL_MOD:
+ return std::pair(SMSG_MOVE_SET_ADV_FLYING_DOUBLE_JUMP_VEL_MOD, flightCapabilityEntry->DoubleJumpVelMod);
+ case ADV_FLYING_GLIDE_START_MIN_HEIGHT:
+ return std::pair(SMSG_MOVE_SET_ADV_FLYING_GLIDE_START_MIN_HEIGHT, flightCapabilityEntry->GlideStartMinHeight);
+ case ADV_FLYING_ADD_IMPULSE_MAX_SPEED:
+ return std::pair(SMSG_MOVE_SET_ADV_FLYING_ADD_IMPULSE_MAX_SPEED, flightCapabilityEntry->AddImpulseMaxSpeed);
+ case ADV_FLYING_SURFACE_FRICTION:
+ return std::pair(SMSG_MOVE_SET_ADV_FLYING_SURFACE_FRICTION, flightCapabilityEntry->SurfaceFriction);
+ case ADV_FLYING_OVER_MAX_DECELERATION:
+ return std::pair(SMSG_MOVE_SET_ADV_FLYING_OVER_MAX_DECELERATION, flightCapabilityEntry->OverMaxDeceleration);
+ case ADV_FLYING_LAUNCH_SPEED_COEFFICIENT:
+ return std::pair(SMSG_MOVE_SET_ADV_FLYING_LAUNCH_SPEED_COEFFICIENT, flightCapabilityEntry->LaunchSpeedCoefficient);
+ default:
+ return std::pair<OpcodeServer, float>();
+ }
+ }();
+
+ if (m_advFlyingSpeed[speedType] == newValue)
+ return;
+
+ m_advFlyingSpeed[speedType] = newValue;
+
+ if (!clientUpdate)
+ return;
+
+ if (Player* playerMover = Unit::ToPlayer(GetUnitBeingMoved()))
+ {
+ WorldPackets::Movement::SetAdvFlyingSpeed selfpacket(opcode);
+ selfpacket.MoverGUID = GetGUID();
+ selfpacket.SequenceIndex = m_movementCounter++;
+ selfpacket.Speed = newValue;
+ playerMover->GetSession()->SendPacket(selfpacket.Write());
+ }
+}
+
+void Unit::UpdateAdvFlyingSpeed(AdvFlyingRateTypeRange speedType, bool clientUpdate)
+{
+ FlightCapabilityEntry const* flightCapabilityEntry = sFlightCapabilityStore.LookupEntry(GetFlightCapabilityID());
+ if (!flightCapabilityEntry)
+ flightCapabilityEntry = sFlightCapabilityStore.AssertEntry(1);
+
+ auto [opcode, min, max] = [&]
+ {
+ switch (speedType)
+ {
+ case ADV_FLYING_BANKING_RATE:
+ return std::tuple(SMSG_MOVE_SET_ADV_FLYING_BANKING_RATE, flightCapabilityEntry->BankingRateMin, flightCapabilityEntry->BankingRateMax);
+ case ADV_FLYING_PITCHING_RATE_DOWN:
+ return std::tuple(SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_DOWN, flightCapabilityEntry->PitchingRateDownMin, flightCapabilityEntry->PitchingRateDownMax);
+ case ADV_FLYING_PITCHING_RATE_UP:
+ return std::tuple(SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_UP, flightCapabilityEntry->PitchingRateUpMin, flightCapabilityEntry->PitchingRateUpMax);
+ case ADV_FLYING_TURN_VELOCITY_THRESHOLD:
+ return std::tuple(SMSG_MOVE_SET_ADV_FLYING_TURN_VELOCITY_THRESHOLD, flightCapabilityEntry->TurnVelocityThresholdMin, flightCapabilityEntry->TurnVelocityThresholdMax);
+ default:
+ return std::tuple<OpcodeServer, float, float>();
+ }
+ }();
+
+ if (m_advFlyingSpeed[speedType] == min && m_advFlyingSpeed[speedType + 1] == max)
+ return;
+
+ m_advFlyingSpeed[speedType] = min;
+ m_advFlyingSpeed[speedType + 1] = max;
+
+ if (!clientUpdate)
+ return;
+
+ if (Player* playerMover = Unit::ToPlayer(GetUnitBeingMoved()))
+ {
+ WorldPackets::Movement::SetAdvFlyingSpeedRange selfpacket(opcode);
+ selfpacket.MoverGUID = GetGUID();
+ selfpacket.SequenceIndex = m_movementCounter++;
+ selfpacket.SpeedMin = min;
+ selfpacket.SpeedMax = max;
+ playerMover->GetSession()->SendPacket(selfpacket.Write());
+ }
+}
+
void Unit::RemoveAllFollowers()
{
while (!m_followingMe.empty())
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index ba418567d3f..03564f43315 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1662,6 +1662,14 @@ class TC_GAME_API Unit : public WorldObject
void SetSpeed(UnitMoveType mtype, float newValue);
void SetSpeedRate(UnitMoveType mtype, float rate);
+ int32 GetFlightCapabilityID() const { return m_unitData->FlightCapabilityID; }
+ void SetFlightCapabilityID(int32 flightCapabilityId, bool clientUpdate);
+ float GetAdvFlyingSpeed(AdvFlyingRateTypeSingle speedType) const { return m_advFlyingSpeed[speedType]; }
+ float GetAdvFlyingSpeedMin(AdvFlyingRateTypeRange speedType) const { return m_advFlyingSpeed[speedType]; }
+ float GetAdvFlyingSpeedMax(AdvFlyingRateTypeRange speedType) const { return m_advFlyingSpeed[speedType + 1]; }
+ void UpdateAdvFlyingSpeed(AdvFlyingRateTypeSingle speedType, bool clientUpdate);
+ void UpdateAdvFlyingSpeed(AdvFlyingRateTypeRange speedType, bool clientUpdate);
+
void FollowerAdded(AbstractFollower* f) { m_followingMe.insert(f); }
void FollowerRemoved(AbstractFollower* f) { m_followingMe.erase(f); }
void RemoveAllFollowers();
@@ -1911,6 +1919,7 @@ class TC_GAME_API Unit : public WorldObject
Trinity::Containers::FlatSet<AuraApplication*, VisibleAuraSlotCompare> m_visibleAurasToUpdate;
std::array<float, MAX_MOVE_TYPE> m_speed_rate;
+ std::array<float, ADV_FLYING_MAX_SPEED_TYPE> m_advFlyingSpeed;
Unit* m_unitMovedByMe; // only ever set for players, and only for direct client control
Player* m_playerMovingMe; // only set for direct client control (possess effects, vehicles and similar)
diff --git a/src/server/game/Entities/Unit/UnitDefines.h b/src/server/game/Entities/Unit/UnitDefines.h
index 2225e0f14a7..0c2c314e167 100644
--- a/src/server/game/Entities/Unit/UnitDefines.h
+++ b/src/server/game/Entities/Unit/UnitDefines.h
@@ -127,6 +127,29 @@ enum UnitMoveType : uint8
#define MAX_MOVE_TYPE 9
+enum AdvFlyingRateTypeSingle : uint8
+{
+ ADV_FLYING_AIR_FRICTION = 0,
+ ADV_FLYING_MAX_VEL = 1,
+ ADV_FLYING_LIFT_COEFFICIENT = 2,
+ ADV_FLYING_DOUBLE_JUMP_VEL_MOD = 3,
+ ADV_FLYING_GLIDE_START_MIN_HEIGHT = 4,
+ ADV_FLYING_ADD_IMPULSE_MAX_SPEED = 5,
+ ADV_FLYING_SURFACE_FRICTION = 14,
+ ADV_FLYING_OVER_MAX_DECELERATION = 15,
+ ADV_FLYING_LAUNCH_SPEED_COEFFICIENT = 16
+};
+
+enum AdvFlyingRateTypeRange : uint8
+{
+ ADV_FLYING_BANKING_RATE = 6,
+ ADV_FLYING_PITCHING_RATE_DOWN = 8,
+ ADV_FLYING_PITCHING_RATE_UP = 10,
+ ADV_FLYING_TURN_VELOCITY_THRESHOLD = 12
+};
+
+#define ADV_FLYING_MAX_SPEED_TYPE 17
+
enum DamageEffectType : uint8
{
DIRECT_DAMAGE = 0, // used for normal weapon damage (not for class abilities or spells)
diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp
index 49878841752..15fd14491a2 100644
--- a/src/server/game/Handlers/MovementHandler.cpp
+++ b/src/server/game/Handlers/MovementHandler.cpp
@@ -584,6 +584,16 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPackets::Movement::MovementSpe
}
}
+void WorldSession::HandleSetAdvFlyingSpeedAck(WorldPackets::Movement::MovementSpeedAck& speedAck)
+{
+ GetPlayer()->ValidateMovementInfo(&speedAck.Ack.Status);
+}
+
+void WorldSession::HandleSetAdvFlyingSpeedRangeAck(WorldPackets::Movement::MovementSpeedRangeAck& speedRangeAck)
+{
+ GetPlayer()->ValidateMovementInfo(&speedRangeAck.Ack.Status);
+}
+
void WorldSession::HandleSetActiveMoverOpcode(WorldPackets::Movement::SetActiveMover& packet)
{
if (GetPlayer()->IsInWorld())
diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp
index 242a0c0594b..b28ce65e032 100644
--- a/src/server/game/Server/Packets/MovementPackets.cpp
+++ b/src/server/game/Server/Packets/MovementPackets.cpp
@@ -626,6 +626,23 @@ WorldPacket const* WorldPackets::Movement::MoveUpdateSpeed::Write()
return &_worldPacket;
}
+WorldPacket const* WorldPackets::Movement::SetAdvFlyingSpeed::Write()
+{
+ _worldPacket << MoverGUID;
+ _worldPacket << uint32(SequenceIndex);
+ _worldPacket << float(Speed);
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Movement::SetAdvFlyingSpeedRange::Write()
+{
+ _worldPacket << MoverGUID;
+ _worldPacket << uint32(SequenceIndex);
+ _worldPacket << float(SpeedMin);
+ _worldPacket << float(SpeedMax);
+ return &_worldPacket;
+}
+
WorldPacket const* WorldPackets::Movement::MoveSplineSetFlag::Write()
{
_worldPacket << MoverGUID;
@@ -815,6 +832,13 @@ void WorldPackets::Movement::MovementSpeedAck::Read()
_worldPacket >> Speed;
}
+void WorldPackets::Movement::MovementSpeedRangeAck::Read()
+{
+ _worldPacket >> Ack;
+ _worldPacket >> SpeedMin;
+ _worldPacket >> SpeedMax;
+}
+
void WorldPackets::Movement::SetActiveMover::Read()
{
_worldPacket >> ActiveMover;
diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h
index ed05e244c19..48c5c2aab38 100644
--- a/src/server/game/Server/Packets/MovementPackets.h
+++ b/src/server/game/Server/Packets/MovementPackets.h
@@ -212,6 +212,31 @@ namespace WorldPackets
float Speed = 1.0f;
};
+ class SetAdvFlyingSpeed final : public ServerPacket
+ {
+ public:
+ explicit SetAdvFlyingSpeed(OpcodeServer opcode) : ServerPacket(opcode, 16 + 4 + 4) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid MoverGUID;
+ uint32 SequenceIndex = 0;
+ float Speed = 1.0f;
+ };
+
+ class SetAdvFlyingSpeedRange final : public ServerPacket
+ {
+ public:
+ explicit SetAdvFlyingSpeedRange(OpcodeServer opcode) : ServerPacket(opcode, 16 + 4 + 4 + 4) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid MoverGUID;
+ uint32 SequenceIndex = 0;
+ float SpeedMin = 1.0f;
+ float SpeedMax = 1.0f;
+ };
+
class MoveSplineSetFlag final : public ServerPacket
{
public:
@@ -438,6 +463,18 @@ namespace WorldPackets
float Speed = 0.0f;
};
+ class MovementSpeedRangeAck final : public ClientPacket
+ {
+ public:
+ MovementSpeedRangeAck(WorldPacket&& packet) : ClientPacket(std::move(packet)) { }
+
+ void Read() override;
+
+ MovementAck Ack;
+ float SpeedMin = 1.0f;
+ float SpeedMax = 1.0f;
+ };
+
class SetActiveMover final : public ClientPacket
{
public:
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 00a82e02720..a75b439fedb 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -652,19 +652,19 @@ void OpcodeTable::InitializeClientOpcodes()
DEFINE_HANDLER(CMSG_MOVE_REMOVE_MOVEMENT_FORCES, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_MOVE_REMOVE_MOVEMENT_FORCE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveRemoveMovementForceAck);
DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLY, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes);
- DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_ADD_IMPULSE_MAX_SPEED_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
- DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_AIR_FRICTION_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
- DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_BANKING_RATE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
- DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_DOUBLE_JUMP_VEL_MOD_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
- DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_GLIDE_START_MIN_HEIGHT_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
- DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_LAUNCH_SPEED_COEFFICIENT_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
- DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_LIFT_COEFFICIENT_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
- DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_MAX_VEL_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
- DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_OVER_MAX_DECELERATION_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
- DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_DOWN_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
- DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_UP_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
- DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_SURFACE_FRICTION_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
- DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_TURN_VELOCITY_THRESHOLD_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_ADD_IMPULSE_MAX_SPEED_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleSetAdvFlyingSpeedAck);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_AIR_FRICTION_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleSetAdvFlyingSpeedAck);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_BANKING_RATE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleSetAdvFlyingSpeedRangeAck);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_DOUBLE_JUMP_VEL_MOD_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleSetAdvFlyingSpeedAck);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_GLIDE_START_MIN_HEIGHT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleSetAdvFlyingSpeedAck);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_LAUNCH_SPEED_COEFFICIENT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleSetAdvFlyingSpeedAck);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_LIFT_COEFFICIENT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleSetAdvFlyingSpeedAck);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_MAX_VEL_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleSetAdvFlyingSpeedAck);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_OVER_MAX_DECELERATION_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleSetAdvFlyingSpeedAck);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_DOWN_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleSetAdvFlyingSpeedRangeAck);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_UP_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleSetAdvFlyingSpeedRangeAck);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_SURFACE_FRICTION_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleSetAdvFlyingSpeedAck);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_TURN_VELOCITY_THRESHOLD_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleSetAdvFlyingSpeedRangeAck);
DEFINE_HANDLER(CMSG_MOVE_SET_CAN_ADV_FLY_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage);
DEFINE_HANDLER(CMSG_MOVE_SET_CAN_FLY_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage);
DEFINE_HANDLER(CMSG_MOVE_SET_CAN_TURN_WHILE_FALLING_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage);
@@ -1698,19 +1698,19 @@ void OpcodeTable::InitializeServerOpcodes()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_REMOVE_MOVEMENT_FORCE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
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_ADV_FLYING_ADD_IMPULSE_MAX_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_AIR_FRICTION, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_BANKING_RATE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_DOUBLE_JUMP_VEL_MOD, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_GLIDE_START_MIN_HEIGHT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_LAUNCH_SPEED_COEFFICIENT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_LIFT_COEFFICIENT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_MAX_VEL, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_OVER_MAX_DECELERATION, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_DOWN, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_UP, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_SURFACE_FRICTION, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_TURN_VELOCITY_THRESHOLD, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_ADD_IMPULSE_MAX_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_AIR_FRICTION, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_BANKING_RATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_DOUBLE_JUMP_VEL_MOD, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_GLIDE_START_MIN_HEIGHT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_LAUNCH_SPEED_COEFFICIENT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_LIFT_COEFFICIENT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_MAX_VEL, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_OVER_MAX_DECELERATION, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_DOWN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_UP, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_SURFACE_FRICTION, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_TURN_VELOCITY_THRESHOLD, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CANT_SWIM, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_ADV_FLY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_FLY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 1c3052a3f8a..6d9534fa625 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -543,6 +543,7 @@ namespace WorldPackets
class MoveTeleportAck;
class MovementAckMessage;
class MovementSpeedAck;
+ class MovementSpeedRangeAck;
class MoveKnockBackAck;
class SetActiveMover;
class MoveSetCollisionHeightAck;
@@ -1259,6 +1260,8 @@ class TC_GAME_API WorldSession
void HandleMoveTeleportAck(WorldPackets::Movement::MoveTeleportAck& packet);
void HandleForceSpeedChangeAck(WorldPackets::Movement::MovementSpeedAck& packet);
+ void HandleSetAdvFlyingSpeedAck(WorldPackets::Movement::MovementSpeedAck& speedAck);
+ void HandleSetAdvFlyingSpeedRangeAck(WorldPackets::Movement::MovementSpeedRangeAck& speedRangeAck);
void HandleSetCollisionHeightAck(WorldPackets::Movement::MoveSetCollisionHeightAck& setCollisionHeightAck);
// Movement forces