HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Нубские вопросы от <censored> и других нубов
Чтобы не создавать сто тем
3 голосов
Страницы (132): « Первая ... « 128 129 130 131 [132]   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
 Дядя Миша
who said meow?

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 23982
Нанёс повреждений: 374 ед.

Рейтинг



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

__________________
My Projects: download page

В действительности всё может оказаться иначе чем на самом деле.

Сообщить модератору | | IP: Записан
Сообщение: 184334

Старое сообщение 06-10-2019 06:31
-
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 818

Рейтинг



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

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

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

Сообщить модератору | | IP: Записан
Сообщение: 184344

Старое сообщение 06-10-2019 14:20
- За что?
 Дядя Миша
who said meow?

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 23982
Нанёс повреждений: 374 ед.

Рейтинг



Цитата:
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

В действительности всё может оказаться иначе чем на самом деле.

Сообщить модератору | | IP: Записан
Сообщение: 184348

Старое сообщение 06-10-2019 15:38
-
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 818

Рейтинг



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

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

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 bitbucket
I'm on launchpad
I'm on opendesktop.org

Сообщить модератору | | IP: Записан
Сообщение: 184356

Старое сообщение 07-10-2019 03:44
- За что?
 Дядя Миша
who said meow?

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 23982
Нанёс повреждений: 374 ед.

Рейтинг



Цитата:
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

В действительности всё может оказаться иначе чем на самом деле.

Сообщить модератору | | IP: Записан
Сообщение: 184359

Старое сообщение 07-10-2019 06:28
-
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 818

Рейтинг



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

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

Сообщить модератору | | IP: Записан
Сообщение: 184361

Старое сообщение 07-10-2019 07:01
- За что?
 Дядя Миша
who said meow?

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 23982
Нанёс повреждений: 374 ед.

Рейтинг



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

__________________
My Projects: download page

В действительности всё может оказаться иначе чем на самом деле.

Сообщить модератору | | IP: Записан
Сообщение: 184373

Старое сообщение 07-10-2019 09:12
-
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 818

Рейтинг



Обновил. Добавил 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 bitbucket
I'm on launchpad
I'm on opendesktop.org

Сообщить модератору | | IP: Записан
Сообщение: 184405

Старое сообщение 07-10-2019 15:54
- За что?
 Дядя Миша
who said meow?

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 23982
Нанёс повреждений: 374 ед.

Рейтинг



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

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

__________________
My Projects: download page

В действительности всё может оказаться иначе чем на самом деле.

Сообщить модератору | | IP: Записан
Сообщение: 184406

Старое сообщение 07-10-2019 16:24
-
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Пользователи, просматривающие тему: Crystallize
Временная зона GMT. Текущее время 01:31. Новая тема    Ответить
Страницы (132): « Первая ... « 128 129 130 131 [132]   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Нубские вопросы от <censored> и других нубов
Чтобы не создавать сто тем
3 голосов
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

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