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

Вопрос Проверка на то, вошла уже сущность в стрим или нет

E-Exception

Участник портала
3 Июл 2022
104
17
59
23
Всем привет, написал для себя небольшие удобные методы расширения для класса Entity. Суть кода в том, что можно локально привязать лямбда - функции для мгновенного выполнения при входе в стрим сущности. (Кому мб пригодится может даже :) )

Код:
public static void OnStreamEvent_Add(this Entity e, Action handler)
{
        List<Action> Actions = e.HasData("OnStreamEvents") ? e.GetData<List<Action>>("OnStreamEvents") : new List<Action>();
        Actions.Add(handler);
        e.SetData<List<Action>>("OnStreamEvents", Actions);
  }
//Another class
RAGE.Events.OnEntityStreamIn += (e) =>
{
          if (e.HasData("OnStreamEvents"))
          {
                e.GetData<List<Action>>("OnStreamEvents").ForEach((action) => { action?.Invoke(); });
          }
  };
Вот так используется в коде

Код:
var ped = new Ped(hash, veh.Position, 0, veh.Dimension);

ped .OnStreamEvent_Add(() =>
{
    ped .SetAlpha(1, false);
}

Но такая проблема есть, даже смешно. Необходимо в методе OnStreamEvent_Add добавить проверку на то, что сущность УЖЕ существует в стриме и вызвать хранимые функции.
Сейчас получается так, то сначала вызывается событие OnEntityStreamIn вызывая пустые функции, а затем только они добавляются... странно. Какими методами это сделать?
 
Последнее редактирование:

E-Exception

Участник портала
3 Июл 2022
104
17
59
23
Самый тупой способ это проверка на содержание сущности в RAGE.Game.Entities. ... .Streamed, но не очень хочется захламлять код тупыми проверками на тип сущности..
 

MoonFusion

Старожил
BackEnd developer
14 Июн 2021
363
218
143
Всем привет, написал для себя небольшие удобные методы расширения для класса Entity. Суть кода в том, что можно локально привязать лямбда - функции для мгновенного выполнения при входе в стрим сущности. (Кому мб пригодится может даже :) )

Код:
public static void OnStreamEvent_Add(this Entity e, Action handler)
{
        List<Action> Actions = e.HasData("OnStreamEvents") ? e.GetData<List<Action>>("OnStreamEvents") : new List<Action>();
        Actions.Add(handler);
        e.SetData<List<Action>>("OnStreamEvents", Actions);
  }
//Another class
RAGE.Events.OnEntityStreamIn += (e) =>
{
          if (e.HasData("OnStreamEvents"))
          {
                e.GetData<List<Action>>("OnStreamEvents").ForEach((action) => { action?.Invoke(); });
          }
  };
Вот так используется в коде

Код:
var ped = new Ped(hash, veh.Position, 0, veh.Dimension);

ped .OnStreamEvent_Add(() =>
{
    ped .SetAlpha(1, false);
}

Но такая проблема есть, даже смешно. Необходимо в методе OnStreamEvent_Add добавить проверку на то, что сущность УЖЕ существует в стриме и вызвать хранимые функции.
Сейчас получается так, то сначала вызывается событие OnEntityStreamIn вызывая пустые функции, а затем только они добавляются... странно)
Нормально бро, но попробуй поработать над неймингом, OnStreamEvent_Add это перебор, либо уже юзай камл кейс OnStreamEventAdd, либо снейк кейс ( не рекомендую ) On_Stream_Event_Add ( но если что обычно в снейк кейсе не юзают больших букв, но в шарпе все же актуально ).
 

MoonFusion

Старожил
BackEnd developer
14 Июн 2021
363
218
143
Ну и плюс не e в лямбда функции, а полный нейм entity, что бы было понятно с чем ты взаимодействуешь
 

E-Exception

Участник портала
3 Июл 2022
104
17
59
23
Я, конечно, благодарен ему, но по-сути вопрос не был решен)

UPD: Возможно вопрос не очевидный, поправил немного, мой косяк
 

MoonFusion

Старожил
BackEnd developer
14 Июн 2021
363
218
143
Я, конечно, благодарен ему, но по-сути вопрос не был решен)

UPD: Возможно вопрос не очевидный, поправил немного, мой косяк
Да изначально и не понял что тут был вопрос, но кстати все ещё не до конца понял что ты хочешь сделать, можешь перефразировать вопрос?
 

E-Exception

Участник портала
3 Июл 2022
104
17
59
23
Да изначально и не понял что тут был вопрос, но кстати все ещё не до конца понял что ты хочешь сделать, можешь перефразировать вопрос?
Короче, как проверить сущность в данный момент в зоне стрима или нет?
 

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
2,781
1,580
211
28

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
2,781
1,580
211
28
Беда в том, что у типа Enitity нет свойства Handle :c
А у Player? Если у Player есть и тебе нужно проверять только игроков, то проверяй на entity.Type, если != Player, return. А после сделай каст:

C#:
Player target = (Player)entity;
// или
Player target = entity as Player;
 

E-Exception

Участник портала
3 Июл 2022
104
17
59
23
А у Player? Если у Player есть и тебе нужно проверять только игроков, то проверяй на entity.Type, если != Player, return. А после сделай каст:

C#:
Player target = (Player)entity;
// или
Player target = entity as Player;
Я планировал сделать эти расширения общими для Entity. Но видимо прийдётся делать проверки на тип(
 

MoonFusion

Старожил
BackEnd developer
14 Июн 2021
363
218
143
А в чем проблема ручками на клиенте у игрока создать лист entity которые у него в стриме?
 

MiLT

Активный участник
BackEnd developer
2 Янв 2023
60
26
62
А в чем проблема ручками на клиенте у игрока создать лист entity которые у него в стриме?
И после этого у тебя еще роль high coder :roflanebalo:

Я планировал сделать эти расширения общими для Entity. Но видимо прийдётся делать проверки на тип(

Не нужны проверки. То, что у Entity в шарпах нет .handle, это скорее всего просто недоработка шарповского API, на жсовском клиенте у всех есть .handle. Не припомню конечно, чтобы в шарпах были возможности расширить класс пропертями извне, поэтому можешь просто спокойно делать проверку на (entity as PlayerMp).Handle != 0. Выглядит костыльно, но других вариантов особо нет

UPD: Загуглил, оказывается в шарпах as нельзя делать с несовместимыми типами (ещё один pros в пользу тс)
 
Последнее редактирование:

MoonFusion

Старожил
BackEnd developer
14 Июн 2021
363
218
143
Ну и уже от этого реализовать проверку
И после этого у тебя еще роль high coder :roflanebalo:



Не нужны проверки. То, что у Entity в шарпах нет .handle, это скорее всего просто недоработка шарповского API, на жсовском клиенте у всех есть .handle. Не припомню конечно, чтобы в шарпах были возможности расширить класс пропертями извне, поэтому можешь просто спокойно делать проверку на (entity as PlayerMp).Handle != 0. Выглядит костыльно, но других вариантов особо нет

UPD: Загуглил, оказывается в шарпах as нельзя делать с несовместимыми типами (ещё один pros в пользу тс)
пососи лох безработный ☺️
 

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
2,781
1,580
211
28
Загуглил, оказывается в шарпах as нельзя делать с несовместимыми типами (ещё один pros в пользу тс)
Для этого есть "is".
C#:
if (entity is not PlayerMp target) return;
// или
if (!(entity is PlayerMp target)) return;
 

MiLT

Активный участник
BackEnd developer
2 Янв 2023
60
26
62
Для этого есть "is".
C#:
if (entity is not PlayerMp target) return;
// или
if (!(entity is PlayerMp target)) return;

is для проверки типов в рантайме, не понимаю к чему ты это написал. Да и к тому же as эквивалентно выражению E is T ? (T)E : (T)null
А если и проверять типы у ентити, то лучше через entity.type
 

MoonFusion

Старожил
BackEnd developer
14 Июн 2021
363
218
143
is для проверки типов в рантайме, не понимаю к чему ты это написал. Да и к тому же as эквивалентно выражению E is T ? (T)E : (T)null
А если и проверять типы у ентити, то лучше через entity.type
Трахнул