void CTripmineGrenade::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) { auto tripminesDetachable = gameplayMods::tripminesDetachable.isActive<std::string>(); if ( !tripminesDetachable ) { return; } CBasePlayer *player = dynamic_cast<CBasePlayer *>( pActivator ); if ( !player ) { return; } if ( CHalfLifeRules *rules = dynamic_cast< CHalfLifeRules * >( g_pGameRules ) ) { if ( std::string( STRING( pev->targetname ) ).empty() ) { pev->targetname = MAKE_STRING( "detached_tripmine" ); } rules->HookModelIndex( edict() ); } KillBeam(); SetThink( &CTripmineGrenade::SUB_Remove ); pev->nextthink = 0.01f; UTIL_MakeVectors( pev->angles ); CTripmine *tripmine = ( CTripmine * ) CBaseEntity::Create( "weapon_tripmine", pev->origin - gpGlobals->v_up * 2 + gpGlobals->v_forward * 3, pev->angles ); if ( *tripminesDetachable == "instantly" && tripmine->AddToPlayer( player ) ) { UTIL_Remove( tripmine ); } else { tripmine->pev->velocity = gpGlobals->v_forward * 50; } }
void CTripmineGrenade::DelayDeathThink( void ) { KillBeam(); TraceResult tr; UTIL_TraceLine ( pev->origin + m_vecDir * 8, pev->origin - m_vecDir * 64, dont_ignore_monsters, ENT(pev), & tr); Explode( &tr, DMG_BLAST ); }
void CTripmineGrenade::DelayDeathThink( void ) { KillBeam(); trace_t tr; UTIL_TraceLine ( GetAbsOrigin() + m_vecDir * 8, GetAbsOrigin() - m_vecDir * 64, MASK_SOLID, this, COLLISION_GROUP_NONE, & tr); UTIL_ScreenShake( GetAbsOrigin(), 25.0, 150.0, 1.0, 750, SHAKE_START ); ExplosionCreate( GetAbsOrigin() + m_vecDir * 8, GetAbsAngles(), m_hOwner, GetDamage(), 200, SF_ENVEXPLOSION_NOSPARKS | SF_ENVEXPLOSION_NODLIGHTS | SF_ENVEXPLOSION_NOSMOKE, 0.0f, this); UTIL_Remove( this ); }
int CTripmineGrenade :: TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType ) { if (gpGlobals->time < m_flPowerUp && flDamage < pev->health) { // disable // Create( "weapon_tripmine", pev->origin + m_vecDir * 24, pev->angles ); SetThink( SUB_Remove ); pev->nextthink = gpGlobals->time + 0.1; KillBeam(); return FALSE; } return CGrenade::TakeDamage( pevInflictor, pevAttacker, flDamage, bitsDamageType ); }
int CTripmineGrenade::OnTakeDamage_Alive( const CTakeDamageInfo &info ) { if (gpGlobals->curtime < m_flPowerUp && info.GetDamage() < m_iHealth) { // disable // Create( "weapon_tripmine", GetLocalOrigin() + m_vecDir * 24, GetAngles() ); SetThink( &CTripmineGrenade::SUB_Remove ); SetNextThink( gpGlobals->curtime + 0.1f ); KillBeam(); return FALSE; } return BaseClass::OnTakeDamage_Alive( info ); }
void CTripmineGrenade::DelayDeathThink( void ) { KillBeam(); TraceResult tr; UTIL_TraceLine ( pev->origin + m_vecDir * 8, pev->origin - m_vecDir * 64, dont_ignore_monsters, ENT(pev), & tr); Explode( &tr, DMG_BLAST ); if ( CHalfLifeRules *rules = dynamic_cast< CHalfLifeRules * >( g_pGameRules ) ) { if ( std::string( STRING( pev->targetname ) ).empty() ) { pev->targetname = MAKE_STRING( "destroyed_tripmine" ); } rules->HookModelIndex( edict() ); } }
void CTripmineGrenade :: PowerupThink( void ) { TraceResult tr; if (m_hOwner == NULL) { // find an owner edict_t *oldowner = pev->owner; pev->owner = NULL; UTIL_TraceLine( pev->origin + m_vecDir * 8, pev->origin - m_vecDir * 32, dont_ignore_monsters, ENT( pev ), &tr ); if (tr.fStartSolid || (oldowner && tr.pHit == oldowner)) { pev->owner = oldowner; m_flPowerUp += 0.1; pev->nextthink = gpGlobals->time + 0.1; return; } if (tr.flFraction < 1.0) { pev->owner = tr.pHit; m_hOwner = CBaseEntity::Instance( pev->owner ); m_posOwner = m_hOwner->pev->origin; m_angleOwner = m_hOwner->pev->angles; } else { STOP_SOUND( ENT(pev), CHAN_VOICE, "weapons/mine_deploy.wav" ); STOP_SOUND( ENT(pev), CHAN_BODY, "weapons/mine_charge.wav" ); SetThink( SUB_Remove ); pev->nextthink = gpGlobals->time + 0.1; ALERT( at_console, "WARNING:Tripmine at %.0f, %.0f, %.0f removed\n", pev->origin.x, pev->origin.y, pev->origin.z ); KillBeam(); return; } } else if (m_posOwner != m_hOwner->pev->origin || m_angleOwner != m_hOwner->pev->angles) { // disable STOP_SOUND( ENT(pev), CHAN_VOICE, "weapons/mine_deploy.wav" ); STOP_SOUND( ENT(pev), CHAN_BODY, "weapons/mine_charge.wav" ); CBaseEntity *pMine = Create( "weapon_tripmine", pev->origin + m_vecDir * 24, pev->angles ); pMine->pev->spawnflags |= SF_NORESPAWN; SetThink( SUB_Remove ); KillBeam(); pev->nextthink = gpGlobals->time + 0.1; return; } // ALERT( at_console, "%d %.0f %.0f %0.f\n", pev->owner, m_pOwner->pev->origin.x, m_pOwner->pev->origin.y, m_pOwner->pev->origin.z ); if (gpGlobals->time > m_flPowerUp) { // make solid pev->solid = SOLID_BBOX; UTIL_SetOrigin( pev, pev->origin ); MakeBeam( ); // play enabled sound EMIT_SOUND_DYN( ENT(pev), CHAN_VOICE, "weapons/mine_activate.wav", 0.5, ATTN_NORM, 1.0, 75 ); } pev->nextthink = gpGlobals->time + 0.1; }
//------------------------------------------------------------------------------ // Purpose : // Input : // Output : //------------------------------------------------------------------------------ void CGrenadeBeam::GrenadeBeamTouch( CBaseEntity *pOther ) { //--------------------------------------------------------- // Make sure I'm not caught in a corner, if so remove me //--------------------------------------------------------- if (gpGlobals->curtime - m_flLastTouchTime < 0.01) { KillBeam(); return; } m_flLastTouchTime = gpGlobals->curtime; // --------------------------------------- // If I have room for another hit, add it // --------------------------------------- if (m_nNumHits < GRENADEBEAM_MAXHITS) { m_pHitLocation[m_nNumHits] = GetLocalOrigin(); m_nNumHits++; } // Otherwise copy over old hit, and force chaser into last hit position else { m_hBeamChaser->SetLocalOrigin( m_pHitLocation[0] ); for (int i=0;i<m_nNumHits-1;i++) { m_pHitLocation[i] = m_pHitLocation[i+1]; } m_pHitLocation[m_nNumHits-1]=GetLocalOrigin(); } UpdateBeams(); // -------------------------------------- // Smoke or bubbles effect // -------------------------------------- if (UTIL_PointContents ( GetAbsOrigin() ) & MASK_WATER) { UTIL_Bubbles(GetAbsOrigin()-Vector(3,3,3),GetAbsOrigin()+Vector(3,3,3),10); } else { UTIL_Smoke(GetAbsOrigin(), random->RandomInt(5, 10), 10); } // -------------------------------------------- // Play burn sounds // -------------------------------------------- if (pOther->m_takedamage) { pOther->TakeDamage( CTakeDamageInfo( this, this, m_flDamage, DMG_BURN ) ); KillBeam(); return; } EmitSound( "GrenadeBeam.HitSound" ); trace_t tr; Vector vDirection = GetAbsVelocity(); VectorNormalize(vDirection); UTIL_TraceLine( GetAbsOrigin()-vDirection, GetAbsOrigin()+vDirection, MASK_SOLID, NULL, COLLISION_GROUP_NONE, &tr ); UTIL_DecalTrace( &tr, "RedGlowFade" ); UTIL_ImpactTrace( &tr, DMG_ENERGYBEAM ); }