// Quake Radius damage void Q_RadiusDamage(CBaseEntity *pInflictor, CBaseEntity *pAttacker, float flDamage, CBaseEntity *pIgnore) { CBaseEntity *pEnt = NULL; while((pEnt = UTIL_FindEntityInSphere(pEnt, pInflictor->pev->origin, flDamage + 40)) != NULL) { if(pEnt != pIgnore) { if(pEnt->pev->takedamage) { Vector vecOrg = pEnt->pev->origin + ((pEnt->pev->mins + pEnt->pev->maxs) * 0.5); float flPoints = 0.5 * (pInflictor->pev->origin - vecOrg).Length(); if(flPoints < 0) flPoints = 0; flPoints = flDamage - flPoints; if(pEnt == pAttacker) flPoints = flPoints * 0.5; if(flPoints > 0) { if(Q_CanDamage(pEnt, pInflictor)) pEnt->TakeDamage(pInflictor->pev, pAttacker->pev, flPoints, DMG_GENERIC); } } } } }
void COgre :: ChainSaw( float side ) { if( m_hEnemy == NULL ) return; if (!Q_CanDamage( m_hEnemy, this )) return; AI_Charge( 10 ); Vector delta = m_hEnemy->pev->origin - pev->origin; if (delta.Length() > 100) return; float ldmg = (RANDOM_FLOAT( 0.0f, 1.0f ) + RANDOM_FLOAT( 0.0f, 1.0f ) + RANDOM_FLOAT( 0.0f, 1.0f )) * 4; m_hEnemy->TakeDamage (pev, pev, ldmg, DMG_GENERIC); if( side ) { UTIL_MakeVectors( pev->angles ); if (side == 1) SpawnMeatSpray (pev->origin + gpGlobals->v_forward * 16, RANDOM_FLOAT( -100.0f, 100.0f ) * gpGlobals->v_right); else SpawnMeatSpray (pev->origin + gpGlobals->v_forward * 16, side * gpGlobals->v_right); } }
BOOL CShambler::MonsterCheckAttack( void ) { if (m_iEnemyRange == RANGE_MELEE) { if (Q_CanDamage (m_hEnemy, this)) { m_iAttackState = ATTACK_MELEE; return TRUE; } } if (gpGlobals->time < m_flAttackFinished) return FALSE; if (!m_fEnemyVisible) return FALSE; // see if any entities are in the way of the shot Vector spot1 = EyePosition(); Vector spot2 = m_hEnemy->EyePosition(); if ((spot1 - spot2).Length() > 600) return FALSE; TraceResult tr; UTIL_TraceLine(spot1, spot2, dont_ignore_monsters, dont_ignore_glass, ENT(pev), &tr); if (tr.fInOpen && tr.fInWater) return FALSE; // sight line crossed contents if (tr.pHit != m_hEnemy->edict()) { return FALSE; // don't have a clear shot } // missile attack if (m_iEnemyRange == RANGE_FAR) return FALSE; m_iAttackState = ATTACK_MISSILE; AttackFinished (2 + RANDOM_FLOAT( 0.0f, 2.0f )); return TRUE; }
void CShambler :: ShamblerSmash( void ) { if (m_hEnemy == NULL) return; AI_Charge(0); Vector delta = m_hEnemy->pev->origin - pev->origin; if (delta.Length() > 100) return; if (!Q_CanDamage (m_hEnemy, this)) return; float ldmg = (RANDOM_FLOAT(0,1) + RANDOM_FLOAT(0,1) + RANDOM_FLOAT(0,1)) * 40; m_hEnemy->TakeDamage( pev, pev, ldmg, DMG_SLASH); EMIT_SOUND( edict(), CHAN_VOICE, "shambler/smack.wav", 1, ATTN_NORM); UTIL_MakeVectors( pev->angles ); SpawnMeatSpray (pev->origin + gpGlobals->v_forward * 16, RANDOM_FLOAT( -100, 100 ) * gpGlobals->v_right); SpawnMeatSpray (pev->origin + gpGlobals->v_forward * 16, RANDOM_FLOAT( -100, 100 ) * gpGlobals->v_right); }