public onCheckAirBrk(playerid)
{
new Float: AC::Pos[3], Float: distance;
GetPlayerPos(playerid, AC::Pos[0], AC::Pos[1], AC::Pos[2]);
distance = floatround(GetPlayerDistanceFromPoint(playerid, AC::Info[playerid][AC::Pos_X], AC::Info[playerid][AC::Pos_Y], AC::Info[playerid][AC::Pos_Z]));
if(GetPVarInt(playerid, "Protect") == 0)
{
if(GetPlayerState(playerid) == 1)
{
if(distance > 40) CheatKick(playerid, "3");
}
else
{
if(distance > 80) CheatKick(playerid, "3");
}
}
AC::Info[playerid][AC::Pos_X] = AC::Pos[0];
AC::Info[playerid][AC::Pos_Y] = AC::Pos[1];
AC::Info[playerid][AC::Pos_Z] = AC::Pos[2];
if(GetTickCount() - AC::Info[playerid][AC::LastUpdate] > 2000) SetPVarInt(playerid, "Protect", 500);
AC::Info[playerid][AC::LastUpdate] = GetTickCount();
return true;
}
stock IsPlayerSpawn(playerid)
{
return GetPVarInt(playerid, "IsSpawn") != 0;
}
stock SetPlayerSpawnStatus(playerid, status)
{
SetPVarInt(playerid, "IsSpawn", status);
}
public OnPlayerSpawn(playerid)
{
SetPlayerSpawnStatus(playerid, 1);
return 1;
}
public OnPlayerDeath(playerid, killerid, reason)
{
SetPlayerSpawnStatus(playerid, 0);
return 1;
}
public onCheckAirBrk(playerid)
{
if (!IsPlayerSpawn(playerid)) {
return 0;
}
new Float: AC::Pos[3], Float: distance;
GetPlayerPos(playerid, AC::Pos[0], AC::Pos[1], AC::Pos[2]);
distance = floatround(GetPlayerDistanceFromPoint(playerid, AC::Info[playerid][AC::Pos_X], AC::Info[playerid][AC::Pos_Y], AC::Info[playerid][AC::Pos_Z]));
if(GetPVarInt(playerid, "Protect") == 0)
{
if(GetPlayerState(playerid) == 1)
{
if(distance > 40) CheatKick(playerid, "3");
}
else
{
if(distance > 80) CheatKick(playerid, "3");
}
}
AC::Info[playerid][AC::Pos_X] = AC::Pos[0];
AC::Info[playerid][AC::Pos_Y] = AC::Pos[1];
AC::Info[playerid][AC::Pos_Z] = AC::Pos[2];
if(GetTickCount() - AC::Info[playerid][AC::LastUpdate] > 2000) SetPVarInt(playerid, "Protect", 500);
AC::Info[playerid][AC::LastUpdate] = GetTickCount();
return 1;
}
[PAWN]
Но как показала практика, вызов SetPlayerSpawnStatus(playerid, 1) лучше производить через некоторое время после вызова OnPlayerSpawn. |
Это вы ввели собственную условную функцию (SetPlayerSpawnStatus)?
|
stock IsPlayerSpawn(playerid)
{
return GetPVarInt(playerid, "IsSpawn") != 0;
}
stock SetPlayerSpawnStatus(playerid, status)
{
SetPVarInt(playerid, "IsSpawn", status);
}
Ну да, две функции, выше они описаны. Ну вот ещё раз:
pawn Код:
|
SetPVarInt(playerid, "Protect", 500); при коннекте.
Я так полагаю что изначально AC::Info[*][AC::Pos_*] равно нулю и соответствено система считает что вы телепортировались, потому что вы явно после подключения человека перемещаете куда-то. |
stock CheatKick(id,code[])
{
if(GetPVarInt(id, "cheater") > 0) return true;
if(IsPlayerInAnyVehicle(id)) SetVehicleToRespawn(GetPlayerVehicleID(id));
SendClientMessage(id, COLOR_LIGHTRED, "Примечание: К ложным определениям античита могут привести следующие факторы:");
SendClientMessage(id, COLOR_LIGHTRED, "Высокий пинг, слабое интернет-соединение, проблемы на сервере, настоящие читы");
format(stringer, 128, "[Античит] Вы были кикнуты в связи с подозрением в читерстве. Код события: #00%i", code);
SendClientMessage(id, COLOR_LIGHTRED, stringer);
SetPVarInt(id, "cheater", GetPVarInt(id, "cheater") + 1);
GKick(id);
return true;
}
stock oSetPlayerPos(playerid, Float:x, Float:y, Float:z)
{
AC::Info[playerid][AC::Pos_X] = x;
AC::Info[playerid][AC::Pos_Y] = y;
AC::Info[playerid][AC::Pos_Z] = z;
SetPlayerPos(playerid, x, y, z);
}
#define SetPlayerPos oSetPlayerPos
Тогда ещё это вверх добавь:
pawn Код:
|