HLFX.Ru Forum
Показать все 22 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Получение информации о энтитях на стороне клиента (https://hlfx.ru/forum/showthread.php?threadid=5420)


Отправлено SNMetamorph 18-12-2019 в 09:27:

Question Получение информации о энтитях на стороне клиента

Пробую значица я получить такие элементарные вещи как origin и velocity в структурке cl_entity_t, а она оказываться чуть ли не полностью забита нулями. То есть там нет даже той информации о энтитях, которой клиент реально обладает. Где ж её тогда взять?
Код для этих всех дел такой вот:


Отправлено Дядя Миша 18-12-2019 в 09:54:

для игрока оригин предиктится и не пишется в cl_entity_t. Велосити - аналогично. Для обычных энтить его можно в дельту прописать, чтобы он передавался, но обычно это не требуется. Там поля зарезервированы, но в delta.lst не указаны, вот там и нули.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено SNMetamorph 18-12-2019 в 12:45:

Цитата:
Дядя Миша писал:
для игрока оригин предиктится и не пишется в cl_entity_t. Велосити - аналогично. Для обычных энтить его можно в дельту прописать, чтобы он передавался, но обычно это не требуется. Там поля зарезервированы, но в delta.lst не указаны, вот там и нули.

Где-то же все таки рендерер студиомоделей берет ориджины энтитей.


Отправлено Дядя Миша 18-12-2019 в 12:50:

В StudioSetupTransform

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 18-12-2019 в 15:02:

Цитата:
Дядя Миша писал:
Для обычных энтить его можно в дельту прописать, чтобы он передавался, но обычно это не требуется. Там поля зарезервированы, но в delta.lst не указаны, вот там и нули.

Разве не указаны? В блоке Entity_Encode есть origin[0], [1], [2] и angles[0], [1], [2]. А на клиенте всё равно нули. Я пытался сделать выделение юзаемой энтити по ббоксу чисто на клиенте, но так и не смог получить эти значения.


Отправлено Дядя Миша 18-12-2019 в 15:19:

Цитата:
Ku2zoff писал:
А на клиенте всё равно нули

та ты где-то не там их пытался получить. У меня никада не возникало подобной проблемы.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 18-12-2019 в 15:54:

Дядя Миша ох, кажется я это делал в Hud_Redraw. А если в Hud_AddEntity? Вообще, в какие моменты инфа об энтитях на клиенте может быть недоступна?


Отправлено Дядя Миша 18-12-2019 в 16:09:

Я в Hud_Redraw выцеплял монстриков, чтобы рисовать их в виде красных прицелов на экране упровляемой рокеты редемира и никаких проблем не возникало.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 18-12-2019 в 16:33:

Дядя Миша ну это ты монстриков. А я-то брашевые энтити. func_rot_button, например. Ориджин-то у них на месте. А вот англсы пустые. Хотя в pm_shared всё с англсами прекрасно.


Отправлено Дядя Миша 18-12-2019 в 17:20:

Цитата:
Ku2zoff писал:
А я-то брашевые энтити

откуда у брашевых энтить возьмется оригин? Отродясь его у них не было.
У них же начальная позиция всегда абсолютная и записана в mins\maxs.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Ku2zoff 18-12-2019 в 21:16:

Цитата:
Дядя Миша писал:
откуда у брашевых энтить возьмется оригин?

Ох, я уже забыл, в чём проблема. Вроде бы mins\maxs правильно считаются, а вот с англсами беда. Короче, PM_ParticleBox вертится норм вслед за энтитей. А вот если на клиенте сделать похожую функцию ср-вами pEfxAPI, то нихрена не вертится. Потому что у physent_t англсы нормальные, а у cl_entity_t, индекс которой получили с сервера, вместо англсов нули.


Отправлено SNMetamorph 19-12-2019 в 05:33:

Цитата:
Дядя Миша писал:
Я в Hud_Redraw выцеплял монстриков

У меня чет даже монстриков не выцепляет.


Отправлено Дядя Миша 19-12-2019 в 07:45:

curstate.origin
curstate.angles
там тоже нули?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено SNMetamorph 19-12-2019 в 11:30:

Цитата:
Дядя Миша писал:
curstate.origin
curstate.angles
там тоже нули?

Да. Нули везде кроме поля index.


Отправлено Дядя Миша 19-12-2019 в 11:45:

SNMetamorph ты или не ту энтить проверяешь или не там смотришь.
А моветип её чему равен, для начала? Как ты вообще берёшь энтити?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено SNMetamorph 19-12-2019 в 11:51:

Цитата:
Дядя Миша писал:
Как ты вообще берёшь энтити?

Ну вот тут код можно поглядеть.
https://github.com/SNMetamorph/gold...rawing.cpp#L156


Отправлено Дядя Миша 19-12-2019 в 12:29:

А, ну так неудивительно что оно тебе нули возвращает.

C++ Source Code:
cl_entity_t *entity = GET_ENTITY(gEngfuncs.pEventAPI->EV_IndexFromTrace( &traceData ));

вот как надо. У тебя же pmove возвращает индекс не клиентской энтити, а собственный локальный индекс в pmove->physents, который еще надо сконвертировать в индекс клиентской.

Добавлено 19-12-2019 в 15:29:

Единственное, для чего эти индексы всегда совпадают - это для мира и для локального игрока.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено SNMetamorph 19-12-2019 в 12:44:

Цитата:
Дядя Миша писал:
вот как надо. У тебя же pmove возвращает индекс не клиентской энтити, а собственный локальный индекс в pmove->physents, который еще надо сконвертировать в индекс клиентской.

Воооооо, с этим благодарствую, теперь всё замечательно.

Добавлено 19-12-2019 в 21:44:

А можно как-то сделать, чтобы трейс срабатывал на энтити без коллизии, например как ammo_357 какое-нибудь?


Отправлено Дядя Миша 19-12-2019 в 13:07:

Цитата:
SNMetamorph писал:
А можно как-то сделать, чтобы трейс срабатывал на энтити без коллизии, например как ammo_357 какое-нибудь?

да лихко. Трассируй не physents а visents. Они для тово и нужны. Правда тут засада есть - в халфе кажется нет экспорта для конвертации визэнтити в клиентскую. В ксаше-то я понятное дело это вывел.

Добавлено 19-12-2019 в 16:07:

А вообще блин, посмотрел я так, прикинул. Нет, наверное только под ксашем это будет работать. У несолидных же энтить, надо как минимум ббокс задать и на клиент его отослать. Ксаш эту ситуацию сам умеет разруливать, а халфа нет.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено SNMetamorph 19-12-2019 в 13:11:

Цитата:
Дядя Миша писал:
да лихко. Трассируй не physents а visents. Они для тово и нужны. Правда тут засада есть - в халфе кажется нет экспорта для конвертации визэнтити в клиентскую. В ксаше-то я понятное дело это вывел.

Добавлено 19-12-2019 в 16:07:

А вообще блин, посмотрел я так, прикинул. Нет, наверное только под ксашем это будет работать. У несолидных же энтить, надо как минимум ббокс задать и на клиент его отослать. Ксаш эту ситуацию сам умеет разруливать, а халфа нет.

Может быть прокатит какой-нибудь костыль по типу FindEntityInSphere в месте столкновения трейса с землей?


Отправлено Дядя Миша 19-12-2019 в 13:36:

Яж говорю, надо всем несолидным энтитям на сервере задать ббокс.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено SNMetamorph 02-04-2020 в 03:41:

Вообще как бы визэнтитей не так уж и много и можно просто линейным поиском перебрать все, и нужная скорее всего найдётся. А они еще и в памяти все друг за другом располагаются, круто.

Добавлено 02-04-2020 в 10:35:

А как работает PM_TraceModel()?

Добавлено 02-04-2020 в 11:00:

Теоретически же вроде как со стороны клиента можно залезть в заголовок студиомодели и получить векторы AABB таким образом: http://articles.thewavelength.net/214/
Или нет?

Добавлено 02-04-2020 в 12:41:

Таки да. Метод, упомянутый выше, скорее всего работает.
Значит такой вот алгоритм трассировки несолидных энтить на стороне клиента.

1. Перебираем каждую визэнтить в массиве pmove->visents
2. Находим ббокс для каждой энтити: для студиомоделей у меня примерно такой вот код

C++ Source Code:
1
static studiohdr_t *GetStudioModelHeader(model_t *model)
2
{
3
  if (model && model->type == mod_studio)
4
    return (studiohdr_t*)model->cache.data;
5
  return nullptr;
6
}
7
 
8
physent_t &visEnt = g_pPlayerMove->visents[i];
9
cl_entity_t *traceEntity = g_pClientEngFuncs->GetEntityByIndex(visEnt.info);
10
studiohdr_t *studioHeader = GetStudioModelHeader(traceEntity->model);
11
 
12
if (studioHeader)
13
{
14
  mstudioseqdesc_t *pseqdesc;
15
  pseqdesc = (mstudioseqdesc_t *)((byte *)studioHeader + studioHeader->seqindex);
16
  vec3_t bboxMin = pseqdesc[traceEntity->curstate.sequence].bbmin;
17
  vec3_t bboxMax = pseqdesc[traceEntity->curstate.sequence].bbmax;
18
}

3. Проверяем, пересекается ли линия трейса с этим ббоксом
4. Если пересекается, то берём индекс этой энтити через visent->info и дальше делаем что душе угодно.

__________________
SNMetamorph's Personal Blog
Xash3D Modding Discord


Временная зона GMT. Текущее время 19:33.
Показать все 22 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024