10 a = explosion_v * (explosion_v - target_v);
16 a /= (explosion_v * explosion_v);
23vector explosion_calcpush(
vector explosion_v,
float explosion_m,
vector target_v,
float target_m,
float elasticity)
38 target_m + explosion_m
55 m = 1 / ((1 + 0) * speedfactor - 1);
57 v = explosion_calcpush(explosion_f * speedfactor, m, target_v, 1, 0);
60 LOG_INFOF(
"MASS: %f\nv: %v -> %v\nENERGY BEFORE == %f + %f = %f\nENERGY AFTER >= %f",
62 target_v, target_v + v,
63 target_v * target_v, m * explosion_f * speedfactor * explosion_f * speedfactor, target_v * target_v + m * explosion_f * speedfactor * explosion_f * speedfactor,
64 (target_v + v) * (target_v + v));
77 return v - (v * p) * p;
83 D = q*q/4.0 + p*p*p/27.0;
87 a = 1.0/3.0 * acos(-q/2.0 *
sqrt(-27.0/(p*p*p)));
88 u =
sqrt(-4.0/3.0 * p);
106 return (u >= v) ?
vec3(v, v, u) :
vec3(u, v, v);
114 return vec3(a, a, a);
124 q = (27*a*a*d - 9*a*b*c + 2*b*b*b);
126 v = (v - b *
'1 1 1') * (1.0 / (3.0 * a));
128 v +=
'1 0 -1' * (v.z - v.x);
145 if(preferred_align < 1 || preferred_align > 4)
148 for(
int j = 4; j > 1; --j)
154 if(own.(weaponentity).m_gunalign == j)
156 if(own.(weaponentity).m_gunalign == preferred_align)
157 taken |=
BIT(preferred_align);
160 if(!(taken &
BIT(preferred_align)))
161 return preferred_align;
162 if(!(taken &
BIT(j)))
166 return preferred_align;
176int W_GetGunAlignment(
entity player)
178 int gunalign =
STAT(GUNALIGN, player);
179 if(gunalign < 1 || gunalign > 4)
200 makevectors(
'0 360 0' * (0.75 + (counter - 0.5) / (total - 1)));
205 s *= ((1 - bias) +
random() * bias);
222 makevectors(
'0 360 0' * ((0.25 * ((total + 1) % 2)) + (counter / (total - 1))));
228 s *= ((1 - bias) +
random() * bias);
247 switch (spread_style)
254 return (must_normalize ?
normalize(v1) : v1);
260 sigma = spread * 0.89442719099991587855;
270 return normalize(
dir + (v1 * dx + v2 * dy) * r * sigma);
272 sigma = spread * 0.44721359549996;
280 return (must_normalize ?
normalize(v2) : v2);
282 sigma = spread * 0.44721359549996;
291 sigma = spread * 1.154700538379252;
301 return normalize(
dir + (v1 * dx + v2 * dy) * r * sigma);
303 sigma = spread * 1.095445115010332;
314 return normalize(
dir + (v1 * dx + v2 * dy) * r * sigma);
316 sigma = spread * 1.224744871391589;
327 return normalize(
dir + (v1 * dx + v2 * dy) * r * sigma);
329 error(
"g_projectiles_spread_style must be 0 (sphere), 1 (flattened sphere), 2 (circle), 3 (gauss 3D), 4 (gauss plane), 5 (linear falloff), 6 (quadratic falloff), 7 (stronger falloff)!");
#define BIT(n)
Only ever assign into the first 24 bits in QC (so max is BIT(23)).
vector cliptoplane(vector v, vector p)
vector solve_cubic_pq(float p, float q)
vector W_CalculateSpreadPattern(int pattern, float bias, int counter, int total)
int W_GunAlign(entity this, int preferred_align)
float explosion_calcpush_getmultiplier(vector explosion_v, vector target_v)
vector findperpendicular(vector v)
vector damage_explosion_calcpush(vector explosion_f, vector target_v, float speedfactor)
vector solve_cubic_abcd(float a, float b, float c, float d)
vector W_CalculateSpread(vector dir, float spread, int spread_style, bool must_normalize)
float autocvar_g_weaponspreadfactor
const float W_SPREAD_GAUSS_MAX_STDEV
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
ERASEABLE float gsl_ran_ugaussian()
Returns a Gaussian random variate, with mean zero and standard deviation sigma 1 From the GNU Scienti...
const int MAX_WEAPONSLOTS
entity weaponentities[MAX_WEAPONSLOTS]