+#include "calculations.qh"
+
// =============================
// Explosion Force Calculation
// =============================
v = explosion_calcpush(explosion_f * speedfactor, m, target_v, 1, 0);
// the factor we then get is:
// 1
- LOG_INFOF("MASS: %f\nv: %v -> %v\nENERGY BEFORE == %f + %f = %f\nENERGY AFTER >= %f\n",
+ LOG_INFOF("MASS: %f\nv: %v -> %v\nENERGY BEFORE == %f + %f = %f\nENERGY AFTER >= %f",
m,
target_v, target_v + v,
target_v * target_v, m * explosion_f * speedfactor * explosion_f * speedfactor, target_v * target_v + m * explosion_f * speedfactor * explosion_f * speedfactor,
// cos(a)
// cos(a + 2pi/3)
// cos(a + 4pi/3)
- return
- u *
- (
- '1 0 0' * cos(a + 2.0/3.0*M_PI)
- +
- '0 1 0' * cos(a + 4.0/3.0*M_PI)
- +
- '0 0 1' * cos(a)
- );
+ return u * vec3(
+ cos(a + 2.0/3.0*M_PI),
+ cos(a + 4.0/3.0*M_PI),
+ cos(a)
+ );
}
else if(D == 0)
{
return '0 0 0';
u = 3*q/p;
v = -u/2;
- if(u >= v)
- return '1 1 0' * v + '0 0 1' * u;
- else
- return '0 1 1' * v + '1 0 0' * u;
+ return (u >= v) ? vec3(v, v, u) : vec3(u, v, v);
}
else
{
// cardano
- u = cbrt(-q/2.0 + sqrt(D));
- v = cbrt(-q/2.0 - sqrt(D));
- return '1 1 1' * (u + v);
+ //u = cbrt(-q/2.0 + sqrt(D));
+ //v = cbrt(-q/2.0 - sqrt(D));
+ a = cbrt(-q/2.0 + sqrt(D)) + cbrt(-q/2.0 - sqrt(D));
+ return vec3(a, a, a);
}
}
vector solve_cubic_abcd(float a, float b, float c, float d)
vector findperpendicular(vector v)
{
- vector p;
- p.x = v.z;
- p.y = -v.x;
- p.z = v.y;
- return normalize(cliptoplane(p, v));
+ return normalize(cliptoplane(vec3(v.z, -v.x, v.y), v));
}
+#ifdef SVQC
+ int W_GunAlign(entity this, int preferred_align)
+ {
+ if(this.m_gunalign)
+ return this.m_gunalign; // no adjustment needed
+
+ entity own = this.owner;
+
+ if(preferred_align < 1 || preferred_align > 4)
+ preferred_align = 3; // default
+
+ for(int j = 4; j > 1; --j) // > 1 as 1 is just center again
+ {
+ int taken = 0;
+ for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
+ {
+ .entity weaponentity = weaponentities[slot];
+ if(own.(weaponentity).m_gunalign == j) // we know it can't be ours thanks to the above check
+ taken |= BIT(j);
+ if(own.(weaponentity).m_gunalign == preferred_align)
+ taken |= BIT(preferred_align);
+ }
+
+ if(!(taken & BIT(preferred_align)))
+ return preferred_align; // prefer the recommended
+ if(!(taken & BIT(j)))
+ return j; // or fall back if it's not available
+ }
+
+ return preferred_align; // return it anyway
+ }
+#else
+ int W_GunAlign(entity this, int preferred_align)
+ {
+ return this.m_gunalign > 0 ? this.m_gunalign : preferred_align;
+ }
+#endif
+
+#if 0
int W_GetGunAlignment(entity player)
{
int gunalign = STAT(GUNALIGN, player);
return gunalign;
}
+#endif
vector W_CalculateSpread(vector forward, float spread, float spreadfactor, float spreadstyle)
{
float sigma;
vector v1 = '0 0 0', v2;
float dx, dy, r;
- spread *= spreadfactor; //g_weaponspreadfactor;
+ spread *= spreadfactor; //autocvar_g_weaponspreadfactor;
if(spread <= 0)
return forward;
default:
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)!");
}
-
+
return '0 0 0';
/*
* how to derive falloff functions: