HLFX.Ru Forum Страницы (245): « Первая ... « 201 202 203 204 [205] 206 207 208 209 » ... Последняя »
Показать все 3663 сообщений этой темы на одной странице

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)


Отправлено FreeSlave 06-12-2021 в 18:04:

Цитата:
Дядя Миша писал:
Не помогло, потому что UTIL_TraceLine не использует флажки FL_MONSTERCLIP. Тебе нужно использовать UTIL_TraceHull для построения нодов с нулевым хуллом. Тогда сработает.

Добавлено сегодня в 09:19:

И FL_MONSTERCLIP добавлять в g_pBodyQueHead, а не в CTestHull.


Это в LinkVisibleNodes? Заменял там два UTIL_TraceLine на UTIL_TraceHull c point_hull и выставлял FL_MONSTERCLIP для g_pBodyQueueHead перед этим. По-прежнему не генерится.

Вот изменения https://github.com/FreeSlave/hlsdk-...7b9b74024066762

Карта для теста в аттаче

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


Отправлено Дядя Миша 06-12-2021 в 18:40:

Ну тады ой Но всё равно надо копать в этом направлении.

__________________
My Projects: download page

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

Цитата:

>> так а раньше почему падало ?
> Потому что говно ваш С++, вот почему


Отправлено FreeSlave 07-12-2021 в 01:21:

Копать скорее надо в направлении Walk Rejection. Я создал карту-коробку с двумя нодами. Без препятствий между ними связь есть. Если поставить func_monsterclip, то связь не рисуется.

В логе

Цитата:

Walk Rejection:
-------------------------------------------------------------------------------
Node 0:

NODE_SMALL_HULL step 112
-------------------------------------------------------------------------------
Node 1:

NODE_SMALL_HULL step 80


Т.е. это WALK_MOVE отбивает связи.

Взглянул повнимательнее на func_monsterclip. Он вызывает CFuncWall:Spawn, в котором выставляется FL_WORLDBRUSH. Если в CFuncMonsterClip::Spawn его убрать, то связь есть.
А теперь вопрос: безопасно ли убирать FL_WORLDBRUSH у func_monsterclip? Возможно разрабы и вовсе не подразумевали, что у него такой флаг должен быть, ведь выставляется он через Spawn родительского класса. Я потестил и работает оно как ожидается - монстров с Monsterclip не пропускает, а без него - пропускает.

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


Отправлено Дядя Миша 07-12-2021 в 06:47:

Цитата:
FreeSlave писал:
А теперь вопрос: безопасно ли убирать FL_WORLDBRUSH у func_monsterclip?

FL_WORLDBRUSH - это хинт-подсказка, что по такому брашу можно смело ходить, чтоб монстры не тупили. В то время как монстерклип вертикальный и по нему обычно никто не ходит. Так что да, убирай смело.

__________________
My Projects: download page

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

Цитата:

>> так а раньше почему падало ?
> Потому что говно ваш С++, вот почему


Отправлено Chyvachok 07-12-2021 в 11:42:

Такой вопрос, а что делает таких монстров как барнаклы и турели не разрываемыми на куски? У Турелей тчинк TurretDeath вместо killed используется. Барнаклов смог сделать, но опять же - их разрывает только если их взорвать сразу, уже убитого нельзя на ошметки разнести, а у турелей, попытка моя как то их сделать разбиваемыми на куски сделала их не убиваемыми.


Отправлено Ku2zoff 07-12-2021 в 12:05:

Chyvachok у барнакла своя функция Killed, из неё не вызывается GibMonster. То же самое с турелями.


Отправлено Chyvachok 07-12-2021 в 12:28:

Ku2zoff У барнакла может быть дело в этих строках в Killed?

pev->solid = SOLID_NOT;
pev->takedamage = DAMAGE_NO;

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


Отправлено Ku2zoff 07-12-2021 в 12:31:

Это влияет да. А ещё вот:

C++ Source Code:
1
if ( HasMemory( bits_MEMORY_KILLED ) )
2
{
3
  if ( ShouldGibMonster( iGib ) )
4
    CallGibMonster();
5
  return;
6
}
Надо вызывать GibMonster из Killed.


Отправлено Chyvachok 07-12-2021 в 12:37:

Насчет этих двух строк, если убрать pev->solid = SOLID_NOT; жертва остается висеть в барнакле, но его зато можно разорвать из instant hit оружия, если убрать pev->takedamage = DAMAGE_NO; но оставить pev->solid = SOLID_NOT; можно взорвать, но не разорвать instant hit оружием. И еще вот, анимация смерти заново начинает проигрыватся если барнакл опять получает урон после смерти, пока код так выглядит:

code:
void CBarnacle :: Killed( entvars_t *pevAttacker, int iGib ) { CBaseMonster *pVictim; pev->solid = SOLID_NOT; pev->takedamage = DAMAGE_NO; if ( m_hEnemy != NULL ) { pVictim = m_hEnemy->MyMonsterPointer(); if ( pVictim ) { pVictim->BarnacleVictimReleased(); } } // CGib::SpawnRandomGibs( pev, 4, 1 ); switch ( RANDOM_LONG ( 0, 1 ) ) { case 0: EMIT_SOUND( ENT(pev), CHAN_WEAPON, "barnacle/bcl_die1.wav", 1, ATTN_NORM ); break; case 1: EMIT_SOUND( ENT(pev), CHAN_WEAPON, "barnacle/bcl_die3.wav", 1, ATTN_NORM ); break; } SetActivity ( ACT_DIESIMPLE ); SetBoneController( 0, 0 ); StudioFrameAdvance( 0.1 ); if ( ShouldGibMonster( iGib ) ) { GibMonster(); return; } pev->nextthink = gpGlobals->time + 0.1; SetThink ( &CBarnacle::WaitTillDead ); }


Добавлено 07-12-2021 в 14:37:

Ku2zoff в CBaseMonster::Killed почему то аж 2 вызова ShouldGibMonster


Отправлено Ku2zoff 07-12-2021 в 12:39:

CBarnacle :: WaitTillDead тут возвращай ему солидность. Может подходящее место. А вообще, чтобы жертва не застревала, можно воспользоваться груптрейсом.


Отправлено Chyvachok 07-12-2021 в 12:50:

Ku2zoff Я не могу найти какая солидность у трупов, они получают урон из оружия, и в то же время сквозь них можно пройти.

Добавлено 07-12-2021 в 14:44:

Цитата:
Ku2zoff писал:
можно воспользоваться груптрейсом.


Вот только как им пользоваться еще.

Добавлено 07-12-2021 в 14:50:

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


Отправлено Ku2zoff 07-12-2021 в 14:38:

Цитата:
Chyvachok писал:
Вот только как им пользоваться еще.

Ты же пользовался уже: http://hlfx.ru/forum/showthread.php...9043#post169043


Отправлено Chyvachok 07-12-2021 в 15:57:

Ku2zoff Я не совсем понял как они работают то, groupinfo нужно одинаковый и барнаклу и жертве ставить? И ничего что потом у жертвы останется свой после смерти барнакла?

Вроде разобрался влепил pev->groupinfo = 1; и вроде можно как и урон Барнаклу дальше после смерти наносить, и жертва и игрок сквозь него проходят. Вот кому надо:

code:
void CBarnacle :: Killed( entvars_t *pevAttacker, int iGib ) { CBaseMonster *pVictim; //pev->solid = SOLID_NOT; //pev->takedamage = DAMAGE_NO; pev->groupinfo = 1; if ( !HasMemory( bits_MEMORY_KILLED ) ) { Remember( bits_MEMORY_KILLED ); if ( m_hEnemy != NULL ) { pVictim = m_hEnemy->MyMonsterPointer(); if ( pVictim ) { pVictim->BarnacleVictimReleased(); } } if ( ShouldGibMonster( iGib ) ) { GibMonster(); return; } switch ( RANDOM_LONG ( 0, 1 ) ) { case 0: EMIT_SOUND( ENT(pev), CHAN_WEAPON, "barnacle/bcl_die1.wav", 1, ATTN_NORM ); break; case 1: EMIT_SOUND( ENT(pev), CHAN_WEAPON, "barnacle/bcl_die3.wav", 1, ATTN_NORM ); break; } SetActivity ( ACT_DIESIMPLE ); SetBoneController( 0, 0 ); StudioFrameAdvance( 0.1 ); pev->nextthink = gpGlobals->time + 0.1; SetThink ( &CBarnacle::WaitTillDead ); } else { if ( ShouldGibMonster( iGib ) ) { GibMonster(); return; } } }


Добавлено 07-12-2021 в 17:57:

С турелями блин еще моделить надо, настенным чтобы основа после убийства оставалась на стене висеть, а напольным просто куски, а на это больше всего времени уходит (

Кстати сделал боди отстреленных конечностей для ХД вортигонта: https://files.gamebanana.com/bitpit/islave.rar


Отправлено Ku2zoff 07-12-2021 в 16:23:

Цитата:
Chyvachok писал:
//pev->solid = SOLID_NOT;
//pev->takedamage = DAMAGE_NO;
pev->groupinfo = 1;

А кто будет вызывать UTIL_SetGroupTrace и UTIL_UnsetGroupTrace?
C++ Source Code:
pev->groupinfo = 1;
pVictim->pev->groupinfo = 1;
 
UTIL_SetGroupTrace(pev->groupinfo, GROUP_OP_NAND);
UTIL_SetGroupTrace(pVictim->pev->groupinfo, GROUP_OP_NAND);

А потом, чтобы вернуть коллизию:
C++ Source Code:
UTIL_SetGroupTrace(pev->groupinfo, GROUP_OP_AND);
UTIL_SetGroupTrace(pVictim->pev->groupinfo, GROUP_OP_AND);

Как-то так. У меня таким макаром игроки переставали коллайдить с func_wall и друг с другом, когда ползают. Потом я написал код лучше. Не помню, где я вычитал, что вызывать надо именно так. Посмотри сорцы ксашдвижка, из функций должно стать ясно, что они делают.

Добавлено 07-12-2021 в 23:23:

Цитата:
Chyvachok писал:
сделал боди отстреленных конечностей для ХД вортигонта

Ух ты, весьма кстати. Я у себя заюзаю, только изменю немного. Свои гибсы для каждого монстра я делал ещё очень давно, код простой. А вот модели делать долго, хоть и не очень сложно.


Отправлено Chyvachok 07-12-2021 в 16:52:

Цитата:
Ku2zoff писал:
Ух ты, весьма кстати. Я у себя заюзаю, только изменю немного. Свои гибсы для каждого монстра я делал ещё очень давно, код простой. А вот модели делать долго, хоть и не очень сложно.


Решил поменять ЛД модели из Брутала на ХД с классическим стилем по тихоньку. Кстати не знаешь есть ли где-то модель ХД Барника но с анимациями под автомат-дробовик и с пинком? ЛД-шный скелет насколько я помню отличается, врядли анимации из БХЛ встанут.

Насчет коллизии, мне наоборот надо чтобы барнакл уже не с чем не колидил, как и трупы от монстров, я просто не знаю, а когда и как вернуть коллизию жертве, если барнакл уже может быть давно взорван на куски и удален? Я поэтому не хочу жертву то трогать, этого pev->groupinfo = 1; вроде достаточно с головой, проверил - урон по барнаклу от оружия проходит, жертва выпадает, игрок сам сквозь труп тоже проходит.

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

Добавлено 07-12-2021 в 18:52:

Цитата:
Ku2zoff писал:
Свои гибсы для каждого монстра я делал ещё очень давно, код простой.


Я вот такое наваял, не знаю насколько грамотно. Не так как в БХЛ но вроде лучше чес в Инвазионе (там нельзя больше одной конечности отстреливать, но и нельзя как в БХЛ сделать так чтобы НПС живой оставался, к примеру как зомби с отстреленной рукой, не придумал как, и чтобы оно еще нормально все работало.

code:
//Код Слейва но чисто отвечающий за отстрел конечностей. #define TORSOGIB_DAMAGE (DMG_BUCKSHOT|DMG_ENERGYBEAM|DMG_CRUSH|DMG_MORTAR|DMG_BLAST) #define HEAD_GROUP 1 #define HEAD_INTACT 0 #define HEAD_BEHEADED 1 #define LEFTARM_GROUP 2 #define RIGHTARM_GROUP 3 #define LEFTLEG_GROUP 4 #define RIGHTLEG_GROUP 5 #define MIDDLEARM_GROUP 6 #define LIMB_INTACT 0 #define LIMB_DAMAGED 1 #define NO_TORSO_LEFTLEG_GROUP 1 #define NO_TORSO_RIGHTLEG_GROUP 2 #define HBOX_CHEST 2 #define HBOX_STOMACH 3 #define HBOX_ARM_R 5 #define HBOX_ARM_L 4 #define HBOX_LEG_R 7 #define HBOX_LEG_L 6 #define HBOX_HEAD 1 #define HBOX_ARM_M 8 #define AGIBS_ISLAVE_TORSO 30 #define AGIBS_ISLAVE_PELVIS 36 #define AGIBS_ISLAVE_HEAD 29 #define AGIBS_ISLAVE_ARM_L 31 #define AGIBS_ISLAVE_ARM_R 32 #define AGIBS_ISLAVE_LEG_L 33 #define AGIBS_ISLAVE_LEG_R 34 #define AGIBS_ISLAVE_ARM_M 35 class CISlave : public CSquadMonster { int m_iNoTorso, m_iNoHead, m_iNoLeftArm, m_iNoRightArm, m_iNoMiddleArm, m_iNoLeftLeg, m_iNoRightLeg; } void CISlave::TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType) { if (bitsDamageType & DMG_SHOCK) return; CSquadMonster::TraceAttack( pevAttacker, flDamage, vecDir, ptr, bitsDamageType ); if ( gMultiDamage.pEntity != this ) return; if (pev->health - ( gMultiDamage.amount ) <= 0) { Vector new_origin = pev->origin, new_angle; if ( (ptr->iHitgroup == HBOX_CHEST/* || ptr->iHitgroup == HBOX_STOMACH*/) && m_iNoTorso == 0 && bitsDamageType & TORSOGIB_DAMAGE) { EMIT_SOUND(ENT(pev), CHAN_BODY, "common/amputation_heavy.wav", 1, ATTN_NORM); CGib::SpawnSpecificGibs( pev, 1, "models/agibs.mdl", AGIBS_ISLAVE_TORSO, 0 ); CGib::SpawnStickyGibs( pev, RANDOM_LONG(2,3), "models/stickygib.mdl", 2, 4 ); //С торсом рубим и руки если они есть if (m_iNoRightArm == 0){ GetBonePosition( LookupBone("Bip01 R UpperArm"), new_origin, new_angle ); MakeGib ( AGIBS_ISLAVE_ARM_R, pevAttacker, new_origin); } if (m_iNoLeftArm == 0){ GetBonePosition( LookupBone("Bip01 L UpperArm"), new_origin, new_angle ); MakeGib ( AGIBS_ISLAVE_ARM_L, pevAttacker, new_origin); } if (m_iNoHead == 0){ GetBonePosition( LookupBone("Bip01 Head"), new_origin, new_angle ); MakeGib ( AGIBS_ISLAVE_HEAD, pevAttacker, new_origin); } pev->body = 0; SET_MODEL(ENT(pev), "models/islave_h.mdl"); //У модели без торса другой порядок бодигруп и их кол-во поэтому и заново указываем if (m_iNoLeftLeg == 1) SetBodygroup( 1, LIMB_DAMAGED); if (m_iNoRightLeg == 1) SetBodygroup( 2, LIMB_DAMAGED); m_iNoTorso = 1; m_iNoRightArm = 1; m_iNoLeftArm = 1; m_iNoHead = 1; } switch ( ptr->iHitgroup ) { case HBOX_ARM_R: if (m_iNoRightArm == 0){ EMIT_SOUND(ENT(pev), CHAN_ITEM, "common/amputation_light.wav", 1, ATTN_NORM); GetBonePosition( LookupBone("Bip01 R UpperArm"), new_origin, new_angle ); MakeGib ( AGIBS_ISLAVE_ARM_R, pevAttacker, new_origin); SetBodygroup( RIGHTARM_GROUP, LIMB_DAMAGED); m_iNoRightArm = 1; } break; case HBOX_ARM_L: if (m_iNoLeftArm == 0){ EMIT_SOUND(ENT(pev), CHAN_ITEM, "common/amputation_light.wav", 1, ATTN_NORM); GetBonePosition( LookupBone("Bip01 L UpperArm"), new_origin, new_angle ); MakeGib ( AGIBS_ISLAVE_ARM_L, pevAttacker, new_origin); SetBodygroup( LEFTARM_GROUP, LIMB_DAMAGED); m_iNoLeftArm = 1; } break; case HBOX_LEG_R: if (m_iNoRightLeg == 0){ EMIT_SOUND(ENT(pev), CHAN_ITEM, "common/amputation_light.wav", 1, ATTN_NORM); GetBonePosition( LookupBone("Bip01 R Calf"), new_origin, new_angle ); MakeGib ( AGIBS_ISLAVE_LEG_R, pevAttacker, new_origin); if (m_iNoTorso == 0) SetBodygroup( RIGHTLEG_GROUP, LIMB_DAMAGED); else SetBodygroup( 2, LIMB_DAMAGED); m_iNoRightLeg = 1; } break; case HBOX_LEG_L: if (m_iNoLeftLeg == 0){ EMIT_SOUND(ENT(pev), CHAN_ITEM, "common/amputation_light.wav", 1, ATTN_NORM); GetBonePosition( LookupBone("Bip01 L Calf"), new_origin, new_angle ); MakeGib ( AGIBS_ISLAVE_LEG_L, pevAttacker, new_origin); if (m_iNoTorso == 0) SetBodygroup( LEFTLEG_GROUP, LIMB_DAMAGED); else SetBodygroup( 1, LIMB_DAMAGED); m_iNoLeftLeg = 1; } break; case HBOX_ARM_M: if (m_iNoLeftArm == 0){ EMIT_SOUND(ENT(pev), CHAN_ITEM, "common/amputation_light.wav", 1, ATTN_NORM); GetBonePosition( LookupBone("Bone05"), new_origin, new_angle ); MakeGib ( AGIBS_ISLAVE_ARM_M, pevAttacker, new_origin); SetBodygroup( MIDDLEARM_GROUP, LIMB_DAMAGED); m_iNoMiddleArm = 1; } break; case HBOX_HEAD: if (m_iNoHead == 0){ EMIT_SOUND(ENT(pev), CHAN_BODY, "common/amputation_heavy.wav", 1, ATTN_NORM); GetBonePosition( LookupBone("Bip01 Head"), new_origin, new_angle ); MakeGib ( AGIBS_ISLAVE_HEAD, pevAttacker, new_origin); //Crab vezde odinakoviy SetBodygroup( HEAD_GROUP, HEAD_BEHEADED); m_iNoHead = 1; } break; } } } void CISlave::GibMonster ( void ) { EMIT_SOUND(ENT(pev), CHAN_WEAPON, "common/bodysplat.wav", 1, ATTN_NORM); if (m_iNoTorso == 0){ CGib::SpawnSpecificGibs( pev, 1, "models/agibs.mdl", AGIBS_ISLAVE_TORSO, 0 ); //спавнит куски, но боди идут не рандомно, а по порядку CGib::SpawnStickyGibs( pev, RANDOM_LONG(2,3), "models/stickygib.mdl", 2, 4 ); //починеный stickygibs, вроде уже не разу не висит в воздухе } if ( m_iNoRightArm == 0 ) CGib::SpawnSpecificGibs( pev, 1, "models/agibs.mdl", AGIBS_ISLAVE_ARM_R, 0 ); if ( m_iNoLeftArm == 0 ) CGib::SpawnSpecificGibs( pev, 1, "models/agibs.mdl", AGIBS_ISLAVE_ARM_L, 0 ); if ( m_iNoMiddleArm == 0 ) CGib::SpawnSpecificGibs( pev, 1, "models/agibs.mdl", AGIBS_ISLAVE_ARM_M, 0 ); if ( m_iNoRightLeg == 0 ) CGib::SpawnSpecificGibs( pev, 1, "models/agibs.mdl", AGIBS_ISLAVE_LEG_R, 0 ); if ( m_iNoLeftLeg == 0 ) CGib::SpawnSpecificGibs( pev, 1, "models/agibs.mdl", AGIBS_ISLAVE_LEG_L, 0 ); if (m_iNoHead == 0) CGib::SpawnSpecificGibs( pev, 1, "models/agibs.mdl", AGIBS_ISLAVE_HEAD, 0 ); CGib::SpawnSpecificGibs( pev, 1, "models/agibs.mdl", AGIBS_ISLAVE_PELVIS, 0 ); SetThink ( &CBaseMonster :: SUB_Remove ); pev->nextthink = gpGlobals->time; } //Код спавна отпределенного куска в определенном месте void CISlave :: MakeGib ( int body, entvars_t *pevAttacker, Vector vecSrc ) { CGib *pGib = GetClassPtr( (CGib *)NULL ); pGib->Spawn( "models/agibs.mdl" ); pGib->m_bloodColor = BLOOD_COLOR_YELLOW; pGib->pev->body = body; pGib->pev->skin = 0; pGib->pev->groupinfo = 1; UTIL_SetGroupTrace(pGib->pev->groupinfo, GROUP_OP_NAND); UTIL_SetGroupTrace(pev->groupinfo, GROUP_OP_NAND); pGib->pev->origin = vecSrc; //pGib->pev->velocity = ( Center() - pevAttacker->origin).Normalize() * 300; pGib->pev->velocity = Vector (RANDOM_FLOAT(-100,100), RANDOM_FLOAT(-100,100), RANDOM_FLOAT(100,200)); pGib->pev->avelocity.x = RANDOM_FLOAT( 100, 200 ); pGib->pev->avelocity.y = RANDOM_FLOAT( 100, 300 ); pGib->pev->avelocity.z = RANDOM_FLOAT( 100, 200 ); pGib->pev->solid = SOLID_TRIGGER; UTIL_SetSize( pGib->pev, Vector( 0, 0, 0 ), Vector( 0, 0, 0 ) ); }


Временная зона GMT. Текущее время 18:13. Страницы (245): « Первая ... « 201 202 203 204 [205] 206 207 208 209 » ... Последняя »
Показать все 3663 сообщений этой темы на одной странице

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