From 616eb450ca76c9b42d9eed24b78bf6d1115df5c2 Mon Sep 17 00:00:00 2001 From: div0 Date: Fri, 10 Oct 2008 08:36:48 +0000 Subject: [PATCH] support for announcer/male/impressive and announcer/male/headshot ;) git-svn-id: svn://svn.icculus.org/nexuiz/trunk@4696 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/server/cl_client.qc | 2 ++ data/qcsrc/server/defs.qh | 2 ++ data/qcsrc/server/g_damage.qc | 44 +++++++++++++++++------- data/qcsrc/server/g_triggers.qc | 49 -------------------------- data/qcsrc/server/miscfunctions.qc | 55 +++++++++++++++++++++++++++++- data/qcsrc/server/w_common.qc | 3 ++ data/qcsrc/server/w_minstanex.qc | 30 +++++++++++++--- data/qcsrc/server/w_nex.qc | 3 +- 8 files changed, 119 insertions(+), 69 deletions(-) diff --git a/data/qcsrc/server/cl_client.qc b/data/qcsrc/server/cl_client.qc index c1affce25..7551ac532 100644 --- a/data/qcsrc/server/cl_client.qc +++ b/data/qcsrc/server/cl_client.qc @@ -2368,4 +2368,6 @@ void PlayerPostThink (void) */ Arena_Warmup(); + + //pointparticles(particleeffectnum("machinegun_impact"), self.origin + self.view_ofs + '0 0 7', '0 0 0', 1); } diff --git a/data/qcsrc/server/defs.qh b/data/qcsrc/server/defs.qh index 93691188c..51e1ad6e0 100644 --- a/data/qcsrc/server/defs.qh +++ b/data/qcsrc/server/defs.qh @@ -502,3 +502,5 @@ void W_Porto_Remove (entity p); .float projectiledeathtype; .string message2; + +vector railgun_start, railgun_end; // filled by FireRailgunBullet, used by damage code for head shot diff --git a/data/qcsrc/server/g_damage.qc b/data/qcsrc/server/g_damage.qc index 886de1be5..155c26c51 100644 --- a/data/qcsrc/server/g_damage.qc +++ b/data/qcsrc/server/g_damage.qc @@ -1,7 +1,10 @@ - float checkrules_firstblood; float yoda; +float damage_goodhits; +float damage_gooddamage; +float headshot; + float IsDifferentTeam(entity a, entity b) { @@ -593,12 +596,6 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float damage = 0; targ.hitsound += 1; } - else if (deathtype == WEP_MINSTANEX && targ.items & IT_STRENGTH) - { - if(clienttype(attacker) == CLIENTTYPE_REAL) - if(IsDifferentTeam(targ, attacker)) - yoda = 1; - } if (deathtype == WEP_LASER) { damage = 0; @@ -613,12 +610,6 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float attacker = targ; } } - } else { - if (!targ.deadflag) - if(targ.takedamage == DAMAGE_AIM) - if(IsFlying(targ)) - if(IsDifferentTeam(targ, attacker)) - yoda = 1; } // apply strength multiplier @@ -685,6 +676,33 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float else if (targ.runes & CURSE_VULNER) damage = damage * cvar("g_balance_curse_vulner_takedamage"); } + + // count the damage + if(IsDifferentTeam(targ, attacker)) + if (!targ.deadflag) + if(targ.takedamage == DAMAGE_AIM) + if(damage > 0) + { + damage_goodhits += 1; + damage_gooddamage += damage; + + if(!g_minstagib) + if(IsFlying(targ)) + yoda = 1; + + if(g_minstagib) + if(targ.items & IT_STRENGTH) + yoda = 1; + + // HEAD SHOT: + // find height of hit on player axis + // if above view_ofs and below maxs, and also in the middle half of the bbox, it is head shot + vector headmins, headmaxs; + headmins = targ.origin + '0.5 0 0' * targ.mins_x + '0 0.5 0' * targ.mins_y + '0 0 1' * targ.view_ofs_z; + headmaxs = targ.origin + '0.5 0 0' * targ.maxs_x + '0 0.5 0' * targ.maxs_y + '0 0 1' * targ.maxs_z; + if(trace_hits_box(railgun_start, railgun_end, headmins, headmaxs)) + headshot = 1; + } } // apply push diff --git a/data/qcsrc/server/g_triggers.qc b/data/qcsrc/server/g_triggers.qc index f8c5b06ef..9992b82f0 100644 --- a/data/qcsrc/server/g_triggers.qc +++ b/data/qcsrc/server/g_triggers.qc @@ -413,55 +413,6 @@ void spawnfunc_trigger_hurt() trigger_hurt_last = self; }; -float trace_hits_box_a0, trace_hits_box_a1; - -float trace_hits_box_1d(float end, float thmi, float thma) -{ - if(end == 0) - { - // just check if x is in range - if(0 < thmi) - return FALSE; - if(0 > thma) - return FALSE; - } - else - { - // do the trace with respect to x - // 0 -> end has to stay in thmi -> thma - trace_hits_box_a0 = max(trace_hits_box_a0, min(thmi / end, thma / end)); - trace_hits_box_a1 = min(trace_hits_box_a1, max(thmi / end, thma / end)); - if(trace_hits_box_a0 > trace_hits_box_a1) - return FALSE; - } - return TRUE; -} - -float trace_hits_box(vector start, vector end, vector thmi, vector thma) -{ - end -= start; - thmi -= start; - thma -= start; - // now it is a trace from 0 to end - - trace_hits_box_a0 = 0; - trace_hits_box_a1 = 1; - - if(!trace_hits_box_1d(end_x, thmi_x, thma_x)) - return FALSE; - if(!trace_hits_box_1d(end_y, thmi_y, thma_y)) - return FALSE; - if(!trace_hits_box_1d(end_z, thmi_z, thma_z)) - return FALSE; - - return TRUE; -} - -float tracebox_hits_box(vector start, vector mi, vector ma, vector end, vector thmi, vector thma) -{ - return trace_hits_box(start, end, thmi - ma, thma - mi); -} - float tracebox_hits_trigger_hurt(vector start, vector mi, vector ma, vector end) { entity th; diff --git a/data/qcsrc/server/miscfunctions.qc b/data/qcsrc/server/miscfunctions.qc index 623087cdc..26627bc71 100644 --- a/data/qcsrc/server/miscfunctions.qc +++ b/data/qcsrc/server/miscfunctions.qc @@ -1095,7 +1095,9 @@ void precache() precache_sound ("announcer/male/25kills.wav"); precache_sound ("announcer/male/30kills.wav"); precache_sound ("announcer/male/botlike.wav"); - precache_sound ("announcer/male/yoda.wav"); + precache_sound ("announcer/male/yoda.ogg"); + precache_sound ("announcer/male/headshot.ogg"); + precache_sound ("announcer/male/impressive.ogg"); // announcer sounds - robotic precache_sound ("announcer/robotic/prepareforbattle.wav"); @@ -1560,3 +1562,54 @@ void droptofloor() { InitializeEntity(self, DropToFloor_Handler, INITPRIO_DROPTOFLOOR); } + + + +float trace_hits_box_a0, trace_hits_box_a1; + +float trace_hits_box_1d(float end, float thmi, float thma) +{ + if(end == 0) + { + // just check if x is in range + if(0 < thmi) + return FALSE; + if(0 > thma) + return FALSE; + } + else + { + // do the trace with respect to x + // 0 -> end has to stay in thmi -> thma + trace_hits_box_a0 = max(trace_hits_box_a0, min(thmi / end, thma / end)); + trace_hits_box_a1 = min(trace_hits_box_a1, max(thmi / end, thma / end)); + if(trace_hits_box_a0 > trace_hits_box_a1) + return FALSE; + } + return TRUE; +} + +float trace_hits_box(vector start, vector end, vector thmi, vector thma) +{ + end -= start; + thmi -= start; + thma -= start; + // now it is a trace from 0 to end + + trace_hits_box_a0 = 0; + trace_hits_box_a1 = 1; + + if(!trace_hits_box_1d(end_x, thmi_x, thma_x)) + return FALSE; + if(!trace_hits_box_1d(end_y, thmi_y, thma_y)) + return FALSE; + if(!trace_hits_box_1d(end_z, thmi_z, thma_z)) + return FALSE; + + return TRUE; +} + +float tracebox_hits_box(vector start, vector mi, vector ma, vector end, vector thmi, vector thma) +{ + return trace_hits_box(start, end, thmi - ma, thma - mi); +} diff --git a/data/qcsrc/server/w_common.qc b/data/qcsrc/server/w_common.qc index 8863380b0..96b517c43 100644 --- a/data/qcsrc/server/w_common.qc +++ b/data/qcsrc/server/w_common.qc @@ -28,6 +28,9 @@ void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, f local entity ent, endent; local float endq3surfaceflags; //local entity explosion; + + railgun_start = start; + railgun_end = end; dir = normalize(end - start); force = dir * bforce; diff --git a/data/qcsrc/server/w_minstanex.qc b/data/qcsrc/server/w_minstanex.qc index cf2a0c9ee..74d945bf3 100644 --- a/data/qcsrc/server/w_minstanex.qc +++ b/data/qcsrc/server/w_minstanex.qc @@ -1,3 +1,5 @@ +.float minstanex_lasthit; + void W_MinstaNex_Attack (void) { float flying; @@ -6,12 +8,29 @@ void W_MinstaNex_Attack (void) W_SetupShot (self, '25 8 -4', TRUE, 5, "weapons/nexfire.wav"); yoda = 0; + damage_goodhits = 0; + headshot = 0; FireRailgunBullet (w_shotorg, w_shotorg + w_shotdir * MAX_SHOT_DISTANCE, 10000, 800, WEP_MINSTANEX); - if(!g_minstagib) - if(yoda) - if(flying) - announce(self, "announcer/male/yoda.ogg"); + if(g_minstagib) + { + if(yoda) + announce(self, "announcer/male/yoda.ogg"); + } + else + { + if(yoda && flying) + announce(self, "announcer/male/yoda.ogg"); + else if(headshot) + announce(self, "announcer/male/headshot.ogg"); + else if(damage_goodhits && self.minstanex_lasthit) + { + announce(self, "announcer/male/impressive.ogg"); + damage_goodhits = 0; // only every second time + } + } + + self.minstanex_lasthit = damage_goodhits; pointparticles(particleeffectnum("nex_muzzleflash"), w_shotorg, w_shotdir * 1000, 1); @@ -147,7 +166,10 @@ float w_minstanex(float req) w_laser(WR_PRECACHE); } else if (req == WR_SETUP) + { weapon_setup(WEP_MINSTANEX); + self.minstanex_lasthit = 0; + } else if (req == WR_CHECKAMMO1) { if (g_minstagib) diff --git a/data/qcsrc/server/w_nex.qc b/data/qcsrc/server/w_nex.qc index 4a3021589..f9262f7a2 100644 --- a/data/qcsrc/server/w_nex.qc +++ b/data/qcsrc/server/w_nex.qc @@ -8,8 +8,7 @@ void W_Nex_Attack (void) yoda = 0; FireRailgunBullet (w_shotorg, w_shotorg + w_shotdir * MAX_SHOT_DISTANCE, cvar("g_balance_nex_damage"), cvar("g_balance_nex_force"), WEP_NEX); - if(yoda) - if(flying) + if(yoda && flying) announce(self, "announcer/male/yoda.ogg"); pointparticles(particleeffectnum("nex_muzzleflash"), w_shotorg, w_shotdir * 1000, 1); -- 2.39.2