Ejemplo n.º 1
0
// 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);
				}
			}
		}
	}
}
Ejemplo n.º 2
0
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);
	}
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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);
}