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

Вопрос /description [text]

BooyaK

Новый участник
20 Янв 2022
22
2
47
Привет! Я пытаюсь создать команду /description для игроков RP. Команда должна создать 3DText с описанием персонажа, у меня что-то не работает. Я нович :)

C#:
C++:
        [Command("opis")]
        public static void CMD_opis(ExtPlayer player, string description)
        {
            try
            {
                // Check if the player provided a character description.
                if (string.IsNullOrWhiteSpace(description))
                {
                    player.SendChatMessage("Użycie: /opis [Your Description]");
                    return;
                }


                player.SetData("CharacterDescription", description);
                player.TriggerEvent("updateCharacterDescription");


                player.SendChatMessage("Your descrition has been updated to: " + description);
            }
            catch (Exception e)
            {

                  Log.Write($"CMD_opis Exception: {e.ToString()}");
            }
        }

JS:
JavaScript:
mp.events.add('updateCharacterDescription', () => {
    mp.players.forEachInRange(mp.players.local.position, 10, (otherPlayer) => {
        if (otherPlayer.characterDescription) {
            let description = otherPlayer.characterDescription;
            let position = otherPlayer.position;
            position.z += POSITION_OFFSET - 0.5;

            mp.game.graphics.drawText(description, [position.x, position.y, position.z], {
                font: DESCRIPTION_FONT,
                color: [255, 255, 255, 255], // Biały kolor tekstu (możesz dostosować)
                scale: [DESCRIPTION_SCALE, DESCRIPTION_SCALE],
                centre: true,
                outline: false,
            });
        }
    });
});
 

Jerry (ChatGPT)

AI-powered language model
VIP
helper
17 Окт 2023
2,429
239
100
Привет! Возможно, проблема заключается в том, что вы не устанавливаете значение "characterDescription" для игрока в команде "/opis". Вам нужно добавить следующую строку в метод CMD_opis перед вызовом TriggerEvent:

Код:
player.characterDescription = description;

Также убедитесь, что значение переменной DESCRIPTION_FONT имеет правильный шрифт, а DESCRIPTION_SCALE имеет правильный масштаб.
 

Harland David Sanders

🍔 ChefBurger
Команда форума
High developer
10 Сен 2020
3,671
2,849
219
Привет! Возможно, проблема заключается в том, что вы не устанавливаете значение "characterDescription" для игрока в команде "/opis". Вам нужно добавить следующую строку в метод CMD_opis перед вызовом TriggerEvent:

Код:
player.characterDescription = description;

Также убедитесь, что значение переменной DESCRIPTION_FONT имеет правильный шрифт, а DESCRIPTION_SCALE имеет правильный масштаб.
Бот почти угадал: у тебя опечатка в названии переменной для SetData.
 

Harland David Sanders

🍔 ChefBurger
Команда форума
High developer
10 Сен 2020
3,671
2,849
219
Привет! Я пытаюсь создать команду /description для игроков RP. Команда должна создать 3DText с описанием персонажа, у меня что-то не работает. Я нович :)

C#:
C++:
        [Command("opis")]
        public static void CMD_opis(ExtPlayer player, string description)
        {
            try
            {
                // Check if the player provided a character description.
                if (string.IsNullOrWhiteSpace(description))
                {
                    player.SendChatMessage("Użycie: /opis [Your Description]");
                    return;
                }


                player.SetData("CharacterDescription", description);
                player.TriggerEvent("updateCharacterDescription");


                player.SendChatMessage("Your descrition has been updated to: " + description);
            }
            catch (Exception e)
            {

                  Log.Write($"CMD_opis Exception: {e.ToString()}");
            }
        }

JS:
JavaScript:
mp.events.add('updateCharacterDescription', () => {
    mp.players.forEachInRange(mp.players.local.position, 10, (otherPlayer) => {
        if (otherPlayer.characterDescription) {
            let description = otherPlayer.characterDescription;
            let position = otherPlayer.position;
            position.z += POSITION_OFFSET - 0.5;

            mp.game.graphics.drawText(description, [position.x, position.y, position.z], {
                font: DESCRIPTION_FONT,
                color: [255, 255, 255, 255], // Biały kolor tekstu (możesz dostosować)
                scale: [DESCRIPTION_SCALE, DESCRIPTION_SCALE],
                centre: true,
                outline: false,
            });
        }
    });
});


Вот ты записал в переменную игрока данные:

JavaScript:
player.SetSharedData("CharacterDescription", description);

Затем чтобы их считать на клиенте (JS) можно использовать следующий код:

JavaScript:
player.getVariable('CharacterDescription');
 
Последнее редактирование:
Реакции: BooyaK

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
2,942
1,686
211
28
Во-первых, заместо
mp.players.forEachInRange(pos, range, () =>
Рекомендую использовать
mp.players.forEachInStreamRange(() =>
Если задача перебрать только персонажей в зоне стрима, а не всех (при этом, насколько я понимаю, твой персонаж не будет входить в этот pool (не точно)).

Во-вторых, player.SetData устанавливает серверную данную.
Для установки данных, которые могут передаваться между клиентом и сервером нужно использовать player.SetSharedData.

В-третьих, чтобы считать такую данную с клиента, нужно использовать .getVariable и тот же ключ, который устанавливался на сервере.
 

BooyaK

Новый участник
20 Янв 2022
22
2
47
Спасибо за ваше желание помочь! @xDeveluxe @Harland David Sanders :) К сожалению, что-то не так, потому что ничего не отображается.
JavaScript:
const POSITION_OFFSET = 1.4
const MESSAGE_COLORS = [
    // message
    [255,255,255,255],
    // me
    [224,102,255,255],
    // do
    [224,102,255,255],
    // try
    [224,102,255,255]
]
const MESSAGE_SCALE = 0.35
const MESSAGE_FONT = 4
mp.events.add('updateCharacterDescription', (description) => {
    mp.players.forEachInStreamRange(mp.players.local.position, 10, (player) => {
        if (player.overlayMessage && player.overlayMessage.type == 5) {
            let info = player.overlayMessage;


            let pos = player.getBoneCoords(40269, 0, 0, 0);

            pos.z += TORSO_OFFSET;

            let text = info.text;

            mp.players.get(player.id).refresh();

            mp.game.graphics.drawText(text, [pos.x, pos.y, pos.z], {
                font: MESSAGE_FONT,
                color: MESSAGE_COLOR,
                scale: [MESSAGE_SCALE, MESSAGE_SCALE],
                centre: true,
                outline: true,
            });
        }
    });
});
C++:
        [Command("opis")]
        public static void CMD_opis(ExtPlayer player, string description)
        {
            try
            {
                // Check if the player provided a character description.
                if (string.IsNullOrWhiteSpace(description))
                {
                    Notify.Send(player, NotifyType.Error, NotifyPosition.BottomCenter, "Użycie: /opis [Twój opis]", 3000);
                    return;
                }

                // Ustaw dane gracza z opisem postaci.
                player.SetSharedData("CharacterDescription", description);

                // Wyślij zdarzenie do klienta, aby zaktualizować opis postaci.
                player.TriggerEvent("updateCharacterDescription", description);

                Notify.Send(player, NotifyType.Success, NotifyPosition.BottomCenter, "Twój opis postaci został zaktualizowany na: " + description, 3000);
            }
            catch (Exception e)
            {
                Log.Write($"CMD_opis Exception: {e.ToString()}");
            }
        }
 

Harland David Sanders

🍔 ChefBurger
Команда форума
High developer
10 Сен 2020
3,671
2,849
219
Ты хочешь чтобы после ввода ты сам видео описание на себе? Или только чтобы другие игроки могли видеть твое описание?
Также я не понимаю что делает в твоем коде - player.overlayMessage
 

BooyaK

Новый участник
20 Янв 2022
22
2
47
Я хочу, чтобы описание было видно мне и игрокам. Действительно, overlayMessage предназначен для отправки сообщений XD Не знаю, как я этого не заметил... Я только учусь и захотелось подкормиться ресурсами из чатаOverlay XD Ха-ха-ха
 

Harland David Sanders

🍔 ChefBurger
Команда форума
High developer
10 Сен 2020
3,671
2,849
219

BooyaK

Новый участник
20 Янв 2022
22
2
47
C#:
       [Command("opis")]
       public void CMD_opis(ExtPlayer player, string[] args)
       {
           if (args.Length == 0)
           {
               // Poinformuj gracza o konieczności podania opisu postaci.
               NAPI.Chat.SendChatMessageToPlayer(player, "Użycie: /opis [Twój opis]");
               return;
           }

           string description = string.Join(" ", args);
           player.SetData("CharacterDescription", description);
           UpdateCharacterDescriptionLabel(player, description);
           NAPI.Chat.SendChatMessageToPlayer(player, $"Twój opis postaci został zaktualizowany na: {description}");
       }
       private void UpdateCharacterDescriptionLabel(ExtPlayer player, string description)
       {
           // Usuń poprzednią etykietę, jeśli istnieje.
           if (player.HasData("CharacterLabel"))
           {
               NAPI.Entity.DeleteEntity(player.GetData("CharacterLabel"));
           }

           // Określ pozycję etykiety nad postacią gracza (np. trochę nad głową).
           Vector3 labelPosition = player.Position + new Vector3(0, 0, 2.0f); // Dostosuj wysokość etykiety według potrzeb.

           // Utwórz etykietę tekstową z opisem postaci.
           var label = NAPI.TextLabel.CreateTextLabel(description, labelPosition, 20.0f, 1.0f, 0, new Color(255, 255, 255), true, player.Dimension);

           // Przypnij etykietę do gracza.
           Entity.AttachEntityToEntity(label, player, "SKEL_ROOT", new Vector3(0, 0, 0.2), new Vector3(0, 0, 0));

           // Zapisz etykietę jako dane gracza, aby można ją było usunąć później.
           player.SetData("CharacterLabel", label);
       }
 
Реакции: Harland David Sanders

BooyaK

Новый участник
20 Янв 2022
22
2
47
Код серьезности Описание Состояние обхода строки файла проекта
Ошибка CS1061 «Entity» не содержит определения «AttachEntityToEntity», а доступный метод расширения «AttachEntityToEntity», который принимает первый аргумент типа «Entity», не найден (я пропустил директиву using или ссылку set?). NeptuneEvo C:\Users\eoeo2\Desktop\RPPlus\dotnet\resources\NeptuneEvo\Core\Commands.cs 6479 Активен
:(
 

Inoi

/dev/null
Команда форума
Moderator
VIP
15 Окт 2020
4,088
2,008
208
35
Можешь попробовать обойтись без клиента, одним серверным кодом C#.

https://wiki.rage.mp/index.php?title=CreateTextLabel + NAPI.Entity.AttachEntityToEntity
по-моему AttachEntityToEntity не работает миллиард лет на сервере и тебе всё равно нужно синхронизировать надпись на клиенте
 
Реакции: BooyaK и youngBeaver

BooyaK

Новый участник
20 Янв 2022
22
2
47
он не создает 3DText для моего персонажа :(

JavaScript:
const EVENT_NAME = "SRV::CL::OverlayDescription";
const TORSO_OFFSET = -0.15;
const MESSAGE_COLOR = [133, 0, 143, 255];
const MESSAGE_SCALE = 0.25;
const MESSAGE_FONT = "4";

mp.events.add('render', () => {
    mp.players.forEachInRange(mp.players.local.position, 10, (player) => {
            let pos = player.getBoneCoords(11816, 0, 0, 0);
            pos.z += TORSO_OFFSET;
            let text = info.text;
            mp.game.graphics.drawText(text, [pos.x, pos.y, pos.z], {
                font: MESSAGE_FONT,
                color: MESSAGE_COLOR,
                scale: [MESSAGE_SCALE, MESSAGE_SCALE],
                centre: true,
                outline: true,
            });
    });
});
 
Последнее редактирование:

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
2,942
1,686
211
28
он не создает 3DText для моего персонажа :(

JavaScript:
const EVENT_NAME = "SRV::CL::OverlayDescription";
const TORSO_OFFSET = -0.15;
const MESSAGE_COLOR = [133, 0, 143, 255];
const MESSAGE_SCALE = 0.25;
const MESSAGE_FONT = "4";

mp.events.add('render', () => {
    mp.players.forEachInRange(mp.players.local.position, 10, (player) => {
            let pos = player.getBoneCoords(11816, 0, 0, 0);
            pos.z += TORSO_OFFSET;
            let text = info.text;
            mp.game.graphics.drawText(text, [pos.x, pos.y, pos.z], {
                font: MESSAGE_FONT,
                color: MESSAGE_COLOR,
                scale: [MESSAGE_SCALE, MESSAGE_SCALE],
                centre: true,
                outline: true,
            });
    });
});
Потому что ты, как я и писал раньше, не входишь в пул mp.players. Твой персонаж находится в отдельной переменной mp.players.local.
 
Реакции: youngBeaver

BooyaK

Новый участник
20 Янв 2022
22
2
47
JavaScript:
mp.events.add("showDescription", (description) => {
    const textLabel = mp.labels.new(description, new mp.Vector3(0, 0, 0), {
        font: 0,
        drawDistance: 10,
    });
    
    // Funkcja do aktualizacji pozycji etykiety tekstowej
    function updateTextLabelPosition() {
        const player = mp.players.local;
        textLabel.position = new mp.Vector3(player.position.x, player.position.y, player.position.z + 1);
    }
    
    // Wywołanie funkcji, aby zaktualizować początkową pozycję etykiety
     mp.events.add("render", updateTextLabelPosition); 
});
Ok? :)
 
Последнее редактирование:

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
2,942
1,686
211
28
JavaScript:
mp.events.add("showDescription", (description) => {
    const textLabel = mp.labels.new(description, new mp.Vector3(0, 0, 0), {
        font: 0,
        drawDistance: 10,
    });
   
    // Funkcja do aktualizacji pozycji etykiety tekstowej
    function updateTextLabelPosition() {
        const player = mp.players.local;
        textLabel.position = new mp.Vector3(player.position.x, player.position.y, player.position.z + 1);
    }
   
    // Wywołanie funkcji, aby zaktualizować początkową pozycję etykiety
     mp.events.add("render", updateTextLabelPosition);
});
Ok? :)
Нет, не ок.
Добавлять новую функцию и новый event "render" при каждом вызове "showDescription" - плохо.
Функцию и event "render" нужно вывести за пределы event "showDescription"