PDA

Просмотр полной версии : [Вопрос] Как настроить античиты



Дёня
09.07.2014, 20:08
Приветствую всех!

Вот у меня возникли 2 проблемы.



1 проблема

Как сделать, чтобы максимум с одного IP мог конектится не 2, а 1 игрок.
Вот код:

new ip[2][16];
GetPlayerIp(playerid,ip[0],16);
for(new i, m = GetMaxPlayers(), x; i != m; i++)
{
if(!IsPlayerConnected(i) || i == playerid) continue;
GetPlayerIp(i,ip[1],16);
if(!strcmp(ip[0],ip[1],true)) x++;
if(x > 2) return Kick(i);
}


2 проблема

Вот античит на починку авто читом, но при починке машины командой /repair(может юзать любой игрок) античит все равно кикает, как это исправить?

Вот код:


forward CheckForCheater(playerid);
public CheckForCheater(playerid)
{
if(!IsPlayerInRangeOfPoint(playerid,20,610.9915,-11.1024,1000.9219))
{
if(IsPlayerInAnyVehicle(playerid) && GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
{
if(!player_NoCheckTimeVeh[playerid])
{
GetVehicleHealth(GetPlayerVehicleID(playerid),player_VehHealth[playerid]);
if(player_VehHealth[playerid] > HealthVeh[playerid])
{
if(IsPlayerInRangeOfPoint(playerid,7.5,2064.2842,-1831.4736,13.5469)) { player_NoCheckTimeVeh[playerid] = 3; return 1; }
if(IsPlayerInRangeOfPoint(playerid,7.5,487.6401,-1739.9479,11.1385)) { player_NoCheckTimeVeh[playerid] = 3; return 1; }
if(IsPlayerInRangeOfPoint(playerid,7.5,1024.8651,-1024.0870,32.1016)) { player_NoCheckTimeVeh[playerid] = 3; return 1; }
if(IsPlayerInRangeOfPoint(playerid,7.5,-1904.7019,284.5968,41.0469)) { player_NoCheckTimeVeh[playerid] = 3; return 1; }
if(IsPlayerInRangeOfPoint(playerid,7.5,-2425.7822,1022.1392,50.3977)) { player_NoCheckTimeVeh[playerid] = 3; return 1; }
if(IsPlayerInRangeOfPoint(playerid,7.5,-1420.5195,2584.2305,55.8433)) { player_NoCheckTimeVeh[playerid] = 3; return 1; }
if(IsPlayerInRangeOfPoint(playerid,7.5,-99.9417,1117.9048,19.7417)) { player_NoCheckTimeVeh[playerid] = 3; return 1; }
if(IsPlayerInRangeOfPoint(playerid,7.5,1975.2384,2162.5088,11.0703)) { player_NoCheckTimeVeh[playerid] = 3; return 1; }
if(IsPlayerInRangeOfPoint(playerid,7.5,720.0854,-457.8807,16.3359)) { player_NoCheckTimeVeh[playerid] = 3; return 1; }
format(GlobalInfo,sizeof(GlobalInfo),"[ Anti-Cheat ] '%s' был кикнут с сервера, причина [Repair Car-Hack]",PlayerName(playerid));
SendClientMessage(playerid, 0xFF0000AA, "Вы были кикнуты за починку транспорта читом!");
SendClientMessageToAll(admin2, GlobalInfo);
Kick(playerid);
}
}
else { player_NoCheckTimeVeh[playerid] -= 1; }
GetVehicleHealth(GetPlayerVehicleID(playerid),HealthVeh[playerid]);
}

}
return 1;
}

public OnPlayerStateChange(playerid, newstate, oldstate)
{
if(newstate == PLAYER_STATE_DRIVER)
{
timer2[playerid] = SetTimerEx("CheckForCheater",1000,true,"i",playerid);
player_NoCheckTimeVeh[playerid] = 1;
}
return 1;
}

А вот команда, на починку:


if(strcmp(cmd, "/repair", true) == 0 || strcmp(cmd, "/r", true) == 0)
{
if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid,0xE7E6FFAA,"Вы должны быть в машине");
RepairVehicle(GetPlayerVehicleID(playerid));
Give_Money(playerid,-1000);
PlayerPlaySound(playerid, 1150, 0.0, 0.0, 0.0);
SendClientMessage(playerid,COLOR_GREEN,"[CAR] Транспорт починен! ");
return 1;
}

Spectrum
09.07.2014, 20:21
if(x > 2)
поменяй на 1

underwoker
09.07.2014, 22:18
Выше уже сказали, но можешь использовать этот вариант.

new IP1[16],IP2[16],string[120];
GetPlayerIp(playerid, IP1, sizeof(IP1));
for (new i = GetMaxPlayers()-1; i != -1; --i)
{
if(playerid == i || !IsPlayerConnected(i)) continue;
GetPlayerIp(i, IP2, sizeof(IP2));
if(!strcmp(IP1, IP2, true)) return Kick(i);
}
А хотя какая разница, одно и тоже.

Дёня
09.07.2014, 22:56
Выше уже сказали, но можешь использовать этот вариант.

new IP1[16],IP2[16],string[120];
GetPlayerIp(playerid, IP1, sizeof(IP1));
for (new i = GetMaxPlayers()-1; i != -1; --i)
{
if(playerid == i || !IsPlayerConnected(i)) continue;
GetPlayerIp(i, IP2, sizeof(IP2));
if(!strcmp(IP1, IP2, true)) return Kick(i);
}
А хотя какая разница, одно и тоже.

Спасибо Вам и Spectrum, а решение проблемы с античитом на починку автомобиля не подскажите?

L0ndl3m
09.07.2014, 23:16
решение проблемы с античитом на починку автомобиля не подскажите?
В команду:

player_NoCheckTimeVeh[playerid] = 1;

underwoker
09.07.2014, 23:17
player_NoCheckTimeVeh[playerid] = 1;
В команду добавь
UPD: Londlem опередил.

Дёня
10.07.2014, 17:29
Спасибо Вам всем)

+сы дал всем.

Дёня
12.07.2014, 23:04
поменяй на 1

Подниму старую тему.


Поменяв с x>2 на x>1

То кикает всех игроков, кроме того, кто успел зайти первым

underwoker
13.07.2014, 06:35
Подниму старую тему.


Поменяв с x>2 на x>1

То кикает всех игроков, кроме того, кто успел зайти первым
Ну значит у них IP одинаковые, не?
Либо пробуй мой вариант, только я хз в чем будут отличия.

Дёня
13.07.2014, 14:24
Ну значит у них IP одинаковые, не?
Либо пробуй мой вариант, только я хз в чем будут отличия.

IP не одинаковые, это 100%, т.к. я из Казахстана, а тот кто зашел первый вообще с России.

Сейчас попробую твой вариант.

DeimoS
14.07.2014, 09:15
new ip[2][16];
GetPlayerIp(playerid, ip[0], 16);
for(new i = GetMaxPlayers(); i != -1; i--)
{
if(!IsPlayerConnected(i) || i == playerid) continue;
GetPlayerIp(i, ip[1], 16);
if(!strcmp(ip[0], ip[1], true))
{
printf("Игроки %d и %d кикнуты с сервера, так как их IP совпали (%s | %s)", playerid, i, ip[0], ip[1]);
Kick(i);
return 1;
}
}