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

Не могу в клиенте C# вызвать Events.CallRemote

Holod

Новый участник
10 Янв 2025
20
0
6
Всем привет! Не могу вызвать в клиентской части вызывать Events.CallRemote, код следующий:

C#:
private async void RegisterAccount(object[] args)
{
    var social_club_id = (string)args[0];
    Console.WriteLine($"Got social ID: {social_club_id} from UI");

    _networkManager.SendDataToServer("RegisterAccount", social_club_id); // ОБРАТИМ СЮДА ВНИМАНИЕ
}

Тут ошибок нет, и собственно вот тут где вызывается метод:
C#:
using RAGE;
using RAGE.Game;

namespace staterp_client.Core.Networking
{
    public class NetworkManager
    {
        public Task SendDataToServer(string eventName, object data)
        {
            return Events.CallRemote(eventName, data); // <--- тут ошибка
        }
    }
}

Ошибка:
Код:
CS0029: Не удается неявно преобразовать тип "void" в "RAGE.Task".
 

Jerry (ChatGPT)

AI-powered language model
VIP
helper
17 Окт 2023
1,875
208
5
Проблема заключается в том, что метод Events.CallRemote возвращает void, а ваш метод SendDataToServer должен возвращать Task в соответствии с объявлением.
Чтобы исправить ошибку, вы можете обернуть вызов Events.CallRemote в Task, используя TaskCompletionSource. Вот пример исправленного кода:

C#:
using System.Threading.Tasks;
using RAGE;

namespace staterp_client.Core.Networking
{
    public class NetworkManager
    {
        public Task SendDataToServer(string eventName, object data)
        {
            var tcs = new TaskCompletionSource<object>();
            Events.CallRemote(eventName, data);
            return tcs.Task;
        }
    }
}

Теперь ваш метод SendDataToServer должен правильно возвращать Task.
 

Holod

Новый участник
10 Янв 2025
20
0
6
Проблема заключается в том, что метод Events.CallRemote возвращает void, а ваш метод SendDataToServer должен возвращать Task в соответствии с объявлением.
Чтобы исправить ошибку, вы можете обернуть вызов Events.CallRemote в Task, используя TaskCompletionSource. Вот пример исправленного кода:

C#:
using System.Threading.Tasks;
using RAGE;

namespace staterp_client.Core.Networking
{
    public class NetworkManager
    {
        public Task SendDataToServer(string eventName, object data)
        {
            var tcs = new TaskCompletionSource<object>();
            Events.CallRemote(eventName, data);
            return tcs.Task;
        }
    }
}

Теперь ваш метод SendDataToServer должен правильно возвращать Task.
ChatGPT у тебя я уже спрашивал, ты не помог)))
 

XDeveluxe

⚡️BackEnd Developer
Команда форума
high coder
30 Авг 2021
2,552
1,437
211
27
Всем привет! Не могу вызвать в клиентской части вызывать Events.CallRemote, код следующий:

C#:
private async void RegisterAccount(object[] args)
{
    var social_club_id = (string)args[0];
    Console.WriteLine($"Got social ID: {social_club_id} from UI");

    _networkManager.SendDataToServer("RegisterAccount", social_club_id); // ОБРАТИМ СЮДА ВНИМАНИЕ
}

Тут ошибок нет, и собственно вот тут где вызывается метод:
C#:
using RAGE;
using RAGE.Game;

namespace staterp_client.Core.Networking
{
    public class NetworkManager
    {
        public Task SendDataToServer(string eventName, object data)
        {
            return Events.CallRemote(eventName, data); // <--- тут ошибка
        }
    }
}

Ошибка:
Код:
CS0029: Не удается неявно преобразовать тип "void" в "RAGE.Task".
Ну чтож, давай разберём.

Во-первых, зачем оборачивать метод и при этом в своей реализации не иметь никакого дополнительного кода?
Иными словами зачем вообще нужен метод SendDataToServer, если ты точно так же можешь использовать Events.CallRemote из любого файла?
В данной реализации это "код ради кода" - так делать не стоит. Допускаю, что ты просто таким образом решил "показать пример", но сомневаюсь.
В этой реализации нет смысла от этого метода, удали его вовсе и используй Events.CallRemote напрямую.

Во-вторых, компилятор тебе буквально говорит что за ошибка и почему она вылезает, ты пробовал её читать?
Компилятор говорит "не могу преобразовать void в RAGE.Task", о чём это должно тебе сигнализировать?
Твой метод SendDataToServer должен вернуть RAGE.Task. Это значит, что внутри этого метода ты должен вернуть что-то, что равняется объекту RAGE.Task и является итогом работы метода.
Ты же пытаешься вернуть Events.CallRemote, который в свою очередь является void'ом, то есть не возвращает абсолютно ничего. Итого, если простыми словами, то ты не можешь вернуть "ничего" под видом "чего-то", понимаешь? Я утрирую, но лишь для того, чтобы лучше описать проблему. Нельзя из 0 яблок сделать 10.
Чтобы это исправить - тебе достаточно public Task заменить на public void и убрать изнутри return.
Это мы делаем по той причине, что в этом методе тебе не нужно ничего возвращать, как "результат выполнения", тебе нужно просто отправить на сервер ивент с данными и вернуться к предыдущему методу, который вызвал твою обёртку, чтобы продолжить работу.

В-третьих, в другом участке кода у тебя присутствует async void - это плохой тон и делать так не стоит, если ты точно не понимаешь, зачем нужно именно так.
По твоему коду видно, что ты не понимаешь, а значит такое решение было сделано "просто потому что я пытаюсь в асинхрон, но пока не понимаю что это такое".
Твой метод помечен асинхронным с помощью async, но при этом внутри метода ты не используешь await на методе, который в твоём примере помечен как Task, таким образом выполнение твоего Task метода SendDataToServer в асинхронном методе RegisterAccount будет выполняться синхронно, а в чём, собственно, тогда смысл асинхронности, которое ты пытаешься тут создать (неизвестно ради каких целей)?

В-четвёртых, ты создал метод RegisterAccount, который зарегистрировал как RemoteEvent (то есть он срабатывает, когда на него присылают данные либо с сервера, либо с CEF).
Если это метод для вызова с сервера, то странно, что ты отправляешь единственный аргумент SocialClubId, который сразу же после отправляешь назад на сервер, поэтому этот вариант отметаем.
Если это метод для вызова с CEF, то это ещё более странно, потому что CEF не знает ничего о Social Club данных или о каких-либо других данных игрока, а соответственно что ты хочешь получить в свою переменную - мне неизвестно. Ниже ты вывел лог с текстом "from UI", ну и, собственно, вот. UI не может отправить тебе Social Club данные, если ты их сам туда ранее не отправлял с этого же клиента.

Всё это даёт понимание того, что у тебя сейчас в голове просто каша и ты изучаешь, но попробуй почитать больше информации на эту тему, потому что сейчас вообще мимо.
В данном примере тебе не нужна ни асинхронность, ни потоки (Task'и) вообще, убрать ото всюду здесь и async, и Task, а так же использовать Events.CallRemote напрямую и продолжить изучение. Успехов в изучении.

Кстати, с тебя 5 тысяч :j3r:
 
Последнее редактирование:

Inoi

/dev/null
Команда форума
VIP
15 Окт 2020
3,529
1,691
208
35
ChatGPT у тебя я уже спрашивал, ты не помог)))

это не она не помогла, это ты не понял
она в целом абсолютно права, Events.CallRemote возвращает void (ничего)

код
Код:
return Events.CallRemote(eventName, data);
- шизовый (без негатива)

ты пытаешься вернуть значение у метода, которым вызываешь запуск серверного эвента, который мало того что ничего не возвращает - так и эта конструкция в принципе невозможна по крайней мере в рейдже - архитектура рейджа это односторонние сообщения.

можно реализовать логику вопроса-ответа через построчные вызовы евентов там-сям, но это будет выглядеть абсолютно не так.
а ожидать непосредственного возврата значения от Events.CallRemote невозможно

твой вызов должен выглядеть либо так

Код:
public void SendDataToServer(string eventName, object data)
    {
        Events.CallRemote(eventName, data);
    }

либо допустим так, если тебе очень нужен таск и это метод из какой-то асинхронной цепочки

Код:
 public Task SendDataToServer(string eventName, object data)
    {
        Events.CallRemote(eventName, data);
        return Task.CompletedTask;
    }

но нахуя - не понятно, Events.CallRemote всегда синхронный


п.с. писал ответ до того как Паша выдавил свою простыню, отвлёкся посрать
 
Последнее редактирование:

Holod

Новый участник
10 Янв 2025
20
0
6
Всем спасибо за ответ, с вчерашнего утра сидел почти до сегодняшнего, так голова опухла и сам не заметил что сделал, поправил, сделал все как надо по Вашим советам))
 

Holod

Новый участник
10 Янв 2025
20
0
6
В-четвёртых, ты создал метод RegisterAccount, который зарегистрировал как RemoteEvent (то есть он срабатывает, когда на него присылают данные либо с сервера, либо с CEF).
Если это метод для вызова с сервера, то странно, что ты отправляешь единственный аргумент SocialClubId, который сразу же после отправляешь назад на сервер, поэтому этот вариант отметаем.
Если это метод для вызова с CEF, то это ещё более странно, потому что CEF не знает ничего о Social Club данных или о каких-либо других данных игрока, а соответственно что ты хочешь получить в свою переменную - мне неизвестно. Ниже ты вывел лог с текстом "from UI", ну и, собственно, вот. UI не может отправить тебе Social Club данные, если ты их сам туда ранее не отправлял с этого же клиента.
Это чисто для себя, понятно что от туда SocialClubID не достать, я и не пытался, там просто я отправляю строку по типу "433hda7yda", чтобы получить ее на клиенте и отдать на сервер, чисто для примера) просто получилось что я так назвал