diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Entities/Object/Object.h | 4 | ||||
-rwxr-xr-x | src/server/game/Handlers/MiscHandler.cpp | 6 | ||||
-rwxr-xr-x | src/server/game/Handlers/MovementHandler.cpp | 25 | ||||
-rw-r--r-- | src/server/game/Handlers/VehicleHandler.cpp | 17 | ||||
-rwxr-xr-x | src/server/game/Server/WorldSession.cpp | 29 |
5 files changed, 68 insertions, 13 deletions
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index fd8deb1b841..24ddd7973ab 100755 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -482,6 +482,9 @@ struct MovementInfo // spline float splineElevation; + //! Server side only: + bool Violated; + MovementInfo() { pos.Relocate(0, 0, 0, 0); @@ -494,6 +497,7 @@ struct MovementInfo t_guid = 0; t_pos.Relocate(0, 0, 0, 0); t_seat = -1; + Violated = false; } uint32 GetMovementFlags() { return flags; } diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index aaa41ec3519..319cd96c332 100755 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -1621,6 +1621,12 @@ void WorldSession::HandleMoveSetCanFlyAckOpcode(WorldPacket & recv_data) recv_data.read_skip<float>(); // unk2 + if (movementInfo.Violated) + { + recv_data.rfinish(); + return; + } + _player->m_mover->m_movementInfo.flags = movementInfo.GetMovementFlags(); } diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index 7d1233c8f70..55c55ffb246 100755 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -278,6 +278,14 @@ void WorldSession::HandleMovementOpcodes(WorldPacket & recv_data) return; } + //! If some anti-cheat checks in WorldSession::ReadMovementInfo failed, do not process + //! the change of movement server-sided. + if (movementInfo.Violated) + { + recv_data.rfinish(); + return; + } + /* handle special cases */ if (movementInfo.flags & MOVEMENTFLAG_ONTRANSPORT) { @@ -485,9 +493,16 @@ void WorldSession::HandleMoveNotActiveMover(WorldPacket &recv_data) recv_data.readPackGUID(old_mover_guid); MovementInfo mi; - mi.guid = old_mover_guid; ReadMovementInfo(recv_data, &mi); + if (mi.Violated) + { + recv_data.rfinish(); + return; + } + + mi.guid = old_mover_guid; + _player->m_movementInfo = mi; } @@ -513,6 +528,13 @@ void WorldSession::HandleMoveKnockBackAck(WorldPacket & recv_data) MovementInfo movementInfo; ReadMovementInfo(recv_data, &movementInfo); + + if (movementInfo.Violated) + { + recv_data.rfinish(); + return; + } + _player->m_movementInfo = movementInfo; WorldPacket data(MSG_MOVE_KNOCK_BACK, 66); @@ -571,3 +593,4 @@ void WorldSession::HandleSummonResponseOpcode(WorldPacket& recv_data) _player->SummonIfPossible(agree); } +#undef IF_VIOLATED_RETURN
\ No newline at end of file diff --git a/src/server/game/Handlers/VehicleHandler.cpp b/src/server/game/Handlers/VehicleHandler.cpp index ce4f6ccb8fe..161571998a1 100644 --- a/src/server/game/Handlers/VehicleHandler.cpp +++ b/src/server/game/Handlers/VehicleHandler.cpp @@ -43,6 +43,12 @@ void WorldSession::HandleDismissControlledVehicle(WorldPacket &recv_data) mi.guid = guid; ReadMovementInfo(recv_data, &mi); + if (mi.Violated) + { + recv_data.rfinish(); + return; + } + _player->m_movementInfo = mi; _player->ExitVehicle(); @@ -81,7 +87,16 @@ void WorldSession::HandleChangeSeatsOnControlledVehicle(WorldPacket &recv_data) uint64 guid; // current vehicle guid recv_data.readPackGUID(guid); - ReadMovementInfo(recv_data, &vehicle_base->m_movementInfo); + MovementInfo movementInfo; + ReadMovementInfo(recv_data, &movementInfo); + + if (movementInfo.Violated) + { + recv_data.rfinish(); + return; + } + + vehicle_base->m_movementInfo = movementInfo; uint64 accessory; // accessory guid recv_data.readPackGUID(accessory); diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 66d79884e95..6ae9f4f6781 100755 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -807,48 +807,53 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo* mi) if (mi->HasMovementFlag(MOVEMENTFLAG_SPLINE_ELEVATION)) data >> mi->splineElevation; + //! Anti-cheat checks. Please keep them in seperate if() blocks to maintain a clear overview. + #define VIOLATE_AND_RETURN \ + mi->Violated = true; \ + return; \ + /*! This must be a packet spoofing attempt. MOVEMENTFLAG_ROOT sent from the client is not valid, and when used in conjunction with any of the moving movement flags such as MOVEMENTFLAG_FORWARD it will freeze clients that receive this player's movement info. */ if (mi->HasMovementFlag(MOVEMENTFLAG_ROOT)) - mi->flags &= ~MOVEMENTFLAG_ROOT; + VIOLATE_AND_RETURN; //! Cannot hover and jump at the same time if (mi->HasMovementFlag(MOVEMENTFLAG_HOVER) && mi->HasMovementFlag(MOVEMENTFLAG_JUMPING)) - mi->flags &= ~MOVEMENTFLAG_JUMPING; + VIOLATE_AND_RETURN; //! Cannot ascend and descend at the same time if (mi->HasMovementFlag(MOVEMENTFLAG_ASCENDING) && mi->HasMovementFlag(MOVEMENTFLAG_DESCENDING)) - mi->flags &= ~(MOVEMENTFLAG_ASCENDING | MOVEMENTFLAG_DESCENDING); + VIOLATE_AND_RETURN; //! Cannot move left and right at the same time if (mi->HasMovementFlag(MOVEMENTFLAG_LEFT) && mi->HasMovementFlag(MOVEMENTFLAG_RIGHT)) - mi->flags &= ~(MOVEMENTFLAG_LEFT | MOVEMENTFLAG_RIGHT); + VIOLATE_AND_RETURN; //! Cannot strafe left and right at the same time if (mi->HasMovementFlag(MOVEMENTFLAG_STRAFE_LEFT) && mi->HasMovementFlag(MOVEMENTFLAG_STRAFE_RIGHT)) - mi->flags &= ~(MOVEMENTFLAG_STRAFE_LEFT | MOVEMENTFLAG_STRAFE_RIGHT); + VIOLATE_AND_RETURN; //! Cannot pitch up and down at the same time if (mi->HasMovementFlag(MOVEMENTFLAG_PITCH_UP) && mi->HasMovementFlag(MOVEMENTFLAG_PITCH_DOWN)) - mi->flags &= ~(MOVEMENTFLAG_PITCH_UP | MOVEMENTFLAG_PITCH_DOWN); + VIOLATE_AND_RETURN; //! Cannot move forwards and backwards at the same time if (mi->HasMovementFlag(MOVEMENTFLAG_FORWARD) && mi->HasMovementFlag(MOVEMENTFLAG_BACKWARD)) - mi->flags &= ~(MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_BACKWARD); + VIOLATE_AND_RETURN; //! Cannot walk on water without SPELL_AURA_WATER_WALK if (mi->HasMovementFlag(MOVEMENTFLAG_WATERWALKING) && !GetPlayer()->HasAuraType(SPELL_AURA_WATER_WALK)) - mi->flags &= ~MOVEMENTFLAG_WATERWALKING; + VIOLATE_AND_RETURN; //! Cannot feather fall without SPELL_AURA_FEATHER_FALL if (mi->HasMovementFlag(MOVEMENTFLAG_FALLING_SLOW) && !GetPlayer()->HasAuraType(SPELL_AURA_FEATHER_FALL)) - mi->flags &= ~MOVEMENTFLAG_FALLING_SLOW; + VIOLATE_AND_RETURN; //! Cannot hover without SPELL_AURA_HOVER if (mi->HasMovementFlag(MOVEMENTFLAG_HOVER) && !GetPlayer()->HasAuraType(SPELL_AURA_HOVER)) - mi->flags &= ~MOVEMENTFLAG_HOVER; + VIOLATE_AND_RETURN; /*! Cannot fly if no fly auras present. Exception is being a GM. Note that we check for account level instead of Player::IsGameMaster() because in some @@ -859,7 +864,9 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo* mi) if (mi->HasMovementFlag(MOVEMENTFLAG_FLYING | MOVEMENTFLAG_CAN_FLY) && GetSecurity() == SEC_PLAYER && !GetPlayer()->m_mover->HasAuraType(SPELL_AURA_FLY) && !GetPlayer()->m_mover->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED)) - mi->flags &= ~(MOVEMENTFLAG_FLYING | MOVEMENTFLAG_CAN_FLY); + VIOLATE_AND_RETURN; + + #undef VIOLATE_AND_RETURN } void WorldSession::WriteMovementInfo(WorldPacket* data, MovementInfo* mi) |