void CStomp::Think( void ) { TraceResult tr; pev->nextthink = gpGlobals->time + 0.1; // Do damage for this frame Vector vecStart = GetAbsOrigin(); vecStart.z += 30; Vector vecEnd = vecStart + (pev->movedir * pev->speed * STOMP_FRAMETIME); UTIL_TraceHull( vecStart, vecEnd, dont_ignore_monsters, head_hull, ENT(pev), &tr ); if ( tr.pHit && tr.pHit != pev->owner ) { CBaseEntity *pEntity = CBaseEntity::Instance( tr.pHit ); entvars_t *pevOwner = pev; if ( pev->owner ) pevOwner = VARS(pev->owner); if ( pEntity ) pEntity->TakeDamage( pev, pevOwner, gSkillData.gargantuaDmgStomp, DMG_SONIC ); } // Accelerate the effect pev->speed = pev->speed + (STOMP_FRAMETIME) * pev->framerate; pev->framerate = pev->framerate + (STOMP_FRAMETIME) * 1500; // Move and spawn trails while ( gpGlobals->time - pev->dmgtime > STOMP_INTERVAL ) { SetAbsOrigin( GetAbsOrigin() + pev->movedir * pev->speed * STOMP_INTERVAL ); for ( int i = 0; i < 2; i++ ) { CSprite *pSprite = CSprite::SpriteCreate( GARG_STOMP_SPRITE_NAME, GetAbsOrigin(), TRUE ); if ( pSprite ) { UTIL_TraceLine( GetAbsOrigin(), GetAbsOrigin() - Vector( 0, 0, 500 ), ignore_monsters, edict(), &tr ); pSprite->SetAbsOrigin( tr.vecEndPos ); pSprite->SetAbsVelocity( Vector(RANDOM_FLOAT(-200,200),RANDOM_FLOAT(-200,200),175)); // pSprite->AnimateAndDie( RANDOM_FLOAT( 8.0, 12.0 ) ); pSprite->pev->nextthink = gpGlobals->time + 0.3; pSprite->SetThink( SUB_Remove ); pSprite->SetTransparency( kRenderTransAdd, 255, 255, 255, 255, kRenderFxFadeFast ); } } pev->dmgtime += STOMP_INTERVAL; // Scale has the "life" of this effect pev->scale -= STOMP_INTERVAL * pev->speed; if ( pev->scale <= 0 ) { // Life has run out UTIL_Remove(this); STOP_SOUND( edict(), CHAN_BODY, GARG_STOMP_BUZZ_SOUND ); } } }
void CStomp::Think( void ) { trace_t tr; SetNextThink( gpGlobals->curtime + 0.1 ); // Do damage for this frame Vector vecStart = GetAbsOrigin(); vecStart.z += 30; Vector vecEnd = vecStart + (m_vecMoveDir * m_flSpeed * gpGlobals->frametime); UTIL_TraceHull( vecStart, vecEnd, Vector(-32, -32, -32), Vector(32, 32, 32), MASK_SOLID, m_pOwner, COLLISION_GROUP_NONE, &tr ); // NDebugOverlay::Line( vecStart, vecEnd, 0, 255, 0, false, 10.0f ); if ( tr.m_pEnt ) { CBaseEntity *pEntity = tr.m_pEnt; CTakeDamageInfo info( this, this, 50, DMG_SONIC ); CalculateMeleeDamageForce( &info, m_vecMoveDir, tr.endpos ); pEntity->TakeDamage( info ); } // Accelerate the effect m_flSpeed += (gpGlobals->frametime) * m_uiFramerate; m_uiFramerate += (gpGlobals->frametime) * 2000; // Move and spawn trails while ( gpGlobals->curtime - m_flDmgTime > STOMP_INTERVAL ) { SetAbsOrigin( GetAbsOrigin() + m_vecMoveDir * m_flSpeed * STOMP_INTERVAL ); for ( int i = 0; i < 2; i++ ) { CSprite *pSprite = CSprite::SpriteCreate( GARG_STOMP_SPRITE_NAME, GetAbsOrigin(), TRUE ); if ( pSprite ) { UTIL_TraceLine( GetAbsOrigin(), GetAbsOrigin() - Vector(0,0,500), MASK_SOLID, this, COLLISION_GROUP_NONE, &tr ); pSprite->SetAbsOrigin( tr.endpos ); // pSprite->pev->velocity = Vector(RandomFloat(-200,200),RandomFloat(-200,200),175); pSprite->SetNextThink( gpGlobals->curtime + 0.3 ); pSprite->SetThink( &CSprite::SUB_Remove ); pSprite->SetTransparency( kRenderTransAdd, 255, 255, 255, 255, kRenderFxFadeFast ); } g_pEffects->EnergySplash( tr.endpos, tr.plane.normal ); } m_flDmgTime += STOMP_INTERVAL; // Scale has the "life" of this effect m_flScale -= STOMP_INTERVAL * m_flSpeed; if ( m_flScale <= 0 ) { // Life has run out UTIL_Remove(this); // STOP_SOUND( edict(), CHAN_BODY, GARG_STOMP_BUZZ_SOUND ); CPASAttenuationFilter filter( this ); StopSound( entindex(), CHAN_STATIC, GARG_STOMP_BUZZ_SOUND ); } } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CNPC_AntlionGrub::Spawn( void ) { Precache(); SetModel( ANTLIONGRUB_MODEL ); m_NPCState = NPC_STATE_NONE; m_iHealth = sk_antliongrub_health.GetFloat(); m_iMaxHealth = m_iHealth; m_flFieldOfView = 0.5f; SetSolid( SOLID_BBOX ); SetMoveType( MOVETYPE_NONE ); SetCollisionGroup( COLLISION_GROUP_DEBRIS ); SetHullSizeNormal(); SetHullType( HULL_SMALL_CENTERED ); SetBloodColor( BLOOD_COLOR_YELLOW ); CapabilitiesClear(); m_flNextVoiceChange = gpGlobals->curtime; m_flSquashTime = gpGlobals->curtime; m_flNearTime = gpGlobals->curtime; m_flHealthTime = gpGlobals->curtime; m_flEnemyHostileTime = gpGlobals->curtime; m_bMoving = false; m_bSquashed = false; m_bSquashValid = false; m_bHealing = false; m_nHealthReserve = 10; SetTouch( GrubTouch ); // Attach to the surface under our belly AttachToSurface(); // Use detailed collision because we're an odd shape CollisionProp()->SetSurroundingBoundsType( USE_HITBOXES ); /* CSoundEnvelopeController &controller = CSoundEnvelopeController::GetController(); CPASAttenuationFilter filter( this ); m_pMovementSound = controller.SoundCreate( filter, entindex(), CHAN_BODY, "NPC_Antlion.Movement", 3.9f ); m_pVoiceSound = controller.SoundCreate( filter, entindex(), CHAN_VOICE, "NPC_Antlion.Voice", 3.9f ); m_pHealSound = controller.SoundCreate( filter, entindex(), CHAN_STATIC, "NPC_Antlion.Heal", 3.9f ); controller.Play( m_pMovementSound, 0.0f, 100 ); controller.Play( m_pVoiceSound, 0.0f, 100 ); controller.Play( m_pHealSound, 0.0f, 100 ); */ m_pGlowSprite = CSprite::SpriteCreate( "sprites/blueflare1.vmt", GetLocalOrigin(), false ); Assert( m_pGlowSprite ); if ( m_pGlowSprite == NULL ) return; Vector vecUp; GetVectors( NULL, NULL, &vecUp ); m_pGlowSprite->TurnOn(); m_pGlowSprite->SetTransparency( kRenderWorldGlow, 156, 169, 121, 164, kRenderFxNoDissipation ); m_pGlowSprite->SetAbsOrigin( GetAbsOrigin() + vecUp * 8.0f ); m_pGlowSprite->SetScale( 1.0f ); m_pGlowSprite->SetGlowProxySize( 16.0f ); // We don't want to teleport at this point AddSpawnFlags( SF_NPC_FALL_TO_GROUND ); // We get a bogus error otherwise NPCInit(); AddSolidFlags( FSOLID_TRIGGER ); }