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'