Можно было поставить после 1 но могут быть ложные срабатывания.
Так вот приступим.
Ко всем new:
new LastCheck[MAX_PLAYERS]; new IsPlayerAirBreaking[MAX_PLAYERS]; new Float: CurrentPos[MAX_PLAYERS][3]; new FullyConnected[MAX_PLAYERS];
Добавим в OnGameModeInit:
SetTimer("AntiAirBreak", 100, true); // Можно заменить таймер до кика 100
Потом OnPlayerConnect:
FullyConnected[playerid] = true; IsPlayerAirBreaking[playerid] = 0;
В public OnPlayerDisconnect:
FullyConnected[playerid] = false;
И в конец мода добавим Паблики:
forward AntiAirBreak();
public AntiAirBreak()
{
new Float:x, Float:y, Float:z;
new pstate;
new string[256];
for(new i = 0; i < GetMaxPlayers(); i++)
{
if(!IsPlayerNPC(i) && FullyConnected[i] && GetPlayerPos(i, x, y, z))
{
pstate = GetPlayerState(i);
if(pstate == PLAYER_STATE_ONFOOT || (pstate == PLAYER_STATE_DRIVER && GetPlayerSpeed(i) < 10))
{
new var = (floatround(floatsqroot(GetSquareDistance(x, y, z, CurrentPos[i][0], CurrentPos[i][1], CurrentPos[i][2])) * 3600) / (GetTickCount() - LastCheck[i]));
if(var >= 320 && var <= 10000) // Минимал 320 макс 10000
{
IsPlayerAirBreaking[i] = 1;
format(string, sizeof(string), "CEPBEP:{FF00FF} %s[%d] {00FF00}was kicked, reason: {FFFFFF}AirBag", PlayerName(i), i);
SendClientMessageToAll(-1, string);
Kick(i);
}
}
}
CurrentPos[i][0] = x;
CurrentPos[i][1] = y;
CurrentPos[i][2] = z;
LastCheck[i] = GetTickCount();
}
return 1;
}
stock GetPlayerSpeed(playerid)
{
new Float:x, Float:y, Float:z;
if(IsPlayerInAnyVehicle(playerid))
GetVehicleVelocity(GetPlayerVehicleID(playerid), x, y, z);
else
GetPlayerVelocity(playerid, x, y, z);
return floatround(floatsqroot(x * x + y * y + z * z) * 160.0);
}
stock GetSquareDistance(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2)
{
x1 -= x2;
y1 -= y2;
z1 -= z2;
x1 *= x1;
y1 *= y1;
z1 *= z1;
return floatround(x1 + y1 + z1);
}
stock PlayerName(playerid)
{
new pname[MAX_PLAYER_NAME];
GetPlayerName(playerid, pname, MAX_PLAYER_NAME);
return pname;
}
Автор: Leonardo_Gun
Вход
Регистрация
Помощь

Тема закрыта












