From cd8f2e66d26e9d64b576b2def577fc04d567eac7 Mon Sep 17 00:00:00 2001 From: div0 Date: Thu, 9 Oct 2008 06:31:51 +0000 Subject: [PATCH] more death types (now weapons know whether the hit was primary or secondary, whether it was splash damage or not, and whether the projectile bounced before the hit) git-svn-id: svn://svn.icculus.org/nexuiz/trunk@4680 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/server/cl_player.qc | 2 +- data/qcsrc/server/constants.qh | 7 ++++ data/qcsrc/server/defs.qh | 5 ++- data/qcsrc/server/g_damage.qc | 17 +++++--- data/qcsrc/server/miscfunctions.qc | 20 +++++++++ .../tturrets/system/turret_system_damage.qc | 2 +- .../server/tturrets/units/turret_unit_flac.qc | 2 +- .../tturrets/units/turret_unit_hellion.qc | 2 +- .../server/tturrets/units/turret_unit_hk.qc | 2 +- .../server/tturrets/units/turret_unit_mlrs.qc | 4 +- .../tturrets/units/turret_unit_plasma.qc | 4 +- data/qcsrc/server/w_crylink.qc | 25 ++++++++--- data/qcsrc/server/w_electro.qc | 42 +++++++++++++++---- data/qcsrc/server/w_grenadelauncher.qc | 32 ++++++++++---- data/qcsrc/server/w_hagar.qc | 27 ++++++++---- data/qcsrc/server/w_laser.qc | 15 +++++-- data/qcsrc/server/w_porto.qc | 2 +- data/qcsrc/server/w_rocketlauncher.qc | 16 ++++++- data/qcsrc/server/w_shotgun.qc | 6 ++- data/qcsrc/server/w_uzi.qc | 19 +++++---- 20 files changed, 192 insertions(+), 59 deletions(-) diff --git a/data/qcsrc/server/cl_player.qc b/data/qcsrc/server/cl_player.qc index 19746670c..23b4b2116 100644 --- a/data/qcsrc/server/cl_player.qc +++ b/data/qcsrc/server/cl_player.qc @@ -413,7 +413,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht else player_setanim(self.anim_pain2, FALSE, TRUE, TRUE); - if(deathtype != WEP_LASER || attacker != self || self.health < 2 * cvar("g_balance_laser_primary_damage") * cvar("g_balance_selfdamagepercent") + 1) + if(deathtype >= DEATH_SPECIAL_START || deathtype & DEATH_WEAPONMASK != WEP_LASER || attacker != self || self.health < 2 * cvar("g_balance_laser_primary_damage") * cvar("g_balance_selfdamagepercent") + 1) // exclude pain sounds for laserjumps as long as you aren't REALLY low on health and would die of the next two { if(self.health > 75) // TODO make a "gentle" version? diff --git a/data/qcsrc/server/constants.qh b/data/qcsrc/server/constants.qh index 27feb0e36..be30c8595 100644 --- a/data/qcsrc/server/constants.qh +++ b/data/qcsrc/server/constants.qh @@ -163,6 +163,7 @@ float MSG_ENTITY = 5; // Deathtypes (weapon deathtypes are the IT_* constants below) // NOTE: when adding death types, please add an explanation to Docs/spamlog.txt too. +float DEATH_SPECIAL_START = 10000; float DEATH_FALL = 10000; float DEATH_TELEFRAG = 10001; float DEATH_DROWN = 10002; @@ -180,6 +181,12 @@ float DEATH_ROT = 10013; float DEATH_MIRRORDAMAGE = 10014; float DEATH_TURRET = 10100; +float DEATH_WEAPONMASK = 0xFF; +float DEATH_HITTYPEMASK = 0xF00; // which is WAY below 10000 used for normal deaths +float HITTYPE_SECONDARY = 0x100; +float HITTYPE_SPLASH = 0x200; +float HITTYPE_BOUNCE = 0x400; + vector PL_VIEW_OFS = '0 0 35'; vector PL_MIN = '-16 -16 -24'; vector PL_MAX = '16 16 45'; diff --git a/data/qcsrc/server/defs.qh b/data/qcsrc/server/defs.qh index a8b908533..2cf4a83b6 100644 --- a/data/qcsrc/server/defs.qh +++ b/data/qcsrc/server/defs.qh @@ -208,12 +208,13 @@ float WR_CHECKAMMO1 = 3; // checks ammo for weapon float WR_CHECKAMMO2 = 4; // checks ammo for weapon float WR_AIM = 5; // runs bot aiming code for this weapon float WR_PRECACHE = 6; // precaches models/sounds used by this weapon -float WR_SUICIDEMESSAGE = 7; // sets w_deathtypestring or leaves it alone +float WR_SUICIDEMESSAGE = 7; // sets w_deathtypestring or leaves it alone (and may inspect w_deathtype for details) float WR_KILLMESSAGE = 8; // sets w_deathtypestring or leaves it alone void weapon_defaultspawnfunc(float wpn); string w_deathtypestring; +float w_deathtype; void(entity client, string s) centerprint_builtin = #73; .vector dest1, dest2; @@ -494,3 +495,5 @@ float game_starttime; //point in time when the countdown is over .float stat_game_starttime; void W_Porto_Remove (entity p); + +.float projectiledeathtype; diff --git a/data/qcsrc/server/g_damage.qc b/data/qcsrc/server/g_damage.qc index ded9d3208..ec004fca0 100644 --- a/data/qcsrc/server/g_damage.qc +++ b/data/qcsrc/server/g_damage.qc @@ -209,10 +209,11 @@ void Obituary (entity attacker, entity targ, float deathtype) if (targ.killcount > 2) bprint ("^1",s,"^1 ended it all with a ",ftos(targ.killcount)," scoring spree\n"); } else { - if(deathtype >= WEP_FIRST && deathtype <= WEP_LAST) + if(deathtype < DEATH_SPECIAL_START && deathtype & DEATH_WEAPONMASK >= WEP_FIRST && deathtype & DEATH_WEAPONMASK <= WEP_LAST) { w_deathtypestring = "couldn't resist the urge to self-destruct"; - weapon_action(deathtype, WR_SUICIDEMESSAGE); + w_deathtype = deathtype; + weapon_action(deathtype & DEATH_WEAPONMASK, WR_SUICIDEMESSAGE); bprint("^1", s, "^1 ", w_deathtypestring, "\n"); } else if (deathtype == DEATH_KILL) @@ -289,10 +290,11 @@ void Obituary (entity attacker, entity targ, float deathtype) if(sv_gentle) { bprint ("^1",s, "^1 needs a restart thanks to ", a, "\n"); } else { - if(deathtype >= WEP_FIRST && deathtype <= WEP_LAST) + if(deathtype < DEATH_SPECIAL_START && deathtype & DEATH_WEAPONMASK >= WEP_FIRST && deathtype & DEATH_WEAPONMASK <= WEP_LAST) { w_deathtypestring = "was blasted by"; - weapon_action(deathtype, WR_KILLMESSAGE); + w_deathtype = deathtype; + weapon_action(deathtype & DEATH_WEAPONMASK, WR_KILLMESSAGE); p = strstrofs(w_deathtypestring, "#", 0); if(p < 0) bprint("^1", s, "^1 ", w_deathtypestring, " ", a, "\n"); @@ -771,7 +773,7 @@ vector NearestPointOnBox(entity box, vector org) return nearest; } -float RadiusDamage (entity inflictor, entity attacker, float coredamage, float edgedamage, float rad, entity ignore, float forceintensity, float deathtype) +float RadiusDamage (entity inflictor, entity attacker, float coredamage, float edgedamage, float rad, entity ignore, float forceintensity, float deathtype, entity directhitentity) // Returns total damage applies to creatures { entity targ; @@ -829,7 +831,10 @@ float RadiusDamage (entity inflictor, entity attacker, float coredamage, float e { if(targ.iscreature) total_damage_to_creatures += finaldmg; - Damage (targ, inflictor, attacker, finaldmg, deathtype, nearest, force); + if(targ == directhitentity) + Damage (targ, inflictor, attacker, finaldmg, deathtype, nearest, force); + else + Damage (targ, inflictor, attacker, finaldmg, deathtype | HITTYPE_SPLASH, nearest, force); break; } nearest_x = targ.mins_x + random() * targ.size_x; diff --git a/data/qcsrc/server/miscfunctions.qc b/data/qcsrc/server/miscfunctions.qc index 733e26063..63614b497 100644 --- a/data/qcsrc/server/miscfunctions.qc +++ b/data/qcsrc/server/miscfunctions.qc @@ -1518,3 +1518,23 @@ void Net_LinkEntity(entity e) e.effects = EF_NODEPTHTEST | EF_LOWPRECISION; } +void adaptor_think2touch() +{ + entity o; + o = other; + other = world; + self.touch(); + other = o; +} + +void adaptor_think2use() +{ + entity o, a; + o = other; + a = activator; + activator = world; + other = world; + self.use(); + other = o; + activator = a; +} diff --git a/data/qcsrc/server/tturrets/system/turret_system_damage.qc b/data/qcsrc/server/tturrets/system/turret_system_damage.qc index fa274d759..cf3b39560 100644 --- a/data/qcsrc/server/tturrets/system/turret_system_damage.qc +++ b/data/qcsrc/server/tturrets/system/turret_system_damage.qc @@ -193,7 +193,7 @@ void turret_stdproc_die() // Go boom - RadiusDamage (self,self, min(self.ammo,50),min(self.ammo,50) * 0.25,250,world,min(self.ammo,50)*5,0); + RadiusDamage (self,self, min(self.ammo,50),min(self.ammo,50) * 0.25,250,world,min(self.ammo,50)*5,0,world); // Setup respawn self.nextthink = time + self.respawntime; diff --git a/data/qcsrc/server/tturrets/units/turret_unit_flac.qc b/data/qcsrc/server/tturrets/units/turret_unit_flac.qc index 38d92c86a..ae5b9be3b 100644 --- a/data/qcsrc/server/tturrets/units/turret_unit_flac.qc +++ b/data/qcsrc/server/tturrets/units/turret_unit_flac.qc @@ -52,7 +52,7 @@ void turret_flac_projectile_explode() self.event_damage = SUB_Null; - ftmp = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET); + ftmp = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world); #ifdef TURRET_DEBUG self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg; diff --git a/data/qcsrc/server/tturrets/units/turret_unit_hellion.qc b/data/qcsrc/server/tturrets/units/turret_unit_hellion.qc index 2f218e1b9..a351691a3 100644 --- a/data/qcsrc/server/tturrets/units/turret_unit_hellion.qc +++ b/data/qcsrc/server/tturrets/units/turret_unit_hellion.qc @@ -160,7 +160,7 @@ void turret_hellion_missile_explode() WriteCoord (MSG_BROADCAST, org2_z); self.event_damage = SUB_Null; - d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET); + d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world); #ifdef TURRET_DEBUG self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg; diff --git a/data/qcsrc/server/tturrets/units/turret_unit_hk.qc b/data/qcsrc/server/tturrets/units/turret_unit_hk.qc index 1194623cf..bc417fc83 100644 --- a/data/qcsrc/server/tturrets/units/turret_unit_hk.qc +++ b/data/qcsrc/server/tturrets/units/turret_unit_hk.qc @@ -367,7 +367,7 @@ void turret_hk_missile_explode() WriteCoord (MSG_BROADCAST, org2_z); self.event_damage = SUB_Null; - d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET); + d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world); #ifdef TURRET_DEBUG self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg; diff --git a/data/qcsrc/server/tturrets/units/turret_unit_mlrs.qc b/data/qcsrc/server/tturrets/units/turret_unit_mlrs.qc index b38b84afc..cb4716c56 100644 --- a/data/qcsrc/server/tturrets/units/turret_unit_mlrs.qc +++ b/data/qcsrc/server/tturrets/units/turret_unit_mlrs.qc @@ -61,11 +61,11 @@ void turret_mlrs_projectile_explode() #ifdef TURRET_DEBUG float d; - d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET); + d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world); self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg; self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg; #else - RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET); + RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world); #endif // Target dead, get another is still targeting the same. diff --git a/data/qcsrc/server/tturrets/units/turret_unit_plasma.qc b/data/qcsrc/server/tturrets/units/turret_unit_plasma.qc index a7a975075..bc7dcb57f 100644 --- a/data/qcsrc/server/tturrets/units/turret_unit_plasma.qc +++ b/data/qcsrc/server/tturrets/units/turret_unit_plasma.qc @@ -85,11 +85,11 @@ void turret_plasma_projectile_explode() #ifdef TURRET_DEBUG float d; - d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET); + d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world); self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg; self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg; #else - RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET); + RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world); #endif sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", 1, ATTN_NORM); diff --git a/data/qcsrc/server/w_crylink.qc b/data/qcsrc/server/w_crylink.qc index 03854fd1a..1cb4880e0 100644 --- a/data/qcsrc/server/w_crylink.qc +++ b/data/qcsrc/server/w_crylink.qc @@ -20,7 +20,7 @@ void W_Crylink_Touch (void) f = cvar("g_balance_crylink_primary_bouncedamagefactor"); if(self.alpha) f *= self.alpha; - RadiusDamage (self, self.realowner, cvar("g_balance_crylink_primary_damage") * f, cvar("g_balance_crylink_primary_edgedamage") * f, cvar("g_balance_crylink_primary_radius"), world, cvar("g_balance_crylink_primary_force") * f, WEP_CRYLINK); + RadiusDamage (self, self.realowner, cvar("g_balance_crylink_primary_damage") * f, cvar("g_balance_crylink_primary_edgedamage") * f, cvar("g_balance_crylink_primary_radius"), world, cvar("g_balance_crylink_primary_force") * f, self.projectiledeathtype, other); if (finalhit) { remove (self); @@ -29,6 +29,7 @@ void W_Crylink_Touch (void) self.cnt = self.cnt - 1; self.angles = vectoangles(self.velocity); self.owner = world; + self.projectiledeathtype |= HITTYPE_BOUNCE; //self.scale = 1 + self.cnt; } @@ -49,7 +50,7 @@ void W_Crylink_Touch2 (void) f = cvar("g_balance_crylink_secondary_bouncedamagefactor"); if(self.alpha) f *= self.alpha; - RadiusDamage (self, self.realowner, cvar("g_balance_crylink_secondary_damage") * f, cvar("g_balance_crylink_secondary_edgedamage") * f, cvar("g_balance_crylink_secondary_radius"), world, cvar("g_balance_crylink_secondary_force") * f, WEP_CRYLINK); + RadiusDamage (self, self.realowner, cvar("g_balance_crylink_secondary_damage") * f, cvar("g_balance_crylink_secondary_edgedamage") * f, cvar("g_balance_crylink_secondary_radius"), world, cvar("g_balance_crylink_secondary_force") * f, self.projectiledeathtype, other); if (finalhit) { remove (self); @@ -58,6 +59,7 @@ void W_Crylink_Touch2 (void) self.cnt = self.cnt - 1; self.angles = vectoangles(self.velocity); self.owner = world; + self.projectiledeathtype |= HITTYPE_BOUNCE; // self.scale = 1 + 1 * self.cnt; } @@ -84,6 +86,7 @@ void W_Crylink_Attack (void) proj.movetype = MOVETYPE_BOUNCEMISSILE; proj.solid = SOLID_BBOX; + proj.projectiledeathtype = WEP_CRYLINK; //proj.gravity = 0.001; setmodel (proj, "models/plasmatrail.mdl"); // precision set below @@ -148,6 +151,7 @@ void W_Crylink_Attack2 (void) proj.movetype = MOVETYPE_BOUNCEMISSILE; proj.solid = SOLID_BBOX; + proj.projectiledeathtype = WEP_CRYLINK | HITTYPE_SECONDARY; //proj.gravity = 0.001; setmodel (proj, "models/plasmatrail.mdl"); // precision set below @@ -191,7 +195,7 @@ void W_Crylink_Attack3 (void) trailparticles(world, particleeffectnum("lightning_beam", w_shotorg, trace_endpos); if (trace_fraction < 1) - Damage(trace_ent, self, self, cvar("g_balance_crylink_primary_damage"), WEP_CRYLINK, trace_endpos, '0 0 0'); + Damage(trace_ent, self, self, cvar("g_balance_crylink_primary_damage"), WEP_CRYLINK | HITTYPE_SECONDARY, trace_endpos, '0 0 0'); } */ @@ -239,7 +243,18 @@ float w_crylink(float req) return self.ammo_cells >= cvar("g_balance_crylink_primary_ammo"); else if (req == WR_CHECKAMMO2) return self.ammo_cells >= cvar("g_balance_crylink_secondary_ammo"); - // else if (req == WR_SUICIDEMESSAGE) // TODO - // else if (req == WR_KILLMESSAGE) // TODO + else if (req == WR_SUICIDEMESSAGE) + { + w_deathtypestring = "succeeded at self-destructing himself with the Crylink"; + } + else if (req == WR_KILLMESSAGE) + { + if(w_deathtype & HITTYPE_BOUNCE) + w_deathtypestring = "could not hide from #'s Crylink"; // unchecked: SPLASH (SECONDARY can't be) + else if(w_deathtype & HITTYPE_SPLASH) + w_deathtypestring = "was too close to #'s Crylink"; // unchecked: SECONDARY + else + w_deathtypestring = "took a close look at #'s Crylink"; // unchecked: SECONDARY + } return TRUE; }; diff --git a/data/qcsrc/server/w_electro.qc b/data/qcsrc/server/w_electro.qc index 6d2d66da8..4b177f44b 100644 --- a/data/qcsrc/server/w_electro.qc +++ b/data/qcsrc/server/w_electro.qc @@ -8,12 +8,12 @@ void W_Plasma_Explode (void) if (self.movetype == MOVETYPE_BOUNCE) { pointparticles(particleeffectnum("electro_ballexplode"), org2, '0 0 0', 1); - RadiusDamage (self, self.owner, cvar("g_balance_electro_secondary_damage"), cvar("g_balance_electro_secondary_edgedamage"), cvar("g_balance_electro_secondary_radius"), world, cvar("g_balance_electro_secondary_force"), WEP_ELECTRO); + RadiusDamage (self, self.owner, cvar("g_balance_electro_secondary_damage"), cvar("g_balance_electro_secondary_edgedamage"), cvar("g_balance_electro_secondary_radius"), world, cvar("g_balance_electro_secondary_force"), self.projectiledeathtype, other); } else { pointparticles(particleeffectnum("electro_impact"), org2, '0 0 0', 1); - RadiusDamage (self, self.owner, cvar("g_balance_electro_primary_damage"), cvar("g_balance_electro_primary_edgedamage"), cvar("g_balance_electro_primary_radius"), world, cvar("g_balance_electro_primary_force"), WEP_ELECTRO); + RadiusDamage (self, self.owner, cvar("g_balance_electro_primary_damage"), cvar("g_balance_electro_primary_edgedamage"), cvar("g_balance_electro_primary_radius"), world, cvar("g_balance_electro_primary_force"), self.projectiledeathtype, other); } sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM); @@ -29,7 +29,7 @@ void W_Plasma_Explode_Combo (void) { sound (self, CHAN_PROJECTILE, "weapons/electro_impact_combo.wav", VOL_BASE, ATTN_NORM); self.event_damage = SUB_Null; - RadiusDamage (self, self.owner, cvar("g_balance_electro_combo_damage"), cvar("g_balance_electro_combo_edgedamage"), cvar("g_balance_electro_combo_radius"), world, cvar("g_balance_electro_combo_force"), WEP_ELECTRO); + RadiusDamage (self, self.owner, cvar("g_balance_electro_combo_damage"), cvar("g_balance_electro_combo_edgedamage"), cvar("g_balance_electro_combo_radius"), world, cvar("g_balance_electro_combo_force"), WEP_ELECTRO | HITTYPE_BOUNCE, other); // use THIS type for a combo because primary can't bounce remove (self); } @@ -51,6 +51,7 @@ void W_Plasma_Touch (void) announce(o, "announcer/male/electrobitch.ogg"); } else { sound (self, CHAN_PROJECTILE, "weapons/electro_bounce.wav", VOL_BASE, ATTN_NORM); + self.projectiledeathtype |= HITTYPE_BOUNCE; } } @@ -104,9 +105,11 @@ void W_Electro_Attack() proj.owner = self; proj.bot_dodge = TRUE; proj.bot_dodgerating = cvar("g_balance_electro_primary_damage"); - proj.think = W_Plasma_Explode; + proj.use = W_Plasma_Explode; + proj.think = adaptor_think2use; proj.nextthink = time + cvar("g_balance_electro_primary_lifetime"); proj.solid = SOLID_BBOX; + proj.projectiledeathtype = WEP_ELECTRO; setorigin(proj, w_shotorg); if not(self.items & IT_UNLIMITED_AMMO) @@ -136,11 +139,13 @@ void W_Electro_Attack2() proj = spawn (); proj.classname = "plasma"; proj.owner = self; - proj.think = W_Plasma_Explode; + proj.use = W_Plasma_Explode; + proj.think = adaptor_think2use; proj.bot_dodge = TRUE; proj.bot_dodgerating = cvar("g_balance_electro_secondary_damage"); proj.nextthink = time + cvar("g_balance_electro_secondary_lifetime"); proj.solid = SOLID_BBOX; + proj.projectiledeathtype = WEP_ELECTRO | HITTYPE_SECONDARY; setorigin(proj, w_shotorg); if not(self.items & IT_UNLIMITED_AMMO) @@ -231,7 +236,30 @@ float w_electro(float req) else if (req == WR_CHECKAMMO2) return self.ammo_cells >= cvar("g_balance_electro_secondary_ammo"); else if (req == WR_SUICIDEMESSAGE) - w_deathtypestring = "played with plasma"; - // else if (req == WR_KILLMESSAGE) // TODO + { + if(w_deathtype & HITTYPE_SECONDARY) + w_deathtypestring = "could not remember where he put plasma"; + else + w_deathtypestring = "played with plasma"; + } + else if (req == WR_KILLMESSAGE) + { + if(w_deathtype & HITTYPE_SECONDARY) + { + if(w_deathtype & HITTYPE_SPLASH) // unchecked: BOUNCE + w_deathtypestring = "just noticed #'s blue ball"; + else // unchecked: BOUNCE + w_deathtypestring = "got in touch with #'s blue ball"; + } + else + { + if(w_deathtype & HITTYPE_BOUNCE) // combo + w_deathtypestring = "felt the electrifying air of #'s combo"; + else if(w_deathtype & HITTYPE_SPLASH) + w_deathtypestring = "got too close to #'s blue beam"; + else + w_deathtypestring = "was blasted by #'s blue beam"; + } + } return TRUE; }; diff --git a/data/qcsrc/server/w_grenadelauncher.qc b/data/qcsrc/server/w_grenadelauncher.qc index 47f783a5b..854bec78b 100644 --- a/data/qcsrc/server/w_grenadelauncher.qc +++ b/data/qcsrc/server/w_grenadelauncher.qc @@ -6,7 +6,7 @@ void W_Grenade_Explode (void) sound (self, CHAN_PROJECTILE, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM); self.event_damage = SUB_Null; - RadiusDamage (self, self.owner, cvar("g_balance_grenadelauncher_primary_damage"), cvar("g_balance_grenadelauncher_primary_edgedamage"), cvar("g_balance_grenadelauncher_primary_radius"), world, cvar("g_balance_grenadelauncher_primary_force"), WEP_GRENADE_LAUNCHER); + RadiusDamage (self, self.owner, cvar("g_balance_grenadelauncher_primary_damage"), cvar("g_balance_grenadelauncher_primary_edgedamage"), cvar("g_balance_grenadelauncher_primary_radius"), world, cvar("g_balance_grenadelauncher_primary_force"), self.projectiledeathtype, other); remove (self); } @@ -19,7 +19,7 @@ void W_Grenade_Explode2 (void) sound (self, CHAN_PROJECTILE, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM); self.event_damage = SUB_Null; - RadiusDamage (self, self.owner, cvar("g_balance_grenadelauncher_secondary_damage"), cvar("g_balance_grenadelauncher_secondary_edgedamage"), cvar("g_balance_grenadelauncher_secondary_radius"), world, cvar("g_balance_grenadelauncher_secondary_force"), WEP_GRENADE_LAUNCHER); + RadiusDamage (self, self.owner, cvar("g_balance_grenadelauncher_secondary_damage"), cvar("g_balance_grenadelauncher_secondary_edgedamage"), cvar("g_balance_grenadelauncher_secondary_radius"), world, cvar("g_balance_grenadelauncher_secondary_force"), self.projectiledeathtype, other); remove (self); } @@ -42,7 +42,7 @@ void W_Grenade_Touch2 (void) return; } if (other.takedamage == DAMAGE_AIM) - self.think (); + self.use (); else { float r; @@ -59,6 +59,7 @@ void W_Grenade_Touch2 (void) sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce5.wav", VOL_BASE, ATTN_NORM); else sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce6.wav", VOL_BASE, ATTN_NORM); + self.projectiledeathtype |= HITTYPE_BOUNCE; } } @@ -92,12 +93,14 @@ void W_Grenade_Attack (void) gren.solid = SOLID_BBOX; gren.effects = EF_LOWPRECISION; gren.modelflags = MF_GRENADE; + gren.projectiledeathtype = WEP_GRENADE_LAUNCHER; setmodel(gren, "models/grenademodel.md3"); // precision set above setsize(gren, '0 0 0', '0 0 0'); setorigin(gren, w_shotorg); gren.nextthink = time + cvar("g_balance_grenadelauncher_primary_lifetime"); - gren.think = W_Grenade_Explode; + gren.think = adaptor_think2use; + gren.use = W_Grenade_Explode; gren.touch = W_Grenade_Touch1; gren.velocity = w_shotdir * cvar("g_balance_grenadelauncher_primary_speed") + v_up * cvar("g_balance_grenadelauncher_primary_speed_up"); W_SetupProjectileVelocity(gren); @@ -127,12 +130,14 @@ void W_Grenade_Attack2 (void) gren.solid = SOLID_BBOX; gren.effects = EF_LOWPRECISION; gren.modelflags = MF_GRENADE; + gren.projectiledeathtype = WEP_GRENADE_LAUNCHER | HITTYPE_SECONDARY; setmodel(gren, "models/grenademodel.md3"); // precision set above setsize(gren, '0 0 -3', '0 0 -3'); setorigin(gren, w_shotorg); gren.nextthink = time + cvar("g_balance_grenadelauncher_secondary_lifetime"); - gren.think = W_Grenade_Explode2; + gren.think = adaptor_think2use; + gren.use = W_Grenade_Explode2; gren.touch = W_Grenade_Touch2; gren.takedamage = DAMAGE_YES; gren.health = cvar("g_balance_grenadelauncher_secondary_health"); @@ -212,8 +217,21 @@ float w_glauncher(float req) else if (req == WR_CHECKAMMO2) return self.ammo_rockets >= cvar("g_balance_grenadelauncher_secondary_ammo"); else if (req == WR_SUICIDEMESSAGE) - w_deathtypestring = "detonated"; + { + if(w_deathtype & HITTYPE_SECONDARY) + w_deathtypestring = "tried out his own grenade"; + else + w_deathtypestring = "detonated"; + } else if (req == WR_KILLMESSAGE) - w_deathtypestring = "was blasted by"; + { + if(w_deathtype & HITTYPE_SPLASH) + if(w_deathtype & HITTYPE_BOUNCE) // (must be secondary then) + w_deathtypestring = "didn't see #'s grenade"; + else // unchecked: SECONDARY + w_deathtypestring = "almost dodged #'s grenade"; + else // unchecked: SECONDARY, BOUNCE + w_deathtypestring = "ate #'s grenade"; + } return TRUE; }; diff --git a/data/qcsrc/server/w_hagar.qc b/data/qcsrc/server/w_hagar.qc index e05055e14..5fc2e7f6e 100644 --- a/data/qcsrc/server/w_hagar.qc +++ b/data/qcsrc/server/w_hagar.qc @@ -13,7 +13,7 @@ void W_Hagar_Explode (void) sound (self, CHAN_PROJECTILE, "weapons/hagexp3.wav", VOL_BASE, ATTN_NORM); self.event_damage = SUB_Null; - RadiusDamage (self, self.realowner, cvar("g_balance_hagar_primary_damage"), cvar("g_balance_hagar_primary_edgedamage"), cvar("g_balance_hagar_primary_radius"), world, cvar("g_balance_hagar_primary_force"), WEP_HAGAR); + RadiusDamage (self, self.realowner, cvar("g_balance_hagar_primary_damage"), cvar("g_balance_hagar_primary_edgedamage"), cvar("g_balance_hagar_primary_radius"), world, cvar("g_balance_hagar_primary_force"), self.projectiledeathtype, other); remove (self); } @@ -33,7 +33,7 @@ void W_Hagar_Explode2 (void) sound (self, CHAN_PROJECTILE, "weapons/hagexp3.wav", VOL_BASE, ATTN_NORM); self.event_damage = SUB_Null; - RadiusDamage (self, self.realowner, cvar("g_balance_hagar_secondary_damage"), cvar("g_balance_hagar_secondary_edgedamage"), cvar("g_balance_hagar_secondary_radius"), world, cvar("g_balance_hagar_secondary_force"), WEP_HAGAR); + RadiusDamage (self, self.realowner, cvar("g_balance_hagar_secondary_damage"), cvar("g_balance_hagar_secondary_edgedamage"), cvar("g_balance_hagar_secondary_radius"), world, cvar("g_balance_hagar_secondary_force"), self.projectiledeathtype, other); remove (self); } @@ -48,7 +48,7 @@ void W_Hagar_Touch (void) if (other == self.owner) return; - self.think (); + self.use (); } void W_Hagar_Touch2 (void) @@ -60,12 +60,13 @@ void W_Hagar_Touch2 (void) } if(self.cnt > 0 || other.takedamage == DAMAGE_AIM) { - self.think(); + self.use(); } else { self.cnt++; pointparticles(particleeffectnum("hagar_bounce"), self.origin, self.velocity, 1); self.angles = vectoangles (self.velocity); self.owner = world; + self.projectiledeathtype |= HITTYPE_BOUNCE; } } @@ -93,10 +94,12 @@ void W_Hagar_Attack (void) missile.bot_dodge = TRUE; missile.bot_dodgerating = cvar("g_balance_hagar_primary_damage"); missile.touch = W_Hagar_Touch; - missile.think = W_Hagar_Explode; + missile.use = W_Hagar_Explode; + missile.think = adaptor_think2use; missile.nextthink = time + cvar("g_balance_hagar_primary_lifetime"); missile.solid = SOLID_BBOX; missile.scale = 0.4; // BUG: the model is too big + missile.projectiledeathtype = WEP_HAGAR; setorigin (missile, w_shotorg); setmodel (missile, "models/hagarmissile.mdl"); // precision set below setsize (missile, '0 0 0', '0 0 0'); @@ -133,10 +136,12 @@ void W_Hagar_Attack2 (void) missile.bot_dodgerating = cvar("g_balance_hagar_secondary_damage"); missile.touch = W_Hagar_Touch2; missile.cnt = 0; - missile.think = W_Hagar_Explode; + missile.use = W_Hagar_Explode; + missile.think = adaptor_think2use; missile.nextthink = time + cvar("g_balance_hagar_secondary_lifetime"); missile.solid = SOLID_BBOX; missile.scale = 0.4; // BUG: the model is too big + missile.projectiledeathtype = WEP_HAGAR | HITTYPE_SECONDARY; setorigin (missile, w_shotorg); setmodel (missile, "models/hagarmissile.mdl"); // precision set below setsize (missile, '0 0 0', '0 0 0'); @@ -203,8 +208,14 @@ float w_hagar(float req) return self.ammo_rockets >= cvar("g_balance_hagar_primary_ammo"); else if (req == WR_CHECKAMMO2) return self.ammo_rockets >= cvar("g_balance_hagar_secondary_ammo"); - // else if (req == WR_SUICIDEMESSAGE) // TODO + else if (req == WR_SUICIDEMESSAGE) + w_deathtypestring = "played with tiny rockets"; else if (req == WR_KILLMESSAGE) - w_deathtypestring = "was pummeled by"; + { + if(w_deathtype & HITTYPE_BOUNCE) // must be secondary; unchecked: SPLASH + w_deathtypestring = "hoped #'s missiles wouldn't bounce"; + else // unchecked: SPLASH, SECONDARY + w_deathtypestring = "was pummeled by"; + } return TRUE; }; diff --git a/data/qcsrc/server/w_laser.qc b/data/qcsrc/server/w_laser.qc index aa14f4ced..c1aff0f5e 100644 --- a/data/qcsrc/server/w_laser.qc +++ b/data/qcsrc/server/w_laser.qc @@ -24,9 +24,9 @@ void W_Laser_Touch (void) self.event_damage = SUB_Null; if (self.dmg) - RadiusDamage (self, self.owner, cvar("g_balance_laser_secondary_damage"), cvar("g_balance_laser_secondary_edgedamage"), cvar("g_balance_laser_secondary_radius"), world, cvar("g_balance_laser_secondary_force"), WEP_LASER); + RadiusDamage (self, self.owner, cvar("g_balance_laser_secondary_damage"), cvar("g_balance_laser_secondary_edgedamage"), cvar("g_balance_laser_secondary_radius"), world, cvar("g_balance_laser_secondary_force"), self.projectiledeathtype, other); else - RadiusDamage (self, self.owner, cvar("g_balance_laser_primary_damage"), cvar("g_balance_laser_primary_edgedamage"), cvar("g_balance_laser_primary_radius"), world, cvar("g_balance_laser_primary_force"), WEP_LASER); + RadiusDamage (self, self.owner, cvar("g_balance_laser_primary_damage"), cvar("g_balance_laser_primary_edgedamage"), cvar("g_balance_laser_primary_radius"), world, cvar("g_balance_laser_primary_force"), self.projectiledeathtype, other); sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM); remove (self); @@ -51,6 +51,9 @@ void W_Laser_Attack (float issecondary) missile.movetype = MOVETYPE_FLY; missile.solid = SOLID_BBOX; + missile.projectiledeathtype = WEP_LASER; + if(issecondary) + missile.projectiledeathtype |= HITTYPE_SECONDARY; setmodel (missile, "models/laser.mdl"); // precision set below setsize (missile, '0 0 0', '0 0 0'); @@ -133,7 +136,11 @@ float w_laser(float req) return TRUE; else if (req == WR_CHECKAMMO2) return TRUE; - // else if (req == WR_SUICIDEMESSAGE) // TODO - // else if (req == WR_KILLMESSAGE) // TODO + else if (req == WR_SUICIDEMESSAGE) + w_deathtypestring = "lasered himself to hell"; + else if (req == WR_KILLMESSAGE) + { + w_deathtypestring = "was lasered to death by"; // unchecked: SPLASH + } return TRUE; }; diff --git a/data/qcsrc/server/w_porto.qc b/data/qcsrc/server/w_porto.qc index 2c4bd2e8a..84ae8c2f6 100644 --- a/data/qcsrc/server/w_porto.qc +++ b/data/qcsrc/server/w_porto.qc @@ -274,6 +274,6 @@ float w_porto(float req) else if (req == WR_SUICIDEMESSAGE) w_deathtypestring = "did the impossible"; else if (req == WR_KILLMESSAGE) - w_deathtypestring = "felt # doing the impossible"; + w_deathtypestring = "felt # doing the impossible to him"; return TRUE; }; diff --git a/data/qcsrc/server/w_rocketlauncher.qc b/data/qcsrc/server/w_rocketlauncher.qc index 5fe5ce564..3befc2a76 100644 --- a/data/qcsrc/server/w_rocketlauncher.qc +++ b/data/qcsrc/server/w_rocketlauncher.qc @@ -12,7 +12,7 @@ void W_Rocket_Explode (void) //effect (org2, "models/sprites/rockexpl.spr", 0, 12, 35); self.event_damage = SUB_Null; - RadiusDamage (self, self.owner, cvar("g_balance_rocketlauncher_damage"), cvar("g_balance_rocketlauncher_edgedamage"), cvar("g_balance_rocketlauncher_radius"), world, cvar("g_balance_rocketlauncher_force"), WEP_ROCKET_LAUNCHER); + RadiusDamage (self, self.owner, cvar("g_balance_rocketlauncher_damage"), cvar("g_balance_rocketlauncher_edgedamage"), cvar("g_balance_rocketlauncher_radius"), world, cvar("g_balance_rocketlauncher_force"), self.projectiledeathtype, other); if (self.owner.weapon == WEP_ROCKET_LAUNCHER) { @@ -89,6 +89,8 @@ void W_Rocket_RemoteExplode() : (vlen(NearestPointOnBox(self.owner, self.origin) - self.origin) > cvar("g_balance_rocketlauncher_radius")) // safety device ) { + other = world; + self.projectiledeathtype |= HITTYPE_BOUNCE; W_Rocket_Explode (); } else @@ -105,6 +107,8 @@ void W_Rocket_Think (void) self.nextthink = time; if (time > self.cnt) { + other = world; + self.projectiledeathtype |= HITTYPE_BOUNCE; W_Rocket_Explode (); return; } @@ -238,6 +242,7 @@ void W_Rocket_Attack (void) missile.movetype = MOVETYPE_FLY; missile.solid = SOLID_BBOX; + missile.projectiledeathtype = WEP_ROCKET_LAUNCHER; setmodel (missile, "models/rocket.md3"); // precision set below setsize (missile, '-3 -3 -3', '3 3 3'); // give it some size so it can be shot @@ -435,6 +440,13 @@ float w_rlauncher(float req) else if (req == WR_SUICIDEMESSAGE) w_deathtypestring = "exploded"; else if (req == WR_KILLMESSAGE) - w_deathtypestring = "almost dodged #'s rocket"; + { + if(w_deathtype & HITTYPE_BOUNCE) // (remote detonation) + w_deathtypestring = "got too close to #'s rocket"; + else if(w_deathtype & HITTYPE_SPLASH) + w_deathtypestring = "almost dodged #'s rocket"; + else + w_deathtypestring = "ate #'s rocket"; + } return TRUE; }; diff --git a/data/qcsrc/server/w_shotgun.qc b/data/qcsrc/server/w_shotgun.qc index 61ff05c66..bdd9221e8 100644 --- a/data/qcsrc/server/w_shotgun.qc +++ b/data/qcsrc/server/w_shotgun.qc @@ -58,7 +58,7 @@ void W_Shotgun_Attack2 (void) W_SetupShot (self, '25 8 -8', TRUE, 5, "weapons/shotgun_fire.wav"); for (sc = 0;sc < bullets;sc = sc + 1) - fireBullet (w_shotorg, w_shotdir, spread, d, f, WEP_SHOTGUN, sc < 3); + fireBullet (w_shotorg, w_shotdir, spread, d, f, WEP_SHOTGUN | HITTYPE_SECONDARY, sc < 3); if not(self.items & IT_UNLIMITED_AMMO) self.ammo_shells = self.ammo_shells - cvar("g_balance_shotgun_secondary_ammo"); @@ -144,6 +144,8 @@ float w_shotgun(float req) else if (req == WR_SUICIDEMESSAGE) w_deathtypestring = "did the impossible"; else if (req == WR_KILLMESSAGE) - w_deathtypestring = "was gunned by"; + { + w_deathtypestring = "was gunned by"; // unchecked: SECONDARY + } return TRUE; }; diff --git a/data/qcsrc/server/w_uzi.qc b/data/qcsrc/server/w_uzi.qc index 91a614337..b6b4c9104 100644 --- a/data/qcsrc/server/w_uzi.qc +++ b/data/qcsrc/server/w_uzi.qc @@ -11,7 +11,7 @@ void W_Uzi_Flash_Go() { }; .float uzi_bulletcounter; -void W_Uzi_Attack (void) +void W_Uzi_Attack (float deathtype) { local entity flash, flash2; @@ -34,9 +34,9 @@ void W_Uzi_Attack (void) ATTACK_FINISHED(self) = time + cvar("g_balance_uzi_first_refire"); if (self.uzi_bulletcounter == 1) - fireBullet (w_shotorg, w_shotdir, cvar("g_balance_uzi_first_spread"), cvar("g_balance_uzi_first_damage"), cvar("g_balance_uzi_first_force"), WEP_UZI, TRUE); + fireBullet (w_shotorg, w_shotdir, cvar("g_balance_uzi_first_spread"), cvar("g_balance_uzi_first_damage"), cvar("g_balance_uzi_first_force"), deathtype, TRUE); else - fireBullet (w_shotorg, w_shotdir, cvar("g_balance_uzi_sustained_spread"), cvar("g_balance_uzi_sustained_damage"), cvar("g_balance_uzi_sustained_force"), WEP_UZI, (self.uzi_bulletcounter & 3) == 0); + fireBullet (w_shotorg, w_shotdir, cvar("g_balance_uzi_sustained_spread"), cvar("g_balance_uzi_sustained_damage"), cvar("g_balance_uzi_sustained_force"), deathtype, (self.uzi_bulletcounter & 3) == 0); pointparticles(particleeffectnum("uzi_muzzleflash"), w_shotorg, w_shotdir * 1000, 1); @@ -91,7 +91,7 @@ void uzi_fire1_02() } ATTACK_FINISHED(self) = time + cvar("g_balance_uzi_refire"); self.uzi_bulletcounter = self.uzi_bulletcounter + 1; - W_Uzi_Attack(); + W_Uzi_Attack(WEP_UZI); weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_uzi_sustained_refire"), uzi_fire1_02); } else @@ -115,14 +115,14 @@ float w_uzi(float req) if (weapon_prepareattack(0, cvar("g_balance_uzi_refire"))) { self.uzi_bulletcounter = 1; - W_Uzi_Attack(); + W_Uzi_Attack(WEP_UZI); weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_uzi_sustained_refire"), uzi_fire1_02); } if (self.BUTTON_ATCK2) if (weapon_prepareattack(1, cvar("g_balance_uzi_refire"))) { self.uzi_bulletcounter = 1; - W_Uzi_Attack(); + W_Uzi_Attack(WEP_UZI | HITTYPE_SECONDARY); weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_uzi_sustained_refire"), w_ready); } } @@ -150,6 +150,11 @@ float w_uzi(float req) else if (req == WR_SUICIDEMESSAGE) w_deathtypestring = "did the impossible"; else if (req == WR_KILLMESSAGE) - w_deathtypestring = "was riddled full of holes by"; + { + if(w_deathtype & HITTYPE_SECONDARY) + w_deathtypestring = "was sniped by"; + else + w_deathtypestring = "was riddled full of holes by"; + } return TRUE; }; -- 2.39.2