_aSetPlayerPos(playerid, Float:x, Float:y, Float:z )
{
PlayerInfo[playerid][ TimeTP ] = gettime();
PlayerInfo[playerid][pX] = x;
PlayerInfo[playerid][pY] = y;
PlayerInfo[playerid][pZ] = z;
SetPlayerPos( playerid, Float:x, Float:y, Float:z ) ;
return true;
}
new Float: x[3];
GetPlayerPos(i, x, ,x ,x );
if( gettime() - PlayerInfo[i][ TimeTP ] > 3)
{
Если прошло больше трех секунд с момента сервервного ТП, то начинаем проверять его на ТП, аирбрейки, флаии тд.
}
else
{
если меньше, то, чтобы было меньше ошибок античит из-за лагов игрока\сервера, мы записывем новые координаты в переменные:
PlayerInfo[i][pX] = x;
PlayerInfo[i][pY] = x;
PlayerInfo[i][pZ] = x;
}
Пробовал и запоминать позицию перед тп, а в эти три секунды застоя сравнивать, что если игрок не стоит на новых и на старых - то чит.
Но все равно очень коряво работает. |
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; }
if(!IsPlayerInRangeOfPoint(playerid, 30.0, PlayerInfo[i][pX], PlayerInfo[i][pY], PlayerInfo[i][pZ]) &&
!IsPlayerInRangeOfPoint(playerid, 30.0, last_pos,last_pos, last_pos) )
{
сообщение администрации
}
last_pos,last_pos, last_pos
Я же говорю, пробовал разные варианты.
Ничего сверхъестественного нет, в _aSetPlayerPos перед ТП делаем GetPlayerPos(playerid, last_pos,last_pos, last_pos ); |
_aSetPlayerPos(playerid, Float:x, Float:y, Float:z)
{
if(SetPlayerPos(playerid, x, y, z))
{
PlayerInfo[playerid][pX] = x;
PlayerInfo[playerid][pY] = y;
PlayerInfo[playerid][pZ] = z;
PlayerInfo[playerid][TimeTP] = gettime();
return 1;
}
return 0;
}
//И сам код античита
new Float:pos_x, Float:pos_y, Float:pos_z;
GetPlayerPos(i, pos_x, pos_y, pos_z);
if(gettime() - PlayerInfo[i][TimeTP] > 3)
{
//Проверки античитов
}
else if(IsPlayerInRangeOfPoint(i, 10.0, PlayerInfo[i][pX], PlayerInfo[i][pY], PlayerInfo[i][pZ]))
{
//"Тайм-аут" неприкосновенности. Верим, только если игрок уже телепортировался и в неком радиусе от нового места
PlayerInfo[i][pX] = pos_x;
PlayerInfo[i][pY] = pos_y;
PlayerInfo[i][pZ] = pos_z;
}
PHP Code:
|
_aSetPlayerPos(playerid, Float:x, Float:y, Float:z )
{
GetPlayerPos(playerid, lastpos[0], lastpos[1], lastpos[2]);
PlayerInfo[playerid][ TimeTP ] = gettime();
PlayerInfo[playerid][pX] = x;
PlayerInfo[playerid][pY] = y;
PlayerInfo[playerid][pZ] = z;
SetPlayerPos( playerid, Float:x, Float:y, Float:z ) ;
return true;
}
PHP Code:
|
_aSetPlayerPos(playerid, Float:x, Float:y, Float:z )
{
GetPlayerPos(playerid, lastpos[0], lastpos[1], lastpos[2]);
PlayerInfo[playerid][ TimeTP ] = gettime();
PlayerInfo[playerid][pX] = x;
PlayerInfo[playerid][pY] = y;
PlayerInfo[playerid][pZ] = z;
SetPlayerPos( playerid, Float:x, Float:y, Float:z ) ;
return true;
}
new Float:pos_x, Float:pos_y, Float:pos_z;
GetPlayerPos(i, pos_x, pos_y, pos_z);
if(gettime() - PlayerInfo[i][TimeTP] > 3)
{
//Проверки античитов
}
else
{
if(!IsPlayerInRangeOfPoint(playerid, 30.0, PlayerInfo[i][pX], PlayerInfo[i][pY], PlayerInfo[i][pZ]) &&
!IsPlayerInRangeOfPoint(playerid, 30.0, lastpos[0], lastpos[1], lastpos[2]) )
{
сообщение администрации
}
}
Как бы ошибка проявляется только у некоторых.
Ну как у 30% - 40% игроков. По кду выше флудит античитом, но если там никаких проверок, а просто записываем эти три секунды застоя новые координты, то все ОК. Но как говорил выше, проблема в том, что за эти три секунды можно куда угодно беспалева тпшнуться. |
Так там больше ничего не и не нужно.
PHP Code:
Как бы ошибка проявляется только у некоторых. Ну как у 30% - 40% игроков. По кду выше флудит античитом, но если там никаких проверок, а просто записываем эти три секунды застоя новые координты, то все ОК. Но как говорил выше, проблема в том, что за эти три секунды можно куда угодно беспалева тпшнуться. |
Заморозь игрока, и как только он окажется на телепортируемой точке, разморозь его, заодно успеет карта подгрузиться.
|
_aSetPlayerPos(playerid, Float:x, Float:y, Float:z )
{
GetPlayerPos(playerid, lastpos[0], lastpos[1], lastpos[2]);
PlayerInfo[playerid][ TimeTP ] = gettime();
PlayerInfo[playerid][pX] = x;
PlayerInfo[playerid][pY] = y;
PlayerInfo[playerid][pZ] = z;
SetPlayerPos( playerid, Float:x, Float:y, Float:z ) ;
return true;
}
new Float: x[3];
GetPlayerPos(i, x, ,x ,x );
if( gettime() - PlayerInfo[i][ TimeTP ] > 3)
{
АНТИЧИТ ВКЛЮЧАЕТСЯ
КОГДА АНТИЧИТ СДЕЛАЛ ВСЕ ПРОВЕРКИ, ТО МЫ ЗАПИСЫВАЕМ НОВЫЕ ДАННЫЕ:
PlayerInfo[playerid][pX] = x,
PlayerInfo[playerid][pY] = x,
PlayerInfo[playerid][pZ] = x;
}
else
{
if( !IsPlayerInRangeOfPoint(i,20, lastpos[0], lastpos[1], lastpos[2])
&& !IsPlayerInRangeOfPoint(i,20, PlayerInfo[playerid][pX] ,PlayerInfo[playerid][pY] ,PlayerInfo[playerid][pz] ) )
{
ЧИТ!!!
new Float: XT[3]; GetPlayerPos(i, XT[0],XT[1],XT[2]);
printf(" Ошибка АЧ: %s(%i) находится: %f, %f, %f", playerName[i], i, XT[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;
}
}
Ошибка АЧ: Nickname(0) находится: 1327.016601, -1543.821411, 902.455932
Ошибка АЧ: Nickname - new 1163.739990, -1538.278198, 902.454956 | back - 1164.403442, -1538.339477, 902.454956
new Float: x[3];
GetPlayerPos(i, x, ,x ,x );//запятая не там
if(PlayerInfo[i][TimeTP] != 0)//Обнуление в OnPlayerConnect включение только когда будет вызван _aSetPlayerPos
{
if(gettime() - PlayerInfo[i][TimeTP] < 3 && !IsPlayerInRangeOfPoint(i, 20, PlayerInfo[playerid][pX], PlayerInfo[playerid][pY], PlayerInfo[playerid][pz]))
{
//ЧИТ!!!
}
GetPlayerPos(i, PlayerInfo[playerid][pX], PlayerInfo[playerid][pY], PlayerInfo[playerid][pZ]);
}
Ещё не забывайте что человек по тем или инным причинам может под текстуры уйти, и свалиться ~200 метров от места где он провалился.
|
тот же самый Nex-AC
if(IsPlayerInRangeOfPoint(playerid, 8.0, ACInfo[playerid][acSetPosX], ACInfo[playerid][acSetPosY],
(ACInfo[playerid][acTpToZ] ? ac_Z : ACInfo[playerid][acSetPosZ])))
GetPlayerPos(i, Pos[0], Pos[1], Pos[2]);
if(!IsPlayerInRangeOfPoint(i, 8.0, PlayerInfo[playerid][pX], PlayerInfo[playerid][pY], Pos[2])
PHP Code:
|