diff options
author | Shauren <shauren.trinity@gmail.com> | 2015-11-14 00:20:59 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2015-11-14 00:20:59 +0100 |
commit | 5b1303a795c714aa987b4c9ec536e077b11f5e21 (patch) | |
tree | 84cd0128c01416d02d4dd808af970bf0571760f2 /src | |
parent | d31706b07e5e4a4d632f5deea7076e864b467bbe (diff) |
Core/PacketIO: Updated and enabled a few movement opcodes
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 75 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 5 | ||||
-rw-r--r-- | src/server/game/Server/Packets/BattlefieldPackets.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MovementPackets.cpp | 11 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MovementPackets.h | 14 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 14 |
6 files changed, 79 insertions, 41 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 803ffc06114..bd928270f14 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -14627,38 +14627,14 @@ void Unit::UpdateObjectVisibility(bool forced) void Unit::SendMoveKnockBack(Player* player, float speedXY, float speedZ, float vcos, float vsin) { - ObjectGuid guid = GetGUID(); - WorldPacket data(SMSG_MOVE_KNOCK_BACK, (1+8+4+4+4+4+4)); - data.WriteBit(guid[0]); - data.WriteBit(guid[3]); - data.WriteBit(guid[6]); - data.WriteBit(guid[7]); - data.WriteBit(guid[2]); - data.WriteBit(guid[5]); - data.WriteBit(guid[1]); - data.WriteBit(guid[4]); - - data.WriteByteSeq(guid[1]); - - data << float(vsin); - data << uint32(0); - - data.WriteByteSeq(guid[6]); - data.WriteByteSeq(guid[7]); - - data << float(speedXY); - - data.WriteByteSeq(guid[4]); - data.WriteByteSeq(guid[5]); - data.WriteByteSeq(guid[3]); - - data << float(speedZ); - data << float(vcos); - - data.WriteByteSeq(guid[2]); - data.WriteByteSeq(guid[0]); - - player->GetSession()->SendPacket(&data); + WorldPackets::Movement::MoveKnockBack moveKnockBack; + moveKnockBack.MoverGUID = GetGUID(); + moveKnockBack.SequenceIndex = m_movementCounter++; + moveKnockBack.HorzSpeed = speedXY; + moveKnockBack.VertSpeed = speedZ; + moveKnockBack.Direction.x = vcos; + moveKnockBack.Direction.y = vsin; + player->GetSession()->SendPacket(moveKnockBack.Write()); } void Unit::KnockbackFrom(float x, float y, float speedXY, float speedZ) @@ -16077,6 +16053,41 @@ bool Unit::SetHover(bool enable, bool packetOnly /*= false*/) return true; } +bool Unit::SetCollision(bool disable) +{ + if (disable == HasUnitMovementFlag(MOVEMENTFLAG_DISABLE_COLLISION)) + return false; + + if (disable) + AddUnitMovementFlag(MOVEMENTFLAG_DISABLE_COLLISION); + else + RemoveUnitMovementFlag(MOVEMENTFLAG_DISABLE_COLLISION); + + static OpcodeServer const collisionOpcodeTable[2][2] = + { + { SMSG_MOVE_SPLINE_ENABLE_COLLISION, SMSG_MOVE_ENABLE_COLLISION }, + { SMSG_MOVE_SPLINE_DISABLE_COLLISION, SMSG_MOVE_DISABLE_COLLISION } + }; + + bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER; + + if (player) + { + WorldPackets::Movement::MoveSetFlag packet(collisionOpcodeTable[disable][1]); + packet.MoverGUID = GetGUID(); + packet.SequenceIndex = m_movementCounter++; + SendMessageToSet(packet.Write(), true); + } + else + { + WorldPackets::Movement::MoveSplineSetFlag packet(collisionOpcodeTable[disable][0]); + packet.MoverGUID = GetGUID(); + SendMessageToSet(packet.Write(), true); + } + + 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 88b1dde518c..94eac857b24 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -820,7 +820,7 @@ enum MovementFlags // to properly calculate all movement MOVEMENTFLAG_MASK_CREATURE_ALLOWED = MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_DISABLE_GRAVITY | MOVEMENTFLAG_ROOT | MOVEMENTFLAG_SWIMMING | - MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_WATERWALKING | MOVEMENTFLAG_FALLING_SLOW | MOVEMENTFLAG_HOVER, + MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_WATERWALKING | MOVEMENTFLAG_FALLING_SLOW | MOVEMENTFLAG_HOVER | MOVEMENTFLAG_DISABLE_COLLISION, /// @todo if needed: add more flags to this masks that are exclusive to players MOVEMENTFLAG_MASK_PLAYER_ONLY = @@ -828,7 +828,7 @@ enum MovementFlags /// Movement flags that have change status opcodes associated for players MOVEMENTFLAG_MASK_HAS_PLAYER_STATUS_OPCODE = MOVEMENTFLAG_DISABLE_GRAVITY | MOVEMENTFLAG_ROOT | - MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_WATERWALKING | MOVEMENTFLAG_FALLING_SLOW | MOVEMENTFLAG_HOVER + MOVEMENTFLAG_CAN_FLY | MOVEMENTFLAG_WATERWALKING | MOVEMENTFLAG_FALLING_SLOW | MOVEMENTFLAG_HOVER | MOVEMENTFLAG_DISABLE_COLLISION }; enum MovementFlags2 @@ -1664,6 +1664,7 @@ class Unit : public WorldObject bool SetWaterWalking(bool enable, bool packetOnly = false); bool SetFeatherFall(bool enable, bool packetOnly = false); bool SetHover(bool enable, bool packetOnly = false); + bool SetCollision(bool disable); void SendSetVehicleRecId(uint32 vehicleId); void SetInFront(WorldObject const* target); diff --git a/src/server/game/Server/Packets/BattlefieldPackets.cpp b/src/server/game/Server/Packets/BattlefieldPackets.cpp index 79a1a5e2f31..69bfb990dc5 100644 --- a/src/server/game/Server/Packets/BattlefieldPackets.cpp +++ b/src/server/game/Server/Packets/BattlefieldPackets.cpp @@ -41,6 +41,7 @@ WorldPacket const* WorldPackets::Battlefield::BFMgrQueueInvite::Write() _worldPacket << int32(MapID); _worldPacket << uint32(InstanceID); _worldPacket.WriteBit(Index); + _worldPacket.FlushBits(); return &_worldPacket; } diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index 5b6b9803b4a..33f67842bfe 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -630,6 +630,17 @@ WorldPacket const* WorldPackets::Movement::MoveSetActiveMover::Write() return &_worldPacket; } +WorldPacket const* WorldPackets::Movement::MoveKnockBack::Write() +{ + _worldPacket << MoverGUID; + _worldPacket << uint32(SequenceIndex); + _worldPacket << Direction; + _worldPacket << float(HorzSpeed); + _worldPacket << float(VertSpeed); + + return &_worldPacket; +} + WorldPacket const* WorldPackets::Movement::MoveUpdateKnockBack::Write() { _worldPacket << *movementInfo; diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h index d94911af15f..0a1c30c9d12 100644 --- a/src/server/game/Server/Packets/MovementPackets.h +++ b/src/server/game/Server/Packets/MovementPackets.h @@ -334,6 +334,20 @@ namespace WorldPackets ObjectGuid MoverGUID; }; + class MoveKnockBack final : public ServerPacket + { + public: + MoveKnockBack() : ServerPacket(SMSG_MOVE_KNOCK_BACK, 16 + 8 + 4 + 4 + 4) { } + + WorldPacket const* Write() override; + + ObjectGuid MoverGUID; + G3D::Vector2 Direction; + float HorzSpeed = 0.0f; + uint32 SequenceIndex = 0; + float VertSpeed = 0.0f; + }; + class MoveUpdateKnockBack final : public ServerPacket { public: diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 0fe303cb26f..6acb1cfb3a3 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1337,13 +1337,13 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOTD, STATUS_NEVER, CONNECTION_TYPE_REALM); 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_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_DISABLE_COLLISION, 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_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ENABLE_COLLISION, 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_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_KNOCK_BACK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_REMOVE_MOVEMENT_FORCE, STATUS_UNHANDLED, 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); @@ -1368,9 +1368,9 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_WALK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_WATER_WALK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SKIP_TIME, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_DISABLE_COLLISION, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_DISABLE_COLLISION, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_DISABLE_GRAVITY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_ENABLE_COLLISION, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_ENABLE_COLLISION, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_ENABLE_GRAVITY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_ROOT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_FEATHER_FALL, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1390,8 +1390,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_WALK_MODE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_WALK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_WATER_WALK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_START_SWIM, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_STOP_SWIM, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_START_SWIM, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_STOP_SWIM, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_UNROOT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_UNSET_FLYING, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_UNSET_HOVER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); |