From c9d7b73f7181a8a81ee54d88f7a7f62617bab217 Mon Sep 17 00:00:00 2001 From: lordhavoc Date: Wed, 22 Mar 2006 08:54:13 +0000 Subject: [PATCH] implemented DP_TRACE_HITCONTENTSMASK_SURFACEINFO extension and made use of it added sound/misc/null.wav (useful for stopping sounds) git-svn-id: svn://svn.icculus.org/nexuiz/trunk@1175 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/server/gamec/extensions.h | 50 ++++++++++++++++++++ data/qcsrc/server/gamec/g_casings.c | 5 ++ data/qcsrc/server/gamec/g_hook.c | 4 +- data/qcsrc/server/gamec/g_violence.c | 5 ++ data/qcsrc/server/gamec/g_world.c | 13 ++--- data/qcsrc/server/gamec/t_items.c | 13 ++++- data/qcsrc/server/gamec/w_common.c | 4 +- data/qcsrc/server/gamec/w_crylink.c | 10 ++++ data/qcsrc/server/gamec/w_electro.c | 19 +++++++- data/qcsrc/server/gamec/w_grenadelauncher.c | 21 ++++++-- data/qcsrc/server/gamec/w_hagar.c | 8 ++-- data/qcsrc/server/gamec/w_laser.c | 9 ++-- data/qcsrc/server/gamec/w_rocketlauncher.c | 10 ++-- data/sound/misc/null.wav | Bin 0 -> 48 bytes 14 files changed, 143 insertions(+), 28 deletions(-) create mode 100644 data/sound/misc/null.wav diff --git a/data/qcsrc/server/gamec/extensions.h b/data/qcsrc/server/gamec/extensions.h index a5bf23d94..95846b8fd 100644 --- a/data/qcsrc/server/gamec/extensions.h +++ b/data/qcsrc/server/gamec/extensions.h @@ -876,6 +876,56 @@ void(vector org) te_plasmaburn = #433; //description: //creates a small light flash (radius 200, time 0.2) and marks the walls. +//DP_TRACE_DPHITCONTENTSMASK_SURFACEINFO +//idea: LordHavoc +//darkplaces implementation: LordHavoc +//globals: +//.float dphitcontentsmask; // if non-zero on the entity passed to traceline/tracebox/tracetoss this will override the normal collidable contents rules and instead hit these contents values (for example AI can use tracelines that hit DONOTENTER if it wants to, by simply changing this field on the entity passed to traceline), this affects normal movement as well as trace calls +float trace_dpstartcontents; // DPCONTENTS_ value at start position of trace +//float trace_dphitcontents; // DPCONTENTS_ value of impacted surface (not contents at impact point, just contents of the surface that was hit) +float trace_dphitq3surfaceflags; // Q3SURFACEFLAG_ value of impacted surface +//string trace_dphittexturename; // texture name of impacted surface +//constants: +float DPCONTENTS_SOLID = 1; // hit a bmodel, not a bounding box +float DPCONTENTS_WATER = 2; +float DPCONTENTS_SLIME = 4; +float DPCONTENTS_LAVA = 8; +float DPCONTENTS_SKY = 16; +float DPCONTENTS_BODY = 32; // hit a bounding box, not a bmodel +float DPCONTENTS_CORPSE = 64; // hit a SOLID_CORPSE entity +float DPCONTENTS_NODROP = 128; // an area where backpacks should not spawn +float DPCONTENTS_PLAYERCLIP = 256; // blocks player movement +float DPCONTENTS_MONSTERCLIP = 512; // blocks monster movement +float DPCONTENTS_DONOTENTER = 1024; // AI hint brush +float DPCONTENTS_LIQUIDSMASK = 14; // WATER | SLIME | LAVA +float Q3SURFACEFLAG_NODAMAGE = 1; +float Q3SURFACEFLAG_SLICK = 2; // low friction surface +float Q3SURFACEFLAG_SKY = 4; // sky surface (also has NOIMPACT and NOMARKS set) +float Q3SURFACEFLAG_LADDER = 8; // climbable surface +float Q3SURFACEFLAG_NOIMPACT = 16; // projectiles should remove themselves on impact (this is set on sky) +float Q3SURFACEFLAG_NOMARKS = 32; // projectiles should not leave marks, such as decals (this is set on sky) +float Q3SURFACEFLAG_FLESH = 64; // projectiles should do a fleshy effect (blood?) on impact +//float Q3SURFACEFLAG_NODRAW = 128; // compiler hint (not important to qc) +//float Q3SURFACEFLAG_HINT = 256; // compiler hint (not important to qc) +//float Q3SURFACEFLAG_SKIP = 512; // compiler hint (not important to qc) +//float Q3SURFACEFLAG_NOLIGHTMAP = 1024; // compiler hint (not important to qc) +//float Q3SURFACEFLAG_POINTLIGHT = 2048; // compiler hint (not important to qc) +float Q3SURFACEFLAG_METALSTEPS = 4096; // walking on this surface should make metal step sounds +float Q3SURFACEFLAG_NOSTEPS = 8192; // walking on this surface should not make footstep sounds +//float Q3SURFACEFLAG_NONSOLID = 16384; // compiler hint (not important to qc) +//float Q3SURFACEFLAG_LIGHTFILTER = 32768; // compiler hint (not important to qc) +//float Q3SURFACEFLAG_ALPHASHADOW = 65536; // compiler hint (not important to qc) +//float Q3SURFACEFLAG_NODLIGHT = 131072; // compiler hint (not important to qc) +//float Q3SURFACEFLAG_DUST = 262144; // translucent 'light beam' effect (not important to qc) +//description: +//adds additional information after a traceline/tracebox/tracetoss call. +//also (very important) sets trace_* globals before calling .touch functions, +//this allows them to inspect the nature of the collision (for example +//determining if a projectile hit sky), clears trace_* variables for the other +//object in a touch event (that is to say, a projectile moving will see the +//trace results in its .touch function, but the player it hit will see very +//little information in the trace_ variables as it was not moving at the time) + //DP_VIEWZOOM //idea: LordHavoc //darkplaces implementation: LordHavoc diff --git a/data/qcsrc/server/gamec/g_casings.c b/data/qcsrc/server/gamec/g_casings.c index 0776deead..c73154e4d 100644 --- a/data/qcsrc/server/gamec/g_casings.c +++ b/data/qcsrc/server/gamec/g_casings.c @@ -1,5 +1,10 @@ void() casingtouch = { + if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) + { + remove(self); + return; + } if (other.solid == SOLID_BSP) if (vlen(self.velocity) >= 50) if (time >= self.attack_finished) diff --git a/data/qcsrc/server/gamec/g_hook.c b/data/qcsrc/server/gamec/g_hook.c index f8b02e639..449f7696b 100644 --- a/data/qcsrc/server/gamec/g_hook.c +++ b/data/qcsrc/server/gamec/g_hook.c @@ -159,7 +159,9 @@ void GrapplingHookTouch (void) { if (other == self.owner) return; - else if (pointcontents (self.origin) == CONTENT_SKY) + // altered for Nexuiz + //else if (pointcontents (self.origin) == CONTENT_SKY) + else if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) { RemoveGrapplingHook(self.owner); return; diff --git a/data/qcsrc/server/gamec/g_violence.c b/data/qcsrc/server/gamec/g_violence.c index 0fe4297f6..6f6a91f6c 100644 --- a/data/qcsrc/server/gamec/g_violence.c +++ b/data/qcsrc/server/gamec/g_violence.c @@ -22,6 +22,11 @@ void GibDamage (entity inflictor, entity attacker, float damage, float deathtype void GibTouch () { + if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) + { + SUB_VanishOrRemove(self); + return; + } GibDamage (other, other, 1000, 0, self.origin, '0 0 0'); } diff --git a/data/qcsrc/server/gamec/g_world.c b/data/qcsrc/server/gamec/g_world.c index fb739a16a..a05885c3f 100644 --- a/data/qcsrc/server/gamec/g_world.c +++ b/data/qcsrc/server/gamec/g_world.c @@ -39,7 +39,7 @@ void worldspawn (void) //precache_model ("models/gibs/gib6.md3"); precache_model ("models/gibs/gib1.mdl"); precache_model ("models/gibs/gib2.mdl"); - precache_model ("models/gibs/gib3.mdl"); + precache_model ("models/gibs/gib3.mdl"); precache_model ("models/grenademodel.md3"); precache_model ("models/hagarmissile.mdl"); precache_model ("models/items/a_bullets.mdl"); @@ -99,6 +99,7 @@ void worldspawn (void) // laser for laser-guided weapons precache_model ("models/laser_dot.mdl"); + precache_sound ("misc/null.wav"); precache_sound ("misc/armor1.wav"); precache_sound ("misc/armor25.wav"); precache_sound ("misc/armorimpact.wav"); @@ -341,7 +342,7 @@ void() GotoNextMap = localcmd(strcat("exec \"maps/", cvar_string("nextmap"), ".mapcfg\"\n")); return; } - + pass = 0; while (pass < 2) { @@ -582,7 +583,7 @@ void() DumpStats = { local string ch; local float i; - + localcmd(strcat("echo \"", s)); for(i = 0; i < strlen(other.netname); ++i) { @@ -645,7 +646,7 @@ void() NextLevel = if(clienttype(other) == CLIENTTYPE_REAL) if(cvar("sv_autoscreenshot")) stuffcmd(other, "screenshot\necho \"^5A screenshot has been taken at request of the server.\"\n"); - + /* if (pos != world); { @@ -750,7 +751,7 @@ void() CheckRules_World = { if(cvar("minplayers") >= maxclients) cvar_set("minplayers", ftos(maxclients - 1)); - + f = cvar("minplayers") - (player_count - bot_number); if((player_count - bot_number) < 1) f = 0; @@ -763,7 +764,7 @@ void() CheckRules_World = cvar_set("bot_number", "0"); } } - + // last man camping winning conditions if(cvar("g_lms")) { diff --git a/data/qcsrc/server/gamec/t_items.c b/data/qcsrc/server/gamec/t_items.c index 9597984f4..9e6b79099 100644 --- a/data/qcsrc/server/gamec/t_items.c +++ b/data/qcsrc/server/gamec/t_items.c @@ -99,7 +99,7 @@ void Item_Touch (void) other.ammo_rockets = min (other.ammo_rockets + self.ammo_rockets, 999); if (self.ammo_cells) other.ammo_cells = min (other.ammo_cells + self.ammo_cells, 999); - + if (self.items & IT_UZI) W_GiveWeapon (other, IT_UZI, "Machine gun"); if (self.items & IT_SHOTGUN) W_GiveWeapon (other, IT_SHOTGUN, "Shotgun"); if (self.items & IT_GRENADE_LAUNCHER) W_GiveWeapon (other, IT_GRENADE_LAUNCHER, "Mortar"); @@ -200,6 +200,17 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime, return; } + if (self.classname == "droppedweapon") + { + // don't drop if in a NODROP zone (such as lava) + traceline(self.origin, self.origin, MOVE_NORMAL, self); + if (trace_dpstartcontents & DPCONTENTS_NODROP) + { + remove(self); + return; + } + } + self.mdl = itemmodel; //self.noise = pickupsound; self.item_pickupsound = pickupsound; diff --git a/data/qcsrc/server/gamec/w_common.c b/data/qcsrc/server/gamec/w_common.c index 007218f41..c892aeb0a 100644 --- a/data/qcsrc/server/gamec/w_common.c +++ b/data/qcsrc/server/gamec/w_common.c @@ -501,12 +501,10 @@ void fireBullet (vector start, vector dir, float spread, float damage, float dty e.effects = e.effects | EF_ADDITIVE | EF_FULLBRIGHT | EF_NOSHADOW; } - // FIXME - causes excessive 'tinking'. Hopefully remove "tink1.wav" from the ricochets with csqc if ((trace_fraction != 1.0) && (pointcontents (trace_endpos) != CONTENT_SKY)) { - if (trace_ent.solid == SOLID_BSP) + if (trace_ent.solid == SOLID_BSP && !(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)) { - pointcontents (self.origin); te_gunshot (trace_endpos); r = random (); if (r < 0.10) diff --git a/data/qcsrc/server/gamec/w_crylink.c b/data/qcsrc/server/gamec/w_crylink.c index 7884a6366..86eaca3bd 100644 --- a/data/qcsrc/server/gamec/w_crylink.c +++ b/data/qcsrc/server/gamec/w_crylink.c @@ -44,6 +44,11 @@ void(float req) w_crylink = .entity realowner; void W_Crylink_Touch (void) { + if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) + { + remove(self); + return; + } RadiusDamage (self, self.realowner, cvar("g_balance_crylink_primary_damage"), cvar("g_balance_crylink_primary_edgedamage"), cvar("g_balance_crylink_primary_radius"), world, cvar("g_balance_crylink_primary_force"), IT_CRYLINK); //te_smallflash(self.origin); if (other.takedamage == DAMAGE_AIM) @@ -67,6 +72,11 @@ void W_Crylink_Touch (void) void W_Crylink_Touch2 (void) { + if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) + { + remove(self); + return; + } RadiusDamage (self, self.realowner, cvar("g_balance_crylink_secondary_damage"), cvar("g_balance_crylink_secondary_edgedamage"), cvar("g_balance_crylink_secondary_radius"), world, cvar("g_balance_crylink_secondary_force"), IT_CRYLINK); //te_smallflash(self.origin); if (other.takedamage == DAMAGE_AIM) diff --git a/data/qcsrc/server/gamec/w_electro.c b/data/qcsrc/server/gamec/w_electro.c index d1df44f3d..734f6fb9c 100644 --- a/data/qcsrc/server/gamec/w_electro.c +++ b/data/qcsrc/server/gamec/w_electro.c @@ -76,6 +76,12 @@ void W_Plasma_Explode_Combo (void) { void W_Plasma_Touch (void) { + if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) + { + sound (self, CHAN_BODY, "misc/null.wav", 1, ATTN_NORM); + remove(self); + return; + } if (other.takedamage == DAMAGE_AIM) { W_Plasma_Explode (); } else { @@ -83,6 +89,17 @@ void W_Plasma_Touch (void) } } +void W_Plasma_TouchExplode (void) +{ + if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) + { + sound (self, CHAN_BODY, "misc/null.wav", 1, ATTN_NORM); + remove(self); + return; + } + W_Plasma_Explode (); +} + void W_Plasma_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) { self.health = self.health - damage; @@ -142,7 +159,7 @@ void() W_Electro_Attack proj.movetype = MOVETYPE_FLY; proj.velocity = normalize(trueaim - org) * cvar("g_balance_electro_primary_speed"); proj.angles = vectoangles(proj.velocity); - proj.touch = W_Plasma_Explode; + proj.touch = W_Plasma_TouchExplode; setmodel(proj, "models/elaser.mdl"); setsize(proj, '0 0 0', '0 0 0'); diff --git a/data/qcsrc/server/gamec/w_grenadelauncher.c b/data/qcsrc/server/gamec/w_grenadelauncher.c index 9474fb9f0..9d200a96c 100644 --- a/data/qcsrc/server/gamec/w_grenadelauncher.c +++ b/data/qcsrc/server/gamec/w_grenadelauncher.c @@ -66,8 +66,23 @@ void W_Grenade_Explode2 (void) remove (self); } -void W_Grenade_Touch (void) +void W_Grenade_Touch1 (void) { + if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) + { + remove(self); + return; + } + W_Grenade_Explode (); +} + +void W_Grenade_Touch2 (void) +{ + if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) + { + remove(self); + return; + } if (other.takedamage == DAMAGE_AIM) self.think (); else @@ -119,7 +134,7 @@ void W_Grenade_Attack (void) gren.nextthink = time + cvar("g_balance_grenadelauncher_primary_lifetime"); gren.think = W_Grenade_Explode; - gren.touch = W_Grenade_Explode; + gren.touch = W_Grenade_Touch1; gren.velocity = v_forward * cvar("g_balance_grenadelauncher_primary_speed") + v_up * cvar("g_balance_grenadelauncher_primary_speed_up"); gren.avelocity_x = random () * -500 - 500; @@ -152,7 +167,7 @@ void W_Grenade_Attack2 (void) gren.nextthink = time + cvar("g_balance_grenadelauncher_secondary_lifetime"); gren.think = W_Grenade_Explode2; - gren.touch = W_Grenade_Touch; + gren.touch = W_Grenade_Touch2; gren.takedamage = DAMAGE_YES; gren.health = 10; gren.damageforcescale = 4; diff --git a/data/qcsrc/server/gamec/w_hagar.c b/data/qcsrc/server/gamec/w_hagar.c index 8caac7272..e8f70f24d 100644 --- a/data/qcsrc/server/gamec/w_hagar.c +++ b/data/qcsrc/server/gamec/w_hagar.c @@ -82,13 +82,13 @@ void W_Hagar_Explode2 (void) void W_Hagar_Touch (void) { - if (other == self.owner) - return; - else if (pointcontents (self.origin) == CONTENT_SKY) + if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) { - remove (self); + remove(self); return; } + if (other == self.owner) + return; self.think (); } diff --git a/data/qcsrc/server/gamec/w_laser.c b/data/qcsrc/server/gamec/w_laser.c index 18d93cace..0ab170a93 100644 --- a/data/qcsrc/server/gamec/w_laser.c +++ b/data/qcsrc/server/gamec/w_laser.c @@ -33,14 +33,15 @@ void W_Laser_Touch (void) { vector dir; - if (other == self.owner) - return; - else if (pointcontents (self.origin) == CONTENT_SKY) + if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) { - remove (self); + remove(self); return; } + if (other == self.owner) + return; + dir = normalize (self.owner.origin - self.origin); WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); diff --git a/data/qcsrc/server/gamec/w_rocketlauncher.c b/data/qcsrc/server/gamec/w_rocketlauncher.c index 3b95ec597..6f82075b4 100644 --- a/data/qcsrc/server/gamec/w_rocketlauncher.c +++ b/data/qcsrc/server/gamec/w_rocketlauncher.c @@ -57,7 +57,7 @@ void W_Rocket_Explode (void) { self.owner.cnt = WEP_ROCKET_LAUNCHER; self.owner.attack_finished = time; - self.owner.switchweapon = w_getbestweapon(self.owner); + self.owner.switchweapon = w_getbestweapon(self.owner); } if(cvar("g_laserguided_missile")) self.owner.attack_finished = time + cvar("g_balance_rocketlauncher_refire"); @@ -201,13 +201,13 @@ void W_Rocket_Think (void) void W_Rocket_Touch (void) { - if (pointcontents (self.origin) == CONTENT_SKY) + if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) { - remove (self); + sound (self, CHAN_BODY, "misc/null.wav", 1, ATTN_NORM); + remove(self); return; } - else - W_Rocket_Explode (); + W_Rocket_Explode (); } void W_Rocket_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) diff --git a/data/sound/misc/null.wav b/data/sound/misc/null.wav new file mode 100644 index 0000000000000000000000000000000000000000..c990fbdec492c1dd4359407040028f03a90fb9a7 GIT binary patch literal 48 ucmWIYbaT^SU|