Доделать античит на Телепорт
#1

Всем привет .
прошу помощи, нужно немного доделать ач на телепорт, немного не понимаю логики.

вот примерный код:

PHP Code:
_aSetPlayerPos(playeridFloat:xFloat:yFloat:
{
PlayerInfo[playerid][ TimeTP ] = gettime();
PlayerInfo[playerid][pX] = x;
PlayerInfo[playerid][pY] = y;
PlayerInfo[playerid][pZ] = z;
SetPlayerPosplayeridFloat:xFloat:yFloat:) ;
return 
true;

И сам код античита:

PHP Code:
new Floatx[3];
GetPlayerPos(ix, ,,);
if( 
gettime() - PlayerInfo[i][ TimeTP ] > 3)
{
 
Если прошло больше трех секунд с момента сервервного ТПто начинаем проверять его на ТПаирбрейкифлаии тд.
}
else
{
 
если меньшеточтобы было меньше ошибок античит из-за лагов игрока\серверамы записывем новые координаты в переменные:
PlayerInfo[i][pX] = x;
PlayerInfo[i][pY] = x;
PlayerInfo[i][pZ] = x;

Работает все нормально, кроме того, что есть дыра в данной реализации, когда нам меняет позицию сервер(вход\выход из интерьера), то у нас есть эти самые три секунды, в которые мы можем телепортироваться куда угодно и потом сам сервер запишет наши координаты на новые и сервер не увидит, что это чит.

Пробовал и запоминать позицию перед тп, а в эти три секунды застоя сравнивать, что если игрок не стоит на новых и на старых - то чит.
Но все равно очень коряво работает.

Надеюсь на помощь.
Спасибо.
Reply
#2

Quote:
Originally Posted by youngPimp
View Post
Пробовал и запоминать позицию перед тп, а в эти три секунды застоя сравнивать, что если игрок не стоит на новых и на старых - то чит.
Но все равно очень коряво работает.
Идея правильная, нужно лишь сравнивать их не точь-в-точь, а брать какой-то радиус, например через IsPlayerInRangeOfPoint:
Code:
else if(IsPlayerInRangeOfPoint(playerid, 10.0, PlayerInfo[i][pX], PlayerInfo[i][pY], PlayerInfo[i][pZ])) //Расстояние бери лучше большое, ибо после телепорта и отбежать немного можно, да и пинг, все дела...
{
    //И уже только в этом случае верим игроку
    PlayerInfo[i][pX] = x;
    PlayerInfo[i][pY] = x;
    PlayerInfo[i][pZ] = x;
}
Reply
#3

Тоже было очень много левых варнингов

Использовался такой код в эти секунды "паузы".
PHP Code:
if(!IsPlayerInRangeOfPoint(playerid30.0PlayerInfo[i][pX], PlayerInfo[i][pY], PlayerInfo[i][pZ]) &&
!
IsPlayerInRangeOfPoint(playerid30.0last_pos,last_poslast_pos) )
{
сообщение администрации

Reply
#4

PHP Code:
last_pos,last_poslast_pos 
Видимо не весь ты код античита скинул
Reply
#5

Я же говорю, пробовал разные варианты.
Ничего сверхъестественного нет, в _aSetPlayerPos перед ТП делаем GetPlayerPos(playerid, last_pos,last_pos, last_pos );
Reply
#6

Quote:
Originally Posted by youngPimp
View Post
Я же говорю, пробовал разные варианты.
Ничего сверхъестественного нет, в _aSetPlayerPos перед ТП делаем GetPlayerPos(playerid, last_pos,last_pos, last_pos );
Ну так скинул бы конечный вариант античита полностью, чтобы можно было уже что-то точно предполагать или думать. Из того, что имеем сейчас, я бы вот так сделать попробовал:
PHP Code:
_aSetPlayerPos(playeridFloat:xFloat:yFloat:z
{
    if(
SetPlayerPos(playeridxyz))
    {
        
PlayerInfo[playerid][pX] = x;
        
PlayerInfo[playerid][pY] = y;
        
PlayerInfo[playerid][pZ] = z;
        
PlayerInfo[playerid][TimeTP] = gettime();
        return 
1;
    }
    return 
0;
}
//И сам код античита
new Float:pos_xFloat:pos_yFloat:pos_z;
GetPlayerPos(ipos_xpos_ypos_z);
if(
gettime() - PlayerInfo[i][TimeTP] > 3)
{
    
//Проверки античитов
}
else if(
IsPlayerInRangeOfPoint(i10.0PlayerInfo[i][pX], PlayerInfo[i][pY], PlayerInfo[i][pZ]))
{
    
//"Тайм-аут" неприкосновенности. Верим, только если игрок уже телепортировался и в неком радиусе от нового места
    
PlayerInfo[i][pX] = pos_x;
    
PlayerInfo[i][pY] = pos_y;
    
PlayerInfo[i][pZ] = pos_z;

...Но раз ты дважды проверял нахождение возле установленной в pX, pY и pZ и возле "предыдущей" позиции, т.е.:
Quote:
Originally Posted by youngPimp
View Post
PHP Code:
if(!IsPlayerInRangeOfPoint(playerid30.0PlayerInfo[i][pX], PlayerInfo[i][pY], PlayerInfo[i][pZ]) &&
!
IsPlayerInRangeOfPoint(playerid30.0last_pos,last_poslast_pos) ) //<- 
То смею предположить, что установленная в _aSetPlayerPos и предыдущая позиции у тебя хранятся в разных переменных, потому и хорошо было бы увидеть, как это реализовано у тебя, возможно там где-то промах какой.
Reply
#7

Ничего такого.


PHP Code:
_aSetPlayerPos(playeridFloat:xFloat:yFloat:)  

GetPlayerPos(playeridlastpos[0],  lastpos[1], lastpos[2]); 
PlayerInfo[playerid][ TimeTP ] = gettime(); 
PlayerInfo[playerid][pX] = x
PlayerInfo[playerid][pY] = y
PlayerInfo[playerid][pZ] = z
SetPlayerPosplayeridFloat:xFloat:yFloat:) ; 
return 
true

Reply
#8

Quote:
Originally Posted by youngPimp
View Post
PHP Code:
GetPlayerPos(playeridlastpos[0],  lastpos[1], lastpos[2]); 
Так у тебя один массив на всех игроков что ли?
Reply
#9

Нет.
Это простой пример.
Reply
#10

Quote:
Originally Posted by youngPimp
View Post
Нет.
Это простой пример.
А я попросил код, который на практике для анализа скинуть, а не примеры. Они-то как раз вполне ясны
Reply
#11

Так там больше ничего не и не нужно.

PHP Code:
_aSetPlayerPos(playeridFloat:xFloat:yFloat:)   
{  
GetPlayerPos(playeridlastpos[0],  lastpos[1], lastpos[2]);  
PlayerInfo[playerid][ TimeTP ] = gettime();  
PlayerInfo[playerid][pX] = x;  
PlayerInfo[playerid][pY] = y;  
PlayerInfo[playerid][pZ] = z;  
SetPlayerPosplayeridFloat:xFloat:yFloat:) ;  
return 
true;  
}  
new 
Float:pos_xFloat:pos_yFloat:pos_z
GetPlayerPos(ipos_xpos_ypos_z); 
if(
gettime() - PlayerInfo[i][TimeTP] > 3

    
//Проверки античитов 

else
{
if(!
IsPlayerInRangeOfPoint(playerid30.0PlayerInfo[i][pX], PlayerInfo[i][pY], PlayerInfo[i][pZ]) && 
!
IsPlayerInRangeOfPoint(playerid30.0lastpos[0],  lastpos[1], lastpos[2]) ) 

сообщение администрации 


Все вот так, не считая что lastpos массив для всех игроков.

Как бы ошибка проявляется только у некоторых.
Ну как у 30% - 40% игроков.
По кду выше флудит античитом, но если там никаких проверок, а просто записываем эти три секунды застоя новые координты, то все ОК.
Но как говорил выше, проблема в том, что за эти три секунды можно куда угодно беспалева тпшнуться.
Reply
#12

Quote:
Originally Posted by youngPimp
View Post
Как бы ошибка проявляется только у некоторых.
Ну как у 30% - 40% игроков.
По кду выше флудит античитом, но если там никаких проверок, а просто записываем эти три секунды застоя новые координты, то все ОК.
Но как говорил выше, проблема в том, что за эти три секунды можно куда угодно беспалева тпшнуться.
Тогда попробуй в моём первоначальном варианте приравнивать и предыдущую позицию текущей, при условии что игрок находится в радиусе либо от установленной, либо от предыдущей позиции.
Reply
#13

Quote:
Originally Posted by youngPimp
View Post
Так там больше ничего не и не нужно.

PHP Code:
_aSetPlayerPos(playeridFloat:xFloat:yFloat:)   
{  
GetPlayerPos(playeridlastpos[0],  lastpos[1], lastpos[2]);  
PlayerInfo[playerid][ TimeTP ] = gettime();  
PlayerInfo[playerid][pX] = x;  
PlayerInfo[playerid][pY] = y;  
PlayerInfo[playerid][pZ] = z;  
SetPlayerPosplayeridFloat:xFloat:yFloat:) ;  
return 
true;  
}  
new 
Float:pos_xFloat:pos_yFloat:pos_z
GetPlayerPos(ipos_xpos_ypos_z); 
if(
gettime() - PlayerInfo[i][TimeTP] > 3

    
//Проверки античитов 

else
{
if(!
IsPlayerInRangeOfPoint(playerid30.0PlayerInfo[i][pX], PlayerInfo[i][pY], PlayerInfo[i][pZ]) && 
!
IsPlayerInRangeOfPoint(playerid30.0lastpos[0],  lastpos[1], lastpos[2]) ) 

сообщение администрации 


Все вот так, не считая что lastpos массив для всех игроков.

Как бы ошибка проявляется только у некоторых.
Ну как у 30% - 40% игроков.
По кду выше флудит античитом, но если там никаких проверок, а просто записываем эти три секунды застоя новые координты, то все ОК.
Но как говорил выше, проблема в том, что за эти три секунды можно куда угодно беспалева тпшнуться.
Заморозь игрока, и как только он окажется на телепортируемой точке, разморозь его, заодно успеет карта подгрузиться.
Reply
#14

Quote:
Originally Posted by White_116
View Post
Заморозь игрока, и как только он окажется на телепортируемой точке, разморозь его, заодно успеет карта подгрузиться.
Так и есть, только отдельной функции при прогрузке своих интерьеров.
И также в них выдает левые варнинги...
Reply
#15

Ну что же, включил логирование.
Чтобы просто проверить свой код

PHP Code:
_aSetPlayerPos(playeridFloat:xFloat:yFloat:)   
{  
GetPlayerPos(playeridlastpos[0],  lastpos[1], lastpos[2]);  
PlayerInfo[playerid][ TimeTP ] = gettime();  
PlayerInfo[playerid][pX] = x;  
PlayerInfo[playerid][pY] = y;  
PlayerInfo[playerid][pZ] = z;  
SetPlayerPosplayeridFloat:xFloat:yFloat:) ;  
return 
true;  
}  
new 
Floatx[3]; 
GetPlayerPos(ix, ,,); 
if( 
gettime() - PlayerInfo[i][ TimeTP ] > 3

АНТИЧИТ ВКЛЮЧАЕТСЯ
КОГДА АНТИЧИТ СДЕЛАЛ ВСЕ ПРОВЕРКИ
ТО МЫ ЗАПИСЫВАЕМ НОВЫЕ ДАННЫЕ:
PlayerInfo[playerid][pX]  = x,
PlayerInfo[playerid][pY]  = x,
PlayerInfo[playerid][pZ] = x;

else 

if( !
IsPlayerInRangeOfPoint(i,20lastpos[0],  lastpos[1], lastpos[2])
&& !
IsPlayerInRangeOfPoint(i,20PlayerInfo[playerid][pX] ,PlayerInfo[playerid][pY] ,PlayerInfo[playerid][pz] ) )
{
ЧИТ!!!                   
new 
FloatXT[3]; GetPlayerPos(iXT[0],XT[1],XT[2]);
printf(" Ошибка АЧ: %s(%i) находится: %f, %f, %f"playerName[i], iXT[0],XT[1],XT[2]);
printf(" Ошибка АЧ: %s - new %f, %f, %f | back - %f, %f, %f"playerName[i], PlayerInfo[playerid][pX] ,PlayerInfo[playerid][pY],PlayerInfo[playerid][pZ], lastpos[0],  lastpos[1], lastpos[2]);
PlayerInfo[playerid][pX]  = x,
PlayerInfo[playerid][pY]  = x,
PlayerInfo[playerid][pZ] = x;
}
else
{
PlayerInfo[playerid][pX]  = x,
PlayerInfo[playerid][pY]  = x,
PlayerInfo[playerid][pZ] = x;
}

Код написан верно в моде, просто для примера не переделываю переменные.


В общем суть такая, в логах вот что появляется:

PHP Code:
Ошибка АЧNickname(0находится1327.016601, -1543.821411902.455932
Ошибка АЧ
Nickname - new 1163.739990, -1538.278198902.454956 back 1164.403442, -1538.339477902.454956 
То есть получается так, что у нас и в lastpos и в переменных новой позиции сохраняется координаты ОТКУДА ЧЕЛОВЕК ВЫХОДИТ.
Поэтому и срабатывает античит, так как двое переменных равны друг другу и мы получаемся вдали от них, когда вышли и наша позиция изменилась

Теперь Ваши мысли?
Спасибо.
Reply
#16

А зачем записывать координаты в ещё одну переменную если можно их записать сразу в PlayerInfo
PHP Code:
new Floatx[3];  
GetPlayerPos(ix, ,,);//запятая не там 
PHP Code:
if(PlayerInfo[i][TimeTP] != 0)//Обнуление в OnPlayerConnect включение только когда будет вызван _aSetPlayerPos
{
    if(
gettime() - PlayerInfo[i][TimeTP] < && !IsPlayerInRangeOfPoint(i20PlayerInfo[playerid][pX], PlayerInfo[playerid][pY], PlayerInfo[playerid][pz]))
    {
                
//ЧИТ!!!
    
}
    
GetPlayerPos(iPlayerInfo[playerid][pX], PlayerInfo[playerid][pY], PlayerInfo[playerid][pZ]);

Reply
#17

Ещё не забывайте что человек по тем или инным причинам может под текстуры уйти, и свалиться ~200 метров от места где он провалился.
Reply
#18

Quote:
Originally Posted by Gettopro
View Post
Ещё не забывайте что человек по тем или инным причинам может под текстуры уйти, и свалиться ~200 метров от места где он провалился.
PHP Code:
тот же самый Nex-AC
if(IsPlayerInRangeOfPoint(playerid8.0ACInfo[playerid][acSetPosX], ACInfo[playerid][acSetPosY], 
(
ACInfo[playerid][acTpToZ] ? ac_Z ACInfo[playerid][acSetPosZ]))) 
или так
PHP Code:
GetPlayerPos(iPos[0], Pos[1], Pos[2]);
if(!
IsPlayerInRangeOfPoint(i8.0PlayerInfo[playerid][pX], PlayerInfo[playerid][pY], Pos[2]) 
Reply
#19

Quote:
Originally Posted by Bren
View Post
PHP Code:
тот же самый Nex-AC
if(IsPlayerInRangeOfPoint(playerid8.0ACInfo[playerid][acSetPosX], ACInfo[playerid][acSetPosY], 
(
ACInfo[playerid][acTpToZ] ? ac_Z ACInfo[playerid][acSetPosZ]))) 
Конкретно этот код не от падения под текстуры, а для функции SetPlayerPosFindZ
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)