[0006] Fix most of movement opcodes. Thx Strawberry & Trinity for MovementStatusElements idea.

Signed-off-by: Yaki Khadafi <elsoldollo@gmail.com>
This commit is contained in:
Yaki Khadafi 2012-08-07 20:21:52 +03:00 committed by Antz
parent 0e630a3639
commit 4409188546
14 changed files with 2540 additions and 176 deletions

View file

@ -32,7 +32,7 @@ Corpse::Corpse(CorpseType type) : WorldObject()
m_objectType |= TYPEMASK_CORPSE;
m_objectTypeId = TYPEID_CORPSE;
m_updateFlag = UPDATEFLAG_POSITION;
m_updateFlag = UPDATEFLAG_HAS_POSITION;
m_valuesCount = CORPSE_END;

View file

@ -1033,31 +1033,16 @@ void WorldSession::HandleFeatherFallAck(WorldPacket& recv_data)
{
DEBUG_LOG("WORLD: CMSG_MOVE_FEATHER_FALL_ACK");
// no used
// not used
recv_data.rpos(recv_data.wpos()); // prevent warnings spam
}
void WorldSession::HandleMoveUnRootAck(WorldPacket& recv_data)
{
// no used
// not used
recv_data.rpos(recv_data.wpos()); // prevent warnings spam
/*
ObjectGuid guid;
recv_data >> guid;
// now can skip not our packet
if(_player->GetGUID() != guid)
{
recv_data.rpos(recv_data.wpos()); // prevent warnings spam
return;
}
DEBUG_LOG( "WORLD: CMSG_FORCE_MOVE_UNROOT_ACK" );
recv_data.read_skip<uint32>(); // unk
MovementInfo movementInfo;
ReadMovementInfo(recv_data, &movementInfo);
bitsream packet
*/
}
@ -1066,22 +1051,7 @@ void WorldSession::HandleMoveRootAck(WorldPacket& recv_data)
// no used
recv_data.rpos(recv_data.wpos()); // prevent warnings spam
/*
ObjectGuid guid;
recv_data >> guid;
// now can skip not our packet
if(_player->GetObjectGuid() != guid)
{
recv_data.rpos(recv_data.wpos()); // prevent warnings spam
return;
}
DEBUG_LOG( "WORLD: CMSG_FORCE_MOVE_ROOT_ACK" );
recv_data.read_skip<uint32>(); // unk
MovementInfo movementInfo;
ReadMovementInfo(recv_data, &movementInfo);
bitsream packet
*/
}

View file

@ -266,18 +266,15 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recv_data)
}
/* extract packet */
ObjectGuid guid;
MovementInfo movementInfo;
recv_data >> guid.ReadAsPacked();
recv_data >> movementInfo;
/*----------------*/
if (!VerifyMovementInfo(movementInfo, guid))
if (!VerifyMovementInfo(movementInfo, movementInfo.GetGuid()))
return;
// fall damage generation (ignore in flight case that can be triggered also at lags in moment teleportation to another map).
if (opcode == MSG_MOVE_FALL_LAND && plMover && !plMover->IsTaxiFlying())
if (opcode == CMSG_MOVE_FALL_LAND && plMover && !plMover->IsTaxiFlying())
plMover->HandleFall(movementInfo);
/* process position-change */
@ -286,9 +283,8 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recv_data)
if (plMover)
plMover->UpdateFallInformationIfNeed(movementInfo, opcode);
WorldPacket data(opcode, recv_data.size());
data << mover->GetPackGUID(); // write guid
movementInfo.Write(data); // write data
WorldPacket data(SMSG_PLAYER_MOVE, recv_data.size());
data << movementInfo;
mover->SendMessageToSetExcept(&data, _player);
}

File diff suppressed because it is too large Load diff

View file

@ -383,7 +383,6 @@ void Object::BuildMovementUpdate(ByteBuffer * data, uint16 updateFlags) const
if (hasTransport)
{
ObjectGuid tGuid = unit->m_movementInfo.GetTransportGuid();
uint8 guidBytes[] = { 5, 7, 3, 0, 1, 6, 2, 4 };
data->WriteGuidBytes<5, 7>(tGuid);
*data << unit->m_movementInfo.GetTransportTime();

View file

@ -226,29 +226,29 @@ void InitializeOpcodes()
//OPCODE(CMSG_DESTROY_ITEMS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//OPCODE(SMSG_GAMEOBJECT_CUSTOM_ANIM, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(CMSG_AREATRIGGER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAreaTriggerOpcode );
//OPCODE(MSG_MOVE_START_FORWARD, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(MSG_MOVE_START_BACKWARD, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(MSG_MOVE_STOP, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(MSG_MOVE_START_STRAFE_LEFT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(MSG_MOVE_START_STRAFE_RIGHT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(MSG_MOVE_STOP_STRAFE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(MSG_MOVE_JUMP, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(MSG_MOVE_START_TURN_LEFT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(MSG_MOVE_START_TURN_RIGHT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(MSG_MOVE_STOP_TURN, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(MSG_MOVE_START_PITCH_UP, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(MSG_MOVE_START_PITCH_DOWN, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(MSG_MOVE_STOP_PITCH, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(MSG_MOVE_SET_RUN_MODE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(MSG_MOVE_SET_WALK_MODE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
OPCODE(CMSG_MOVE_START_FORWARD, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
OPCODE(CMSG_MOVE_START_BACKWARD, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
OPCODE(CMSG_MOVE_STOP, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
OPCODE(CMSG_MOVE_START_STRAFE_LEFT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
OPCODE(CMSG_MOVE_START_STRAFE_RIGHT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
OPCODE(CMSG_MOVE_STOP_STRAFE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
OPCODE(CMSG_MOVE_JUMP, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
OPCODE(CMSG_MOVE_START_TURN_LEFT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
OPCODE(CMSG_MOVE_START_TURN_RIGHT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
OPCODE(CMSG_MOVE_STOP_TURN, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
OPCODE(CMSG_MOVE_START_PITCH_UP, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
OPCODE(CMSG_MOVE_START_PITCH_DOWN, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
OPCODE(CMSG_MOVE_STOP_PITCH, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
OPCODE(CMSG_MOVE_SET_RUN_MODE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
OPCODE(CMSG_MOVE_SET_WALK_MODE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(MSG_MOVE_TOGGLE_LOGGING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
OPCODE(MSG_MOVE_TELEPORT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//OPCODE(MSG_MOVE_TELEPORT_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//OPCODE(MSG_MOVE_TELEPORT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveTeleportAckOpcode );
//OPCODE(MSG_MOVE_TOGGLE_FALL_LOGGING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//OPCODE(MSG_MOVE_FALL_LAND, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(MSG_MOVE_START_SWIM, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(MSG_MOVE_STOP_SWIM, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
OPCODE(CMSG_MOVE_FALL_LAND, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
OPCODE(CMSG_MOVE_START_SWIM, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
OPCODE(CMSG_MOVE_STOP_SWIM, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(MSG_MOVE_SET_RUN_SPEED_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//OPCODE(MSG_MOVE_SET_RUN_SPEED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//OPCODE(MSG_MOVE_SET_RUN_BACK_SPEED_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@ -263,8 +263,8 @@ void InitializeOpcodes()
//OPCODE(MSG_MOVE_SET_TURN_RATE_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//OPCODE(MSG_MOVE_SET_TURN_RATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//OPCODE(MSG_MOVE_TOGGLE_COLLISION_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//OPCODE(MSG_MOVE_SET_FACING, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(MSG_MOVE_SET_PITCH, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
OPCODE(CMSG_MOVE_SET_FACING, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
OPCODE(CMSG_MOVE_SET_PITCH, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(MSG_MOVE_WORLDPORT_ACK, STATUS_TRANSFER, PROCESS_THREADUNSAFE, &WorldSession::HandleMoveWorldportAckOpcode );
//OPCODE(SMSG_MONSTER_MOVE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(SMSG_MOVE_WATER_WALK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
@ -283,7 +283,7 @@ void InitializeOpcodes()
//OPCODE(CMSG_FORCE_MOVE_UNROOT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveUnRootAck );
//OPCODE(MSG_MOVE_ROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//OPCODE(MSG_MOVE_UNROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//OPCODE(MSG_MOVE_HEARTBEAT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
OPCODE(MSG_MOVE_HEARTBEAT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(SMSG_MOVE_KNOCK_BACK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(CMSG_MOVE_KNOCK_BACK_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveKnockBackAck );
//OPCODE(MSG_MOVE_KNOCK_BACK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@ -756,7 +756,7 @@ void InitializeOpcodes()
//OPCODE(CMSG_CHAR_RENAME, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharRenameOpcode );
//OPCODE(SMSG_CHAR_RENAME, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(CMSG_MOVE_SPLINE_DONE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveSplineDoneOpcode );
//OPCODE(CMSG_MOVE_FALL_RESET, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
OPCODE(CMSG_MOVE_FALL_RESET, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(SMSG_INSTANCE_SAVE_CREATED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(SMSG_RAID_INSTANCE_INFO, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(CMSG_REQUEST_RAID_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestRaidInfoOpcode );
@ -899,8 +899,8 @@ void InitializeOpcodes()
//OPCODE(CMSG_ARENA_TEAM_LEADER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleArenaTeamLeaderOpcode );
//OPCODE(SMSG_ARENA_TEAM_EVENT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(CMSG_BATTLEMASTER_JOIN_ARENA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlemasterJoinArena );
//OPCODE(MSG_MOVE_START_ASCEND, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(MSG_MOVE_STOP_ASCEND, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
OPCODE(CMSG_MOVE_START_ASCEND, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
OPCODE(CMSG_MOVE_STOP_ASCEND, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(SMSG_ARENA_TEAM_STATS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(CMSG_LFG_JOIN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgJoinOpcode );
//OPCODE(CMSG_LFG_LEAVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgLeaveOpcode );
@ -951,7 +951,7 @@ void InitializeOpcodes()
//OPCODE(SMSG_JOINED_BATTLEGROUND_QUEUE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(SMSG_REALM_SPLIT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(CMSG_REALM_SPLIT, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleRealmSplitOpcode );
//OPCODE(CMSG_MOVE_CHNG_TRANSPORT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
OPCODE(CMSG_MOVE_CHNG_TRANSPORT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(MSG_PARTY_ASSIGNMENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePartyAssignmentOpcode );
//OPCODE(SMSG_OFFER_PETITION_ERROR, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
OPCODE(SMSG_TIME_SYNC_REQ, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
@ -977,7 +977,7 @@ void InitializeOpcodes()
//OPCODE(SMSG_SET_EXTRA_AURA_INFO_OBSOLETE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(SMSG_SET_EXTRA_AURA_INFO_NEED_UPDATE_OBSOLETE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(SMSG_CLEAR_EXTRA_AURA_INFO_OBSOLETE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(MSG_MOVE_START_DESCEND, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
OPCODE(CMSG_MOVE_START_DESCEND, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(CMSG_IGNORE_REQUIREMENTS_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//OPCODE(SMSG_IGNORE_REQUIREMENTS_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(SMSG_SPELL_CHANCE_PROC_LOG, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
@ -1353,4 +1353,5 @@ void InitializeOpcodes()
//OPCODE(SMSG_COMMENTATOR_SKIRMISH_QUEUE_RESULT1, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(SMSG_COMMENTATOR_SKIRMISH_QUEUE_RESULT2, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(SMSG_COMPRESSED_UNKNOWN_1310, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
OPCODE(SMSG_PLAYER_MOVE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
};

View file

@ -220,29 +220,29 @@ enum Opcodes
CMSG_DESTROY_ITEMS = 0x10B3,
SMSG_GAMEOBJECT_CUSTOM_ANIM = 0x10B4,
CMSG_AREATRIGGER = 0x10B5,
MSG_MOVE_START_FORWARD = 0x10B6,
MSG_MOVE_START_BACKWARD = 0x10B7,
MSG_MOVE_STOP = 0x10B8,
MSG_MOVE_START_STRAFE_LEFT = 0x10B9,
MSG_MOVE_START_STRAFE_RIGHT = 0x10BA,
MSG_MOVE_STOP_STRAFE = 0x10BB,
MSG_MOVE_JUMP = 0x10BC,
MSG_MOVE_START_TURN_LEFT = 0x10BD,
MSG_MOVE_START_TURN_RIGHT = 0x10BE,
MSG_MOVE_STOP_TURN = 0x10BF,
MSG_MOVE_START_PITCH_UP = 0x10C0,
MSG_MOVE_START_PITCH_DOWN = 0x10C1,
MSG_MOVE_STOP_PITCH = 0x10C2,
MSG_MOVE_SET_RUN_MODE = 0x10C3,
MSG_MOVE_SET_WALK_MODE = 0x10C4,
CMSG_MOVE_START_FORWARD = 0x7814,
CMSG_MOVE_START_BACKWARD = 0x330A,
CMSG_MOVE_STOP = 0x320A,
CMSG_MOVE_START_STRAFE_LEFT = 0x3A16,
CMSG_MOVE_START_STRAFE_RIGHT = 0x3A02,
CMSG_MOVE_STOP_STRAFE = 0x3002,
CMSG_MOVE_JUMP = 0x7A06,
CMSG_MOVE_START_TURN_LEFT = 0x700C,
CMSG_MOVE_START_TURN_RIGHT = 0x7000,
CMSG_MOVE_STOP_TURN = 0x331E,
CMSG_MOVE_START_PITCH_UP = 0x3304,
CMSG_MOVE_START_PITCH_DOWN = 0x3908,
CMSG_MOVE_STOP_PITCH = 0x7216,
CMSG_MOVE_SET_RUN_MODE = 0x791A,
CMSG_MOVE_SET_WALK_MODE = 0x7002,
MSG_MOVE_TOGGLE_LOGGING = 0x10C5,
MSG_MOVE_TELEPORT = 0x55A0,
MSG_MOVE_TELEPORT_CHEAT = 0x10C7,
MSG_MOVE_TELEPORT_ACK = 0x10C8,
MSG_MOVE_TOGGLE_FALL_LOGGING = 0x10C9,
MSG_MOVE_FALL_LAND = 0x10CA,
MSG_MOVE_START_SWIM = 0x10CB,
MSG_MOVE_STOP_SWIM = 0x10CC,
CMSG_MOVE_FALL_LAND = 0x380A,
CMSG_MOVE_START_SWIM = 0x3206,
CMSG_MOVE_STOP_SWIM = 0x3802,
MSG_MOVE_SET_RUN_SPEED_CHEAT = 0x10CD,
MSG_MOVE_SET_RUN_SPEED = 0x10CE,
MSG_MOVE_SET_RUN_BACK_SPEED_CHEAT = 0x10CF,
@ -257,10 +257,10 @@ enum Opcodes
MSG_MOVE_SET_TURN_RATE_CHEAT = 0x10D8,
MSG_MOVE_SET_TURN_RATE = 0x10D9,
MSG_MOVE_TOGGLE_COLLISION_CHEAT = 0x10DA,
MSG_MOVE_SET_FACING = 0x10DB,
MSG_MOVE_SET_PITCH = 0x10DC,
CMSG_MOVE_SET_FACING = 0x7914,
CMSG_MOVE_SET_PITCH = 0x7312,
MSG_MOVE_WORLDPORT_ACK = 0x10DD,
SMSG_MONSTER_MOVE = 0x10DE,
SMSG_MONSTER_MOVE = 0x6E17,
SMSG_MOVE_WATER_WALK = 0x10DF,
SMSG_MOVE_LAND_WALK = 0x10E0,
CMSG_MOVE_CHARM_PORT_CHEAT = 0x10E1,
@ -277,7 +277,7 @@ enum Opcodes
CMSG_FORCE_MOVE_UNROOT_ACK = 0x10EC,
MSG_MOVE_ROOT = 0x10ED,
MSG_MOVE_UNROOT = 0x10EE,
MSG_MOVE_HEARTBEAT = 0x10EF,
MSG_MOVE_HEARTBEAT = 0x3914,
SMSG_MOVE_KNOCK_BACK = 0x10F0,
CMSG_MOVE_KNOCK_BACK_ACK = 0x10F1,
MSG_MOVE_KNOCK_BACK = 0x10F2,
@ -750,7 +750,7 @@ enum Opcodes
CMSG_CHAR_RENAME = 0x12C8,
SMSG_CHAR_RENAME = 0x12C9,
CMSG_MOVE_SPLINE_DONE = 0x12CA,
CMSG_MOVE_FALL_RESET = 0x12CB,
CMSG_MOVE_FALL_RESET = 0x310A,
SMSG_INSTANCE_SAVE_CREATED = 0x12CC,
SMSG_RAID_INSTANCE_INFO = 0x12CD,
CMSG_REQUEST_RAID_INFO = 0x12CE,
@ -893,8 +893,8 @@ enum Opcodes
CMSG_ARENA_TEAM_LEADER = 0x1357,
SMSG_ARENA_TEAM_EVENT = 0x1358,
CMSG_BATTLEMASTER_JOIN_ARENA = 0x1359,
MSG_MOVE_START_ASCEND = 0x135A,
MSG_MOVE_STOP_ASCEND = 0x135B,
CMSG_MOVE_START_ASCEND = 0x390A,
CMSG_MOVE_STOP_ASCEND = 0x7B00,
SMSG_ARENA_TEAM_STATS = 0x135C,
CMSG_LFG_JOIN = 0x135D,
CMSG_LFG_LEAVE = 0x135E,
@ -945,7 +945,7 @@ enum Opcodes
SMSG_JOINED_BATTLEGROUND_QUEUE = 0x138B,
SMSG_REALM_SPLIT = 0x138C,
CMSG_REALM_SPLIT = 0x138D,
CMSG_MOVE_CHNG_TRANSPORT = 0x138E,
CMSG_MOVE_CHNG_TRANSPORT = 0x3102,
MSG_PARTY_ASSIGNMENT = 0x138F,
SMSG_OFFER_PETITION_ERROR = 0x1390,
SMSG_TIME_SYNC_REQ = 0x3CA4,
@ -971,7 +971,7 @@ enum Opcodes
SMSG_SET_EXTRA_AURA_INFO_OBSOLETE = 0x13A5,
SMSG_SET_EXTRA_AURA_INFO_NEED_UPDATE_OBSOLETE = 0x13A6,
SMSG_CLEAR_EXTRA_AURA_INFO_OBSOLETE = 0x13A7,
MSG_MOVE_START_DESCEND = 0x13A8,
CMSG_MOVE_START_DESCEND = 0x3800,
CMSG_IGNORE_REQUIREMENTS_CHEAT = 0x13A9,
SMSG_IGNORE_REQUIREMENTS_CHEAT = 0x13AA,
SMSG_SPELL_CHANCE_PROC_LOG = 0x13AB,
@ -1371,6 +1371,7 @@ enum Opcodes
UMSG_UNKNOWN_1332 = 0x1535,
UMSG_UNKNOWN_1333 = 0x1536,
UMSG_UNKNOWN_1334 = 0x1537,
SMSG_PLAYER_MOVE = 0x79A2,
};
#define MAX_OPCODE_TABLE_SIZE 0xFFFF

View file

@ -22428,7 +22428,7 @@ void Player::UpdateKnownCurrencies(uint32 itemId, bool apply)
void Player::UpdateFallInformationIfNeed(MovementInfo const& minfo, uint16 opcode)
{
if (m_lastFallTime >= minfo.GetFallTime() || m_lastFallZ <= minfo.GetPos()->z || opcode == MSG_MOVE_FALL_LAND)
if (m_lastFallTime >= minfo.GetFallTime() || m_lastFallZ <= minfo.GetPos()->z || opcode == CMSG_MOVE_FALL_LAND)
SetFallInformation(minfo.GetFallTime(), minfo.GetPos()->z);
}

View file

@ -402,7 +402,7 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket)
ObjectGuid guid; // guid - unused
MovementInfo movementInfo;
recvPacket >> Unused<uint32>(); // >> MSG_MOVE_STOP
recvPacket >> Unused<uint32>(); // >> CMSG_MOVE_STOP
recvPacket >> guid.ReadAsPacked();
recvPacket >> movementInfo;
}

View file

@ -144,7 +144,7 @@ void MapManager::LoadTransports()
Transport::Transport() : GameObject()
{
m_updateFlag = (UPDATEFLAG_TRANSPORT | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_ROTATION);
m_updateFlag = UPDATEFLAG_TRANSPORT | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_ROTATION;
}
bool Transport::Create(uint32 guidlow, uint32 mapid, float x, float y, float z, float ang, uint8 animprogress, uint16 dynamicHighValue)

View file

@ -50,6 +50,7 @@
#include "movement/MoveSplineInit.h"
#include "movement/MoveSpline.h"
#include "CreatureLinkingMgr.h"
#include "MovementStructures.h"
#include <math.h>
#include <stdarg.h>
@ -70,95 +71,366 @@ float baseMoveSpeed[MAX_MOVE_TYPE] =
////////////////////////////////////////////////////////////
// Methods of class MovementInfo
void MovementInfo::Read(ByteBuffer& data)
void MovementInfo::Read(ByteBuffer& data, uint16 opcode)
{
data >> moveFlags;
data >> moveFlags2;
bool hasTransportData = false,
hasMovementFlags = false,
hasMovementFlags2 = false;
MovementStatusElements* sequence = GetMovementStatusElementsSequence(opcode);
if(!sequence)
{
sLog.outError("Unsupported MovementInfo::Read for 0x%X (%s)!", opcode, LookupOpcodeName(opcode));
return;
}
for(uint32 i = 0; i < MSE_COUNT; ++i)
{
MovementStatusElements element = sequence[i];
if (element == MSEEnd)
break;
if (element >= MSEGuidBit0 && element <= MSEGuidBit7)
{
guid[element - MSEGuidByte0] = data.ReadBit();
continue;
}
if (element >= MSETransportGuidBit0 && element <= MSETransportGuidBit7)
{
if (hasTransportData)
t_guid[element - MSETransportGuidBit0] = data.ReadBit();
continue;
}
if (element >= MSEGuidByte0 && element <= MSEGuidByte7)
{
if (guid[element - MSEGuidByte0])
guid[element - MSEGuidByte0] ^= data.ReadUInt8();
continue;
}
if (element >= MSETransportGuidByte0 && element <= MSETransportGuidByte7)
{
if (hasTransportData && t_guid[element - MSETransportGuidByte0])
t_guid[element - MSETransportGuidByte0] ^= data.ReadUInt8();
continue;
}
switch (element)
{
case MSEFlags:
if (hasMovementFlags)
moveFlags = data.ReadBits(30);
break;
case MSEFlags2:
if (hasMovementFlags2)
moveFlags2 = data.ReadBits(12);
break;
case MSEHasUnknownBit:
data.ReadBit();
break;
case MSETimestamp:
if (si.hasTimeStamp)
data >> time;
break;
case MSEHasTimestamp:
si.hasTimeStamp = !data.ReadBit();
break;
case MSEHasOrientation:
si.hasOrientation = !data.ReadBit();
break;
case MSEHasMovementFlags:
hasMovementFlags = !data.ReadBit();
break;
case MSEHasMovementFlags2:
hasMovementFlags2 = !data.ReadBit();
break;
case MSEHasPitch:
si.hasPitch = !data.ReadBit();
break;
case MSEHasFallData:
si.hasFallData = data.ReadBit();
break;
case MSEHasFallDirection:
if (si.hasFallData)
si.hasFallDirection = data.ReadBit();
break;
case MSEHasTransportData:
hasTransportData = data.ReadBit();
break;
case MSEHasTransportTime2:
if (hasTransportData)
si.hasTransportTime2 = data.ReadBit();
break;
case MSEHasTransportTime3:
if (hasTransportData)
si.hasTransportTime3 = data.ReadBit();
break;
case MSEHasSpline:
si.hasSpline = data.ReadBit();
break;
case MSEHasSplineElevation:
si.hasSplineElevation = !data.ReadBit();
break;
case MSEPositionX:
data >> pos.x;
break;
case MSEPositionY:
data >> pos.y;
break;
case MSEPositionZ:
data >> pos.z;
break;
case MSEPositionO:
if (si.hasOrientation)
data >> pos.o;
// comment, anyway movementInfo read/write system will be reimplemented soon
//if (HasMovementFlag(MOVEFLAG_ONTRANSPORT))
{
data >> t_guid.ReadAsPacked();
data >> t_pos.x;
data >> t_pos.y;
data >> t_pos.z;
data >> t_pos.o;
data >> t_time;
data >> t_seat;
if (moveFlags2 & MOVEFLAG2_INTERP_MOVEMENT)
data >> t_time2;
}
if ((HasMovementFlag(MovementFlags(MOVEFLAG_SWIMMING | MOVEFLAG_FLYING))) || (moveFlags2 & MOVEFLAG2_ALLOW_PITCHING))
{
break;
case MSEPitch:
if (si.hasPitch)
data >> s_pitch;
}
break;;
case MSEFallTime:
if (si.hasFallData)
data >> fallTime;
if (HasMovementFlag(MOVEFLAG_FALLING))
{
data >> jump.velocity;
data >> jump.sinAngle;
data >> jump.cosAngle;
data >> jump.xyspeed;
}
if (HasMovementFlag(MOVEFLAG_SPLINE_ELEVATION))
{
break;
case MSESplineElevation:
if (si.hasSplineElevation)
data >> splineElevation;
break;
case MSEFallHorizontalSpeed:
if (si.hasFallData && si.hasFallDirection)
data >> jump.xyspeed;
break;
case MSEFallVerticalSpeed:
if (si.hasFallData)
data >> jump.velocity;
break;
case MSEFallCosAngle:
if (si.hasFallData && si.hasFallDirection)
data >> jump.cosAngle;
break;
case MSEFallSinAngle:
if (si.hasFallData && si.hasFallDirection)
data >> jump.sinAngle;
break;
case MSETransportSeat:
if (hasTransportData)
data >> t_seat;
break;
case MSETransportPositionO:
if (hasTransportData)
data >> t_pos.o;
break;
case MSETransportPositionX:
if (hasTransportData)
data >> t_pos.x;
break;
case MSETransportPositionY:
if (hasTransportData)
data >> t_pos.y;
break;
case MSETransportPositionZ:
if (hasTransportData)
data >> t_pos.z;
break;
case MSETransportTime:
if (hasTransportData)
data >> t_time;
break;
case MSETransportTime2:
if (hasTransportData && si.hasTransportTime2)
data >> t_time2;
break;
case MSETransportTime3:
if (hasTransportData && si.hasTransportTime3)
data >> fallTime;
break;
default:
MANGOS_ASSERT(false && "Wrong movement status element");
break;
}
}
}
void MovementInfo::Write(ByteBuffer& data) const
void MovementInfo::Write(ByteBuffer& data, uint16 opcode) const
{
data << moveFlags;
data << moveFlags2;
data << time;
data << pos.x;
data << pos.y;
data << pos.z;
data << pos.o;
bool hasTransportData = !t_guid.IsEmpty();
// comment, anyway movementInfo read/write system will be reimplemented soon
//if (HasMovementFlag(MOVEFLAG_ONTRANSPORT))
MovementStatusElements* sequence = GetMovementStatusElementsSequence(opcode);
if (!sequence)
{
data << t_guid.WriteAsPacked();
data << t_pos.x;
data << t_pos.y;
data << t_pos.z;
data << t_pos.o;
data << t_time;
data << t_seat;
if (moveFlags2 & MOVEFLAG2_INTERP_MOVEMENT)
data << t_time2;
sLog.outError("Unsupported MovementInfo::Write for 0x%X (%s)!", opcode, LookupOpcodeName(opcode));
return;
}
if ((HasMovementFlag(MovementFlags(MOVEFLAG_SWIMMING | MOVEFLAG_FLYING))) || (moveFlags2 & MOVEFLAG2_ALLOW_PITCHING))
for(uint32 i = 0; i < MSE_COUNT; ++i)
{
data << s_pitch;
MovementStatusElements element = sequence[i];
if (element == MSEEnd)
break;
if (element >= MSEGuidBit0 && element <= MSEGuidBit7)
{
data.WriteBit(guid[element - MSEGuidBit0]);
continue;
}
data << fallTime;
if (HasMovementFlag(MOVEFLAG_FALLING))
if (element >= MSETransportGuidBit0 && element <= MSETransportGuidBit7)
{
data << jump.velocity;
data << jump.sinAngle;
data << jump.cosAngle;
data << jump.xyspeed;
if (hasTransportData)
data.WriteBit(t_guid[element - MSETransportGuidBit0]);
continue;
}
if (HasMovementFlag(MOVEFLAG_SPLINE_ELEVATION))
if (element >= MSEGuidByte0 && element <= MSEGuidByte7)
{
data << splineElevation;
if (guid[element - MSEGuidByte0])
data << uint8((guid[element - MSEGuidByte0] ^ 1));
continue;
}
if (element >= MSETransportGuidByte0 && element <= MSETransportGuidByte7)
{
if (hasTransportData && t_guid[element - MSEGuidByte0])
data << uint8((t_guid[element - MSETransportGuidByte0] ^ 1));
continue;
}
switch (element)
{
case MSEHasMovementFlags:
data.WriteBit(!moveFlags);
break;
case MSEHasMovementFlags2:
data.WriteBit(!moveFlags2);
break;
case MSEFlags:
if (moveFlags)
data.WriteBits(moveFlags, 30);
break;
case MSEFlags2:
if (moveFlags2)
data.WriteBits(moveFlags2, 12);
break;
case MSETimestamp:
if (si.hasTimeStamp)
data << uint32(time);
break;
case MSEHasPitch:
data.WriteBit(!si.hasPitch);
break;
case MSEHasTimestamp:
data.WriteBit(!si.hasTimeStamp);
break;
case MSEHasUnknownBit:
data.WriteBit(false);
break;
case MSEHasFallData:
data.WriteBit(si.hasFallData);
break;
case MSEHasFallDirection:
if (si.hasFallData)
data.WriteBit(si.hasFallDirection);
break;
case MSEHasTransportData:
data.WriteBit(hasTransportData);
break;
case MSEHasTransportTime2:
if (hasTransportData)
data.WriteBit(si.hasTransportTime2);
break;
case MSEHasTransportTime3:
if (hasTransportData)
data.WriteBit(si.hasTransportTime3);
break;
case MSEHasSpline:
data.WriteBit(si.hasSpline);
break;
case MSEHasSplineElevation:
data.WriteBit(!si.hasSplineElevation);
break;
case MSEPositionX:
data << float(pos.x);
break;
case MSEPositionY:
data << float(pos.y);
break;
case MSEPositionZ:
data << float(pos.z);
break;
case MSEPositionO:
if (si.hasOrientation)
data << float(pos.o);
break;
case MSEPitch:
if (si.hasPitch)
data << float(s_pitch);
break;
case MSEHasOrientation:
data.WriteBit(!si.hasOrientation);
break;
case MSEFallTime:
if (si.hasFallData)
data << uint32(fallTime);
break;
case MSESplineElevation:
if (si.hasSplineElevation)
data << float(splineElevation);
break;
case MSEFallHorizontalSpeed:
if (si.hasFallData && si.hasFallDirection)
data << float(jump.xyspeed);
break;
case MSEFallVerticalSpeed:
if (si.hasFallData)
data << float(jump.velocity);
break;
case MSEFallCosAngle:
if (si.hasFallData && si.hasFallDirection)
data << float(jump.cosAngle);
break;
case MSEFallSinAngle:
if (si.hasFallData && si.hasFallDirection)
data << float(jump.sinAngle);
break;
case MSETransportSeat:
if (hasTransportData)
data << int32(t_seat);
break;
case MSETransportPositionO:
if (hasTransportData)
data << float(t_pos.o);
break;
case MSETransportPositionX:
if (hasTransportData)
data << float(t_pos.x);
break;
case MSETransportPositionY:
if (hasTransportData)
data << float(t_pos.y);
break;
case MSETransportPositionZ:
if (hasTransportData)
data << float(t_pos.z);
break;
case MSETransportTime:
if (hasTransportData)
data << uint32(t_time);
break;
case MSETransportTime2:
if (hasTransportData && si.hasTransportTime2)
data << uint32(t_time2);
break;
case MSETransportTime3:
if (hasTransportData && si.hasTransportTime3)
data << uint32(fallTime);
break;
default:
MANGOS_ASSERT(false && "Wrong movement status element");
break;
}
}
}

View file

@ -675,8 +675,8 @@ class MovementInfo
t_time(0), t_seat(-1), t_time2(0), s_pitch(0.0f), fallTime(0), splineElevation(0.0f) {}
// Read/Write methods
void Read(ByteBuffer& data);
void Write(ByteBuffer& data) const;
void Read(ByteBuffer& data, uint16 opcode);
void Write(ByteBuffer& data, uint16 opcode) const;
// Movement flags manipulations
void AddMovementFlag(MovementFlags f) { moveFlags |= f; }
@ -708,6 +708,7 @@ class MovementInfo
t_time = 0;
t_seat = -1;
}
ObjectGuid const& GetGuid() const { return guid; }
ObjectGuid const& GetTransportGuid() const { return t_guid; }
Position const* GetTransportPos() const { return &t_pos; }
int8 GetTransportSeat() const { return t_seat; }
@ -723,12 +724,30 @@ class MovementInfo
float velocity, sinAngle, cosAngle, xyspeed;
};
// used only for SMSG_PLAYER_MOVE currently
struct StatusInfo
{
StatusInfo() : hasFallData(false), hasFallDirection(false), hasOrientation(false),
hasPitch(false), hasSpline(false), hasSplineElevation(false),
hasTimeStamp(false), hasTransportTime2(false), hasTransportTime3(false) { }
bool hasFallData : 1;
bool hasFallDirection : 1;
bool hasOrientation : 1;
bool hasPitch : 1;
bool hasSpline : 1;
bool hasSplineElevation : 1;
bool hasTimeStamp : 1;
bool hasTransportTime2 : 1;
bool hasTransportTime3 : 1;
};
JumpInfo const& GetJumpInfo() const { return jump; }
float GetSplineElevation() const { return splineElevation; }
float GetPitch() const { return s_pitch; }
private:
// common
ObjectGuid guid;
uint32 moveFlags; // see enum MovementFlags
uint16 moveFlags2; // see enum MovementFlags2
uint32 time;
@ -747,17 +766,19 @@ class MovementInfo
JumpInfo jump;
// spline
float splineElevation;
// status info
StatusInfo si;
};
inline ByteBuffer& operator<< (ByteBuffer& buf, MovementInfo const& mi)
inline WorldPacket& operator<< (WorldPacket& buf, MovementInfo const& mi)
{
mi.Write(buf);
mi.Write(buf, buf.GetOpcode());
return buf;
}
inline ByteBuffer& operator>> (ByteBuffer& buf, MovementInfo& mi)
inline WorldPacket& operator>> (WorldPacket& buf, MovementInfo& mi)
{
mi.Read(buf);
mi.Read(buf, buf.GetOpcode());
return buf;
}

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__
#define __REVISION_NR_H__
#define REVISION_NR "0005"
#define REVISION_NR "0006"
#endif // __REVISION_NR_H__

View file

@ -1762,6 +1762,10 @@
<Filter
Name="Movement"
>
<File
RelativePath="..\..\src\game\MovementStructures.h"
>
</File>
<File
RelativePath="..\..\src\game\Movement\MoveSpline.cpp"
>