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=5189)
Отправлено SNMetamorph 21-03-2019 в 11:07:
Проблема с зависанием анимации у модели локального игрока
Сидел, значит, спокойно работал над модом, и заметил при игре от 3-го лица, что после смерти игрока, у него при хождении полностью зависает анимация: как ног, так и остального тела. Решил разобраться, в чём же все-таки дело. Оказалось, что когда я реализовывал изменение прозрачности модели игрока при приближении камеры к стене, я записывал значение в curstate->renderamt внутри функции V_CalcRefdef().
При этом в рендере студиомоделей содержался подобного рода код:
C++ Source Code:
1 | int CStudioModelRenderer::StudioDrawModel( int flags ) |
6 | m_pCurrentEntity = IEngineStudio.GetCurrentEntity(); |
7 | IEngineStudio.GetTimes( &m_nFrameCount, &m_clTime, &m_clOldTime ); |
8 | IEngineStudio.GetViewInfo( m_vRenderOrigin, m_vUp, m_vRight, m_vNormal ); |
9 | IEngineStudio.GetAliasScale( &m_fSoftwareXScale, &m_fSoftwareYScale ); |
11 | if (m_pCurrentEntity->curstate.renderfx == kRenderFxDeadPlayer) |
13 | entity_state_t deadplayer; |
18 | if (m_pCurrentEntity->curstate.renderamt <= 0 || m_pCurrentEntity->curstate.renderamt > gEngfuncs.GetMaxClients() ) |
22 | deadplayer = *(IEngineStudio.GetPlayerState( m_pCurrentEntity->curstate.renderamt - 1 )); //cl.frames[cl.parsecount & CL_UPDATE_MASK].playerstate[m_pCurrentEntity->curstate.renderamt-1]; |
24 | // clear weapon, movement state |
25 | deadplayer.number = m_pCurrentEntity->curstate.renderamt; |
26 | deadplayer.weaponmodel = 0; |
27 | deadplayer.gaitsequence = 0; |
29 | deadplayer.movetype = MOVETYPE_NONE; |
30 | VectorCopy( m_pCurrentEntity->curstate.angles, deadplayer.angles ); |
31 | VectorCopy( m_pCurrentEntity->curstate.origin, deadplayer.origin ); |
33 | save_interp = m_fDoInterp; |
36 | // draw as though it were a player |
37 | result = StudioDrawPlayer( flags, &deadplayer ); |
39 | m_fDoInterp = save_interp; |
Казалось бы, очевидно, в чем тут проблема.
В общем, я переписал этот код, чтобы индекс игрока-хозяина писался в поле owner, вместо поля renderamt. Серверную часть с кодом body que соответственно тоже переписал под эту задумку.
Получилось у меня вот так:
C++ Source Code:
1 | int CStudioModelRenderer::StudioDrawModel( int flags ) |
6 | m_pCurrentEntity = IEngineStudio.GetCurrentEntity(); |
7 | IEngineStudio.GetTimes( &m_nFrameCount, &m_clTime, &m_clOldTime ); |
8 | IEngineStudio.GetViewInfo( m_vRenderOrigin, m_vUp, m_vRight, m_vNormal ); |
9 | IEngineStudio.GetAliasScale( &m_fSoftwareXScale, &m_fSoftwareYScale ); |
11 | if (m_pCurrentEntity->curstate.renderfx == kRenderFxDeadPlayer) |
13 | entity_state_t deadplayer; |
14 | int owner_index = m_pCurrentEntity->curstate.owner; |
15 | if (owner_index <= 0 || owner_index > gEngfuncs.GetMaxClients()) |
18 | deadplayer = *(IEngineStudio.GetPlayerState(owner_index)); |
20 | // clear weapon, movement state |
21 | deadplayer.number = owner_index + 1; |
22 | deadplayer.weaponmodel = 0; |
23 | deadplayer.gaitsequence = 0; |
24 | deadplayer.movetype = MOVETYPE_NONE; |
25 | deadplayer.origin = m_pCurrentEntity->curstate.origin; |
26 | deadplayer.angles = m_pCurrentEntity->curstate.angles; |
27 | gEngfuncs.Con_Printf("drawing corpse, owner index %d, ent index %d\n", owner_index, m_pCurrentEntity->index); |
29 | int save_interp = m_fDoInterp; |
32 | // draw as though it were a player |
33 | int result = StudioDrawPlayer( flags, &deadplayer ); |
35 | m_fDoInterp = save_interp; |
Проверил я этот код, вроде бы, поначалу все нормально было. Но стоило мне зайти на сервер в мультиплеере - кто-то умер, и у меня снова сглючило анимацию. Снова попытался выяснить в чем дело. Вроде бы, никаких сторонних обращений к rendetamt в коде мода нет (может быть, они есть в коде движка?), но если я по-прежнему пытаюсь отредактировать это поле из кода камеры, то баг с анимацией начинает себя проявлять.
Изменяю прозрачность игрока таким образом:
C++ Source Code:
1 | cl_entity_t *player = gEngfuncs.GetLocalPlayer(); |
2 | v_origin = CAM_GetClippedOrigin(player->origin, trace_dir, &transparency); |
3 | player->curstate.renderamt = max(cam_clipalpha->value, transparency); |
4 | player->curstate.rendermode = kRenderTransTexture; |
Отправлено ~ X ~ 21-03-2019 в 12:07:
Один хак заменил другим
kRenderFxDeadPlayer и body que надо вообще уничтожать.
__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]
Отправлено SNMetamorph 21-03-2019 в 12:11:
Цитата:
~ X ~ писал:
kRenderFxDeadPlayer и body que надо вообще уничтожать.
Я тоже склоняюсь к этому мнению, но никаких других идей касательно рисования трупов игрока у меня нет.
Отправлено Ghoul [BB] 21-03-2019 в 12:43:
Надо отметить, что твоя проблема уже давно решена в XDM
Добавлено 21-03-2019 в 15:43:
А если по сабжу, то обрати внимание на то, что некоторыех режимов rendermode на клиенте попросту нет.
kRenderTransTexture или kRenderTransColor,
Столкнулся, когда делал невидимость. Так вот , в DMC специально хак для этого нагородили...
__________________
Ты топчешь мир своими ботинками,
Не замечая куда наступаешь,
А время от тебя уходит цветными картинками,
Но ты даже этого не понимаешь.
Компрометирую данные своей учётной записи.
ЛОГИН: Ghoul [BB]
ПАРОЛЬ: paladin_solo
Отправлено SNMetamorph 21-03-2019 в 13:37:
Цитата:
Ghoul [BB] писал:
А если по сабжу, то обрати внимание на то, что некоторыех режимов rendermode на клиенте попросту нет.
kRenderTransTexture или kRenderTransColor
Странно, но несмотря на это, у меня прозрачность работает.
Отправлено XaeroX 21-03-2019 в 13:43:
Цитата:
~ X ~ писал:
kRenderFxDeadPlayer и body que надо вообще уничтожать.
Как ты будешь отображать трупы на карте в мультиплеере без bodyque?__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!
Отправлено Дядя Миша 21-03-2019 в 17:14:
Вместо renderamt заюзать например iuser1.
Добавлено 21-03-2019 в 20:13:
Цитата:
Ghoul [BB] писал:
Надо отметить, что твоя проблема уже давно решена в XDM
Там вообще нету трупов?
Добавлено 21-03-2019 в 20:14:
Цитата:
Ghoul [BB] писал:
А если по сабжу, то обрати внимание на то, что некоторыех режимов rendermode на клиенте попросту нет.
Чего-чего __________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Ghoul [BB] 21-03-2019 в 17:35:
Цитата:
Дядя Миша писал:
Чего-чего
Ну вот так вот:
Добавлено 21-03-2019 в 20:35:
На модель в руках не действует режим отрисовки
- kRenderTransColor
- kRenderTransTexture
режим же
- kRenderTransAdd работает, но не до конца (т.е. модель игрока почти не видна, а оружие - еле прозрачно)
Вот я и говорю, что это какие-то проблемы с отрисовкой режимов и настроек прозрачности.
В DeathMatchClassic сделали хак для именно этого случая (когда подбираешь невидимость)
C++ Source Code:
1 | CStudioModelRenderer::StudioRenderModel |
4 | if ( strstr ( m_pCurrentEntity->model->name, "v_" ) ) |
6 | if ( m_pCurrentEntity->curstate.renderamt != INVISIBILITY_RENDERAMT) |
8 | m_pCurrentEntity->curstate.renderfx = kRenderFxNone; |
14 | if ( m_pCurrentEntity->curstate.renderamt != INVISIBILITY_RENDERAMT && m_pCurrentEntity->curstate.rendermode != kRenderTransColor ) |
16 | m_pCurrentEntity->curstate.renderfx = kRenderFxNone; |
__________________
Ты топчешь мир своими ботинками,
Не замечая куда наступаешь,
А время от тебя уходит цветными картинками,
Но ты даже этого не понимаешь.
Компрометирую данные своей учётной записи.
ЛОГИН: Ghoul [BB]
ПАРОЛЬ: paladin_solo
Отправлено Ghoul [BB] 21-03-2019 в 17:38:
Ну то есть они тупо не рисуют эту модель в руках, чтобы скрыть вышеприведенные уродства...
__________________
Ты топчешь мир своими ботинками,
Не замечая куда наступаешь,
А время от тебя уходит цветными картинками,
Но ты даже этого не понимаешь.
Компрометирую данные своей учётной записи.
ЛОГИН: Ghoul [BB]
ПАРОЛЬ: paladin_solo
Отправлено Дядя Миша 21-03-2019 в 18:38:
Цитата:
Ghoul [BB] писал:
На модель в руках не действует режим отрисовки
- kRenderTransColor
- kRenderTransTexture
TransColor вообще на студиомодели не действует, это я в ксаше специально заморачивался, чёб работало. А TransTexture должен работать, но там есть одна хитрость. Там надо задавать прозрачность через IEngineStudio.SetRenderamt__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено SNMetamorph 22-03-2019 в 08:14:
Цитата:
Ghoul [BB] писал:
Надо отметить, что твоя проблема уже давно решена в XDM
Не-не, так просто - не прокатит. Без трупов не обойтись.
Добавлено 22-03-2019 в 16:52:
Цитата:
Дядя Миша писал:
Вместо renderamt заюзать например iuser1.
Так ведь я уже вместо renderamt заюзал поле owner. Или оно для этих целей не подходит?
Добавлено 22-03-2019 в 17:14:
Еще, значит, зашел сегодня в XDM чтобы посмотреть, как там обстоят дела с трупами, и увидел в настройках нечто:
ЧТО ЭТО? 0_0
Отправлено Дядя Миша 22-03-2019 в 16:48:
Цитата:
SNMetamorph писал:
Так ведь я уже вместо renderamt заюзал поле owner. Или оно для этих целей не подходит?
Ну его движковый пмув использует для фильтрации. Я бы не советовал.
Цитата:
SNMetamorph писал:
ЧТО ЭТО? 0_0
Влажные фантазии__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено XaeroX 22-03-2019 в 16:52:
С каких это пор в халфе - TCP? Там всю жизнь был UDP, а reliable реализуется на уровне кода.
Добавлено 22-03-2019 в 23:52:
А even more reliable это что? Прямой вызов функций client.dll из hl.dll?
__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!
Отправлено SNMetamorph 23-03-2019 в 02:20:
Цитата:
XaeroX писал:
С каких это пор в халфе - TCP?
Видимо, разраб XDM что-то в клиентской DLL намутил с сокетами.
Отправлено ~ X ~ 23-03-2019 в 08:47:
SNMetamorph я не понял, что тебя так напугало. В твоей стране за эти слова расстреливают?
Это старый тестовый флаг, когда-то я хотел пустить отдельный поток мессаг, да. Но быстро отказался от идеи, ибо нарушает ярусность, как вы догадались. Сейчас он регулирует только соотношение MSG_RELIABLE/UNRELIABLE. В общем, остатки экспериментов.
Трупов игроков в XDM сейчас реально нет. Но можно, например, respawntime увеличить и полюбоваться, если надо.
__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]