aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Object/Object.cpp6
-rw-r--r--src/server/game/Entities/Player/Player.cpp8
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp363
-rw-r--r--src/server/game/Entities/Unit/Unit.h7
-rw-r--r--src/server/game/Handlers/MiscHandler.cpp6
-rw-r--r--src/server/game/Handlers/MovementHandler.cpp44
-rw-r--r--src/server/game/Movement/MovementStructures.h13
-rw-r--r--src/server/game/Movement/Spline/MovementUtil.cpp2
-rw-r--r--src/server/scripts/World/npcs_special.cpp6
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: