PHP код:
new Float:pos_x[MAX_PLAYERS], Float:pos_y[MAX_PLAYERS],
Float:pos_z[MAX_PLAYERS], SpeedCheck[MAX_PLAYERS];
stock SetPlayerPosEx(playerid, Float:X, Float:Y, Float:Z)
{
SetPVarInt(playerid, "PauseUpdate", 3);
SetPlayerPos(playerid, X, Y, Z);
return 1;
}
#if defined _ALS_SetPlayerPos
#undef SetPlayerPos
#else
#define _ALS_SetPlayerPos
#endif
#define SetPlayerPos SetPlayerPosEx
public OnPlayerSpawn(playerid)
{
SpeedCheck[playerid] = SetTimerEx("UpdatePosition", 250, 1, "i", playerid);
//под секунду тоже настроить можно, только цифры p_distance свои вычисляйте
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
KillTimer(SpeedCheck[playerid]);
return 1;
}
forward UpdatePosition(playerid);
public UpdatePosition(playerid)
{
new Float:p_x, Float:p_y, Float:p_z;
GetPlayerPos(playerid, p_x, p_y, p_z);
new Float:p_distance =
floatpower(p_x - pos_x[playerid],2.0) +
floatpower(p_y - pos_y[playerid],2.0) +
floatpower(p_z - pos_z[playerid],2.0);
pos_x[playerid] = p_x;
pos_y[playerid] = p_y;
pos_z[playerid] = p_z;
//у меня 2 разные функции на проверку скорости Onfoot и Vehicle(мне так удобнее),
//у вас может быть другая функция на проверку скорости через GetPlayerVelocity вот её и юзайте в проверке
if((SpeedOnfoot(playerid) == 0 || SpeedVehicle(playerid) == 0) && p_distance > 50.0 && !GetPVarInt(playerid,"PauseUpdate"))
{
SetPVarInt(playerid,"KickPlayer",GetPVarInt(playerid,"KickPlayer")+1);
//Ложные срабатывания при смерти и ТП к администрации
//Почему 2 спросите? Потому что может стоять костыль на респ после смерти который меняет респу при смерти и перед её респом
if(GetPVarInt(playerid,"KickPlayer") > 2) //Можно поставить 3 и тем самым дать чуток форы читеру на 250 мсек =D
{
//Ставим здесь наказание негодяю)
}
}
if(p_distance == 0.0 && GetPVarInt(playerid,"KickPlayer")) DeletePVar(playerid,"KickPlayer"); //Если не шевелимся, то обнуляем..
// 4 раза в секунду это стабильное обновление проверки, можно поменять, но тут придется менять и значение p_distance
return 1;
}