From 516e9aea4d358c6f836a5c7396393ad8d5e9bd94 Mon Sep 17 00:00:00 2001 From: div0 Date: Sat, 1 Nov 2008 12:07:50 +0000 Subject: [PATCH] factor out noimpact checks, make ALL projectiles use the anti-skygrapple workaround; make trigger_hurt no longer hurt projectiles (as that sucks) git-svn-id: svn://svn.icculus.org/nexuiz/trunk@4959 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/server/g_casings.qc | 7 ++---- data/qcsrc/server/g_hook.qc | 6 ++--- data/qcsrc/server/g_triggers.qc | 33 +++++++++++++++----------- data/qcsrc/server/g_violence.qc | 2 +- data/qcsrc/server/miscfunctions.qc | 30 +++++++++++++++++++++++ data/qcsrc/server/w_crylink.qc | 12 ++-------- data/qcsrc/server/w_electro.qc | 16 ++----------- data/qcsrc/server/w_grenadelauncher.qc | 12 ++-------- data/qcsrc/server/w_hagar.qc | 15 ++---------- data/qcsrc/server/w_hlac.qc | 18 ++------------ data/qcsrc/server/w_hook.qc | 6 +---- data/qcsrc/server/w_laser.qc | 9 +------ data/qcsrc/server/w_porto.qc | 2 ++ data/qcsrc/server/w_rocketlauncher.qc | 7 +----- data/qcsrc/server/w_seeker.qc | 25 ++++--------------- 15 files changed, 73 insertions(+), 127 deletions(-) diff --git a/data/qcsrc/server/g_casings.qc b/data/qcsrc/server/g_casings.qc index 93b939590..db4f74d07 100644 --- a/data/qcsrc/server/g_casings.qc +++ b/data/qcsrc/server/g_casings.qc @@ -1,10 +1,7 @@ void casingtouch() { - if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) - { - remove(self); - return; - } + PROJECTILE_TOUCH; + if (other.solid == SOLID_BSP) if (vlen(self.velocity) >= 50) if (time >= self.attack_finished_single) diff --git a/data/qcsrc/server/g_hook.qc b/data/qcsrc/server/g_hook.qc index ab2241644..d15439d1f 100644 --- a/data/qcsrc/server/g_hook.qc +++ b/data/qcsrc/server/g_hook.qc @@ -258,11 +258,9 @@ void GrapplingHookThink() void GrapplingHookTouch (void) { - if (other == self.owner) + if(SUB_OwnerCheck()) return; - // altered for Nexuiz - //else if (pointcontents (self.origin) == CONTENT_SKY) - else if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) + if(SUB_NoImpactCheck()) { RemoveGrapplingHook(self.owner); return; diff --git a/data/qcsrc/server/g_triggers.qc b/data/qcsrc/server/g_triggers.qc index e982268c5..2caf5fb76 100644 --- a/data/qcsrc/server/g_triggers.qc +++ b/data/qcsrc/server/g_triggers.qc @@ -365,26 +365,31 @@ void spawnfunc_trigger_counter() void trigger_hurt_touch() { // only do the EXACTTRIGGER_TOUCH checks when really needed (saves some cpu) - if (!other.owner) + if (other.iscreature) { - if (other.items & IT_KEY1 || other.items & IT_KEY2) // reset flag + if (other.takedamage) + if (other.triggerhurttime < time) { EXACTTRIGGER_TOUCH; - other.pain_finished = min(other.pain_finished, time + 2); - } - else if (other.classname == "rune") // reset runes - { - EXACTTRIGGER_TOUCH; - other.nextthink = min(other.nextthink, time + 1); + other.triggerhurttime = time + 1; + Damage (other, self, self, self.dmg, DEATH_HURTTRIGGER, other.origin, '0 0 0'); } } - - if (other.takedamage) - if (other.triggerhurttime < time) + else { - EXACTTRIGGER_TOUCH; - other.triggerhurttime = time + 1; - Damage (other, self, self, self.dmg, DEATH_HURTTRIGGER, other.origin, '0 0 0'); + if (!other.owner) + { + if (other.items & IT_KEY1 || other.items & IT_KEY2) // reset flag + { + EXACTTRIGGER_TOUCH; + other.pain_finished = min(other.pain_finished, time + 2); + } + else if (other.classname == "rune") // reset runes + { + EXACTTRIGGER_TOUCH; + other.nextthink = min(other.nextthink, time + 1); + } + } } return; diff --git a/data/qcsrc/server/g_violence.qc b/data/qcsrc/server/g_violence.qc index 8b463c2e6..030fae9d1 100644 --- a/data/qcsrc/server/g_violence.qc +++ b/data/qcsrc/server/g_violence.qc @@ -24,7 +24,7 @@ void GibDamage (entity inflictor, entity attacker, float damage, float deathtype void GibTouch () { - if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) + if(SUB_NoImpactCheck()) { SUB_VanishOrRemove(self); return; diff --git a/data/qcsrc/server/miscfunctions.qc b/data/qcsrc/server/miscfunctions.qc index 2a84362b1..185d0a051 100644 --- a/data/qcsrc/server/miscfunctions.qc +++ b/data/qcsrc/server/miscfunctions.qc @@ -1595,3 +1595,33 @@ float tracebox_hits_box(vector start, vector mi, vector ma, vector end, vector t { return trace_hits_box(start, end, thmi - ma, thma - mi); } + +float SUB_NoImpactCheck() +{ + if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) + return 1; + if(other == world && self.size != '0 0 0') + { + vector tic; + tic = self.velocity * sys_ticrate; + tic = tic + normalize(tic) * vlen(self.maxs - self.mins); + traceline(self.origin - tic, self.origin + tic, MOVE_NORMAL, self); + if(trace_fraction >= 1) + { + dprint("Odd... did not hit...?\n"); + } + else if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) + { + dprint("Detected and prevented the sky-grapple bug.\n"); + return 1; + } + } + + return 0; +} + +#define SUB_OwnerCheck() (other == self.owner) + +#define PROJECTILE_TOUCH do { if(SUB_OwnerCheck()) return; if(SUB_NoImpactCheck()) { remove(self); return; } } while(0) +const string STR_MISC_NULL_WAV = "misc/null.wav"; +#define PROJECTILE_TOUCH_NOSOUND do { if(SUB_OwnerCheck()) return; if(SUB_NoImpactCheck()) { sound (self, CHAN_PROJECTILE, STR_MISC_NULL_WAV, VOL_BASE, ATTN_NORM); remove(self); return; } } while(0) diff --git a/data/qcsrc/server/w_crylink.qc b/data/qcsrc/server/w_crylink.qc index 551554432..1eafd929f 100644 --- a/data/qcsrc/server/w_crylink.qc +++ b/data/qcsrc/server/w_crylink.qc @@ -7,11 +7,7 @@ void W_Crylink_Touch (void) { float finalhit; float f; - if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) - { - remove(self); - return; - } + PROJECTILE_TOUCH; pointparticles(particleeffectnum("crylink_impactbig"), self.origin, '0 0 0', 1); finalhit = ((self.cnt <= 0) || (other.takedamage != DAMAGE_NO)); if(finalhit) @@ -37,11 +33,7 @@ void W_Crylink_Touch2 (void) { float finalhit; float f; - if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) - { - remove(self); - return; - } + PROJECTILE_TOUCH; pointparticles(particleeffectnum("crylink_impact"), self.origin, '0 0 0', 1); finalhit = ((self.cnt <= 0) || (other.takedamage != DAMAGE_NO)); if(finalhit) diff --git a/data/qcsrc/server/w_electro.qc b/data/qcsrc/server/w_electro.qc index e66ccc495..11fb0ceaa 100644 --- a/data/qcsrc/server/w_electro.qc +++ b/data/qcsrc/server/w_electro.qc @@ -42,12 +42,7 @@ void W_Plasma_Explode_Combo (void) { void W_Plasma_Touch (void) { - if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) - { - sound (self, CHAN_PROJECTILE, "misc/null.wav", VOL_BASE, ATTN_NORM); - remove(self); - return; - } + PROJECTILE_TOUCH_NOSOUND; if (other.takedamage == DAMAGE_AIM) { W_Plasma_Explode (); } else { @@ -58,14 +53,7 @@ void W_Plasma_Touch (void) void W_Plasma_TouchExplode (void) { - entity o; - if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) - { - sound (self, CHAN_PROJECTILE, "misc/null.wav", VOL_BASE, ATTN_NORM); - remove(self); - return; - } - o = self.owner; + PROJECTILE_TOUCH_NOSOUND; W_Plasma_Explode (); } diff --git a/data/qcsrc/server/w_grenadelauncher.qc b/data/qcsrc/server/w_grenadelauncher.qc index 2ce8bbda6..eccb21937 100644 --- a/data/qcsrc/server/w_grenadelauncher.qc +++ b/data/qcsrc/server/w_grenadelauncher.qc @@ -38,21 +38,13 @@ void W_Grenade_Explode2 (void) void W_Grenade_Touch1 (void) { - if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) - { - remove(self); - return; - } + PROJECTILE_TOUCH; W_Grenade_Explode (); } void W_Grenade_Touch2 (void) { - if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) - { - remove(self); - return; - } + PROJECTILE_TOUCH; if (other.takedamage == DAMAGE_AIM) { self.use (); diff --git a/data/qcsrc/server/w_hagar.qc b/data/qcsrc/server/w_hagar.qc index 5c770f781..e9a6da0a2 100644 --- a/data/qcsrc/server/w_hagar.qc +++ b/data/qcsrc/server/w_hagar.qc @@ -40,24 +40,13 @@ void W_Hagar_Explode2 (void) void W_Hagar_Touch (void) { - if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) - { - remove(self); - return; - } - if (other == self.owner) - return; - + PROJECTILE_TOUCH; self.use (); } void W_Hagar_Touch2 (void) { - if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) - { - remove(self); - return; - } + PROJECTILE_TOUCH; if(self.cnt > 0 || other.takedamage == DAMAGE_AIM) { self.use(); diff --git a/data/qcsrc/server/w_hlac.qc b/data/qcsrc/server/w_hlac.qc index 8b02d33bf..0ee5a6b71 100644 --- a/data/qcsrc/server/w_hlac.qc +++ b/data/qcsrc/server/w_hlac.qc @@ -5,14 +5,7 @@ void W_HLAC_Touch (void) vector org2; vector normal; - if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) - { - remove(self); - return; - } - - if (other == self.owner) - return; + PROJECTILE_TOUCH; normal = trace_plane_normal; dir = normalize (self.owner.origin - self.origin); @@ -34,14 +27,7 @@ void W_HLAC_Touch2 (void) vector org2; vector normal; - if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) - { - remove(self); - return; - } - - if (other == self.owner) - return; + PROJECTILE_TOUCH; normal = trace_plane_normal; dir = normalize (self.owner.origin - self.origin); diff --git a/data/qcsrc/server/w_hook.qc b/data/qcsrc/server/w_hook.qc index cb8a53ff0..b4c6c82b6 100644 --- a/data/qcsrc/server/w_hook.qc +++ b/data/qcsrc/server/w_hook.qc @@ -14,11 +14,7 @@ void W_Hook_Explode2 (void) void W_Hook_Touch2 (void) { - if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) - { - remove(self); - return; - } + PROJECTILE_TOUCH; self.use(); } diff --git a/data/qcsrc/server/w_laser.qc b/data/qcsrc/server/w_laser.qc index c1aff0f5e..ba62c2e29 100644 --- a/data/qcsrc/server/w_laser.qc +++ b/data/qcsrc/server/w_laser.qc @@ -6,14 +6,7 @@ void W_Laser_Touch (void) vector org2; vector normal; - if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) - { - remove(self); - return; - } - - if (other == self.owner) - return; + PROJECTILE_TOUCH; normal = trace_plane_normal; dir = normalize (self.owner.origin - self.origin); diff --git a/data/qcsrc/server/w_porto.qc b/data/qcsrc/server/w_porto.qc index b5ba8fe6b..fcf1667e3 100644 --- a/data/qcsrc/server/w_porto.qc +++ b/data/qcsrc/server/w_porto.qc @@ -72,6 +72,8 @@ void W_Porto_Touch (void) { vector norm; + // do not use PROJECTILE_TOUCH here + if(other.classname == "portal") return; // handled by the portal diff --git a/data/qcsrc/server/w_rocketlauncher.qc b/data/qcsrc/server/w_rocketlauncher.qc index 6e422ad35..8340a5c3e 100644 --- a/data/qcsrc/server/w_rocketlauncher.qc +++ b/data/qcsrc/server/w_rocketlauncher.qc @@ -182,12 +182,7 @@ void W_Rocket_Touch (void) { if(self.owner && self.owner.lastrocket == self) self.owner.lastrocket = world; - if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) - { - sound (self, CHAN_PROJECTILE, "misc/null.wav", VOL_BASE, ATTN_NORM); - remove(self); - return; - } + PROJECTILE_TOUCH_NOSOUND; W_Rocket_Explode (); } diff --git a/data/qcsrc/server/w_seeker.qc b/data/qcsrc/server/w_seeker.qc index 84a4cc963..89838ec09 100644 --- a/data/qcsrc/server/w_seeker.qc +++ b/data/qcsrc/server/w_seeker.qc @@ -25,13 +25,7 @@ void Seeker_Missile_Explode () void Seeker_Missile_Touch() { - if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) - { - remove(self); - return; - } - if (other == self.owner) - return; + PROJECTILE_TOUCH; Seeker_Missile_Explode(); } @@ -290,13 +284,7 @@ void Seeker_Tag_Touch() vector dir; vector org2; - if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) - { - remove(self); - return; - } - if (other == self.owner) - return; + PROJECTILE_TOUCH; dir = normalize (self.owner.origin - self.origin); org2 = findbetterlocation (self.origin, 8); @@ -355,6 +343,7 @@ void Seeker_Fire_Tag() setmodel (missile, "models/laser.mdl"); // TODO make this seeker specific setorigin (missile, w_shotorg); + setsize (missile, '0 0 0', '0 0 0'); missile.effects = EF_FULLBRIGHT | EF_NOSHADOW | EF_LOWPRECISION; missile.modelflags = MF_TRACER3; @@ -391,13 +380,7 @@ void Seeker_Flac_Explode () void Seeker_Flac_Touch() { - if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) - { - remove(self); - return; - } - if (other == self.owner) - return; + PROJECTILE_TOUCH; Seeker_Flac_Explode(); } -- 2.39.2