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

    Ошибка: Ваша версия Grand Theft Auto V не поддерживается 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/newswire/
    Статус всех служб для Rockstar Games Launcher и поддерживаемых игр: https://support.rockstargames.com/ru/servicestatus


    Grand Theft Auto 5 (+ GTA Online) последний раз были обновлены:
Статус
В этой теме нельзя размещать новые ответы.

hun1yy

Активный участник
2 Авг 2022
248
12
33
Всем привет, я хочу сделать бинды для кнопок по настройкам, но когда игрок задаёт новый бинд голосовому чату он по прежнему может использовать старые назначения, которые он ставил за этот перезаход в игру
client :
JavaScript:
mp.events.add('loadUnBinds',(settings) => {
  s = JSON.parse(settings);
  mp.keys.unbind(s.binds.voice, true, startVoice);
  mp.keys.unbind(s.binds.voice, false, stopVoice);
});

mp.events.add('loadBinds',() => {
  let voiceBind = mp.players.local.getVariable('settings').binds.voice
  if(!voiceBind)voiceBind = 90


  mp.keys.bind(voiceBind, true, startVoice);
  mp.keys.bind(voiceBind, false, stopVoice);
});
server :

JavaScript:
mp.events.add('setSettingsBindsS',(player,bind,key) => {
  console.log(`bind ${bind} to key ${key}`);
  settings = player.getVariable('settings');
  settings.binds[bind] = key;
  player.call('loadUnBinds',[JSON.stringify(settings)]);
  player.setVariable('settings',settings);
  setTimeout(() => {player.call('loadBinds');},200);
  player.call('menu:updateSettings');
  mp.db.query("UPDATE `accounts` SET `settings` = ? WHERE username = ?",[JSON.stringify(player.getVariable('settings')),player.name]);
});
 

Harland David Sanders

Куратор портала
Команда форума
Куратор портала
VIP
high coder
media
10 Сен 2020
3,411
2,777
219
Я думаю тебе надо изначально забиндить все доступные клавиши (а перед этим естественно занести в массив) с помощью функции - mp.keys.bind
Затем внутри бинда вызывать функцию, которую пользователь поставил на определенную клавишу.
Не думаю что функция - mp.keys.unbind работает корректно в данном случае, хотя могу и ошибаться.
 
Последнее редактирование:
  • Like
Реакции: fignerr

hun1yy

Активный участник
2 Авг 2022
248
12
33
Я думаю тебе надо изначально забиндить все доступные клавиши (а перед этим естественно занести в массив) с помощью функции - mp.keys.bind
Затем внутри бинда вызывать функцию, которую пользователь поставил на определенную клавишу. Не думаю что функция - mp.keys.unbind работает корректно в данном случае, хотя могу и ошибаться.
если не использовать mp.keys.unbind то игрок может нажимать на все кнопки которые он биндил т.е. забиндил N, а после Z и он может на эти две клавиши исполнять одну функцию
 

Harland David Sanders

Куратор портала
Команда форума
Куратор портала
VIP
high coder
media
10 Сен 2020
3,411
2,777
219
если не использовать mp.keys.unbind то игрок может нажимать на все кнопки которые он биндил т.е. забиндил N, а после Z и он может на эти две клавиши исполнять одну функцию
Ты меня не понял) Вот ты забиндил все клавиши которые игрок сможет менять с помощью - mp.keys.bind. Затем ты все эти бинды сводишь к одной функции передавая в аргумент ID нажатой клавиша из массива. А уже в этой функции в зависимости от бинда конкретного пользователя вызываешь нужную функцию.
 
  • Like
Реакции: fignerr

hun1yy

Активный участник
2 Авг 2022
248
12
33
Ты меня не понял) Вот ты забиндил все клавиши которые игрок сможет менять с помощью - mp.keys.bind. Затем ты все эти бинды сводишь к одной функции передавая в аргумент ID нажатой клавиша из массива. А уже в этой функции в зависимости от бинда конкретного пользователя вызываешь нужную функцию.
немного не понял, можно пример?🥲
 

Harland David Sanders

Куратор портала
Команда форума
Куратор портала
VIP
high coder
media
10 Сен 2020
3,411
2,777
219
немного не понял, можно пример?🥲
Какой пример? Самый простейший создаешь массив с клавишами и их ID. Например Клавиша A - ID 0. И таких клавиш например 50 штук.
Далее в цикле делаешь проход по этому массиву, делаешь бинды, затем все как я писал выше.
 

Harland David Sanders

Куратор портала
Команда форума
Куратор портала
VIP
high coder
media
10 Сен 2020
3,411
2,777
219
JavaScript:
let keys =
{
    112: 'F1',
    113: 'F2',
    114: 'F3',
    115: 'F4',
    116: 'F5'
};

for(let id in keys) {
    mp.keys.bind(id, false, async function() { // false - зажатая клавиша
        if(id == mp.players.local.getVariable('playerVoiceBindKey'))
        {
             // Voice Enabled
        }
    };
}

// P.S: В таком случае у игрока в переменной playerVoiceBindKey будет записано 112 или любая другая клавиша которую он забиндил на войс

// PROFIT
 

XDeveluxe

Модератор
Команда форума
high coder
30 Авг 2021
2,291
1,533
211
27
Последний раз когда я пробовал сам - mp.keys.unbind не работал на клиентской стороне JS'а, но работал на клиентской стороне C#.
Не уверен до сих пор ли это так или я тогда просто что-то делал не так.
 

hun1yy

Активный участник
2 Авг 2022
248
12
33
JavaScript:
let keys =
{
    112: 'F1',
    113: 'F2',
    114: 'F3',
    115: 'F4',
    116: 'F5'
};

for(let id in keys) {
    mp.keys.bind(id, false, async function() { // false - зажатая клавиша
        if(id == mp.players.local.getVariable('playerVoiceBindKey'))
        {
             // Voice Enabled
        }
    };
}

// P.S: В таком случае у игрока в переменной playerVoiceBindKey будет записано 112 или любая другая клавиша которую он забиндил на войс

// PROFIT
сейчас буду пробовать, если что отпишу, может кому пригодится
 

X-Clusiv

Модератор
Команда форума
high coder
4 Окт 2020
681
340
161
29
Всем привет, я хочу сделать бинды для кнопок по настройкам, но когда игрок задаёт новый бинд голосовому чату он по прежнему может использовать старые назначения, которые он ставил за этот перезаход в игру
client :
JavaScript:
mp.events.add('loadUnBinds',(settings) => {
  s = JSON.parse(settings);
  mp.keys.unbind(s.binds.voice, true, startVoice);
  mp.keys.unbind(s.binds.voice, false, stopVoice);
});

mp.events.add('loadBinds',() => {
  let voiceBind = mp.players.local.getVariable('settings').binds.voice
  if(!voiceBind)voiceBind = 90


  mp.keys.bind(voiceBind, true, startVoice);
  mp.keys.bind(voiceBind, false, stopVoice);
});
server :

JavaScript:
mp.events.add('setSettingsBindsS',(player,bind,key) => {
  console.log(`bind ${bind} to key ${key}`);
  settings = player.getVariable('settings');
  settings.binds[bind] = key;
  player.call('loadUnBinds',[JSON.stringify(settings)]);
  player.setVariable('settings',settings);
  setTimeout(() => {player.call('loadBinds');},200);
  player.call('menu:updateSettings');
  mp.db.query("UPDATE `accounts` SET `settings` = ? WHERE username = ?",[JSON.stringify(player.getVariable('settings')),player.name]);
});
Приветствую. Возможно у тебя инициализация функций startVoice и stopVoice происходит не только при "старте клиента"/"Подключения к серверу" Поэтому, возможно, и не происходит unbind. Так как пытается "отбиндить" другую функцию которая не была привязана.
Я на своем проекте использую bind/unbind для закрытия интерфейсов на клавишу ESC. И все исправно работает на JS
 

hun1yy

Активный участник
2 Авг 2022
248
12
33
Приветствую. Возможно у тебя инициализация функций startVoice и stopVoice происходит не только при "старте клиента"/"Подключения к серверу" Поэтому, возможно, и не происходит unbind. Так как пытается "отбиндить" другую функцию которая не была привязана.
Я на своем проекте использую bind/unbind для закрытия интерфейсов на клавишу ESC. И все исправно работает на JS
Я использую её когда были изменены настройки
 

X-Clusiv

Модератор
Команда форума
high coder
4 Окт 2020
681
340
161
29
Я понимаю.
Нужно понимать что функции старта и остановки должны быть неизменны, после бинда.
 

X-Clusiv

Модератор
Команда форума
high coder
4 Окт 2020
681
340
161
29
Я понимаю.
Нужно понимать что функции старта и остановки должны быть неизменны, после бинда.
Чтобы было понятнее
JavaScript:
let startVoice = () => {
    console.log('startVoice')
}

const oldStartVoice = startVoice;
console.log(startVoice === oldStartVoice)// true

startVoice = () => {
    console.log('startVoice')
}
console.log(startVoice === oldStartVoice)// false
 
  • Like
Реакции: fignerr

hun1yy

Активный участник
2 Авг 2022
248
12
33
Чтобы было понятнее
JavaScript:
let startVoice = () => {
    console.log('startVoice')
}

const oldStartVoice = startVoice;
console.log(startVoice === oldStartVoice)// true

startVoice = () => {
    console.log('startVoice')
}
console.log(startVoice === oldStartVoice)// false
JavaScript:
function startVoice(){
  if(useBinds){
    mp.voiceChat.muted = false;
    hud.execute(`microAnimOn();`);
  }
}
function stopVoice(){
  mp.voiceChat.muted = true;
  hud.execute(`microAnimOff();`);
}
они по идее никак не изменяются 🤔
 

X-Clusiv

Модератор
Команда форума
high coder
4 Окт 2020
681
340
161
29
И вообще система какая-то не понятная. Сделай её на основе только евентов.
Client :
JavaScript:
mp.events.add("update_settings", (settings) => {
    const newSettings = JSON.parse(settings);
    if(!mp.settings){
        mp.settings = newSettings;
        setSettings();
        return
    }
    checkAndUpdateSettings(newSettings);
})

const checkAndUpdateSettings = (newSettings) => {
    if(!mp.settings){
        return
    }
    Object.keys(newSettings??{}).forEach((setting) => {
        if(mp.settings?.[setting]!==newSettings?.[setting]){
            const oldValue = mp.settings[setting];
            mp.settings[setting] = newSettings?.[setting];
            updateSetting(setting, oldValue);
        }
    })
}

const setSettings = () => {
    Object.keys(mp.settings).forEach((setting) => {
        updateSetting(setting);
    })
}

const updateSetting = (setting, oldValue = null) => {
    if(!mp.settings){
        return;
    }
    mp.events.call("update_setting_"+setting, mp.settings?.[setting], oldValue);
}

Вот сама система, накидал не проверял но в теории должно работать так:
Со стороны сервера вызывается эвент с настройками:

JavaScript:
const settings = {
    voiceKey: 228
}
player.call("update_settings",[JSON.stringify(settings)])

Выполняется код что выше. И вызывается отдельный эвент для каждой настройки если она была обновлена/инициализирована. Ну и биндим анбиндим voice так как мы отправили объект с полем voiceKey наш эвент будет называться update_settings_voiceKey :
JavaScript:
mp.events.add("update_setting_voiceKey", (value, oldValue) => {
    if(oldValue){
        mp.keys.unbind(oldValue, true, startVoice);
        mp.keys.unbind(oldValue, false, stopVoice);
    }
    mp.keys.bind(value, true, startVoice);
    mp.keys.bind(value, false, stopVoice);
})
const startVoice = () => {
    mp.voiceChat.muted = false;
}
const stopVoice = () => {
    mp.voiceChat.muted = true;
}
 
Последнее редактирование:

X-Clusiv

Модератор
Команда форума
high coder
4 Окт 2020
681
340
161
29
Единственное что в настройках можно хранить только простые данные. НЕ ХРАНИТЬ ОБЪЕКТЫ ИЛИ МАССИВЫ
Так как если мы будем хранить объект то он никогда не будет равен другому объекту. Также и с массивами.
 

hun1yy

Активный участник
2 Авг 2022
248
12
33
Единственное что в настройках можно хранить только простые данные. НЕ ХРАНИТЬ ОБЪЕКТЫ ИЛИ МАССИВЫ
Так как если мы будем хранить объект то он никогда не будет равен другому объекту. Также и с массивами.
т.е. я не могу в настройки накидать {binds:{voice:90,engine:80}} ?
 

X-Clusiv

Модератор
Команда форума
high coder
4 Окт 2020
681
340
161
29
Нет. Можешь разделить эти настройки. На отдельные
 
Статус
В этой теме нельзя размещать новые ответы.