Core/Units: Started work on updating movement (main goal: remove SendMovementFlagUpdate())

This commit is contained in:
Shauren
2013-04-03 20:13:33 +02:00
parent 7e9ac70420
commit 1ba6d0ce6f
9 changed files with 245 additions and 210 deletions
@@ -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())
+5 -3
View File
@@ -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]);
+194 -169
View File
@@ -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;
}
}
}
+4 -3
View File
@@ -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;
+3 -3
View File
@@ -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);
+25 -19
View File
@@ -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;
}
@@ -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
@@ -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
@@ -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: