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;
}