• Из-за обновления 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) последний раз были обновлены:

Урок Уведомления для вашего сервера RAGE:MP

og sofly

Специалист
Автор темы
29 Янв 2022
137
90
86
Всем привет, сегодня я написал систему уведомлений для RAGE:MP и желаю поделиться ней с вами. Так же данный туториал есть в видео формате :cool:

Приступим с создания всех нужных файлов на клиенте, а точнее index.js, index.html, style.css. После чего подключаем index.js:

JavaScript:
require("./notifications/index.js")

Далее в самом index.js прописываем следующие строчки:
JavaScript:
let browser = null;

mp.events.add("ClassicNotify", (enteredTextofNOTIFY) => { //Передаём текст вместе с вызовом эвента
    if(browser == null){ //Проверяем открыт ли браузер, если да ничего не делаем дабы не косячить:)
        browser = mp.browsers.new('package://notifications/index.html')//Создаём браузер
    }
    browser.execute(`NotifyArray("${enteredTextofNOTIFY}")`)//Добавляем новое уведомление вызывая функцию HTML (Читай дальше)
})

mp.events.add("HideNotify", () => {//Скрытие уведомлений на случай открытия худов или других вещей, где уведомление не нужно.
    if(browser != null){//Проверяем открыт ли бровсер
        browser.destroy()//Если на убиваем браузер .destroy()
        browser = null;//Делаем бровсер на null да бы в будущем была возможность открыть его
    }
})

Дальше вписываем index.html:


JavaScript:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <link rel="stylesheet" href="style.css">
    <script src="index.js"></script>
</head>
<body>
  <ul id="myList" class="LISTOFTXST"><!--Создаем лист-->
    <!--INNER FIELD FOR LI--> <!--Место для li-->
  </ul>

</body>
<script>
function NotifyArray(InnerNotifyText) {//Функция которую вызываем путём .execute в index.js
  let list = document.getElementById("myList"); //Берём лист через ID(Смотри выше), через Class не вызываем так как это возвращает масив
  let li = document.createElement("li");//Создаем li

  list.appendChild(li)//Добавляем ранее созданный li в list
  li.className = "NotifS"; //Добавляем классНейм для css
  li.innerText = InnerNotifyText; //Отображаемый "TEXT" в уведомлении который был прописан в .call("ClassicNotify", "TEXT")

  setTimeout(function(){//Добавляем таймер на убийство созданного li.
    li.remove()//Убиваем путём использования .remove() НЕ .destroy() так как это JS для HTML а не RAGE API
  }, 5000)//5000ms время после которого срабатывает код выше(`-`-`-li.remove()-`-`-`)
}


</script>
</html>

Ну и закидываем в туже папку свой стиль style.css, этого я уже объяснять не буду;)

Подробнее расcказал всё в видео:

Всем удачи:cool: Скоро новый туториал, можете дать идей в комментарии:unsure:
 

MaryDay

Специалист
14 Мар 2021
147
36
92
Good! Полезная штучка для тех кто что-то старается сделать сам.
 
  • Love
Реакции: og sofly

mippoosedev

Гуру
2 Мар 2021
294
139
100
В целом неплохо, но execute портит всю картину(пора бы уже отказаться от прямых комманд в браузер). + реп за старания
 
  • Like
Реакции: dooj

dooj

Гуру
high coder
24 Мар 2022
459
166
100
а чем так плох execute
Как минимум структура обмена между сервером и клиентом строится на mp.events.add() и .call(). Если есть возможность придерживаться одной структуры/стиля, то думаю стоит это соблюдать.

Читабельность тоже берет свое, сравни:
JavaScript:
// SERVER

mp.events.add('playerJoin', player => player.call('open:menu:client'))

// CLIENT

mp.events.add('open:menu:client', () => {
    browser.active = true;
    browser.call('open:menu:cef', JSON.stringify(value))
})

// CEF

mp.events.add('open:menu:cef', (value) => {
    value = JSON.parse(value)
    setState(value)
    mp.trigger('menu:is:opened')
})
JavaScript:
// SERVER

mp.events.add('playerJoin', player => player.call('open:menu:client'))

// CLIENT

mp.events.add('open:menu:client', () => {
    browser.active = true;
    browser.execute(`openMenu("${JSON.stringify(value)}")`)
})

// CEF

const openMenu = (value) => {
    value = JSON.parse(value) 
    setState(value)
    mp.trigger('menu:is:opened')
}