void QUA_helicopter::Event_Killed( const CTakeDamageInfo &info ) { //m_lifeState=LIFE_DYING; // Calculate death force m_vecTotalBulletForce = CalcDamageForceVector( info ); CBasePlayer *pPlayer = m_hPlayer; if ( pPlayer ) { pPlayer->LeaveVehicle(); // Force exit vehicle CBaseEntity *pAPC=this->GetBaseEntity(); CTakeDamageInfo playerinfo; if (info.GetAttacker()==pAPC && info.GetInflictor()==pAPC) { playerinfo.SetAttacker(pPlayer); playerinfo.SetInflictor(pPlayer); playerinfo.SetDamage(10000); playerinfo.SetDamageType(DMG_BLAST); } else { playerinfo.SetAttacker(info.GetAttacker()); playerinfo.SetInflictor(info.GetInflictor()); playerinfo.SetDamage(10000); playerinfo.SetDamageType(DMG_BLAST); } playerinfo.SetDamagePosition( pPlayer->WorldSpaceCenter() ); playerinfo.SetDamageForce( Vector(0,0,-1) ); pPlayer->TakeDamage( playerinfo ); m_hPlayer = NULL; } m_OnDeath.FireOutput( info.GetAttacker(), this ); //StopSmoking(); Vector vecAbsMins, vecAbsMaxs; CollisionProp()->WorldSpaceAABB( &vecAbsMins, &vecAbsMaxs ); Vector vecNormalizedMins, vecNormalizedMaxs; CollisionProp()->WorldToNormalizedSpace( vecAbsMins, &vecNormalizedMins ); CollisionProp()->WorldToNormalizedSpace( vecAbsMaxs, &vecNormalizedMaxs ); Vector vecAbsPoint; CPASFilter filter( GetAbsOrigin() ); for (int i = 0; i < 5; i++) { CollisionProp()->RandomPointInBounds( vecNormalizedMins, vecNormalizedMaxs, &vecAbsPoint ); te->Explosion( filter, random->RandomFloat( 0.0, 1.0 ), &vecAbsPoint, g_sModelIndexFireball, random->RandomInt( 4, 10 ), random->RandomInt( 8, 15 ), ( i < 2 ) ? TE_EXPLFLAG_NODLIGHTS : TE_EXPLFLAG_NOPARTICLES | TE_EXPLFLAG_NOFIREBALLSMOKE | TE_EXPLFLAG_NODLIGHTS, 100, 0 ); } // Aqui destruiremos todo StopLoopingSounds(); BecomeRagdoll( info, m_vecTotalBulletForce ); UTIL_ScreenShake( vecAbsPoint, 25.0, 150.0, 1.0, 750.0f, SHAKE_START ); CreateCorpse(); //BecomeRagdoll( info, m_vecTotalBulletForce ); //BecomeRagdollOnClient(m_vecTotalBulletForce); //Dissolve(NULL, gpGlobals->curtime, false, ENTITY_DISSOLVE_NORMAL); }
//----------------------------------------------------------------------------- // Death volley //----------------------------------------------------------------------------- void CPropAPC::FireDying( ) { if ( m_flRocketTime > gpGlobals->curtime ) return; Vector vecRocketOrigin; GetRocketShootPosition( &vecRocketOrigin ); Vector vecDir; vecDir.Random( -1.0f, 1.0f ); if ( vecDir.z < 0.0f ) { vecDir.z *= -1.0f; } VectorNormalize( vecDir ); Vector vecVelocity; VectorMultiply( vecDir, ROCKET_SPEED * random->RandomFloat( 0.75f, 1.25f ), vecVelocity ); QAngle angles; VectorAngles( vecDir, angles ); CAPCMissile *pRocket = (CAPCMissile *) CAPCMissile::Create( vecRocketOrigin, angles, vecVelocity, this ); float flDeathTime = random->RandomFloat( 0.3f, 0.5f ); if ( random->RandomFloat( 0.0f, 1.0f ) < 0.3f ) { pRocket->ExplodeDelay( flDeathTime ); } else { pRocket->AugerDelay( flDeathTime ); } // Make erratic firing m_flRocketTime = gpGlobals->curtime + random->RandomFloat( DEATH_VOLLEY_MIN_FIRE_TIME, DEATH_VOLLEY_MAX_FIRE_TIME ); if ( --m_iRocketSalvoLeft <= 0 ) { CreateCorpse(); } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CPropAPC2::Event_Killed( const CTakeDamageInfo &info ) { CBasePlayer *pPlayer = m_hPlayer; if ( pPlayer ) { pPlayer->LeaveVehicle(); // Force exit vehicle CBaseEntity *pAPC=this->GetBaseEntity(); CTakeDamageInfo playerinfo; if (info.GetAttacker()==pAPC && info.GetInflictor()==pAPC) { playerinfo.SetAttacker(pPlayer); playerinfo.SetInflictor(pPlayer); playerinfo.SetDamage(10000); playerinfo.SetDamageType(DMG_BLAST); } else { playerinfo.SetAttacker(info.GetAttacker()); playerinfo.SetInflictor(info.GetInflictor()); playerinfo.SetDamage(10000); playerinfo.SetDamageType(DMG_BLAST); } playerinfo.SetDamagePosition( pPlayer->WorldSpaceCenter() ); playerinfo.SetDamageForce( Vector(0,0,-1) ); pPlayer->TakeDamage( playerinfo ); m_hPlayer = NULL; } m_OnDeath.FireOutput( info.GetAttacker(), this ); Vector vecAbsMins, vecAbsMaxs; CollisionProp()->WorldSpaceAABB( &vecAbsMins, &vecAbsMaxs ); Vector vecNormalizedMins, vecNormalizedMaxs; CollisionProp()->WorldToNormalizedSpace( vecAbsMins, &vecNormalizedMins ); CollisionProp()->WorldToNormalizedSpace( vecAbsMaxs, &vecNormalizedMaxs ); Vector vecAbsPoint; CPASFilter filter( GetAbsOrigin() ); for (int i = 0; i < 3; i++) { CollisionProp()->RandomPointInBounds( vecNormalizedMins, vecNormalizedMaxs, &vecAbsPoint ); te->Explosion( filter, random->RandomFloat( 0.0, 1.0 ), &vecAbsPoint, g_sModelIndexFireball, random->RandomInt( 4, 10 ), random->RandomInt( 8, 15 ), ( i < 2 ) ? TE_EXPLFLAG_NODLIGHTS : TE_EXPLFLAG_NOPARTICLES | TE_EXPLFLAG_NOFIREBALLSMOKE | TE_EXPLFLAG_NODLIGHTS, 100, 0 ); } // TODO: make the gibs spawn in sync with the delayed explosions //int nGibs = random->RandomInt( 1, 4 ); //for ( i = 0; i < nGibs; i++) //{ // // Throw a flaming, smoking chunk. // CGib *pChunk = CREATE_ENTITY( CGib, "gib" ); // pChunk->Spawn( "models/gibs/hgibs.mdl" ); // pChunk->SetBloodColor( DONT_BLEED ); // QAngle vecSpawnAngles; // vecSpawnAngles.Random( -90, 90 ); // pChunk->SetAbsOrigin( vecAbsPoint ); // pChunk->SetAbsAngles( vecSpawnAngles ); // int nGib = random->RandomInt( 0, APC_MAX_CHUNKS - 1 ); // pChunk->Spawn( s_pChunkModelName[nGib] ); // pChunk->SetOwnerEntity( this ); // pChunk->m_lifeTime = random->RandomFloat( 6.0f, 8.0f ); // pChunk->SetCollisionGroup( COLLISION_GROUP_DEBRIS ); // IPhysicsObject *pPhysicsObject = pChunk->VPhysicsInitNormal( SOLID_VPHYSICS, pChunk->GetSolidFlags(), false ); // // // Set the velocity // if ( pPhysicsObject ) // { // pPhysicsObject->EnableMotion( true ); // Vector vecVelocity; // QAngle angles; // angles.x = random->RandomFloat( -20, 20 ); // angles.y = random->RandomFloat( 0, 360 ); // angles.z = 0.0f; // AngleVectors( angles, &vecVelocity ); // // vecVelocity *= random->RandomFloat( 300, 900 ); // vecVelocity += GetAbsVelocity(); // AngularImpulse angImpulse; // angImpulse = RandomAngularImpulse( -180, 180 ); // pChunk->SetAbsVelocity( vecVelocity ); // pPhysicsObject->SetVelocity(&vecVelocity, &angImpulse ); // } // CEntityFlame *pFlame = CEntityFlame::Create( pChunk, false ); // if ( pFlame != NULL ) // { // pFlame->SetLifetime( pChunk->m_lifeTime ); // } // pChunk->Dissolve( NULL, gpGlobals->curtime, false, ENTITY_DISSOLVE_NORMAL ); //} UTIL_ScreenShake( vecAbsPoint, 25.0, 150.0, 1.0, 750.0f, SHAKE_START ); //Ignite( 60, false ); //m_lifeState = LIFE_DYING; // Spawn a lesser amount if the player is close /*m_iRocketSalvoLeft = DEATH_VOLLEY_ROCKET_COUNT; m_flRocketTime = gpGlobals->curtime;*/ CreateCorpse(); }