diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 363 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 7 | ||||
-rw-r--r-- | src/server/game/Handlers/MiscHandler.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Handlers/MovementHandler.cpp | 44 | ||||
-rw-r--r-- | src/server/game/Movement/MovementStructures.h | 13 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MovementUtil.cpp | 2 | ||||
-rw-r--r-- | src/server/scripts/World/npcs_special.cpp | 6 |
9 files changed, 245 insertions, 210 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index ac3cf34024d..f9140181b75 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -2539,12 +2539,6 @@ void WorldObject::BuildMonsterChat(WorldPacket* data, uint8 msgtype, char const* } } -void Unit::BuildHeartBeatMsg(WorldPacket* data) const -{ - data->Initialize(MSG_MOVE_HEARTBEAT, 32); - WriteMovementInfo(*data); -} - void WorldObject::SendMessageToSet(WorldPacket* data, bool self) { if (IsInWorld()) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index fb63f955524..80b8306fa5b 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -22925,7 +22925,7 @@ void Player::SendInitialPacketsAfterAddToMap() ResetTimeSync(); SendTimeSync(); - Player::GetSession()->SendLoadCUFProfiles(); + GetSession()->SendLoadCUFProfiles(); CastSpell(this, 836, true); // LOGINEFFECT @@ -26313,8 +26313,10 @@ void Player::ResetTimeSync() void Player::SendTimeSync() { + m_timeSyncCounter = m_movementCounter; + WorldPacket data(SMSG_TIME_SYNC_REQ, 4); - data << uint32(m_timeSyncCounter++); + data << uint32(m_movementCounter++); GetSession()->SendPacket(&data); // Schedule next sync in 10 sec @@ -27018,7 +27020,7 @@ void Player::SendMovementSetCollisionHeight(float height) data.WriteByteSeq(guid[4]); data.WriteByteSeq(guid[3]); data.WriteByteSeq(guid[5]); - data << uint32(sWorld->GetGameTime()); // Packet counter + data << uint32(m_movementCounter++); data.WriteByteSeq(guid[1]); data.WriteByteSeq(guid[2]); data.WriteByteSeq(guid[7]); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index de005090834..f06f3fbfdd5 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -156,26 +156,26 @@ _hitMask(hitMask), _spell(spell), _damageInfo(damageInfo), _healInfo(healInfo) #ifdef _MSC_VER #pragma warning(disable:4355) #endif -Unit::Unit(bool isWorldObject): WorldObject(isWorldObject) - , m_movedPlayer(NULL) - , m_lastSanctuaryTime(0) - , m_TempSpeed(0.0f) - , IsAIEnabled(false) - , NeedChangeAI(false) - , m_ControlledByPlayer(false) - , movespline(new Movement::MoveSpline()) - , i_AI(NULL) - , i_disabledAI(NULL) - , m_AutoRepeatFirstCast(false) - , m_procDeep(0) - , m_removedAurasCount(0) - , i_motionMaster(this) - , m_ThreatManager(this) - , m_vehicle(NULL) - , m_vehicleKit(NULL) - , m_unitTypeMask(UNIT_MASK_NONE) - , m_HostileRefManager(this) - , _lastDamagedTime(0) +Unit::Unit(bool isWorldObject) : WorldObject(isWorldObject), + m_movedPlayer(NULL), + m_lastSanctuaryTime(0), + m_TempSpeed(0.0f), + IsAIEnabled(false), + NeedChangeAI(false), + m_ControlledByPlayer(false), + movespline(new Movement::MoveSpline()), + i_AI(NULL), + i_disabledAI(NULL), + m_AutoRepeatFirstCast(false), + m_procDeep(0), + m_removedAurasCount(0), + i_motionMaster(this), + m_ThreatManager(this), + m_vehicle(NULL), + m_vehicleKit(NULL), + m_unitTypeMask(UNIT_MASK_NONE), + m_HostileRefManager(this), + _lastDamagedTime(0) { #ifdef _MSC_VER #pragma warning(default:4355) @@ -195,7 +195,7 @@ Unit::Unit(bool isWorldObject): WorldObject(isWorldObject) m_extraAttacks = 0; m_canDualWield = false; - m_rootTimes = 0; + m_movementCounter = 0; m_state = 0; m_deathState = ALIVE; @@ -11400,7 +11400,7 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced) data.WriteByteSeq(guid[5]); data << float(GetSpeed(mtype)); data.WriteByteSeq(guid[2]); - data << uint32(0); + data << uint32(m_movementCounter++); data.WriteByteSeq(guid[4]); data.WriteByteSeq(guid[0]); data.WriteByteSeq(guid[7]); @@ -11420,7 +11420,7 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced) data.WriteByteSeq(guid[3]); data.WriteByteSeq(guid[1]); data.WriteByteSeq(guid[4]); - data << uint32(0); + data << uint32(m_movementCounter++); data << float(GetSpeed(mtype)); data.WriteByteSeq(guid[6]); data.WriteByteSeq(guid[0]); @@ -11438,7 +11438,7 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced) data.WriteBit(guid[5]); data.WriteBit(guid[7]); data.WriteByteSeq(guid[5]); - data << uint32(0); + data << uint32(m_movementCounter++); data << float(GetSpeed(mtype)); data.WriteByteSeq(guid[0]); data.WriteByteSeq(guid[4]); @@ -11459,7 +11459,7 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced) data.WriteBit(guid[1]); data.WriteBit(guid[6]); data.WriteByteSeq(guid[0]); - data << uint32(0); + data << uint32(m_movementCounter++); data.WriteByteSeq(guid[6]); data.WriteByteSeq(guid[3]); data.WriteByteSeq(guid[5]); @@ -11479,7 +11479,7 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced) data.WriteBit(guid[1]); data.WriteBit(guid[0]); data.WriteBit(guid[7]); - data << uint32(0); + data << uint32(m_movementCounter++); data.WriteByteSeq(guid[0]); data.WriteByteSeq(guid[3]); data.WriteByteSeq(guid[4]); @@ -11507,7 +11507,7 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced) data.WriteByteSeq(guid[3]); data.WriteByteSeq(guid[1]); data.WriteByteSeq(guid[0]); - data << uint32(0); + data << uint32(m_movementCounter++); data.WriteByteSeq(guid[6]); data.WriteByteSeq(guid[4]); break; @@ -11526,7 +11526,7 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced) data.WriteByteSeq(guid[7]); data.WriteByteSeq(guid[5]); data << float(GetSpeed(mtype)); - data << uint32(0); + data << uint32(m_movementCounter++); data.WriteByteSeq(guid[2]); data.WriteByteSeq(guid[6]); data.WriteByteSeq(guid[3]); @@ -11543,7 +11543,7 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced) data.WriteBit(guid[0]); data.WriteBit(guid[5]); data.WriteByteSeq(guid[3]); - data << uint32(0); + data << uint32(m_movementCounter++); data.WriteByteSeq(guid[6]); data << float(GetSpeed(mtype)); data.WriteByteSeq(guid[1]); @@ -11567,7 +11567,7 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced) data.WriteByteSeq(guid[6]); data.WriteByteSeq(guid[4]); data.WriteByteSeq(guid[0]); - data << uint32(0); + data << uint32(m_movementCounter++); data.WriteByteSeq(guid[1]); data.WriteByteSeq(guid[2]); data.WriteByteSeq(guid[7]); @@ -14879,9 +14879,6 @@ void Unit::SetRooted(bool apply) { if (apply) { - if (m_rootTimes > 0) // blizzard internal check? - m_rootTimes++; - // MOVEMENTFLAG_ROOT cannot be used in conjunction with MOVEMENTFLAG_MASK_MOVING (tested 3.3.5a) // this will freeze clients. That's why we remove MOVEMENTFLAG_MASK_MOVING before // setting MOVEMENTFLAG_ROOT @@ -14889,7 +14886,7 @@ void Unit::SetRooted(bool apply) AddUnitMovementFlag(MOVEMENTFLAG_ROOT); if (GetTypeId() == TYPEID_PLAYER) - SendMoveRoot(m_rootTimes); + SendMoveRoot(m_movementCounter++); else { ObjectGuid guid = GetGUID(); @@ -14920,7 +14917,7 @@ void Unit::SetRooted(bool apply) if (!HasUnitState(UNIT_STATE_STUNNED)) // prevent moving if it also has stun effect { if (GetTypeId() == TYPEID_PLAYER) - SendMoveUnroot(++m_rootTimes); + SendMoveUnroot(m_movementCounter++); else { ObjectGuid guid = GetGUID(); @@ -16443,6 +16440,12 @@ void Unit::NearTeleportTo(float x, float y, float z, float orientation, bool cas } } +void Unit::BuildHeartBeatMsg(WorldPacket* data) +{ + data->Initialize(MSG_MOVE_HEARTBEAT, 32); + WriteMovementInfo(*data); +} + void Unit::ReadMovementInfo(WorldPacket& data, MovementInfo* mi) { if (GetTypeId() != TYPEID_PLAYER) @@ -16498,6 +16501,15 @@ void Unit::ReadMovementInfo(WorldPacket& data, MovementInfo* mi) continue; } + if (element >= MSESpeedWalk && + element <= MSESpeedPitchRate) + { + /// @TODO: Possibly verify with current speed - but need to keep in mind that core + /// might trigger multiple changes before client has a chance to reply so only check the last value + data.read_skip<float>(); + continue; + } + switch (element) { case MSEHasMovementFlags: @@ -16624,6 +16636,9 @@ void Unit::ReadMovementInfo(WorldPacket& data, MovementInfo* mi) if (mi->bits.hasSplineElevation) data >> mi->splineElevation; break; + case MSECounter: + data.read_skip<uint32>(); /// @TODO: Maybe compare it with m_movementCounter to verify that packets are sent & received in order? + break; case MSEZeroBit: case MSEOneBit: data.ReadBit(); @@ -16714,7 +16729,7 @@ void Unit::ReadMovementInfo(WorldPacket& data, MovementInfo* mi) #undef REMOVE_VIOLATING_FLAGS } -void Unit::WriteMovementInfo(WorldPacket& data) const +void Unit::WriteMovementInfo(WorldPacket& data) { Unit const* mover = GetCharmerGUID() ? GetCharmer() : this; if (Player const* player = ToPlayer()) @@ -16799,141 +16814,151 @@ void Unit::WriteMovementInfo(WorldPacket& data) const continue; } + if (element >= MSESpeedWalk && + element <= MSESpeedPitchRate) + { + data << mover->GetSpeed(UnitMoveType(element - MSESpeedWalk)); + continue; + } + switch (element) { - case MSEHasMovementFlags: - data.WriteBit(!hasMovementFlags); - break; - case MSEHasMovementFlags2: - data.WriteBit(!hasMovementFlags2); - break; - case MSEHasTimestamp: - data.WriteBit(!hasTimestamp); - break; - case MSEHasOrientation: - data.WriteBit(!hasOrientation); - break; - case MSEHasTransportData: - data.WriteBit(hasTransportData); - break; - case MSEHasTransportTime2: - if (hasTransportData) - data.WriteBit(hasTransportTime2); - break; - case MSEHasTransportTime3: - if (hasTransportData) - data.WriteBit(hasTransportTime3); - break; - case MSEHasPitch: - data.WriteBit(!hasPitch); - break; - case MSEHasFallData: - data.WriteBit(hasFallData); - break; - case MSEHasFallDirection: - if (hasFallData) - data.WriteBit(hasFallDirection); - break; - case MSEHasSplineElevation: - data.WriteBit(!hasSplineElevation); - break; - case MSEHasSpline: - data.WriteBit(hasSpline); - break; - case MSEMovementFlags: - if (hasMovementFlags) - data.WriteBits(mover->GetUnitMovementFlags(), 30); - break; - case MSEMovementFlags2: - if (hasMovementFlags2) - data.WriteBits(mover->GetExtraUnitMovementFlags(), 12); - break; - case MSETimestamp: - if (hasTimestamp) - data << getMSTime(); - break; - case MSEPositionX: - data << mover->GetPositionX(); - break; - case MSEPositionY: - data << mover->GetPositionY(); - break; - case MSEPositionZ: - data << mover->GetPositionZ(); - break; - case MSEOrientation: - if (hasOrientation) - data << mover->GetOrientation(); - break; - case MSETransportPositionX: - if (hasTransportData) - data << mover->GetTransOffsetX(); - break; - case MSETransportPositionY: - if (hasTransportData) - data << mover->GetTransOffsetY(); - break; - case MSETransportPositionZ: - if (hasTransportData) - data << mover->GetTransOffsetZ(); - break; - case MSETransportOrientation: - if (hasTransportData) - data << mover->GetTransOffsetO(); - break; - case MSETransportSeat: - if (hasTransportData) - data << mover->GetTransSeat(); - break; - case MSETransportTime: - if (hasTransportData) - data << mover->GetTransTime(); - break; - case MSETransportTime2: - if (hasTransportData && hasTransportTime2) - data << mover->m_movementInfo.t_time2; - break; - case MSETransportTime3: - if (hasTransportData && hasTransportTime3) - data << mover->m_movementInfo.t_time3; - break; - case MSEPitch: - if (hasPitch) - data << mover->m_movementInfo.pitch; - break; - case MSEFallTime: - if (hasFallData) - data << mover->m_movementInfo.fallTime; - break; - case MSEFallVerticalSpeed: - if (hasFallData) - data << mover->m_movementInfo.j_zspeed; - break; - case MSEFallCosAngle: - if (hasFallData && hasFallDirection) - data << mover->m_movementInfo.j_cosAngle; - break; - case MSEFallSinAngle: - if (hasFallData && hasFallDirection) - data << mover->m_movementInfo.j_sinAngle; - break; - case MSEFallHorizontalSpeed: - if (hasFallData && hasFallDirection) - data << mover->m_movementInfo.j_xyspeed; - break; - case MSESplineElevation: - if (hasSplineElevation) - data << mover->m_movementInfo.splineElevation; - break; - case MSEZeroBit: - data.WriteBit(0); - break; - case MSEOneBit: - data.WriteBit(1); - break; - default: - ASSERT(false && "Incorrect sequence element detected at ReadMovementInfo"); - break; + case MSEHasMovementFlags: + data.WriteBit(!hasMovementFlags); + break; + case MSEHasMovementFlags2: + data.WriteBit(!hasMovementFlags2); + break; + case MSEHasTimestamp: + data.WriteBit(!hasTimestamp); + break; + case MSEHasOrientation: + data.WriteBit(!hasOrientation); + break; + case MSEHasTransportData: + data.WriteBit(hasTransportData); + break; + case MSEHasTransportTime2: + if (hasTransportData) + data.WriteBit(hasTransportTime2); + break; + case MSEHasTransportTime3: + if (hasTransportData) + data.WriteBit(hasTransportTime3); + break; + case MSEHasPitch: + data.WriteBit(!hasPitch); + break; + case MSEHasFallData: + data.WriteBit(hasFallData); + break; + case MSEHasFallDirection: + if (hasFallData) + data.WriteBit(hasFallDirection); + break; + case MSEHasSplineElevation: + data.WriteBit(!hasSplineElevation); + break; + case MSEHasSpline: + data.WriteBit(hasSpline); + break; + case MSEMovementFlags: + if (hasMovementFlags) + data.WriteBits(mover->GetUnitMovementFlags(), 30); + break; + case MSEMovementFlags2: + if (hasMovementFlags2) + data.WriteBits(mover->GetExtraUnitMovementFlags(), 12); + break; + case MSETimestamp: + if (hasTimestamp) + data << getMSTime(); + break; + case MSEPositionX: + data << mover->GetPositionX(); + break; + case MSEPositionY: + data << mover->GetPositionY(); + break; + case MSEPositionZ: + data << mover->GetPositionZ(); + break; + case MSEOrientation: + if (hasOrientation) + data << mover->GetOrientation(); + break; + case MSETransportPositionX: + if (hasTransportData) + data << mover->GetTransOffsetX(); + break; + case MSETransportPositionY: + if (hasTransportData) + data << mover->GetTransOffsetY(); + break; + case MSETransportPositionZ: + if (hasTransportData) + data << mover->GetTransOffsetZ(); + break; + case MSETransportOrientation: + if (hasTransportData) + data << mover->GetTransOffsetO(); + break; + case MSETransportSeat: + if (hasTransportData) + data << mover->GetTransSeat(); + break; + case MSETransportTime: + if (hasTransportData) + data << mover->GetTransTime(); + break; + case MSETransportTime2: + if (hasTransportData && hasTransportTime2) + data << mover->m_movementInfo.t_time2; + break; + case MSETransportTime3: + if (hasTransportData && hasTransportTime3) + data << mover->m_movementInfo.t_time3; + break; + case MSEPitch: + if (hasPitch) + data << mover->m_movementInfo.pitch; + break; + case MSEFallTime: + if (hasFallData) + data << mover->m_movementInfo.fallTime; + break; + case MSEFallVerticalSpeed: + if (hasFallData) + data << mover->m_movementInfo.j_zspeed; + break; + case MSEFallCosAngle: + if (hasFallData && hasFallDirection) + data << mover->m_movementInfo.j_cosAngle; + break; + case MSEFallSinAngle: + if (hasFallData && hasFallDirection) + data << mover->m_movementInfo.j_sinAngle; + break; + case MSEFallHorizontalSpeed: + if (hasFallData && hasFallDirection) + data << mover->m_movementInfo.j_xyspeed; + break; + case MSESplineElevation: + if (hasSplineElevation) + data << mover->m_movementInfo.splineElevation; + break; + case MSECounter: + data << m_movementCounter++; + break; + case MSEZeroBit: + data.WriteBit(0); + break; + case MSEOneBit: + data.WriteBit(1); + break; + default: + ASSERT(false && "Incorrect sequence element detected at ReadMovementInfo"); + break; } } } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index b2031794d89..d3125b5275a 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1625,7 +1625,7 @@ class Unit : public WorldObject void SendClearTarget(); - void BuildHeartBeatMsg(WorldPacket* data) const; + void BuildHeartBeatMsg(WorldPacket* data); bool isAlive() const { return (m_deathState == ALIVE); } bool isDying() const { return (m_deathState == JUST_DIED); } @@ -2112,7 +2112,7 @@ class Unit : public WorldObject void _EnterVehicle(Vehicle* vehicle, int8 seatId, AuraApplication const* aurApp = NULL); void ReadMovementInfo(WorldPacket& data, MovementInfo* mi); - void WriteMovementInfo(WorldPacket& data) const; + void WriteMovementInfo(WorldPacket& data); bool isMoving() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_MASK_MOVING); } bool isTurning() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_MASK_TURNING); } @@ -2249,8 +2249,9 @@ class Unit : public WorldObject void SetStunned(bool apply); void SetRooted(bool apply); + uint32 m_movementCounter; ///< Incrementing counter used in movement packets + private: - uint32 m_rootTimes; uint32 m_state; // Even derived shouldn't modify uint32 m_CombatTimer; diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 87f70e8d6cf..45d4b0198e6 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -1486,10 +1486,10 @@ void WorldSession::HandleTimeSyncResp(WorldPacket& recvData) sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_TIME_SYNC_RESP"); uint32 counter, clientTicks; - recvData >> clientTicks >> counter; + recvData >> counter >> clientTicks; - if (counter != _player->m_timeSyncCounter - 1) - sLog->outDebug(LOG_FILTER_NETWORKIO, "Wrong time sync counter from player %s (cheater?)", _player->GetName().c_str()); + if (counter != _player->m_timeSyncCounter) + sLog->outError(LOG_FILTER_NETWORKIO, "Wrong time sync counter from player %s (cheater?)", _player->GetName().c_str()); sLog->outDebug(LOG_FILTER_NETWORKIO, "Time sync received: counter %u, client ticks %u, time since last sync %u", counter, clientTicks, clientTicks - _player->m_timeSyncClient); diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index 7b792183a93..2b904537b1e 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -452,36 +452,42 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recvData) // client ACK send one packet for mounted/run case and need skip all except last from its // in other cases anti-cheat check can be fail in false case UnitMoveType move_type; - UnitMoveType force_move_type; - static char const* move_type_name[MAX_MOVE_TYPE] = { "Walk", "Run", "RunBack", "Swim", "SwimBack", "TurnRate", "Flight", "FlightBack", "PitchRate" }; + static char const* const move_type_name[MAX_MOVE_TYPE] = + { + "Walk", + "Run", + "RunBack", + "Swim", + "SwimBack", + "TurnRate", + "Flight", + "FlightBack", + "PitchRate" + }; - /* switch (opcode) { - //case CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK: move_type = MOVE_WALK; force_move_type = MOVE_WALK; break; - //case CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK: move_type = MOVE_RUN; force_move_type = MOVE_RUN; break; - //case CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK: move_type = MOVE_RUN_BACK; force_move_type = MOVE_RUN_BACK; break; - //case CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK: move_type = MOVE_SWIM; force_move_type = MOVE_SWIM; break; - //case CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK: move_type = MOVE_SWIM_BACK; force_move_type = MOVE_SWIM_BACK; break; - //case CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK: move_type = MOVE_TURN_RATE; force_move_type = MOVE_TURN_RATE; break; - //case CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT; force_move_type = MOVE_FLIGHT; break; - //case CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT_BACK; force_move_type = MOVE_FLIGHT_BACK; break; - //case CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK: move_type = MOVE_PITCH_RATE; force_move_type = MOVE_PITCH_RATE; break; + case CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK: move_type = MOVE_WALK; break; + case CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK: move_type = MOVE_RUN; break; + case CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK: move_type = MOVE_RUN_BACK; break; + case CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK: move_type = MOVE_SWIM; break; + case CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK: move_type = MOVE_SWIM_BACK; break; + case CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK: move_type = MOVE_TURN_RATE; break; + case CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT; break; + case CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT_BACK; break; + case CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK: move_type = MOVE_PITCH_RATE; break; default: sLog->outError(LOG_FILTER_NETWORKIO, "WorldSession::HandleForceSpeedChangeAck: Unknown move type opcode: %u", opcode); return; } - */ - sLog->outError(LOG_FILTER_NETWORKIO, "WorldSession::HandleForceSpeedChangeAck: Unknown move type opcode: %u", opcode); - return; // skip all forced speed changes except last and unexpected - // in run/mounted case used one ACK and it must be skipped.m_forced_speed_changes[MOVE_RUN} store both. - if (_player->m_forced_speed_changes[force_move_type] > 0) + // in run/mounted case used one ACK and it must be skipped. m_forced_speed_changes[MOVE_RUN] store both. + if (_player->m_forced_speed_changes[move_type] > 0) { - --_player->m_forced_speed_changes[force_move_type]; - if (_player->m_forced_speed_changes[force_move_type] > 0) + --_player->m_forced_speed_changes[move_type]; + if (_player->m_forced_speed_changes[move_type] > 0) return; } diff --git a/src/server/game/Movement/MovementStructures.h b/src/server/game/Movement/MovementStructures.h index 774a25d0e5b..3c537376ba0 100644 --- a/src/server/game/Movement/MovementStructures.h +++ b/src/server/game/Movement/MovementStructures.h @@ -89,6 +89,19 @@ enum MovementStatusElements MSEFallHorizontalSpeed, MSESplineElevation, + MSECounter, + + // Speed + MSESpeedWalk, + MSESpeedRun, + MSESpeedRunBack, + MSESpeedSwim, + MSESpeedSwimBack, + MSESpeedTurnRate, + MSESpeedFlight, + MSESpeedFlightBack, + MSESpeedPitchRate, + // Special MSEZeroBit, // writes bit value 1 or skips read bit MSEOneBit, // writes bit value 0 or skips read bit diff --git a/src/server/game/Movement/Spline/MovementUtil.cpp b/src/server/game/Movement/Spline/MovementUtil.cpp index 7841828d44a..aaa575c752f 100644 --- a/src/server/game/Movement/Spline/MovementUtil.cpp +++ b/src/server/game/Movement/Spline/MovementUtil.cpp @@ -122,7 +122,7 @@ namespace Movement STR(PendingStrafeStop ), // 0x00004000, STR(PendingForward ), // 0x00008000, STR(PendingBackward ), // 0x00010000, - STR(PendingStrafeReft ), // 0x00020000, + STR(PendingStrafeLeft ), // 0x00020000, STR(PendingStrafeRight ), // 0x00040000, STR(PendingRoot ), // 0x00080000, STR(Swimming ), // 0x00100000, // Appears With Fly Flag Also diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index 59d49f50c8d..de765be5e21 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -439,9 +439,6 @@ public: me->Relocate(x, y, z + 0.94f); me->SetDisableGravity(true); me->HandleEmoteCommand(EMOTE_ONESHOT_DANCE); - WorldPacket data; //send update position to client - me->BuildHeartBeatMsg(&data); - me->SendMessageToSet(&data, true); } void UpdateAI(uint32 diff) @@ -468,9 +465,6 @@ public: me->SetInFront(player); Active = false; - WorldPacket data; - me->BuildHeartBeatMsg(&data); - me->SendMessageToSet(&data, true); switch (emote) { case TEXT_EMOTE_KISS: |