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

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- [Xash3D/XashXT] получение данных или как там. (https://hlfx.ru/forum/showthread.php?threadid=4374)


Отправлено ILZM 24-04-2014 в 06:47:

[Xash3D/XashXT] получение данных или как там.

Привет всем! Извините, пожалуйста, за много букв. Пытаюсь ясно объяснить вопрос .
Как я слышал, данные энтити передаются тогда, когда они поменяются, т. е. если меняется pev->friction, то тогда это значение передаётся клиенту и остальные также.

Может тута

C++ Source Code:
1
/*
2
=========================
3
HUD_ProcessPlayerState
4
 
5
We have received entity_state_t for this player over the network.  We need to copy appropriate fields to the
6
playerstate structure
7
=========================
8
*/
9
void DLLEXPORT HUD_ProcessPlayerState( struct entity_state_s *dst, const struct entity_state_s *src )
10
{
11
  // Copy in network data
12
  dst->origin	= src->origin;
13
  dst->angles	= src->angles;
14
 
15
  dst->velocity	= src->velocity;
16
  dst->basevelocity	= src->basevelocity;
17
 
18
  dst->frame	= src->frame;
19
  dst->modelindex	= src->modelindex;
20
  dst->skin		= src->skin;
21
  dst->effects	= src->effects;
22
  dst->weaponmodel	= src->weaponmodel;
23
  dst->movetype	= src->movetype;
24
  dst->sequence	= src->sequence;
25
  dst->animtime	= src->animtime;
26
 
27
  dst->solid	= src->solid;
28
 
29
  dst->rendermode	= src->rendermode;
30
  dst->renderamt	= src->renderamt;
31
  dst->rendercolor.r	= src->rendercolor.r;
32
  dst->rendercolor.g	= src->rendercolor.g;
33
  dst->rendercolor.b	= src->rendercolor.b;
34
  dst->renderfx	= src->renderfx;
35
 
36
  dst->framerate	= src->framerate;
37
  dst->body		= src->body;
38
 
39
  dst->friction	= src->friction;
40
  dst->gravity	= src->gravity;
41
  dst->gaitsequence	= src->gaitsequence; .................................................................................................................
42
  dst->usehull	= src->usehull;
43
  dst->playerclass	= src->playerclass;
44
  dst->team		= src->team;
45
  dst->colormap	= src->colormap;
46
 
47
  memcpy( &dst->controller[0], &src->controller[0], 4 * sizeof( byte ));
48
  memcpy( &dst->blending[0], &src->blending[0], 2 * sizeof( byte ));
49
 
50
  // Save off some data so other areas of the Client DLL can get to it
51
  cl_entity_t *player = GET_LOCAL_PLAYER(); // Get the local player's index
52
 
53
  if( dst->number == player->index )
54
  {
55
    // always have valid PVS message
56
    r_currentMessageNum = src->messagenum;
57
  }
58
}


Или здесь
C++ Source Code:
1
/*
2
AddToFullPack
3
 
4
Return 1 if the entity state has been filled in for the ent and the entity will be propagated to the client, 0 otherwise
5
 
6
state is the server maintained copy of the state info that is transmitted to the client
7
a MOD could alter values copied into state to send the "host" a different look for a particular entity update, etc.
8
e and ent are the entity that is being added to the update, if 1 is returned
9
host is the player's edict of the player whom we are sending the update to
10
player is 1 if the ent/e is a player and 0 otherwise
11
pSet is either the PAS or PVS that we previous set up.  We can use it to ask the engine to filter the entity against the PAS or PVS.
12
we could also use the pas/ pvs that we set in SetupVisibility, if we wanted to.  Caching the value is valid in that case, but still only for the current frame
13
*/
14
int AddToFullPack( struct entity_state_s *state, int e, edict_t *ent, edict_t *host, int hostflags, int player, unsigned char *pSet )
15
{
16
  ...
17
 
18
  state->rendermode    = ent->v.rendermode;
19
  state->renderamt     = ent->v.renderamt;
20
  state->renderfx      = ent->v.renderfx;
21
  state->rendercolor.r = ent->v.rendercolor.x;
22
  state->rendercolor.g = ent->v.rendercolor.y;
23
  state->rendercolor.b = ent->v.rendercolor.z;
24
  state->fuser2	 = ent->v.fuser2; // FOV
25
  state->iuser1	 = ent->v.iuser1; // flags
26
  state->iuser2	 = ent->v.iuser2; // flags
27
  state->vuser2	 = ent->v.vuser2;
28
 
29
  state->aiment = 0;
30
  if ( ent->v.aiment )
31
  {
32
    state->aiment = ENTINDEX( ent->v.aiment );
33
  }
34
 
35
  state->owner = 0;
36
  if ( ent->v.owner )
37
  {
38
    int owner = ENTINDEX( ent->v.owner );
39
 
40
    // Only care if owned by a player
41
    if ( owner >= 1 && owner <= gpGlobals->maxClients )
42
    {
43
      state->owner = owner;
44
    }
45
  }
46
 
47
  // HACK:  Somewhat...
48
  // Class is overridden for non-players to signify a breakable glass object ( sort of a class? )
49
  if ( !player )
50
  {
51
    state->playerclass  = ent->v.playerclass;
52
  }
53
 
54
  // Special stuff for players only
55
  if ( player )
56
  {
57
    memcpy( state->basevelocity, ent->v.basevelocity, 3 * sizeof( float ) );
58
 
59
    state->weaponmodel  = MODEL_INDEX( STRING( ent->v.weaponmodel ) );
60
    state->gaitsequence = ent->v.gaitsequence;......................................................................................................................
61
    state->spectator = ent->v.flags & FL_SPECTATOR;
62
    state->friction     = ent->v.friction;
63
 
64
    state->gravity      = ent->v.gravity;
65
    //		state->team			= ent->v.team;
66
    //
67
    state->usehull      = ( ent->v.flags & FL_DUCKING ) ? 1 : 0;
68
    state->health		= ent->v.health;
69
  }
70
 
71
  state->weaponmodel  = MODEL_INDEX( STRING( ent->v.weaponmodel ) );
72
  state->team	= ent->v.team;
73
 
74
  return 1;
75
}


И как тогда отловить смену переменной gaitsequence и передать prevgaitsequence клиенту? Или же лучше сделать это на клиенте, а именно в void CStudioModelRenderer :: StudioSetupBones ( void )? Хотя в void CStudioModelRenderer :: StudioSetupBones ( void ) нежелательно, потому-что она и так часто вызывается, а тут ещё проверка такая
C++ Source Code:
1
if ( m_pPlayerInfo )
2
{
3
  if ( m_pPlayerInfo->iPrevGaitSeq != m_pPlayerInfo->gaitsequence )
4
  {
5
    /*if ( m_pPlayerInfo->iPrevGaitSeq < 0 || m_pPlayerInfo->iPrevGaitSeq >= m_pStudioHeader->numseq )
6
    			{
7
    				m_pPlayerInfo->iPrevGaitSeq = 0;
8
    			}*/
9
 
10
    ALERT ( at_console, "Prevoius %d %f, Current %d %f\n", m_pPlayerInfo->iPrevGaitSeq, m_pPlayerInfo->flPrevGaitFrame, m_pPlayerInfo->gaitsequence, m_pPlayerInfo->gaitframe );
11
 
12
    m_pPlayerInfo->gaitframe = 0;
13
  }
14
 
15
  m_pPlayerInfo->flPrevGaitFrame =	m_pPlayerInfo->gaitframe;
16
  m_pPlayerInfo->iPrevGaitSeq =		m_pPlayerInfo->gaitsequence;
17
}

Где находится место, которое не так часто вызывается и в которым можно сразу определить смену значения gaitsequence, можно сказать начальную функцию.

----------------------

И ищо немного не по теме вопросик:

C++ Source Code:
1
typedef struct player_info_s
2
{
3
  ....
4
 
5
  // Gait frame estimation
6
  int		gaitsequence;
7
  int		iPrevGaitSeq;
8
  float		gaitframe;
9
  float		flPrevGaitFrame;
10
  float		gaityaw;
11
  vec3_t		prevgaitorigin;
12
} player_info_t;
создаётся же для каждого игрока (За исключением местного игрока если он не от третьего лица)?


Отправлено Ku2zoff 24-04-2014 в 08:22:

ILZM ты напиши, что конкретно ты хочешь сделать, отсюда и будем плясать. Естественно, гейтсеквенции и секвенции лучше отловить в коде студиомодельрендерера, т.к. там они обновляются каждый кадр, да и вообще имеется широкий доступ к параметрам модели. А ещё там можно получить доступ к некоторым энтварсам текущей энтити, для которой рисуется модель.


Отправлено ILZM 24-04-2014 в 09:15:

Хочу переменную, которая хранит предыдущую gaitsequence, т. е. prevgaitsequence.


Отправлено Ku2zoff 24-04-2014 в 09:25:

Цитата:
ILZM писал:
prevgaitsequence

ЕМНИП, то на клиенте в студимодельрендерере её не получить. Придётся отлавливать через обновление инфы игрока. Вообще, в структуре cl_entity_t->curstate нету prevgaitsequence, да и не нужно оно на клиенте. Поэтому придётся либо мессагой, либо эвентом. Вопрос зачем оно тебе надо? Что за задача такая?


Отправлено ILZM 24-04-2014 в 11:16:

Ku2zoff, а ничего если в

C++ Source Code:
1
typedef struct player_info_s
2
{
3
  ....
4
 
5
  // Gait frame estimation
6
  int    gaitsequence;
7
  int    iPrevGaitSeq;
8
  float    gaitframe;
9
  float    flPrevGaitFrame;
10
  float    gaityaw;
11
  vec3_t    prevgaitorigin;
12
} player_info_t;
добавятся ещё несколько переменных?

Это надо всё чтобы сделать плавный переход анимаций ног у игрока, а то как отмороженный бегает.


Отправлено Дядя Миша 24-04-2014 в 11:19:

Цитата:
ILZM писал:
Может тута

Цитата:
ILZM писал:
Или здесь

Это в движке и очень глубоко. Там абстрактный уровень. ты не отловишь свои pev->friction. Но если интересно - копай ent_encode.c функцию Delta_CompareField. Все сравнения происходят там.
Цитата:
ILZM писал:
создаётся же для каждого игрока (За исключением местного игрока если он не от третьего лица)?

Местный игрок? Эй, игрок, ты с какова раёна?
Для всех игроков он создается, без исключения.
Цитата:
ILZM писал:
Хочу переменную, которая хранит предыдущую gaitsequence, т. е. prevgaitsequence.

Хым. entity->prevstate.gaitsequence. Только зачем?

Добавлено 24-04-2014 в 15:19:

Цитата:
ILZM писал:
Это надо всё чтобы сделать плавный переход анимаций ног у игрока, а то как отмороженный бегает.

Бгг. Не сделаешь. Я уже делал, такая фигня получилась. И аналогично - блендинг между секвенциями вьюмодели.

__________________
My Projects: download page

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

Цитата:

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


Отправлено ILZM 24-04-2014 в 12:15:

Дядя Миша, лол. Какая уж инверсная кинематика тогда?..


Отправлено Дядя Миша 24-04-2014 в 13:36:

Ну на стандартных моделях с гейтом - полная фигня. А для 9-way blending очень даже неплохо.

__________________
My Projects: download page

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

Цитата:

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


Отправлено Ku2zoff 24-04-2014 в 15:22:

Цитата:
Дядя Миша писал:
entity->prevstate.gaitsequence

О, я ж забыл про prevstate, точно, так можно отловить.

Добавлено 24-04-2014 в 22:22:

Цитата:
ILZM писал:
плавный переход анимаций ног у игрока

Пятнадцать лет всех устраивает резкий переход, и никто не жалуется. Да вообще, кто это заметит в мультиплеере, сам подумай.


Отправлено ILZM 24-04-2014 в 17:21:

Ku2zoff, и ещё 15 лет иметь деревянные анимации ног, которые делают из игрока хрен пойми что?)


Отправлено XaeroX 24-04-2014 в 18:40:

Цитата:
ILZM писал:
и ещё 15 лет иметь деревянные анимации ног, которые делают из игрока хрен пойми что

А ты зачем игрокам ниже пояса смотришь, озорник?

__________________

xaerox on Vivino


Отправлено ILZM 24-04-2014 в 19:03:

XaeroX, а чо. Я на свои смотрю, а их нет!!


Отправлено ~ X ~ 26-04-2014 в 08:22:

БЕЗНОГNМ!
Кто посмотрит эти модели будет странный вещи.

ЗЫ: я перед релизом как раз много времени убил на гайты, вся эта системы вызывает у меня дикую ненависть... Но кое-что удалось пофиксить

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

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]


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

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