[Tutorial] Фикс чита (У кого система аккаунтов - читать обязательно!!!)
#1

Суть чита в том, что он позволяет переподключаться к серверу без вызова OnPlayerDisconnect, соответственно, если у вас при выходе с сервера должны сохраняться деньги или какие то другие переменные аккаунта, они сохранены не будут.

Особенность чита в том, что он может подключить только под тем же ID, который у вас был.


// В начало скрипта
Code:
new PlayerName[MAX_PLAYERS][MAX_PLAYER_NAME];
// Там, где игрок логинится и где регистрирует аккаунт
Code:
GetPlayerName(playerid, PlayerName[playerid], sizeof(PlayerName[]));
// OnPlayerConnect
Code:
if(strlen(PlayerName[playerid]) > 1)
{
	/*
	    Тут баним ник или удаляем аккаунт игроку PlayerName[playerid]
		т.к. на нем возможно имеются дюпнутые деньги или какие то другие вещи

            Но советую всё же банить, а не удалять
	*/
	printf("%s использовал баг", PlayerName[playerid]);
	return 1;
}
GetPlayerName(playerid, PlayerName[playerid], sizeof(PlayerName[]));
// OnPlayerDisconnect
Code:
PlayerName[playerid] = "";
Reply
#2

Чит древний как мир, уже года два ему.
Reply
#3

Но использовать стали недавно
Reply
#4

Зачем так сложно. Ставь при логине pvar с рандомным числом, а при коннекте проверяй. Если pvar > 0 - бань.
Reply
#5

У меня от one slot flood осталось

pawn Code:
new connected[MAX_PLAYERS char];

public OnPlayerConnect(playerid)
{
    if(connected{playerid})
    {
        BanEx(playerid, "One Slot Flood");
        return 0;
    }
    else connected{playerid} = 1;
    //Остальное
}

public OnPlayerDisconnect(playerid, reason)
{
    connected{playerid} = 0;
    //Остальное
}
За тему спасибо. Увидел ее и вспомнил, что недавно этот код перенес ниже обнуления переменных (чего не стоило делать).
Reply
#6

Quote:
Originally Posted by stabker
View Post
У меня от one slot flood осталось

pawn Code:
new connected[MAX_PLAYERS char];

public OnPlayerConnect(playerid)
{
    if(connected{playerid})
    {
        BanEx(playerid, "One Slot Flood");
        return 0;
    }
    else connected{playerid} = 1;
    //Остальное
}

public OnPlayerDisconnect(playerid, reason)
{
    connected{playerid} = 0;
    //Остальное
}
За тему спасибо. Увидел ее и вспомнил, что недавно этот код перенес ниже обнуления переменных (чего не стоило делать).
в твоем коде банит только ип адрес, это не спасет



Quote:

Зачем так сложно. Ставь при логине pvar с рандомным числом, а при коннекте проверяй. Если pvar > 0 - бань.

пвары не сохраняются вроде бы + как я сказал, надо банить старый ник, а не под тем, которым ты подключился, т.е. тебе в любом случае придется использовать массив для хранения ника
Reply
#7

Почему не спасает? OnPlayerConnect > OnPlayerConnect > Ban > OnPlayerDisconnect (сохранение аккаунта).
Reply
#8

Quote:
Originally Posted by stabker
View Post
Почему не спасает? OnPlayerConnect > OnPlayerConnect > Ban > OnPlayerDisconnect (сохранение аккаунта).
второй OnPlayerConnect вызовется с другим ником, с другого аккаунта. Зависит от того как сохраняется акк, у меня лично на пварах, так что такое не прокатит
Reply
#9

Пвар и не должен сохраняться - ещё раз прочитай схему работы, предложенную мной. И ник не надо банить - баньте IP и текущий ник.
Reply
#10

Про этот чит впервые слышу. Решил подстраховаться и сделать так как OKStyle написал. По сути PVar автоматический обнуляются когда вызывается OnPlayerDisconnect, так что не надо проверки по имени.

pawn Code:
public OnPlayerConnect(playerid)
{
    if(GetPVarInt(playerid, "ConnectedWithCheat")) return Ban(playerid);
    SetPVarInt(playerid, "ConnectedWithCheat", 1);
    return 1;
}
Reply
#11

Quote:
Originally Posted by OKStyle
View Post
Пвар и не должен сохраняться - ещё раз прочитай схему работы, предложенную мной. И ник не надо банить - баньте IP и текущий ник.
Напиши код, не совсем понимаю что ты предлагаешь. Текущий ник нельзя банить + банить надо обязательно залоигненный аккаунт


Quote:

if(GetPVarInt(playerid, "ConnectedWithCheat")) return Ban(playerid);
SetPVarInt(playerid, "ConnectedWithCheat", 1);

Во первых, так ты забанишь только ип
Во вторых, так ты не определишь ник игрока, который был до подключения твинка, а банить надо именно его, для этого и хранится ник в массиве
Reply
#12

В OnPlayerConnect:
pawn Code:
if(GetPVarInt(playerid, "Disconnect") > 0)
{
    new PlayerName[MAX_PLAYER_NAME];
    GetPlayerName(playerid, PlayerName, sizeof(PlayerName));
    new string[MAX_PLAYER_NAME + 4];
    format(account, sizeof(account), "%s.ini", PlayerName);
    fremove(account); // файл должен быть закрыт
    BanEx(playerid, "Disconnect");
}
В логин:
pawn Code:
SetPVarInt(playerid, "Disconnect", 1);
Зачем банить имя до перезахода, читер разве его может поменять? Т.е. дублируется инфа с прошлого акка на другой по playerid? Тогда так:

В OnPlayerConnect:
pawn Code:
new PlayerName[MAX_PLAYER_NAME];
GetPVarString(playerid, "Disconnect", PlayerName, sizeof(PlayerName));
if(strlen(PlayerName) > 0)
{
    new string[MAX_PLAYER_NAME + 4];
    format(account, sizeof(account), "%s.ini", PlayerName);
    fremove(account); // файл должен быть закрыт
    BanEx(playerid, "Disconnect");
}
В логин:
pawn Code:
new PlayerName[MAX_PLAYER_NAME];
GetPlayerName(playerid, PlayerName, sizeof(PlayerName));
SetPVarString(playerid, "Disconnect", PlayerName);
Reply
#13

Разве в сампе не фиксанули заход под одним слотом ?
Reply
#14

Quote:

Зачем банить имя до перезахода, читер разве его может поменять?

в том и дело, что да

и я не тестил, сохраняются ли пвары после второго коннекта в 1 слот, так что гарантировать работоспособность твоего кода не могу
Reply
#15

Если не вызывается OnPlayerDisconnect, то сохраняются.
Reply
#16

удалено, тупанул
Reply
#17

Не проще чистить переменные в самом начале OnPlayerConnect?
Reply
#18

Quote:
Originally Posted by ea8de1
View Post
Не проще чистить переменные в самом начале OnPlayerConnect?
А вообще лучше делать переменные с авто чисткой к примеру использовать unixtime для этого... но в этом случаи нужно обновлять драйвера мозга чтобы он смог правильно построить логику для скрипта.
Reply
#19

Quote:
Originally Posted by cm666
View Post
Разве в сампе не фиксанули заход под одним слотом ?
Это же SA:MP...
Reply
#20

Quote:
Originally Posted by FanHamMer
View Post
Это же SA:MP...
Что это должно значить?
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)