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 ) |
3 | if (ent->entity.curstate.iuser1 > 0 && ent->entity.curstate.iuser2 > 0) |
5 | static const char* redBloodDecals[] = {"{blood1", "{blood2", "{blood3", "{blood4", "{blood5", "{blood6"}; |
6 | static const char* yellowBloodDecals[] = {"{yblood1", "{yblood2", "{yblood3", "{yblood4", "{yblood5", "{yblood6"}; |
8 | const char* decalName = NULL; |
9 | if (ent->entity.curstate.iuser1 == 1) |
11 | decalName = redBloodDecals[gEngfuncs.pfnRandomLong(0,5)]; |
15 | decalName = yellowBloodDecals[gEngfuncs.pfnRandomLong(0,5)]; |
18 | ent->entity.curstate.iuser2--; |
19 | ent->entity.curstate.origin = ent->entity.curstate.origin + Vector(0,0,8); |
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 ); |
28 | int __MsgFunc_RandomGibs( const char *pszName, int iSize, void *pbuf ) |
30 | BEGIN_READ( pbuf, iSize ); |
41 | absmin[0] = READ_COORD(); |
42 | absmin[1] = READ_COORD(); |
43 | absmin[2] = READ_COORD(); |
45 | size[0] = READ_COORD(); |
46 | size[1] = READ_COORD(); |
47 | size[2] = READ_COORD(); |
49 | direction[0] = READ_COORD(); |
50 | direction[1] = READ_COORD(); |
51 | direction[2] = READ_COORD(); |
53 | randomization = READ_BYTE() / 100.0; |
54 | modelIndex = READ_SHORT(); |
55 | gibCount = READ_BYTE(); |
56 | lifeTime = READ_BYTE(); |
57 | bloodType = READ_BYTE(); |
59 | int gibBodiesNum = READ_BYTE(); |
60 | int startGibIndex = READ_BYTE(); |
62 | struct model_s* model = IEngineStudio.GetModelByIndex(modelIndex); |
64 | if (gibBodiesNum <= 0) |
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) |
73 | for (int i=0; i<gibCount; ++i) |
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; |
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); |
85 | gibVelocity = gibVelocity * gEngfuncs.pfnRandomFloat( 300, 400 ); |
87 | TEMPENTITY* pTemp = gEngfuncs.pEfxAPI->CL_TempEntAlloc(gibPos, model); |
91 | pTemp->entity.curstate.body = gEngfuncs.pfnRandomLong(startGibIndex, gibBodiesNum - 1); |
92 | pTemp->flags |= FTENT_COLLIDEWORLD | FTENT_FADEOUT | FTENT_GRAVITY; |
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; |
102 | pTemp->entity.baseline.origin = gibVelocity; |
103 | pTemp->die = gHUD.m_flTime + lifeTime; |
Добавлено 07-10-2019 в 06:37:
Пока только не знаю, как выставить угловую скорость. И при разбиении трупов гибсы разлетаются хуже, чем в серверной реализации.
Добавлено 07-10-2019 в 06:44:
Ага, насчет поворотов - решается через .__________________
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); |
5 | studiohdr_t* pstudiohdr = (studiohdr_t *)IEngineStudio.Mod_Extradata(model); |
6 | mstudiobodyparts_t *pbodypart = (mstudiobodyparts_t *)( (byte *)pstudiohdr + pstudiohdr->bodypartindex ); |
7 | gibBodiesNum = pbodypart->nummodels; |
Вот это говно выкинь. Движок сохраняет бодикаунт в 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 ) |
3 | static const char* redBloodDecals[] = {"{blood1", "{blood2", "{blood3", "{blood4", "{blood5", "{blood6"}; |
4 | static const char* yellowBloodDecals[] = {"{yblood1", "{yblood2", "{yblood3", "{yblood4", "{yblood5", "{yblood6"}; |
6 | const char* decalName = NULL; |
7 | if (ent->entity.curstate.iuser1 == 1) |
9 | decalName = redBloodDecals[gEngfuncs.pfnRandomLong(0, 5)]; |
13 | decalName = yellowBloodDecals[gEngfuncs.pfnRandomLong(0, 5)]; |
16 | if (ent->entity.curstate.onground) |
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; |
26 | ent->entity.curstate.origin = ent->entity.curstate.origin + Vector(0, 0, 8); |
28 | if (ent->entity.curstate.iuser1 > 0 && ent->entity.curstate.iuser2 > 0) |
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--; |
39 | int __MsgFunc_RandomGibs( const char *pszName, int iSize, void *pbuf ) |
41 | BEGIN_READ( pbuf, iSize ); |
47 | absmin[0] = READ_COORD(); |
48 | absmin[1] = READ_COORD(); |
49 | absmin[2] = READ_COORD(); |
51 | size[0] = READ_COORD(); |
52 | size[1] = READ_COORD(); |
53 | size[2] = READ_COORD(); |
55 | direction[0] = READ_COORD(); |
56 | direction[1] = READ_COORD(); |
57 | direction[2] = READ_COORD(); |
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(); |
67 | float velocityMultiplier = READ_COORD(); |
69 | struct model_s* model = IEngineStudio.GetModelByIndex(modelIndex); |
71 | if (gibBodiesNum == 0) |
73 | studiohdr_t* pstudiohdr = (studiohdr_t *)IEngineStudio.Mod_Extradata(model); |
76 | mstudiobodyparts_t *pbodypart = (mstudiobodyparts_t *)( (byte *)pstudiohdr + pstudiohdr->bodypartindex ); |
79 | for (int j=0; j<pstudiohdr->numbodyparts; ++j) |
81 | gibBodiesNum = gibBodiesNum * pbodypart[j].nummodels; |
86 | if (gibBodiesNum == 0) |
87 | gibBodiesNum = startGibIndex + 1; |
88 | startGibIndex = startGibIndex > gibBodiesNum - 1 ? gibBodiesNum - 1 : startGibIndex; |
90 | for (int i=0; i<gibCount; ++i) |
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; |
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); |
102 | gibVelocity = gibVelocity * gEngfuncs.pfnRandomFloat( 300, 400 ) * velocityMultiplier; |
104 | if (gibVelocity.Length() > 1500) |
106 | gibVelocity = gibVelocity.Normalize() * 1500; |
109 | TEMPENTITY* pTemp = gEngfuncs.pEfxAPI->CL_TempEntAlloc(gibPos, model); |
113 | pTemp->entity.curstate.body = gEngfuncs.pfnRandomLong(startGibIndex, gibBodiesNum - 1); |
114 | pTemp->flags |= FTENT_COLLIDEWORLD | FTENT_FADEOUT | FTENT_GRAVITY | FTENT_ROTATE | FTENT_PERSIST; |
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; |
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; |
__________________
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 ) |
4 | pglBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); |
5 | pglPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); |
7 | pglDisable( GL_TEXTURE_2D ); |
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 ); |
19 | step.x = (start.x-end.x) / grad; |
20 | step.y = (start.y-end.y) / grad; |
21 | step.z = (start.z-end.z) / grad; |
23 | step = -step;//bug switch! |
25 | pglBegin( GL_POINTS ); |
27 | for(int i=0;i<grad;i++) |
34 | ALERT(at_console, "start %f %f %f\n", start.x, start.y, start.z ); |
36 | pglColor4f( 0.5f/grad*i, 1.0f/grad*i, 0.36f/grad*i, 0.99f/grad*i ); |
37 | pglVertex3fv( start ); |
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 ); |
С багом:
Отправлено Дядя Миша 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'