NOXREF void CGib::SpawnStickyGibs(entvars_t *pevVictim, Vector vecOrigin, int cGibs) { if (g_Language == LANGUAGE_GERMAN) { // no sticky gibs in germany right now! return; } for (int i = 0; i < cGibs; ++i) { CGib *pGib = GetClassPtr<CCSGib>((CGib *)NULL); pGib->Spawn("models/stickygib.mdl"); pGib->pev->body = RANDOM_LONG(0, 2); if (pevVictim) { pGib->pev->origin.x = vecOrigin.x + RANDOM_FLOAT(-3, 3); pGib->pev->origin.y = vecOrigin.y + RANDOM_FLOAT(-3, 3); pGib->pev->origin.z = vecOrigin.z + RANDOM_FLOAT(-3, 3); // make the gib fly away from the attack vector pGib->pev->velocity = g_vecAttackDir * -1; // mix in some noise pGib->pev->velocity.x += RANDOM_FLOAT(-0.15, 0.15); pGib->pev->velocity.y += RANDOM_FLOAT(-0.15, 0.15); pGib->pev->velocity.z += RANDOM_FLOAT(-0.15, 0.15); pGib->pev->velocity = pGib->pev->velocity * 900; pGib->pev->avelocity.x = RANDOM_FLOAT(250, 400); pGib->pev->avelocity.y = RANDOM_FLOAT(250, 400); // copy owner's blood color pGib->m_bloodColor = (CBaseEntity::Instance(pevVictim))->BloodColor(); if (pevVictim->health > -50) { pGib->pev->velocity = pGib->pev->velocity * 0.7; } else if (pevVictim->health > -200) { pGib->pev->velocity = pGib->pev->velocity * 2; } else { pGib->pev->velocity = pGib->pev->velocity * 4; } pGib->pev->movetype = MOVETYPE_TOSS; pGib->pev->solid = SOLID_BBOX; UTIL_SetSize(pGib->pev, Vector(0, 0,0), Vector(0, 0, 0)); pGib->SetTouch(&CGib::StickyGibTouch); pGib->SetThink(NULL); } pGib->LimitVelocity(); } }
void CGib::SpawnStickyGibs( CBaseEntity *pVictim, Vector vecOrigin, int cGibs ) { int i; //City17: Germany Violence Fix. /*if ( g_Language.GetInt() == LANGUAGE_GERMAN ) { // no sticky gibs in germany right now! return; }*/ for ( i = 0 ; i < cGibs ; i++ ) { CGib *pGib = (CGib *)CreateEntityByName( "gib" ); pGib->Spawn( "models/stickygib.mdl" ); pGib->m_nBody = random->RandomInt(0,2); if ( pVictim ) { pGib->SetLocalOrigin( Vector( vecOrigin.x + random->RandomFloat( -3, 3 ), vecOrigin.y + random->RandomFloat( -3, 3 ), vecOrigin.z + random->RandomFloat( -3, 3 ) ) ); // make the gib fly away from the attack vector Vector vecNewVelocity = g_vecAttackDir * -1; // mix in some noise vecNewVelocity.x += random->RandomFloat ( -0.15, 0.15 ); vecNewVelocity.y += random->RandomFloat ( -0.15, 0.15 ); vecNewVelocity.z += random->RandomFloat ( -0.15, 0.15 ); vecNewVelocity *= 900; QAngle vecAngVelocity( random->RandomFloat ( 250, 400 ), random->RandomFloat ( 250, 400 ), 0 ); pGib->SetLocalAngularVelocity( vecAngVelocity ); // copy owner's blood color pGib->SetBloodColor( pVictim->BloodColor() ); pGib->AdjustVelocityBasedOnHealth( pVictim->m_iHealth, vecNewVelocity ); pGib->SetAbsVelocity( vecNewVelocity ); pGib->SetMoveType( MOVETYPE_FLYGRAVITY ); pGib->RemoveSolidFlags( FSOLID_NOT_SOLID ); pGib->SetCollisionBounds( vec3_origin, vec3_origin ); pGib->SetTouch ( &CGib::StickyGibTouch ); pGib->SetThink (NULL); } pGib->LimitVelocity(); } }
//========================================================= // RunTask //========================================================= void CGargantua::RunTask( Task_t *pTask ) { switch ( pTask->iTask ) { case TASK_DIE: if ( gpGlobals->time > m_flWaitFinished ) { pev->renderfx = kRenderFxExplode; pev->rendercolor.x = 255; pev->rendercolor.y = 0; pev->rendercolor.z = 0; StopAnimation(); pev->nextthink = gpGlobals->time + 0.15; SetThink( SUB_Remove ); int i; int parts = MODEL_FRAMES( gGargGibModel ); for ( i = 0; i < 10; i++ ) { CGib *pGib = GetClassPtr( (CGib *)NULL ); pGib->Spawn( GARG_GIB_MODEL ); int bodyPart = 0; if ( parts > 1 ) bodyPart = RANDOM_LONG( 0, pev->body-1 ); pGib->pev->body = bodyPart; pGib->m_bloodColor = BLOOD_COLOR_YELLOW; pGib->m_material = matNone; pGib->SetAbsOrigin( GetAbsOrigin() ); pGib->SetAbsVelocity( UTIL_RandomBloodVector() * RANDOM_FLOAT( 300, 500 )); pGib->SetNextThink( 1.25 ); pGib->SetThink( SUB_FadeOut ); } Vector vecOrigin = GetAbsOrigin(); MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, vecOrigin ); WRITE_BYTE( TE_BREAKMODEL); // position WRITE_COORD( vecOrigin.x ); WRITE_COORD( vecOrigin.y ); WRITE_COORD( vecOrigin.z ); // size WRITE_COORD( 200 ); WRITE_COORD( 200 ); WRITE_COORD( 128 ); // velocity WRITE_COORD( 0 ); WRITE_COORD( 0 ); WRITE_COORD( 0 ); // randomization WRITE_BYTE( 200 ); // Model WRITE_SHORT( gGargGibModel ); //model id# // # of shards WRITE_BYTE( 50 ); // duration WRITE_BYTE( 20 );// 3.0 seconds // flags WRITE_BYTE( BREAK_FLESH ); MESSAGE_END(); return; } else CBaseMonster::RunTask(pTask); break; case TASK_FLAME_SWEEP: if ( gpGlobals->time > m_flWaitFinished ) { FlameDestroy(); TaskComplete(); FlameControls( 0, 0 ); SetBoneController( 0, 0 ); SetBoneController( 1, 0 ); } else { BOOL cancel = FALSE; Vector angles = g_vecZero; FlameUpdate(); CBaseEntity *pEnemy = m_hEnemy; if ( pEnemy ) { Vector org = GetAbsOrigin(); org.z += 64; Vector dir = pEnemy->BodyTarget(org) - org; angles = UTIL_VecToAngles( dir ); angles.y -= GetAbsAngles().y; if ( dir.Length() > 400 ) cancel = TRUE; } if ( fabs(angles.y) > 60 ) cancel = TRUE; if ( cancel ) { m_flWaitFinished -= 0.5; m_flameTime -= 0.5; } // FlameControls( angles.x + 2 * sin(gpGlobals->time*8), angles.y + 28 * sin(gpGlobals->time*8.5) ); FlameControls( angles.x, angles.y ); } break; default: CBaseMonster::RunTask( pTask ); break; } }
// Fograin92: Extension of "cough" animation, just for fun void CGrapple::PukeGibs(void) { // Fograin92: Make sure we go back to idle anim after this SetThink(&CGrapple::WeaponIdle); pev->nextthink = gpGlobals->time + 1.3; #ifndef CLIENT_DLL // Fograin92: Get proper XYZ values UTIL_MakeVectors( m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle ); Vector GunPosition = m_pPlayer->GetGunPosition(); GunPosition = GunPosition + gpGlobals->v_up * -4 + gpGlobals->v_right * 3 + gpGlobals->v_forward * 16; CGib *pGib = GetClassPtr( (CGib *)NULL ); // Fograin92: Changed model dir and names int iRandom = RANDOM_LONG(2, 11); switch( iRandom) { case 2: pGib->Spawn( "models/gibs/human_gib2.mdl" ); break; case 3: pGib->Spawn( "models/gibs/human_gib3.mdl" ); break; case 4: pGib->Spawn( "models/gibs/human_gib4.mdl" ); break; case 5: pGib->Spawn( "models/gibs/human_gib5.mdl" ); break; case 6: pGib->Spawn( "models/gibs/human_gib6.mdl" ); break; case 7: pGib->Spawn( "models/gibs/human_gib7.mdl" ); break; case 8: pGib->Spawn( "models/gibs/human_gib8.mdl" ); break; case 9: pGib->Spawn( "models/gibs/human_gib9.mdl" ); break; case 10: pGib->Spawn( "models/gibs/human_gib10.mdl" ); break; case 11: pGib->Spawn( "models/gibs/human_gib11.mdl" ); break; default: pGib->Spawn( "models/gibs/human_gib3.mdl" ); break; } pGib->pev->body = 0; //pGib->Spawn( "models/hgibs.mdl" ); pGib->m_bloodColor = BLOOD_COLOR_RED; pGib->pev->body = 0; pGib->pev->origin = GunPosition + gpGlobals->v_forward * 40; pGib->pev->velocity = gpGlobals->v_forward * 100; // Fograin92: Some spin variations pGib->pev->avelocity.x = RANDOM_LONG( 200, 600 ); pGib->pev->avelocity.y = RANDOM_LONG( 200, 600 ); pGib->pev->avelocity.z = RANDOM_LONG( 100, 200 ); pGib->pev->nextthink = gpGlobals->time + 10.0; pGib->SetThink( &CBaseEntity::SUB_FadeOut ); // Fograin92: Cough some blood MESSAGE_BEGIN(MSG_ALL, gmsgParticles); WRITE_SHORT(0); WRITE_BYTE(0); WRITE_COORD( pGib->pev->origin.x ); WRITE_COORD( pGib->pev->origin.y ); WRITE_COORD( pGib->pev->origin.z ); WRITE_COORD( pGib->pev->avelocity.x ); WRITE_COORD( pGib->pev->avelocity.y ); WRITE_COORD( pGib->pev->avelocity.z ); WRITE_SHORT(iImpactBloodRed); MESSAGE_END(); #endif }
void CTank :: TankDeath ( void ) { bTankDead = 1; pev->sequence = 2;/*LookupSequence( "die" );*/ ResetSequenceInfo (); m_pPlayer->TakeDamage ( pev,pev,(float)999, DMG_CRUSH ); // mouru pev->velocity = pev->avelocity = m_pTankBSP->pev->velocity = m_pTankBSP->pev->avelocity =Vector (0,0,0); m_pTankBSP->pev->origin = pev->origin; m_pTankBSP->pev->angles = pev->angles; m_pCam->pev->velocity = m_pCam->pev->avelocity = Vector (0,0,0); UpdateSound (); SetThink ( DeadThink ); pev->nextthink = gpGlobals->time + 29 / 21.0; // maman, c'est quoi qu'a fait boum ? EMIT_SOUND(ENT(pev), CHAN_AUTO, TANK_EXPLO_SOUND1, 1, ATTN_NORM); EMIT_SOUND(ENT(pev), CHAN_WEAPON, TANK_EXPLO_SOUND2, 1, ATTN_NORM); // sprites de feu - explosion for ( int i=0; i<20; i++ ) { CSprite *pSpr = CSprite::SpriteCreate ( SPRITE_FEU, Vector(pev->origin.x,pev->origin.y,pev->origin.z + 50), TRUE ); pSpr->SetScale ( SPRITE_FEU_SCALE*2 ); pSpr->AnimateAndDie ( RANDOM_FLOAT(20,22) ); pSpr->SetTransparency ( kRenderTransAdd, 255, 255, 255, 120, kRenderFxNone ); pSpr->pev->velocity = Vector ( RANDOM_FLOAT(-150,150),RANDOM_FLOAT(-150,150),100/*RANDOM_FLOAT(130,150)*/ ); } // sprites de feu en colonne for ( i=0; i<6; i++ ) { CSprite *pSpr = CSprite::SpriteCreate ( SPRITE_FEU, Vector(pev->origin.x,pev->origin.y,pev->origin.z + 100), TRUE ); pSpr->SetScale ( SPRITE_FEU_SCALE ); pSpr->AnimateAndDie ( RANDOM_FLOAT(20,25) ); pSpr->SetTransparency ( kRenderTransAdd, 255, 255, 255, 120, kRenderFxNone ); pSpr->pev->velocity = Vector ( RANDOM_FLOAT(-50,50),RANDOM_FLOAT(-50,50),140/*RANDOM_FLOAT(130,150)*/ ); } for ( i=0; i<10; i++ ) { CSprite *pSpr = CSprite::SpriteCreate ( SPRITE_SMOKEBALL, Vector(pev->origin.x,pev->origin.y,pev->origin.z + 100), TRUE ); pSpr->SetScale ( SPRITE_SMOKEBALL_SCALE ); pSpr->AnimateAndDie ( RANDOM_FLOAT(2,3) ); pSpr->SetTransparency ( kRenderTransAlpha, 255, 255, 255, 255, kRenderFxNone ); pSpr->pev->velocity = Vector ( RANDOM_FLOAT(-50,50),RANDOM_FLOAT(-50,50),RANDOM_FLOAT(50,50) ); } // gibs for ( i = 0; i<20; i++ ) { CGib *pGib = GetClassPtr( (CGib *)NULL ); pGib->Spawn( "models/mechgibs.mdl" ); pGib->m_bloodColor = DONT_BLEED; pGib->pev->body = RANDOM_LONG (1,5); pGib->pev->origin = pev->origin + Vector ( 0, 0, 250 ); pGib->pev->velocity = Vector ( RANDOM_FLOAT(-200,200),RANDOM_FLOAT(-200,200),RANDOM_FLOAT(0,400)); pGib->pev->avelocity = Vector ( RANDOM_FLOAT(-1000,1000), RANDOM_FLOAT(-1000,1000), RANDOM_FLOAT(-1000,1000) ); pGib->pev->solid = SOLID_NOT; pGib->SetThink(SUB_Remove); pGib->pev->nextthink = gpGlobals->time + 1; } // étincelles for ( i = 0; i < 10; i++ ) { Create( "spark_shower", pev->origin, Vector (0,0,1), NULL ); } }
//========================================================= // RunTask //========================================================= void CNPC_Gargantua::RunTask( const Task_t *pTask ) { switch ( pTask->iTask ) { case TASK_DIE: if ( gpGlobals->curtime > m_flWaitFinished ) { //TEMP TEMP m_nRenderFX = kRenderFxExplode; SetRenderColor( 255, 0, 0 , 255 ); StopAnimation(); SetNextThink( gpGlobals->curtime + 0.15 ); SetThink( &CBaseEntity::SUB_Remove ); int i; int parts = modelinfo->GetModelFrameCount( modelinfo->GetModel( gGargGibModel ) ); for ( i = 0; i < 10; i++ ) { CGib *pGib = CREATE_ENTITY( CGib, "gib" ); pGib->Spawn( GARG_GIB_MODEL); int bodyPart = 0; if ( parts > 1 ) bodyPart = random->RandomInt( 0, parts-1 ); pGib->SetBodygroup( 0, bodyPart ); pGib->SetBloodColor( BLOOD_COLOR_YELLOW ); pGib->m_material = matNone; pGib->SetAbsOrigin( GetAbsOrigin() ); pGib->SetAbsVelocity( UTIL_RandomBloodVector() * random->RandomFloat( 300, 500 ) ); pGib->SetNextThink( gpGlobals->curtime + 1.25 ); pGib->SetThink( &CBaseEntity::SUB_FadeOut ); } Vector vecSize = Vector( 200, 200, 128 ); CPVSFilter filter( GetAbsOrigin() ); te->BreakModel( filter, 0.0, GetAbsOrigin(), vec3_angle, vecSize, vec3_origin, gGargGibModel, 200, 50, 3.0, BREAK_FLESH ); return; } else BaseClass::RunTask( pTask ); break; case TASK_FLAME_SWEEP: if ( gpGlobals->curtime > m_flWaitFinished ) { //TEMP TEMP FlameDestroy(); TaskComplete(); FlameControls( 0, 0 ); SetBoneController( 0, 0 ); SetBoneController( 1, 0 ); } else { bool cancel = false; QAngle angles = QAngle( 0, 0, 0 ); //TEMP TEMP FlameUpdate(); CBaseEntity *pEnemy = GetEnemy(); if ( pEnemy ) { Vector org = GetAbsOrigin(); org.z += 64; Vector dir = pEnemy->BodyTarget(org) - org; VectorAngles( dir, angles ); angles.x = -angles.x; angles.y -= GetAbsAngles().y; if ( dir.Length() > 400 ) cancel = true; } if ( fabs(angles.y) > 60 ) cancel = true; if ( cancel ) { m_flWaitFinished -= 0.5; m_flameTime -= 0.5; } //TEMP TEMP //FlameControls( angles.x + 2 * sin(gpGlobals->curtime*8), angles.y + 28 * sin(gpGlobals->curtime*8.5) ); FlameControls( angles.x, angles.y ); } break; default: BaseClass::RunTask( pTask ); break; } }