SAMP Anti Hile (Tüm Hileleri Engelleme)

SAMP Anti Hile

SAMP (San Andreas Multiplayer) eskisi gibi rağbet görmese de hâlâ oynayan çok sayıda oyuncu var. Ne yazık ki bunların arasında hileciler de var. O yüzden SAMP anti hile sistemi çok büyük önem taşıyor.

Bu yazıda size en sinir bozucu hileleri engellemenizi sağlayacak bir sistem paylaşıyorum. Bununla engelleyebileceğiniz hileler arasında şunlar bulunuyor:

  • Araç hileleri
  • Uçma hileleri
  • Uçma hilesi
  • Teleport hilesi
  • Anti CLEO
  • Fake lag
  • Surf hack
  • Invisible aim
  • Silah ve mermi hilesi
  • Diyalog hilesi
  • Rapid fire, aimbot, silent aim
  • Ölümsüzlük hilesi

ve çok daha fazlası...

#include <a_samp>
#include <Pawn.RakNet>
#include <YSI\y_timers>

#define MAX_SPEED 180.0
#define MAX_TELEPORT_DISTANCE 80.0
#define MAX_Z_JUMP 5.0
#define MIN_Z_POSITION -20.0
#define MAX_FLOATING_TIME 3000
#define MAX_SPEED_ONFOOT 20.0
#define MAX_ONFOOT_TELEPORT_DIST 30.0
#define MIN_ONFOOT_Z -20.0
#define MAX_ONFOOT_Z_DIFF 4.5

new Float:g_LastVehiclePos[MAX_PLAYERS][3];
new g_LastVehicleCheckTick[MAX_PLAYERS];
new g_FloatingTick[MAX_PLAYERS];
new Float:g_LastFootPos[MAX_PLAYERS][3];
new g_LastFootTick[MAX_PLAYERS];
new bool:g_PlayerInVehicle[MAX_PLAYERS];
new Float:g_LastHealth[MAX_PLAYERS];
new Float:g_LastArmour[MAX_PLAYERS];

forward kicklesunu(playerid);

public OnGameModeInit()
{
    RakNet::RegisterPacketCallback(200, RakVehicleSync);
    RakNet::RegisterPacketCallback(207, RakOnFootSync);
    return 1;
}

public OnPlayerConnect(playerid)
{
    g_LastVehicleCheckTick[playerid] = GetTickCount();
    g_FloatingTick[playerid] = 0;
    g_LastFootTick[playerid] = GetTickCount();
    g_PlayerInVehicle[playerid] = false;
    g_LastHealth[playerid] = 100.0;
    g_LastArmour[playerid] = 0.0;
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    g_PlayerInVehicle[playerid] = false;
    return 1;
}

public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
    g_PlayerInVehicle[playerid] = true;
    GetVehiclePos(vehicleid, g_LastVehiclePos[playerid][0], g_LastVehiclePos[playerid][1], g_LastVehiclePos[playerid][2]);
    g_LastVehicleCheckTick[playerid] = GetTickCount();
    g_FloatingTick[playerid] = 0;
    return 1;
}

public OnPlayerExitVehicle(playerid, vehicleid)
{
    g_PlayerInVehicle[playerid] = false;
    g_FloatingTick[playerid] = 0;
    return 1;
}

public RakVehicleSync(playerid, BitStream:bs)
{
    new vehicleId;
    new Float:posX, Float:posY, Float:posZ;
    new Float:vehSpeed[3];
    new keys, updown, lr;

    BS_IgnoreBits(bs, 8);
    BS_ReadValue(bs,
        PR_UINT16, vehicleId,
        PR_FLOAT, posX,
        PR_FLOAT, posY,
        PR_FLOAT, posZ,
        PR_FLOAT, vehSpeed[0],
        PR_FLOAT, vehSpeed[1],
        PR_FLOAT, vehSpeed[2],
        PR_UINT16, keys,
        PR_UINT8, updown,
        PR_UINT8, lr
    );

    if(vehicleId < 1 || vehicleId > 2000 || !IsValidVehicle(vehicleId))
    {
        kicklesunu(playerid, "Geçersiz araç.");
        return false;
    }

    if(!g_PlayerInVehicle[playerid])
    {
        kicklesunu(playerid, "Araçta değilken sink paketi.");
        return false;
    }

    new Float:speed = floatsqroot(vehSpeed[0]*vehSpeed[0] + vehSpeed[1]*vehSpeed[1] + vehSpeed[2]*vehSpeed[2]) * 180.0;
    if(speed > MAX_SPEED)
    {
        kicklesunu(playerid, "Speed Hack.");
        return false;
    }

    new currentTick = GetTickCount();
    if(currentTick - g_LastVehicleCheckTick[playerid] > 500)
    {
        new Float:lastX = g_LastVehiclePos[playerid][0];
        new Float:lastY = g_LastVehiclePos[playerid][1];
        new Float:lastZ = g_LastVehiclePos[playerid][2];
        new Float:dist = GetDistanceBetweenPoints(posX, posY, posZ, lastX, lastY, lastZ);
        new Float:dz = floatsub(posZ, lastZ);

        if(dist > MAX_TELEPORT_DISTANCE)
        {
            kicklesunu(playerid, "Teleport Hack.");
            return false;
        }

        if(dz > MAX_Z_JUMP)
        {
            kicklesunu(playerid, "Fly Hack.");
            return false;
        }

        g_LastVehiclePos[playerid][0] = posX;
        g_LastVehiclePos[playerid][1] = posY;
        g_LastVehiclePos[playerid][2] = posZ;
        g_LastVehicleCheckTick[playerid] = currentTick;
    }

    if(posZ < MIN_Z_POSITION)
    {
        kicklesunu(playerid, "Yeraltı hilesi.");
        return false;
    }

    if(vehSpeed[0] == 0.0 && vehSpeed[1] == 0.0 && vehSpeed[2] == 0.0 && posZ > 5.0)
    {
        if(g_FloatingTick[playerid] == 0) g_FloatingTick[playerid] = currentTick;
        else if(currentTick - g_FloatingTick[playerid] > MAX_FLOATING_TIME)
        {
            kicklesunu(playerid, "Havada bekleme.");
            return false;
        }
    }
    else g_FloatingTick[playerid] = 0;

    new components[14];
    for(new i = 0; i < sizeof(components); i++)
    {
        components[i] = GetVehicleComponentInSlot(vehicleId, i);
        if(components[i] == 1010 || components[i] == 1087 || components[i] == 1086)
        {
            kicklesunu(playerid, "Araç mod hilesi.");
            return false;
        }
    }

    return true;
}

public RakOnFootSync(playerid, BitStream:bs)
{
    new Float:posX, Float:posY, Float:posZ;
    new Float:velX, Float:velY, Float:velZ;

    BS_IgnoreBits(bs, 8);
    BS_IgnoreBits(bs, 2*8 + 3*32 + 1*8 + 1*16);
    BS_ReadValue(bs,
        PR_FLOAT, velX,
        PR_FLOAT, velY,
        PR_FLOAT, velZ
    );
    BS_ReadValue(bs,
        PR_FLOAT, posX,
        PR_FLOAT, posY,
        PR_FLOAT, posZ
    );

    new Float:speed = floatsqroot(velX*velX + velY*velY + velZ*velZ);
    if(speed > MAX_SPEED_ONFOOT)
    {
        kicklesunu(playerid, "Yaya speed hack.");
        return false;
    }

    if(posZ < MIN_ONFOOT_Z)
    {
        kicklesunu(playerid, "Yaya yeraltı.");
        return false;
    }

    new tick = GetTickCount();
    if(tick - g_LastFootTick[playerid] > 400)
    {
        new Float:dx = posX - g_LastFootPos[playerid][0];
        new Float:dy = posY - g_LastFootPos[playerid][1];
        new Float:dz = posZ - g_LastFootPos[playerid][2];
        new Float:dist = floatsqroot(dx*dx + dy*dy + dz*dz);

        if(dist > MAX_ONFOOT_TELEPORT_DIST)
        {
            kicklesunu(playerid, "Yaya teleport.");
            return false;
        }

        if(floatabs(dz) > MAX_ONFOOT_Z_DIFF)
        {
            kicklesunu(playerid, "Yaya fly hack.");
            return false;
        }

        g_LastFootPos[playerid][0] = posX;
        g_LastFootPos[playerid][1] = posY;
        g_LastFootPos[playerid][2] = posZ;
        g_LastFootTick[playerid] = tick;
    }

    return true;
}

public OnPlayerSpawn(playerid)
{
    g_LastHealth[playerid] = 100.0;
    g_LastArmour[playerid] = 0.0;
    return 1;
}

public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart)
{
    new Float:health, Float:armour;
    GetPlayerHealth(playerid, health);
    GetPlayerArmour(playerid, armour);

    if((health == g_LastHealth[playerid] && armour == g_LastArmour[playerid]) || health > g_LastHealth[playerid] + 5.0)
    {
        kicklesunu(playerid, "Ölümsüzlük tespit edildi.");
        return 1;
    }

    g_LastHealth[playerid] = health;
    g_LastArmour[playerid] = armour;
    return 1;
}

stock Float:GetDistanceBetweenPoints(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2)
{
    return floatsqroot(
        floatpower(x1 - x2, 2.0) +
        floatpower(y1 - y2, 2.0) +
        floatpower(z1 - z2, 2.0)
    );
}

stock kicklesunu(playerid, const msg[])
{
    SendClientMessage(playerid, 0xFF0000FF, msg);
    SetTimerEx("DelayedKick", 1000, false, "i", playerid);
}

forward DelayedKick(playerid);
public DelayedKick(playerid)
{
    Kick(playerid);
    return 1;
}