HLFX.Ru Forum Страницы (3): [1] 2 3 »
Показать все 37 сообщений этой темы на одной странице

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:

Question Проблема с зависанием анимации у модели локального игрока

Сидел, значит, спокойно работал над модом, и заметил при игре от 3-го лица, что после смерти игрока, у него при хождении полностью зависает анимация: как ног, так и остального тела. Решил разобраться, в чём же все-таки дело. Оказалось, что когда я реализовывал изменение прозрачности модели игрока при приближении камеры к стене, я записывал значение в curstate->renderamt внутри функции V_CalcRefdef().
При этом в рендере студиомоделей содержался подобного рода код:

C++ Source Code:
1
int CStudioModelRenderer::StudioDrawModel( int flags )
2
{
3
  alight_t lighting;
4
  vec3_t dir;
5
 
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 );
10
 
11
  if (m_pCurrentEntity->curstate.renderfx == kRenderFxDeadPlayer)
12
  {
13
    entity_state_t deadplayer;
14
 
15
    int result;
16
    int save_interp;
17
 
18
    if (m_pCurrentEntity->curstate.renderamt <= 0 || m_pCurrentEntity->curstate.renderamt > gEngfuncs.GetMaxClients() )
19
      return 0;
20
 
21
    // get copy of player
22
    deadplayer = *(IEngineStudio.GetPlayerState( m_pCurrentEntity->curstate.renderamt - 1 )); //cl.frames[cl.parsecount & CL_UPDATE_MASK].playerstate[m_pCurrentEntity->curstate.renderamt-1];
23
 
24
    // clear weapon, movement state
25
    deadplayer.number = m_pCurrentEntity->curstate.renderamt;
26
    deadplayer.weaponmodel = 0;
27
    deadplayer.gaitsequence = 0;
28
 
29
    deadplayer.movetype = MOVETYPE_NONE;
30
    VectorCopy( m_pCurrentEntity->curstate.angles, deadplayer.angles );
31
    VectorCopy( m_pCurrentEntity->curstate.origin, deadplayer.origin );
32
 
33
    save_interp = m_fDoInterp;
34
    m_fDoInterp = 0;
35
 
36
    // draw as though it were a player
37
    result = StudioDrawPlayer( flags, &deadplayer );
38
 
39
    m_fDoInterp = save_interp;
40
    return result;
41
  }

Казалось бы, очевидно, в чем тут проблема.
В общем, я переписал этот код, чтобы индекс игрока-хозяина писался в поле owner, вместо поля renderamt. Серверную часть с кодом body que соответственно тоже переписал под эту задумку.

Получилось у меня вот так:
C++ Source Code:
1
int CStudioModelRenderer::StudioDrawModel( int flags )
2
{
3
  alight_t lighting;
4
  vec3_t dir;
5
 
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 );
10
 
11
  if (m_pCurrentEntity->curstate.renderfx == kRenderFxDeadPlayer)
12
  {
13
    entity_state_t deadplayer;
14
    int owner_index = m_pCurrentEntity->curstate.owner;
15
    if (owner_index <= 0 || owner_index > gEngfuncs.GetMaxClients())
16
      return 0;
17
 
18
    deadplayer = *(IEngineStudio.GetPlayerState(owner_index));
19
 
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);
28
 
29
    int save_interp = m_fDoInterp;
30
    m_fDoInterp = 0;
31
 
32
    // draw as though it were a player
33
    int result = StudioDrawPlayer( flags, &deadplayer );
34
 
35
    m_fDoInterp = save_interp;
36
    return result;
37
  }


Проверил я этот код, вроде бы, поначалу все нормально было. Но стоило мне зайти на сервер в мультиплеере - кто-то умер, и у меня снова сглючило анимацию. Снова попытался выяснить в чем дело. Вроде бы, никаких сторонних обращений к 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
2
{
3
  ....
4
  if ( strstr ( m_pCurrentEntity->model->name, "v_" ) )
5
  {
6
    if ( m_pCurrentEntity->curstate.renderamt != INVISIBILITY_RENDERAMT)
7
    {
8
      m_pCurrentEntity->curstate.renderfx = kRenderFxNone;
9
      StudioRenderFinal( );
10
    }
11
  }
12
  else
13
  {
14
    if ( m_pCurrentEntity->curstate.renderamt != INVISIBILITY_RENDERAMT && m_pCurrentEntity->curstate.rendermode != kRenderTransColor )
15
    {
16
      m_pCurrentEntity->curstate.renderfx = kRenderFxNone;
17
      StudioRenderFinal( );
18
    }
19
  }

__________________
Ты топчешь мир своими ботинками,
Не замечая куда наступаешь,
А время от тебя уходит цветными картинками,
Но ты даже этого не понимаешь.

Компрометирую данные своей учётной записи.
ЛОГИН: 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]


Временная зона GMT. Текущее время 11:41. Страницы (3): [1] 2 3 »
Показать все 37 сообщений этой темы на одной странице

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