aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2015-04-04 23:49:14 +0200
committerShauren <shauren.trinity@gmail.com>2015-04-04 23:49:14 +0200
commit14b475e865058c1804cd6fb4dcaf307a4d895745 (patch)
treee7ec36a39adeaa62f5019d165fe19df59acdaee7 /src/server/game/Entities
parent38b326d27ba211b80a5028a3ce3e4381fd019b73 (diff)
Core/PacketIO: Enabled CMSG_MOVE_KNOCK_BACK_ACK, SMSG_MOVE_UPDATE_KNOCK_BACK and SMSG_MOVE_UPDATE
Diffstat (limited to 'src/server/game/Entities')
-rw-r--r--src/server/game/Entities/Player/Player.cpp230
-rw-r--r--src/server/game/Entities/Player/Player.h2
2 files changed, 8 insertions, 224 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 5968c7453c3..8186e51db89 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -26270,221 +26270,8 @@ bool Player::CanUseMastery() const
return HasSpell(MasterySpells[getClass()]);
}
-void Player::ReadMovementInfo(WorldPacket& data, MovementInfo* mi, Movement::ExtraMovementStatusElement* extras /*= NULL*/)
+void Player::ValidateMovementInfo(MovementInfo* mi)
{
- MovementStatusElements const* sequence = GetMovementStatusElementsSequence(data.GetOpcode());
- if (!sequence)
- {
- TC_LOG_ERROR("network", "Player::ReadMovementInfo: No movement sequence found for opcode %s", GetOpcodeNameForLogging(static_cast<OpcodeClient>(data.GetOpcode())).c_str());
- return;
- }
-
- bool hasMovementFlags = false;
- bool hasMovementFlags2 = false;
- bool hasTimestamp = false;
- bool hasOrientation = false;
- bool hasTransportData = false;
- bool hasTransportPrevTime = false;
- bool hasTransportVehicleId = false;
- bool hasPitch = false;
- bool hasFallData = false;
- bool hasFallDirection = false;
- bool hasSplineElevation = false;
-
- ObjectGuid guid;
- ObjectGuid tguid;
-
- for (; *sequence != MSEEnd; ++sequence)
- {
- MovementStatusElements const& element = *sequence;
-
- switch (element)
- {
- case MSEHasGuidByte0:
- case MSEHasGuidByte1:
- case MSEHasGuidByte2:
- case MSEHasGuidByte3:
- case MSEHasGuidByte4:
- case MSEHasGuidByte5:
- case MSEHasGuidByte6:
- case MSEHasGuidByte7:
- guid[element - MSEHasGuidByte0] = data.ReadBit();
- break;
- case MSEHasTransportGuidByte0:
- case MSEHasTransportGuidByte1:
- case MSEHasTransportGuidByte2:
- case MSEHasTransportGuidByte3:
- case MSEHasTransportGuidByte4:
- case MSEHasTransportGuidByte5:
- case MSEHasTransportGuidByte6:
- case MSEHasTransportGuidByte7:
- if (hasTransportData)
- tguid[element - MSEHasTransportGuidByte0] = data.ReadBit();
- break;
- case MSEGuidByte0:
- case MSEGuidByte1:
- case MSEGuidByte2:
- case MSEGuidByte3:
- case MSEGuidByte4:
- case MSEGuidByte5:
- case MSEGuidByte6:
- case MSEGuidByte7:
- data.ReadByteSeq(guid[element - MSEGuidByte0]);
- break;
- case MSETransportGuidByte0:
- case MSETransportGuidByte1:
- case MSETransportGuidByte2:
- case MSETransportGuidByte3:
- case MSETransportGuidByte4:
- case MSETransportGuidByte5:
- case MSETransportGuidByte6:
- case MSETransportGuidByte7:
- if (hasTransportData)
- data.ReadByteSeq(tguid[element - MSETransportGuidByte0]);
- break;
- case MSEHasMovementFlags:
- hasMovementFlags = !data.ReadBit();
- break;
- case MSEHasMovementFlags2:
- hasMovementFlags2 = !data.ReadBit();
- break;
- case MSEHasTimestamp:
- hasTimestamp = !data.ReadBit();
- break;
- case MSEHasOrientation:
- hasOrientation = !data.ReadBit();
- break;
- case MSEHasTransportData:
- hasTransportData = data.ReadBit();
- break;
- case MSEHasTransportPrevTime:
- if (hasTransportData)
- hasTransportPrevTime = data.ReadBit();
- break;
- case MSEHasTransportVehicleId:
- if (hasTransportData)
- hasTransportVehicleId = data.ReadBit();
- break;
- case MSEHasPitch:
- hasPitch = !data.ReadBit();
- break;
- case MSEHasFallData:
- hasFallData = data.ReadBit();
- break;
- case MSEHasFallDirection:
- if (hasFallData)
- hasFallDirection = data.ReadBit();
- break;
- case MSEHasSplineElevation:
- hasSplineElevation = !data.ReadBit();
- break;
- case MSEHasSpline:
- data.ReadBit();
- break;
- case MSEMovementFlags:
- if (hasMovementFlags)
- mi->flags = data.ReadBits(30);
- break;
- case MSEMovementFlags2:
- if (hasMovementFlags2)
- mi->flags2 = data.ReadBits(12);
- break;
- case MSETimestamp:
- if (hasTimestamp)
- data >> mi->time;
- break;
- case MSEPositionX:
- data >> mi->pos.m_positionX;
- break;
- case MSEPositionY:
- data >> mi->pos.m_positionY;
- break;
- case MSEPositionZ:
- data >> mi->pos.m_positionZ;
- break;
- case MSEOrientation:
- if (hasOrientation)
- mi->pos.SetOrientation(data.read<float>());
- break;
- case MSETransportPositionX:
- if (hasTransportData)
- data >> mi->transport.pos.m_positionX;
- break;
- case MSETransportPositionY:
- if (hasTransportData)
- data >> mi->transport.pos.m_positionY;
- break;
- case MSETransportPositionZ:
- if (hasTransportData)
- data >> mi->transport.pos.m_positionZ;
- break;
- case MSETransportOrientation:
- if (hasTransportData)
- mi->transport.pos.SetOrientation(data.read<float>());
- break;
- case MSETransportSeat:
- if (hasTransportData)
- data >> mi->transport.seat;
- break;
- case MSETransportTime:
- if (hasTransportData)
- data >> mi->transport.time;
- break;
- case MSETransportPrevTime:
- if (hasTransportData && hasTransportPrevTime)
- data >> mi->transport.prevTime;
- break;
- case MSETransportVehicleId:
- if (hasTransportData && hasTransportVehicleId)
- data >> mi->transport.vehicleId;
- break;
- case MSEPitch:
- if (hasPitch)
- mi->pitch = G3D::wrap(data.read<float>(), float(-M_PI), float(M_PI));
- break;
- case MSEFallTime:
- if (hasFallData)
- data >> mi->jump.fallTime;
- break;
- case MSEFallVerticalSpeed:
- if (hasFallData)
- data >> mi->jump.zspeed;
- break;
- case MSEFallCosAngle:
- if (hasFallData && hasFallDirection)
- data >> mi->jump.cosAngle;
- break;
- case MSEFallSinAngle:
- if (hasFallData && hasFallDirection)
- data >> mi->jump.sinAngle;
- break;
- case MSEFallHorizontalSpeed:
- if (hasFallData && hasFallDirection)
- data >> mi->jump.xyspeed;
- break;
- case MSESplineElevation:
- if (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();
- break;
- case MSEExtraElement:
- extras->ReadNextElement(data);
- break;
- default:
- ASSERT(Movement::PrintInvalidSequenceElement(element, __FUNCTION__));
- break;
- }
- }
-
- mi->guid = guid;
- mi->transport.guid = tguid;
-
//! Anti-cheat checks. Please keep them in seperate if () blocks to maintain a clear overview.
//! Might be subject to latency, so just remove improper flags.
#ifdef TRINITY_DEBUG
@@ -26492,7 +26279,7 @@ void Player::ReadMovementInfo(WorldPacket& data, MovementInfo* mi, Movement::Ext
{ \
if (check) \
{ \
- TC_LOG_DEBUG("entities.unit", "Player::ReadMovementInfo: Violation of MovementFlags found (%s). " \
+ TC_LOG_DEBUG("entities.unit", "Player::ValidateMovementInfo: Violation of MovementFlags found (%s). " \
"MovementFlags: %u, MovementFlags2: %u for player %s. Mask %u will be removed.", \
STRINGIZE(check), mi->GetMovementFlags(), mi->GetExtraMovementFlags(), GetGUID().ToString().c_str(), maskToRemove); \
mi->RemoveMovementFlag((maskToRemove)); \
@@ -26549,21 +26336,18 @@ void Player::ReadMovementInfo(WorldPacket& data, MovementInfo* mi, Movement::Ext
e.g. aerial combat.
*/
- REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_FLYING | MOVEMENTFLAG_CAN_FLY) && ToPlayer()->GetSession()->GetSecurity() == SEC_PLAYER &&
- !ToPlayer()->m_mover->HasAuraType(SPELL_AURA_FLY) &&
- !ToPlayer()->m_mover->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED),
+ REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_FLYING | MOVEMENTFLAG_CAN_FLY) && GetSession()->GetSecurity() == SEC_PLAYER &&
+ !m_mover->HasAuraType(SPELL_AURA_FLY) &&
+ !m_mover->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED),
MOVEMENTFLAG_FLYING | MOVEMENTFLAG_CAN_FLY);
REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY | MOVEMENTFLAG_CAN_FLY) && mi->HasMovementFlag(MOVEMENTFLAG_FALLING),
MOVEMENTFLAG_FALLING);
- REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_FALLING) && (!hasFallData || !hasFallDirection), MOVEMENTFLAG_FALLING);
-
- REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION) &&
- (!hasSplineElevation || G3D::fuzzyEq(mi->splineElevation, 0.0f)), MOVEMENTFLAG_SPLINE_ELEVATION);
+ REMOVE_VIOLATING_FLAGS(mi->HasMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION) && G3D::fuzzyEq(mi->splineElevation, 0.0f), MOVEMENTFLAG_SPLINE_ELEVATION);
// Client first checks if spline elevation != 0, then verifies flag presence
- if (hasSplineElevation)
+ if (G3D::fuzzyNe(mi->splineElevation, 0.0f))
mi->AddMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION);
#undef REMOVE_VIOLATING_FLAGS
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index e263dd70bee..e74353f31a4 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2593,7 +2593,7 @@ class Player : public Unit, public GridObject<Player>
bool IsInWhisperWhiteList(ObjectGuid guid);
void RemoveFromWhisperWhiteList(ObjectGuid guid) { WhisperList.remove(guid); }
- void ReadMovementInfo(WorldPacket& data, MovementInfo* mi, Movement::ExtraMovementStatusElement* extras = NULL);
+ void ValidateMovementInfo(MovementInfo* mi);
/*! These methods send different packets to the client in apply and unapply case.
These methods are only sent to the current unit.