/* * GClip_FindRadius * * Returns entities that have origins within a spherical area */ int GClip_FindRadius( vec3_t org, float rad, int *list, int maxcount ) { return GClip_FindBoxInRadius4D( org, rad, list, maxcount, 0 ); }
/* * G_RadiusDamage */ void G_RadiusDamage( edict_t *inflictor, edict_t *attacker, cplane_t *plane, edict_t *ignore, int mod ) { edict_t *ent = NULL; float dmgFrac, kickFrac, damage, knockback, stun; vec3_t pushDir; int timeDelta; float maxdamage, mindamage, maxknockback, minknockback, maxstun, minstun, radius; assert( inflictor ); maxdamage = inflictor->projectileInfo.maxDamage; mindamage = inflictor->projectileInfo.minDamage; maxknockback = inflictor->projectileInfo.maxKnockback; minknockback = inflictor->projectileInfo.minKnockback; maxstun = inflictor->projectileInfo.stun; minstun = 1; radius = inflictor->projectileInfo.radius; if( radius <= 1.0f || ( maxdamage <= 0.0f && maxknockback <= 0.0f ) ) return; clamp_high( mindamage, maxdamage ); clamp_high( minknockback, maxknockback ); clamp_high( minstun, maxstun ); while( ( ent = GClip_FindBoxInRadius4D( ent, inflictor->s.origin, radius, inflictor->timeDelta ) ) != NULL ) { if( ent == ignore || !ent->takedamage ) continue; if( ent == attacker && ent->r.client ) timeDelta = 0; else timeDelta = inflictor->timeDelta; G_SplashFrac4D( ENTNUM( ent ), inflictor->s.origin, radius, pushDir, &kickFrac, &dmgFrac, timeDelta ); damage = max( 0, mindamage + ( ( maxdamage - mindamage ) * dmgFrac ) ); stun = max( 0, minstun + ( ( maxstun - minstun ) * dmgFrac ) ); knockback = max( 0, minknockback + ( ( maxknockback - minknockback ) * kickFrac ) ); // weapon jumps hack : when knockback on self, use strong weapon definition if( ent == attacker && ent->r.client ) { gs_weapon_definition_t *weapondef = NULL; if( inflictor->s.type == ET_ROCKET ) weapondef = GS_GetWeaponDef( WEAP_ROCKETLAUNCHER ); else if( inflictor->s.type == ET_GRENADE ) weapondef = GS_GetWeaponDef( WEAP_GRENADELAUNCHER ); else if( inflictor->s.type == ET_PLASMA ) weapondef = GS_GetWeaponDef( WEAP_PLASMAGUN ); else if( inflictor->s.type == ET_BLASTER ) weapondef = GS_GetWeaponDef( WEAP_GUNBLADE ); if( weapondef ) { G_SplashFrac4D( ENTNUM( ent ), inflictor->s.origin, radius, pushDir, &kickFrac, NULL, 0 ); minknockback = weapondef->firedef.minknockback; maxknockback = weapondef->firedef.knockback; clamp_high( minknockback, maxknockback ); knockback = ( minknockback + ( (float)( maxknockback - minknockback ) * kickFrac ) ) * g_self_knockback->value; damage *= weapondef->firedef.selfdamage; } } if( knockback < 1.0f ) knockback = 0.0f; if( stun < 1.0f ) stun = 0.0f; if( damage <= 0.0f && knockback <= 0.0f && stun <= 0.0f ) continue; if( G_CanSplashDamage( ent, inflictor, plane ) ) G_Damage( ent, inflictor, attacker, pushDir, inflictor->velocity, inflictor->s.origin, damage, knockback, stun, DAMAGE_RADIUS, mod ); } }