void CASW_Boomer_Blob::DoExplosion( ) { // scorch the ground trace_t tr; UTIL_TraceLine ( GetAbsOrigin(), GetAbsOrigin() + Vector( 0, 0, -80 ), MASK_SHOT, this, COLLISION_GROUP_NONE, &tr); if ( m_bMaster ) { if ( ( tr.m_pEnt != GetWorldEntity() ) || ( tr.hitbox != 0 ) ) { // non-world needs smaller decals if( tr.m_pEnt && !tr.m_pEnt->IsNPC() ) { UTIL_DecalTrace( &tr, "SmallScorch" ); } } else { UTIL_DecalTrace( &tr, "Scorch" ); } UTIL_ASW_ScreenShake( GetAbsOrigin(), 7.0f, 45.0f, 0.5f, 150, SHAKE_START ); } // explosion effects DispatchParticleEffect( "boomer_drop_explosion", GetAbsOrigin(), Vector( m_DmgRadius, 0.0f, 0.0f ), QAngle( 0.0f, 0.0f, 0.0f ) ); EmitSound( "ASW_Boomer_Grenade.Explode" ); // damage to nearby things ASWGameRules()->RadiusDamage( CTakeDamageInfo( this, m_hFirer.Get(), m_flDamage, DMG_BLAST ), GetAbsOrigin(), m_DmgRadius, CLASS_NONE, NULL ); }
void UTIL_BloodDecalTrace( TraceResult *pTrace, int bloodColor ) { if ( UTIL_ShouldShowBlood( bloodColor ) ) { if ( bloodColor == BLOOD_COLOR_RED ) UTIL_DecalTrace( pTrace, DECAL_BLOOD1 + RANDOM_LONG(0,5) ); else UTIL_DecalTrace( pTrace, DECAL_YBLOOD1 + RANDOM_LONG(0,5) ); } }
void UTIL_BloodDecalTrace( trace_t *pTrace, int bloodColor ) { if ( UTIL_ShouldShowBlood( bloodColor ) ) { if ( bloodColor == BLOOD_COLOR_RED ) UTIL_DecalTrace( pTrace, "Blood" ); else UTIL_DecalTrace( pTrace, "YellowBlood" ); } }
void CGrenadeMP5::Detonate(void) { if (!m_bIsLive) { return; } m_bIsLive = false; m_takedamage = DAMAGE_NO; CPASFilter filter( GetAbsOrigin() ); te->Explosion( filter, 0.0, &GetAbsOrigin(), GetWaterLevel() == 0 ? g_sModelIndexFireball : g_sModelIndexWExplosion, (m_flDamage - 50) * .60, 15, TE_EXPLFLAG_NONE, m_DmgRadius, m_flDamage ); trace_t tr; tr = CBaseEntity::GetTouchTrace(); if ( (tr.m_pEnt != GetWorldEntity()) || (tr.hitbox != 0) ) { // non-world needs smaller decals UTIL_DecalTrace( &tr, "SmallScorch"); } else { UTIL_DecalTrace( &tr, "Scorch" ); } CSoundEnt::InsertSound ( SOUND_COMBAT, GetAbsOrigin(), BASEGRENADE_EXPLOSION_VOLUME, 3.0 ); RadiusDamage ( CTakeDamageInfo( this, GetThrower(), m_flDamage, DMG_BLAST ), GetAbsOrigin(), m_flDamage * 2.5, CLASS_NONE, NULL ); CPASAttenuationFilter filter2( this ); EmitSound( filter2, entindex(), "GrenadeMP5.Detonate" ); if ( GetWaterLevel() == 0 ) { int sparkCount = random->RandomInt( 0,3 ); QAngle angles; VectorAngles( tr.plane.normal, angles ); for ( int i = 0; i < sparkCount; i++ ) Create( "spark_shower", GetAbsOrigin(), angles, NULL ); } UTIL_Remove( this ); }
void CGrenadeAR2::Detonate(void) { if (!m_bIsLive) { return; } m_bIsLive = false; m_takedamage = DAMAGE_NO; if(m_hSmokeTrail) { UTIL_Remove(m_hSmokeTrail); m_hSmokeTrail = NULL; } CPASFilter filter( GetAbsOrigin() ); te->Explosion( filter, 0.0, &GetAbsOrigin(), g_sModelIndexFireball, 2.0, 15, TE_EXPLFLAG_NONE, m_DmgRadius, m_flDamage ); Vector vecForward = GetAbsVelocity(); VectorNormalize(vecForward); trace_t tr; UTIL_TraceLine ( GetAbsOrigin(), GetAbsOrigin() + 60*vecForward, MASK_SHOT, this, COLLISION_GROUP_NONE, &tr); if ((tr.m_pEnt != GetWorldEntity()) || (tr.hitbox != 0)) { // non-world needs smaller decals if( tr.m_pEnt && !tr.m_pEnt->IsNPC() ) { UTIL_DecalTrace( &tr, "SmallScorch" ); } } else { UTIL_DecalTrace( &tr, "Scorch" ); } UTIL_ScreenShake( GetAbsOrigin(), 25.0, 150.0, 1.0, 750, SHAKE_START ); RadiusDamage ( CTakeDamageInfo( this, GetThrower(), m_flDamage, DMG_BLAST ), GetAbsOrigin(), m_DmgRadius, CLASS_NONE, NULL ); UTIL_Remove( this ); }
void CFlame::ExplodeTouch( CBaseEntity *pOther ) { if ( UTIL_PointContents(pev->origin) == CONTENT_SKY ) { FX_Trail( pev->origin, entindex(), PROJ_REMOVE ); UTIL_Remove( this ); return; } if ( UTIL_PointContents(pev->origin) == CONTENT_WATER ) { FX_Trail( pev->origin, entindex(), PROJ_FLAME_DETONATE_WATER ); UTIL_Remove( this ); return; } if (pOther->edict() == pev->owner) return; TraceResult tr; Vector vecSpot = pev->origin - pev->velocity.Normalize() * 32; UTIL_TraceLine( vecSpot, vecSpot + pev->velocity.Normalize() * 64, ignore_monsters, ENT(pev), &tr ); FireStayTime = 8; entvars_t *pevOwner = VARS( pev->owner ); ::RadiusDamage( pev->origin, pev, pevOwner, pev->dmg, pev->dmg*2.5, CLASS_NONE, DMG_IGNITE | DMG_NEVERGIB); UTIL_DecalTrace(&tr, DECAL_SMALLSCORCH1 + RANDOM_LONG(0,2)); FX_Trail( tr.vecEndPos + (tr.vecPlaneNormal * 10), entindex(), PROJ_FLAME_DETONATE ); pev->velocity = g_vecZero; SetTouch(NULL); SetThink( Burn ); pev->nextthink = gpGlobals->time + 0.2; }
//----------------------------------------------------------------------------- // Purpose: // Input: // Output: //----------------------------------------------------------------------------- void CASW_Ranger::Event_Killed( const CTakeDamageInfo &info ) { CTakeDamageInfo newInfo(info); // scale up the force if we're shot by a marine, to make our ragdolling more interesting if (newInfo.GetAttacker() && newInfo.GetAttacker()->Classify() == CLASS_ASW_MARINE) { // scale based on the weapon used if (info.GetAmmoType() == GetAmmoDef()->Index("ASW_R") || info.GetAmmoType() == GetAmmoDef()->Index("ASW_AG") || info.GetAmmoType() == GetAmmoDef()->Index("ASW_P")) newInfo.ScaleDamageForce(22.0f); else if (info.GetAmmoType() == GetAmmoDef()->Index("ASW_PDW") || info.GetAmmoType() == GetAmmoDef()->Index("ASW_SG")) newInfo.ScaleDamageForce(30.0f); else if (info.GetAmmoType() == GetAmmoDef()->Index("ASW_ASG")) newInfo.ScaleDamageForce(35.0f); // tilt the angle up a bit? Vector vecForceDir = newInfo.GetDamageForce(); float force = vecForceDir.NormalizeInPlace(); QAngle angForce; VectorAngles(vecForceDir, angForce); angForce[PITCH] += asw_drone_death_force_pitch.GetFloat(); AngleVectors(angForce, &vecForceDir); vecForceDir *= force; newInfo.SetDamageForce(vecForceDir); } trace_t tr; UTIL_TraceLine( GetAbsOrigin() + Vector( 0, 0, 16 ), GetAbsOrigin() - Vector( 0, 0, 64 ), MASK_SOLID, this, COLLISION_GROUP_NONE, &tr ); UTIL_DecalTrace( &tr, "GreenBloodBig" ); BaseClass::Event_Killed( newInfo ); }
void CNPC_BigMomma::LayHeadcrab( void ) { CBaseEntity *pChild = CBaseEntity::Create( BIG_CHILDCLASS, GetAbsOrigin(), GetAbsAngles(), this ); pChild->AddSpawnFlags( SF_NPC_FALL_TO_GROUND ); pChild->SetOwnerEntity( this ); // Is this the second crab in a pair? if ( HasMemory( bits_MEMORY_CHILDPAIR ) ) { m_crabTime = gpGlobals->curtime + RandomFloat( 5, 10 ); Forget( bits_MEMORY_CHILDPAIR ); } else { m_crabTime = gpGlobals->curtime + RandomFloat( 0.5, 2.5 ); Remember( bits_MEMORY_CHILDPAIR ); } trace_t tr; UTIL_TraceLine( GetAbsOrigin(), GetAbsOrigin() - Vector(0,0,100), MASK_SOLID, this, COLLISION_GROUP_NONE, &tr ); UTIL_DecalTrace( &tr, "Splash" ); CPASAttenuationFilter filter( this ); EmitSound( filter, entindex(), "BigMomma.LayHeadcrab" ); m_crabCount++; }
void CNPC_Gargantua::StompAttack( void ) { trace_t trace; Vector vecForward; AngleVectors(GetAbsAngles(), &vecForward ); Vector vecStart = GetAbsOrigin() + Vector(0,0,60) + 35 * vecForward; CBaseEntity* pPlayer = GetEnemy(); if ( !pPlayer ) return; Vector vecAim = pPlayer->GetAbsOrigin() - GetAbsOrigin(); VectorNormalize( vecAim ); Vector vecEnd = (vecAim * 1024) + vecStart; UTIL_TraceLine( vecStart, vecEnd, MASK_SOLID, this, COLLISION_GROUP_NONE, &trace ); // NDebugOverlay::Line( vecStart, vecEnd, 255, 0, 0, false, 10.0f ); CStomp::StompCreate( vecStart, trace.endpos, 0, this ); UTIL_ScreenShake( GetAbsOrigin(), 12.0, 100.0, 2.0, 1000, SHAKE_START ); CPASAttenuationFilter filter( this ); EmitSound( filter, entindex(), "Garg.StompSound" ); UTIL_TraceLine( GetAbsOrigin(), GetAbsOrigin() - Vector(0,0,20), MASK_SOLID, this, COLLISION_GROUP_NONE, &trace ); if ( trace.fraction < 1.0 ) { UTIL_DecalTrace( &trace, "SmallScorch" ); } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CNPC_Monster::PrescheduleThink( void ) { bool bNearEnemy = false; if ( GetEnemy() != NULL ) { float flDist = (GetEnemy()->GetAbsOrigin() - GetAbsOrigin()).Length(); if ( flDist < ZOMBIE_ENEMY_BREATHE_DIST ) { bNearEnemy = true; } } if ( bNearEnemy ) { if ( !m_bNearEnemy ) { m_bNearEnemy = true; } } else if ( m_bNearEnemy ) { m_bNearEnemy = false; } BaseClass::PrescheduleThink(); // We're chopped off! And we're moving! Add some blood trail... if (m_fIsTorso && IsMoving() && (m_flLastBloodTrail < gpGlobals->curtime)) { m_flLastBloodTrail = gpGlobals->curtime + 1.0f; // We don't want to spam blood all over the place. trace_t tr; UTIL_TraceLine((GetAbsOrigin() + Vector(0, 0, 50)), (GetAbsOrigin() + Vector(0, 0, -300)), MASK_ALL, this, COLLISION_GROUP_NONE, &tr); UTIL_DecalTrace(&tr, "Blood"); } }
void CBigMomma :: LayHeadcrab( void ) { CBaseEntity *pChild = CBaseEntity::Create( BIG_CHILDCLASS, pev->origin, pev->angles, edict() ); pChild->pev->spawnflags |= SF_MONSTER_FALL_TO_GROUND; // Is this the second crab in a pair? if ( HasMemory( bits_MEMORY_CHILDPAIR ) ) { m_crabTime = gpGlobals->time + RANDOM_FLOAT( 5, 10 ); Forget( bits_MEMORY_CHILDPAIR ); } else { m_crabTime = gpGlobals->time + RANDOM_FLOAT( 0.5, 2.5 ); Remember( bits_MEMORY_CHILDPAIR ); } TraceResult tr; UTIL_TraceLine( pev->origin, pev->origin - Vector(0,0,100), ignore_monsters, edict(), &tr); UTIL_DecalTrace( &tr, DECAL_MOMMABIRTH ); EMIT_SOUND_DYN( edict(), CHAN_WEAPON, RANDOM_SOUND_ARRAY(pBirthSounds), 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); m_crabCount++; }
void CGrenadeSpit::GrenadeSpitTouch( CBaseEntity *pOther ) { if (m_fSpitDeathTime != 0) { return; } if ( pOther->GetCollisionGroup() == HL2COLLISION_GROUP_SPIT) { return; } if ( !pOther->m_takedamage ) { // make a splat on the wall trace_t tr; UTIL_TraceLine( GetAbsOrigin(), GetAbsOrigin() + GetAbsVelocity() * 10, MASK_SOLID, this, COLLISION_GROUP_NONE, &tr ); UTIL_DecalTrace(&tr, "BeerSplash" ); // make some flecks // CPVSFilter filter( tr.endpos ); //te->SpriteSpray( filter, 0.0, // tr.endpos, tr.plane.normal, m_nSquidSpitSprite, 30, 0.8, 5 ); } else { RadiusDamage ( CTakeDamageInfo( this, GetThrower(), m_flDamage, DMG_BLAST ), GetAbsOrigin(), m_DmgRadius, CLASS_NONE, NULL ); } Detonate(); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CDODBaseRocket::Explode( void ) { // Don't explode against the skybox. Just pretend that // the missile flies off into the distance. Vector vecForward = GetAbsVelocity(); trace_t tr; UTIL_TraceLine( GetAbsOrigin(), GetAbsOrigin() + 60*vecForward, MASK_SHOT, this, COLLISION_GROUP_NONE, &tr ); m_takedamage = DAMAGE_NO; if( tr.fraction == 1.0 || !(tr.surface.flags & SURF_SKY) ) { DoExplosion(); if ( !tr.m_pEnt->IsPlayer() ) UTIL_DecalTrace( &tr, "Scorch" ); } if( m_hRocketTrail ) { m_hRocketTrail->SetLifetime(0.1f); m_hRocketTrail = NULL; } StopSound( "Weapon_Bazooka.Shoot" ); UTIL_Remove( this ); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeaponGauss::DoWallBreak(Vector startPos, Vector endPos, Vector aimDir, trace_t *ptr, CBasePlayer *pOwner, bool m_bBreakAll){ trace_t *temp = ptr; if(m_bBreakAll){ Vector tempPos = endPos; Vector beamStart = startPos; int x=0; while(DidPunchThrough(ptr)){ temp = ptr; if(x==0){ UTIL_TraceLine( startPos, tempPos, MASK_SHOT, pOwner, COLLISION_GROUP_NONE, ptr ); x = 1; } else{ UTIL_TraceLine( endPos, startPos, MASK_SHOT, pOwner, COLLISION_GROUP_NONE, ptr ); x = 0; } if(ptr->DidHitWorld() && ptr->surface.flags != SURF_SKY){ UTIL_ImpactTrace( ptr, GetAmmoDef()->DamageType(m_iPrimaryAmmoType), "ImpactGauss" ); UTIL_DecalTrace( ptr, "RedGlowFade" ); } startPos= ptr->endpos; tempPos = ptr->endpos + ( aimDir * MAX_TRACE_LENGTH + aimDir * 128.0f ); } //DrawBeam( beamStart, ptr->startpos, 4.0, false ); } else{ UTIL_TraceLine( startPos, endPos, MASK_SHOT, pOwner, COLLISION_GROUP_NONE, ptr ); //Trace from gun to wall } if(!DidPunchThrough(ptr)){ ptr = temp; return; } }
void CGrenade::SG_Explode( TraceResult *pTrace, int bitsDamageType ) { pev->model = iStringNull; // invisible pev->solid = SOLID_NOT; // intangible pev->takedamage = DAMAGE_NO; if( pTrace->flFraction != 1.0 ) { pev->origin = pTrace->vecEndPos + ( pTrace->vecPlaneNormal * ( pev->dmg - 24 ) * 0.6 ); } CSoundEnt::InsertSound( bits_SOUND_COMBAT, pev->origin, NORMAL_EXPLOSION_VOLUME, 3.0 ); pev->owner = NULL; UTIL_DecalTrace( pTrace, RANDOM_FLOAT( 0 , 1 ) < 0.5 ? DECAL_SCORCH1 : DECAL_SCORCH2 ); if( RANDOM_LONG( 0, 1 ) ) EMIT_SOUND( ENT( pev ), CHAN_VOICE, "weapons/flashbang-1.wav", 0.55, ATTN_NORM ); else EMIT_SOUND( ENT( pev ), CHAN_VOICE, "weapons/flashbang-2.wav", 0.55, ATTN_NORM ); SetThink( &CGrenade::SG_Smoke ); pev->nextthink = gpGlobals->time + 0.1; if( UTIL_PointContents( pev->origin ) != CONTENTS_WATER ) { int sparkCount = RANDOM_LONG( 0, 3 ); for( int i = 0; i < sparkCount; i++ ) { Create( "spark_shower", pev->origin, pTrace->vecPlaneNormal, NULL ); } } }
void CGrenade::Explode(TraceResult *pTrace, int bitsDamageType) { pev->model = 0; pev->solid = SOLID_NOT; pev->takedamage = DAMAGE_NO; if (pTrace->flFraction != 1) pev->origin = pTrace->vecEndPos + (pTrace->vecPlaneNormal * (pev->dmg - 24) * 0.6); int iContents = UTIL_PointContents(pev->origin); CSoundEnt::InsertSound(bits_SOUND_COMBAT, pev->origin, NORMAL_EXPLOSION_VOLUME, 3); entvars_t *pevOwner; if (pev->owner) pevOwner = VARS(pev->owner); else pevOwner = NULL; pev->owner = NULL; RadiusFlash(pev->origin, pev, pevOwner, 4); if (RANDOM_FLOAT(0, 1) < 0.5) UTIL_DecalTrace(pTrace, DECAL_SCORCH1); else UTIL_DecalTrace(pTrace, DECAL_SCORCH2); float flRndSound = RANDOM_FLOAT(0, 1); switch (RANDOM_LONG(0, 1)) { case 0: EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/flashbang-1.wav", 0.55, ATTN_NORM); break; case 1: EMIT_SOUND(ENT(pev), CHAN_VOICE, "weapons/flashbang-2.wav", 0.55, ATTN_NORM); break; } pev->effects |= EF_NODRAW; SetThink(&CGrenade::Smoke); pev->velocity = g_vecZero; pev->nextthink = gpGlobals->time + 0.3; if (iContents != CONTENTS_WATER) { int sparkCount = RANDOM_LONG(0, 3); for (int i = 0; i < sparkCount; i++) Create("spark_shower", pev->origin, pTrace->vecPlaneNormal, NULL); } }
void CGrenade::Explode( TraceResult* pTrace, int bitsDamageType ) { pev->model = iStringNull; // invisible pev->solid = SOLID_NOT; // intangible pev->takedamage = DAMAGE_NO; if( pTrace->flFraction != 1.0 ) { pev->origin = pTrace->vecEndPos + ( pTrace->vecPlaneNormal * ( pev->dmg - 24 ) * 0.6 ); } bool isInWater = UTIL_PointContents( pev->origin ) == CONTENTS_WATER; CSoundEnt::InsertSound( bits_SOUND_COMBAT, pev->origin, NORMAL_EXPLOSION_VOLUME, 3.0 ); entvars_t *pevOwner; if ( pev->owner ) pevOwner = VARS( pev->owner ); else pevOwner = NULL; pev->owner = NULL; // Can't traceline attack owner if this is set. // TODO: Implements this. // TheBots->OnEvent( EVENT_FLASHBANG_EXPLODED, pevOwner, NULL ); // TODO: Implements this. // RadiusFlash( pev->origin, pev, pevOwner, 4.0 ); UTIL_DecalTrace( pTrace, RANDOM_FLOAT( 0 , 1 ) < 0.5 ? DECAL_SCORCH1 : DECAL_SCORCH2 ); switch ( RANDOM_LONG( 0, 2 ) ) { case 0: EMIT_SOUND( ENT( pev ), CHAN_VOICE, "weapons/flashbang-1", 0.55, ATTN_NORM ); break; case 1: EMIT_SOUND( ENT( pev ), CHAN_VOICE, "weapons/flashbang-2", 0.55, ATTN_NORM ); break; } pev->effects |= EF_NODRAW; SetThink( &CGrenade::Smoke ); pev->velocity = g_vecZero; pev->nextthink = gpGlobals->time + 0.3; if( !isInWater ) { int sparkCount = RANDOM_LONG( 0, 3 ); for( int i = 0; i < sparkCount; i++ ) { Create( "spark_shower", pev->origin, pTrace->vecPlaneNormal, NULL ); } } }
void CShockBeam::BallTouch( CBaseEntity* pOther ) { if( pOther->GetTakeDamageMode() != DAMAGE_NO ) { TraceResult tr = UTIL_GetGlobalTrace(); CBaseEntity* pOwner = GetOwner(); g_MultiDamage.Clear(); int bitsDamageTypes = DMG_ALWAYSGIB | DMG_SHOCK; if( CBaseMonster* pMonster = pOther->MyMonsterPointer() ) { bitsDamageTypes = 64; if( pMonster->m_flShockDuration > 1.0 ) { bitsDamageTypes = 8192; } pMonster->AddShockEffect( 63, 152, 208, 16, 0.5 ); } pOther->TraceAttack( CTakeDamageInfo( pOwner, bIsMultiplayer() ? gSkillData.GetPlrDmgShockRoachM() : gSkillData.GetPlrDmgShockRoachS(), bitsDamageTypes ), GetAbsVelocity().Normalize(), &tr ); g_MultiDamage.ApplyMultiDamage( this, pOwner ); SetAbsVelocity( g_vecZero ); } SetThink( &CShockBeam::ExplodeThink ); SetNextThink( gpGlobals->time + 0.01 ); if( pOther->GetTakeDamageMode() == DAMAGE_NO ) { TraceResult tr; UTIL_TraceLine( GetAbsOrigin(), GetAbsOrigin() + GetAbsVelocity() * 10, dont_ignore_monsters, edict(), &tr ); UTIL_DecalTrace( &tr, DECAL_OFSCORCH1 + UTIL_RandomLong( 0, 2 ) ); MESSAGE_BEGIN( MSG_PAS, SVC_TEMPENTITY, GetAbsOrigin() ); WRITE_BYTE( TE_SPARKS ); WRITE_COORD_VECTOR( GetAbsOrigin() ); MESSAGE_END(); } }
void CMGargantua :: FlameUpdate( void ) { int i; static float offset[2] = { 60, -60 }; TraceResult trace; Vector vecStart, angleGun; BOOL streaks = FALSE; for ( i = 0; i < 2; i++ ) { if ( m_pFlame[i] ) { Vector vecAim = pev->angles; vecAim.x += m_flameX; vecAim.y += m_flameY; UTIL_MakeVectors( vecAim ); GetAttachment( i+1, vecStart, angleGun ); Vector vecEnd = vecStart + (gpGlobals->v_forward * GARG_FLAME_LENGTH); // - offset[i] * gpGlobals->v_right; UTIL_TraceLine( vecStart, vecEnd, dont_ignore_monsters, edict(), &trace ); m_pFlame[i]->SetStartPos( trace.vecEndPos ); m_pFlame[i+2]->SetStartPos( (vecStart * 0.6) + (trace.vecEndPos * 0.4) ); if ( trace.flFraction != 1.0 && gpGlobals->time > m_streakTime ) { StreakSplash( trace.vecEndPos, trace.vecPlaneNormal, 6, 20, 50, 400 ); streaks = TRUE; UTIL_DecalTrace( &trace, DECAL_SMALLSCORCH1 + RANDOM_LONG(0,2) ); } RadiusDamage( trace.vecEndPos, pev, pev, gSkillData.gargantuaDmgFire, CLASS_ALIEN_MONSTER, DMG_BURN ); FlameDamage( vecStart, trace.vecEndPos, pev, pev, gSkillData.gargantuaDmgFire, CLASS_ALIEN_MONSTER, DMG_BURN ); MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY ); WRITE_BYTE( TE_ELIGHT ); WRITE_SHORT( entindex( ) + 0x1000 * (i + 2) ); // entity, attachment WRITE_COORD( vecStart.x ); // origin WRITE_COORD( vecStart.y ); WRITE_COORD( vecStart.z ); WRITE_COORD( RANDOM_FLOAT( 32, 48 ) ); // radius WRITE_BYTE( 255 ); // R WRITE_BYTE( 255 ); // G WRITE_BYTE( 255 ); // B WRITE_BYTE( 2 ); // life * 10 WRITE_COORD( 0 ); // decay MESSAGE_END(); } } if ( streaks ) m_streakTime = gpGlobals->time; }
void CASW_Barrel_Explosive::DoExplosion() { // scorch the ground trace_t tr; UTIL_TraceLine ( GetAbsOrigin(), GetAbsOrigin() + Vector( 0, 0, -80 ), MASK_SHOT, this, COLLISION_GROUP_NONE, &tr); if ((tr.m_pEnt != GetWorldEntity()) || (tr.hitbox != 0)) { // non-world needs smaller decals if( tr.m_pEnt && !tr.m_pEnt->IsNPC() ) { UTIL_DecalTrace( &tr, "SmallScorch" ); } } else { UTIL_DecalTrace( &tr, "Scorch" ); } UTIL_ASW_ScreenShake( GetAbsOrigin(), 25.0, 150.0, 1.0, 750, SHAKE_START ); // explosion effects Vector vecExplosionPos = GetAbsOrigin(); CPASFilter filter( vecExplosionPos ); UserMessageBegin( filter, "ASWBarrelExplosion" ); WRITE_FLOAT( vecExplosionPos.x ); WRITE_FLOAT( vecExplosionPos.y ); WRITE_FLOAT( vecExplosionPos.z ); WRITE_FLOAT( 160.0f ); MessageEnd(); EmitSound( "ASWBarrel.Explode" ); // damage to nearby things CTakeDamageInfo info( this, ( m_hAttacker.Get() ? m_hAttacker.Get() : this ), m_iExplosionDamage, DMG_BLAST ); info.SetDamageCustom( DAMAGE_FLAG_HALF_FALLOFF ); ASWGameRules()->RadiusDamage( info, GetAbsOrigin(), 160.0f, CLASS_NONE, NULL ); }
void CGrenadeBottle::Detonate( void ) { trace_t trace; UTIL_TraceLine ( GetAbsOrigin(), GetAbsOrigin() + GetAbsVelocity(), MASK_SOLID, this, COLLISION_GROUP_NONE, &trace); UTIL_DecalTrace( &trace, "BeerSplash" ); EmitSound( "GrenadeBottle.Detonate" ); CSoundEnt::InsertSound(SOUND_COMBAT, GetAbsOrigin(), 400, 0.5); UTIL_Remove( this ); }
void CSquidSpit :: Touch ( CBaseEntity *pOther ) { TraceResult tr; int iPitch; // splat sound iPitch = RANDOM_FLOAT( 90, 110 ); EMIT_SOUND_DYN( ENT(pev), CHAN_VOICE, "bullchicken/bc_acid1.wav", 1, ATTN_NORM, 0, iPitch ); switch ( RANDOM_LONG( 0, 1 ) ) { case 0: EMIT_SOUND_DYN( ENT(pev), CHAN_WEAPON, "bullchicken/bc_spithit1.wav", 1, ATTN_NORM, 0, iPitch ); break; case 1: EMIT_SOUND_DYN( ENT(pev), CHAN_WEAPON, "bullchicken/bc_spithit2.wav", 1, ATTN_NORM, 0, iPitch ); break; } if ( !pOther->pev->takedamage ) { // make a splat on the wall UTIL_TraceLine( pev->origin, pev->origin + pev->velocity * 10, dont_ignore_monsters, ENT( pev ), &tr ); UTIL_DecalTrace(&tr, DECAL_SPIT1 + RANDOM_LONG(0,1)); // make some flecks MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, tr.vecEndPos ); WRITE_BYTE( TE_SPRITE_SPRAY ); WRITE_COORD( tr.vecEndPos.x); // pos WRITE_COORD( tr.vecEndPos.y); WRITE_COORD( tr.vecEndPos.z); WRITE_COORD( tr.vecPlaneNormal.x); // dir WRITE_COORD( tr.vecPlaneNormal.y); WRITE_COORD( tr.vecPlaneNormal.z); WRITE_SHORT( iSquidSpitSprite ); // model WRITE_BYTE ( 5 ); // count WRITE_BYTE ( 30 ); // speed WRITE_BYTE ( 80 ); // noise ( client will divide by 100 ) MESSAGE_END(); } else { pOther->TakeDamage ( pev, pev, gSkillData.bullsquidDmgSpit, DMG_GENERIC ); } SetThink ( &CSquidSpit::SUB_Remove ); pev->nextthink = gpGlobals->time; }
void CSquidSpit::Touch ( CBaseEntity *pOther ) { trace_t tr; int iPitch; if ( pOther->GetSolidFlags() & FSOLID_TRIGGER ) return; if ( pOther->GetCollisionGroup() == HL2COLLISION_GROUP_SPIT) { return; } // splat sound iPitch = random->RandomFloat( 90, 110 ); EmitSound( "NPC_BigMomma.SpitTouch1" ); switch ( random->RandomInt( 0, 1 ) ) { case 0: EmitSound( "NPC_BigMomma.SpitHit1" ); break; case 1: EmitSound( "NPC_BigMomma.SpitHit2" ); break; } if ( !pOther->m_takedamage ) { // make a splat on the wall UTIL_TraceLine( GetAbsOrigin(), GetAbsOrigin() + GetAbsVelocity() * 10, MASK_SOLID, this, COLLISION_GROUP_NONE, &tr ); UTIL_DecalTrace(&tr, "BeerSplash" ); // make some flecks CPVSFilter filter( tr.endpos ); te->SpriteSpray( filter, 0.0, &tr.endpos, &tr.plane.normal, m_nSquidSpitSprite, 30, 8, 5 ); } else { CTakeDamageInfo info( this, this, sk_bullsquid_dmg_spit.GetFloat(), DMG_BULLET ); CalculateBulletDamageForce( &info, GetAmmoDef()->Index("9mmRound"), GetAbsVelocity(), GetAbsOrigin() ); pOther->TakeDamage( info ); } UTIL_Remove( m_hSprite ); UTIL_Remove( this ); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTFBaseRocket::Explode( trace_t *pTrace, CBaseEntity *pOther ) { // Save this entity as enemy, they will take 100% damage. m_hEnemy = pOther; // Invisible. SetModelName( NULL_STRING ); AddSolidFlags( FSOLID_NOT_SOLID ); m_takedamage = DAMAGE_NO; // Pull out a bit. if ( pTrace->fraction != 1.0 ) { SetAbsOrigin( pTrace->endpos + ( pTrace->plane.normal * 1.0f ) ); } // Play explosion sound and effect. Vector vecOrigin = GetAbsOrigin(); CPVSFilter filter( vecOrigin ); TE_TFExplosion( filter, 0.0f, vecOrigin, pTrace->plane.normal, GetWeaponID(), pOther->entindex() ); CSoundEnt::InsertSound ( SOUND_COMBAT, vecOrigin, 1024, 3.0 ); // Damage. CBaseEntity *pAttacker = GetOwnerEntity(); IScorer *pScorerInterface = dynamic_cast<IScorer*>( pAttacker ); if ( pScorerInterface ) { pAttacker = pScorerInterface->GetScorer(); } CTakeDamageInfo info( this, pAttacker, vec3_origin, vecOrigin, GetDamage(), GetDamageType() ); float flRadius = GetRadius(); RadiusDamage( info, vecOrigin, flRadius, CLASS_NONE, NULL ); // Debug! if ( tf_rocket_show_radius.GetBool() ) { DrawRadius( flRadius ); } // Don't decal players with scorch. if ( !pOther->IsPlayer() ) { UTIL_DecalTrace( pTrace, "Scorch" ); } // Remove the rocket. UTIL_Remove( this ); }
void CASW_Laser_Mine::Explode( bool bRemove ) { // scorch the ground trace_t tr; UTIL_TraceLine ( GetAbsOrigin(), GetAbsOrigin() + Vector( 0, 0, -80 ), MASK_SHOT, this, COLLISION_GROUP_NONE, &tr); if ((tr.m_pEnt != GetWorldEntity()) || (tr.hitbox != 0)) { // non-world needs smaller decals if( tr.m_pEnt && !tr.m_pEnt->IsNPC() ) { UTIL_DecalTrace( &tr, "SmallScorch" ); } } else { UTIL_DecalTrace( &tr, "Scorch" ); } UTIL_ASW_ScreenShake( GetAbsOrigin(), 25.0, 150.0, 1.0, 750, SHAKE_START ); UTIL_ASW_GrenadeExplosion( GetAbsOrigin(), m_flDamageRadius ); EmitSound( "ASW_Laser_Mine.Explode" ); // damage to nearby things CTakeDamageInfo info( this, GetOwnerEntity(), m_flDamage, DMG_BLAST ); info.SetWeapon( m_hCreatorWeapon ); ASWGameRules()->RadiusDamage( info, GetAbsOrigin(), m_flDamageRadius, CLASS_NONE, NULL ); if ( bRemove ) { UTIL_Remove( this ); } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CPlayer_Missile::BlowUp(void) { // Don't take damage any more m_takedamage = DAMAGE_NO; // Mark as dead so won't be attacked m_lifeState = LIFE_DEAD; // Stop fly and launch sounds StopSound( "Player_Manhack.Fly" ); StopSound( "Player_Manhack.Fire" ); CPASFilter filter( GetAbsOrigin() ); te->Explosion( filter, 0.0, &GetAbsOrigin(), g_sModelIndexFireball, 2.0, 15, TE_EXPLFLAG_NONE, m_flDamageRadius, m_flDamage ); Vector vecForward = GetAbsVelocity(); VectorNormalize(vecForward); trace_t tr; UTIL_TraceLine ( GetAbsOrigin(), GetAbsOrigin() + 60*vecForward, MASK_SOLID_BRUSHONLY, this, COLLISION_GROUP_NONE, &tr); UTIL_DecalTrace( &tr, "Scorch" ); UTIL_ScreenShake( GetAbsOrigin(), 25.0, 150.0, 1.0, 750, SHAKE_START ); CSoundEnt::InsertSound ( SOUND_DANGER, GetAbsOrigin(), 1024, 3.0 ); RadiusDamage ( CTakeDamageInfo( this, this, m_flDamage, DMG_BLAST ), GetAbsOrigin(), m_flDamageRadius, CLASS_NONE ); SetThink(ExplodeThink); SetTouch(NULL); m_vBounceVel = -0.2 * GetAbsVelocity(); AddSolidFlags( FSOLID_NOT_SOLID ); Relink(); // Stop emitting smoke if(m_hSmokeTrail) { ((SmokeTrail*)(CBaseEntity*)m_hSmokeTrail)->SetEmit(false); } }
void CNPC_Gargantua::FlameUpdate( void ) { int i; static float offset[2] = { 60, -60 }; trace_t trace; Vector vecStart; QAngle angleGun; BOOL streaks = FALSE; Vector vForward; for ( i = 0; i < 2; i++ ) { if ( m_pFlame[i] ) { QAngle vecAim = GetAbsAngles(); vecAim.x += -m_flameX; vecAim.y += m_flameY; AngleVectors( vecAim, &vForward ); GetAttachment( i + 2, vecStart, angleGun ); Vector vecEnd = vecStart + ( vForward * GARG_FLAME_LENGTH); // - offset[i] * gpGlobals->v_right; UTIL_TraceLine ( vecStart, vecEnd, MASK_SOLID, this, COLLISION_GROUP_NONE, &trace); m_pFlame[i]->SetStartPos( trace.endpos ); m_pFlame[i+2]->SetStartPos( (vecStart * 0.6) + (trace.endpos * 0.4) ); if ( trace.fraction != 1.0 && gpGlobals->curtime > m_streakTime ) { g_pEffects->Sparks( trace.endpos, 1, 1, &trace.plane.normal ); streaks = TRUE; UTIL_DecalTrace( &trace, "SmallScorch" ); } // RadiusDamage( trace.vecEndPos, pev, pev, gSkillData.gargantuaDmgFire, CLASS_ALIEN_MONSTER, DMG_BURN ); FlameDamage( vecStart, trace.endpos, this, this, sk_gargantua_dmg_fire.GetFloat(), CLASS_ALIEN_MONSTER, DMG_BURN ); CBroadcastRecipientFilter filter; GetAttachment(i + 2, vecStart, angleGun); te->DynamicLight( filter, 0.0, &vecStart, 255, 0, 0, 0, 48, 0.2, 150 ); } } if ( streaks ) m_streakTime = gpGlobals->curtime; }
void CBMortar::Touch( CBaseEntity *pOther ) { trace_t tr; int iPitch; // splat sound iPitch = random->RandomFloat( 90, 110 ); EmitSound( "NPC_BigMomma.SpitTouch1" ); switch ( random->RandomInt( 0, 1 ) ) { case 0: EmitSound( "NPC_BigMomma.SpitHit1" ); break; case 1: EmitSound( "NPC_BigMomma.SpitHit2" ); break; } if ( pOther->IsBSPModel() ) { // make a splat on the wall UTIL_TraceLine( GetAbsOrigin(), GetAbsOrigin() + GetAbsVelocity() * 10, MASK_SOLID, this, COLLISION_GROUP_NONE, &tr ); UTIL_DecalTrace( &tr, "Splash" ); } else { tr.endpos = GetAbsOrigin(); Vector vVelocity = GetAbsVelocity(); VectorNormalize( vVelocity ); tr.plane.normal = -1 * vVelocity; } // make some flecks MortarSpray( tr.endpos + Vector( 0, 0, 15 ), tr.plane.normal, gSpitSprite, 24 ); CBaseEntity *pOwner = GetOwnerEntity(); RadiusDamage( CTakeDamageInfo( this, pOwner, sk_bigmomma_dmg_blast.GetFloat(), DMG_ACID ), GetAbsOrigin(), sk_bigmomma_radius_blast.GetFloat(), CLASS_NONE, NULL ); UTIL_Remove( pSprite ); UTIL_Remove( this ); }
void CMGargantua::StompAttack( void ) { TraceResult trace; UTIL_MakeVectors( pev->angles ); Vector vecStart = pev->origin + Vector(0,0,60) + 35 * gpGlobals->v_forward; Vector vecAim = ShootAtEnemy( vecStart ); Vector vecEnd = (vecAim * 1024) + vecStart; UTIL_TraceLine( vecStart, vecEnd, ignore_monsters, edict(), &trace ); CStomp::StompCreate( vecStart, trace.vecEndPos, 0 ); UTIL_ScreenShake( pev->origin, 12.0, 100.0, 2.0, 1000 ); EMIT_SOUND_DYN ( edict(), CHAN_WEAPON, pStompSounds[ RANDOM_LONG(0,ARRAYSIZE(pStompSounds)-1) ], 1.0, ATTN_GARG, 0, PITCH_NORM + RANDOM_LONG(-10,10) ); UTIL_TraceLine( pev->origin, pev->origin - Vector(0,0,20), ignore_monsters, edict(), &trace ); if ( trace.flFraction < 1.0 ) UTIL_DecalTrace( &trace, DECAL_GARGSTOMP1 ); }
//========================================================= // Touch //========================================================= void CRoach :: Touch ( CBaseEntity *pOther ) { Vector vecSpot; TraceResult tr; if ( pOther->pev->velocity == g_vecZero || !pOther->IsPlayer() ) { return; } vecSpot = pev->origin + Vector ( 0 , 0 , 8 );//move up a bit, and trace down. UTIL_TraceLine ( vecSpot, vecSpot + Vector ( 0, 0, -24 ), ignore_monsters, ENT(pev), & tr); // This isn't really blood. So you don't have to screen it out based on violence levels (UTIL_ShouldShowBlood()) UTIL_DecalTrace( &tr, DECAL_YBLOOD1 +RANDOM_LONG(0,5) ); TakeDamage( pOther->pev, pOther->pev, pev->health, DMG_CRUSH ); }