Core/Auras: Implement gravity opcodes and SPELL_AURA_MOD_GRAVITY (#31997)

This commit is contained in:
luis
2026-09-23 20:21:10 -03:00
parent 3b8bbcb859
commit 3a6212a9c2
11 changed files with 119 additions and 5 deletions
@@ -290,7 +290,7 @@ void BaseEntity::BuildMovementUpdate(ByteBuffer& data, CreateObjectBits flags, P
data << uint32(0); // RemoveForcesIDs.size()
data << uint32(0); // MoveIndex
data << float(unit->m_movementInfo.gravityModifier);
data << float(unit->m_movementInfo.gravityModifier); // GravityModifier
//for (std::size_t i = 0; i < RemoveForcesIDs.size(); ++i)
// data << ObjectGuid(RemoveForcesIDs);
+19
View File
@@ -15038,6 +15038,25 @@ void Unit::UpdateMovementForcesModMagnitude()
}
}
void Unit::SetGravityModifier(float gravityModifier)
{
if (Player const* movingPlayer = GetPlayerMovingMe())
{
WorldPackets::Movement::MoveSetGravityModifier setGravityModifier;
setGravityModifier.MoverGUID = GetGUID();
setGravityModifier.SequenceIndex = m_movementCounter++;
setGravityModifier.GravityModifier = gravityModifier;
movingPlayer->SendDirectMessage(setGravityModifier.Write());
}
else
{
WorldPackets::Movement::MoveUpdateSetGravityModifier updateSetGravityModifier;
updateSetGravityModifier.Status = &m_movementInfo;
updateSetGravityModifier.GravityModifier = gravityModifier;
SendMessageToSet(updateSetGravityModifier.Write(), true);
}
}
void Unit::SetPlayHoverAnim(bool enable, bool sendUpdate /*= true*/)
{
if (IsPlayingHoverAnim() == enable)
+2
View File
@@ -1206,6 +1206,8 @@ class TC_GAME_API Unit : public WorldObject
void ApplyInertia(int32 id, Milliseconds duration);
void RemoveInertia(int32 id);
void SetGravityModifier(float gravityModifier);
void SetInFront(WorldObject const* target);
void SetFacingTo(float ori, bool force = true, uint32 movementId = EVENT_FACE);
void SetFacingToObject(WorldObject const* object, bool force = true, uint32 movementId = EVENT_FACE);
@@ -1066,3 +1066,22 @@ void WorldSession::HandleDiscardedTimeSyncAcks(WorldPackets::Movement::Discarded
player->m_movementCounter = 0;
}
void WorldSession::HandleMoveForceGravityModifierChangeAck(WorldPackets::Movement::MoveForceGravityModifierChangeAck& moveForceGravityModifierChangeAck)
{
Unit* mover = ValidateAndGetUnitBeingMoved(moveForceGravityModifierChangeAck.Ack.Status.guid, moveForceGravityModifierChangeAck.GetOpcode(), true);
if (!mover)
return;
if (!ValidateMovementInfo(mover, &moveForceGravityModifierChangeAck.Ack.Status))
return;
moveForceGravityModifierChangeAck.Ack.Status.time = AdjustClientMovementTime(moveForceGravityModifierChangeAck.Ack.Status.time);
mover->m_movementInfo = moveForceGravityModifierChangeAck.Ack.Status;
mover->m_movementInfo.gravityModifier = moveForceGravityModifierChangeAck.Ack.Status.gravityModifier;
WorldPackets::Movement::MoveUpdateSetGravityModifier updateSetGravityModifier;
updateSetGravityModifier.Status = &mover->m_movementInfo;
updateSetGravityModifier.GravityModifier = moveForceGravityModifierChangeAck.GravityModifier;
mover->SendMessageToSet(updateSetGravityModifier.Write(), false);
}
@@ -1263,4 +1263,27 @@ WorldPacket const* MoveInitialObjectUpdateComplete::Write()
_worldPacket << uint32(SequenceIndex);
return &_worldPacket;
}
void MoveForceGravityModifierChangeAck::Read()
{
_worldPacket >> Ack;
_worldPacket >> GravityModifier;
}
WorldPacket const* MoveSetGravityModifier::Write()
{
_worldPacket << MoverGUID;
_worldPacket << uint32(SequenceIndex);
_worldPacket << float(GravityModifier);
return &_worldPacket;
}
WorldPacket const* MoveUpdateSetGravityModifier::Write()
{
_worldPacket << *Status;
_worldPacket << float(GravityModifier);
return &_worldPacket;
}
}
@@ -862,6 +862,40 @@ namespace WorldPackets
uint32 SequenceIndex = 0;
};
class MoveForceGravityModifierChangeAck final : public ClientPacket
{
public:
explicit MoveForceGravityModifierChangeAck(WorldPacket&& packet) : ClientPacket(CMSG_MOVE_FORCE_GRAVITY_MODIFIER_CHANGE_ACK, std::move(packet)) {}
void Read() override;
MovementAck Ack;
float GravityModifier = 1.0f;
};
class MoveSetGravityModifier final : public ServerPacket
{
public:
explicit MoveSetGravityModifier() : ServerPacket(SMSG_MOVE_SET_GRAVITY_MODIFIER, 16 + 4 + 4) {}
WorldPacket const* Write() override;
ObjectGuid MoverGUID;
uint32 SequenceIndex = 0;
float GravityModifier = 1.0f;
};
class MoveUpdateSetGravityModifier final : public ServerPacket
{
public:
explicit MoveUpdateSetGravityModifier() : ServerPacket(SMSG_MOVE_UPDATE_SET_GRAVITY_MODIFIER, sizeof(MovementInfo) + 4) {}
WorldPacket const* Write() override;
MovementInfo* Status = nullptr;
float GravityModifier = 1.0f;
};
ByteBuffer& operator>>(ByteBuffer& data, MovementAck& ack);
}
}
+3 -3
View File
@@ -729,7 +729,7 @@ void OpcodeTable::InitializeClientOpcodes()
DEFINE_HANDLER(CMSG_MOVE_FEATHER_FALL_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage);
DEFINE_HANDLER(CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck);
DEFINE_HANDLER(CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck);
DEFINE_HANDLER(CMSG_MOVE_FORCE_GRAVITY_MODIFIER_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_MOVE_FORCE_GRAVITY_MODIFIER_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveForceGravityModifierChangeAck);
DEFINE_HANDLER(CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck);
DEFINE_HANDLER(CMSG_MOVE_FORCE_ROOT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage);
DEFINE_HANDLER(CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck);
@@ -2014,7 +2014,7 @@ void OpcodeTable::InitializeServerOpcodes()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_FEATHER_FALL, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_FLIGHT_BACK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_FLIGHT_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_GRAVITY_MODIFIER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_GRAVITY_MODIFIER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_HOVERING, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_LAND_WALK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
@@ -2081,7 +2081,7 @@ void OpcodeTable::InitializeServerOpcodes()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_REMOVE_MOVEMENT_FORCE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_RUN_BACK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_RUN_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_SET_GRAVITY_MODIFIER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_SET_GRAVITY_MODIFIER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_SWIM_BACK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_SWIM_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_TELEPORT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+1
View File
@@ -1678,6 +1678,7 @@ uint32 WorldSession::DosProtection::GetMaxPacketCounterAllowed(uint32 opcode) co
case CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK: // not profiled
case CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK: // not profiled
case CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK: // not profiled
case CMSG_MOVE_FORCE_GRAVITY_MODIFIER_CHANGE_ACK:// not profiled
{
// "0" is a magic number meaning there's no limit for the opcode.
// All the opcodes above must cause little CPU usage and no sync/async database queries at all
+2
View File
@@ -902,6 +902,7 @@ namespace WorldPackets
class MoveInitActiveMoverComplete;
class MoveApplyInertiaAck;
class MoveRemoveInertiaAck;
class MoveForceGravityModifierChangeAck;
class DiscardedTimeSyncAcks;
}
@@ -1740,6 +1741,7 @@ public:
void HandleMoveApplyInertiaAck(WorldPackets::Movement::MoveApplyInertiaAck& moveApplyInertiaAck);
void HandleMoveRemoveInertiaAck(WorldPackets::Movement::MoveRemoveInertiaAck& moveRemoveInertiaAck);
void HandleDiscardedTimeSyncAcks(WorldPackets::Movement::DiscardedTimeSyncAcks& packet);
void HandleMoveForceGravityModifierChangeAck(WorldPackets::Movement::MoveForceGravityModifierChangeAck& moveForceGravityModifierChangeAck);
void HandleRepopRequest(WorldPackets::Misc::RepopRequest& packet);
void HandleAutostoreLootItemOpcode(WorldPackets::Loot::LootItem& packet);
@@ -713,7 +713,7 @@ NonDefaultConstructible<pAuraEffectHandler> AuraEffectHandler[TOTAL_AURAS]=
&AuraEffect::HandleNULL, //641
&AuraEffect::HandleNULL, //642
&AuraEffect::HandleNULL, //643 SPELL_AURA_MOD_RANGED_ATTACK_SPEED_FLAT
&AuraEffect::HandleNULL, //644 SPELL_AURA_MOD_GRAVITY
&AuraEffect::HandleModGravity, //644 SPELL_AURA_MOD_GRAVITY
&AuraEffect::HandleNULL, //645
&AuraEffect::HandleNULL, //646 SPELL_AURA_ADD_FLAT_PVP_MODIFIER
&AuraEffect::HandleNULL, //647 SPELL_AURA_ADD_PCT_PVP_MODIFIER
@@ -6480,6 +6480,19 @@ void AuraEffect::HandleEnablePowerBarTimer(AuraApplication const* aurApp, uint8
aurApp->GetTarget()->SetMaxPower(POWER_ALTERNATE_POWER, 0);
}
void AuraEffect::HandleModGravity(AuraApplication const* aurApp, uint8 mode, bool /*apply*/) const
{
if (!(mode & AURA_EFFECT_HANDLE_REAL))
return;
Unit* target = aurApp->GetTarget();
Unit::AuraEffectList const& gravityAuras = target->GetAuraEffectsByType(SPELL_AURA_MOD_GRAVITY);
float amount = std::transform_reduce(gravityAuras.begin(), gravityAuras.end(), 1.0f, std::multiplies(),
[](AuraEffect const* aurEff) { return aurEff->GetAmount(); });
target->SetGravityModifier(std::max(amount, 0.01f));
}
void AuraEffect::HandleModSpellCategoryCooldown(AuraApplication const* aurApp, uint8 mode, bool apply) const
{
if (!(mode & AURA_EFFECT_HANDLE_REAL))
@@ -335,6 +335,7 @@ class TC_GAME_API AuraEffect
void HandleMastery(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleAuraForceWeather(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleEnableAltPower(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleModGravity(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleEnablePowerBarTimer(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleModSpellCategoryCooldown(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleModRecoveryRate(AuraApplication const* aurApp, uint8 mode, bool apply) const;