diff options
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 3 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 34 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 5 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.h | 4 |
5 files changed, 49 insertions, 1 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index d18883fab96..7193c459c2b 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -23561,6 +23561,9 @@ void Player::SendAurasForTarget(Unit* target) const if (target->HasAuraType(SPELL_AURA_HOVER)) target->SetHover(true, true); + if (target->HasAura(SPELL_DH_DOUBLE_JUMP)) + target->SetDoubleJump(true, true); + Unit::VisibleAuraContainer const& visibleAuras = target->GetVisibleAuras(); WorldPackets::Spells::AuraUpdate update; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 7c71c6de367..089b9c50ab1 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -15689,6 +15689,40 @@ bool Unit::SetCanTransitionBetweenSwimAndFly(bool enable) return true; } +bool Unit::SetDoubleJump(bool enable, bool packetOnly /*= false*/) +{ + if (!packetOnly) + { + if (enable == HasExtraUnitMovementFlag(MOVEMENTFLAG2_DOUBLE_JUMP)) + return false; + + if (enable) + AddExtraUnitMovementFlag(MOVEMENTFLAG2_DOUBLE_JUMP); + else + RemoveExtraUnitMovementFlag(MOVEMENTFLAG2_DOUBLE_JUMP); + } + + static OpcodeServer const doubleJumpOpcodeTable[2] = + { + SMSG_MOVE_DISABLE_DOUBLE_JUMP, + SMSG_MOVE_ENABLE_DOUBLE_JUMP + }; + + if (Player* playerMover = GetPlayerMover()) + { + WorldPackets::Movement::MoveSetFlag packet(doubleJumpOpcodeTable[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; +} + void Unit::SendSetVehicleRecId(uint32 vehicleId) { if (Player* player = ToPlayer()) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index a45fb495086..06ca24c6a65 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -32,6 +32,7 @@ #define WORLD_TRIGGER 12999 #define ARTIFACTS_ALL_WEAPONS_GENERAL_WEAPON_EQUIPPED_PASSIVE 197886 +#define SPELL_DH_DOUBLE_JUMP 196055 enum SpellInterruptFlags { @@ -865,7 +866,8 @@ enum MovementFlags2 MOVEMENTFLAG2_UNK12 = 0x00001000, MOVEMENTFLAG2_INTERPOLATED_MOVEMENT = 0x00002000, MOVEMENTFLAG2_INTERPOLATED_TURNING = 0x00004000, - MOVEMENTFLAG2_INTERPOLATED_PITCHING = 0x00008000 + MOVEMENTFLAG2_INTERPOLATED_PITCHING = 0x00008000, + MOVEMENTFLAG2_DOUBLE_JUMP = 0x00010000 }; enum UnitTypeMask @@ -1696,6 +1698,7 @@ class TC_GAME_API Unit : public WorldObject bool SetHover(bool enable, bool packetOnly = false); bool SetCollision(bool disable); bool SetCanTransitionBetweenSwimAndFly(bool enable); + bool SetDoubleJump(bool enable, bool packetOnly = false); void SendSetVehicleRecId(uint32 vehicleId); void SetInFront(WorldObject const* target); diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 650ae9fc2ca..e1812ecb971 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -505,6 +505,8 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_MOVE_CHANGE_VEHICLE_SEATS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMoveChangeVehicleSeats); DEFINE_HANDLER(CMSG_MOVE_CHARM_TELEPORT_CHEAT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_MOVE_DISMISS_VEHICLE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMoveDismissVehicle); + DEFINE_HANDLER(CMSG_MOVE_DOUBLE_JUMP, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes); + DEFINE_HANDLER(CMSG_MOVE_ENABLE_DOUBLE_JUMP_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage); DEFINE_HANDLER(CMSG_MOVE_ENABLE_SWIM_TO_FLY_TRANS_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage); DEFINE_HANDLER(CMSG_MOVE_FALL_LAND, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes); DEFINE_HANDLER(CMSG_MOVE_FALL_RESET, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes); @@ -1349,9 +1351,11 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOUNT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_APPLY_MOVEMENT_FORCE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_DISABLE_COLLISION, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_DISABLE_DOUBLE_JUMP, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_DISABLE_GRAVITY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ENABLE_COLLISION, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ENABLE_DOUBLE_JUMP, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ENABLE_GRAVITY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_KNOCK_BACK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index ad20b33ad34..3784413e39b 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -420,6 +420,8 @@ enum OpcodeClient : uint32 CMSG_MOVE_CHANGE_VEHICLE_SEATS = 0x3A31, CMSG_MOVE_CHARM_TELEPORT_CHEAT = 0x39F6, CMSG_MOVE_DISMISS_VEHICLE = 0x3A30, + CMSG_MOVE_DOUBLE_JUMP = 0x39EB, + CMSG_MOVE_ENABLE_DOUBLE_JUMP_ACK = 0x3A1B, CMSG_MOVE_ENABLE_SWIM_TO_FLY_TRANS_ACK = 0x3A21, CMSG_MOVE_FALL_LAND = 0x39F9, CMSG_MOVE_FALL_RESET = 0x3A16, @@ -1257,9 +1259,11 @@ enum OpcodeServer : uint32 SMSG_MOUNT_RESULT = 0x257A, SMSG_MOVE_APPLY_MOVEMENT_FORCE = 0x2DE1, SMSG_MOVE_DISABLE_COLLISION = 0x2DDD, + SMSG_MOVE_DISABLE_DOUBLE_JUMP = 0x2DCB, SMSG_MOVE_DISABLE_GRAVITY = 0x2DDB, SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x2DDA, SMSG_MOVE_ENABLE_COLLISION = 0x2DDE, + SMSG_MOVE_ENABLE_DOUBLE_JUMP = 0x2DCA, SMSG_MOVE_ENABLE_GRAVITY = 0x2DDC, SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x2DD9, SMSG_MOVE_KNOCK_BACK = 0x2DD1, |