HLFX.Ru Forum Страницы (264): « Первая ... « 128 129 130 131 [132] 133 134 135 136 » ... Последняя »
Показать все 3960 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Нубские вопросы от <censored> и других нубов (https://hlfx.ru/forum/showthread.php?threadid=4535)


Отправлено Дядя Миша 06-10-2019 в 06:31:

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

__________________
My Projects: download page

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

Цитата:

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


Отправлено FreeSlave 06-10-2019 в 14:20:

Дядя Миша, я понимаю, что клиентские гибсы движутся иначе, но в моем случае появление кровавых следов в местах соприкосновения гибсов с миром непринципиально.

Решение, о котором ты говоришь, конечно лучший вариант (более того, его можно применить универсально для всех монстров), но я, кажется, ни разу не создавал новый вид темп-энтить. Если есть пример/туториал, буду признателен

__________________
I'm on github
I'm on opendesktop.org


Отправлено Дядя Миша 06-10-2019 в 15:38:

Цитата:
FreeSlave писал:
но я, кажется, ни разу не создавал новый вид темп-энтить

Там даже не новый вид темп-энтить, а просто флажок замутить. Ну что-то типа FTENT_BLOODDECALS. И в HUD_TempEntUpdate делать проверку на него и спавнить декали там. Где-то в раёне вызова pTemp->hitcallback. Делаем проверку на наш флаг и соответственно вызываем вот эту шнягу
C++ Source Code:
gEngfuncs.pEfxAPI->R_DecalShoot(
gEngfuncs.pEfxAPI->Draw_DecalIndex( gEngfuncs.pEfxAPI->Draw_DecalIndexFromName( decalName ) ),
gEngfuncs.pEventAPI->EV_IndexFromTrace( &pmtrace ), 0, pmtrace.endpos, 0 );

вместо decalName имя декали.

Добавлено 06-10-2019 в 18:38:

А, ну и потом этот флажок своим гибсам присвой когда аллокаешь темп-энтити.

__________________
My Projects: download page

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

Цитата:

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


Отправлено FreeSlave 07-10-2019 в 03:44:

Дядя Миша, спасибо, вроде разобрался.

Вот такой получился код. Заюзал коллбэк вместо ввода нового флага. Попытался скопировать поведение серверных гибсов.

C++ Source Code:
1
void GibHitCallback( TEMPENTITY* ent, pmtrace_t* pmtrace )
2
{
3
  if (ent->entity.curstate.iuser1 > 0 && ent->entity.curstate.iuser2 > 0)
4
  {
5
    static const char* redBloodDecals[] = {"{blood1", "{blood2", "{blood3", "{blood4", "{blood5", "{blood6"};
6
    static const char* yellowBloodDecals[] = {"{yblood1", "{yblood2", "{yblood3", "{yblood4", "{yblood5", "{yblood6"};
7
 
8
    const char* decalName = NULL;
9
    if (ent->entity.curstate.iuser1 == 1)
10
    {
11
      decalName = redBloodDecals[gEngfuncs.pfnRandomLong(0,5)];
12
    }
13
    else
14
    {
15
      decalName = yellowBloodDecals[gEngfuncs.pfnRandomLong(0,5)];
16
    }
17
 
18
    ent->entity.curstate.iuser2--;
19
    ent->entity.curstate.origin = ent->entity.curstate.origin + Vector(0,0,8);
20
 
21
    int decalIndex = gEngfuncs.pEfxAPI->Draw_DecalIndexFromName( (char*)decalName );
22
    int textureIndex = gEngfuncs.pEfxAPI->Draw_DecalIndex( decalIndex );
23
    int traceEntIndex = gEngfuncs.pEventAPI->EV_IndexFromTrace( pmtrace );
24
    gEngfuncs.pEfxAPI->R_DecalShoot(textureIndex, traceEntIndex, 0, pmtrace->endpos, 0 );
25
  }
26
}
27
 
28
int __MsgFunc_RandomGibs( const char *pszName, int iSize, void *pbuf )
29
{
30
  BEGIN_READ( pbuf, iSize );
31
 
32
  Vector absmin;
33
  Vector size;
34
  Vector direction;
35
  float randomization;
36
  int modelIndex;
37
  int gibCount;
38
  int lifeTime;
39
  byte bloodType;
40
 
41
  absmin[0] = READ_COORD();
42
  absmin[1] = READ_COORD();
43
  absmin[2] = READ_COORD();
44
 
45
  size[0] = READ_COORD();
46
  size[1] = READ_COORD();
47
  size[2] = READ_COORD();
48
 
49
  direction[0] = READ_COORD();
50
  direction[1] = READ_COORD();
51
  direction[2] = READ_COORD();
52
 
53
  randomization = READ_BYTE() / 100.0;
54
  modelIndex = READ_SHORT();
55
  gibCount = READ_BYTE();
56
  lifeTime = READ_BYTE();
57
  bloodType = READ_BYTE();
58
 
59
  int gibBodiesNum = READ_BYTE();
60
  int startGibIndex = READ_BYTE();
61
 
62
  struct model_s* model = IEngineStudio.GetModelByIndex(modelIndex);
63
 
64
  if (gibBodiesNum <= 0)
65
  {
66
    studiohdr_t* pstudiohdr = (studiohdr_t *)IEngineStudio.Mod_Extradata(model);
67
    mstudiobodyparts_t *pbodypart = (mstudiobodyparts_t *)( (byte *)pstudiohdr + pstudiohdr->bodypartindex );
68
    gibBodiesNum = pbodypart->nummodels;
69
    if (gibBodiesNum == 0)
70
      gibBodiesNum = 1;
71
  }
72
 
73
  for (int i=0; i<gibCount; ++i)
74
  {
75
    Vector gibPos;
76
    gibPos.x = absmin.x + size.x * gEngfuncs.pfnRandomFloat(0,1);
77
    gibPos.y = absmin.y + size.y * gEngfuncs.pfnRandomFloat(0,1);
78
    gibPos.z = absmin.z + size.z * gEngfuncs.pfnRandomFloat(0,1) + 1;
79
 
80
    Vector gibVelocity = direction;
81
    gibVelocity.x += gEngfuncs.pfnRandomFloat(-randomization, randomization);
82
    gibVelocity.y += gEngfuncs.pfnRandomFloat(-randomization, randomization);
83
    gibVelocity.z += gEngfuncs.pfnRandomFloat(-randomization, randomization);
84
 
85
    gibVelocity = gibVelocity * gEngfuncs.pfnRandomFloat( 300, 400 );
86
 
87
    TEMPENTITY* pTemp = gEngfuncs.pEfxAPI->CL_TempEntAlloc(gibPos, model);
88
    if (!pTemp)
89
      break;
90
 
91
    pTemp->entity.curstate.body = gEngfuncs.pfnRandomLong(startGibIndex, gibBodiesNum - 1);
92
    pTemp->flags |= FTENT_COLLIDEWORLD | FTENT_FADEOUT | FTENT_GRAVITY;
93
 
94
 
95
    pTemp->entity.curstate.iuser1 = bloodType;
96
    pTemp->entity.curstate.iuser2 = 5;
97
    pTemp->entity.curstate.solid = SOLID_SLIDEBOX;
98
    pTemp->entity.curstate.rendermode = kRenderNormal;
99
    pTemp->entity.curstate.renderamt = pTemp->entity.baseline.renderamt = 255;
100
    pTemp->hitcallback = &GibHitCallback;
101
 
102
    pTemp->entity.baseline.origin = gibVelocity;
103
    pTemp->die = gHUD.m_flTime + lifeTime;
104
  }
105
 
106
  return 1;
107
}


Добавлено 07-10-2019 в 06:37:

Пока только не знаю, как выставить угловую скорость. И при разбиении трупов гибсы разлетаются хуже, чем в серверной реализации.

Добавлено 07-10-2019 в 06:44:

Ага, насчет поворотов - решается через
code:
baseline.angles
и
code:
FTENT_ROTATE
.

__________________
I'm on github
I'm on opendesktop.org


Отправлено Дядя Миша 07-10-2019 в 06:28:

Цитата:
FreeSlave писал:
Заюзал коллбэк вместо ввода нового флага

Во, ну или так, да.

C++ Source Code:
1
struct model_s* model = IEngineStudio.GetModelByIndex(modelIndex);
2
 
3
if (gibBodiesNum <= 0)
4
{
5
  studiohdr_t* pstudiohdr = (studiohdr_t *)IEngineStudio.Mod_Extradata(model);
6
  mstudiobodyparts_t *pbodypart = (mstudiobodyparts_t *)( (byte *)pstudiohdr + pstudiohdr->bodypartindex );
7
  gibBodiesNum = pbodypart->nummodels;
8
  if (gibBodiesNum == 0)
9
    gibBodiesNum = 1;
10
}

Вот это говно выкинь. Движок сохраняет бодикаунт в model_t->numframes, к тому же ты всё равно их считаешь неправильно.

Добавлено 07-10-2019 в 09:28:

Если хочется самому посчитать, погугли в ксаше Mod_StudioBodyVariations.

__________________
My Projects: download page

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

Цитата:

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


Отправлено FreeSlave 07-10-2019 в 07:01:

Дядя Миша, неправильно если бодигрупп несколько, это понятно. Я не припомню моделей гибсов с несколькими бодигруппами, а если уж затачивать на универсальность, то вовсе не факт, что маппер захочет, чтоб юзались все сочетания бодипартов из всех бодигрупп.
Насчёт бодикаунта в numframes - ксаш сохраняет, а голдсорс нет.

__________________
I'm on github
I'm on opendesktop.org


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

Ну вообщем справился, молодец

__________________
My Projects: download page

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

Цитата:

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


Отправлено FreeSlave 07-10-2019 в 15:54:

Обновил. Добавил FTENT_PERSIST чтоб гибсы не исчезали как только игрок заходит за стену. Рандом всё-таки сделал по полному бодикаунту, как предложил Дядя Миша. Добавил уменьшение скорости при касании земли (правильно это так делать через baseline?)

C++ Source Code:
1
void GibHitCallback( TEMPENTITY* ent, pmtrace_t* pmtrace )
2
{
3
  static const char* redBloodDecals[] = {"{blood1", "{blood2", "{blood3", "{blood4", "{blood5", "{blood6"};
4
  static const char* yellowBloodDecals[] = {"{yblood1", "{yblood2", "{yblood3", "{yblood4", "{yblood5", "{yblood6"};
5
 
6
  const char* decalName = NULL;
7
  if (ent->entity.curstate.iuser1 == 1)
8
  {
9
    decalName = redBloodDecals[gEngfuncs.pfnRandomLong(0, 5)];
10
  }
11
  else
12
  {
13
    decalName = yellowBloodDecals[gEngfuncs.pfnRandomLong(0, 5)];
14
  }
15
 
16
  if (ent->entity.curstate.onground)
17
  {
18
    ent->entity.baseline.origin = ent->entity.baseline.origin * 0.9;
19
    ent->entity.curstate.angles.x = 0;
20
    ent->entity.curstate.angles.z = 0;
21
    ent->entity.baseline.angles.x = 0;
22
    ent->entity.baseline.angles.z = 0;
23
  }
24
  else
25
  {
26
    ent->entity.curstate.origin = ent->entity.curstate.origin + Vector(0, 0, 8);
27
 
28
    if (ent->entity.curstate.iuser1 > 0 && ent->entity.curstate.iuser2 > 0)
29
    {
30
      int decalIndex = gEngfuncs.pEfxAPI->Draw_DecalIndexFromName( (char*)decalName );
31
      int textureIndex = gEngfuncs.pEfxAPI->Draw_DecalIndex( decalIndex );
32
      int traceEntIndex = gEngfuncs.pEventAPI->EV_IndexFromTrace( pmtrace );
33
      gEngfuncs.pEfxAPI->R_DecalShoot(textureIndex, traceEntIndex, 0, pmtrace->endpos, 0 );
34
      ent->entity.curstate.iuser2--;
35
    }
36
  }
37
}
38
 
39
int __MsgFunc_RandomGibs( const char *pszName, int iSize, void *pbuf )
40
{
41
  BEGIN_READ( pbuf, iSize );
42
 
43
  Vector absmin;
44
  Vector size;
45
  Vector direction;
46
 
47
  absmin[0] = READ_COORD();
48
  absmin[1] = READ_COORD();
49
  absmin[2] = READ_COORD();
50
 
51
  size[0] = READ_COORD();
52
  size[1] = READ_COORD();
53
  size[2] = READ_COORD();
54
 
55
  direction[0] = READ_COORD();
56
  direction[1] = READ_COORD();
57
  direction[2] = READ_COORD();
58
 
59
  float randomization = READ_BYTE() / 100.0;
60
  int modelIndex = READ_SHORT();
61
  int gibCount = READ_BYTE();
62
  int lifeTime = READ_BYTE();
63
  int bloodType = READ_BYTE();
64
  int gibBodiesNum = READ_BYTE();
65
  int startGibIndex = READ_BYTE();
66
 
67
  float velocityMultiplier = READ_COORD();
68
 
69
  struct model_s* model = IEngineStudio.GetModelByIndex(modelIndex);
70
 
71
  if (gibBodiesNum == 0)
72
  {
73
    studiohdr_t* pstudiohdr = (studiohdr_t *)IEngineStudio.Mod_Extradata(model);
74
    if (pstudiohdr)
75
    {
76
      mstudiobodyparts_t *pbodypart = (mstudiobodyparts_t *)( (byte *)pstudiohdr + pstudiohdr->bodypartindex );
77
 
78
      gibBodiesNum = 1;
79
      for (int j=0; j<pstudiohdr->numbodyparts; ++j)
80
      {
81
        gibBodiesNum = gibBodiesNum * pbodypart[j].nummodels;
82
      }
83
    }
84
  }
85
 
86
  if (gibBodiesNum == 0)
87
    gibBodiesNum = startGibIndex + 1;
88
  startGibIndex = startGibIndex > gibBodiesNum - 1 ? gibBodiesNum - 1 : startGibIndex;
89
 
90
  for (int i=0; i<gibCount; ++i)
91
  {
92
    Vector gibPos;
93
    gibPos.x = absmin.x + size.x * gEngfuncs.pfnRandomFloat(0, 1);
94
    gibPos.y = absmin.y + size.y * gEngfuncs.pfnRandomFloat(0, 1);
95
    gibPos.z = absmin.z + size.z * gEngfuncs.pfnRandomFloat(0, 1) + 1;
96
 
97
    Vector gibVelocity = direction;
98
    gibVelocity.x += gEngfuncs.pfnRandomFloat(-randomization, randomization);
99
    gibVelocity.y += gEngfuncs.pfnRandomFloat(-randomization, randomization);
100
    gibVelocity.z += gEngfuncs.pfnRandomFloat(-randomization, randomization);
101
 
102
    gibVelocity = gibVelocity * gEngfuncs.pfnRandomFloat( 300, 400 ) * velocityMultiplier;
103
 
104
    if (gibVelocity.Length() > 1500)
105
    {
106
      gibVelocity = gibVelocity.Normalize() * 1500;
107
    }
108
 
109
    TEMPENTITY* pTemp = gEngfuncs.pEfxAPI->CL_TempEntAlloc(gibPos, model);
110
    if (!pTemp)
111
      break;
112
 
113
    pTemp->entity.curstate.body = gEngfuncs.pfnRandomLong(startGibIndex, gibBodiesNum - 1);
114
    pTemp->flags |= FTENT_COLLIDEWORLD | FTENT_FADEOUT | FTENT_GRAVITY | FTENT_ROTATE | FTENT_PERSIST;
115
 
116
    pTemp->entity.curstate.iuser1 = bloodType;
117
    pTemp->entity.curstate.iuser2 = 5;
118
    pTemp->entity.curstate.solid = SOLID_SLIDEBOX;
119
    pTemp->entity.curstate.movetype = MOVETYPE_BOUNCE;
120
    pTemp->entity.curstate.friction = 0.55;
121
    pTemp->entity.curstate.rendermode = kRenderNormal;
122
    pTemp->entity.curstate.renderamt = pTemp->entity.baseline.renderamt = 255;
123
    pTemp->hitcallback = &GibHitCallback;
124
 
125
    pTemp->entity.baseline.angles.x = gEngfuncs.pfnRandomFloat(-256, 255);
126
    pTemp->entity.baseline.angles.z = gEngfuncs.pfnRandomFloat(-256, 255);
127
    pTemp->entity.baseline.origin = gibVelocity;
128
    pTemp->die = gHUD.m_flTime + lifeTime;
129
  }
130
 
131
  return 1;
132
}

__________________
I'm on github
I'm on opendesktop.org


Отправлено Дядя Миша 07-10-2019 в 16:24:

Цитата:
FreeSlave писал:
правильно это так делать через baseline?

ну да, там велосити хранится у темпэнтить. Можышь тутор запилить

__________________
My Projects: download page

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

Цитата:

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


Отправлено Crystallize 14-10-2019 в 17:48:

Когда более-менее возишься в коде ХЛ разве не возникает желания сделать себе дебажное отображение тех же трейсов или связей между энтитями как в Джеке-Хаммере? И чтобы корректно работало с Z-буфером и не ломало остальной рендер?
Вроде очевидная идея, но я на такое пока не натыкался. Может быть в XDM есть, там всё есть.
Я вот попробовал через GLbegin и вижу что это толи нельзя запускать из произвольного места в коде(CalcThirdpersonRefdef), толи оно фундаментально невозможно.
А ещё есть этот баг который не до конца рисует группу точек если начало и конец расположены в обратном порядке.

C++ Source Code:
1
void Points( Vector start, Vector end )
2
{
3
  pglEnable( GL_BLEND );
4
  pglBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
5
  pglPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
6
 
7
  pglDisable( GL_TEXTURE_2D );
8
  pglPointSize( 5.0f );
9
 
10
  pglDisable( GL_DEPTH_TEST );
11
  pglEnable( GL_LINE_SMOOTH );
12
  pglEnable( GL_POLYGON_SMOOTH );
13
  pglHint( GL_LINE_SMOOTH_HINT, GL_NICEST );
14
  pglHint( GL_POLYGON_SMOOTH_HINT, GL_NICEST );
15
 
16
  int grad = 100;
17
  Vector step;
18
 
19
  step.x = (start.x-end.x) / grad;
20
  step.y = (start.y-end.y) / grad;
21
  step.z = (start.z-end.z) / grad;
22
 
23
  step = -step;//bug switch!
24
 
25
  pglBegin( GL_POINTS );
26
 
27
  for(int i=0;i<grad;i++)
28
  {
29
    start.x+=step.x;
30
    start.y+=step.y;
31
    start.z+=step.z;
32
    if (i==0)
33
    {
34
      ALERT(at_console, "start %f %f %f\n", start.x, start.y, start.z );
35
    }
36
    pglColor4f( 0.5f/grad*i, 1.0f/grad*i, 0.36f/grad*i, 0.99f/grad*i );
37
    pglVertex3fv( start );
38
  }
39
 
40
  pglEnd();
41
 
42
  pglEnable( GL_TEXTURE_2D );
43
  //pglPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
44
  pglDisable( GL_POLYGON_SMOOTH );
45
  pglDisable( GL_LINE_SMOOTH );
46
  pglEnable( GL_DEPTH_TEST );
47
  pglDisable( GL_BLEND );
48
  pglLineWidth( 1.0f );
49
}


С багом:


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

Цитата:
Crystallize писал:
и вижу что это толи нельзя запускать из произвольного места в коде

надо из определённых мест.
А зачем ты точки рисуешь? Линии рисуй. Со стрелочкаме!

__________________
My Projects: download page

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

Цитата:

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


Отправлено Crystallize 14-10-2019 в 19:00:

Художников тоже учат сначала позы-скелетики линиями рисовать. И там та же проблема: при проекции на плоскость информация о перспективе теряется, толи объект наклонен к тебе, толи от тебя. Градиент помогает различить концы А и Б.
На самом деле тут точки вместо линий потому что я ждал что точки отфильтруются по глубине.


Отправлено thambs 14-10-2019 в 19:03:

Цитата:
Дядя Миша писал:
Линии рисуй. Со стрелочкаме!

А для линий можно учесть инфу о z-буффере, что бы они заслоняться чем-то могли?

__________________
http://www.moddb.com/mods/monorail-quest


Отправлено nemyax 14-10-2019 в 19:32:

Конечно, чё нет-то.


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

Цитата:
Crystallize писал:
толи объект наклонен к тебе, толи от тебя. Градиент помогает различить концы А и Б.

ну во первых я и говорю - со стрелкочками рисуй. А во вторых, что тебе мешает задать началу линии один цвет, а концу - другой и получить такой же градиент?

__________________
My Projects: download page

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

Цитата:

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


Временная зона GMT. Текущее время 14:39. Страницы (264): « Первая ... « 128 129 130 131 [132] 133 134 135 136 » ... Последняя »
Показать все 3960 сообщений этой темы на одной странице

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