SA-MP Forums Archive
GetVehicleVelocity - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Русский/Russian (https://sampforum.blast.hk/forumdisplay.php?fid=32)
+---- Thread: GetVehicleVelocity (/showthread.php?tid=375664)



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го такого запуска машины, античит уже не будет работать на ней, если сразу подхватит читер.