• Из-за обновления GTA 5 (был добавлен новый патч) может временно не работать вход в 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/ru/newswire/
    Статус всех служб для Rockstar Games Launcher и поддерживаемых игр: https://support.rockstargames.com/ru/servicestatus


    Grand Theft Auto 5 (+ GTA Online) последний раз были обновлены:

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

X-Clusiv

Модератор
Автор темы
Команда форума
high coder
4 Окт 2020
582
273
161
29
Всем привет :r_: , в одной из тем форума захотелось помочь человечку:coffee:, и получилось что написал целую самодостаточную основу под систему настроек пользователя.:peppe_roller:
В общем.
Допустим у нас есть какие-то настройки пользователя.
Мы вызываем обновление этих настроек у клиента.
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 эвент не вызвался повторно
*/

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