This is a mobile optimized page that loads fast, if you want to load the real page, click this text.

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

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
367
219
143
Нормально бро, но попробуй поработать над неймингом, OnStreamEvent_Add это перебор, либо уже юзай камл кейс OnStreamEventAdd, либо снейк кейс ( не рекомендую ) On_Stream_Event_Add ( но если что обычно в снейк кейсе не юзают больших букв, но в шарпе все же актуально ).
 

MoonFusion

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

E-Exception

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

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

MoonFusion

Старожил
BackEnd developer
14 Июн 2021
367
219
143
Да изначально и не понял что тут был вопрос, но кстати все ещё не до конца понял что ты хочешь сделать, можешь перефразировать вопрос?
 

E-Exception

Участник портала
3 Июл 2022
104
17
59
23
Короче, как проверить сущность в данный момент в зоне стрима или нет?
 

XDeveluxe

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

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
2,793
1,595
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
Я планировал сделать эти расширения общими для Entity. Но видимо прийдётся делать проверки на тип(
 

MoonFusion

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

MiLT

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


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

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

MoonFusion

Старожил
BackEnd developer
14 Июн 2021
367
219
143
Ну и уже от этого реализовать проверку
пососи лох безработный
 

XDeveluxe

⚡️BackEnd Developer
Команда форума
Moderator
High developer
BackEnd developer
30 Авг 2021
2,793
1,595
211
28
Для этого есть "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
367
219
143
Трахнул