[0067] Set- canfly/forcemoveroot/waterwalk packets, SMSG_PLAY_SPELL_VISUAL

Signed-off-by: Yaki Khadafi <ElSolDolLo@gmail.com>
This commit is contained in:
Yaki Khadafi 2012-08-12 12:53:15 +03:00 committed by Antz
parent 6b1df231a5
commit e7d0275ae2
13 changed files with 237 additions and 104 deletions

View file

@ -5980,10 +5980,8 @@ bool ChatHandler::HandleGMFlyCommand(char* args)
if (!target)
target = m_session->GetPlayer();
WorldPacket data(12);
data.SetOpcode(value ? SMSG_MOVE_SET_CAN_FLY : SMSG_MOVE_UNSET_CAN_FLY);
data << target->GetPackGUID();
data << uint32(0); // unknown
WorldPacket data;
target->BuildMoveSetCanFlyPacket(&data, value, 0);
target->SendMessageToSet(&data, true);
PSendSysMessage(LANG_COMMAND_FLYMODE_STATUS, GetNameLink(target).c_str(), args);
return true;

View file

@ -296,9 +296,8 @@ void WorldSession::HandleLogoutRequestOpcode(WorldPacket& /*recv_data*/)
if ((GetPlayer()->GetPositionZ() < height + 0.1f) && !(GetPlayer()->IsInWater()))
GetPlayer()->SetStandState(UNIT_STAND_STATE_SIT);
WorldPacket data(SMSG_FORCE_MOVE_ROOT, (8 + 4)); // guess size
data << GetPlayer()->GetPackGUID();
data << (uint32)2;
WorldPacket data;
GetPlayer()->BuildForceMoveRootPacket(&data, true, 2);
SendPacket(&data);
GetPlayer()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
}
@ -328,9 +327,7 @@ void WorldSession::HandleLogoutCancelOpcode(WorldPacket& /*recv_data*/)
if (GetPlayer()->CanFreeMove())
{
//! we can move again
data.Initialize(SMSG_FORCE_MOVE_UNROOT, 8); // guess size
data << GetPlayer()->GetPackGUID();
data << uint32(0);
GetPlayer()->BuildForceMoveRootPacket(&data, false, 0);
SendPacket(&data);
//! Stand Up
@ -1034,13 +1031,16 @@ void WorldSession::HandleFeatherFallAck(WorldPacket& recv_data)
DEBUG_LOG("WORLD: CMSG_MOVE_FEATHER_FALL_ACK");
// not used
recv_data.rpos(recv_data.wpos()); // prevent warnings spam
recv_data.rfinish(); // prevent warnings spam
/*
bitsream packet
*/
}
void WorldSession::HandleMoveUnRootAck(WorldPacket& recv_data)
{
// not used
recv_data.rpos(recv_data.wpos()); // prevent warnings spam
recv_data.rfinish(); // prevent warnings spam
/*
bitsream packet
*/
@ -1048,8 +1048,8 @@ void WorldSession::HandleMoveUnRootAck(WorldPacket& recv_data)
void WorldSession::HandleMoveRootAck(WorldPacket& recv_data)
{
// no used
recv_data.rpos(recv_data.wpos()); // prevent warnings spam
// not used
recv_data.rfinish(); // prevent warnings spam
/*
bitsream packet
*/
@ -1490,20 +1490,14 @@ void WorldSession::HandleMoveSetCanFlyAckOpcode(WorldPacket& recv_data)
{
// fly mode on/off
DEBUG_LOG("WORLD: CMSG_MOVE_SET_CAN_FLY_ACK");
// recv_data.hexlike();
ObjectGuid guid;
MovementInfo movementInfo;
recv_data >> guid.ReadAsPacked();
recv_data >> Unused<uint32>(); // unk
recv_data >> movementInfo;
recv_data >> Unused<float>(); // unk2
if (_player->GetMover()->GetObjectGuid() != guid)
if (_player->GetMover()->GetObjectGuid() != movementInfo.GetGuid())
{
DEBUG_LOG("WorldSession::HandleMoveSetCanFlyAckOpcode: player %s, mover %s, received %s, ignored",
_player->GetGuidStr().c_str(), _player->GetMover()->GetGuidStr().c_str(), guid.GetString().c_str());
_player->GetGuidStr().c_str(), _player->GetMover()->GetGuidStr().c_str(), movementInfo.GetGuid().GetString().c_str());
return;
}

View file

@ -468,26 +468,23 @@ void WorldSession::HandleMoveHoverAck(WorldPacket& recv_data)
{
DEBUG_LOG("CMSG_MOVE_HOVER_ACK");
ObjectGuid guid; // guid - unused
recv_data.rfinish();
/*
MovementInfo movementInfo;
recv_data >> guid.ReadAsPacked();
recv_data >> Unused<uint32>(); // unk1
recv_data >> movementInfo;
recv_data >> Unused<uint32>(); // unk2
*/
}
void WorldSession::HandleMoveWaterWalkAck(WorldPacket& recv_data)
{
DEBUG_LOG("CMSG_MOVE_WATER_WALK_ACK");
ObjectGuid guid; // guid - unused
MovementInfo movementInfo;
recv_data.rfinish();
recv_data >> guid.ReadAsPacked();
recv_data >> Unused<uint32>(); // unk1
/*
MovementInfo movementInfo;
recv_data >> movementInfo;
recv_data >> Unused<uint32>(); // unk2
*/
}
void WorldSession::HandleSummonResponseOpcode(WorldPacket& recv_data)

View file

@ -88,6 +88,7 @@ enum MovementStatusElements
MSETransportTime,
MSETransportTime2,
MSETransportTime3,
MSEMovementCounter,
MSEEnd,
MSE_COUNT
};
@ -2035,6 +2036,79 @@ MovementStatusElements MovementFallResetSequence[] =
MSEEnd,
};
MovementStatusElements MovementSetCanFlyAckSequence[] =
{
MSEPositionY,
MSEMovementCounter,
MSEPositionX,
MSEPositionZ,
MSEGuidBit3,
MSEHasTimestamp,
MSEGuidBit4,
MSEGuidBit0,
MSEHasOrientation,
MSEHasFallData,
MSEGuidBit2,
MSEGuidBit5,
MSEHasSplineElevation,
MSEHasMovementFlags2,
MSEHasUnknownBit,
MSEGuidBit7,
MSEHasSpline,
MSEGuidBit6,
MSEGuidBit1,
MSEHasMovementFlags,
MSEHasTransportData,
MSEHasPitch,
MSETransportGuidBit3,
MSETransportGuidBit1,
MSETransportGuidBit2,
MSEHasTransportTime3,
MSEHasTransportTime2,
MSETransportGuidBit0,
MSETransportGuidBit5,
MSETransportGuidBit7,
MSETransportGuidBit4,
MSETransportGuidBit6,
MSEFlags2,
MSEFlags,
MSEHasFallDirection,
MSEGuidByte1,
MSEGuidByte0,
MSEGuidByte2,
MSEGuidByte3,
MSEGuidByte7,
MSEGuidByte6,
MSEGuidByte4,
MSEGuidByte5,
MSETransportTime2,
MSETransportGuidByte6,
MSETransportTime,
MSETransportTime3,
MSETransportGuidByte7,
MSETransportPositionZ,
MSETransportGuidByte3,
MSETransportPositionY,
MSETransportGuidByte5,
MSETransportPositionX,
MSETransportGuidByte2,
MSETransportPositionO,
MSETransportSeat,
MSETransportGuidByte1,
MSETransportGuidByte0,
MSETransportGuidByte4,
MSEFallTime,
MSEFallCosAngle,
MSEFallHorizontalSpeed,
MSEFallSinAngle,
MSEFallVerticalSpeed,
MSEPitch,
MSEPositionO,
MSETimestamp,
MSESplineElevation,
MSEEnd,
};
MovementStatusElements* GetMovementStatusElementsSequence(uint16 opcode)
{
switch(opcode)
@ -2047,6 +2121,8 @@ MovementStatusElements* GetMovementStatusElementsSequence(uint16 opcode)
return MovementFallResetSequence;
case CMSG_MOVE_JUMP:
return MovementJumpSequence;
case CMSG_MOVE_SET_CAN_FLY_ACK:
return MovementSetCanFlyAckSequence;
case CMSG_MOVE_SET_FACING:
return MovementSetFacingSequence;
case CMSG_MOVE_SET_PITCH:

View file

@ -292,14 +292,13 @@ void WorldSession::HandleTrainerBuySpellOpcode(WorldPacket& recv_data)
_player->ModifyMoney(-int32(nSpellCost));
WorldPacket data(SMSG_PLAY_SPELL_VISUAL, 12); // visual effect on trainer
data << ObjectGuid(guid);
data << uint32(0xB3); // index from SpellVisualKit.dbc
// visual effect on trainer
WorldPacket data;
unit->BuildSendPlayVisualPacket(&data, 0xB3, false);
SendPacket(&data);
data.Initialize(SMSG_PLAY_SPELL_IMPACT, 12); // visual effect on player
data << _player->GetObjectGuid();
data << uint32(0x016A); // index from SpellVisualKit.dbc
// visual effect on player
_player->BuildSendPlayVisualPacket(&data, 0x016A, true);
SendPacket(&data);
// learn explicitly or cast explicitly

View file

@ -285,8 +285,8 @@ void InitializeOpcodes()
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 );
//OPCODE(SMSG_MOVE_LAND_WALK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
OPCODE(SMSG_MOVE_WATER_WALK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
OPCODE(SMSG_MOVE_LAND_WALK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(CMSG_MOVE_CHARM_PORT_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//OPCODE(CMSG_MOVE_SET_RAW_POSITION, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//OPCODE(SMSG_FORCE_RUN_SPEED_CHANGE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
@ -295,10 +295,10 @@ void InitializeOpcodes()
//OPCODE(CMSG_FORCE_RUN_BACK_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAckOpcodes);
//OPCODE(SMSG_FORCE_SWIM_SPEED_CHANGE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(CMSG_FORCE_SWIM_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAckOpcodes);
//OPCODE(SMSG_FORCE_MOVE_ROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(CMSG_FORCE_MOVE_ROOT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveRootAck );
//OPCODE(SMSG_FORCE_MOVE_UNROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(CMSG_FORCE_MOVE_UNROOT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveUnRootAck );
OPCODE(SMSG_FORCE_MOVE_ROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
OPCODE(CMSG_FORCE_MOVE_ROOT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveRootAck );
OPCODE(SMSG_FORCE_MOVE_UNROOT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
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 );
@ -568,11 +568,10 @@ void InitializeOpcodes()
//OPCODE(CMSG_PET_CAST_SPELL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePetCastSpellOpcode );
//OPCODE(MSG_SAVE_GUILD_EMBLEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSaveGuildEmblemOpcode );
//OPCODE(MSG_TABARDVENDOR_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTabardVendorActivateOpcode);
//OPCODE(SMSG_PLAY_SPELL_VISUAL, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
OPCODE(SMSG_PLAY_SPELL_VISUAL, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(CMSG_ZONEUPDATE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleZoneUpdateOpcode );
//OPCODE(SMSG_PARTYKILLLOG, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(SMSG_COMPRESSED_UPDATE_OBJECT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(SMSG_PLAY_SPELL_IMPACT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(SMSG_EXPLORATION_EXPERIENCE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(CMSG_GM_SET_SECURITY_GROUP, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//OPCODE(CMSG_GM_NUKE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@ -789,7 +788,7 @@ void InitializeOpcodes()
//OPCODE(CMSG_REQUEST_RAID_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestRaidInfoOpcode );
//OPCODE(CMSG_MOVE_TIME_SKIPPED, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleMoveTimeSkippedOpcode );
//OPCODE(CMSG_MOVE_FEATHER_FALL_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleFeatherFallAck );
//OPCODE(CMSG_MOVE_WATER_WALK_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveWaterWalkAck );
OPCODE(CMSG_MOVE_WATER_WALK_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveWaterWalkAck );
//OPCODE(CMSG_MOVE_NOT_ACTIVE_MOVER, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveNotActiveMoverOpcode );
//OPCODE(SMSG_PLAY_SOUND, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(CMSG_BATTLEFIELD_STATUS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlefieldStatusOpcode );
@ -904,9 +903,9 @@ void InitializeOpcodes()
//OPCODE(CMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY_ACK, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//OPCODE(MSG_MOVE_START_SWIM_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//OPCODE(MSG_MOVE_STOP_SWIM_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//OPCODE(SMSG_MOVE_SET_CAN_FLY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(SMSG_MOVE_UNSET_CAN_FLY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(CMSG_MOVE_SET_CAN_FLY_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveSetCanFlyAckOpcode );
OPCODE(SMSG_MOVE_SET_CAN_FLY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
OPCODE(SMSG_MOVE_UNSET_CAN_FLY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
OPCODE(CMSG_MOVE_SET_CAN_FLY_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveSetCanFlyAckOpcode );
//OPCODE(CMSG_MOVE_SET_FLY, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes );
//OPCODE(CMSG_SOCKET_GEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSocketOpcode );
//OPCODE(CMSG_ARENA_TEAM_CREATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );

View file

@ -279,8 +279,8 @@ enum Opcodes
CMSG_MOVE_SET_PITCH = 0x7312, // 4.3.4 15595
MSG_MOVE_WORLDPORT_ACK = 0x10DD,
SMSG_MONSTER_MOVE = 0x6E17, // 4.3.4 15595
SMSG_MOVE_WATER_WALK = 0x10DF,
SMSG_MOVE_LAND_WALK = 0x10E0,
SMSG_MOVE_WATER_WALK = 0x75B1, // 4.3.4 15595
SMSG_MOVE_LAND_WALK = 0x34B7, // 4.3.4 15595
CMSG_MOVE_CHARM_PORT_CHEAT = 0x10E1,
CMSG_MOVE_SET_RAW_POSITION = 0x10E2,
SMSG_FORCE_RUN_SPEED_CHANGE = 0x10E3,
@ -289,10 +289,10 @@ enum Opcodes
CMSG_FORCE_RUN_BACK_SPEED_CHANGE_ACK = 0x10E6,
SMSG_FORCE_SWIM_SPEED_CHANGE = 0x10E7,
CMSG_FORCE_SWIM_SPEED_CHANGE_ACK = 0x10E8,
SMSG_FORCE_MOVE_ROOT = 0x10E9,
CMSG_FORCE_MOVE_ROOT_ACK = 0x10EA,
SMSG_FORCE_MOVE_UNROOT = 0x10EB,
CMSG_FORCE_MOVE_UNROOT_ACK = 0x10EC,
SMSG_FORCE_MOVE_ROOT = 0x7DA0, // 4.3.4 15595
CMSG_FORCE_MOVE_ROOT_ACK = 0x701E, // 4.3.4 15595
SMSG_FORCE_MOVE_UNROOT = 0x7DB4, // 4.3.4 15595
CMSG_FORCE_MOVE_UNROOT_ACK = 0x7808, // 4.3.4 15595
MSG_MOVE_ROOT = 0x10ED,
MSG_MOVE_UNROOT = 0x10EE,
MSG_MOVE_HEARTBEAT = 0x3914, // 4.3.4 15595
@ -553,11 +553,10 @@ enum Opcodes
CMSG_PET_CAST_SPELL = 0x11F1,
MSG_SAVE_GUILD_EMBLEM = 0x11F2,
MSG_TABARDVENDOR_ACTIVATE = 0x11F3,
SMSG_PLAY_SPELL_VISUAL = 0x11F4,
SMSG_PLAY_SPELL_VISUAL = 0x55A5, // 4.3.4 15595
CMSG_ZONEUPDATE = 0x11F5,
SMSG_PARTYKILLLOG = 0x11F6,
SMSG_COMPRESSED_UPDATE_OBJECT = 0x11F7,
SMSG_PLAY_SPELL_IMPACT = 0x11F8,
SMSG_EXPLORATION_EXPERIENCE = 0x11F9,
CMSG_GM_SET_SECURITY_GROUP = 0x11FA,
CMSG_GM_NUKE = 0x11FB,
@ -774,7 +773,7 @@ enum Opcodes
CMSG_REQUEST_RAID_INFO = 0x12CE,
CMSG_MOVE_TIME_SKIPPED = 0x12CF,
CMSG_MOVE_FEATHER_FALL_ACK = 0x12D0,
CMSG_MOVE_WATER_WALK_ACK = 0x12D1,
CMSG_MOVE_WATER_WALK_ACK = 0x3B00, // 4.3.4 15595
CMSG_MOVE_NOT_ACTIVE_MOVER = 0x12D2,
SMSG_PLAY_SOUND = 0x12D3,
CMSG_BATTLEFIELD_STATUS = 0x12D4,
@ -891,7 +890,7 @@ enum Opcodes
MSG_MOVE_STOP_SWIM_CHEAT = 0x1343,
SMSG_MOVE_SET_CAN_FLY = 0x3DA1, // 4.3.4 15595
SMSG_MOVE_UNSET_CAN_FLY = 0x15A2, // 4.3.4 15595
CMSG_MOVE_SET_CAN_FLY_ACK = 0x1346,
CMSG_MOVE_SET_CAN_FLY_ACK = 0x790C, // 4.3.4 15595
CMSG_MOVE_SET_FLY = 0x1347,
CMSG_SOCKET_GEMS = 0x1348,
CMSG_ARENA_TEAM_CREATE = 0x1349,

View file

@ -4418,16 +4418,23 @@ void Player::SetMovement(PlayerMovementType pType)
WorldPacket data;
switch (pType)
{
case MOVE_ROOT: data.Initialize(SMSG_FORCE_MOVE_ROOT, GetPackGUID().size() + 4); break;
case MOVE_UNROOT: data.Initialize(SMSG_FORCE_MOVE_UNROOT, GetPackGUID().size() + 4); break;
case MOVE_WATER_WALK: data.Initialize(SMSG_MOVE_WATER_WALK, GetPackGUID().size() + 4); break;
case MOVE_LAND_WALK: data.Initialize(SMSG_MOVE_LAND_WALK, GetPackGUID().size() + 4); break;
case MOVE_ROOT:
case MOVE_UNROOT:
{
BuildForceMoveRootPacket(&data, pType == MOVE_ROOT, 0);
break;
}
case MOVE_WATER_WALK:
case MOVE_LAND_WALK:
{
BuildMoveWaterWalkPacket(&data, pType == MOVE_WATER_WALK, 0);
break;
}
default:
sLog.outError("Player::SetMovement: Unsupported move type (%d), data not sent to client.", pType);
return;
}
data << GetPackGUID();
data << uint32(0);
GetSession()->SendPacket(&data);
}
@ -20468,9 +20475,8 @@ void Player::SendInitialPacketsAfterAddToMap()
// manual send package (have code in ApplyModifier(true,true); that don't must be re-applied.
if (HasAuraType(SPELL_AURA_MOD_ROOT))
{
WorldPacket data2(SMSG_FORCE_MOVE_ROOT, 10);
data2 << GetPackGUID();
data2 << (uint32)2;
WorldPacket data2;
BuildForceMoveRootPacket(&data2, true, 2);
SendMessageToSet(&data2, true);
}

View file

@ -4544,9 +4544,9 @@ void Spell::SendPlaySpellVisual(uint32 SpellID)
if (m_caster->GetTypeId() != TYPEID_PLAYER)
return;
WorldPacket data(SMSG_PLAY_SPELL_VISUAL, 8 + 4);
data << m_caster->GetObjectGuid();
data << uint32(SpellID); // spell visual id?
WorldPacket data;
m_caster->BuildSendPlayVisualPacket(&data, SpellID, false);
((Player*)m_caster)->GetSession()->SendPacket(&data);
}

View file

@ -3280,12 +3280,7 @@ void Aura::HandleAuraWaterWalk(bool apply, bool Real)
return;
WorldPacket data;
if (apply)
data.Initialize(SMSG_MOVE_WATER_WALK, 8 + 4);
else
data.Initialize(SMSG_MOVE_LAND_WALK, 8 + 4);
data << GetTarget()->GetPackGUID();
data << uint32(0);
GetTarget()->BuildMoveWaterWalkPacket(&data, apply, 0);
GetTarget()->SendMessageToSet(&data, true);
}
@ -4450,9 +4445,8 @@ void Aura::HandleAuraModStun(bool apply, bool Real)
target->SetStandState(UNIT_STAND_STATE_STAND);// in 1.5 client
}
WorldPacket data(SMSG_FORCE_MOVE_ROOT, 8);
data << target->GetPackGUID();
data << uint32(0);
WorldPacket data;
target->BuildForceMoveRootPacket(&data, true, 0);
target->SendMessageToSet(&data, true);
// Summon the Naj'entus Spine GameObject on target if spell is Impaling Spine
@ -4508,9 +4502,8 @@ void Aura::HandleAuraModStun(bool apply, bool Real)
if (target->getVictim() && target->isAlive())
target->SetTargetGuid(target->getVictim()->GetObjectGuid());
WorldPacket data(SMSG_FORCE_MOVE_UNROOT, 8 + 4);
data << target->GetPackGUID();
data << uint32(0);
WorldPacket data;
target->BuildForceMoveRootPacket(&data, false, 0);
target->SendMessageToSet(&data, true);
}
@ -4742,9 +4735,8 @@ void Aura::HandleAuraModRoot(bool apply, bool Real)
if (target->GetTypeId() == TYPEID_PLAYER)
{
WorldPacket data(SMSG_FORCE_MOVE_ROOT, 10);
data << target->GetPackGUID();
data << (uint32)2;
WorldPacket data;
target->BuildForceMoveRootPacket(&data, true, 2);
target->SendMessageToSet(&data, true);
// Clear unit movement flags
@ -4791,9 +4783,8 @@ void Aura::HandleAuraModRoot(bool apply, bool Real)
if (target->GetTypeId() == TYPEID_PLAYER)
{
WorldPacket data(SMSG_FORCE_MOVE_UNROOT, 10);
data << target->GetPackGUID();
data << (uint32)2;
WorldPacket data;
target->BuildForceMoveRootPacket(&data, false, 2);
target->SendMessageToSet(&data, true);
}
}
@ -4969,12 +4960,7 @@ void Aura::HandleAuraModIncreaseFlightSpeed(bool apply, bool Real)
if (m_modifier.m_auraname == SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED)
{
WorldPacket data;
if (apply)
data.Initialize(SMSG_MOVE_SET_CAN_FLY, 12);
else
data.Initialize(SMSG_MOVE_UNSET_CAN_FLY, 12);
data << target->GetPackGUID();
data << uint32(0); // unknown
target->BuildMoveSetCanFlyPacket(&data, apply, 0);
target->SendMessageToSet(&data, true);
// Players on flying mounts must be immune to polymorph
@ -6886,12 +6872,7 @@ void Aura::HandleAuraAllowFlight(bool apply, bool Real)
// allow fly
WorldPacket data;
if (apply)
data.Initialize(SMSG_MOVE_SET_CAN_FLY, 12);
else
data.Initialize(SMSG_MOVE_UNSET_CAN_FLY, 12);
data << GetTarget()->GetPackGUID();
data << uint32(0); // unk
GetTarget()->BuildMoveSetCanFlyPacket(&data, apply, 0);
GetTarget()->SendMessageToSet(&data, true);
}

View file

@ -246,6 +246,9 @@ void MovementInfo::Read(ByteBuffer& data, uint16 opcode)
if (hasTransportData && si.hasTransportTime3)
data >> fallTime;
break;
case MSEMovementCounter:
data.read_skip<uint32>();
break;
default:
MANGOS_ASSERT(false && "Wrong movement status element");
break;
@ -427,6 +430,9 @@ void MovementInfo::Write(ByteBuffer& data, uint16 opcode) const
if (hasTransportData && si.hasTransportTime3)
data << uint32(fallTime);
break;
case MSEMovementCounter:
data << uint32(0);
break;
default:
MANGOS_ASSERT(false && "Wrong movement status element");
break;
@ -11569,3 +11575,75 @@ bool Unit::IsSplineEnabled() const
{
return movespline->Initialized();
}
void Unit::BuildForceMoveRootPacket(WorldPacket* data, bool apply, uint32 value)
{
if (apply)
{
data->Initialize(SMSG_FORCE_MOVE_ROOT, 13);
data->WriteGuidMask<2, 7, 6, 0, 5, 4, 1, 3>(GetObjectGuid());
data->WriteGuidBytes<1, 0, 2, 5>(GetObjectGuid());
*data << uint32(value);
data->WriteGuidBytes<3, 4, 7, 6>(GetObjectGuid());
}
else
{
data->Initialize(SMSG_FORCE_MOVE_UNROOT, 13);
data->WriteGuidMask<0, 1, 3, 7, 5, 2, 4, 6>(GetObjectGuid());
data->WriteGuidBytes<3, 6, 1>(GetObjectGuid());
*data << uint32(value);
data->WriteGuidBytes<2, 0, 7, 4, 5>(GetObjectGuid());
}
}
void Unit::BuildMoveSetCanFlyPacket(WorldPacket* data, bool apply, uint32 value)
{
if (apply)
{
data->Initialize(SMSG_MOVE_SET_CAN_FLY, 13);
data->WriteGuidMask<1, 6, 5, 0, 7, 4, 2, 3>(GetObjectGuid());
data->WriteGuidBytes<6, 3>(GetObjectGuid());
*data << uint32(value);
data->WriteGuidBytes<2, 1, 4, 7, 0, 5>(GetObjectGuid());
}
else
{
data->Initialize(SMSG_MOVE_UNSET_CAN_FLY, 13);
data->WriteGuidMask<1, 4, 2, 5, 0, 3, 6, 7>(GetObjectGuid());
data->WriteGuidBytes<4, 6>(GetObjectGuid());
*data << uint32(value);
data->WriteGuidBytes<1, 0, 2, 3, 5, 7>(GetObjectGuid());
}
}
void Unit::BuildSendPlayVisualPacket(WorldPacket* data, uint32 value, bool impact)
{
data->Initialize(SMSG_PLAY_SPELL_VISUAL, 21);
*data << uint32(0); // unk, seems always 0
*data << uint32(value);
*data << uint32(impact ? 1 : 0);
data->WriteGuidMask<4, 7, 5, 3, 1, 2, 0, 6>(GetObjectGuid());
data->WriteGuidBytes<0, 4, 1, 6, 7, 2, 3, 5>(GetObjectGuid());
}
void Unit::BuildMoveWaterWalkPacket(WorldPacket* data, bool apply, uint32 value)
{
if (apply)
{
data->Initialize(SMSG_MOVE_WATER_WALK, 13);
data->WriteGuidMask<4, 7, 6, 0, 1, 3, 5, 2>(GetObjectGuid());
data->WriteGuidBytes<0, 5, 2>(GetObjectGuid());
*data << uint32(value);
data->WriteGuidBytes<7, 3, 4, 1, 6>(GetObjectGuid());
}
else
{
data->Initialize(SMSG_MOVE_LAND_WALK, 13);
data->WriteGuidMask<5, 1, 6, 2, 3, 4, 0, 7>(GetObjectGuid());
data->WriteGuidBytes<6, 1, 7, 5, 4, 0, 3, 2>(GetObjectGuid());
*data << uint32(value);
}
}

View file

@ -1955,6 +1955,12 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
bool IsSplineEnabled() const;
// Packet builders
void BuildForceMoveRootPacket(WorldPacket* data, bool apply, uint32 value);
void BuildMoveWaterWalkPacket(WorldPacket* data, bool apply, uint32 value);
void BuildSendPlayVisualPacket(WorldPacket* data, uint32 value, bool impact);
void BuildMoveSetCanFlyPacket(WorldPacket* data, bool apply, uint32 value);
protected:
explicit Unit();

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__
#define __REVISION_NR_H__
#define REVISION_NR "0066"
#define REVISION_NR "0067"
#endif // __REVISION_NR_H__