• Из-за обновления GTA 5 (был добавлен новый патч) может временно не работать вход в RAGE Multiplayer.

    Ошибка: Ваша версия Grand Theft Auto V не поддерживается 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/newswire/
    Статус всех служб для Rockstar Games Launcher и поддерживаемых игр: https://support.rockstargames.com/ru/servicestatus


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

Vermilion

Высший разум
High developer
BackEnd developer
FrontEnd developer
29 Сен 2021
1,457
866
181
34
Странно как-то работает drawText. Когда render помещен в Interval, то текст отображается правильно.
Но если уберу Intreval и будет один render, то вывод в консоль работает, а drawText над игроком нет.
Но setInterval как я понимаю не очень хорошая идея.

Рабочая версия (Typescript):
JavaScript:
mp.nametags.enabled = false
setInterval(() => {
  mp.events.add('render', () => {
    mp.console.logWarning('Render работает')
    mp.players.forEachInStreamRange((player: PlayerMp) => {
      mp.console.logWarning('1')
      if (player.handle === 0 || player === mp.players.local) return
      mp.console.logWarning('2')
      const targetPos = player.getBoneCoords(12844, 0, 0, 0)
      const localPos = mp.players.local.position
      const distance = mp.game.gameplay.getDistanceBetweenCoords(
        localPos.x, localPos.y, localPos.z,
        targetPos.x, targetPos.y, targetPos.z,
        true
      )
      if (distance > 15) return
      mp.console.logWarning('3')
      const { x, y } = mp.game.graphics.world3dToScreen2d(new mp.Vector3(targetPos.x, targetPos.y, targetPos.z + 0.5))
      if (x && y) {
        mp.console.logWarning('4')
        drawTag(x, y, `Местный «${player.remoteId}»`, [255, 255, 255, 255])
      }
    })
  })
}, 3000)

const drawTag = (x: number, y: number, tag: string, color: Array4d) => {
  mp.game.graphics.drawText(tag, [x, y], { font: 4, color: color, scale: [0.3, 0.3], outline: true })
}
Зачем рендер помещать в интервал, спустя 1 минуту у тебя уже будет 20 активных рендеров, которые стакаются каждый раз. Спустя 10 минут у тебя просто упадет клиент
 
Реакции: XDeveluxe

Vermilion

Высший разум
High developer
BackEnd developer
FrontEnd developer
29 Сен 2021
1,457
866
181
34
Чрезмерное количество рендеров влияет на работу клиента. Код, который находится внутри, выполняется каждый кадр, ~60 раз в секунду.
По хорошему, нужно контролировать количество рендеров и включать, отключать их по мере необходимости. Но, смотря на код в оперсорс проектах, впечатление складывается порой совсем иное.
Код:
mp.events.add('render', this.render)

Код:
mp.events.remove('render', this.render)
 

enotit

Высший разум
High developer
BackEnd developer
13 Ноя 2020
1,667
535
187
22
Странно как-то работает drawText. Когда render помещен в Interval, то текст отображается правильно.
Но если уберу Intreval и будет один render, то вывод в консоль работает, а drawText над игроком нет.
Но setInterval как я понимаю не очень хорошая идея.

Рабочая версия (Typescript):
JavaScript:
mp.nametags.enabled = false
setInterval(() => {
  mp.events.add('render', () => {
    mp.console.logWarning('Render работает')
    mp.players.forEachInStreamRange((player: PlayerMp) => {
      mp.console.logWarning('1')
      if (player.handle === 0 || player === mp.players.local) return
      mp.console.logWarning('2')
      const targetPos = player.getBoneCoords(12844, 0, 0, 0)
      const localPos = mp.players.local.position
      const distance = mp.game.gameplay.getDistanceBetweenCoords(
        localPos.x, localPos.y, localPos.z,
        targetPos.x, targetPos.y, targetPos.z,
        true
      )
      if (distance > 15) return
      mp.console.logWarning('3')
      const { x, y } = mp.game.graphics.world3dToScreen2d(new mp.Vector3(targetPos.x, targetPos.y, targetPos.z + 0.5))
      if (x && y) {
        mp.console.logWarning('4')
        drawTag(x, y, `Местный «${player.remoteId}»`, [255, 255, 255, 255])
      }
    })
  })
}, 3000)

const drawTag = (x: number, y: number, tag: string, color: Array4d) => {
  mp.game.graphics.drawText(tag, [x, y], { font: 4, color: color, scale: [0.3, 0.3], outline: true })
}
Подтверждаю предыдущего оратора. Не знаю насколько полезно, но пусть будет.
mp.events.add - метод, который добавляет слушателя события. В данном случае, у тебя стрелочная функция является слушателем (то что будет вызываться, при срабатывании действия).
"render" - событие, которое вызывается каждый тик (игровую отрисовку экрана). Тут же сразу, чем меньше таких слушателей - тем лучше, тем быстрее будет работать твой код.
Если таких 1-2 прекрасно, 20-100... Уже вопросики к оптимизации. Кто-то такие функции вызывает из одного слушателя, но это уже вкусовщина.
setInterval - вызывает, то что находится внутри, также, каждые n-секунд. Соответственно, у тебя каждые n-секунд создаются слушатели. Какой эффект от этого ожидал - не понятно.

Попробуй логировать не только этапы, но и переменные, которые имеются.


Слёзно прошу, не делать такую вложенность...
 

Vermilion

Высший разум
High developer
BackEnd developer
FrontEnd developer
29 Сен 2021
1,457
866
181
34
Вот так по идее должно работать, но на сервере не проверял, писал в редакторе форума
JavaScript:
mp.events.add('render', (nametags: [PlayerMp, number, number, number][]) => {
    const { graphics } = mp.game;
    for (const nametag of nametags) {
        const [player, x, y, distance] = nametag;
        if (distance > 50) continue;
        graphics.drawText(player.name, [x, y], {
            font: 0,
            color: [255, 255, 255, 255],
            scale: [0.3, 0.3],
            outline: true,
        });
    }
});
 

PATRIOT

Начинающий специалист
12 Окт 2020
302
49
92
Вот так по идее должно работать, но на сервере не проверял, писал в редакторе форума
JavaScript:
mp.events.add('render', (nametags: [PlayerMp, number, number, number][]) => {
    const { graphics } = mp.game;
    for (const nametag of nametags) {
        const [player, x, y, distance] = nametag;
        if (distance > 50) continue;
        graphics.drawText(player.name, [x, y], {
            font: 0,
            color: [255, 255, 255, 255],
            scale: [0.3, 0.3],
            outline: true,
        });
    }
});
Почему то nametags считается как undefined. Даже когда другой игрок рядом
 

Vermilion

Высший разум
High developer
BackEnd developer
FrontEnd developer
29 Сен 2021
1,457
866
181
34

Vermilion

Высший разум
High developer
BackEnd developer
FrontEnd developer
29 Сен 2021
1,457
866
181
34
Ну значит вот так:
JavaScript:
mp.events.add("render", () => {
    const { x, y, z } = mp.players.local.position;
    mp.players.forEachInStreamRange((target) => {
        const { x: targetX, y: targetY, z: targetZ } = target.getCoords(true);
        const dist = mp.game.system.vdist(x, y, z, targetX, targetY, targetZ);
        if (dist > 50) return;
        mp.game.graphics.drawText(
            `${target.name}`,
            [x, y, z + 1.5],
            {
                font: 0,
                color: [255, 255, 255, 255],
                scale: [0.25, 0.25],
                outline: true,
                centre: true,
            },
        );
    });
});
 
Последнее редактирование:

Justin_Games

Активный участник
5 Дек 2020
65
27
75
JavaScript:
    const drawTags = () => {
        const { position } = mp.players.local;

        mp.players.forEachInRange(new mp.Vector3(position.x, position.y, position.z), 50, player => {
            const pos = mp.game.graphics.world3dToScreen2d(player.position.x, player.position.y, player.position.z);
            if(!pos) return;

            mp.game.graphics.drawText(player.name, [pos.x, pos.y], {
                font: 0,
                color: [255, 255, 255, 255],
                scale: [0.3, 0.3],
                outline: true,
            });
        })
    }
    mp.events.add('render', drawTags);
 
Реакции: Swayze

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
2,992
1,727
211
28
render не принимает аргументы.
С каких пор?
1755033638012.png

Работало и работает прямо сейчас.

Выписка с wiki:
1755033764431.png
 

Justin_Games

Активный участник
5 Дек 2020
65
27
75

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
2,992
1,727
211
28
Окак, походу пересматривать вики порой полезно)
Просто для информации: render принимал nametags ещё в 2018, поэтому не знаю с чего такая информация, но не суть.
Это давно так работает, а вот почему у человека может приходить туда null/undefined - мыслей у меня нет.
 

PATRIOT

Начинающий специалист
12 Окт 2020
302
49
92
Всем спасибо за помощь. Неймтеги были сделаны правильно, но в другом месте я просто выключал все рендеры после авторизации.
У кого возникли подобные проблемы, обратите внимание, не выключаются ли у вас все рендеры в каком-то месте
 
Реакции: XDeveluxe