![]() |
Страницы (246): « Первая ... « 201 202 203 204 [205] 206 207 208 209 » ... Последняя » Показать все 3687 сообщений этой темы на одной странице |
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)
__________________
I'm on github
I'm on opendesktop.org
Ну тады ой Но всё равно надо копать в этом направлении.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Копать скорее надо в направлении Walk Rejection. Я создал карту-коробку с двумя нодами. Без препятствий между ними связь есть. Если поставить func_monsterclip, то связь не рисуется.
В логе
__________________
I'm on github
I'm on opendesktop.org
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Такой вопрос, а что делает таких монстров как барнаклы и турели не разрываемыми на куски? У Турелей тчинк TurretDeath вместо killed используется. Барнаклов смог сделать, но опять же - их разрывает только если их взорвать сразу, уже убитого нельзя на ошметки разнести, а у турелей, попытка моя как то их сделать разбиваемыми на куски сделала их не убиваемыми.
Chyvachok у барнакла своя функция Killed, из неё не вызывается GibMonster. То же самое с турелями.
Ku2zoff У барнакла может быть дело в этих строках в Killed?
pev->solid = SOLID_NOT;
pev->takedamage = DAMAGE_NO;
По идее из-за этого нельзя ему нанести урон после того как он убит, но я не знаю какой solid у трупов других врагов, чтобы можно было из оружия урон нанести и при этом сквозь них пройти можно было.
Это влияет да. А ещё вот:
1 | if ( HasMemory( bits_MEMORY_KILLED ) ) |
2 | { |
3 | if ( ShouldGibMonster( iGib ) ) |
4 | CallGibMonster(); |
5 | return; |
6 | } |
Насчет этих двух строк, если убрать 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 ); }
CBarnacle :: WaitTillDead тут возвращай ему солидность. Может подходящее место. А вообще, чтобы жертва не застревала, можно воспользоваться груптрейсом.
Ku2zoff Я не могу найти какая солидность у трупов, они получают урон из оружия, и в то же время сквозь них можно пройти.
Добавлено 07-12-2021 в 14:44:
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; } } }
pev->groupinfo = 1; |
pVictim->pev->groupinfo = 1; |
UTIL_SetGroupTrace(pev->groupinfo, GROUP_OP_NAND); |
UTIL_SetGroupTrace(pVictim->pev->groupinfo, GROUP_OP_NAND); |
UTIL_SetGroupTrace(pev->groupinfo, GROUP_OP_AND); |
UTIL_SetGroupTrace(pVictim->pev->groupinfo, GROUP_OP_AND); |
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. Текущее время 23:16. | Страницы (246): « Первая ... « 201 202 203 204 [205] 206 207 208 209 » ... Последняя » Показать все 3687 сообщений этой темы на одной странице |
На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2022