/* * CG_Fire_SpiralPattern */ static void CG_Fire_SpiralPattern( vec3_t start, vec3_t dir, int *seed, int ignore, int count, int spread, int range, void ( *impact )(trace_t *tr) ) { int i; float r; float u; trace_t trace, *water_trace; assert( seed ); for( i = 0; i < count; i++ ) { r = cos( *seed + i ) * spread * i; u = sin( *seed + i ) * spread * i; water_trace = GS_TraceBullet( &trace, start, dir, r, u, range, ignore, 0 ); if( water_trace ) { trace_t *tr = water_trace; if( !VectorCompare( tr->endpos, start ) ) CG_LeadWaterSplash( tr ); } if( trace.ent != -1 && !( trace.surfFlags & SURF_NOIMPACT ) ) impact( &trace ); if( water_trace ) CG_LeadBubbleTrail( &trace, water_trace->endpos ); } }
void G_Fire_SpiralPattern( edict_t *self, vec3_t start, vec3_t dir, int *seed, int count, int spread, int range, float damage, int kick, int stun, int dflags, int mod, int timeDelta ) { int i; float r; float u; trace_t trace; for( i = 0; i < count; i++ ) { r = cos( *seed + i ) * spread * i; u = sin( *seed + i ) * spread * i; GS_TraceBullet( &trace, start, dir, r, u, range, ENTNUM( self ), timeDelta ); if( trace.ent != -1 ) { if( game.edicts[trace.ent].takedamage ) { G_Damage( &game.edicts[trace.ent], self, self, dir, dir, trace.endpos, damage, kick, stun, dflags, mod ); } else { if( !( trace.surfFlags & SURF_NOIMPACT ) ) { } } } } }
//Sunflower spiral with Fibonacci numbers static void G_Fire_SunflowerPattern( edict_t *self, vec3_t start, vec3_t dir, int *seed, int count, int hspread, int vspread, int range, float damage, int kick, int stun, int dflags, int mod, int timeDelta ) { int i; float r; float u; float fi; trace_t trace; for( i = 0; i < count; i++ ) { fi = i * 2.4; //magic value creating Fibonacci numbers r = cos( (float)*seed + fi ) * hspread * sqrt(fi); u = sin( (float)*seed + fi ) * vspread * sqrt(fi); GS_TraceBullet( &trace, start, dir, r, u, range, ENTNUM( self ), timeDelta ); if( trace.ent != -1 ) { if( game.edicts[trace.ent].takedamage ) { G_Damage( &game.edicts[trace.ent], self, self, dir, dir, trace.endpos, damage, kick, stun, dflags, mod ); } else { if( !( trace.surfFlags & SURF_NOIMPACT ) ) { } } } } }
/* * W_Fire_Bullet */ void W_Fire_Bullet( edict_t *self, vec3_t start, vec3_t angles, int seed, int range, int spread, float damage, int knockback, int stun, int mod, int timeDelta ) { vec3_t dir; edict_t *event; float r, u; double alpha, s; trace_t trace; int dmgflags = DAMAGE_STUN_CLAMP|DAMAGE_KNOCKBACK_SOFT; if( GS_Instagib() ) damage = 9999; AngleVectors( angles, dir, NULL, NULL ); // send the event event = G_SpawnEvent( EV_FIRE_BULLET, seed, start ); event->s.ownerNum = ENTNUM( self ); event->r.svflags = SVF_TRANSMITORIGIN2; VectorScale( dir, 4096, event->s.origin2 ); // DirToByte is too inaccurate event->s.weapon = WEAP_MACHINEGUN; if( mod == MOD_MACHINEGUN_S ) event->s.weapon |= EV_INVERSE; // circle shape alpha = M_PI * Q_crandom( &seed ); // [-PI ..+PI] s = fabs( Q_crandom( &seed ) ); // [0..1] r = s * cos( alpha ) * spread; u = s * sin( alpha ) * spread; GS_TraceBullet( &trace, start, dir, r, u, range, ENTNUM( self ), timeDelta ); if( trace.ent != -1 ) { if( game.edicts[trace.ent].takedamage ) { G_Damage( &game.edicts[trace.ent], self, self, dir, dir, trace.endpos, damage, knockback, stun, dmgflags, mod ); } else { if( !( trace.surfFlags & SURF_NOIMPACT ) ) { } } } }
static void CG_Event_FireMachinegun( vec3_t origin, vec3_t dir, int weapon, int firemode, int seed, int owner ) { float r, u; double alpha, s; trace_t trace, *water_trace; gs_weapon_definition_t *weapondef = GS_GetWeaponDef( weapon ); firedef_t *firedef = ( firemode ) ? &weapondef->firedef : &weapondef->firedef_weak; int range = firedef->timeout, spread = firedef->spread; // circle shape alpha = M_PI * Q_crandom( &seed ); // [-PI ..+PI] s = fabs( Q_crandom( &seed ) ); // [0..1] r = s * cos( alpha ) * spread; u = s * sin( alpha ) * spread; water_trace = GS_TraceBullet( &trace, origin, dir, r, u, range, owner, 0 ); if( water_trace ) { if( !VectorCompare( water_trace->endpos, origin ) ) CG_LeadWaterSplash( water_trace ); } if( trace.ent != -1 && !( trace.surfFlags & SURF_NOIMPACT ) ) { CG_BulletImpact( &trace ); if( !water_trace ) { if( trace.surfFlags & SURF_FLESH || ( trace.ent > 0 && cg_entities[trace.ent].current.type == ET_PLAYER ) || ( trace.ent > 0 && cg_entities[trace.ent].current.type == ET_CORPSE ) ) { // flesh impact sound } else trap_S_StartFixedSound( CG_MediaSfx( cgs.media.sfxRic[ rand()&2 ] ), trace.endpos, CHAN_AUTO, cg_volume_effects->value, ATTN_STATIC ); } } if( water_trace ) CG_LeadBubbleTrail( &trace, water_trace->endpos ); }
void W_Fire_RandomBucket( edict_t *self, vec3_t start, vec3_t fv, vec3_t rv, vec3_t uv, int *seed, int count, int hspread, int vspread, int range, float damage, int kick, int stun, int dflags, int mod, int timeDelta ) { int i; float r; float u; trace_t trace; for( i = 0; i < count; i++ ) { r = Q_crandom( seed ) * hspread; u = Q_crandom( seed ) * vspread; GS_TraceBullet( &trace, start, fv, rv, uv, r, u, range, ENTNUM( self ), timeDelta ); if( trace.ent != -1 ) { if( game.edicts[trace.ent].takedamage ) { G_Damage( &game.edicts[trace.ent], self, self, fv, fv, trace.endpos, damage, kick, stun, dflags, mod ); } else { if( !( trace.surfFlags & SURF_NOIMPACT ) ) { } } } } }
/* * W_Fire_Bullet */ void W_Fire_Bullet( edict_t *self, vec3_t start, vec3_t fv, vec3_t rv, vec3_t uv, int seed, int range, int hspread, int vspread, float damage, int knockback, int stun, int mod, int timeDelta ) { edict_t *event; float r, u; double alpha, s; trace_t trace; int dmgflags = DAMAGE_STUN_CLAMP | DAMAGE_KNOCKBACK_SOFT; if( GS_Instagib() ) { damage = 9999; } // send the event event = G_SpawnEvent( EV_FIRE_BULLET, seed, start ); event->s.ownerNum = ENTNUM( self ); VectorCopy( fv, event->s.origin2 ); VectorCopy( rv, event->s.origin3 ); event->s.weapon = WEAP_MACHINEGUN; event->s.firemode = ( mod == MOD_MACHINEGUN_S ) ? FIRE_MODE_STRONG : FIRE_MODE_WEAK; // circle shape alpha = M_PI * Q_crandom( &seed ); // [-PI ..+PI] s = fabs( Q_crandom( &seed ) ); // [0..1] r = s * cos( alpha ) * hspread; u = s * sin( alpha ) * vspread; GS_TraceBullet( &trace, start, fv, rv, uv, r, u, range, ENTNUM( self ), timeDelta ); if( trace.ent != -1 ) { if( game.edicts[trace.ent].takedamage ) { G_Damage( &game.edicts[trace.ent], self, self, fv, fv, trace.endpos, damage, knockback, stun, dmgflags, mod ); } else { if( !( trace.surfFlags & SURF_NOIMPACT ) ) { } } } }