Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/server/game/Entities/Object/BaseEntity.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
12 changes: 12 additions & 0 deletions src/server/game/Entities/Unit/Unit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14297,6 +14297,18 @@ void Unit::SetPlayHoverAnim(bool enable, bool sendUpdate /*= true*/)
SendMessageToSet(data.Write(), true);
}

void Unit::SetGravity(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());
}
}

void Unit::CalculateHoverHeight()
{
float hoverHeight = DEFAULT_PLAYER_HOVER_HEIGHT;
Expand Down
2 changes: 2 additions & 0 deletions src/server/game/Entities/Unit/Unit.h
Original file line number Diff line number Diff line change
Expand Up @@ -1193,6 +1193,8 @@ class TC_GAME_API Unit : public WorldObject
void ApplyInertia(int32 id, Milliseconds duration);
void RemoveInertia(int32 id);

void SetGravity(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);
Expand Down
19 changes: 19 additions & 0 deletions src/server/game/Handlers/MovementHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -890,6 +890,25 @@ void WorldSession::HandleMoveRemoveInertiaAck(WorldPackets::Movement::MoveRemove
mover->SendMessageToSet(updateRemoveInertia.Write(), false);
}

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);
}

void WorldSession::HandleMoveSplineDoneOpcode(WorldPackets::Movement::MoveSplineDone& moveSplineDone)
{
Unit* mover = ValidateAndGetUnitBeingMoved(moveSplineDone.Status.guid, moveSplineDone.GetOpcode(), false);
Expand Down
23 changes: 23 additions & 0 deletions src/server/game/Server/Packets/MovementPackets.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1242,4 +1242,27 @@ WorldPacket const* MoveUpdateRemoveInertia::Write()

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;
Comment thread
aquadeus marked this conversation as resolved.
_worldPacket << float(GravityModifier);

return &_worldPacket;
}
}
34 changes: 34 additions & 0 deletions src/server/game/Server/Packets/MovementPackets.h
Original file line number Diff line number Diff line change
Expand Up @@ -829,6 +829,40 @@ namespace WorldPackets
int32 InertiaID = 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 = 0.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 = 0.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 = 0.0f;
};

ByteBuffer& operator>>(ByteBuffer& data, MovementAck& ack);
}
}
Expand Down
6 changes: 3 additions & 3 deletions src/server/game/Server/Protocol/Opcodes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
1 change: 1 addition & 0 deletions src/server/game/Server/WorldSession.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1652,6 +1652,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
Expand Down
3 changes: 3 additions & 0 deletions src/server/game/Server/WorldSession.h
Original file line number Diff line number Diff line change
Expand Up @@ -561,6 +561,7 @@ namespace WorldPackets
class MoveApplyInertiaAck;
class MoveRemoveInertiaAck;
class MoveInitActiveMoverComplete;
class MoveForceGravityModifierChangeAck;
}

namespace NPC
Expand Down Expand Up @@ -1315,6 +1316,8 @@ class TC_GAME_API WorldSession
void HandleMoveApplyInertiaAck(WorldPackets::Movement::MoveApplyInertiaAck& moveApplyInertiaAck);
void HandleMoveRemoveInertiaAck(WorldPackets::Movement::MoveRemoveInertiaAck& moveRemoveInertiaAck);

void HandleMoveForceGravityModifierChangeAck(WorldPackets::Movement::MoveForceGravityModifierChangeAck& moveForceGravityModifierChangeAck);

void HandleRepopRequest(WorldPackets::Misc::RepopRequest& packet);
void HandleAutostoreLootItemOpcode(WorldPackets::Loot::LootItem& packet);
void HandleLootMoneyOpcode(WorldPackets::Loot::LootMoney& packet);
Expand Down
2 changes: 1 addition & 1 deletion src/server/game/Spells/Auras/SpellAuraDefines.h
Original file line number Diff line number Diff line change
Expand Up @@ -728,7 +728,7 @@ enum AuraType : uint32
SPELL_AURA_641 = 641,
SPELL_AURA_642 = 642,
SPELL_AURA_MOD_RANGED_ATTACK_SPEED_FLAT = 643, // NYI
SPELL_AURA_MOD_GRAVITY = 644, // NYI
SPELL_AURA_MOD_GRAVITY = 644,
SPELL_AURA_645 = 645,
SPELL_AURA_ADD_FLAT_PVP_MODIFIER = 646,
SPELL_AURA_ADD_PCT_PVP_MODIFIER = 647,
Expand Down
16 changes: 15 additions & 1 deletion src/server/game/Spells/Auras/SpellAuraEffects.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -6238,6 +6238,20 @@ void AuraEffect::HandleEnableAltPower(AuraApplication const* aurApp, uint8 mode,
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();
float amount = target->GetTotalAuraModifier(SPELL_AURA_MOD_GRAVITY);

if (amount <= 0.0f)
amount = 1.0f;

target->SetGravity(amount);
}

void AuraEffect::HandleModSpellCategoryCooldown(AuraApplication const* aurApp, uint8 mode, bool apply) const
{
if (!(mode & AURA_EFFECT_HANDLE_REAL))
Expand Down
1 change: 1 addition & 0 deletions src/server/game/Spells/Auras/SpellAuraEffects.h
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,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 HandleModSpellCategoryCooldown(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleModRecoveryRate(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleModRecoveryRateBySpellLabel(AuraApplication const* aurApp, uint8 mode, bool apply) const;
Expand Down
Loading