Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 42 additions & 31 deletions src/Hooks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -246,43 +246,63 @@ static BYTE HOOK_GetPacketID(Packet *p)
pPlayerData[playerid]->dwLastUpdateTick = GetTickCount();
pPlayerData[playerid]->bEverUpdated = true;

if (packetId == ID_VEHICLE_SYNC || packetId == ID_PASSENGER_SYNC)
if (packetId == ID_VEHICLE_SYNC || packetId == ID_PASSENGER_SYNC || packetId == ID_UNOCCUPIED_SYNC)
{
RakNet::BitStream bsData(p->data, p->length, false);
CVehicleSyncData pVehicleSync;
static CVector emptyVector = CVector(0.0f, 0.0f, 0.0f);
CVector* vecPosition = &emptyVector;
CVector* vecVelocity = &emptyVector;
float fTrainSpeed = 0.0f;
CVehicleSyncData *vd = NULL;
CUnoccupiedSyncData *ud = NULL;
CPassengerSyncData *pd = NULL;

switch (packetId) {
case ID_VEHICLE_SYNC:
vd = (CVehicleSyncData*)(&p->data[1]);
vecPosition = &vd->vecPosition;
vecVelocity = &vd->vecVelocity;
fTrainSpeed = vd->fTrainSpeed;
break;

bsData.SetReadOffset(8);
bsData.Read((char*)&pVehicleSync, sizeof(pVehicleSync));

pVehicleSync.wKeys = 0;
pVehicleSync.wUDAnalog = 0;
pVehicleSync.wLRAnalog = 0;
case ID_UNOCCUPIED_SYNC:
ud = (CUnoccupiedSyncData*)(&p->data[1]);
vecPosition = &ud->vecPosition;
vecVelocity = &ud->vecVelocity;
break;

case ID_PASSENGER_SYNC:
pd = (CPassengerSyncData*)(&p->data[1]);
vecPosition = &pd->vecPosition;
break;

default:
break;
}
// 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 ||
if (vecPosition->fX < -20000.0f || vecPosition->fX > 20000.0f ||
vecPosition->fY < -20000.0f || vecPosition->fY > 20000.0f ||
vecPosition->fZ < -20000.0f || 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 ||
vecVelocity->fX > 35.0f || vecVelocity->fX < -35.0f ||
vecVelocity->fY > 35.0f || vecVelocity->fY < -35.0f ||
vecVelocity->fZ > 35.0f || 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)
!isfinite(vecPosition->fX) || !isfinite(vecPosition->fY) || !isfinite(vecPosition->fZ) ||
!isfinite(vecVelocity->fX) || !isfinite(vecVelocity->fY) || !isfinite(vecVelocity->fZ)
)
{
return 0xFF;
}

// Fix "bike crash"
if (pVehicleSync.fTrainSpeed > 1000.0 || pVehicleSync.fTrainSpeed < 0.0)
if (fTrainSpeed > 1000.0f || fTrainSpeed < 0.0f)
{
return 0xFF;
}
Expand Down Expand Up @@ -320,25 +340,16 @@ static BYTE HOOK_GetPacketID(Packet *p)
*/
}

/* Doesn't work - tested :(
if (packetId == ID_PLAYER_SYNC)
{
//logprintf("ID_PLAYER_SYNC");
RakNet::BitStream bsData(p->data, p->length, false);
CSyncData pSyncData;

bsData.SetReadOffset(8);
bsData.Read((char*)&pSyncData, sizeof(pSyncData));

//logprintf("health: %d, weapon: %d, specialaction: %d", pSyncData.byteHealth, pSyncData.byteWeapon, pSyncData.byteSpecialAction);
CSyncData *pSyncData = (CSyncData*)(&p->data[1]);

if (pSyncData.byteWeapon == 44 || pSyncData.byteWeapon == 45)
// Fix nightvision and infrared sync
if (pSyncData->byteWeapon == 44 || pSyncData->byteWeapon == 45)
{
pSyncData.byteWeapon = 0;
//logprintf("nightvision");
pSyncData->wKeys &= ~4;
}
}
*/

// Stats and weapons update
if (packetId == ID_STATS_UPDATE)
Expand Down
12 changes: 11 additions & 1 deletion src/main.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,23 @@
#include <unistd.h>
#include <sys/time.h>
#include <sys/times.h>
#include <sys/socket.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/sysinfo.h>
#include <sys/stat.h>
#include <dirent.h>
#include <cstring>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/mman.h>
#include <fnmatch.h>

typedef const char *PCHAR;
typedef int SOCKET;

#define INVALID_SOCKET -1

#ifndef stricmp
#define stricmp strcasecmp
#endif
Expand Down Expand Up @@ -113,4 +123,4 @@ extern CNetGame *pNetGame;
extern void *pConsole;
extern RakServer *pRakServer;

#endif
#endif