Ejemplo n.º 1
0
/*
=================
LightningDamage
=================
*/
void LightningDamage( vec3_t p1, vec3_t p2, gedict_t * from, float damage )
{
	gedict_t       *e1, *e2;
	vec3_t          f;


	VectorSubtract( p2, p1, f );	// f = p2 - p1;
	VectorNormalize( f );	// normalize (f);

	f[0] = 0 - f[1];
	f[1] = f[0];
	f[2] = 0;
	VectorScale( f, 16, f );	//f = f*16;

	e1 = e2 = world;

	traceline( PASSVEC3( p1 ), PASSVEC3( p2 ), false, self );

	if ( PROG_TO_EDICT( g_globalvars.trace_ent )->s.v.takedamage )
	{
		LightningHit( from, damage );
		if ( streq( self->s.v.classname, "player" ) )
		{
			if ( streq( other->s.v.classname, "player" ) )
				PROG_TO_EDICT( g_globalvars.trace_ent )->s.v.
				    velocity[2] += 400;
		}
	}
	e1 = PROG_TO_EDICT( g_globalvars.trace_ent );

	//traceline (p1 + f, p2 + f, FALSE, self);
	traceline( p1[0] + f[0], p1[1] + f[1], p1[2] + f[2], p2[0] + f[0],
			p2[1] + f[1], p2[2] + f[2], false, self );
	if ( PROG_TO_EDICT( g_globalvars.trace_ent ) != e1
	     && PROG_TO_EDICT( g_globalvars.trace_ent )->s.v.takedamage )
	{
		LightningHit( from, damage );
	}
	e2 = PROG_TO_EDICT( g_globalvars.trace_ent );

	traceline( p1[0] - f[0], p1[1] - f[1], p1[2] - f[2], p2[0] - f[0],
			p2[1] - f[1], p2[2] - f[2], false, self );
	if ( PROG_TO_EDICT( g_globalvars.trace_ent ) != e1
	     && PROG_TO_EDICT( g_globalvars.trace_ent ) != e2
	     && PROG_TO_EDICT( g_globalvars.trace_ent )->s.v.takedamage )
	{
		LightningHit( from, damage );
	}
}
Ejemplo n.º 2
0
// Lightning Damage
void CBasePlayer::LightningDamage(Vector p1, Vector p2, CBaseEntity *pAttacker, float flDamage, Vector vecDir)
{
#if !defined(CLIENT_DLL)
	TraceResult trace;
	Vector      vecThru = (p2 - p1).Normalize();
	vecThru.x           = 0 - vecThru.y;
	vecThru.y           = vecThru.x;
	vecThru.z           = 0;
	vecThru             = vecThru * 16;

	CBaseEntity *pEntity1 = NULL;
	CBaseEntity *pEntity2 = NULL;

	// Hit first target?
	UTIL_TraceLine(p1, p2, dont_ignore_monsters, ENT(pev), &trace);
	CBaseEntity *pEntity = CBaseEntity::Instance(trace.pHit);
	if(pEntity && pEntity->pev->takedamage)
	{
		LightningHit(pEntity, pAttacker, trace.vecEndPos, flDamage, &trace, vecDir);
	}
	pEntity1 = pEntity;

	// Hit second target?
	UTIL_TraceLine(p1 + vecThru, p2 + vecThru, dont_ignore_monsters, ENT(pev), &trace);
	pEntity = CBaseEntity::Instance(trace.pHit);
	if(pEntity && pEntity != pEntity1 && pEntity->pev->takedamage)
	{
		LightningHit(pEntity, pAttacker, trace.vecEndPos, flDamage, &trace, vecDir);
	}
	pEntity2 = pEntity;

	// Hit third target?
	UTIL_TraceLine(p1 - vecThru, p2 - vecThru, dont_ignore_monsters, ENT(pev), &trace);
	pEntity = CBaseEntity::Instance(trace.pHit);
	if(pEntity && pEntity != pEntity1 && pEntity != pEntity2 && pEntity->pev->takedamage)
	{
		LightningHit(pEntity, pAttacker, trace.vecEndPos, flDamage, &trace, vecDir);
	}
#endif
}