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 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) |
3 | if (model && model->type == mod_studio) |
4 | return (studiohdr_t*)model->cache.data; |
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); |
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; |
3. Проверяем, пересекается ли линия трейса с этим ббоксом
4. Если пересекается, то берём индекс этой энтити через visent->info и дальше делаем что душе угодно.__________________
SNMetamorph's Personal Blog
Xash3D Modding Discord