r4680 - in trunk/data/qcsrc/server: . tturrets/system tturrets/units

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Thu Oct 9 02:31:51 EDT 2008


Author: div0
Date: 2008-10-09 02:31:51 -0400 (Thu, 09 Oct 2008)
New Revision: 4680

Modified:
   trunk/data/qcsrc/server/cl_player.qc
   trunk/data/qcsrc/server/constants.qh
   trunk/data/qcsrc/server/defs.qh
   trunk/data/qcsrc/server/g_damage.qc
   trunk/data/qcsrc/server/miscfunctions.qc
   trunk/data/qcsrc/server/tturrets/system/turret_system_damage.qc
   trunk/data/qcsrc/server/tturrets/units/turret_unit_flac.qc
   trunk/data/qcsrc/server/tturrets/units/turret_unit_hellion.qc
   trunk/data/qcsrc/server/tturrets/units/turret_unit_hk.qc
   trunk/data/qcsrc/server/tturrets/units/turret_unit_mlrs.qc
   trunk/data/qcsrc/server/tturrets/units/turret_unit_plasma.qc
   trunk/data/qcsrc/server/w_crylink.qc
   trunk/data/qcsrc/server/w_electro.qc
   trunk/data/qcsrc/server/w_grenadelauncher.qc
   trunk/data/qcsrc/server/w_hagar.qc
   trunk/data/qcsrc/server/w_laser.qc
   trunk/data/qcsrc/server/w_porto.qc
   trunk/data/qcsrc/server/w_rocketlauncher.qc
   trunk/data/qcsrc/server/w_shotgun.qc
   trunk/data/qcsrc/server/w_uzi.qc
Log:
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)


Modified: trunk/data/qcsrc/server/cl_player.qc
===================================================================
--- trunk/data/qcsrc/server/cl_player.qc	2008-10-08 19:49:49 UTC (rev 4679)
+++ trunk/data/qcsrc/server/cl_player.qc	2008-10-09 06:31:51 UTC (rev 4680)
@@ -413,7 +413,7 @@
 					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?

Modified: trunk/data/qcsrc/server/constants.qh
===================================================================
--- trunk/data/qcsrc/server/constants.qh	2008-10-08 19:49:49 UTC (rev 4679)
+++ trunk/data/qcsrc/server/constants.qh	2008-10-09 06:31:51 UTC (rev 4680)
@@ -163,6 +163,7 @@
 
 // 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_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';

Modified: trunk/data/qcsrc/server/defs.qh
===================================================================
--- trunk/data/qcsrc/server/defs.qh	2008-10-08 19:49:49 UTC (rev 4679)
+++ trunk/data/qcsrc/server/defs.qh	2008-10-09 06:31:51 UTC (rev 4680)
@@ -208,12 +208,13 @@
 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 stat_game_starttime;
 
 void W_Porto_Remove (entity p);
+
+.float projectiledeathtype;

Modified: trunk/data/qcsrc/server/g_damage.qc
===================================================================
--- trunk/data/qcsrc/server/g_damage.qc	2008-10-08 19:49:49 UTC (rev 4679)
+++ trunk/data/qcsrc/server/g_damage.qc	2008-10-09 06:31:51 UTC (rev 4680)
@@ -209,10 +209,11 @@
 				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 @@
 				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 @@
 	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 @@
 							{
 								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;

Modified: trunk/data/qcsrc/server/miscfunctions.qc
===================================================================
--- trunk/data/qcsrc/server/miscfunctions.qc	2008-10-08 19:49:49 UTC (rev 4679)
+++ trunk/data/qcsrc/server/miscfunctions.qc	2008-10-09 06:31:51 UTC (rev 4680)
@@ -1518,3 +1518,23 @@
 	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;
+}

Modified: trunk/data/qcsrc/server/tturrets/system/turret_system_damage.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/system/turret_system_damage.qc	2008-10-08 19:49:49 UTC (rev 4679)
+++ trunk/data/qcsrc/server/tturrets/system/turret_system_damage.qc	2008-10-09 06:31:51 UTC (rev 4680)
@@ -193,7 +193,7 @@
 
 
 // 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;

Modified: trunk/data/qcsrc/server/tturrets/units/turret_unit_flac.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/units/turret_unit_flac.qc	2008-10-08 19:49:49 UTC (rev 4679)
+++ trunk/data/qcsrc/server/tturrets/units/turret_unit_flac.qc	2008-10-09 06:31:51 UTC (rev 4680)
@@ -52,7 +52,7 @@
 
     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;

Modified: trunk/data/qcsrc/server/tturrets/units/turret_unit_hellion.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/units/turret_unit_hellion.qc	2008-10-08 19:49:49 UTC (rev 4679)
+++ trunk/data/qcsrc/server/tturrets/units/turret_unit_hellion.qc	2008-10-09 06:31:51 UTC (rev 4680)
@@ -160,7 +160,7 @@
     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;

Modified: trunk/data/qcsrc/server/tturrets/units/turret_unit_hk.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/units/turret_unit_hk.qc	2008-10-08 19:49:49 UTC (rev 4679)
+++ trunk/data/qcsrc/server/tturrets/units/turret_unit_hk.qc	2008-10-09 06:31:51 UTC (rev 4680)
@@ -367,7 +367,7 @@
     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;

Modified: trunk/data/qcsrc/server/tturrets/units/turret_unit_mlrs.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/units/turret_unit_mlrs.qc	2008-10-08 19:49:49 UTC (rev 4679)
+++ trunk/data/qcsrc/server/tturrets/units/turret_unit_mlrs.qc	2008-10-09 06:31:51 UTC (rev 4680)
@@ -61,11 +61,11 @@
 #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.

Modified: trunk/data/qcsrc/server/tturrets/units/turret_unit_plasma.qc
===================================================================
--- trunk/data/qcsrc/server/tturrets/units/turret_unit_plasma.qc	2008-10-08 19:49:49 UTC (rev 4679)
+++ trunk/data/qcsrc/server/tturrets/units/turret_unit_plasma.qc	2008-10-09 06:31:51 UTC (rev 4680)
@@ -85,11 +85,11 @@
 #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);
 

Modified: trunk/data/qcsrc/server/w_crylink.qc
===================================================================
--- trunk/data/qcsrc/server/w_crylink.qc	2008-10-08 19:49:49 UTC (rev 4679)
+++ trunk/data/qcsrc/server/w_crylink.qc	2008-10-09 06:31:51 UTC (rev 4680)
@@ -20,7 +20,7 @@
 		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 @@
 	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 @@
 		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 @@
 	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 @@
 
 		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 @@
 
 		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 @@
 	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 @@
 		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;
 };

Modified: trunk/data/qcsrc/server/w_electro.qc
===================================================================
--- trunk/data/qcsrc/server/w_electro.qc	2008-10-08 19:49:49 UTC (rev 4679)
+++ trunk/data/qcsrc/server/w_electro.qc	2008-10-09 06:31:51 UTC (rev 4680)
@@ -8,12 +8,12 @@
 	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 @@
 	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 @@
 					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 @@
 	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 @@
 	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 @@
 	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;
 };

Modified: trunk/data/qcsrc/server/w_grenadelauncher.qc
===================================================================
--- trunk/data/qcsrc/server/w_grenadelauncher.qc	2008-10-08 19:49:49 UTC (rev 4679)
+++ trunk/data/qcsrc/server/w_grenadelauncher.qc	2008-10-09 06:31:51 UTC (rev 4680)
@@ -6,7 +6,7 @@
 	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 @@
 	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 @@
 		return;
 	}
 	if (other.takedamage == DAMAGE_AIM)
-		self.think ();
+		self.use ();
 	else
 	{
 		float r;
@@ -59,6 +59,7 @@
 			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 @@
 	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 @@
 	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 @@
 	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;
 };

Modified: trunk/data/qcsrc/server/w_hagar.qc
===================================================================
--- trunk/data/qcsrc/server/w_hagar.qc	2008-10-08 19:49:49 UTC (rev 4679)
+++ trunk/data/qcsrc/server/w_hagar.qc	2008-10-09 06:31:51 UTC (rev 4680)
@@ -13,7 +13,7 @@
 		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 @@
 		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 @@
 	if (other == self.owner)
 		return;
 
-	self.think ();
+	self.use ();
 }
 
 void W_Hagar_Touch2 (void)
@@ -60,12 +60,13 @@
 	}
 
 	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 @@
 	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 @@
 	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 @@
 		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;
 };

Modified: trunk/data/qcsrc/server/w_laser.qc
===================================================================
--- trunk/data/qcsrc/server/w_laser.qc	2008-10-08 19:49:49 UTC (rev 4679)
+++ trunk/data/qcsrc/server/w_laser.qc	2008-10-09 06:31:51 UTC (rev 4680)
@@ -24,9 +24,9 @@
 
 	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 @@
 
 	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 @@
 		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;
 };

Modified: trunk/data/qcsrc/server/w_porto.qc
===================================================================
--- trunk/data/qcsrc/server/w_porto.qc	2008-10-08 19:49:49 UTC (rev 4679)
+++ trunk/data/qcsrc/server/w_porto.qc	2008-10-09 06:31:51 UTC (rev 4680)
@@ -274,6 +274,6 @@
 	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;
 };

Modified: trunk/data/qcsrc/server/w_rocketlauncher.qc
===================================================================
--- trunk/data/qcsrc/server/w_rocketlauncher.qc	2008-10-08 19:49:49 UTC (rev 4679)
+++ trunk/data/qcsrc/server/w_rocketlauncher.qc	2008-10-09 06:31:51 UTC (rev 4680)
@@ -12,7 +12,7 @@
 
 	//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 @@
 			: (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 @@
 	self.nextthink = time;
 	if (time > self.cnt)
 	{
+		other = world;
+		self.projectiledeathtype |= HITTYPE_BOUNCE;
 		W_Rocket_Explode ();
 		return;
 	}
@@ -238,6 +242,7 @@
 
 	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 @@
 	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;
 };

Modified: trunk/data/qcsrc/server/w_shotgun.qc
===================================================================
--- trunk/data/qcsrc/server/w_shotgun.qc	2008-10-08 19:49:49 UTC (rev 4679)
+++ trunk/data/qcsrc/server/w_shotgun.qc	2008-10-09 06:31:51 UTC (rev 4680)
@@ -58,7 +58,7 @@
 
 	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 @@
 	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;
 };

Modified: trunk/data/qcsrc/server/w_uzi.qc
===================================================================
--- trunk/data/qcsrc/server/w_uzi.qc	2008-10-08 19:49:49 UTC (rev 4679)
+++ trunk/data/qcsrc/server/w_uzi.qc	2008-10-09 06:31:51 UTC (rev 4680)
@@ -11,7 +11,7 @@
 };
 
 .float uzi_bulletcounter;
-void W_Uzi_Attack (void)
+void W_Uzi_Attack (float deathtype)
 {
 	local entity flash, flash2;
 
@@ -34,9 +34,9 @@
 	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 @@
 		}
 		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 @@
 		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 @@
 	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;
 };




More information about the nexuiz-commits mailing list