diff --git a/YSF.dll b/YSF.dll new file mode 100644 index 0000000..c9acc9f Binary files /dev/null and b/YSF.dll differ diff --git a/YSF.vcxproj b/YSF.vcxproj index 1bcebf0..1620e30 100644 --- a/YSF.vcxproj +++ b/YSF.vcxproj @@ -85,7 +85,7 @@ true bin\win32\Release\YSF.lib YSF.def - C:\Users\Ati\Desktop\SERVER\plugins\YSF.dll + $(ProjectDir)bin\win32\Release\YSF.dll kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;psapi.lib;winmm.lib;Ws2_32.lib;%(AdditionalDependencies) false false diff --git a/src/Hooks.cpp b/src/Hooks.cpp index 4485190..1858dd8 100644 --- a/src/Hooks.cpp +++ b/src/Hooks.cpp @@ -230,22 +230,50 @@ static BYTE HOOK_GetPacketID(Packet *p) { pPlayerData[playerid]->dwLastUpdateTick = GetTickCount(); pPlayerData[playerid]->bEverUpdated = true; - /* - if (packetId == ID_VEHICLE_SYNC) + + if (packetId == ID_VEHICLE_SYNC || packetId == ID_PASSENGER_SYNC) { RakNet::BitStream bsData(p->data, p->length, false); CVehicleSyncData pVehicleSync; bsData.SetReadOffset(8); bsData.Read((char*)&pVehicleSync, sizeof(pVehicleSync)); - logprintf("keys sync: %d", pVehicleSync.wKeys); pVehicleSync.wKeys = 0; pVehicleSync.wUDAnalog = 0; pVehicleSync.wLRAnalog = 0; + + // Fix "player bugger" + // Causes this screen: http://scrn.sixtytiger.com/sa-mp-026.png + // Happens when a player is in a car with a cheating player, and that cheating player + // manipulates the vehicle position to be outside the GTA:SA position range + if (pVehicleSync.vecPosition.fX < -20000.0f || pVehicleSync.vecPosition.fX > 20000.0f || + pVehicleSync.vecPosition.fY < -20000.0f || pVehicleSync.vecPosition.fY > 20000.0f || + pVehicleSync.vecPosition.fZ < -20000.0f || pVehicleSync.vecPosition.fZ > 20000.0f || + + // MOVE SPEED + + pVehicleSync.vecVelocity.fX > 35.0f || pVehicleSync.vecVelocity.fX < -35.0f || + pVehicleSync.vecVelocity.fY > 35.0f || pVehicleSync.vecVelocity.fY < -35.0f || + pVehicleSync.vecVelocity.fZ > 35.0f || pVehicleSync.vecVelocity.fZ < -35.0f || + + // infinity checks + + !isfinite(pVehicleSync.vecPosition.fX) || !isfinite(pVehicleSync.vecPosition.fY) || !isfinite(pVehicleSync.vecPosition.fZ) || + !isfinite(pVehicleSync.vecVelocity.fX) || !isfinite(pVehicleSync.vecVelocity.fY) || !isfinite(pVehicleSync.vecVelocity.fZ) + ) + { + return 0xFF; + } + + // Fix "bike crash" + if (pVehicleSync.fTrainSpeed > 1000.0 || pVehicleSync.fTrainSpeed < 0.0) + { + return 0xFF; + } } - */ + /* // Based on JernejL's tutorial - http://forum.sa-mp.com/showthread.php?t=172085 DWORD dwDrunkNew = pPlayerPool->dwDrunkLevel[playerid]; @@ -327,6 +355,57 @@ static BYTE HOOK_GetPacketID(Packet *p) //logprintf("bullet crasher detected. id = %d", playerid); return 0xFF; } + + if (pBulletSync.byteHitType == BULLET_HIT_TYPE_PLAYER && ((pBulletSync.vecCenterOfHit.fX > 10.0f || pBulletSync.vecCenterOfHit.fX < -10.0f) || (pBulletSync.vecCenterOfHit.fY > 10.0f || pBulletSync.vecCenterOfHit.fY < -10.0f) || (pBulletSync.vecCenterOfHit.fZ > 10.0f || pBulletSync.vecCenterOfHit.fZ < -10.0f))) + { + return 0xFF; + } + + if (pBulletSync.byteHitType == BULLET_HIT_TYPE_VEHICLE && ((pBulletSync.vecCenterOfHit.fX > 100.0f || pBulletSync.vecCenterOfHit.fX < -100.0f) || (pBulletSync.vecCenterOfHit.fY > 100.0f || pBulletSync.vecCenterOfHit.fY < -100.0f) || (pBulletSync.vecCenterOfHit.fZ > 100.0f || pBulletSync.vecCenterOfHit.fZ < -100.0f))) + { + return 0xFF; + } + + if (pBulletSync.byteHitType == BULLET_HIT_TYPE_OBJECT || pBulletSync.byteHitType == BULLET_HIT_TYPE_PLAYER_OBJECT && ((pBulletSync.vecCenterOfHit.fX > 1000.0 || pBulletSync.vecCenterOfHit.fX < -1000.0) || (pBulletSync.vecCenterOfHit.fY > 1000.0 || pBulletSync.vecCenterOfHit.fY < -1000.0) || (pBulletSync.vecCenterOfHit.fZ > 1000.0 || pBulletSync.vecCenterOfHit.fZ < -1000.0))) + { + return 0xFF; + } + } + + if (packetId == ID_AIM_SYNC) + { + RakNet::BitStream bsData(p->data, p->length, false); + + bsData.SetReadOffset(8); + + CAimSyncData aim; + bsData.Read((char*)&aim, sizeof(aim)); + + float x, y, z; + GetPlayerPos(p->playerIndex, &x, &y, &z); + + float distx = aim.vecPosition.fX - x; + float disty = aim.vecPosition.fY - y; + float distz = aim.vecPosition.fZ - z; + + + if ((abs(distx) + abs(disty) + abs(distz)) > 500.0f) + { + return 0xFF; + } + + if (!isfinite(aim.vecPosition.fX) || !isfinite(aim.vecPosition.fY) || !isfinite(aim.vecPosition.fZ) || + !isfinite(aim.vecFront.fX) || !isfinite(aim.vecFront.fY) || !isfinite(aim.vecFront.fZ)) + { + return 0xFF; + } + + if (aim.vecFront.fX < -9.9f || aim.vecFront.fX > 9.9f || + aim.vecFront.fY < -9.9f || aim.vecFront.fY > 9.9f || + aim.vecFront.fZ < -9.9f || aim.vecFront.fZ > 9.9f) + { + return 0xFF; + } } } return packetId;