void CSatchelCharge::SatchelSlide( CBaseEntity *pOther ) { entvars_t *pevOther = pOther->pev; // don't hit the guy that launched this grenade if ( pOther->edict() == pev->owner ) return; // pev->avelocity = Vector (300, 300, 300); pev->gravity = 1;// normal gravity now // HACKHACK - On ground isn't always set, so look for ground underneath TraceResult tr; UTIL_TraceLine( pev->origin, pev->origin - Vector(0,0,10), ignore_monsters, edict(), &tr ); if ( tr.flFraction < 1.0 ) { // add a bit of static friction pev->velocity = pev->velocity * 0.95; pev->avelocity = pev->avelocity * 0.9; // play sliding sound, volume based on velocity } if ( !(pev->flags & FL_ONGROUND) && pev->velocity.Length2D() > 10 ) { BounceSound(); } StudioFrameAdvance( ); }
void CGrenade::BounceTouch( CBaseEntity *pOther ) { // don't hit the guy that launched this grenade if ( pOther->edict() == pev->owner ) return; // only do damage if we're moving fairly fast if (m_flNextAttack < gpGlobals->time && pev->velocity.Length() > 100) { entvars_t *pevOwner = VARS( pev->owner ); if (pevOwner) { TraceResult tr = UTIL_GetGlobalTrace( ); ClearMultiDamage( ); pOther->TraceAttack(pevOwner, 1, gpGlobals->v_forward, &tr, DMG_CLUB ); ApplyMultiDamage( pev, pevOwner); } m_flNextAttack = gpGlobals->time + 1.0; // debounce } Vector vecTestVelocity; // pev->avelocity = Vector (300, 300, 300); // this is my heuristic for modulating the grenade velocity because grenades dropped purely vertical // or thrown very far tend to slow down too quickly for me to always catch just by testing velocity. // trimming the Z velocity a bit seems to help quite a bit. vecTestVelocity = pev->velocity; vecTestVelocity.z *= 0.45; if ( !m_fRegisteredSound && vecTestVelocity.Length() <= 60 ) { //ALERT( at_console, "Grenade Registered!: %f\n", vecTestVelocity.Length() ); // grenade is moving really slow. It's probably very close to where it will ultimately stop moving. // go ahead and emit the danger sound. // register a radius louder than the explosion, so we make sure everyone gets out of the way CSoundEnt::InsertSound ( bits_SOUND_DANGER, pev->origin, pev->dmg / 0.4, 0.3 ); m_fRegisteredSound = TRUE; } if (pev->flags & FL_ONGROUND) { // add a bit of static friction pev->velocity = pev->velocity * 0.8; pev->sequence = RANDOM_LONG( 1, 1 ); } else { // play bounce sound BounceSound(); } pev->framerate = pev->velocity.Length() / 200.0; if (pev->framerate > 1.0) pev->framerate = 1; else if (pev->framerate < 0.5) pev->framerate = 0; }
//----------------------------------------------------------------------------- // Purpose: Make the grenade stick to whatever it touches //----------------------------------------------------------------------------- void CShieldGrenade::StickyTouch( CBaseEntity *pOther ) { if (m_IsDeployed) return; // The touch can get called multiple times - create an ignore case if we // have already stuck. if ( m_LastCollision == GetLocalOrigin() ) return; // Only stick to floors... Vector up( 0, 0, 1 ); if ( DotProduct( GetTouchTrace().plane.normal, up ) < 0.5f ) return; // Only stick to BSP models if ( pOther->IsBSPModel() == false ) return; BounceSound(); SetAbsVelocity( vec3_origin ); SetMoveType( MOVETYPE_NONE ); // Beep EmitSound( "ShieldGrenade.StickBeep" ); // Start ticking... SetThink( BeepThink ); m_IsDeployed = true; SetNextThink( gpGlobals->curtime + 0.01f ); m_flDetonateTime = gpGlobals->curtime + SHIELD_GRENADE_FUSE_TIME; m_LastCollision = GetLocalOrigin(); }
void CGrenade::SlideTouch( CBaseEntity *pOther ) { // don't hit the guy that launched this grenade if( pOther->edict() == pev->owner ) return; // SetLocalAvelocity( Vector( 300, 300, 300 )); if( pev->flags & FL_ONGROUND ) { // add a bit of static friction Vector vecVelocity = GetAbsVelocity(); vecVelocity *= 0.95f; SetAbsVelocity( vecVelocity ); if( vecVelocity.x != 0 || vecVelocity.y != 0 ) { // maintain sliding sound } } else { BounceSound(); } }
void CGrenade::SlideTouch(CBaseEntity *pOther) { if (pOther->edict() == pev->owner) return; if (pev->flags & FL_ONGROUND) pev->velocity = pev->velocity * 0.95; else BounceSound(); }
void CGrenade::BounceTouch( CBaseEntity *pOther ) { if( pOther->edict() == pev->owner ) return; if( FClassnameIs( pOther->pev, "func_breakable" ) && pOther->pev->rendermode ) { pev->velocity = pev->velocity * 0.2; return; } Vector testVelocity; testVelocity = pev->velocity; testVelocity.z *= 0.7; if ( !m_fRegisteredSound && testVelocity.Length() <= 60 ) { CSoundEnt::InsertSound( bits_SOUND_DANGER, pev->origin, ( pev->dmg * 2.5 ), 0.3 ); m_fRegisteredSound = TRUE; } if( pev->flags & FL_ONGROUND ) { pev->velocity = pev->velocity * 0.8; pev->sequence = RANDOM_LONG( 1, 1 ); } else { if( m_iNumBounce < 5) { BounceSound(); } else if( m_iNumBounce >= 10 ) { pev->groundentity = ENT( 0 ); pev->flags |= FL_ONGROUND; pev->velocity = g_vecZero; } m_iNumBounce++; } pev->framerate = pev->velocity.Length() / 200.0; if( pev->framerate > 1.0 ) { pev->framerate = 1; } else if( pev->framerate < 0.5 ) { pev->framerate = 0; } }
void CGrenade::SlideTouch( CBaseEntity *pOther ) { // don't hit the guy that launched this grenade if( pOther->edict() == pev->owner ) return; // pev->avelocity = Vector( 300, 300, 300 ); if( pev->flags & FL_ONGROUND ) { // add a bit of static friction pev->velocity = pev->velocity * 0.95; if( pev->velocity.x != 0 || pev->velocity.y != 0 ) { // maintain sliding sound } } else { BounceSound(); } }
void CBaseGrenade::SlideTouch( CBaseEntity *pOther ) { // don't hit the guy that launched this grenade if ( pOther == GetThrower() ) return; // m_vecAngVelocity = Vector (300, 300, 300); if (GetFlags() & FL_ONGROUND) { // add a bit of static friction // SetAbsVelocity( GetAbsVelocity() * 0.95 ); if (GetAbsVelocity().x != 0 || GetAbsVelocity().y != 0) { // maintain sliding sound } } else { BounceSound(); } }
void CBaseGrenadeProjectile::ResolveFlyCollisionCustom( trace_t &trace, Vector &vecVelocity ) { //Assume all surfaces have the same elasticity float flSurfaceElasticity = 1.0; //Don't bounce off of players with perfect elasticity if( trace.m_pEnt && trace.m_pEnt->IsPlayer() ) { flSurfaceElasticity = 0.3; } // if its breakable glass and we kill it, don't bounce. // give some damage to the glass, and if it breaks, pass // through it. bool breakthrough = false; if( trace.m_pEnt && FClassnameIs( trace.m_pEnt, "func_breakable" ) ) { breakthrough = true; } if( trace.m_pEnt && FClassnameIs( trace.m_pEnt, "func_breakable_surf" ) ) { breakthrough = true; } if (breakthrough) { CTakeDamageInfo info( this, this, 10, DMG_CLUB ); trace.m_pEnt->DispatchTraceAttack( info, GetAbsVelocity(), &trace ); ApplyMultiDamage(); if( trace.m_pEnt->m_iHealth <= 0 ) { // slow our flight a little bit Vector vel = GetAbsVelocity(); vel *= 0.4; SetAbsVelocity( vel ); return; } } float flTotalElasticity = GetElasticity() * flSurfaceElasticity; flTotalElasticity = clamp( flTotalElasticity, 0.0f, 0.9f ); // NOTE: A backoff of 2.0f is a reflection Vector vecAbsVelocity; PhysicsClipVelocity( GetAbsVelocity(), trace.plane.normal, vecAbsVelocity, 2.0f ); vecAbsVelocity *= flTotalElasticity; // Get the total velocity (player + conveyors, etc.) VectorAdd( vecAbsVelocity, GetBaseVelocity(), vecVelocity ); float flSpeedSqr = DotProduct( vecVelocity, vecVelocity ); // Stop if on ground. if ( trace.plane.normal.z > 0.7f ) // Floor { // Verify that we have an entity. CBaseEntity *pEntity = trace.m_pEnt; Assert( pEntity ); SetAbsVelocity( vecAbsVelocity ); if ( flSpeedSqr < ( 30 * 30 ) ) { if ( pEntity->IsStandable() ) { SetGroundEntity( pEntity ); } // Reset velocities. SetAbsVelocity( vec3_origin ); SetLocalAngularVelocity( vec3_angle ); //align to the ground so we're not standing on end QAngle angle; VectorAngles( trace.plane.normal, angle ); // rotate randomly in yaw angle[1] = random->RandomFloat( 0, 360 ); // TODO: rotate around trace.plane.normal SetAbsAngles( angle ); } else { Vector vecDelta = GetBaseVelocity() - vecAbsVelocity; Vector vecBaseDir = GetBaseVelocity(); VectorNormalize( vecBaseDir ); float flScale = vecDelta.Dot( vecBaseDir ); VectorScale( vecAbsVelocity, ( 1.0f - trace.fraction ) * gpGlobals->frametime, vecVelocity ); VectorMA( vecVelocity, ( 1.0f - trace.fraction ) * gpGlobals->frametime, GetBaseVelocity() * flScale, vecVelocity ); PhysicsPushEntity( vecVelocity, &trace ); } } else { // If we get *too* slow, we'll stick without ever coming to rest because // we'll get pushed down by gravity faster than we can escape from the wall. if ( flSpeedSqr < ( 30 * 30 ) ) { // Reset velocities. SetAbsVelocity( vec3_origin ); SetLocalAngularVelocity( vec3_angle ); } else { SetAbsVelocity( vecAbsVelocity ); } } BounceSound(); }
void CBaseGrenade::BounceTouch( CBaseEntity *pOther ) { if ( pOther->IsSolidFlagSet(FSOLID_TRIGGER | FSOLID_VOLUME_CONTENTS) ) return; // don't hit the guy that launched this grenade if ( pOther == GetThrower() ) return; // only do damage if we're moving fairly fast if ( (pOther->m_takedamage != DAMAGE_NO) && (m_flNextAttack < gpGlobals->curtime && GetAbsVelocity().Length() > 100)) { if (m_hThrower) { #if !defined( CLIENT_DLL ) trace_t tr; tr = CBaseEntity::GetTouchTrace( ); ClearMultiDamage( ); Vector forward; AngleVectors( GetLocalAngles(), &forward, NULL, NULL ); CTakeDamageInfo info( this, m_hThrower, 1, DMG_CLUB ); CalculateMeleeDamageForce( &info, GetAbsVelocity(), GetAbsOrigin() ); pOther->DispatchTraceAttack( info, forward, &tr ); ApplyMultiDamage(); #endif } m_flNextAttack = gpGlobals->curtime + 1.0; // debounce } Vector vecTestVelocity; // m_vecAngVelocity = Vector (300, 300, 300); // this is my heuristic for modulating the grenade velocity because grenades dropped purely vertical // or thrown very far tend to slow down too quickly for me to always catch just by testing velocity. // trimming the Z velocity a bit seems to help quite a bit. vecTestVelocity = GetAbsVelocity(); vecTestVelocity.z *= 0.45; if ( !m_bHasWarnedAI && vecTestVelocity.Length() <= 60 ) { // grenade is moving really slow. It's probably very close to where it will ultimately stop moving. // emit the danger sound. // register a radius louder than the explosion, so we make sure everyone gets out of the way #if !defined( CLIENT_DLL ) CSoundEnt::InsertSound ( SOUND_DANGER, GetAbsOrigin(), m_flDamage / 0.4, 0.3, this ); #endif m_bHasWarnedAI = true; } if (GetFlags() & FL_ONGROUND) { // add a bit of static friction // SetAbsVelocity( GetAbsVelocity() * 0.8 ); // SetSequence( random->RandomInt( 1, 1 ) ); // FIXME: missing tumble animations } else { // play bounce sound BounceSound(); } m_flPlaybackRate = GetAbsVelocity().Length() / 200.0; if (GetPlaybackRate() > 1.0) m_flPlaybackRate = 1; else if (GetPlaybackRate() < 0.5) m_flPlaybackRate = 0; }
void CGrenade::BounceTouch( CBaseEntity *pOther ) { // don't hit the guy that launched this grenade if ( pOther->edict() == pev->owner ) return; // Grenades to tend to get "stuck" on sloped surfaces due to the HL physics // system, so move it away from whatever we're colliding with. // Get the surface normal. Vector theVelocityDirection; VectorCopy(pev->velocity, theVelocityDirection); VectorNormalize(theVelocityDirection); Vector theTraceStart; Vector theTraceEnd; VectorMA(pev->origin, -10, theVelocityDirection, theTraceStart); VectorMA(pev->origin, 10, theVelocityDirection, theTraceEnd); TraceResult tr; UTIL_TraceLine(theTraceStart, theTraceEnd, dont_ignore_monsters, dont_ignore_glass, ENT(pev), &tr); if (tr.flFraction < 1) // Should always be the case. { VectorMA(pev->origin, 2, tr.vecPlaneNormal, pev->origin); UTIL_SetOrigin(pev, pev->origin); } // only do damage if we're moving fairly fast if (m_flNextAttack < gpGlobals->time && pev->velocity.Length() > 100) { entvars_t *pevOwner = VARS( pev->owner ); if (pevOwner) { TraceResult tr = UTIL_GetGlobalTrace( ); ClearMultiDamage( ); pOther->TraceAttack(pevOwner, 1, gpGlobals->v_forward, &tr, this->m_damageType); ApplyMultiDamage( pev, pevOwner); } m_flNextAttack = gpGlobals->time + 1.0; // debounce } Vector vecTestVelocity; // pev->avelocity = Vector (300, 300, 300); float theDamageModifier; int theUpgradeLevel = AvHPlayerUpgrade::GetWeaponUpgrade(this->pev->iuser3, this->pev->iuser4, &theDamageModifier); int theDamage = this->pev->dmg*theDamageModifier; // this is my heuristic for modulating the grenade velocity because grenades dropped purely vertical // or thrown very far tend to slow down too quickly for me to always catch just by testing velocity. // trimming the Z velocity a bit seems to help quite a bit. vecTestVelocity = pev->velocity; vecTestVelocity.z *= 0.45; if ( !m_fRegisteredSound && vecTestVelocity.Length() <= 60 ) { //ALERT( at_console, "Grenade Registered!: %f\n", vecTestVelocity.Length() ); // grenade is moving really slow. It's probably very close to where it will ultimately stop moving. // go ahead and emit the danger sound. // register a radius louder than the explosion, so we make sure everyone gets out of the way CSoundEnt::InsertSound ( bits_SOUND_DANGER, pev->origin, theDamage / 0.4, 0.3 ); m_fRegisteredSound = TRUE; } if (pev->flags & FL_ONGROUND) { // add a bit of static friction pev->velocity = pev->velocity * 0.8; pev->sequence = 0;//RANDOM_LONG( 1, 1 ); } else { // play bounce sound BounceSound(); } pev->framerate = pev->velocity.Length() / 200.0; if (pev->framerate > 1.0) pev->framerate = 1; else if (pev->framerate < 0.5) pev->framerate = 0; pev->velocity = pev->velocity * 0.8; }
//----------------------------------------------------------------------------- // Purpose: // Input : // Output : //----------------------------------------------------------------------------- void CSatchelCharge::SatchelTouch( CBaseEntity *pOther ) { Assert( pOther ); if ( !pOther->IsSolid() ) return; // If successfully thrown and touching the // NPC that released this grenade, pick it up if ( pOther == GetThrower() && GetOwnerEntity() == NULL ) { CBasePlayer *pPlayer = ToBasePlayer( m_pMyWeaponSLAM->GetOwner() ); if (pPlayer) { // Give the player ammo pPlayer->GiveAmmo(1, m_pMyWeaponSLAM->m_iSecondaryAmmoType); CPASAttenuationFilter filter( pPlayer, "SatchelCharge.Pickup" ); EmitSound( filter, pPlayer->entindex(), "SatchelCharge.Pickup" ); m_bIsLive = false; // Take weapon out of detonate mode if necessary if (!m_pMyWeaponSLAM->AnyUndetonatedCharges()) { m_pMyWeaponSLAM->m_bDetonatorArmed = false; m_pMyWeaponSLAM->m_bNeedDetonatorHolster = true; // Put detonator away right away m_pMyWeaponSLAM->SetWeaponIdleTime( gpGlobals->curtime ); } // Kill any sliding sound KillSlideSound(); // Remove satchel charge from world UTIL_Remove( this ); return; } } StudioFrameAdvance( ); // Is it attached to a wall? if (m_bIsAttached) { return; } SetGravity( 1 );// normal gravity now // HACKHACK - On ground isn't always set, so look for ground underneath trace_t tr; UTIL_TraceLine( GetAbsOrigin(), GetAbsOrigin() - Vector(0,0,10), MASK_SOLID_BRUSHONLY, this, COLLISION_GROUP_NONE, &tr ); if ( tr.fraction < 1.0 ) { // add a bit of static friction SetAbsVelocity( GetAbsVelocity() * 0.85 ); SetLocalAngularVelocity( GetLocalAngularVelocity() * 0.8 ); } UpdateSlideSound(); if (m_bInAir) { BounceSound(); m_bInAir = false; } }