This is a mobile optimized page that loads fast, if you want to load the real page, click this text.
Статус
В этой теме нельзя размещать новые ответы.

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 работает корректно в данном случае, хотя могу и ошибаться.
 
Последнее редактирование:
Реакции: fignerr

hun1yy

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

Harland David Sanders

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

hun1yy

Активный участник
2 Авг 2022
248
12
33
немного не понял, можно пример?
 

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

X-Clusiv

Модератор
Команда форума
high coder
4 Окт 2020
681
340
161
29
Приветствую. Возможно у тебя инициализация функций startVoice и stopVoice происходит не только при "старте клиента"/"Подключения к серверу" Поэтому, возможно, и не происходит unbind. Так как пытается "отбиндить" другую функцию которая не была привязана.
Я на своем проекте использую bind/unbind для закрытия интерфейсов на клавишу ESC. И все исправно работает на JS
 

hun1yy

Активный участник
2 Авг 2022
248
12
33
Я использую её когда были изменены настройки
 

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
 
Реакции: fignerr

hun1yy

Активный участник
2 Авг 2022
248
12
33
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
Нет. Можешь разделить эти настройки. На отдельные
 
Статус
В этой теме нельзя размещать новые ответы.