GetVehicleVelocity -
stabker - 07.09.2012
Здравствуйте!
Пишу античит на изменение позиции транспорта читами и встретился с проблемой. Для проверки на нормальное перемещение транспорта я использую GetVehicleVelocity. 0,0,0 мы получаем если транспорт не перемещается. Но если разогнаться на машине и выпрыгнуть, а она будет продолжать двигаться, то при дальнейшем использовании GetVehicleVelocity мы будем получать предыдущие данные, даже если машина уже стоит на месте(без водителя). Пробывал проверять изменение координат и устанавливать SetVehicleVelocity на 0,0,0 но это не помогло.
Скажите, как это можно "профиксить"?
Спасибо
Re: GetVehicleVelocity -
Stepashka - 07.09.2012
никак.
Но собственно зачем тебе проверять машины без водителя?
А если уж так надо, то для этого есть специальное событие
OnUnoccupiedVehicleUpdate.
Re: GetVehicleVelocity -
stabker - 07.09.2012
Quote:
Originally Posted by Stepashka
никак.
Но собственно зачем тебе проверять машины без водителя?
А если уж так надо, то для этого есть специальное событие OnUnoccupiedVehicleUpdate.
|
А какие машины проверять?
Машину которая с водителем телепортнуть нельзя читом. Также читы типо Car Shot'a которые разгоняют машину без изменения Velocity и работают лишь без водителя в ней.
OnUnoccupiedVehicleUpdate - не буду использовать, заменяю таймером+циклом.
pawn Код:
CheckVehicle(i)
{
new Float:v1[3];
if(GetVehicleDistanceFromPoint(i,Veh[i][XYZA][0],Veh[i][XYZA][1],Veh[i][XYZA][2]) > 5.0)
{
GetVehiclePos(i,v1[0],v1[1],v1[2]);
for(new p=0;p<GetMaxPlayers();p++) if(IsPlayerConnected(p)) if(GetPlayerVehicleID(p) == i && GetPlayerState(p) != PLAYER_STATE_DRIVER) SetPlayerPos(p,v1[0]+(random(2)/5-random(2)/5),v1[1]+(random(2)/5-random(2)/5),v1[2]+1);
SetVehiclePos(i,Veh[i][XYZA][0],Veh[i][XYZA][1],Veh[i][XYZA][2]);
SetVehicleZAngle(i,Veh[i][XYZA][3]);
}
}
public CheckVehicles()
{
new Float:v[6];
for(new i=0;i<MAX_VEHICLES;i++)
{
if(Veh[i][Spawned])
{
if(Veh[i][Updating] <= 0)
{
GetVehicleVelocity(i,v[0],v[1],v[2]);
GetVehiclePos(i,v[3],v[4],v[5]);
if(v[0] != 0 && Veh[i][LastVelocity][0] != v[0] || v[1] != 0 && Veh[i][LastVelocity][1] != v[1] || v[2] != 0 && Veh[i][LastVelocity][2] != v[2])
{
Veh[i][LastVelocity][0] = v[0],Veh[i][LastVelocity][1] = v[1],Veh[i][LastVelocity][2] = v[2];
Veh[i][XYZA][0] = v[3], Veh[i][XYZA][1] = v[4], Veh[i][XYZA][2] = v[5];
GetVehicleZAngle(i,Veh[i][XYZA][3]);
}
else CheckVehicle(i);
}
else Veh[i][Updating]--;
}
}
return SetTimer("CheckVehicles",1000,false);
}
Вот часть кода, именно та, которая проверяет позицию машины и наличие телепортации/лишнего изменения позиции. Ну тут одна проблема, если разогнаться и выпрыгнуть, то из-за вот этой проверки
pawn Код:
if(v[0] != 0 && Veh[i][LastVelocity][0] != v[0] || v[1] != 0 && Veh[i][LastVelocity][1] != v[1] || v[2] != 0 && Veh[i][LastVelocity][2] != v[2])
античит думает что машина телепортнута и вернет ее на последнюю сохраненную позицию. Ее конечно можно убрать, но после 1го такого запуска машины, античит уже не будет работать на ней, если сразу подхватит читер.