r124 - trunk/progsqc

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Sat Sep 6 20:24:13 EDT 2008


Author: vermeulen
Date: 2008-09-06 20:24:13 -0400 (Sat, 06 Sep 2008)
New Revision: 124

Modified:
   trunk/progsqc/actor.qc
   trunk/progsqc/bots.qc
   trunk/progsqc/damage.qc
   trunk/progsqc/gamedefs.qc
   trunk/progsqc/inventory.qc
   trunk/progsqc/player.qc
   trunk/progsqc/structures.qc
   trunk/progsqc/util.qc
   trunk/progsqc/violence.qc
Log:
Getting ready for alpha

Modified: trunk/progsqc/actor.qc
===================================================================
--- trunk/progsqc/actor.qc	2008-08-30 06:52:26 UTC (rev 123)
+++ trunk/progsqc/actor.qc	2008-09-07 00:24:13 UTC (rev 124)
@@ -2,13 +2,6 @@
 // similar to .view_ofs but for weapon firing, note _x is multiplied by v_forward, _y is multiplied by v_right, and _z is multiplied by '0 0 1'
 .vector weapon_ofs;
 
-.entity actorpart_torso;
-.entity actorpart_head;
-.entity actorpart_weapon;
-.entity actorpart_viewweapon;
-.entity actorpart_hand;
-.entity actorpart_jetpacktrail;
-
 float ACTORTYPE_INVALID = 0;
 float ACTORTYPE_CLASS1 = 1;
 float ACTORTYPE_CLASS2 = 2;
@@ -20,7 +13,8 @@
 float ACTORTYPE_CLASS8 = 8;
 float ACTORTYPE_CLASS9 = 9;
 float ACTORTYPE_CLASS10 = 10;
-float ACTORTYPE_TOTAL = 11;
+float ACTORTYPE_CLASS11 = 11;
+float ACTORTYPE_TOTAL = 12;
 
 .float actortype;
 
@@ -110,6 +104,7 @@
 		self.actorpart_torso = spawn();
 		self.actorpart_torso.owner = self;
 		self.actorpart_torso.classname = "actorpart_torso";
+		self.actorpart_torso.alpha = 1;
 		self.actorpart_torso.think = actor_part_torso_think;
 		self.actorpart_torso.nextthink = time;
 		self.actorpart_head = spawn();
@@ -275,6 +270,35 @@
 	local float f2;
 	oldself = self;
 	self = self.owner;
+
+	if (self.button7)
+	{
+	 	Inventory_GetItemInfo(self, self.itemselected);
+		if ((!iteminfo_ammo1noprojectile) && iteminfo_weapon_canfire1 && iteminfo_weapon_canfire2 && (!self.weapon_oldbutton7 || !(iteminfo_ammo1fireflags & FIREFLAG_SEMIAUTOMATIC)))
+		{
+		   	weapon_state(WS_FIRE3);
+		}
+		else if (iteminfo_ammo1fireflags & FIREFLAG_JETPACK)
+		{
+		    Inventory_ModifyItem(self, self.itemselected, 0 - iteminfo_ammo1minimumtofire, 0);
+			self.jetpack_fuel = iteminfo_quantity;
+		   	if (!self.jetpackactive && self.jetpack_fuel > 10)
+			{
+				sound(self, CHAN_BODY, "jetpack/low.wav", 0.2, ATTN_NORM);
+				self.jetpackactive = TRUE;
+			}
+		}
+		else if (iteminfo_ammo1fireflags & FIREFLAG_SHIELD)
+		{
+		    Inventory_ModifyItem(self, self.itemselected, 0 - iteminfo_ammo1minimumtofire, 0);
+			self.shieldactive = TRUE;
+		}
+		else if (iteminfo_ammo1fireflags & FIREFLAG_INVIS)
+		{
+		    Inventory_ModifyItem(self, self.itemselected, 0 - iteminfo_ammo1minimumtofire, 0);
+			self.invisactive = TRUE;
+		}
+	}
 	
 	Inventory_GetItemInfo(self, self.weaponitem);
 	if (animdone)
@@ -341,34 +365,6 @@
 			weapon_state(WS_FIRE1);
 		else if (self.button3 && iteminfo_weapon_canfire2 && (!self.weapon_oldbutton3 || !(iteminfo_ammo2fireflags & FIREFLAG_SEMIAUTOMATIC)))
 			weapon_state(WS_FIRE2);
-		else if (self.button7)
-		{
-		 	Inventory_GetItemInfo(self, self.itemselected);
-			if ((!iteminfo_ammo1noprojectile) && iteminfo_weapon_canfire1 && iteminfo_weapon_canfire2 && (!self.weapon_oldbutton7 || !(iteminfo_ammo1fireflags & FIREFLAG_SEMIAUTOMATIC)))
-			{
-			   	weapon_state(WS_FIRE3);
-			}
-			else if (iteminfo_ammo1fireflags & FIREFLAG_JETPACK)
-			{
-			    Inventory_ModifyItem(self, self.itemselected, 0 - iteminfo_ammo1minimumtofire, 0);
-				self.jetpack_fuel = iteminfo_quantity;
-			   	if (!self.jetpackactive && self.jetpack_fuel > 10)
-				{
-					sound(self, CHAN_BODY, "jetpack/low.wav", 0.4, ATTN_NORM);
-					self.jetpackactive = TRUE;
-				}
-			}
-			else if (iteminfo_ammo1fireflags & FIREFLAG_SHIELD)
-			{
-			    Inventory_ModifyItem(self, self.itemselected, 0 - iteminfo_ammo1minimumtofire, 0);
-				self.shieldactive = TRUE;
-			}
-			else if (iteminfo_ammo1fireflags & FIREFLAG_INVIS)
-			{
-			    Inventory_ModifyItem(self, self.itemselected, 0 - iteminfo_ammo1minimumtofire, 0);
-				self.invisactive = TRUE;
-			}
-		}
 	}
 	self.weapon_oldbutton0 = self.button0;
 	self.weapon_oldbutton3 = self.button3;
@@ -472,6 +468,8 @@
 	local float shotprojflags;
 	local float shotfireflags;
 	local float shotexplflags;
+	local float shottrailflags;
+	local float shoteffectflags;
 	local float numberof;
 	local float recoil;
 	local float mintofire;
@@ -498,6 +496,8 @@
 		shotprojflags = iteminfo_ammo2projflags;
 		shotfireflags = iteminfo_ammo2fireflags;
 		shotexplflags = iteminfo_ammo2explflags;
+		shottrailflags = iteminfo_ammo2trailflags;
+		shoteffectflags = iteminfo_ammo2effectflags;
 		shotmodel = iteminfo_ammo2model;
 		shotfiresound = iteminfo_ammo2firesound;
 		shotexplodesound = iteminfo_ammo2explodesound;
@@ -522,6 +522,8 @@
 		shotprojflags = iteminfo_ammo1projflags;
 		shotfireflags = iteminfo_ammo1fireflags;
 		shotexplflags = iteminfo_ammo1explflags;
+		shottrailflags = iteminfo_ammo1trailflags;
+		shoteffectflags = iteminfo_ammo1effectflags;
 		shotmodel = iteminfo_ammo1model;
 		shotfiresound = iteminfo_ammo1firesound;
 		shotexplodesound = iteminfo_ammo1explodesound;
@@ -531,6 +533,7 @@
 		mintofire = iteminfo_ammo1minimumtofire;
 		tracer = iteminfo_ammo1tracer;
 		tracermodel = iteminfo_ammo1tracermodel;
+		modelscale = iteminfo_ammo1modelscale;
 		projhealth = iteminfo_ammo1health;
 		projmass = iteminfo_ammo1mass;
 		projcolormod = iteminfo_ammo1colormod;
@@ -554,7 +557,7 @@
 	
 	while (numberof != 0)
 	{
-		  weapon_fireprojectile(shotmodel, shotorg, shotdir, shotdamage, shotdamagetype, shotlifetime, shotprojflags, shotfireflags, shotexplflags, shotfiresound, shotexplodesound, shotbouncesound, tracer, tracermodel, modelscale, projhealth, projmass, projcolormod);	
+		  weapon_fireprojectile(shotmodel, shotorg, shotdir, shotdamage, shotdamagetype, shotlifetime, shotprojflags, shotfireflags, shotexplflags, shottrailflags, shoteffectflags, shotfiresound, shotexplodesound, shotbouncesound, tracer, tracermodel, modelscale, projhealth, projmass, projcolormod);	
 		  numberof = numberof - 1;
 	}
 };

Modified: trunk/progsqc/bots.qc
===================================================================
--- trunk/progsqc/bots.qc	2008-08-30 06:52:26 UTC (rev 123)
+++ trunk/progsqc/bots.qc	2008-09-07 00:24:13 UTC (rev 124)
@@ -115,7 +115,7 @@
 	if (self.enemy)
 		return;
 	v1 = self.origin + self.view_ofs;
-	e = findradius(v1, 1500);
+	e = findradius(v1, self.sight);
 	while (e)
 	{
 		if (e.team != self.team)
@@ -124,9 +124,9 @@
 		if (!e.deadflag)
 		if (!(e.flags & FL_NOTARGET))
 		{
-			v2 = (e.absmin + e.absmax) * 0.5;
-			traceline(v1, v2, TRUE, self);
-			if (trace_fraction == 1 || trace_ent == e)
+			//v2 = (e.absmin + e.absmax) * 0.5;
+			//traceline(v1, v2, TRUE, self);
+			//if (trace_fraction == 1 || trace_ent == e)
 				self.enemy = e;
 		}
 		e = e.chain;
@@ -136,7 +136,6 @@
 void() bot_ai =
 {
 	local vector v1, v2;
-	local float enemydistance;
 
 	if (self.aitype == AITYPE_1)
 	{
@@ -144,13 +143,13 @@
 		self.button0 = self.button2 = self.button3 = self.button4 = 0;
 		if (!self.enemy)
 		{
-			ai_walk();
+			//ai_walk();
 			ai_findenemy();
 		}
 		else
 		{
-			enemydistance = vlen(self.origin - self.enemy.origin);
-			if (enemydistance > self.sight)
+			self.enemydistance = vlen(self.origin - self.enemy.origin);
+			if (self.enemydistance > self.sight)
 			{
 				self.enemy = world;
 				return;
@@ -166,11 +165,6 @@
 			// if it has jetpack proj flag, use
 
 		 	//ai_strafe();
-			if (self.enemy.deadflag || !self.enemy.takedamage)
-			{
-				self.enemy = world;
-				return;
-			}
 			Inventory_GetItemInfo(self, self.weaponitem);
 			if (!iteminfo_weapon_canfire1)
 			if (!iteminfo_weapon_canfire2)
@@ -184,25 +178,29 @@
 			v1 = self.origin + '0 0 16';
 			v2 = (self.enemy.absmin + self.enemy.absmax) * 0.5;
 			traceline(v1, v2, FALSE, self);
-			if ((trace_fraction == 1 || trace_ent == self.enemy) && SInfront(self.enemy))
+			if ((trace_fraction == 1 || trace_ent == self.enemy) && SInfront(self.enemy) && (!(self.enemy.deadflag)))
 			{
-				if ((iteminfo_weapon_canfire2) && (enemydistance < self.fire2distance))
+				if ((iteminfo_weapon_canfire2) && (self.enemydistance < self.fire2distance))
 					self.button3 = 1;
-				else if ((iteminfo_weapon_canfire1) && (enemydistance < self.fire1distance))
+				else if ((iteminfo_weapon_canfire1) && (self.enemydistance < self.fire1distance))
 					self.button0 = 1;
 			}
-			MoveToGoal();
+			if (!(self.enemy.deadflag))
+				MoveToGoal();
 		}
 	}
 };
 
 void() bot_npcthink =
 {
-	self.nextthink = time;
+	self.nextthink = time + 0.03;
 	bot_ai();
 	SV_PlayerPhysics();
-	PlayerPreThink();
-	PlayerPostThink();
+	if (self.enemy)
+	{
+		PlayerPreThink();
+		PlayerPostThink();
+	}
 };
 
 
@@ -217,11 +215,12 @@
 	{
 		setorigin(self, self.origin + '0 0 1');
 		self.think = bot_npcthink;
-		self.nextthink = time;
+		self.nextthink = time + 0.02;
 		self.team = cvar("g_defaultenemyteam");
 		self.unlimitedinventory = 1;
 		self.spawned = 1;
 		player_spawn(ACTORTYPE_CLASS5);
+		self.movetype = MOVETYPE_FLY;
 	}
 };
 
@@ -231,7 +230,7 @@
 	{
 		setorigin(self, self.origin + '0 0 1');
 		self.think = bot_npcthink;
-		self.nextthink = time;
+		self.nextthink = time + 0.02;
 		self.team = cvar("g_defaultenemyteam");
 		self.unlimitedinventory = 1;
 		self.spawned = 1;
@@ -245,7 +244,7 @@
 	{
 		setorigin(self, self.origin + '0 0 1');
 		self.think = bot_npcthink;
-		self.nextthink = time;
+		self.nextthink = time + 0.02;
 		self.team = cvar("g_defaultenemyteam");
 		self.unlimitedinventory = 1;
 		self.spawned = 1;
@@ -260,7 +259,7 @@
 	{
 		setorigin(self, self.origin + '0 0 1');
 		self.think = bot_npcthink;
-		self.nextthink = time;
+		self.nextthink = time + 0.02;
 		self.team = cvar("g_defaultenemyteam");
 		self.unlimitedinventory = 1;
 		self.spawned = 1;
@@ -275,7 +274,7 @@
 	{
 		setorigin(self, self.origin + '0 0 1');
 		self.think = bot_npcthink;
-		self.nextthink = time;
+		self.nextthink = time + 0.02;
 		self.team = cvar("g_defaultenemyteam");
 		self.unlimitedinventory = 1;
 		self.spawned = 1;
@@ -283,16 +282,30 @@
 	}
 };
 
-void() enemy_largeturret
+void() enemy_rocketturret
 {
  	if (cvar("g_gametype") == 1)
 	{
 		setorigin(self, self.origin + '0 0 1');
 		self.think = bot_npcthink;
-		self.nextthink = time;
+		self.nextthink = time + 0.02;
 		self.team = cvar("g_defaultenemyteam");
 		self.unlimitedinventory = 1;
 		self.spawned = 1;
 		player_spawn(ACTORTYPE_CLASS10);
 	}
-};
\ No newline at end of file
+};
+
+void() enemy_largeturret
+{
+ 	if (cvar("g_gametype") == 1)
+	{
+		setorigin(self, self.origin + '0 0 1');
+		self.think = bot_npcthink;
+		self.nextthink = time + 0.02;
+		self.team = cvar("g_defaultenemyteam");
+		self.unlimitedinventory = 1;
+		self.spawned = 1;
+		player_spawn(ACTORTYPE_CLASS11);
+	}
+};

Modified: trunk/progsqc/damage.qc
===================================================================
--- trunk/progsqc/damage.qc	2008-08-30 06:52:26 UTC (rev 123)
+++ trunk/progsqc/damage.qc	2008-09-07 00:24:13 UTC (rev 124)
@@ -1,9 +1,18 @@
-
-float ACTOR_SHIELD_REGENDELAY = 0.5;
+float ACTOR_SHIELD_REGENDELAY = 3;
+float ACTOR_HEALTH_REGENDELAY = 3;
+float ACTOR_SHIELD_ROTTDELAY = 3;
+float ACTOR_HEALTH_ROTTDELAY = 3;
+.float healthregentime;
+.float healthrotttime;
+.float healthrott;
+.float healthregen;
+.float healthstable;
+.float healthmax;
 .float armorregentime;
-.float armorregenplaysound;
-.float armorregenrate;
-.float armorregenmax;
+.float armorrotttime;
+.float armorrott;
+.float armorregen;
+.float armorstable;
 .float armormax;
 .float gibhealth;
 .float paintake;
@@ -13,6 +22,11 @@
 float DAMAGETYPE_FALL = 1;
 float DAMAGETYPE_WEAP1 = 2;
 
+entity newmis;
+.entity realowner;
+.float damagtype;
+.vector damageinfo;
+
 void(entity targ, entity inflictor, entity attacker, float damagetype, float damage, vector location, vector force) T_Damage =
 {
 	local entity oldself;
@@ -24,7 +38,13 @@
 	oldself = self;
 	self = targ;
 
-	if ((targ.team == attacker.team) && cvar("g_teams") && (targ != attacker))
+	if (damagetype == targ.damagtype)
+		self.combodie = 1;
+	else
+		self.combodie = 0;
+
+	if (self.classname == "player")
+	if ((self.team == attacker.team) && cvar("g_teams") && (self != attacker))
 	{
 		damage = damage * cvar("g_teams_friendlyfire");
 	}
@@ -49,29 +69,15 @@
 		self.armorvalue = self.armorvalue - save;
 		self.health = self.health - take;
 		self.armorregentime = max(self.armorregentime, time + ACTOR_SHIELD_REGENDELAY);
-		self.armorregenplaysound = TRUE;
+		self.healthregentime = max(self.healthregentime, time + ACTOR_HEALTH_REGENDELAY);
 	}
+
 	if (self.bloodtype == 1)
 	{
 		te_blood(location, force, take);
 		te_blood(location, force, save);
 	}
 	
-	/*
-	if (self.entitytype == ETYPE_HUMAN)
-	{
-		if (take >= 1)
-			te_blood(location, force, take);
-		if (save >= 1)
-			te_spark(location, '0 0 0' - force, save);
-	}
-	else if (self.entitytype == ETYPE_MECHANICAL)
-	*/
-	{
-		//if (damage >= 1)
-		//	te_spark(location, '0 0 0' - force, damage);
-		//if (damage >= 1)
-	}
 	if (self.deadflag == DEAD_NO)
 	{
 		if (self.health < self.gibhealth && self.th_gib)
@@ -96,7 +102,7 @@
 		if (self.health < self.gibhealth && self.th_gib)
 			self.th_gib();
 	}
-	//self.th_damage(inflictor, attacker, damagetype, damage, location, force);
+
 	self = oldself;
 };
 
@@ -141,21 +147,14 @@
 	//bprint("\n");
 };
 
-
-entity newmis;
-.entity realowner;
-.float damagetype;
-.vector damageinfo;
-
 float PROJFLAG_ANYIMPACT = 1;
 float PROJFLAG_CHARACTERIMPACT = 2;
 float PROJFLAG_RICOCHET = 4;
 float PROJFLAG_ROCKET = 8;
-float PROJFLAG_GLOW = 32;
+float PROJFLAG_PROXIMITY = 32;
 float PROJFLAG_STICK = 64;
 float PROJFLAG_LASERGUIDED = 128;
 float PROJFLAG_REMOTEDETONATE = 256;
-float PROJFLAG_PROXIMITY = 512;
 
 float FIREFLAG_MUZZLEFLASH = 1;
 float FIREFLAG_SEMIAUTOMATIC = 2;
@@ -169,11 +168,15 @@
 float EXPLFLAG_EXPLODE = 1;
 float EXPLFLAG_EXPLODELARGE = 2;
 float EXPLFLAG_SNIPERRAIL = 4;
-float EXPLFLAG_PLASMA = 8;
-float EXPLFLAG_ASSAULTRAIL = 16;
-float EXPLFLAG_ELECTRICITY = 32;
+float EXPLFLAG_PLASMA = 8;			// to rename
+float EXPLFLAG_ASSAULTRAIL = 16;	// to rename
+float EXPLFLAG_ELECTRICITY = 32;	// to remove
 float EXPLFLAG_NEX = 64;
-float EXPLFLAG_CRYLINK = 128;
+float EXPLFLAG_BLUESMALL = 128;
+float EXPLFLAG_REDSMALL = 256;
+float EXPLFLAG_BLUELARGE = 512;
+float EXPLFLAG_REDLARGE = 1024;
+float EXPLFLAG_PLASMACOMBO = 2048;
 
 .float weaponsound_cycle; // templeofnoise: added for minigun routing sound, guess i'll use it for other sound specs also.
 
@@ -223,80 +226,75 @@
 			if (self.noise != "") sound(self, CHAN_BODY, self.noise, 0.1, ATTN_NORM); // templeofnoise
 		}
 	}
-	else sound(self, CHAN_BODY, self.noise, 1, ATTN_NORM); // templeofnoise
+	else sound(self, CHAN_AUTO, self.noise, 1, ATTN_NORM); // templeofnoise
 
+	if ((self.explflag & EXPLFLAG_PLASMACOMBO) && (self.combodie))
+	{
+		pointparticles(particleeffectnum("blue_power"), self.origin, '0 0 0', 1);
+		sound (self, CHAN_AUTO, "weapons/explode_plasmacombo.wav", 1, ATTN_NORM);
+		self.damageinfo = self.damageinfo * 1.3;
+	}
+
 	if (self.damageinfo_z > 0)
-		T_RadiusDamage(self, self.realowner, self.damagetype, self.damageinfo, self.origin);
+		T_RadiusDamage(self, self.realowner, self.damagtype, self.damageinfo, self.origin);
 	else if (other != world)
-		T_Damage(other, self, self.realowner, self.damagetype, self.damageinfo_x, self.origin, normalize(self.velocity) * self.damageinfo_y);
+		T_Damage(other, self, self.realowner, self.damagtype, self.damageinfo_x, self.origin, normalize(self.velocity) * self.damageinfo_y);
+	
 	self.takedamage = DAMAGE_NO;
+
 	if (self.explflag & EXPLFLAG_EXPLODELARGE)
 	{
-		// LordHavoc: TE_TEI_BIGEXPLOSION
-		WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
-		WriteByte (MSG_BROADCAST, 78);
-		WriteCoord (MSG_BROADCAST, self.origin_x);
-		WriteCoord (MSG_BROADCAST, self.origin_y);
-		WriteCoord (MSG_BROADCAST, self.origin_z);
-
-		sound (self, CHAN_BODY, "weapons/explode_large.wav", 1, ATTN_NORM);
-		
-		remove(self);
+		pointparticles(particleeffectnum("explode_large"), self.origin, '0 0 0', 1);
+		sound (self, CHAN_AUTO, "weapons/explode_large.wav", 1, ATTN_NORM);
 	}
 	else if (self.explflag & EXPLFLAG_NEX)
 	{
-		sound (self, CHAN_BODY, "weapons/explode_nex.ogg", 1, ATTN_NORM);
+		sound (self, CHAN_AUTO, "weapons/explode_nex.ogg", 1, ATTN_NORM);
 		pointparticles(particleeffectnum("nex_explode"), self.origin, '0 0 0', 1);
-		remove(self);
 	}
 	else if (self.explflag & EXPLFLAG_EXPLODE)
 	{
-		sound (self, CHAN_BODY, "weapons/explode_medium.wav", 1, ATTN_NORM);
-		te_explosion(self.origin);
-		remove(self);
+		sound (self, CHAN_AUTO, "weapons/explode_medium.wav", 1, ATTN_NORM);
+		pointparticles(particleeffectnum("explode_medium"), self.origin, '0 0 0', 1);
 	}
 	else if (self.explflag & EXPLFLAG_SNIPERRAIL)
 	{
-		sound (self, CHAN_BODY, "weapons/hit_rail.wav", 1, ATTN_NORM);
+		sound (self, CHAN_AUTO, "weapons/hit_rail.wav", 1, ATTN_NORM);
 		te_plasmaburn(self.origin);
-		remove(self);
 	}
-	else if (self.explflag & EXPLFLAG_ELECTRICITY)
-	{
-		sound (self, CHAN_BODY, "weapons/explode_electricity.wav", 1, ATTN_NORM);
-		WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
-		WriteByte (MSG_BROADCAST, 79);
-		WriteCoord (MSG_BROADCAST, self.origin_x);
-		WriteCoord (MSG_BROADCAST, self.origin_y);
-		WriteCoord (MSG_BROADCAST, self.origin_z);
-		WriteCoord (MSG_BROADCAST, 0);
-		WriteCoord (MSG_BROADCAST, 0);
-		WriteCoord (MSG_BROADCAST, 0);
-		WriteByte (MSG_BROADCAST, 155);
-		remove(self);
-	}
 	else if (self.explflag & EXPLFLAG_PLASMA)
 	{
-		sound (self, CHAN_BODY, "weapons/explode_plasma.wav", 1, ATTN_NORM);
-		te_knightspike(self.origin);
-		remove(self);
+		sound (self, CHAN_AUTO, "weapons/explode_plasma.wav", 1, ATTN_NORM);
+		pointparticles(particleeffectnum("red_medium"), self.origin, '0 0 0', 1);
 	}
 	else if (self.explflag & EXPLFLAG_ASSAULTRAIL)
+		pointparticles(particleeffectnum("machinegun_impact"), self.origin, '0 0 0', 1);
+	else if (self.explflag & EXPLFLAG_BLUESMALL)
 	{
-		pointparticles(particleeffectnum("machinegun_impact"), self.origin, '0 0 0', 1);
-		//te_gunshotquad(self.origin);
-		remove(self);
+		pointparticles(particleeffectnum("blue_small"), self.origin, '0 0 0', 1);
+		sound (self, CHAN_AUTO, "weapons/explode_plasma.wav", 1, ATTN_NORM);
 	}
-	else if (self.explflag & EXPLFLAG_CRYLINK)
-	{	
-		pointparticles(particleeffectnum("crylink_impactbig"), self.origin, '0 0 0', 1);
-		remove(self);
+	else if (self.explflag & EXPLFLAG_BLUELARGE)
+	{
+		pointparticles(particleeffectnum("blue_large"), self.origin, '0 0 0', 1);
+		sound (self, CHAN_AUTO, "weapons/explode_plasmalarge.wav", 1, ATTN_NORM);
 	}
+	else if (self.explflag & EXPLFLAG_REDSMALL)
+	{
+		pointparticles(particleeffectnum("red_small"), self.origin, '0 0 0', 1);
+		sound (self, CHAN_AUTO, "weapons/explode_plasma.wav", 1, ATTN_NORM);
+	}
+	else if (self.explflag & EXPLFLAG_REDLARGE)
+	{
+		pointparticles(particleeffectnum("red_large"), self.origin, '0 0 0', 1);
+		sound (self, CHAN_AUTO, "weapons/explode_plasmalarge.wav", 1, ATTN_NORM);
+	}
 	else // metal projectile of some sort (bullet, shrapnel, railgun bolt, etc)
 	{
 		te_gunshot(self.origin);
-		remove(self);
 	}
+	
+	remove(self);
 };
 
 //.vector oldvelocity;
@@ -367,6 +365,7 @@
 		{
 			if ((e.classname == "player") && (e.team != self.team))
 			{
+				other = e;
 				self.th_die();
 			}
 			e = e.chain;
@@ -443,7 +442,7 @@
 	}
 }
 
-void(string modelname, vector shotorg, vector shotvel, vector damage, float damagtype, float lifetime, float PROJFLAGs, float FIREFLAGs, float EXPLFLAGs, string firesound, string explodesound, string bouncesound, float tracer, string tracermodel, float modelscale, float projhealth, float projmass, vector projcolormod) weapon_fireprojectile =
+void(string modelname, vector shotorg, vector shotvel, vector damage, float damaggtype, float lifetime, float PROJFLAGs, float FIREFLAGs, float EXPLFLAGs, float TRAILFLAGs, float EFFECTFLAGs, string firesound, string explodesound, string bouncesound, float tracer, string tracermodel, float modelscale, float projhealth, float projmass, vector projcolormod) weapon_fireprojectile =
 {
 	local float r; // templeofnoise
 	
@@ -451,7 +450,7 @@
  	newmis.classname = "projectile";
  	newmis.solid = SOLID_BBOX;
  	newmis.movetype = MOVETYPE_BOUNCE;
- 	newmis.damagetype = damagtype;
+ 	newmis.damagtype = damaggtype;
  	newmis.damageinfo = damage;
 	shotvel = v_forward * shotvel_x + v_up * shotvel_y + shotvel_z * randomvec();
 	newmis.velocity = shotvel;
@@ -467,6 +466,9 @@
  	newmis.projflag = PROJFLAGs;
  	newmis.fireflag = FIREFLAGs;
  	newmis.explflag = EXPLFLAGs;
+
+	newmis.modelflags = TRAILFLAGs;
+	newmis.effects = EFFECTFLAGs;
 	
  	newmis.noise = explodesound;
  	newmis.noise1 = bouncesound;
@@ -583,8 +585,6 @@
 	//	pointparticles(particleeffectnum("muzzleflash"), shotorg, '0 0 0', 1);
 	if (PROJFLAGs & PROJFLAG_ROCKET)
 		newmis.movetype = MOVETYPE_BOUNCEMISSILE;
-	if (PROJFLAGs & PROJFLAG_GLOW)
-		newmis.effects = newmis.effects | EF_ADDITIVE | EF_FULLBRIGHT | EF_NOSHADOW; // | EF_BRIGHTFIELD; Add once Zymotic gamemode has support for this
 };
 
 

Modified: trunk/progsqc/gamedefs.qc
===================================================================
--- trunk/progsqc/gamedefs.qc	2008-08-30 06:52:26 UTC (rev 123)
+++ trunk/progsqc/gamedefs.qc	2008-09-07 00:24:13 UTC (rev 124)
@@ -13,6 +13,9 @@
 
 .float itemselected;
 
+.string structure_effect;
+.string structure_print;
+
 .float spawned;
 
 .vector viewmodelchange;
@@ -59,6 +62,8 @@
 .float fire1distance;
 .float fire2distance;
 
+.float combodie;
+
 .float bloodtype;
 .float gibtype;
 
@@ -67,6 +72,8 @@
 .float team;
 .float classnum;
 
+.float enemydistance;
+
 .entity flagcarried;
 .float pain_finished;
 .float next_take_time;
@@ -97,16 +104,11 @@
 float sv_maxairspeed, sv_maxspeed, sv_friction, sv_accelerate, sv_airaccelerate, sv_stopspeed, sv_gravity;
 //float sv_edgefriction, cl_divspeed, cl_rollangle;
 
+float PLAYER_FALLDAMAGE = 30;
 
-// vector PL_MIN = stov(cvar_string("g_player_boxmin"));    NOTE: g_player changed to g_class#
-//vector PL_MAX = stov(cvar_string("g_player_boxmax"));
-//vector PL_VIEW_OFS = stov(cvar_string("g_player_viewofs"));
-//vector PL_WEAPON_OFS = stov(cvar_string("g_player_weaponofs"));
-//float PLAYER_HEALTH_START = cvar("g_player_healthstart");
-//float PLAYER_HEALTH_MAX = cvar("g_player_healthmax");
-//float PLAYER_SHIELD_START = cvar("g_player_shieldstart");
-//float PLAYER_SHIELD_MAX = cvar("g_player_shieldmax");
-//float PLAYER_SHIELD_REGENRATE = cvar("g_player_regenrate");
-//float PLAYER_SHIELD_REGENMAX = cvar("g_player_regenmax");
-
-float PLAYER_FALLDAMAGE = 30;
+.entity actorpart_torso;
+.entity actorpart_head;
+.entity actorpart_weapon;
+.entity actorpart_viewweapon;
+.entity actorpart_hand;
+.entity actorpart_jetpacktrail;
\ No newline at end of file

Modified: trunk/progsqc/inventory.qc
===================================================================
--- trunk/progsqc/inventory.qc	2008-08-30 06:52:26 UTC (rev 123)
+++ trunk/progsqc/inventory.qc	2008-09-07 00:24:13 UTC (rev 124)
@@ -27,19 +27,20 @@
 float ITEMTYPE_AI_WEAP4 = 19;
 float ITEMTYPE_AI_WEAP5 = 20;
 float ITEMTYPE_AI_WEAP6 = 21;
+float ITEMTYPE_AI_WEAP7 = 22;
 
-float ITEMTYPE_ITEM1 = 22;
-float ITEMTYPE_ITEM2 = 23;
-float ITEMTYPE_ITEM3 = 24;
-float ITEMTYPE_ITEM4 = 25;
-float ITEMTYPE_ITEM5 = 26;
+float ITEMTYPE_ITEM1 = 23;
+float ITEMTYPE_ITEM2 = 24;
+float ITEMTYPE_ITEM3 = 25;
+float ITEMTYPE_ITEM4 = 26;
+float ITEMTYPE_ITEM5 = 27;
 
-float ITEMTYPE_AMMO1 = 27;
-float ITEMTYPE_AMMO2 = 28;
-float ITEMTYPE_AMMO3 = 29;
-float ITEMTYPE_AMMO4 = 30;
+float ITEMTYPE_AMMO1 = 28;
+float ITEMTYPE_AMMO2 = 29;
+float ITEMTYPE_AMMO3 = 30;
+float ITEMTYPE_AMMO4 = 31;
 
-float ITEMTYPE_TOTAL = 31;
+float ITEMTYPE_TOTAL = 32;
 
 float WS_IDLE = 0;
 float WS_FIRE1 = 1;
@@ -96,6 +97,10 @@
 float iteminfo_ammo2projflags;
 float iteminfo_ammo1explflags;
 float iteminfo_ammo2explflags;
+float iteminfo_ammo1trailflags;
+float iteminfo_ammo2trailflags;
+float iteminfo_ammo1effectflags;
+float iteminfo_ammo2effectflags;
 string iteminfo_ammo1model;
 string iteminfo_ammo2model;
 string iteminfo_ammo1explodesound;
@@ -189,6 +194,8 @@
 	iteminfo_ammo1lifetime = 10;
 	iteminfo_ammo1projflags = PROJFLAG_ANYIMPACT;
 	iteminfo_ammo1explflags = 0;
+	iteminfo_ammo1trailflags = 0;
+	iteminfo_ammo1effectflags = 0;
 	iteminfo_ammo1fireflags = 0;
 	iteminfo_ammo1model = "";
 	iteminfo_ammo1firesound = "";
@@ -211,6 +218,8 @@
 	iteminfo_ammo2lifetime = 10;
 	iteminfo_ammo2projflags = PROJFLAG_ANYIMPACT;
 	iteminfo_ammo2explflags = 0;
+	iteminfo_ammo2trailflags = 0;
+	iteminfo_ammo2effectflags = 0;
 	iteminfo_ammo2fireflags = 0;
 	iteminfo_ammo2model = "";
 	iteminfo_ammo2firesound = "";
@@ -297,6 +306,8 @@
 		iteminfo_ammo1projflags = cvar(wname,"_ammo1projflags");
 		iteminfo_ammo1explflags = cvar(wname,"_ammo1explflags");
 		iteminfo_ammo1fireflags = cvar(wname,"_ammo1fireflags");
+		iteminfo_ammo1trailflags = cvar(wname,"_ammo1trailflags");
+		iteminfo_ammo1effectflags = cvar(wname,"_ammo1effectflags");
 		
 		iteminfo_ammo1noprojectile = cvar(wname,"_ammo1noprojectile");
 		
@@ -322,6 +333,8 @@
 		iteminfo_ammo2projflags = cvar(wname,"_ammo2projflags");
 		iteminfo_ammo2explflags = cvar(wname,"_ammo2explflags");
 		iteminfo_ammo2fireflags = cvar(wname,"_ammo2fireflags");
+		iteminfo_ammo2trailflags = cvar(wname,"_ammo2trailflags");
+		iteminfo_ammo2effectflags = cvar(wname,"_ammo2effectflags");
 		
 		iteminfo_ammo2noprojectile = cvar(wname,"_ammo2noprojectile");
 		
@@ -403,6 +416,7 @@
 		//character.ammo_nails = 0;
 		//character.ammo_rockets = 0;
 		character.ammo_cells = character.itemselected - ITEMTYPE_ITEM1 + 1;
+		if (!(iteminfo_ammotype == ITEMTYPE_AMMO1))		// infinite ammo
 		if (iteminfo_ammomax + iteminfo_ammoinventorymax)
 		{
 			character.currentammo = iteminfo_ammo * 200 / (iteminfo_ammomax + iteminfo_ammoinventorymax);
@@ -457,17 +471,57 @@
 	precache_sound ("weapons/assaultrailgun_bulletfire3.wav"); // templeofnoise: old style precache for additional sounds
 
 	precache_sound ("jetpack/low.wav");
+	precache_sound ("jetpack/stop.wav");
 
+
 	precache_sound ("weapons/explode_medium.wav");
-	precache_sound ("weapons/explode_electricity.wav");
+	precache_sound ("weapons/explode_plasmalarge.wav");
 	precache_sound ("weapons/explode_plasma.wav");
 	precache_sound ("weapons/explode_large.wav");
 	precache_sound ("weapons/hit_rail.wav");
 	precache_sound ("weapons/explode_nex.ogg");
+	precache_sound ("weapons/explode_plasmacombo.wav");
 
+	precache_sound ("misc/h2ohit1.wav");
+	precache_sound ("misc/teleport.wav");
 	precache_sound ("misc/itemrespawn.wav");
+	precache_sound ("misc/itempickup.ogg");
+	precache_sound ("misc/gib.wav");
+	precache_sound ("misc/gib_splat01.wav");
+	precache_sound ("misc/gib_splat02.wav");
+	precache_sound ("misc/gib_splat03.wav");
+	precache_sound ("misc/gib_splat04.wav");
+	precache_sound ("misc/capture.wav");
+	precache_sound ("misc/spawn.ogg.wav");
+	precache_sound ("misc/weaponpickup.ogg");
+	precache_sound ("misc/itempickup.wav");
+	precache_sound ("misc/armor_medium.wav");
+	precache_sound ("misc/armor_small.wav");
+	precache_sound ("misc/health_large.ogg");
+	precache_sound ("misc/health_medium.wav");
+	precache_sound ("misc/health_small.wav");
+	precache_sound ("misc/weapon_switch.ogg");
 
+	
+	precache_model("models/items/armor_small.md3");
+	precache_model("models/items/armor_medium.md3");
+	precache_model("models/items/health_small.md3");
+	precache_model("models/items/health_medium.md3");
+
 	precache_model("models/players/jetpack_tracer.mdl");
+	precache_model("models/gibs/bloodyskull.md3");
+	precache_model("models/gibs/gib1.md3");
+	precache_model("models/gibs/gib2.mdl");
+	precache_model("models/gibs/gib3.mdl");
+	precache_model("models/gibs/gib5.md3");
+	precache_model("models/gibs/eye.md3");
+	precache_model("models/gibs/m_gib1.md3");
+	precache_model("models/gibs/m_gib2.md3");
+	precache_model("models/gibs/m_gib3.md3");
+	precache_model("models/gibs/m_gib4.md3");
+	precache_model("models/gibs/m_gib5.md3");
+	precache_model("models/gibs/m_gib6.md3");
+	precache_model("models/gibs/chunk.mdl");
 };
 
 float(entity character) Inventory_GetBestWeapon =
@@ -592,7 +646,7 @@
 void Item_Respawn (void)
 {
 	self.solid = SOLID_TRIGGER;	// allow it to be touched again
-	sound (self, CHAN_VOICE, "misc/itemrespawn.wav", 1, ATTN_NORM);	// play respawn sound
+	sound (self, CHAN_AUTO, "misc/itemrespawn.wav", 1, ATTN_NORM);	// play respawn sound
 	setorigin (self, self.origin);
 	self.alpha = 1;
 
@@ -621,14 +675,31 @@
 	if (other.classname != "player")
 		return;
 
-	//sound(other, CHAN_AUTO, self.noise, 1, ATTN_NORM);
-	sound(other, CHAN_AUTO, "misc/itempickup.ogg", 1, ATTN_NORM);
+	if (self.armorvalue > 24)
+		sound(self, CHAN_BODY, "misc/armor_medium.wav", 1, ATTN_NORM);
+	else if (self.armorvalue > 0)
+		sound(self, CHAN_BODY, "misc/armor_small.wav", 1, ATTN_NORM);
+	else if (self.health > 99)
+		sound(self, CHAN_BODY, "misc/health_large.ogg", 1, ATTN_NORM);
+	else if (self.health > 24)
+		sound(self, CHAN_BODY, "misc/health_medium.wav", 1, ATTN_NORM);
+	else if (self.health > 0)
+		sound(self, CHAN_BODY, "misc/health_small.wav", 1, ATTN_NORM);
+	else if ((self.itemitemtype < ITEMTYPE_AI_WEAP1) && (self.itemitemtype != 0))
+		sound(self, CHAN_BODY, "misc/weaponpickup.ogg", 1, ATTN_NORM);
+	else
+		sound(self, CHAN_BODY, "misc/itempickup.ogg", 1, ATTN_NORM);
+
 	bprint(self.netname,"\n");
 	
 	if (self.health)
-	   other.health = other.health + self.health;
+	{
+		other.healthrotttime = max(other.healthrotttime, time + ACTOR_HEALTH_ROTTDELAY);
+		other.health = other.health + self.health;
+	}
 	else if (self.armorvalue)
 	{
+		other.armorrotttime = max(other.armorrotttime, time + ACTOR_SHIELD_ROTTDELAY);
 		other.armorvalue = other.armorvalue + self.armorvalue;
 	}
 	else
@@ -696,63 +767,67 @@
 
 void() weapon_weap1 =
 {
- 	Item_Spawn(ITEMTYPE_WEAP1,1,100,self.origin,'0 0 0',10,1.5,world);
+ 	Item_Spawn(ITEMTYPE_WEAP1,1,100,self.origin,'0 0 0',0,1.5,world);
 }
 
 void() weapon_weap2 =
 {
- 	Item_Spawn(ITEMTYPE_WEAP2,1,100,self.origin,'0 0 0',10,1.5,world);
+ 	Item_Spawn(ITEMTYPE_WEAP2,1,100,self.origin,'0 0 0',0,1.5,world);
 }
 
 void() weapon_weap3 =
 {
- 	Item_Spawn(ITEMTYPE_WEAP3,1,100,self.origin,'0 0 0',10,1.5,world);
+ 	Item_Spawn(ITEMTYPE_WEAP3,1,100,self.origin,'0 0 0',0,1.5,world);
 }
 
 void() weapon_weap4 =
 {
- 	Item_Spawn(ITEMTYPE_WEAP4,1,100,self.origin,'0 0 0',10,1.5,world);
+ 	Item_Spawn(ITEMTYPE_WEAP4,1,100,self.origin,'0 0 0',0,1.5,world);
 }
 
 void() weapon_weap5 =
 {
- 	Item_Spawn(ITEMTYPE_WEAP5,1,100,self.origin,'0 0 0',10,1.5,world);
+ 	Item_Spawn(ITEMTYPE_WEAP5,1,100,self.origin,'0 0 0',0,1.5,world);
 }
 
 void() weapon_weap6 =
 {
- 	Item_Spawn(ITEMTYPE_WEAP6,1,100,self.origin,'0 0 0',10,1.5,world);
+ 	Item_Spawn(ITEMTYPE_WEAP6,1,100,self.origin,'0 0 0',0,1.5,world);
 }
 
 void() weapon_weap7 =
 {
- 	Item_Spawn(ITEMTYPE_WEAP7,1,100,self.origin,'0 0 0',10,1.5,world);
+ 	Item_Spawn(ITEMTYPE_WEAP7,1,100,self.origin,'0 0 0',0,1.5,world);
 }
 
 void() weapon_weap8 =
 {
- 	Item_Spawn(ITEMTYPE_WEAP8,1,100,self.origin,'0 0 0',10,1.5,world);
+ 	Item_Spawn(ITEMTYPE_WEAP8,1,100,self.origin,'0 0 0',0,1.5,world);
 }
 
 void() weapon_weap9 =
 {
- 	Item_Spawn(ITEMTYPE_WEAP9,1,100,self.origin,'0 0 0',10,1.5,world);
+ 	Item_Spawn(ITEMTYPE_WEAP9,1,100,self.origin,'0 0 0',0,1.5,world);
 }
 
 void() item_ammo1 =
 {
- 	Item_Spawn(ITEMTYPE_AMMO1,50,0,self.origin,'0 0 0',10,1,world);
+ 	Item_Spawn(ITEMTYPE_AMMO1,50,0,self.origin,'0 0 0',0,1,world);
 }
 void() item_ammo2 =
 {
- 	Item_Spawn(ITEMTYPE_AMMO2,50,0,self.origin,'0 0 0',10,1,world);
+ 	Item_Spawn(ITEMTYPE_AMMO2,50,0,self.origin,'0 0 0',0,1,world);
 }
 void() item_ammo3 =
 {
- 	Item_Spawn(ITEMTYPE_AMMO3,50,0,self.origin,'0 0 0',10,1,world);
+ 	Item_Spawn(ITEMTYPE_AMMO3,50,0,self.origin,'0 0 0',0,1,world);
 }
+void() item_ammo4 =
+{
+ 	Item_Spawn(ITEMTYPE_AMMO4,50,0,self.origin,'0 0 0',0,1,world);
+}
 
-void() item_armor1 =
+void() armor_small =
 {
 	newmis = spawn();
 	newmis.armorvalue = 5;
@@ -771,16 +846,16 @@
 		newmis.touch = Item_Pickup;
 	//newmis.noise = "pickuphealth";
 	setorigin(newmis, self.origin);
-	setmodel(newmis, "models/items/armor1.md3");
+	setmodel(newmis, "models/items/armor_small.md3");
 	setsize(newmis, '-8 -8 -8', '8 8 8');
 	
 	newmis.effects = newmis.effects | EF_ADDITIVE | EF_FULLBRIGHT;
 }
 
-void() item_armor25 =
+void() armor_medium =
 {
 	newmis = spawn();
-	newmis.armorvalue = 25;
+	newmis.armorvalue = 50;
 	newmis.owner = world;
 	newmis.classname = "Armor";
 	newmis.netname = "Armor";
@@ -796,13 +871,64 @@
 		newmis.touch = Item_Pickup;
 	//newmis.noise = "pickuphealth";
 	setorigin(newmis, self.origin);
-	setmodel(newmis, "models/items/armor25.md3");
+	setmodel(newmis, "models/items/armor_medium.md3");
 	setsize(newmis, '-8 -8 -8', '8 8 8');
 	
 	newmis.effects = newmis.effects | EF_ADDITIVE | EF_FULLBRIGHT;
 }
 
 
+void() health_small =
+{
+	newmis = spawn();
+	newmis.health = 5;
+	newmis.owner = world;
+	newmis.classname = "Health";
+	newmis.netname = "Health";
+	newmis.ispointable = TRUE;
+	newmis.solid = SOLID_TRIGGER;
+	newmis.movetype = MOVETYPE_TOSS;
+	newmis.velocity = '0 0 0';
+	newmis.angles = '0 0 0';
+	newmis.nextthink = time + 10;
+	newmis.think = Item_Think;
+	newmis.use = Item_Pickup;
+	if (cvar("g_itemtouchpickup"))
+		newmis.touch = Item_Pickup;
+	//newmis.noise = "pickuphealth";
+	setorigin(newmis, self.origin);
+	setmodel(newmis, "models/items/health_small.md3");
+	setsize(newmis, '-8 -8 -8', '8 8 8');
+	
+	newmis.effects = newmis.effects | EF_ADDITIVE | EF_FULLBRIGHT;
+}
+
+void() health_medium =
+{
+	newmis = spawn();
+	newmis.health = 50;
+	newmis.owner = world;
+	newmis.classname = "Health";
+	newmis.netname = "Health";
+	newmis.ispointable = TRUE;
+	newmis.solid = SOLID_TRIGGER;
+	newmis.movetype = MOVETYPE_TOSS;
+	newmis.velocity = '0 0 0';
+	newmis.angles = '0 0 0';
+	newmis.nextthink = time + 10;
+	newmis.think = Item_Think;
+	newmis.use = Item_Pickup;
+	if (cvar("g_itemtouchpickup"))
+		newmis.touch = Item_Pickup;
+	//newmis.noise = "pickuphealth";
+	setorigin(newmis, self.origin);
+	setmodel(newmis, "models/items/health_medium.md3");
+	setsize(newmis, '-8 -8 -8', '8 8 8');
+	
+	newmis.effects = newmis.effects | EF_ADDITIVE | EF_FULLBRIGHT;
+}
+
+
 /*
 // _x = quantity, _y = ammo type, _z = ammo quantity
 .vector inventory_weap1;

Modified: trunk/progsqc/player.qc
===================================================================
--- trunk/progsqc/player.qc	2008-08-30 06:52:26 UTC (rev 123)
+++ trunk/progsqc/player.qc	2008-09-07 00:24:13 UTC (rev 124)
@@ -42,12 +42,18 @@
 		  pc = playerclass_spawn(classnumber, cvar(cname,"_aitype"), strzone(cvar_string(cname,"_model")), ".md3", strzone(cvar_string(cname,"_name")));
 		  
 		  pc.health = cvar(cname,"_healthstart");
-		  pc.max_health = cvar(cname,"_healthmax");
+		  pc.healthstable = cvar(cname,"_healthstart");
+		  pc.healthmax = cvar(cname,"_healthmax");
+		  pc.healthregen = cvar(cname,"_healthregen");
+		  pc.healthrott = cvar(cname,"_healthrott");
+
 		  pc.armorvalue = cvar(cname,"_shieldstart");
+		  pc.armorstable = cvar(cname,"_shieldstart");
 		  pc.armormax = cvar(cname,"_shieldmax");
 		  pc.armortype = 1;
-		  pc.armorregenrate = cvar(cname,"_regenrate");
-		  pc.armorregenmax = cvar(cname,"_regenmax");
+		  pc.armorregen = cvar(cname,"_shieldregen");
+		  pc.armorrott = cvar(cname,"_shieldrott");
+
 		  pc.gibhealth = cvar(cname,"_gibhealth");
 		  pc.paintake = 20;
 		  pc.unlimitedinventory = FALSE;
@@ -241,13 +247,20 @@
 	self.weapon_ofs = pc.weapon_ofs;
 	self.view_ofs = pc.view_ofs;
 	self.aitype = pc.aitype;
+
 	self.health = pc.health;
-	self.max_health = pc.max_health;
+	self.healthmax = pc.healthmax;
+	self.healthstable = pc.healthstable;
+	self.healthregen = pc.healthregen;
+	self.healthrott = pc.healthrott;
+
 	self.armorvalue = pc.armorvalue;
 	self.armormax = pc.armormax;
 	self.armortype = pc.armortype;
-	self.armorregenrate = pc.armorregenrate;
-	self.armorregenmax = pc.armorregenmax;
+	self.armorregen = pc.armorregen;
+	self.armorstable = pc.armorstable;
+	self.armorrott = pc.armorrott;
+
 	self.gibhealth = pc.gibhealth;
 	self.paintake = pc.paintake;
 	self.unlimitedinventory = pc.unlimitedinventory;
@@ -379,40 +392,31 @@
 {
 	local entity spot;
 
+	if (!self.spawned)
+	{
+		if (cvar("g_gametype") == 1)
+		{
+			self.team = 5;		
+			stuffcmd(self,"menu_showinfoscreen\n");
+		}
+		else if (cvar("g_gametype") == 0)
+			stuffcmd(self,"menu_showteamselect\n");
+	}
+	else
+	 	player_spawn(self.classnum);
+
+
 	self.flags = FL_CLIENT;
 
-	//self.team = cvar("g_startteam");
-	//self.classnum = cvar("g_startclass");
-
 	spot = SelectSpawnPoint ();
 	setorigin (self, spot.origin + '0 0 1');
+	pointparticles(particleeffectnum("teleport"), self.origin, '0 0 0', 1);
+	sound (self, CHAN_BODY, "misc/spawn.ogg", 1, ATTN_NORM);
 	self.angles = spot.angles;
 
 	self.fixangle = TRUE;
 	self.v_angle = self.angles_x * '-1 0 0' + self.angles_y * '0 1 0';
 	self.nextthink = 0;
-
-	if (cvar("g_gametype") == 1)
-	{
-		stuffcmd(self,"menu_showinfoscreen\n");
-		self.team = 5;
-		self.classnum = 0;
-		stuffcmd(self,"cmd join\n");
-	}
-	else
-	{
-		self.health = 1;
-		stuffcmd(self,"menu_showteamselect\n");
-	}
-
-	if (!self.spawned)
-	{
-	   self.health = 1;
-	}
-	else
-	{
-	 	player_spawn(self.classnum);
-	}
 };
 
 /*
@@ -603,7 +607,10 @@
 			 	if ((self.jetpack_fuel > 10) && (self.actorpart_jetpacktrail.effects & EF_NODRAW))
 			  	   self.actorpart_jetpacktrail.effects = self.actorpart_jetpacktrail.effects - EF_NODRAW;
 				else if (self.jetpack_fuel < 10)
-			 	   self.actorpart_jetpacktrail.effects = self.actorpart_jetpacktrail.effects | EF_NODRAW;
+				{
+					sound(self, CHAN_BODY, "jetpack/stop.wav", 1, ATTN_NORM);			 	 
+					self.actorpart_jetpacktrail.effects = self.actorpart_jetpacktrail.effects | EF_NODRAW;
+				}
 			}
 		}
 		else
@@ -1022,6 +1029,9 @@
 {
 	if (animdone)
 	{
+		if (!(self.flags & FL_CLIENT))
+			SUB_SetFade(self,5,10);
+
 		self.deadflag = DEAD_DEAD;
 		self.anim_framefunc = anim_nullfunc;
 	}
@@ -1067,32 +1077,31 @@
 	{
 		te_bloodshower (self.origin + self.mins, self.origin + self.maxs, 50, 3000);	
 		// make a meaty mess
-		TossGib (world, "models/gibs/bloodyskull.md3", self.origin, '0 0 600',0);
-		TossGib (world, "models/gibs/gib1.md3", self.origin, self.velocity,0);
-		TossGib (world, "models/gibs/gib1.mdl", self.origin, self.velocity,0);
-		TossGib (world, "models/gibs/gib2.mdl", self.origin, self.velocity,0);
-		TossGib (world, "models/gibs/gib3.mdl", self.origin, self.velocity,0);
+		TossGib (world, "models/gibs/bloodyskull.md3", self.origin, '0 0 600',0,4);
+		TossGib (world, "models/gibs/gib1.md3", self.origin, self.velocity,0,4);
+		TossGib (world, "models/gibs/gib2.mdl", self.origin, self.velocity,0,4);
+		TossGib (world, "models/gibs/gib3.mdl", self.origin, self.velocity,0,4);
 		// these destory on impact
-		TossGib (world, "models/gibs/gib5.md3", self.origin, '-500 0 450',1);
-		TossGib (world, "models/gibs/chunk.mdl", self.origin, '0 -500 450',1);
-		TossGib (world, "models/gibs/chunk.mdl", self.origin, '500 0 450',1);
-		TossGib (world, "models/gibs/chunk.mdl", self.origin, self.velocity,1);
-		TossGib (world, "models/gibs/chunk.mdl", self.origin, '0 0 450',1);
+		TossGib (world, "models/gibs/gib5.md3", self.origin, '-500 0 450',1,4);
+		TossGib (world, "models/gibs/chunk.mdl", self.origin, '0 -500 450',1,4);
+		TossGib (world, "models/gibs/chunk.mdl", self.origin, '500 0 450',1,4);
+		TossGib (world, "models/gibs/chunk.mdl", self.origin, self.velocity,1,4);
+		TossGib (world, "models/gibs/chunk.mdl", self.origin, '0 0 450',1,4);
 		sound (self, CHAN_VOICE, "misc/gib.wav", 1, ATTN_NORM);
 	}
 	else if (self.gibtype == 2)
 	{
 		te_explosion(self.origin);
-		TossGib (world, "models/gibs/m_gib1.md3", self.origin, self.velocity,0);
-		TossGib (world, "models/gibs/m_gib2.md3", self.origin, self.velocity,0);
-		TossGib (world, "models/gibs/m_gib3.md3", self.origin, self.velocity,0);
-		TossGib (world, "models/gibs/m_gib4.md3", self.origin, self.velocity,0);
-		TossGib (world, "models/gibs/m_gib5.md3", self.origin, self.velocity,0);
-		TossGib (world, "models/gibs/m_gib6.md3", self.origin, self.velocity,0);
+		TossGib (world, "models/gibs/m_gib1.md3", self.origin, self.velocity,0,2);
+		TossGib (world, "models/gibs/m_gib2.md3", self.origin, self.velocity,0,2);
+		TossGib (world, "models/gibs/m_gib3.md3", self.origin, self.velocity,0,2);
+		TossGib (world, "models/gibs/m_gib4.md3", self.origin, self.velocity,0,2);
+		TossGib (world, "models/gibs/m_gib5.md3", self.origin, self.velocity,0,2);
+		TossGib (world, "models/gibs/m_gib6.md3", self.origin, self.velocity,0,2);
 	}
 	
 	if (self.flags & FL_CLIENT)
-	   TossGib (self, "models/gibs/eye.md3", self.origin, self.velocity,0);
+	   TossGib (self, "models/gibs/eye.md3", self.origin, self.velocity,0,4);
 	else
 	{
 		remove(self.actorpart_torso);
@@ -1119,17 +1128,24 @@
 
 void() player_regen =
 {
+	if (self.deadflag)
+		return;
+
+	if (self.armorvalue < self.armorstable)
 	if (time > self.armorregentime)
-	if (self.armorvalue < self.armorregenmax)
-	if (!self.deadflag)
-	{
-		if (self.armorregenplaysound)
-		{
-			//sound(self, CHAN_AUTO, strcat(self.playerclass.sounddir, "/shieldregen.wav"), 1, ATTN_STATIC);
-			self.armorregenplaysound = FALSE;
-		}
-		self.armorvalue = min(self.armorvalue + frametime * self.armorregenrate, self.armorregenmax);
-	}
+		self.armorvalue = min(self.armorvalue + frametime * self.armorregen, self.armorstable);
+
+	if (self.armorvalue > self.armorstable)
+	if (time > self.armorrotttime)
+		self.armorvalue = max(self.armorvalue - frametime * self.armorrott, self.armorstable);
+
+	if (self.health < self.healthstable)
+	if (time > self.healthregentime)
+		self.health = min(self.health + frametime * self.healthregen, self.healthstable);
+
+	if (self.health > self.healthstable)
+	if (time > self.healthrotttime)
+		self.health = max(self.health - frametime * self.healthrott, self.healthstable);
 };
 
 void(float force) player_selectlegsanim;
@@ -1307,9 +1323,10 @@
 				select = select - 1;
 				if (select == 0)
 				{
-				   self.switchweaponitem = w;
-				   //bprint(iteminfo_name,"\n");
-				   break;
+					self.switchweaponitem = w;
+					sound(self, CHAN_BODY, "misc/weapon_switch.ogg", 1, ATTN_NORM);
+					//bprint(iteminfo_name,"\n");
+					break;
 				}
 			}
 			w = w + 1;
@@ -1329,6 +1346,7 @@
 			if (iteminfo_weapon_canraise)
 			{
 				self.switchweaponitem = w;
+				sound(self, CHAN_BODY, "misc/weapon_switch.ogg", 1, ATTN_NORM);
 				//bprint(iteminfo_name,"\n");
 				break;
 			}
@@ -1348,6 +1366,7 @@
 			if (iteminfo_weapon_canraise)
 			{
 				self.switchweaponitem = w;
+				sound(self, CHAN_BODY, "misc/weapon_switch.ogg", 1, ATTN_NORM);
 				//bprint(iteminfo_name,"\n");
 				break;
 			}

Modified: trunk/progsqc/structures.qc
===================================================================
--- trunk/progsqc/structures.qc	2008-08-30 06:52:26 UTC (rev 123)
+++ trunk/progsqc/structures.qc	2008-09-07 00:24:13 UTC (rev 124)
@@ -1,7 +1,11 @@
 void() spawner_think =
 {
- 	if (total_monsters < 150)
+ 	if (self.enemy)
 	{
+		if (self.enemydistance > 1500)
+		{
+			self.enemy = world;
+		}
 	   	local entity oldself;
 		newmis = spawn();
 		setorigin(newmis, self.origin + v_up * 60);
@@ -12,21 +16,34 @@
 		self = newmis;
 		self.team = cvar("g_defaultenemyteam");
 		self.unlimitedinventory = 1;
-		player_spawn(ACTORTYPE_CLASS2);
+		player_spawn(ACTORTYPE_CLASS5);
+		self.spawned = 1;
 		self = oldself;
-		self.nextthink = time + 10;
 	}
+	else
+	{
+		ai_findenemy();
+	}
+	self.nextthink = time + 8;
 }
 
 void() structure_die =
 {
- 	te_explosion(self.origin);
-	TossGib (world, "models/gibs/m_gib1.md3", self.origin, self.velocity,0);
-	TossGib (world, "models/gibs/m_gib2.md3", self.origin, self.velocity,0);
-	TossGib (world, "models/gibs/m_gib3.md3", self.origin, self.velocity,0);
-	TossGib (world, "models/gibs/m_gib4.md3", self.origin, self.velocity,0);
-	TossGib (world, "models/gibs/m_gib5.md3", self.origin, self.velocity,0);
-	TossGib (world, "models/gibs/m_gib6.md3", self.origin, self.velocity,0);
+	if (self.structure_print != "")
+	{
+		bprint(self.structure_print,"\n");
+	}
+	if (self.classname == "power")
+	{
+		sound (self, CHAN_AUTO, "misc/capture.wav", 1, ATTN_NORM);
+	}
+	pointparticles(particleeffectnum(self.structure_effect), self.origin, '0 0 0', 1);
+	TossGib (world, "models/gibs/m_gib1.md3", self.origin, self.velocity,0,2);
+	TossGib (world, "models/gibs/m_gib2.md3", self.origin, self.velocity,0,2);
+	TossGib (world, "models/gibs/m_gib3.md3", self.origin, self.velocity,0,2);
+	TossGib (world, "models/gibs/m_gib4.md3", self.origin, self.velocity,0,2);
+	TossGib (world, "models/gibs/m_gib5.md3", self.origin, self.velocity,0,2);
+	TossGib (world, "models/gibs/m_gib6.md3", self.origin, self.velocity,0,2);
 	remove(self);
 }
 
@@ -40,21 +57,27 @@
 {
  	if (cvar("g_gametype") == 1)
 	{
+		self.classname = "spawner";
 		setorigin(self, self.origin + '0 0 1');
 		self.team = cvar("g_defaultenemyteam");
 		self.unlimitedinventory = 1;
 		self.solid = SOLID_BBOX;
 		self.movetype = MOVETYPE_TOSS;
-		setmodel(self, "models/structures/telenode/telenode.md3");
+		self.view_ofs = '0 0 0';
+		self.colormod = '3 1 1';
+		setmodel(self, "models/structures/spawner/spawner.md3");
 		
 	   	self.takedamage = DAMAGE_YES;
 		self.health = 100;
 		self.mass = 500;
 		self.th_die = structure_die;
 		self.th_pain = structure_pain;
+		self.sight = 4000;
+
+		self.structure_effect = "explode_medium";
 		
 		self.think = spawner_think;
-		self.nextthink = time + 10;
+		self.nextthink = time + 1;
 	}
 };
 
@@ -63,15 +86,17 @@
 {
  	if (cvar("g_gametype") == 1)
 	{
+		self.classname = "power";
 		setorigin(self, self.origin + '0 0 1');
 		self.team = cvar("g_defaultenemyteam");
 		self.unlimitedinventory = 1;
 		self.solid = SOLID_BBOX;
 		self.movetype = MOVETYPE_TOSS;
-		self.scale = 0.5;
-		self.glow_size = 500;
-		self.colormod = '3 3 3';
+		self.scale = 1.2;
 		setmodel(self, "models/structures/reactor/reactor.md3");
+
+		self.structure_effect = "blue_power";
+		self.structure_print = "POWER STATION DESTORYED";
 		
 	   	self.takedamage = DAMAGE_YES;
 		self.health = 500;
@@ -93,6 +118,8 @@
 		self.movetype = MOVETYPE_TOSS;
 		setmodel(self, "models/structures/barrels/barrel.md2");
 		setsize(self, '-26 -26 -5', '26 26 40');
+
+		self.structure_effect = "explode_medium";
 		
 	   	self.takedamage = DAMAGE_YES;
 		self.health = 1000;

Modified: trunk/progsqc/util.qc
===================================================================
--- trunk/progsqc/util.qc	2008-08-30 06:52:26 UTC (rev 123)
+++ trunk/progsqc/util.qc	2008-09-07 00:24:13 UTC (rev 124)
@@ -166,6 +166,12 @@
 	self.think = SUB_SetFade_Think;
 	self.nextthink = self.fade_time;
 	self.alpha = 1 - (time - self.fade_time) * self.fade_rate;
+	if (self.actorpart_torso)
+		self.actorpart_torso.alpha = 1 - (time - self.fade_time) * self.fade_rate;
+	if (self.actorpart_head)
+		self.actorpart_head.alpha = 1 - (time - self.fade_time) * self.fade_rate;
+	if (self.actorpart_weapon)
+		self.actorpart_weapon.alpha = 1 - (time - self.fade_time) * self.fade_rate;
 	if (self.alpha < 0.01)
 		SUB_VanishOrRemove(self);
 	self.alpha = bound(0.01, self.alpha, 1);

Modified: trunk/progsqc/violence.qc
===================================================================
--- trunk/progsqc/violence.qc	2008-08-30 06:52:26 UTC (rev 123)
+++ trunk/progsqc/violence.qc	2008-09-07 00:24:13 UTC (rev 124)
@@ -32,7 +32,7 @@
 // TossGib now takes a gib entity so it can be used for tossing heads
 // gib.velocity now uses randomvec() instead of a bunch of manual random calls
 // merged Gib() into PlayerGib()
-void TossGib (entity gib, string mdlname, vector org, vector v, float destroyontouch)
+void TossGib (entity gib, string mdlname, vector org, vector v, float destroyontouch, float trailflag)
 {
 	if (gib == world)
 	{
@@ -47,6 +47,7 @@
 	gib.solid = SOLID_CORPSE;
 	gib.skin = 0;
 	gib.effects = 0;
+	gib.modelflags = trailflag;
 	gib.gibrandom = random(); // used for customize function to reduce gibs
 	gib.effects = EF_LOWPRECISION; // use less bandwidth
 




More information about the zymotic-commits mailing list