From 09319268d18c3d2571a3230ae7377762268dcabf Mon Sep 17 00:00:00 2001 From: drjaska Date: Tue, 28 Nov 2023 01:04:12 +0200 Subject: [PATCH] cleanup and a few comments --- qcsrc/client/hud/crosshair.qc | 4 +-- qcsrc/common/weapons/all.qc | 38 +++++++++++++++++------ qcsrc/common/weapons/weapon/arc.qc | 3 +- qcsrc/common/weapons/weapon/devastator.qc | 4 +-- qcsrc/server/damage.qc | 10 +++--- qcsrc/server/impulse.qc | 3 +- qcsrc/server/weapons/tracing.qc | 17 +++++++--- 7 files changed, 52 insertions(+), 27 deletions(-) diff --git a/qcsrc/client/hud/crosshair.qc b/qcsrc/client/hud/crosshair.qc index 229a60240..6084b319e 100644 --- a/qcsrc/client/hud/crosshair.qc +++ b/qcsrc/client/hud/crosshair.qc @@ -122,8 +122,6 @@ float TrueAimCheck(entity wepent) vector traceorigin = entcs_receiver(player_localentnum - 1).origin + (eZ * STAT(VIEWHEIGHT)); - vecs = decompressShotOrigin(STAT(SHOTORG)); - traceline(traceorigin, traceorigin + view_forward * max_shot_distance, mv, ta); trueaimpoint = trace_endpos; // move trueaimpoint a little bit forward to make the final tracebox reliable @@ -133,6 +131,8 @@ float TrueAimCheck(entity wepent) if(vdist((trueaimpoint - traceorigin), <, g_trueaim_minrange)) trueaimpoint = traceorigin + view_forward * g_trueaim_minrange; + vecs = decompressShotOrigin(STAT(SHOTORG)); + if(vecs.x > 0) vecs.y = -vecs.y; else diff --git a/qcsrc/common/weapons/all.qc b/qcsrc/common/weapons/all.qc index effa087e6..0d0c56858 100644 --- a/qcsrc/common/weapons/all.qc +++ b/qcsrc/common/weapons/all.qc @@ -524,13 +524,34 @@ void CL_WeaponEntity_SetModel(entity this, string name, bool _anim) this.movedir_aligned = shotorg_adjust(v, false, true, algn); this.view_ofs = this.movedir_aligned - v; } - int compressed_shotorg = compressShotOrigin(this.movedir); - // make them match perfectly -#ifdef SVQC - // null during init - if (this.owner) STAT(SHOTORG, this.owner) = compressed_shotorg; -#endif - this.movedir = decompressShotOrigin(compressed_shotorg); + + // shotorg_adjust can give negative .x from shootfromfixedorigin + // recheck .x here due to it + if (this.movedir.x >= 0) + { + int compressed_shotorg = compressShotOrigin(this.movedir); + // make them match perfectly + #ifdef SVQC + // null during init + if (this.owner) STAT(SHOTORG, this.owner) = compressed_shotorg; + #endif + this.movedir = decompressShotOrigin(compressed_shotorg); + } + else + { + // don't support negative x shotorgs + this.movedir = '0 0 0'; + + // reset _aligned here too even though as a side effect + // g_shootfromfixedorigin can make it reset + // it'd be only slightly better if it was checked individually + this.movedir_aligned = '0 0 0'; + + #ifdef SVQC + // null during init + if (this.owner) STAT(SHOTORG, this.owner) = 0; + #endif + } #ifdef SVQC this.spawnorigin += this.view_ofs; // offset the casings origin by the same amount @@ -786,8 +807,7 @@ NET_HANDLE(w_muzzleflash, bool isNew) rlplayer = csqcplayer; // fall back to the global vector md = wepent.movedir_aligned; - vector vecs = ((md.x > 0) ? md : '0 0 0'); - vector dv = forward * vecs.x + right * -vecs.y + up * vecs.z; + vector dv = forward * md.x + right * -md.y + up * md.z; vector org = rlplayer.origin + rlplayer.view_ofs + dv; pointparticles(thiswep.m_muzzleeffect, org, forward * 1000, 1); diff --git a/qcsrc/common/weapons/weapon/arc.qc b/qcsrc/common/weapons/weapon/arc.qc index 43d7a03a4..5bacdc35e 100644 --- a/qcsrc/common/weapons/weapon/arc.qc +++ b/qcsrc/common/weapons/weapon/arc.qc @@ -564,8 +564,7 @@ void Arc_Smoke(Weapon thiswep, entity actor, .entity weaponentity, int fire) makevectors(actor.v_angle); w_shotdir = v_forward; vector md = actor.(weaponentity).movedir; - vector vecs = ((md.x > 0) ? md : '0 0 0'); - vector dv = v_forward * vecs.x + v_right * -vecs.y + v_up * vecs.z; + vector dv = v_forward * md.x + v_right * -md.y + v_up * md.z; w_shotorg = actor.origin + actor.view_ofs + dv; //W_SetupShot_Range(actor,weaponentity,false,0,SND_Null,0,0,0,thiswep.m_id); diff --git a/qcsrc/common/weapons/weapon/devastator.qc b/qcsrc/common/weapons/weapon/devastator.qc index 6f428dc6c..ef08d30b8 100644 --- a/qcsrc/common/weapons/weapon/devastator.qc +++ b/qcsrc/common/weapons/weapon/devastator.qc @@ -237,9 +237,7 @@ void W_Devastator_Think(entity this) f = 1; vector md = this.realowner.(weaponentity).movedir; - vector vecs = ((md.x > 0) ? md : '0 0 0'); - - vector dv = v_right * -vecs.y + v_up * vecs.z; + vector dv = v_right * -md.y + v_up * md.z; if(!W_DualWielding(this.realowner)) dv = '0 0 0'; // don't override! diff --git a/qcsrc/server/damage.qc b/qcsrc/server/damage.qc index 2e84cac3a..d5a9a20c7 100644 --- a/qcsrc/server/damage.qc +++ b/qcsrc/server/damage.qc @@ -961,8 +961,7 @@ float RadiusDamageForSource (entity inflictor, vector inflictororigin, vector in #if 0 // code stolen from W_SetupShot_Dir_ProjectileSize_Range() vector md = targ.(weaponentity).movedir; - vector vecs = ((md.x > 0) ? md : '0 0 0'); - vector dv = v_right * -vecs.y + v_up * vecs.z; + vector dv = v_right * -md.y + v_up * md.z; vector mi = '0 0 0', ma = '0 0 0'; if(IS_CLIENT(targ)) // no antilag for non-clients! @@ -977,8 +976,11 @@ float RadiusDamageForSource (entity inflictor, vector inflictororigin, vector in center.z = trace_endpos.z; #else - // very cheap way but it skips movedir.x > 0 checks and move into solid checks which is fine most of the time for now AFAIK - // this should only really be an issue with absurd g_shootfromfixedorigin custom values like "-1 0 9001" + // very cheap way but it skips move into solid checks which is fine most of the time for now AFAIK + // this should only really be an issue with some rare edge cases where + // shot origin was prevented from going into a ceiling but it still explodes at the ceiling + // shot origin wasn't raised as high as possible and the shooter gets upwards knockback + // TL;DR: no bugs if vertical shot origin is always within player bbox center.z = center.z + targ.(weaponentity).movedir.z; #endif } diff --git a/qcsrc/server/impulse.qc b/qcsrc/server/impulse.qc index be66fe968..b9f9d7766 100644 --- a/qcsrc/server/impulse.qc +++ b/qcsrc/server/impulse.qc @@ -340,8 +340,7 @@ IMPULSE(weapon_drop) { .entity weaponentity = weaponentities[slot]; vector md = this.(weaponentity).movedir; - vector vecs = ((md.x > 0) ? md : '0 0 0'); - vector dv = v_right * -vecs.y; + vector dv = v_right * -md.y; if(!is_dualwielding) dv = '0 0 0'; // don't override! W_ThrowWeapon(this, weaponentity, W_CalculateProjectileVelocity(this, this.velocity, v_forward * 750, false), dv, true); diff --git a/qcsrc/server/weapons/tracing.qc b/qcsrc/server/weapons/tracing.qc index dbd3d5b27..a8385b686 100644 --- a/qcsrc/server/weapons/tracing.qc +++ b/qcsrc/server/weapons/tracing.qc @@ -69,11 +69,15 @@ void W_SetupShot_Dir_ProjectileSize_Range(entity ent, .entity weaponentity, vect if(IS_PLAYER(ent)) W_HitPlotAnalysis(ent, wep, forward, right, up); + // read shot origin offset, like g_shootfromcenter + // set in CL_WeaponEntity_SetModel (not a CSQC exclusive function...) vector md = ent.(weaponentity).movedir; - vector vecs = ((md.x > 0) ? md : '0 0 0'); + //print(sprintf("offset of %s: %v\n", ent.(weaponentity).m_weapon.netname, md)); + vector dv = right * -md.y + up * md.z; - vector dv = right * -vecs.y + up * vecs.z; w_shotorg = ent.origin + ent.view_ofs; + + // move the shotorg sideways and vertically as much as requested if possible if(antilag) { if(CS(ent).antilag_debug) @@ -89,13 +93,16 @@ void W_SetupShot_Dir_ProjectileSize_Range(entity ent, .entity weaponentity, vect if(antilag) { if(CS(ent).antilag_debug) - tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + forward * (vecs.x + nudge), MOVE_NORMAL, ent, CS(ent).antilag_debug); + tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + forward * (md.x + nudge), MOVE_NORMAL, ent, CS(ent).antilag_debug); else - tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + forward * (vecs.x + nudge), MOVE_NORMAL, ent, ANTILAG_LATENCY(ent)); + tracebox_antilag(ent, w_shotorg, mi, ma, w_shotorg + forward * (md.x + nudge), MOVE_NORMAL, ent, ANTILAG_LATENCY(ent)); } else - tracebox(w_shotorg, mi, ma, w_shotorg + forward * (vecs.x + nudge), MOVE_NORMAL, ent); + tracebox(w_shotorg, mi, ma, w_shotorg + forward * (md.x + nudge), MOVE_NORMAL, ent); w_shotorg = trace_endpos - forward * nudge; + + //print(sprintf("w_shotorg %v\n\n", w_shotorg - (ent.origin + ent.view_ofs))); + // calculate the shotdir from the chosen shotorg if(W_DualWielding(ent)) w_shotdir = s_forward; -- 2.39.2