Всем привет
, в одной из тем форума захотелось помочь человечку
, и получилось что написал целую самодостаточную основу под систему настроек пользователя.
В общем.
Допустим у нас есть какие-то настройки пользователя.
Мы вызываем обновление этих настроек у клиента.
На клиенте подпишемся на эвент:
В нашем случае у нас одна настройка, это клавиша активации голосового чата(voiceKey) соответственно и эвент будет называться update_setting_voiceKey:
Единственное, должен предупредить что настройки для такой системы желательно хранить только простыми значениями. Т.е. НЕ ИСПОЛЬЗОВАТЬ В НАСТРОЙКАХ ОБЪЕКТЫ ИЛИ МАССИВЫ.
Если объекты или массивы будут использованы, то при обновлении данных, будет вызываться обновление настройки которая вроде бы даже и не изменилась
Например:
Ну вот в принципе и все.
Система готова и работает 100%(На момент написания статьи)
В общем.
Допустим у нас есть какие-то настройки пользователя.
Мы вызываем обновление этих настроек у клиента.
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 эвент не вызвался повторно
*/
Ну вот в принципе и все.
Последнее редактирование: