• Из-за обновления GTA 5 (был добавлен новый патч) может временно не работать вход в RAGE Multiplayer.

    ERROR: Your game version is not supported by RAGE Multiplayer.

    Данная ошибка говорит о том, что GTA V обновилась до новой версии (GTA Online тоже). Вам необходимо обновить саму игру в главном меню вашего приложения (Steam / Epic Games / Rockstar Games).
    Если после этого RAGE:MP все равно не работает - вам нужно дождаться выхода патча для самого мультиплеера (обычно это занимает от нескольких часов до нескольких дней).

    Новости и апдейты Rockstar Games - https://www.rockstargames.com/ru/newswire/
    Статус всех служб для Rockstar Games Launcher и поддерживаемых игр: https://support.rockstargames.com/ru/servicestatus


    Grand Theft Auto 5 (+ GTA Online) последний раз были обновлены:

Урок Создание механической коробки передач для RAGE:MP 1.1

og sofly

Специалист
Автор темы
29 Янв 2022
137
90
86
Всем доброго времени суток, написал механическую коробку передач и решил поделиться ней с вами, а ещё лучше — рассказать как её реализовать.

Ну что ж, приступим. Пишу этот мануал для людей уже понимающих, что такое Client и Server sides.

Начнём с создания среды работы. А точнее файла, в моём случае это index.js в папке GearBOXsystem:
1655761409635.png


После создания этого в index.js в папке client_packages прописываем:

require("./GearBOXsystem/index.js")

Далее приступим к созданию самой коробки передач, а точнее с Bind и Events:
В файле коробки передач пишем следующие строки:
Events того что игрок сел в Т/С, после чего передаём данные в let да бы в дальнейшем заточить всё под Bind, то есть:
JavaScript:
mp.events.add("playerEnterVehicle", () => {
    vehicle = mp.players.local.vehicle;
    TopSpeed = mp.game.vehicle.getVehicleModelMaxSpeed(mp.players.local.vehicle.model)
    PerGearMultiplier = TopSpeed / CountOfGears;
    Default_HAND = vehicle.getDefaultHandling("FDRIVEINERTIA")
    vehicle.setHandling("FDRIVEINERTIA", 0.01)
    vehicle.setMaxSpeed(2)
})
И в первой строчке перед кодом выше пишем:
JavaScript:
let GEAR_AT_MOMENT = 0; //Обозначает передачу которая работает когда игрок садится в Т/С. 0-нейтраль
let GEAR_SWITCH = 1; //Количество переключение передач, т.е. переключение меняется на одну передачу
let TopSpeed; //Берём максимульную скорость Т/С для будущей работы
let CountOfGears = "5"; // Количество передач
let PerGearMultiplier; // Скорость на каждую передачу
let vehicle; //Т/С игрока
let Default_HAND; //Надлинг Т/С
Должно выйти вот так:
1655761935037.png

Теперь у вас есть 2 минуты да бы перечитать код и понять как это между собой связано.


Всё, продолжим.

Сначала пропишем переключение передачи вверх:
JavaScript:
mp.keys.bind(0x26, true, function(){ //0x26 - Стрелка в верх согласно кей кодам MICROSOFT. 2-е значение TRUE срабатывает ли функция когда клавиша нажата или отпущена (TRUE - зажата), ну и дальше функция
    let GR = GEAR_AT_MOMENT + GEAR_SWITCH; //GR это передача на которую изменяем т.е. 0 + 1 согласно зменным.
    if(GR > -1){//Проверяем значение
        if(GR < 4){//Проверяем значение
            changeGearUP(GR)//Вызываем функцию указаную дальше и с ней же передаём значение GR
        }
    }else{
    }
    function changeGearUP(gsr){//Вызываемая функция и само GR - gsr в функции
        if(gsr == 0){//Нейтральная передача
            GEAR_AT_MOMENT = GR; //Записываем значение GR в GEAR_AT_MOMENT чтобы оно показалось в render(Указанно дальше)
            mp.console.logInfo("Neutral")//ЛОГ
            vehicle.setHandling("FDRIVEINERTIA", 0.01)//Изменяем ускорение/мощность Т/С до 0.1 да бы нейтраль работала приближенно к реальности
            vehicle.setMaxSpeed(2)//Устанавливаем максимальную скорость Т/С да бы избечь возможных багов.
        }
        if(gsr == 1){//Первая передача
            GEAR_AT_MOMENT = GR;//Указанно выше
            mp.console.logInfo("GEAR :: 1")//ЛОГ
            vehicle.setHandling("FDRIVEINERTIA", Default_HAND)//Меняем хандлинг на тот который был когда игрок сел в Т/С
            vehicle.setMaxSpeed(PerGearMultiplier * 1) //Устанавливаем максимальную скорость Т/С на ту которая соответствует передачи
        }
        if(gsr == 2){
            GEAR_AT_MOMENT = GR;
            mp.console.logInfo("GEAR :: 2")
            vehicle.setMaxSpeed(PerGearMultiplier * 2)
        }
        if(gsr == 3){
            GEAR_AT_MOMENT = GR;
            mp.console.logInfo("GEAR :: 3")
            vehicle.setMaxSpeed(PerGearMultiplier * 3)
        }
    }
})

5 минут для тебя, чтобы ознакомиться с кодом лучше.

Время прошло, работаем дальше :)

Если у нас уже есть переключение вверх думаю понадобится и вниз:

JavaScript:
mp.keys.bind(0x28, true, function(){ //0х28 - Стрелка в низ
    let Current_speed = vehicle.getSpeed() //Текущая скорость Т/С
    let GR = GEAR_AT_MOMENT - GEAR_SWITCH; //Снижение передачи 1 - 1
    if(GR > -1){ //Проверка
            mp.console.logInfo("GSD : : : : NOW SHIFT IS :: " + GEAR_AT_MOMENT)
            changeGearDWN(GR)//Вызов функции
    }else{
        mp.console.logInfo("BDS")
    }
    function changeGearDWN(gsr){//Функция
        if(gsr == 0){//Нейтраль
            if(PerGearMultiplier * 0.2 > Current_speed){//PerGearMultiplier - скорость на передачу * 0.2(Множитель скорости) > Current_speed - Текущая скорость // Т.е если скорость Т/С больше чем PerGearMultiplier * 0.2 переключение не делается.
            GEAR_AT_MOMENT = GR;
            mp.console.logInfo("Neutral")
            vehicle.setHandling("FDRIVEINERTIA", 0.01) //Ставим минимальную мощность/ускорение
            vehicle.setMaxSpeed(2)
            }else{
                mp.console.logInfo("Too HIGH RPM")//Относясь к  if(PerGearMultiplier * 0.2 > Current_speed) если скорость выше кидаем в консоль сообщение. В будущем под домашнее задание пойдёт.
            }
        }
        if(gsr == 1){//Первая передача, принцып работа тот же что и выше
            if(PerGearMultiplier * 1.2 > Current_speed){
                GEAR_AT_MOMENT = GR;
                mp.console.logInfo("GEAR :: 1")
                vehicle.setHandling("FDRIVEINERTIA", Default_HAND)
                vehicle.setMaxSpeed(PerGearMultiplier * 1)
            }
            else{
                mp.console.logInfo("Too HIGH RPM")
            }
        }
        if(gsr == 2){
            if(PerGearMultiplier * 2.2 > Current_speed){
                GEAR_AT_MOMENT = GR;
                mp.console.logInfo("GEAR :: 2")
                vehicle.setMaxSpeed(PerGearMultiplier * 2)
            }
            else{
                mp.console.logInfo("Too HIGH RPM")
            }
        }
        if(gsr == 3){
            if(PerGearMultiplier * 3.2 > Current_speed){
                GEAR_AT_MOMENT = GR;
                mp.console.logInfo("GEAR :: 3")
                vehicle.setMaxSpeed(PerGearMultiplier * 3)
            }
            else{
                mp.console.logInfo("Too HIGH RPM")
            }
        }
    }
})

Теперь 15 минут перерыва, чтобы почитать код и чутка отдохнуть.

Так-с, теперь выведем передачу на экран игрока:

JavaScript:
mp.events.add("render", () => { //Render обновление интерфейса с каждым кадром т.е. если у меня 60 FPS данное действие повторяется 60 раз в секунду
    mp.game.graphics.drawText([ICODE]Your gear: ${GEAR_AT_MOMENT}[/ICODE], [0.5, 0.005], {  //Выводим текст [ICODE]Your gear: ${GEAR_AT_MOMENT}[/ICODE] || ${GEAR_AT_MOMENT} обозначает вывод сменной в тексте (Альтернатива " Your gear: " + GEAR_AT_MOMENT.
        font: 7,
        color: [255, 255, 255, 185],
        scale: [0.5, 0.5],
        outline: false
    });
})

Вроде бы всё описал. В итоге должен появится текст сверху посередине экрана
1655763889771.png


Теперь домашнее задание:
1. Добавить ещё две передачи, заднюю и 4-ю
2. Приписать GEAR_AT_MOMENT к худу CEF.

Если есть какие-либо вопросы вы можете написать мне в ЛС дискорда: thf#1111 отвечу если не буду спать;)
А тебе желаю удачи в сфере кодинга:giggle::r_:
 
Последнее редактирование:
  • Like
Реакции: fignerr, dooj и Bloodlust

xDeveluxe

Модератор
Команда форума
high coder
30 Авг 2021
2,119
1,349
191
27
Код лучше всего помещать в специальный тэг сообщения:
1655801917116.png

И внутри него выбирать что именно это за код (JS/C# и т.д)
 

og sofly

Специалист
Автор темы
29 Янв 2022
137
90
86
  • Like
Реакции: xDeveluxe

xDeveluxe

Модератор
Команда форума
high coder
30 Авг 2021
2,119
1,349
191
27

dooj

Гуру
high coder
24 Мар 2022
459
166
100
changeGearUP(gsr)

JavaScript:
function changeGearUP(gsr){
        if(gsr == 0){
            GEAR_AT_MOMENT = GR;
            mp.console.logInfo("Neutral");
            vehicle.setHandling("FDRIVEINERTIA", 0.01);
            vehicle.setMaxSpeed(2);
        } else {
            GEAR_AT_MOMENT = GR;
            mp.console.logInfo(`GEAR :: ${GR}`)
            vehicle.setHandling("FDRIVEINERTIA", Default_HAND)
            vehicle.setMaxSpeed(PerGearMultiplier * GR)
        }
    }

Не подумай что как-то хотел задеть, просто решил показать как можно сделать функцию динамической и немного читабельней. Попробуй так-же поработать над остальными функциями и изменить. А так код супер, годно.(y)
 

og sofly

Специалист
Автор темы
29 Янв 2022
137
90
86
changeGearUP(gsr)

JavaScript:
function changeGearUP(gsr){
        if(gsr == 0){
            GEAR_AT_MOMENT = GR;
            mp.console.logInfo("Neutral");
            vehicle.setHandling("FDRIVEINERTIA", 0.01);
            vehicle.setMaxSpeed(2);
        } else {
            GEAR_AT_MOMENT = GR;
            mp.console.logInfo(`GEAR :: ${GR}`)
            vehicle.setHandling("FDRIVEINERTIA", Default_HAND)
            vehicle.setMaxSpeed(PerGearMultiplier * GR)
        }
    }

Не подумай что как-то хотел задеть, просто решил показать как можно сделать функцию динамической и немного читабельней. Попробуй так-же поработать над остальными функциями и изменить. А так код супер, годно.(y)
Спасибо, в следующем коде учту, не подумал об этом изначально🤠:giggle:
 
  • Like
Реакции: fignerr и dooj

Mr_DETAL6KA

Начинающий специалист
23 Ноя 2020
110
2
58
26
А как добавить проверку на авто? Хочу допустим что бы определенные машины были с ручкой ))
 

kenz

Начинающий специалист
5 Авг 2022
160
139
68
А как добавить проверку на авто? Хочу допустим что бы определенные машины были с ручкой ))
JavaScript:
let vehicleS = ["sultan"] //модель нужной машины
let vehicleS_joaated = mp.game.joaat(vehicleS) // получаем хеш

mp.events.add("playerEnterVehicle", () => {
    let vehicle = mp.players.local.vehicle;
    if (vehicle.model) {
        // 1 = нужное авто || 0 = без мкпп
        if (vehicle.model == vehicleS_joaated) {
            vehicle_status_number = 1;
          
        } else {
            vehicle_status_number = 0;
          
        }
    } else {}

   if (vehicle_status_number == 1) {
//код
} else {}

}) ;

mp.events.add('playerExitVehicle', (player) => {
vehicle_status_number = 0;
});
 
  • Like
Реакции: fignerr

Bloodlust

Гуру
25 Апр 2021
306
103
112
Чет не совсем понимаю как лучше всего сделать чтобы на задней передаче игрок не смог ехать вперёд, что для этого можно использовать лучше?
 

wendel

Активный участник
6 Окт 2022
8
1
40
Чет не совсем понимаю как лучше всего сделать чтобы на задней передаче игрок не смог ехать вперёд, что для этого можно использовать лучше?
Если не ошибаюсь задняя передача в игре нулевая, соответственно если на механике стоит задняя а в игре не нулевая то едет вперед на первой, если в игре нулевая и скорость есть едет назад все ок. Ну а ограничить скорость в этом случае (если на механике задняя в игре не нулевая и скорость есть) можно через нативку setEntityVelocity если не ошибаюсь.