Фикс ускорения на стрелочку

harrwe

Member
Продвинутый
Сообщения
5
Баллы
8
Приветствую, представляю вам свой вариант фикса "бага" с ускорением при частом нажатие на стрелочку. Данный мануал подойдёт для full-roleplay проектов, на которых пытаются "убить" всю gta-шность. Представленный в данной теме код не больше чем каркас системы которую вы можете дополнить сами.

Для начала создадим глобальную переменную, которая будет подсчитывать количество нажатий на стрелочку.
C++:
new keyup_count[MAX_PLAYERS];
В callback OnPlayerUpdate добавляем следующий код:
C++:
new ud, __, Float: v_vel_x, Float: v_vel_y, Float: v_vel_z;
GetPlayerKeys(playerid, __, ud, __);
if(ud == KEY_UP)
{
    if(GetPlayerState(playerid) == 2)
    {
        switch(GetVehicleModel(GetPlayerVehicleID(playerid)))
        {
            case 448, 461, 462, 463, 468, 471, 521, 522, 523, 581, 586:
            {
                if(GetSpeed(playerid) >= 50)
                {
                    if(++keyup_count[playerid] >= 3)
                    {
                        keyup_count[playerid] = 0;
                        GetVehicleVelocity(GetPlayerVehicleID(playerid), v_vel_x, v_vel_y, v_vel_z);
                        SetVehicleVelocity(GetPlayerVehicleID(playerid), v_vel_x * 0.9, v_vel_y * 0.9, v_vel_z * 0.9);
                    }
                }
            }
        }
    }
}
На самом деле ничего страшного не будет от такого кода в OnPlayerUpdate. Есть скрипты, использующие этот коллбэк для гораздо более страшных вычислений.
Даже взять в пример один иностранный сервер, на который я наткнулся года 2 назад, где режим игры был связан с самолётами и, собственно, лётчиками. Начинал ты там с простого кукурузника и со временем зарабатывал на более крутые самолёты, летая от точки до точки и, возможно, делая что-то ещё (играл я не долго). Дальнобойщики, только реализованные в виде самолётов. Так вот, там на экране была реализована куча всяких датчиков (компас/спидометр/бензин и т.п.) в виде текстдравов и они, судя по точности обновления, были реализованы как раз в OnPlayerUpdate (тот же компас моментально обновлял данные при малейшем повороте). И ничего, онлайн был около 300 человек и ничего не лагало.
Так что использовать OnPlayerUpdate - не смертельно. Главное используйте его с умом и только в тех случаях, когда такая частота обновлений действительно важна. В случае с этим фиксом она важна, если хотите исправить "баг" на корню, не дав и малейшей возможности разогнаться. Если не нужно - создавайте таймер и настраивайте интервал под себя.
© Deimos
Функция получения скорости игрока/машины игрока:
C++:
GetSpeed(playerid)
{
    new vehicleid = GetPlayerVehicleID(playerid),Float: pos_x,Float: pos_y,Float: pos_z;
    switch(vehicleid)
    {
        case 0: GetPlayerVelocity(playerid, pos_x, pos_y, pos_z);
        default: GetVehicleVelocity(vehicleid, pos_x, pos_y, pos_z);
    }
    return floatround(VectorSize(pos_x, pos_y, pos_z) * 100.0);
}
Автор: harrwe. Благодарности за помощь: DeimoS, Nexius_Tailer.
 
Верх