• Из-за обновления 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
3
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

🍔 ChefBurger
Команда форума
High developer
10 Сен 2020
3,671
2,848
219
Я думаю тебе надо изначально забиндить все доступные клавиши (а перед этим естественно занести в массив) с помощью функции - mp.keys.bind
Затем внутри бинда вызывать функцию, которую пользователь поставил на определенную клавишу.
Не думаю что функция - mp.keys.unbind работает корректно в данном случае, хотя могу и ошибаться.
 
Последнее редактирование:
Реакции: fignerr

hun1yy

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

Harland David Sanders

🍔 ChefBurger
Команда форума
High developer
10 Сен 2020
3,671
2,848
219
если не использовать mp.keys.unbind то игрок может нажимать на все кнопки которые он биндил т.е. забиндил N, а после Z и он может на эти две клавиши исполнять одну функцию
Ты меня не понял) Вот ты забиндил все клавиши которые игрок сможет менять с помощью - mp.keys.bind. Затем ты все эти бинды сводишь к одной функции передавая в аргумент ID нажатой клавиша из массива. А уже в этой функции в зависимости от бинда конкретного пользователя вызываешь нужную функцию.
 
Реакции: fignerr

hun1yy

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

Harland David Sanders

🍔 ChefBurger
Команда форума
High developer
10 Сен 2020
3,671
2,848
219
немного не понял, можно пример?🥲
Какой пример? Самый простейший создаешь массив с клавишами и их ID. Например Клавиша A - ID 0. И таких клавиш например 50 штук.
Далее в цикле делаешь проход по этому массиву, делаешь бинды, затем все как я писал выше.
 

Harland David Sanders

🍔 ChefBurger
Команда форума
High developer
10 Сен 2020
3,671
2,848
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

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
2,919
1,671
211
28
Последний раз когда я пробовал сам - mp.keys.unbind не работал на клиентской стороне JS'а, но работал на клиентской стороне C#.
Не уверен до сих пор ли это так или я тогда просто что-то делал не так.
 
Реакции: fignerr

hun1yy

Новый участник
2 Авг 2022
248
3
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

Модератор
Команда форума
Moderator
BackEnd developer
4 Окт 2020
712
324
161
30
Всем привет, я хочу сделать бинды для кнопок по настройкам, но когда игрок задаёт новый бинд голосовому чату он по прежнему может использовать старые назначения, которые он ставил за этот перезаход в игру
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
3
33
Приветствую. Возможно у тебя инициализация функций startVoice и stopVoice происходит не только при "старте клиента"/"Подключения к серверу" Поэтому, возможно, и не происходит unbind. Так как пытается "отбиндить" другую функцию которая не была привязана.
Я на своем проекте использую bind/unbind для закрытия интерфейсов на клавишу ESC. И все исправно работает на JS
Я использую её когда были изменены настройки
 

X-Clusiv

Модератор
Команда форума
Moderator
BackEnd developer
4 Окт 2020
712
324
161
30
Я понимаю.
Нужно понимать что функции старта и остановки должны быть неизменны, после бинда.
 

X-Clusiv

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

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

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

hun1yy

Новый участник
2 Авг 2022
248
3
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

Модератор
Команда форума
Moderator
BackEnd developer
4 Окт 2020
712
324
161
30
И вообще система какая-то не понятная. Сделай её на основе только евентов.
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

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

hun1yy

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

X-Clusiv

Модератор
Команда форума
Moderator
BackEnd developer
4 Окт 2020
712
324
161
30
Нет. Можешь разделить эти настройки. На отдельные
 
Статус
В этой теме нельзя размещать новые ответы.