X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fweapons%2Fcalculations.qc;h=cd2d925bc56004223c86899c0c1b66e07db0c8f5;hb=e88e1e15090f826fe3ac9b006e89eca0d1ecfe68;hp=73d9b938efac9bdcc4917352b3833665a1dae105;hpb=641c47df604de42c11c68a7d80813b29affcefb2;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/weapons/calculations.qc b/qcsrc/common/weapons/calculations.qc index 73d9b938e..cd2d925bc 100644 --- a/qcsrc/common/weapons/calculations.qc +++ b/qcsrc/common/weapons/calculations.qc @@ -1,3 +1,5 @@ +#include "calculations.qh" + // ============================= // Explosion Force Calculation // ============================= @@ -55,7 +57,7 @@ vector damage_explosion_calcpush(vector explosion_f, vector target_v, float spee 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, @@ -88,15 +90,11 @@ vector solve_cubic_pq(float p, float q) // 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) { @@ -105,17 +103,15 @@ vector solve_cubic_pq(float p, float q) 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) @@ -135,13 +131,48 @@ 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); @@ -151,13 +182,14 @@ int W_GetGunAlignment(entity 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;