This is a mobile optimized page that loads fast, if you want to load the real page, click this text.

Мануал Основа для настроек пользователя

X-Clusiv

Модератор
Автор темы
Команда форума
high coder
4 Окт 2020
584
276
161
29
Всем привет , в одной из тем форума захотелось помочь человечку, и получилось что написал целую самодостаточную основу под систему настроек пользователя.
В общем.
Допустим у нас есть какие-то настройки пользователя.
Мы вызываем обновление этих настроек у клиента.
JavaScript:
const settings = {
    voiceKey: 78
}
player.call("update_settings", [JSON.stringify(settings)])

На клиенте подпишемся на эвент:
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);//Вызываем обновление настройки update_setting_(Ключ настройки)
}

В нашем случае у нас одна настройка, это клавиша активации голосового чата(voiceKey) соответственно и эвент будет называться update_setting_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;
}

Единственное, должен предупредить что настройки для такой системы желательно хранить только простыми значениями. Т.е. НЕ ИСПОЛЬЗОВАТЬ В НАСТРОЙКАХ ОБЪЕКТЫ ИЛИ МАССИВЫ.
Если объекты или массивы будут использованы, то при обновлении данных, будет вызываться обновление настройки которая вроде бы даже и не изменилась
Например:
JavaScript:
//server
let settings = {
    voiceChat: {
        key: 71,
        volume: 100
    },
    keyMenu:72
}
player.call("update_settings", [JSON.stringify(settings)])

//client
/*
    вызовутся эвенты update_setting_voiceChat и update_setting_keyMenu
*/
//server
/*
    если мы еще раз вызовем
*/
player.call("update_settings", [JSON.stringify(settings)])

//client
/*
    после повторного вызова вызовется только один эвент update_setting_voiceChat
    хотя настройки по своей сути не изменились никак и в случае с keyMenu эвент не вызвался повторно
*/

Ну вот в принципе и все. Система готова и работает 100%(На момент написания статьи)
 
Последнее редактирование: