Index: server/g_damage.qc
===================================================================
--- server/g_damage.qc	(revision 7768)
+++ server/g_damage.qc	(working copy)
@@ -175,9 +175,8 @@
 		if(g_ctf_ignore_frags)
 			f = 0;
 	}
-
+	
 	attacker.totalfrags += f;
-
 	if(f)
 		UpdateFrags(attacker, f);
 }
@@ -227,7 +226,7 @@
 
 void Obituary (entity attacker, entity inflictor, entity targ, float deathtype)
 {
-	string	s, a;
+	string	s, a, w_preGender, w_gender, w_postGender;
 	float p, w;
 
 	if (targ.classname == "player" || targ.classname == "corpse")
@@ -271,81 +270,120 @@
 				else
 					centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, "^1You killed your own dumb self!"));
 			}
+			if(!bBPrintsCurrentlySuppressed)
+			{
+				if(sv_gentle) {
+					if (deathtype == DEATH_CAMP)
+						bprint ("^1",s, "^1 thought ", GetPlayerModelSexVerbiage(targ, "he"), " found a nice camping ground\n");
+					else if (deathtype == DEATH_MIRRORDAMAGE)
+						bprint ("^1",s, "^1 didn't become friends with the Lord of Teamplay\n");
+					else
+						bprint ("^1",s, "^1 will be reinserted into the game due to ", GetPlayerModelSexVerbiage(targ, "his"), "own actions\n");
 
-			if(sv_gentle) {
-				if (deathtype == DEATH_CAMP)
-					bprint ("^1",s, "^1 thought he found a nice camping ground\n");
-				else if (deathtype == DEATH_MIRRORDAMAGE)
-					bprint ("^1",s, "^1 didn't become friends with the Lord of Teamplay\n");
-				else
-					bprint ("^1",s, "^1 will be reinserted into the game due to his own actions\n");
+					if(deathtype != DEATH_TEAMCHANGE)
+					{
+						LogDeath("suicide", deathtype, targ, targ);
+						GiveFrags(attacker, targ, -1);
+					}
+					if (targ.killcount > 2)
+						bprint ("^1",s,"^1 faded after a ",ftos(targ.killcount)," point spree\n");
+				} else if ( CheckSpidfliskSelfDeathMessage(attacker, deathtype) ) {
+				} else {
+					w = DEATH_WEAPONOF(deathtype);
+					if(WEP_VALID(w))
+					{
+						w_deathtypestring = "couldn't resist the urge to self-destruct";
+						w_deathtype = deathtype;
+						weapon_action(w, WR_SUICIDEMESSAGE);
+						
+						// 02.08.09 - Lixivial
+						// Parse and replace the gender since the suicides were moved to the weapon entities...
+						if (strstrofs(w_deathtypestring, "#self", 0) > 0) {
+							w_preGender = substring(w_deathtypestring, 0, strstrofs(w_deathtypestring, "#self", 0));
+							w_gender = GetPlayerModelSexVerbiage(targ, "himself");
+							w_postGender = substring(w_deathtypestring, strstrofs(w_deathtypestring, "#self", 0) + 5, strlen(w_deathtypestring));
+							w_deathtypestring = strcat(w_preGender, w_gender, w_postGender);
+						} else if (strstrofs(w_deathtypestring, "#s", 0) > 0) {
+							w_preGender = substring(w_deathtypestring, 0, strstrofs(w_deathtypestring, "#s", 0));
+							w_gender = GetPlayerModelSexVerbiage(targ, "his");
+							w_postGender = substring(w_deathtypestring, strstrofs(w_deathtypestring, "#s", 0) + 2, strlen(w_deathtypestring));
+							w_deathtypestring = strcat(w_preGender, w_gender, w_postGender);
+						} else if (strstrofs(w_deathtypestring, "#", 0) > 0) {
+							w_preGender = substring(w_deathtypestring, 0, strstrofs(w_deathtypestring, "#", 0));
+							w_gender = GetPlayerModelSexVerbiage(targ, "he");
+							w_postGender = substring(w_deathtypestring, strstrofs(w_deathtypestring, "#", 0) + 1, strlen(w_deathtypestring));
+							w_deathtypestring = strcat(w_preGender, w_gender, w_postGender);
+						}
+						bprint("^1", s, "^1 ", w_deathtypestring, "\n");
+					}
+					else if (deathtype == DEATH_KILL)
+						bprint ("^1",s, "^1 couldn't take it anymore\n");
+					else if (deathtype == DEATH_ROT)
+						bprint ("^1",s, "^1 died\n");
+					else if (deathtype == DEATH_NOAMMO)
+						bprint ("^7",s, "^7 committed suicide. What's the point of living without ammo?\n");
+					else if (deathtype == DEATH_CAMP)
+						bprint ("^1",s, "^1 thought ", GetPlayerModelSexVerbiage(targ, "he"), " found a nice camping ground\n");
+					else if (deathtype == DEATH_MIRRORDAMAGE)
+						bprint ("^1",s, "^1 didn't become friends with the Lord of Teamplay\n");
+					else if (deathtype != DEATH_TEAMCHANGE)
+						bprint ("^1",s, "^1 couldn't resist the urge to self-destruct\n");
 
-				if(deathtype != DEATH_TEAMCHANGE)
-				{
-					LogDeath("suicide", deathtype, targ, targ);
-					GiveFrags(attacker, targ, -1);
+					if(deathtype != DEATH_TEAMCHANGE)
+					{
+						LogDeath("suicide", deathtype, targ, targ);
+						GiveFrags(attacker, targ, -1);
+					}
+					if (targ.killcount > 2)
+						// DRESK - 12/19/06
+						// Modified Color Codes
+						// bprint ("^1",s,"^1 ended it all with a ",ftos(targ.killcount)," kill spree\n");
+						bprint ("^7",s,"^1 ended it all with a ^2", ftos(targ.killcount),"^1 kill spree\n");
 				}
-				if (targ.killcount > 2)
-					bprint ("^1",s,"^1 faded after a ",ftos(targ.killcount)," point spree\n");
-			} else {
-				w = DEATH_WEAPONOF(deathtype);
-				if(WEP_VALID(w))
-				{
-					w_deathtypestring = "couldn't resist the urge to self-destruct";
-					w_deathtype = deathtype;
-					weapon_action(w, WR_SUICIDEMESSAGE);
- 					bprint("^1", s, "^1 ", w_deathtypestring, "\n");
-				}
-				else if (deathtype == DEATH_KILL)
-					bprint ("^1",s, "^1 couldn't take it anymore\n");
-				else if (deathtype == DEATH_ROT)
-					bprint ("^1",s, "^1 died\n");
-				else if (deathtype == DEATH_NOAMMO)
-					bprint ("^7",s, "^7 committed suicide. What's the point of living without ammo?\n");
-				else if (deathtype == DEATH_CAMP)
-					bprint ("^1",s, "^1 thought he found a nice camping ground\n");
-				else if (deathtype == DEATH_MIRRORDAMAGE)
-					bprint ("^1",s, "^1 didn't become friends with the Lord of Teamplay\n");
-				else if (deathtype == DEATH_CHEAT)
-					bprint ("^1",s, "^1 unfairly eliminated himself\n");
-				else if (deathtype == DEATH_FIRE)
-					bprint ("^1",s, "^1 burned to death\n");
-				else if (deathtype != DEATH_TEAMCHANGE)
-					bprint ("^1",s, "^1 couldn't resist the urge to self-destruct\n");
-
-				if(deathtype != DEATH_TEAMCHANGE)
-				{
-					LogDeath("suicide", deathtype, targ, targ);
-					GiveFrags(attacker, targ, -1);
-				}
-				if (targ.killcount > 2)
-					bprint ("^1",s,"^1 ended it all after a ",ftos(targ.killcount)," kill spree\n");
 			}
 		}
 		else if (attacker.classname == "player" || attacker.classname == "gib")
 		{
 			if(teams_matter && attacker.team == targ.team)
 			{
-				if(sv_gentle) {
-					centerprint(attacker, strcat(DAMAGE_CENTERPRINT_SPACER, "^1Moron! You went against a team mate!"));
-					bprint ("^1", a, "^1 took action against a team mate\n");
-				} else {
-					centerprint(attacker, strcat(DAMAGE_CENTERPRINT_SPACER, "^1Moron! You fragged ", s, ", a team mate!"));
-					bprint ("^1", a, "^1 mows down a team mate\n");
-				}
+
 				GiveFrags(attacker, targ, -1);
-				if (targ.killcount > 2) {
-					if(sv_gentle)
-						bprint ("^1",s,"'s ^1",ftos(targ.killcount)," scoring spree was ended by a team mate!\n");
-					else
-						bprint ("^1",s,"'s ^1",ftos(targ.killcount)," kill spree was ended by a team mate!\n");
+				// DRESK - 12/19/06
+				// Support Suppressed BPrints
+				if(!bBPrintsCurrentlySuppressed)
+				{
+					if(sv_gentle) {
+						centerprint(attacker, strcat(DAMAGE_CENTERPRINT_SPACER, "^1Moron! You went against a team mate!"));
+						bprint ("^1", a, "^1 took action against a team mate\n");
+					} else {
+						centerprint(attacker, strcat(DAMAGE_CENTERPRINT_SPACER, "^1Moron! You fragged ", s, "^1, a team mate!"));
+						bprint ("^1", a, "^1 mows down a team mate\n");
+					}
+					if (targ.killcount > 2) {
+						if(sv_gentle)
+							// DRESK - 12/19/06
+							// Modified Color Codes
+							//bprint ("^1",s,"'s ^1",ftos(targ.killcount)," scoring spree was ended by a team mate!\n");
+							bprint ("^7",s,"^7's ^2", ftos(targ.killcount),"^1 scoring spree was ended by a team mate!\n");
+						else
+							// DRESK - 12/19/06
+							// Modified Color Codes
+							//bprint ("^1",s,"'s ^1",ftos(targ.killcount)," kill spree was ended by a team mate!\n");
+							bprint ("^7",s,"'s ^2",ftos(targ.killcount),"^1 kill spree was ended by a team mate!\n");
+					}
+					if (attacker.killcount > 2) {
+						if(sv_gentle)
+							// DRESK - 12/19/06
+							// Modified Color Codes
+							//bprint ("^1",a,"^1 ended a ",ftos(attacker.killcount)," scoring spree by going against a team mate\n");
+							bprint ("^7",a,"^1 ended a ^2",ftos(attacker.killcount),"^1 scoring spree by going against a team mate\n");
+						else
+							// DRESK - 12/19/06
+							// Modified Color Codes
+							//bprint ("^1",a,"^1 ended a ",ftos(attacker.killcount)," kill spree by killing a teammate\n");
+							bprint ("^7",a,"^1 ended a ^2",ftos(attacker.killcount),"^1 kill spree by killing a teammate\n");
+					}
 				}
-				if (attacker.killcount > 2) {
-					if(sv_gentle)
-						bprint ("^1",a,"^1 ended a ",ftos(attacker.killcount)," scoring spree by going against a team mate\n");
-					else
-						bprint ("^1",a,"^1 ended a ",ftos(attacker.killcount)," kill spree by killing a team mate\n");
-				}
 				attacker.killcount = 0;
 
 				LogDeath("tk", deathtype, attacker, targ);
@@ -358,18 +396,24 @@
 					checkrules_firstblood = TRUE;
 					if(sv_gentle)
 					{
-						bprint("^1",a, "^1 was the first to score", "\n");
+						if(!bBPrintsCurrentlySuppressed)
+							bprint("^1",a, "^1 was the first to score", "\n");
 						blood_message = "^1First point\n";
 						//victim_message = "^1First victim\n";  // or First casualty
 					}
 					else
 					{
-						bprint("^1",a, "^1 drew first blood", "\n");
+						if(!bBPrintsCurrentlySuppressed)
+							bprint("^1",a, "^1 drew first blood", "\n");
 						blood_message = "^1First blood\n";
 						victim_message = "^1First victim\n";  // or First casualty
 					}
 				}
 
+				// DRESK - 5/09/06
+				// Check Advanced Death Reports
+				CheckAdvancedDeathReports(attacker, targ);
+				/*
 				if(sv_gentle > 0) {
 					centerprint(attacker, strcat(DAMAGE_CENTERPRINT_SPACER, "^4You scored against ^7", s));
 					centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, a,"^1 scored against you ^7"));
@@ -378,54 +422,60 @@
 					centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, victim_message, "^1You were fragged by ^7", a));
 					attacker.taunt_soundtime = time + 1;
 				}
-
-				if(sv_gentle) {
-					bprint ("^1",s, "^1 needs a restart thanks to ", a, "\n");
-				} else {
-					w = DEATH_WEAPONOF(deathtype);
-					if(WEP_VALID(w))
-					{
-						w_deathtypestring = "was blasted by";
-						w_deathtype = deathtype;
-						weapon_action(w, WR_KILLMESSAGE);
-						p = strstrofs(w_deathtypestring, "#", 0);
-						if(p < 0)
-							bprint("^1", s, "^1 ", w_deathtypestring, " ", a, "\n");
+				*/
+				// DRESK - 12/19/06
+				// Support Suppressed BPrints
+				if(!bBPrintsCurrentlySuppressed)
+				{
+					if( CheckSpidfliskDeathMessage(attacker, targ, deathtype) ) {
+				    } else if(sv_gentle) {
+						bprint ("^1",s, "^1 needs a restart thanks to ", a, "\n");
+					} else {
+						w = DEATH_WEAPONOF(deathtype);
+						if(WEP_VALID(w))
+						{
+							w_deathtypestring = "was blasted by";
+							w_deathtype = deathtype;
+							weapon_action(w, WR_KILLMESSAGE);
+							p = strstrofs(w_deathtypestring, "#", 0);
+							if(p < 0)
+								bprint("^1", s, "^1 ", w_deathtypestring, " ", a, "\n");
+							else
+								bprint("^1", s, "^1 ", substring(w_deathtypestring, 0, p), a, "^1", substring(w_deathtypestring, p+1, strlen(w_deathtypestring) - (p+1)), "\n");
+						}
+						else if (deathtype == DEATH_TELEFRAG)
+							bprint ("^1",s, "^1 was telefragged by ", a, "\n");
+						else if (deathtype == DEATH_DROWN)
+							bprint ("^1",s, "^1 was drowned by ", a, "\n");
+						else if (deathtype == DEATH_SLIME)
+							bprint ("^1",s, "^1 was slimed by ", a, "\n");
+						else if (deathtype == DEATH_LAVA)
+							bprint ("^1",s, "^1 was cooked by ", a, "\n");
+						else if (deathtype == DEATH_FALL)
+							bprint ("^1",s, "^1 was grounded by ", a, "\n");
+						else if (deathtype == DEATH_SHOOTING_STAR)
+							bprint ("^1",s, "^1 was shot into space by ", a, "\n");
+						else if (deathtype == DEATH_SWAMP)
+							bprint ("^1",s, "^1 was conserved by ", a, "\n");
+						else if (deathtype == DEATH_HURTTRIGGER && inflictor.message2 != "")
+						{
+							p = strstrofs(inflictor.message2, "#", 0);
+							if(p < 0)
+								bprint("^1", s, "^1 ", inflictor.message2, " ", a, "\n");
+							else
+								bprint("^1", s, "^1 ", substring(inflictor.message2, 0, p), a, "^1", substring(inflictor.message2, p+1, strlen(inflictor.message2) - (p+1)), "\n");
+						}
+						else if(deathtype == DEATH_TURRET)
+							bprint ("^1",s, "^1 was pushed into the line of fire by ^1", a, "\n");
+						else if(deathtype == DEATH_TOUCHEXPLODE)
+							bprint ("^1",s, "^1 was pushed into an accident by ^1", a, "\n");
+						else if(deathtype == DEATH_CHEAT)
+							bprint ("^1",s, "^1 was unfairly eliminated by ^1", a, "\n");
+						else if (deathtype == DEATH_FIRE)
+							bprint ("^1",s, "^1 was burnt to death by ^1", a, "\n");						
 						else
-							bprint("^1", s, "^1 ", substring(w_deathtypestring, 0, p), a, "^1", substring(w_deathtypestring, p+1, strlen(w_deathtypestring) - (p+1)), "\n");
+							bprint ("^1",s, "^1 was fragged by ", a, "\n");
 					}
-					else if (deathtype == DEATH_TELEFRAG)
-						bprint ("^1",s, "^1 was telefragged by ", a, "\n");
-					else if (deathtype == DEATH_DROWN)
-						bprint ("^1",s, "^1 was drowned by ", a, "\n");
-					else if (deathtype == DEATH_SLIME)
-						bprint ("^1",s, "^1 was slimed by ", a, "\n");
-					else if (deathtype == DEATH_LAVA)
-						bprint ("^1",s, "^1 was cooked by ", a, "\n");
-					else if (deathtype == DEATH_FALL)
-						bprint ("^1",s, "^1 was grounded by ", a, "\n");
-					else if (deathtype == DEATH_SHOOTING_STAR)
-						bprint ("^1",s, "^1 was shot into space by ", a, "\n");
-					else if (deathtype == DEATH_SWAMP)
-						bprint ("^1",s, "^1 was conserved by ", a, "\n");
-					else if (deathtype == DEATH_HURTTRIGGER && inflictor.message2 != "")
-					{
-						p = strstrofs(inflictor.message2, "#", 0);
-						if(p < 0)
-							bprint("^1", s, "^1 ", inflictor.message2, " ", a, "\n");
-						else
-							bprint("^1", s, "^1 ", substring(inflictor.message2, 0, p), a, "^1", substring(inflictor.message2, p+1, strlen(inflictor.message2) - (p+1)), "\n");
-					}
-					else if(deathtype == DEATH_TURRET)
-						bprint ("^1",s, "^1 was pushed into the line of fire by ^1", a, "\n");
-					else if(deathtype == DEATH_TOUCHEXPLODE)
-						bprint ("^1",s, "^1 was pushed into an accident by ^1", a, "\n");
-					else if(deathtype == DEATH_CHEAT)
-						bprint ("^1",s, "^1 was unfairly eliminated by ^1", a, "\n");
-					else if (deathtype == DEATH_FIRE)
-						bprint ("^1",s, "^1 was burnt to death by ^1", a, "\n");
-					else
-						bprint ("^1",s, "^1 was fragged by ", a, "\n");
 				}
 
 				if(g_ctf && targ.flagcarried)
@@ -437,144 +487,183 @@
 				else
 					GiveFrags(attacker, targ, 1);
 
-				if (targ.killcount > 2) {
-					if(sv_gentle)
-						bprint ("^1",s,"'s ^1", ftos(targ.killcount), " scoring spree was ended by ", a, "\n");
-					else
-						bprint ("^1",s,"'s ^1", ftos(targ.killcount), " kill spree was ended by ", a, "\n");
+				// DRESK - 12/19/06
+				// Support Suppressed BPrints
+				if(!bBPrintsCurrentlySuppressed)
+				{
+					if (targ.killcount > 2) {
+						if(sv_gentle)
+							// DRESK - 12/19/06
+							// Modified Color Coding
+							// bprint ("^1",s,"'s ^1", ftos(targ.killcount), " scoring spree was ended by ", a, "\n");
+							bprint (s,"^7's ^2", ftos(targ.killcount), "^1 scoring spree was ended by ^7", a, "\n");
+						else
+							// DRESK - 12/19/06
+							// Modified Color Coding
+							// bprint ("^1",s,"'s ^1", ftos(targ.killcount), " kill spree was ended by ", a, "\n");
+							bprint (s,"^7's ^2", ftos(targ.killcount), "^1 kill spree was ended by ^7", a, "\n");
+					}
 				}
-
 				attacker.killcount = attacker.killcount + 1;
 
-				if (attacker.killcount > 2) {
-					if(sv_gentle)
-						bprint ("^1",a,"^1 made ",ftos(attacker.killcount)," scores in a row\n");
-					else
-						bprint ("^1",a,"^1 has ",ftos(attacker.killcount)," frags in a row\n");
-				}
 
+
 				LogDeath("frag", deathtype, attacker, targ);
-
-				if (attacker.killcount == 3)
+				// DRESK 2/18/06
+				// Support Removed Kill Tree Reports
+				if( !cvar(CVAR_MISC_REMOVEKILLCOUNTREPORTS) )
 				{
-					if(sv_gentle) {
-						bprint (a,"^7 made a ^1TRIPLE SCORE\n");
-					} else {
-						bprint (a,"^7 made a ^1TRIPLE FRAG\n");
-						announce(attacker, "announcer/male/03kills.wav");
+					if(!bBPrintsCurrentlySuppressed)
+					{
+						if (attacker.killcount > 2) {
+							if(sv_gentle)
+								bprint ("^1",a,"^1 made ",ftos(attacker.killcount)," scores in a row\n");
+							else
+								bprint ("^1",a,"^1 has ",ftos(attacker.killcount)," frags in a row\n");
+						}
+						if (attacker.killcount == 3)
+						{
+							if(sv_gentle) {
+								bprint (a,"^7 made a ^1TRIPLE SCORE\n");
+							} else {
+								bprint (a,"^7 made a ^1TRIPLE FRAG\n");
+								announce(attacker, "announcer/male/03kills.wav");
+							}
+						}
+						else if (attacker.killcount == 5)
+						{
+							if(sv_gentle) {
+								bprint (a,"^7 unleashes ^1SCORING RAGE\n");
+							} else {
+								bprint (a,"^7 unleashes ^1RAGE\n");
+								announce(attacker, "announcer/male/05kills.wav");
+							}
+						}
+						else if (attacker.killcount == 10)
+						{
+							if(sv_gentle) {
+								bprint (a,"^7 made ^1TEN SCORES IN A ROW!\n");
+							} else {
+								bprint (a,"^7 starts the ^1MASSACRE!\n");
+								announce(attacker, "announcer/male/10kills.wav");
+							}
+						}
+						else if (attacker.killcount == 15)
+						{
+							if(sv_gentle) {
+								bprint (a,"^7 made ^1FIFTEEN SCORES IN A ROW!\n");
+							} else {
+								bprint (a,"^7 executes ^1MAYHEM!\n");
+								announce(attacker, "announcer/male/15kills.wav");
+							}
+						}
+						else if (attacker.killcount == 20)
+						{
+							if(sv_gentle) {
+								bprint (a,"^7 made ^1TWENTY SCORES IN A ROW!\n");
+							} else {
+								bprint (a,"^7 is a ^1BERSERKER!\n");
+								announce(attacker, "announcer/male/20kills.wav");
+							}
+						}
+						else if (attacker.killcount == 25)
+						{
+							if(sv_gentle) {
+								bprint (a,"^7 made ^1TWENTY FIFE SCORES IN A ROW!\n");
+							} else {
+								bprint (a,"^7 inflicts ^1CARNAGE!\n");
+								announce(attacker, "announcer/male/25kills.wav");
+							}
+						}
+						else if (attacker.killcount == 30)
+						{
+							if(sv_gentle) {
+								bprint (a,"^7 made ^1THIRTY SCORES IN A ROW!\n");
+							} else {
+								bprint (a,"^7 unleashes ^1ARMAGEDDON!\n");
+								announce(attacker, "announcer/male/30kills.wav");
+							}
+						}
 					}
 				}
-				else if (attacker.killcount == 5)
-				{
-					if(sv_gentle) {
-						bprint (a,"^7 unleashes ^1SCORING RAGE\n");
-					} else {
-						bprint (a,"^7 unleashes ^1RAGE\n");
-						announce(attacker, "announcer/male/05kills.wav");
-					}
-				}
-				else if (attacker.killcount == 10)
-				{
-					if(sv_gentle) {
-						bprint (a,"^7 made ^1TEN SCORES IN A ROW!\n");
-					} else {
-						bprint (a,"^7 starts the ^1MASSACRE!\n");
-						announce(attacker, "announcer/male/10kills.wav");
-					}
-				}
-				else if (attacker.killcount == 15)
-				{
-					if(sv_gentle) {
-						bprint (a,"^7 made ^1FIFTEEN SCORES IN A ROW!\n");
-					} else {
-						bprint (a,"^7 executes ^1MAYHEM!\n");
-						announce(attacker, "announcer/male/15kills.wav");
-					}
-				}
-				else if (attacker.killcount == 20)
-				{
-					if(sv_gentle) {
-						bprint (a,"^7 made ^1TWENTY SCORES IN A ROW!\n");
-					} else {
-						bprint (a,"^7 is a ^1BERSERKER!\n");
-						announce(attacker, "announcer/male/20kills.wav");
-					}
-				}
-				else if (attacker.killcount == 25)
-				{
-					if(sv_gentle) {
-						bprint (a,"^7 made ^1TWENTY FIFE SCORES IN A ROW!\n");
-					} else {
-						bprint (a,"^7 inflicts ^1CARNAGE!\n");
-						announce(attacker, "announcer/male/25kills.wav");
-					}
-				}
-				else if (attacker.killcount == 30)
-				{
-					if(sv_gentle) {
-						bprint (a,"^7 made ^1THIRTY SCORES IN A ROW!\n");
-					} else {
-						bprint (a,"^7 unleashes ^1ARMAGEDDON!\n");
-						announce(attacker, "announcer/male/30kills.wav");
-					}
-				}
 			}
 		}
 		else
 		{
-			centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, "^1Watch your step!"));
-			if (deathtype == DEATH_HURTTRIGGER && inflictor.message != "")
-				bprint ("^1",s, "^1 ", inflictor.message, "\n");
-			else if (deathtype == DEATH_DROWN)
-				if(sv_gentle)
-					bprint ("^1",s, "^1 was in the water for too long\n");
-				else
-					bprint ("^1",s, "^1 drowned\n");
-			else if (deathtype == DEATH_SLIME)
-				bprint ("^1",s, "^1 was slimed\n");
-			else if (deathtype == DEATH_LAVA)
-				if(sv_gentle)
-					bprint ("^1",s, "^1 found a hot place\n");
-				else
-					bprint ("^1",s, "^1 turned into hot slag\n");
-			else if (deathtype == DEATH_FALL)
-				if(sv_gentle)
-					bprint ("^1",s, "^1 tested gravity (and it worked)\n");
-				else
-					bprint ("^1",s, "^1 hit the ground with a crunch\n");
-			else if (deathtype == DEATH_SHOOTING_STAR)
-				bprint ("^1",s, "^1 became a shooting star\n");
-			else if (deathtype == DEATH_SWAMP)
-				if(sv_gentle)
-					bprint ("^1",s, "^1 discovered a swamp\n");
-				else
-					bprint ("^1",s, "^1 is now conserved for centuries to come\n");
-			else if(deathtype == DEATH_TURRET)
-				bprint ("^1",s, "^1 was mowed down by a turret \n");
-			else if(deathtype == DEATH_TOUCHEXPLODE)
-				bprint ("^1",s, "^1 died in an accident\n");
-			else if(deathtype == DEATH_CHEAT)
-				bprint ("^1",s, "^1 was unfairly eliminated\n");
-			else if(deathtype == DEATH_FIRE)
-				if(sv_gentle)
-					bprint ("^1",s, "^1 felt a little hot\n");
-				else
-					bprint ("^1",s, "^1 burnt to death\n");
-			else
-				if(sv_gentle)
-					bprint ("^1",s, "^1 needs a restart\n");
-				else
-					bprint ("^1",s, "^1 died\n");
+			// DRESK - 2/25/06
+			// Removed Client Feedback
+			//centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, "^1Watch your step!"));
+			if(deathtype == DEATH_HURTTRIGGER)
+				UpdateClientStatsScoreAward(targ, CLIENTSCORE_AWARD_NUMHURTTRIGGERDEATHS, 1);
+			// DRESK - 12/19/06
+			// Support Suppressed BPrints
+			if(!bBPrintsCurrentlySuppressed)
+			{
+				if( CheckSpidfliskWorldDeathMessage(targ, attacker, deathtype) ) {
+				} else {
+					if (deathtype == DEATH_HURTTRIGGER && inflictor.message != "")
+						bprint ("^1",s, "^1 ", inflictor.message, "\n");
+					else if (deathtype == DEATH_DROWN)
+						if(sv_gentle)
+							bprint ("^1",s, "^1 was in the water for too long\n");
+						else
+							bprint ("^1",s, "^1 drowned\n");
+					else if (deathtype == DEATH_SLIME)
+						bprint ("^1",s, "^1 was slimed\n");
+					else if (deathtype == DEATH_LAVA)
+						if(sv_gentle)
+							bprint ("^1",s, "^1 found a hot place\n");
+						else
+							bprint ("^1",s, "^1 turned into hot slag\n");
+					else if (deathtype == DEATH_FALL)
+						if(sv_gentle)
+							bprint ("^1",s, "^1 tested gravity (and it worked)\n");
+						else
+							bprint ("^1",s, "^1 hit the ground with a crunch\n");
+					else if (deathtype == DEATH_SHOOTING_STAR)
+						bprint ("^1",s, "^1 became a shooting star\n");
+					else if (deathtype == DEATH_SWAMP)
+						if(sv_gentle)
+							bprint ("^1",s, "^1 discovered a swamp\n");
+						else
+							bprint ("^1",s, "^1 is now conserved for centuries to come\n");
+					else if(deathtype == DEATH_TURRET)
+						bprint ("^1",s, "^1 was mowed down by a turret \n");
+					else if(deathtype == DEATH_TOUCHEXPLODE)
+						bprint ("^1",s, "^1 died in an accident\n");
+					else if(deathtype == DEATH_CHEAT)
+						bprint ("^1",s, "^1 was unfairly eliminated\n");
+					else if(deathtype == DEATH_FIRE)
+						if(sv_gentle)
+							bprint ("^1",s, "^1 felt a little hot\n");
+						else
+							bprint ("^1",s, "^1 burnt to death\n");					
+					else
+						if(sv_gentle)
+							bprint ("^1",s, "^1 needs a restart\n");
+						else
+							bprint ("^1",s, "^1 died\n");
+				}
+			}
 			GiveFrags(targ, targ, -1);
 			if(PlayerScore_Add(targ, SP_SCORE, 0) == -5) {
 				announce(targ, "announcer/male/botlike.wav");
 			}
 
-			if (targ.killcount > 2)
-				if(sv_gentle)
-					bprint ("^1",s,"^1 needs a restart after a ",ftos(targ.killcount)," scoring spree\n");
-				else
-					bprint ("^1",s,"^1 died with a ",ftos(targ.killcount)," kill spree\n");
+			if(!bBPrintsCurrentlySuppressed)
+			{ // BPrints Allowed			
+				if (targ.killcount > 2)
+					if(sv_gentle)
+						// DRESK - 12/19/06
+						// Modified Color Codes
+						//bprint ("^1",s,"^1 needs a restart after a ",ftos(targ.killcount)," scoring spree\n");
+						bprint (s,"^1 needs a restart after a ^2",ftos(targ.killcount),"^1 scoring spree\n");
+					else
+						// DRESK - 12/19/06
+						// Modified Color Codes
+						//bprint ("^1",s,"^1 died with a ",ftos(targ.killcount)," kill spree\n");
+						bprint (s,"^1 died with a ^2",ftos(targ.killcount),"^1 kill spree\n");
+			}
 
 			LogDeath("accident", deathtype, targ, targ);
 		}
@@ -601,9 +690,11 @@
 	mirrordamage = 0;
 	mirrorforce = 0;
 
-	if (gameover || targ.killcount == -666)
+	// DRESK - 4/28/07
+	// Support Ignore Damage
+	if (gameover || targ.killcount == -666 || targ.bIgnoreDamage)
 		return;
-
+		
 	local entity oldself;
 	oldself = self;
 	self = targ;
@@ -611,7 +702,7 @@
         damage_inflictor = inflictor;
         damage_attacker = attacker;
 		attacker_save = attacker;
-
+	
 	if(targ.classname == "player")
 		if(targ.hook)
 			if(targ.hook.aiment)
@@ -718,7 +809,6 @@
 				targ.armorvalue -= 1;
 				centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, "^3Remaining extra lives: ",ftos(targ.armorvalue)));
 				damage = 0;
-				targ.hitsound += 1;
 				attacker.hitsound += 1; // TODO change this to a future specific hitsound for armor hit
 			}
 			if (DEATH_ISWEAPON(deathtype, WEP_LASER))
@@ -766,6 +856,10 @@
 
 		if (targ == attacker)
 			damage = damage * cvar("g_balance_selfdamagepercent");	// Partial damage if the attacker hits himself
+			
+		// DRESK - 5/09/06
+		// Apply Handicap Modifier (only to damage, not force)
+		damage = Handicap_GetModifiedDamage(attacker, targ, damage);
 
 		// CTF: reduce damage/force
 		if(g_ctf)
@@ -884,6 +978,11 @@
 		self.event_damage (inflictor, attacker, damage, deathtype, hitloc, force);
 	self = oldself;
 
+	// DRESK - 12/20/06
+	// Check and Update Client Stats Scores - Player Damage
+	CheckAndUpdateClientStatsScores_PlayerDamage(attacker, targ, deathtype, damage);
+
+
 	if(targ.classname == "player" && attacker.classname == "player" && attacker != targ && attacker.health > 2)
 	{
 		// Savage: vampire mode
@@ -1016,7 +1115,7 @@
 	}
 
 	RadiusDamage_running = 1;
-
+	
 	tfloordmg = cvar("g_throughfloor_damage");
 	tfloorforce = cvar("g_throughfloor_force");
 
@@ -1125,6 +1224,11 @@
 									stat_maxdamage += coredamage;
 								}
 							}
+							
+							// DRESK - 3/10/07
+							// Update Client Stats Score
+							if(targ != attacker && targ.classname == "player")
+								UpdateClientStatsScoreAward(attacker, CLIENTSCORE_AWARD_RADIUSDAMAGE, finaldmg);
 
 							if(targ == directhitentity || DEATH_ISSPECIAL(deathtype))
 								Damage (targ, inflictor, attacker, finaldmg, deathtype, nearest, force);
@@ -1138,7 +1242,7 @@
 	}
 
 	RadiusDamage_running = 0;
-
+	
 	Damage_RecordDamage(attacker, deathtype, min(stat_maxdamage, stat_damagedone));
 
 	return total_damage_to_creatures;
@@ -1326,3 +1430,4 @@
 	Fire_ApplyDamage(self.owner);
 	self.nextthink = time;
 }
+
Index: server/waypointsprites.qc
===================================================================
--- server/waypointsprites.qc	(revision 7768)
+++ server/waypointsprites.qc	(working copy)
@@ -134,7 +134,7 @@
 {
 	if(!wp)
 		return;
-	if(wp.classname != "sprite_waypoint")
+	if(wp.classname != "sprite_waypoint" && wp.classname != "attached_sprite_waypoint")
 	{
 		backtrace("Trying to disown a non-waypointsprite");
 		return;
@@ -156,7 +156,7 @@
 
 	doremove = FALSE;
 
-	if(self.fade_time)
+	if(self.fade_time || self.owner.deadflag == DEAD_DEAD)
 	{
 		if(time >= self.teleport_time)
 			doremove = TRUE;
@@ -164,7 +164,23 @@
 
 	if(self.exteriormodeltoclient)
 		WaypointSprite_UpdateOrigin(self, self.exteriormodeltoclient.origin + self.view_ofs);
+		
+	// Lixivial
+	// 02.15.09. Toggle colour
+	if (self.classname == "attached_sprite_waypoint") {	
+		if (cvar(CVAR_MISC_WAYPOINTSPRITECOLOR) < 1)
+			self.model1 = "teambubble_neutral";
+		else if (cvar(CVAR_MISC_WAYPOINTSPRITECOLOR) > 0) 
+			self.model1 = TeamBubbleName(self.owner.team);
 
+		// Lixivial
+		// 08.23.08. Add ability to set no depth test on the team indicators.
+		if (cvar(CVAR_MISC_WAYPOINTSPRITENODEPTHTEST) <= 0)
+			self.effects = EF_LOWPRECISION;
+		else
+			self.effects = EF_NODEPTHTEST | EF_LOWPRECISION | EF_FULLBRIGHT;
+	}
+
 	if(doremove)
 		WaypointSprite_Kill(self);
 	else
@@ -174,19 +190,24 @@
 float WaypointSprite_visible_for_player(entity e)
 {
 	// personal waypoints
-	if(self.enemy)
+	if(self.enemy) {
 		if(self.enemy != other)
 			return FALSE;
+	}
 
-	// team waypoints
-	if(self.team && self.rule == SPRITERULE_DEFAULT)
-	{
-		if(self.team != other.team)
-			return FALSE;
-		if(other.classname != "player")
-			return FALSE;
+    // team waypoints
+    if(self.team && self.rule == SPRITERULE_DEFAULT) {
+        if(self.team != other.team)
+    		return FALSE;
+        if(other.classname != "player")
+			if (other.classname != "observer" && other.classname != "spectator")
+				return FALSE;
 	}
-
+	
+	if (other.classname == "player" && (self.owner.classname == "observer" || self.owner.classname == "spectator")) {
+		return FALSE;
+	}
+	
 	return TRUE;
 }
 
@@ -211,7 +232,7 @@
 
 	sendflags = sendflags & 0x7F;
 	
-	if(g_nexball)
+	if(g_nexball || self.classname == "attached_sprite_waypoint")
 		sendflags &~= 0x80;
 	else if(self.max_health || (self.pain_finished && (time < self.pain_finished + 0.25)))
 		sendflags |= 0x80;
@@ -284,7 +305,7 @@
 {
 	// if a WP wants to time out, let it time out immediately; other WPs ought to be reset/killed by their owners
 
-	if(self.fade_time) // there was there before: || g_keyhunt, do we really need this?
+	if(self.fade_time || self.classname == "attached_sprite_waypoint") // there was there before: || g_keyhunt, do we really need this?
 		WaypointSprite_Kill(self);
 }
 
@@ -342,6 +363,58 @@
 	return WaypointSprite_Spawn(spr, 0, 0, world, ofs, world, 0, own, ownfield, TRUE);
 }
 
+// Lixivial. 02.11.09.
+// Use bandwidth efficient method for manipulating/attaching existing entities.
+entity WaypointSprite_UseExisting(
+    string spr, // sprite
+    float lifetime, float maxdistance, // lifetime, max distance
+    entity ref, vector ofs, // position
+    entity showto, float t, // show to whom? Use a flag to indicate a team
+    entity own, .entity ownfield, // remove when own gets killed
+    float hideable, // true when it should be controlled by cl_hidewaypoints
+	entity wp
+)
+{
+    wp.classname = "attached_sprite_waypoint";
+    wp.exteriormodeltoclient = ref;
+    if(ref)
+        wp.view_ofs = ofs;
+    else
+        setorigin(wp, ofs);
+    wp.enemy = showto;
+    wp.team = t;
+    wp.owner = own;
+    wp.currentammo = hideable;
+    if(own)
+    {
+        if(own.ownfield)
+            remove(own.ownfield);
+        own.ownfield = wp;
+        wp.owned_by_field = ownfield;
+    }
+	wp.fade_rate = maxdistance;
+    wp.think = WaypointSprite_Think;
+    wp.nextthink = time;		
+	wp.model1 = spr;
+    //setmodel(wp, "null");
+
+	// Lixivial 08.23.08.
+	// Add ability to set no depth test on the team indicators.
+	// Used for the initial instantiation. The think method can/probably would take it over easily enough.
+	// So this might not be necessary.
+	if (cvar(CVAR_MISC_WAYPOINTSPRITENODEPTHTEST) > 0)
+		wp.effects = EF_NODEPTHTEST | EF_LOWPRECISION | EF_FULLBRIGHT;
+	else
+		wp.effects = EF_LOWPRECISION;
+
+    wp.customizeentityforclient = WaypointSprite_Customize;
+    wp.waypointsprite_visible_for_player = WaypointSprite_visible_for_player;
+    wp.reset2 = WaypointSprite_Reset;
+	Net_LinkEntity(wp, FALSE, 0, WaypointSprite_SendEntity);
+
+    return wp;
+}
+
 .entity waypointsprite_deployed_fixed;
 entity WaypointSprite_DeployFixed(
 	string spr,
@@ -391,6 +464,28 @@
 	return WaypointSprite_Spawn(spr, waypointsprite_deployed_lifetime, maxdistance, self, '0 0 64', world, t, self, waypointsprite_attached, FALSE);
 }
 
+entity WaypointSprite_AttachExisting(
+    string spr,
+    float limited_range,
+	entity waypoint
+)
+{
+    float t, maxdistance;
+	WaypointSprite_Kill(waypoint.owner.waypointsprite_attached);
+	
+    if(teams_matter)
+        t = self.team;
+    else
+        t = COLOR_SPECTATOR;
+
+    if(limited_range)
+        maxdistance = waypointsprite_limitedrange;
+    else
+        maxdistance = 0;
+
+    return WaypointSprite_UseExisting(spr, waypointsprite_deployed_lifetime, maxdistance, self, '0 0 64', world, t, self, waypointsprite_attached, FALSE, waypoint);
+}
+
 entity WaypointSprite_AttachCarrier(
 	string spr,
 	entity carrier
Index: server/w_campingrifle.qc
===================================================================
--- server/w_campingrifle.qc	(revision 7768)
+++ server/w_campingrifle.qc	(working copy)
@@ -182,9 +182,9 @@
 	else if (req == WR_SUICIDEMESSAGE)
 	{
 		if(w_deathtype & HITTYPE_SECONDARY)
-			w_deathtypestring = "shot himself automatically";
+			w_deathtypestring = "shot #self automatically";
 		else
-			w_deathtypestring = "sniped himself somehow";
+			w_deathtypestring = "sniped #self somehow";
 	}
 	else if (req == WR_KILLMESSAGE)
 	{
Index: server/Dresk_Weapons_Laser.qc
===================================================================
--- server/Dresk_Weapons_Laser.qc	(revision 0)
+++ server/Dresk_Weapons_Laser.qc	(revision 0)
@@ -0,0 +1,96 @@
+// DRESK - Weapon - Laser Functions
+
+// Support New Laser Alternate Fire
+void W_Laser_Touch_NewAlternate (void)
+{
+	vector	dir;
+	vector org2;
+
+	if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
+	{
+		remove(self);
+		return;
+	}
+
+	if (other == self.owner)
+		return;
+
+	dir = normalize (self.owner.origin - self.origin);
+	org2 = findbetterlocation (self.origin, 8);
+
+	// te_knightspike(org2);
+	te_wizspike(org2);
+	te_customflash(org2, 320, 0.4, '0 1 0');
+
+
+	self.event_damage = SUB_Null;
+	RadiusDamage (self, self.owner, cvar("g_balance_laser_secondary_damage"), cvar("g_balance_laser_primary_edgedamage"), cvar("g_balance_laser_primary_radius") * cvar(CVAR_WEAPON_LASER_ALTFIRERADIUSMULTIPLIER), world, cvar("g_balance_laser_primary_force") * cvar(CVAR_WEAPON_LASER_ALTFIRERADIUSMULTIPLIER), WEP_LASER, world);
+
+	remove (self);
+}
+// Support New Laser Alternate Attack
+void W_Laser_Attack_NewAlternate()
+{ // New Laser Alternate Fire Attack
+	local entity missile;
+
+	W_SetupShot (self, FALSE, 3, "weapons/lasergun_fire.wav", cvar("g_balance_laser_secondary_damage"));
+	//W_SetupShot (self, '15 8 -8', FALSE, 3, "weapons/lasergun_fire.wav");
+	//te_customflash(w_shotorg, 160, 0.2, '1 0 0');
+
+	missile = spawn ();
+	missile.owner = self;
+	missile.classname = "laserbolt_alternate";
+	missile.bot_dodge = TRUE;
+	missile.bot_dodgerating = cvar("g_balance_laser_primary_damage");
+
+	missile.movetype = MOVETYPE_FLY;
+	PROJECTILE_MAKETRIGGER(missile);
+	missile.projectiledeathtype = WEP_LASER | HITTYPE_SECONDARY;
+
+	setmodel (missile, "models/laser.mdl");
+	setsize (missile, '0 0 0', '0 0 0');
+	setorigin (missile, w_shotorg);
+
+	missile.velocity = w_shotdir * ( cvar("g_balance_laser_primary_speed") / cvar(CVAR_WEAPON_LASER_ALTFIRESPEEDDIVISOR) );
+	W_SetupProjectileVelocity(missile);
+	missile.angles = vectoangles (missile.velocity);
+	//missile.glow_color = 250; // 244, 250
+	//missile.glow_size = 120;
+	missile.touch = W_Laser_Touch_NewAlternate;
+	missile.think = SUB_Remove;
+	missile.nextthink = time + cvar("g_balance_laser_primary_lifetime");
+
+	missile.effects = EF_NOSHADOW | EF_FULLBRIGHT | EF_LOWPRECISION | EF_STARDUST;
+	missile.flags = FL_PROJECTILE;
+	
+	// Help Text
+	HelpText_CustomFeature_LaserAltFire(self);
+	// Modify Missile Color
+	// Modify Missile Glow
+	missile.glow_color = cvar(CVAR_WEAPON_LASER_ALTFIREGLOWCOLOR);
+	missile.glow_size = 25;
+	missile.glow_trail = 1;
+	CSQCProjectile(missile, TRUE, PROJECTILE_LASER_SECONDARY, TRUE);
+	
+}
+float CheckLaserAlternateFire()
+{ // Check Laser Alternate Fire
+	// NOTE: Assumed scope is player
+	local float bUsed;
+		bUsed = TRUE;
+	
+	// Alternate Laser Fire Addition
+	if( cvar(CVAR_WEAPON_LASER_ALLOWALTFIRE) )
+	{ // New Alternate Fire
+		if (weapon_prepareattack(0, cvar("g_balance_laser_primary_refire")))
+		{
+			W_Laser_Attack_NewAlternate();
+			weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_laser_primary_animtime"), w_ready);
+		}
+	}
+	else
+		bUsed = FALSE;
+		
+	// Return Status
+	return bUsed;
+}
\ No newline at end of file
Index: server/Dresk_Bots.qc
===================================================================
--- server/Dresk_Bots.qc	(revision 0)
+++ server/Dresk_Bots.qc	(revision 0)
@@ -0,0 +1,237 @@
+// DRESK - Bots
+// Provides extended functions for bots.
+
+void PlayBroadcastMessageSound();
+
+/*
+void BroadcastPlayerCountInformation()
+{ // Print Player Count Information
+	local entity enPlayer;
+	local float nEntityBotCount;
+	local float nEntityClientCount;
+		nEntityBotCount = 0;
+		nEntityClientCount = 0;
+		
+	// Acquire Initial Player
+	enPlayer = find(world, classname, "player");
+	while (enPlayer)
+	{ // Traverse Players
+		if ( clienttype(enPlayer) == CLIENTTYPE_BOT)
+			// Bot Located; Increment
+			nEntityBotCount++;
+		else
+		if( clienttype(enPlayer) == CLIENTTYPE_REAL)
+			// Client Located; Increment
+			nEntityClientCount++;
+			
+		// Acquire Next Player
+		enPlayer = find(enPlayer, classname, "player");
+	}
+	
+	// Generate String
+	local string strMessage;
+	strMessage = strcat("Entity Bot Count : ", ftos(nEntityBotCount), "\nEntity Client Count : ", ftos(nEntityClientCount), "\n");
+	strMessage = strcat(strMessage, "Global Bot Count : ", ftos(nBotCount), "\nGlobal Player Count : ", ftos(player_count), "\n");
+	strMessage = strcat(strMessage, "nSpectatorCount : ", ftos(nSpectatorCount), "\nnNonSpectatorCount : ", ftos(nNonSpectatorCount), "\n");
+	
+	sprint(self, strMessage);
+	// bprint(strMessage);
+}
+float GetCurrentBotCountFromEntities()
+{ // Return Current Bot Count
+	local entity enPlayer;
+	local float nEntityBotCount;
+	
+	// Acquire Initial Player
+	enPlayer = find(world, classname, "player");
+	while (enPlayer)
+	{ // Traverse Players
+		if ( clienttype(enPlayer) == CLIENTTYPE_BOT)
+			// Bot Located; Increment
+			nEntityBotCount++;
+			
+		// Acquire Next Player
+		enPlayer = find(enPlayer, classname, "player");
+	}
+	
+	// Return Bot Count
+	return nEntityBotCount;
+}
+float GetRequiredBotsCount()
+{ // Return Required Bots Count
+	// NOTE: Integrated logic into one function for performance reasons.
+	/*
+	local entity enPlayer;
+	local float nBotCount;
+	local float nClientCount;
+		nBotCount = 0;
+		nClientCount = 0;
+		
+	// Acquire Initial Player
+	enPlayer = find(world, classname, "player");
+	while (enPlayer)
+	{ // Traverse Players
+		if ( clienttype(enPlayer) == CLIENTTYPE_BOT)
+			// Bot Located; Increment
+			nBotCount++;
+		else
+		if( clienttype(enPlayer) == CLIENTTYPE_REAL)
+			// Client Located; Increment
+			nClientCount++;
+			
+		// Acquire Next Player
+		enPlayer = find(enPlayer, classname, "player");
+	}
+	// * / GOES HERE
+	
+	
+	
+	// Acquire Required Bot Count
+	local float nRequiredBots;
+	
+	if( cvar(CVAR_BOT_BASECOUNTINCLUDESSPECTATORS) )
+		// Base Count Includes Spectators
+		// nRequiredBots = cvar(CVAR_BOT_FILLBOTSBASECOUNT) - ( (nSpectatorCount + nNonSpectatorCount) - nBotCount);
+		nRequiredBots = cvar(CVAR_BOT_FILLBOTSBASECOUNT) - (player_count - nBotCount);
+	else
+		// Base Count ONLY Non-Spectators
+		nRequiredBots = cvar(CVAR_BOT_FILLBOTSBASECOUNT) - (nNonSpectatorCount - nBotCount);
+		
+		if(nRequiredBots < 0)
+			nRequiredBots = 0;
+			
+	
+	// local string strDebug;
+		// strDebug = strcat("'", ftos(nBotCount), "' Bots, '", ftos(player_count), "' Total Players, '", ftos(nRequiredBots), "' Required\n");
+		// bprint(strDebug);
+			
+	// Return Required Bots
+	return nRequiredBots;
+}
+void CheckBotFill()
+{ // Check Bot Fill
+	if( cvar(CVAR_BOT_FILLBOTSBASECOUNT) > 0)
+	{ // Valid FillBotsBase Count; Parse
+		/*
+		// Acquire Current Bot Count
+		local float nBotCount;
+			nBotCount = GetCurrentBotCount();
+			
+		// Acquire Actual Player Count (non bots)
+		local float nActualPlayerCount;
+			nActualPlayerCount = player_count - nBotCount;
+			
+		// Acquire Required Bot Count
+		local float nRequiredBots;
+			nRequiredBots = cvar(CVAR_BOT_FILLBOTSBASECOUNT) - nActualPlayerCount;
+		if(nRequiredBots < 0)
+			nRequiredBots = 0;
+		// * / GOES HERE
+		
+		// Spawn / Despawn Bots
+			// Assign Skill
+			cvar_set("skill", cvar_string(CVAR_BOT_FILLBOTSSKILL) );
+			// Spawn Bots
+			cvar_set("bot_number", ftos( GetRequiredBotsCount() ) );
+	}
+}
+void PrintBotInformation()
+{ // Print Bot Information
+	local string strDebug;
+	
+	// Acquire Normal Required Bot Count
+	strDebug = strcat("Required Bot Count : ", ftos(GetRequiredBotsCount()), "\n");
+	// Acquire Current Bot Count	
+		local float nEntityBotCount;
+			nEntityBotCount = GetCurrentBotCountFromEntities();
+		strDebug = strcat(strDebug, "Entity Bot Count : ", ftos(nEntityBotCount), "\n");
+			
+	// Acquire Actual Player Count (non bots)
+		local float nActualPlayerCount;
+			nActualPlayerCount = player_count - nEntityBotCount;
+			
+			strDebug = strcat(strDebug, "Total Player Count : ", ftos(nActualPlayerCount), "\n");
+			
+	// Acquire Required Bot Count
+		local float nRequiredBots;
+			nRequiredBots = cvar(CVAR_BOT_FILLBOTSBASECOUNT) - nActualPlayerCount;
+		if(nRequiredBots < 0)
+			nRequiredBots = 0;
+			
+			strDebug = strcat(strDebug, "Required Bots : ", ftos(nRequiredBots), "\n");
+		
+		bprint(strDebug);
+}
+float CheckClientCommandBotSay(string strCommand)
+{ // Check Client Command Bot Say
+	// NOTE: Scope assumed under issuer of command.
+	local float fReturn;
+		// Default to Suppress Say
+		fReturn = 0;
+		
+	// Tokenize Command
+	tokenize(strCommand);
+	
+	if(argv(1) == "playercount")
+		BroadcastPlayerCountInformation();
+	else
+	if(argv(1) == "botinfo")
+		PrintBotInformation();
+	else
+		// Do NOT Suppress Say
+		fReturn = 1;
+		
+	return fReturn;
+	
+	/*
+	if(time >= self.fClientNextBotModificationTime)
+	{ // Modification Allowed
+		if(argv(1) == "bots")
+		{ // Bot Statement Issued
+			// Acquire Number of Bots
+			local float nNumBots;
+				nNumBots = rint( stof( argv(2) ) );
+				
+			// Validate Number of Bots
+			if(nNumBots < 0)
+				nNumBots = 0;
+			else
+			if(nNumBots > 4)
+				nNumBots = 4;
+				
+			// Update Bot Modification Time
+			self.fClientNextBotModificationTime = time + 30;
+				
+			cvar_set("bot_number", ftos(nNumBots) );
+		}
+	}
+	else
+	{ // Modification Not Allowed
+		// Report Message to Client
+		sprint(self, "You may not modify the bots at this time.\n");
+	}
+	// * / GOES HERE
+}
+*/
+void CheckBotsFillBroadcast()
+{ // Check Bots Fill Broadcast
+	// Acquire Display Bots Fill Time
+	local float nDisplayBotsFillTime;
+		nDisplayBotsFillTime = cvar(CVAR_BOT_DISPLAYBOTSFILLTIME);
+		
+	if(nDisplayBotsFillTime > 0)
+	{ // Valid Display Time
+		if( mod(time, nDisplayBotsFillTime) == 0)
+		{ // Display Necessary
+			// Generate Display Message
+			local string strDisplay;
+				strDisplay = strcat("Bots Filling at Skill '^1", cvar_string("skill"), "^7' for '^1", cvar_string("minplayers"), "^7' Base Player Count\n");
+				
+			// Broadcast
+			bprint(strDisplay);
+			
+			// Play Broadcast Sound
+			PlayBroadcastMessageSound();
+		}
+	}
+}
\ No newline at end of file
Index: server/w_rocketlauncher.qc
===================================================================
--- server/w_rocketlauncher.qc	(revision 7768)
+++ server/w_rocketlauncher.qc	(working copy)
@@ -10,6 +10,80 @@
 	}
 }
 
+/*
+// DRESK - 2/8/07
+// Support Rocket Explosion Type
+// TODO: Need to definitely evaluate this.
+void W_Rocket_Explode (float nExplosionType)
+{
+	W_Rocket_Unregister();
+
+	vector	org2;
+	sound (self, CHAN_PLAYER, "weapons/rocket_impact.wav", 1, ATTN_NORM);
+	org2 = findbetterlocation (self.origin, 16);
+
+	//te_explosion (org2);
+	// LordHavoc: TE_TEI_BIGEXPLOSION
+		// DRESK - 2/8/07
+	// Utilize Modified Explosion For Triggered Rocket
+	if(nExplosionType == ROCKETLAUNCHER_EXPLOSIONTYPE_TRIGGERED)
+		te_explosion(org2);
+	else
+	{ // Standard (Large) Explosion
+		WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
+		WriteByte (MSG_BROADCAST, 78);
+		WriteCoord (MSG_BROADCAST, org2_x);
+		WriteCoord (MSG_BROADCAST, org2_y);
+		WriteCoord (MSG_BROADCAST, org2_z);
+	}
+
+	//effect (org2, "models/sprites/rockexpl.spr", 0, 12, 35);
+	self.event_damage = SUB_Null;
+	
+	// DRESK - 2/8/07
+	// Utilize Correct Damage Amount Based on Explosion Type
+	local float fDamage;
+	local float fEdgeDamage;
+	local float fRadius;
+	local float fForce;
+	switch(nExplosionType)
+	{
+		case ROCKETLAUNCHER_EXPLOSIONTYPE_TRIGGERED:
+			// DEBUG
+			// bprint( strcat(self.owner.netname, "^7 triggered rockets!\n") );
+			
+			// Report Help Text
+			HelpText_CustomFeature_RocketAltFireDamage(self.owner);
+			
+			fDamage = cvar("g_balance_rocketlauncher_damage") * cvar(CVAR_WEAPON_ROCKETLAUNCHER_TRIGGER_DAMAGEMULTIPLIER);
+			fEdgeDamage = cvar("g_balance_rocketlauncher_edgedamage") * cvar(CVAR_WEAPON_ROCKETLAUNCHER_TRIGGER_DAMAGEMULTIPLIER);
+			fRadius = cvar("g_balance_rocketlauncher_radius") * cvar(CVAR_WEAPON_ROCKETLAUNCHER_TRIGGER_RADIUSMULTIPLIER);
+			fForce = cvar("g_balance_rocketlauncher_force");
+			break;
+		default:
+			fDamage = cvar("g_balance_rocketlauncher_damage");
+			fEdgeDamage = cvar("g_balance_rocketlauncher_edgedamage");
+			fRadius = cvar("g_balance_rocketlauncher_radius");
+			fForce = cvar("g_balance_rocketlauncher_force");
+			break;
+	}
+	RadiusDamage (self, self.owner, fDamage, fEdgeDamage, fRadius, world, fForce, WEPBIT_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"), IT_ROCKET_LAUNCHER);
+
+	if (self.owner.weapon == WEP_ROCKET_LAUNCHER)
+	{
+		if(self.owner.ammo_rockets < cvar("g_balance_rocketlauncher_ammo"))
+		{
+			self.owner.cnt = WEP_ROCKET_LAUNCHER;
+			self.owner.attack_finished = time;
+			self.owner.switchweapon = w_getbestweapon(self.owner);
+		}
+		if(cvar("g_laserguided_missile"))
+				  self.owner.attack_finished = time + cvar("g_balance_rocketlauncher_refire");
+	}
+	remove (self);
+}
+*/
 void W_Rocket_Explode (void)
 {
 	W_Rocket_Unregister();
@@ -95,6 +169,9 @@
 		{
 			other = world;
 			self.projectiledeathtype |= HITTYPE_BOUNCE;
+			// DRESK - 2/8/07
+			// Support Rocket Explosion Type
+			//W_Rocket_Explode(ROCKETLAUNCHER_EXPLOSIONTYPE_TRIGGERED);
 			W_Rocket_Explode ();
 		}
 		else
@@ -135,6 +212,9 @@
 	{
 		other = world;
 		self.projectiledeathtype |= HITTYPE_BOUNCE;
+		// DRESK - 2/8/07
+		// Support Rocket Explosion Type
+		//W_Rocket_Explode(ROCKETLAUNCHER_EXPLOSIONTYPE_TIME);
 		W_Rocket_Explode ();
 		return;
 	}
@@ -235,6 +315,9 @@
 	W_Rocket_Unregister();
 
 	PROJECTILE_TOUCH;
+	// DRESK - 2/8/07
+	// Support Rocket Explosion Type
+	//W_Rocket_Explode(ROCKETLAUNCHER_EXPLOSIONTYPE_TOUCH);
 	W_Rocket_Explode ();
 }
 
@@ -244,8 +327,12 @@
 		return;
 	self.health = self.health - damage;
 	self.angles = vectoangles(self.velocity);
+	// DRESK - 2/8/07
+	// Support Rocket Explosion Type
 	if (self.health <= 0)
+		//W_PrepareExplosionByDamage(attacker, W_Rocket_Explode(ROCKETLAUNCHER_EXPLOSIONTYPE_DAMAGED));
 		W_PrepareExplosionByDamage(attacker, W_Rocket_Explode);
+		
 }
 
 void W_Rocket_Attack (void)
Index: server/domination.qc
===================================================================
--- server/domination.qc	(revision 7768)
+++ server/domination.qc	(working copy)
@@ -640,5 +640,4 @@
 	// teamplay is always on in domination, defaults to hurt self but not teammates
 	//if(!teams_matter)
 	//	cvar_set("teamplay", "3");
-};
-
+};
\ No newline at end of file
Index: server/w_grenadelauncher.qc
===================================================================
--- server/w_grenadelauncher.qc	(revision 7768)
+++ server/w_grenadelauncher.qc	(working copy)
@@ -102,6 +102,9 @@
 
 	gren.angles = vectoangles (gren.velocity);
 	gren.flags = FL_PROJECTILE;
+	
+	// DRESK - 2/20/06
+	CheckGrenadeLauncherExtendedEffects(gren, 1);
 
 	CSQCProjectile(gren, TRUE, PROJECTILE_GRENADE, TRUE);	
 }
@@ -142,6 +145,9 @@
 	gren.angles = vectoangles (gren.velocity);
 	gren.flags = FL_PROJECTILE;
 
+	// DRESK - 2/20/06
+	CheckGrenadeLauncherExtendedEffects(gren, 2);
+
 	CSQCProjectile(gren, TRUE, PROJECTILE_GRENADE_BOUNCING, TRUE);
 }
 
@@ -211,7 +217,7 @@
 	else if (req == WR_SUICIDEMESSAGE)
 	{
 		if(w_deathtype & HITTYPE_SECONDARY)
-			w_deathtypestring = "tried out his own grenade";
+			w_deathtypestring = "tried out #s own grenade";
 		else
 			w_deathtypestring = "detonated";
 	}
Index: server/vote.qc
===================================================================
--- server/vote.qc	(revision 7768)
+++ server/vote.qc	(working copy)
@@ -221,7 +221,8 @@
 				} else if(VoteCheckNasty(dovote)) {
 					print_to(e, "Syntax error in command. See 'vhelp' for more info.");
 				} else if(RemapVote(dovote, "vdo", e)) { // strcat seems to be necessary
-					bprint("\{1}^2* ^3", VoteNetname(e), "^2 used his ^3master^2 status to do \"^2", RemapVote_display, "^2\".\n");
+					// Lixivial add gender here.
+					bprint("\{1}^2* ^3", VoteNetname(e), "^2 used ", GetPlayerModelSexVerbiage(e, "his"), " ^3master^2 status to do \"^2", RemapVote_display, "^2\".\n");
 					if(cvar("sv_eventlog"))
 						GameLogEcho(strcat(":vote:vdo:", ftos(e.playerid), ":", RemapVote_display));
 					localcmd(strcat(RemapVote_vote, "\n"));
Index: server/w_electro.qc
===================================================================
--- server/w_electro.qc	(revision 7768)
+++ server/w_electro.qc	(working copy)
@@ -72,7 +72,7 @@
 
 	W_SetupShot_ProjectileSize (self, '0 0 -3', '0 0 -3', FALSE, 2, "weapons/electro_fire.wav", cvar("g_balance_electro_primary_damage"));
 
-	pointparticles(particleeffectnum("electro_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
+	pointparticles(particleeffectnum("SPIDFLISK_ELECTRO_MUZZLEFLASH"), w_shotorg, w_shotdir * 1000, 1);
 
 	proj = spawn ();
 	proj.classname = "plasma_prim";
@@ -109,8 +109,28 @@
 	W_SetupShot_ProjectileSize (self, '0 0 -3', '0 0 -3', FALSE, 2, "weapons/electro_fire2.wav", cvar("g_balance_electro_secondary_damage"));
 	w_shotdir = v_forward; // no TrueAim for grenades please
 
-	pointparticles(particleeffectnum("electro_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
+	// DRESK - 2/8/07
+	// Update Client Stats Score
+	UpdateClientStatsScoreAward(self, CLIENTSCORE_AWARD_NUMELECTROBALLSFIRED, 1);
 
+	pointparticles(particleeffectnum("SPIDFLISK_ELECTRO_MUZZLEFLASH"), w_shotorg, w_shotdir * 1000, 1);
+
+	/* Lixivial
+	   TODO: Make a new effectinfo to handle this.
+	// DRESK - 4/6/07
+	// Support Reduced Combo Explosion
+	if( cvar(CVAR_WEAPON_ELECTRO_USEREDUCEDCOMBOEXPLOSION) )
+	{ // Reduced Combo Explosion
+		te_superspikequad(org2);
+		te_customflash(org2, 150, 1, '0.4 0.6 1');
+	}
+	else
+	{ // Standard Explosion
+		te_spikequad(self.origin);
+		te_explosionrgb(org2, '0.5 0.5 1');
+	}
+	*/
+
 	proj = spawn ();
 	proj.classname = "plasma";
 	proj.owner = self;
Index: server/cl_client.qc
===================================================================
--- server/cl_client.qc	(revision 7768)
+++ server/cl_client.qc	(working copy)
@@ -66,7 +66,6 @@
 	}
 }
 
-
 #define SPAWNPOINT_SCORE frags
 
 .string netname_previous;
@@ -85,6 +84,11 @@
 {
 	self.classname = "info_player_deathmatch";
 	relocate_spawnpoint();
+	// DRESK - 5/28/07
+	if( CheckSpidfliskSpawnPointEventsAndIsBadSpawnPoint() )
+	
+	// Bad Spawn Point
+	remove(self);
 }
 
 void spawnpoint_use()
@@ -165,6 +169,9 @@
 				}
 				good = 1;
 			}
+			else
+			{
+			}
 			ent = find(ent, targetname, spot.target);
 		}
 
@@ -221,7 +228,7 @@
 				// too short distance
 				spawn_allgood = FALSE;
 			}
-			else
+			else 
 			{
 				// perfect
 				spawn_allbad = FALSE;
@@ -558,8 +565,9 @@
 	if(self.ballcarried)
 		DropBall(self.ballcarried, self.origin + self.ballcarried.origin, self.velocity);
 
+	// DRESK
 	WaypointSprite_PlayerDead();
-
+	
 	if(self.killcount != -666)
 	{
 		if(g_lms)
@@ -570,13 +578,15 @@
 				bprint ("^4", self.netname, "^4 is spectating now\n"); // TODO turn this into a proper forfeit?
 		}
 		else
-			bprint ("^4", self.netname, "^4 is spectating now\n");
+			// DRESK - 1/20/07
+			// Modified Message Feedback
+			PrepareClient_Spectating(self);
 	}
 
 	PlayerScore_Clear(self); // clear scores when needed
 
 	self.spectatortime = time;
-
+	
 	self.classname = "observer";
 	self.iscreature = FALSE;
 	self.health = -666;
@@ -617,7 +627,6 @@
 	self.prevorigin = self.origin;
 	self.items = 0;
 	self.weapons = 0;
-	self.model = "";
 	FixPlayermodel();
 	self.model = "";
 	self.modelindex = 0;
@@ -660,6 +669,11 @@
 	}
 	else
 		self.frags = FRAGS_SPECTATOR;
+		
+	
+	// DRESK - 5/28/07
+	CheckClientSpidfliskObserverEvents(self);
+	
 }
 
 float RestrictSkin(float s)
@@ -718,6 +732,8 @@
 	} else {
 		if (self.playermodel != self.model)
 		{
+			// TODO Lookup/set gender field here.
+			//bprint("This is one place for gender code lookup.\n");
 			self.playermodel = CheckPlayerModel(self.playermodel);
 			m1 = self.mins;
 			m2 = self.maxs;
@@ -729,7 +745,7 @@
 		oldskin = self.skinindex;
 		self.skinindex = RestrictSkin(stof(self.playerskin));
 	}
-
+	
 	if(chmdl || oldskin != self.skinindex)
 		self.species = player_getspecies(); // model or skin has changed
 
@@ -786,7 +802,7 @@
 	if(g_arena)
 	if(!self.spawned)
 		self.classname = "observer";
-
+		
 	if(gameover)
 		self.classname = "observer";
 
@@ -848,10 +864,10 @@
 			self.armorvalue = start_armorvalue;
 			self.weapons = start_weapons;
 		}
-
+		
 		if(g_weaponarena_random)
 			self.weapons = randombits(self.weapons, g_weaponarena_random, FALSE);
-
+		
 		self.items = start_items;
 		self.switchweapon = w_getbestweapon(self);
 		self.cnt = self.switchweapon;
@@ -969,6 +985,10 @@
 		//stuffcmd(self, "chase_active 0");
 	 	//stuffcmd(self, "set viewsize $tmpviewsize \n");
 
+		// DRESK - 4/24/07
+		// CheckClientSpidfliskSpawnEvents
+		CheckClientSpidfliskSpawnEvents(self, spot);
+
 		if (cvar("g_spawnsound"))
 			sound (self, CHAN_TRIGGER, "misc/spawn.wav", VOL_BASE, ATTN_NORM);
 
@@ -1074,7 +1094,9 @@
 		JoinBestTeam( self, FALSE, FALSE );
 	}
 	else
+	{
 		SV_ChangeTeam(self.killindicator_teamchange - 1);
+	}
 }
 
 void ClientKill_Now()
@@ -1135,7 +1157,7 @@
 	float killtime;
 	entity e;
 	killtime = cvar("g_balance_kill_delay");
-
+	
 	if(g_race_qualifying)
 		killtime = 0;
 
@@ -1245,24 +1267,8 @@
 	stuffcmd(e, "\nin_bindmap 0 0\n");
 	if(g_race || g_cts)
 		stuffcmd(e, "cl_cmd settemp cl_movecliptokeyboard 2\n");
-	/*
-	 * we no longer need to stuff this. Remove this comment block if you feel
-	 * 2.3 and higher (or was it 2.2.3?) don't need these any more
-	stuffcmd(e, strcat("cl_gravity ", ftos(cvar("sv_gravity")), "\n"));
-	stuffcmd(e, strcat("cl_movement_accelerate ", ftos(cvar("sv_accelerate")), "\n"));
-	stuffcmd(e, strcat("cl_movement_friction ", ftos(cvar("sv_friction")), "\n"));
-	stuffcmd(e, strcat("cl_movement_maxspeed ", ftos(cvar("sv_maxspeed")), "\n"));
-	stuffcmd(e, strcat("cl_movement_airaccelerate ", ftos(cvar("sv_airaccelerate")), "\n"));
-	stuffcmd(e, strcat("cl_movement_maxairspeed ", ftos(cvar("sv_maxairspeed")), "\n"));
-	stuffcmd(e, strcat("cl_movement_stopspeed ", ftos(cvar("sv_stopspeed")), "\n"));
-	stuffcmd(e, strcat("cl_movement_jumpvelocity ", ftos(cvar("sv_jumpvelocity")), "\n"));
-	stuffcmd(e, strcat("cl_movement_stepheight ", ftos(cvar("sv_stepheight")), "\n"));
-	stuffcmd(e, strcat("set cl_movement_friction_on_land ", ftos(cvar("sv_friction_on_land")), "\n"));
-	stuffcmd(e, strcat("set cl_movement_airaccel_qw ", ftos(cvar("sv_airaccel_qw")), "\n"));
-	stuffcmd(e, strcat("set cl_movement_airaccel_sideways_friction ", ftos(cvar("sv_airaccel_sideways_friction")), "\n"));
-	stuffcmd(e, "cl_movement_edgefriction 1\n");
-	 */
-}
+	
+}	
 
 /*
 =============
@@ -1293,7 +1299,7 @@
 
 	self.classname = "player_joining";
 
-	self.flags = FL_CLIENT;
+	self.flags = self.flags - FL_CLIENT;
 	self.version_nagtime = time + 10 + random() * 10;
 
 	if(player_count<0)
@@ -1335,7 +1341,7 @@
 			campaign_bots_may_start = 1;
 		}
 	}
-
+	
 	self.playerid = (playerid_last = playerid_last + 1);
 	if(cvar("sv_eventlog"))
 	{
@@ -1351,6 +1357,9 @@
 
 	//stuffcmd(self, "set tmpviewsize $viewsize \n");
 
+	// DRESK - 5/28/07
+	// Shift Connect Prints Further Down
+	/*
 	bprint ("^4",self.netname);
 	bprint ("^4 connected");
 
@@ -1361,7 +1370,8 @@
 	}
 
 	bprint("\n");
-
+	*/
+	
 	self.welcomemessage_time = 0;
 
 	stuffcmd(self, strcat(clientstuff, "\n"));
@@ -1371,6 +1381,7 @@
 	FixClientCvars(self);
 
 	// spawnfunc_waypoint sprites
+	Dresk_WaypointSprite_InitClient(self);
 	WaypointSprite_InitClient(self);
 
 	// Wazat's grappling hook
@@ -1384,7 +1395,19 @@
 
 	// get other cvars from player
 	GetCvars(0);
+	
+	// DRESK - 4/24/2007
+	// CheckClientSpidfliskConnectEvents
+	CheckClientSpidfliskConnectEvents(self);
+	
+	if(cvar("g_domination") || cvar("g_ctf"))
+	{
+		bprint(" and joined the ");
+		bprint(ColoredTeamName(self.team));
+	}
 
+	bprint("\n");
+
 	// set cvar for team scoreboard
 	stuffcmd(self, strcat("set teamplay ", ftos(teamplay), "\n"));
 
@@ -1470,23 +1493,28 @@
 		print("Warning: ClientDisconnect without ClientConnect\n");
 		return;
 	}
-
+	
 	if(self.hitplotfh >= 0)
 	{
 		fclose(self.hitplotfh);
 		self.hitplotfh = -1;
 	}
-
+	
 	bot_clientdisconnect();
 
 	if(self.entcs)
 		detach_entcs();
-
+	
 	if(cvar("sv_eventlog"))
 		GameLogEcho(strcat(":part:", ftos(self.playerid)));
+		
+	// DRESK - 4/24/07
+	CheckClientSpidfliskDisconnectEvents(self);
+	/*
 	bprint ("^4",self.netname);
 	bprint ("^4 disconnected\n");
-
+	*/
+	
 	SoundEntity_Detach(self);
 
 	DropAllRunes(self);
@@ -1559,10 +1587,14 @@
 #ifdef TETRIS
 		|| self.owner.tetris_on
 #endif
-	)
+		)
 		self.model = self.mdl;
 	else
 		self.model = "";
+		
+	// DRESK - 4/29/07
+	// Check ChatBubbleThinkEvents
+	CheckChatBubbleThinkEvents();
 };
 
 void UpdateChatBubble()
@@ -1584,6 +1616,9 @@
 		self.chatbubbleentity.mdl = self.chatbubbleentity.model;
 		self.chatbubbleentity.model = "";
 		self.chatbubbleentity.effects = EF_LOWPRECISION;
+		// DRESK - 4/15/2007
+		// Modify Chat Bubble Colormod
+		self.chatbubbleentity.colormod = '0.5 0.5 0.5';
 	}
 }
 
@@ -1595,6 +1630,7 @@
 	{
 		if(self.owner) // but why can that ever be world?
 			self.owner.teambubbleentity = world;
+
 		remove(self);
 		return;
 	}
@@ -1613,25 +1649,25 @@
 
 void UpdateTeamBubble()
 {
-	if (!self.modelindex || !teams_matter)
-		return;
-	// spawn a teambubble entity if needed
-	if (!self.teambubbleentity && teams_matter)
-	{
-		self.teambubbleentity = spawn();
-		self.teambubbleentity.owner = self;
-		self.teambubbleentity.exteriormodeltoclient = self;
-		self.teambubbleentity.think = TeamBubbleThink;
-		self.teambubbleentity.nextthink = time;
-		setmodel(self.teambubbleentity, "models/misc/teambubble.spr"); // precision set below
-//		setorigin(self.teambubbleentity, self.origin + '0 0 15' + self.maxs_z * '0 0 1');
-		setorigin(self.teambubbleentity, '0 0 15' + self.maxs_z * '0 0 1');
-		setattachment(self.teambubbleentity, self, "");  // sticks to moving player better, also conserves bandwidth
-		self.teambubbleentity.mdl = self.teambubbleentity.model;
-		self.teambubbleentity.model = self.teambubbleentity.mdl;
-		self.teambubbleentity.customizeentityforclient = TeamBubble_customizeentityforclient;
-		self.teambubbleentity.effects = EF_LOWPRECISION;
-	}
+    if (!self.modelindex || !teams_matter)
+        return;
+    // spawn a teambubble entity if needed
+    if (!self.teambubbleentity && teams_matter)
+    {
+        self.teambubbleentity = spawn();
+        self.teambubbleentity.owner = self;
+        self.teambubbleentity.exteriormodeltoclient = self;
+        self.teambubbleentity.think = TeamBubbleThink;
+        self.teambubbleentity.nextthink = time;
+        setmodel(self.teambubbleentity, "models/misc/teambubble.spr"); // precision set below
+//      setorigin(self.teambubbleentity, self.origin + '0 0 15' + self.maxs_z * '0 0 1');
+        setorigin(self.teambubbleentity, '0 0 15' + self.maxs_z * '0 0 1');
+        setattachment(self.teambubbleentity, self, "");  // sticks to moving player better, also conserves bandwidth
+        self.teambubbleentity.mdl = self.teambubbleentity.model;
+        self.teambubbleentity.model = self.teambubbleentity.mdl;
+        self.teambubbleentity.customizeentityforclient = TeamBubble_customizeentityforclient;
+        self.teambubbleentity.effects = EF_LOWPRECISION;
+    }
 }
 
 // LordHavoc: this hack will be removed when proper _pants/_shirt layers are
@@ -1723,7 +1759,7 @@
 
 	if(!self.modelindex || self.deadflag) // don't apply the flags if the player is gibbed
 		return;
-	
+
 	Fire_ApplyDamage(self);
 	Fire_ApplyEffect(self);
 
@@ -1788,7 +1824,10 @@
 		if (time < self.strength_finished)
 		{
 			self.items = self.items | IT_STRENGTH;
-			sprint(self, "^3Strength infuses your weapons with devastating power\n");
+			// DRESK - 2/28/06
+			// Modified Report Message
+			DisplayAdvancedPowerupAcquisitionMessage(self, IT_STRENGTH);
+			// sprint(self, "^3Strength infuses your weapons with devastating power\n");
 		}
 	}
 	if (self.items & IT_INVINCIBLE)
@@ -1806,7 +1845,10 @@
 		if (time < self.invincible_finished)
 		{
 			self.items = self.items | IT_INVINCIBLE;
-			sprint(self, "^3Shield surrounds you\n");
+			// DRESK - 2/28/06
+			// Modified Report Message
+			DisplayAdvancedPowerupAcquisitionMessage(self, IT_INVINCIBLE);
+			// sprint(self, "^3Shield surrounds you\n");
 		}
 	}
 
@@ -1967,7 +2009,7 @@
 		self.pressedkeys &~= KEY_FORWARD;
 		self.pressedkeys &~= KEY_BACKWARD;
 	}
-
+	
 	if (self.movement_y > 0)
 	{	// right key pressed
 		self.pressedkeys |= KEY_RIGHT;
@@ -1983,7 +2025,7 @@
 		self.pressedkeys &~= KEY_RIGHT;
 		self.pressedkeys &~= KEY_LEFT;
 	}
-
+	
 	if (self.BUTTON_JUMP) // get if jump and crouch keys are pressed
 		self.pressedkeys |= KEY_JUMP;
 	else
@@ -2038,7 +2080,7 @@
 
 	if (self == self.enemy)
 		return 0;
-
+	
 	if(self.enemy.classname != "player")
 		return 0;
 
@@ -2048,6 +2090,11 @@
 }
 
 float SpectateNext() {
+	// DRESK - 1/20/07
+	// Backup Current Spectatee
+	local entity enPreviousEnemy;
+	enPreviousEnemy = self.enemy;
+
 	other = find(self.enemy, classname, "player");
 	if (!other) {
 		other = find(other, classname, "player");
@@ -2056,6 +2103,11 @@
 		self.enemy = other;
 	}
 	if(self.enemy.classname == "player") {
+		// DRESK - 1/20/07
+		// Support Report Now Spectating to Target
+		if(self.enemy != enPreviousEnemy)
+			HelpText_ReportSpectateToTarget(self, self.enemy, TRUE);
+	
 		msg_entity = self;
 		WriteByte(MSG_ONE, SVC_SETVIEW);
 		WriteEntity(MSG_ONE, self.enemy);
@@ -2105,8 +2157,22 @@
 			if(cvar("g_campaign"))
 				campaign_bots_may_start = 1;
 			PutClientInServer();
+			// DRESK - 1/20/07
+			// What the hell is this logic for displaying if an observer is playing?
+			/*
 			if(self.classname == "player")
 				bprint ("^4", self.netname, "^4 is playing now\n");
+			*/	
+			bprint (strcat("^7", self.netname, "^7 is ^5PLAYING^7 now\n"));
+			sound(world, CHAN_AUTO, "misc/menu2.wav", 1, ATTN_NONE);
+			// Update Client Stats Score - Begin Play Time
+			UpdateClientStatsScore(self, CLIENTSCORE_BEGINPLAYTIME, time);
+			if (!teams_matter) {
+				self.team = 0;
+			}
+			
+			// Restore Backup Frags
+			self.frags = self.nClientScore_BackupFrags;
 			if(!cvar("g_campaign"))
 				centerprint(self,""); // clear MOTD
 			return;
@@ -2215,7 +2281,9 @@
 			}
 		}
 	} else {
-		if (!(self.BUTTON_ATCK || self.BUTTON_JUMP)) {
+		// DRESK - 5/28/07
+		// Check for Crouch Button Additionally
+		if (!(self.BUTTON_ATCK || self.BUTTON_JUMP || self.BUTTON_CROUCH)) {
 			self.flags |= FL_JUMPRELEASED;
 			if(self.flags & FL_SPAWNING)
 			{
@@ -2225,7 +2293,18 @@
 			}
 		}
 	}
+
 	PrintWelcomeMessage(self);
+		
+	/*
+	bprint (other.classname, "\n");
+	if (other.classname != "player") {
+		self.alpha = 0.001;
+		self.effects = self.effects | FUNFORM_HEALTHANGEL_EFFECTS;
+		self.glow_trail = 1;
+		self.glow_color = 500;
+	}
+	*/
 }
 
 void SpectatorThink()
@@ -2264,6 +2343,7 @@
 			}
 		}
 	}
+
 	PrintWelcomeMessage(self);
 	self.flags |= FL_CLIENT | FL_NOTARGET;
 }
@@ -2289,7 +2369,7 @@
 	if(blockSpectators && frametime)
 		// WORKAROUND: only use dropclient in server frames (frametime set). Never use it in cl_movement frames (frametime zero).
 		checkSpectatorBlock();
-
+	
 	zoomstate_set = 0;
 
 	if(self.netname_previous != self.netname)
@@ -2343,6 +2423,9 @@
 	if (TetrisPreFrame())
 		return;
 #endif
+	
+	// DRESK - 5/28/07
+	CheckSpidfliskPlayerPreThinkEvents(self);
 
 	if(self.classname == "player") {
 //		if(self.netname == "Wazat")
@@ -2470,6 +2553,10 @@
 		{
 			if (!self.crouch)
 			{
+				// DRESK - 4/24/2007
+				// Help Text - Check Crouch ROF Display
+				HelpText_CheckCrouchROFDisplay(self);
+			
 				self.crouch = TRUE;
 				self.view_ofs = PL_CROUCH_VIEW_OFS;
 				setsize (self, PL_CROUCH_MIN, PL_CROUCH_MAX);
@@ -2478,6 +2565,7 @@
 		}
 		else
 		{
+		
 			if (self.crouch)
 			{
 				tracebox(self.origin, PL_MIN, PL_MAX, self.origin, FALSE, self);
@@ -2531,6 +2619,7 @@
 		self.dmg_team = max(0, self.dmg_team - cvar("g_teamdamage_resetspeed") * frametime);
 
 		//self.angles_y=self.v_angle_y + 90;   // temp
+
 	} else if(gameover) {
 		if (intermission_running)
 			IntermissionThink ();	// otherwise a button could be missed between
@@ -2801,7 +2890,6 @@
 		}
 		self.idlekick_lasttimeleft = timeleft;
 	}
-
 #ifdef TETRIS
 	if(self.impulse == 100)
 		ImpulseCommands();
@@ -2858,17 +2946,17 @@
 	if(self.classname == "player") {
 		CheckRules_Player();
 		UpdateChatBubble();
-		UpdateTeamBubble();
+		// Lixivial. 09.27.2009. Use spidflisk teambubble to allow spectator/observer bubbles.
+		// UpdateTeamBubble();
+		SpidfliskUpdateTeamBubble();
 		if (self.impulse)
 			ImpulseCommands();
 		if (intermission_running)
 			return;		// intermission or finale
-
 		GetPressedKeys();
 	} else if (self.classname == "observer") {
-		//do nothing
+		//UpdateTeamBubble();
 	} else if (self.classname == "spectator") {
-		//do nothing
 	}
 
 	/*
@@ -2890,7 +2978,8 @@
 	Arena_Warmup();
 
 	//pointparticles(particleeffectnum("machinegun_impact"), self.origin + self.view_ofs + '0 0 7', '0 0 0', 1);
-
 	if(self.waypointsprite_attachedforcarrier)
 		WaypointSprite_UpdateHealth(self.waypointsprite_attachedforcarrier, '1 0 0' * healtharmor_maxdamage(self.health, self.armorvalue, cvar("g_balance_armor_blockpercent")));
+
 }
+
Index: server/Dresk_Intermission.qc
===================================================================
--- server/Dresk_Intermission.qc	(revision 0)
+++ server/Dresk_Intermission.qc	(revision 0)
@@ -0,0 +1,338 @@
+// DRESK - Intermission
+// Provides definitions and default values for Intermission features.
+
+// Support Intermission View Bubbles
+// .entity enIntermissionViewBubbleHUD_1;
+// .entity enIntermissionViewBubbleHUD_2;
+.entity enIntermissionViewBubbleHUD_3;
+
+// Support Intermission Winner
+.entity enIntermissionWinner;
+
+.float bIntermissionViewModel_NoDraw;
+
+void IntermissionViewBubbleThink()
+{ // Intermission View Bubble Think
+	// Remove EF_NODRAW
+	self.effects &~= EF_NODRAW;
+	// Increase Alpha
+	self.alpha = self.alpha + 0.1;
+	
+	if(self.alpha >= 1)
+	{ // Finished Fading In; Disable Think
+		// Disable Weapon Draw of Owner
+		if(self.owner.weaponentity)
+			// Valid Weapon Entity
+			self.owner.weaponentity.bIntermissionViewModel_NoDraw = TRUE;
+		// Fully Render Bubble
+		self.alpha = 1;
+		// Disable Think Operations
+		self.think = SUB_Null;
+		self.nextthink = 0;
+	}
+	else
+		// Assign Next Think Time
+		self.nextthink = time + 0.1;
+}
+void IntermissionWinningPlayerThink()
+{ // Intermission Winning Player Think
+	// Decrease Alpha
+	self.alpha = self.alpha - 0.1;
+	// Shift Origin
+	self.origin_x = self.origin_x + 4;
+	// self.origin_y = self.origin_y - 11;
+	self.origin_z = self.origin_z - 2;
+	
+	if(self.alpha < 0.4)
+	{ // Fade Finished
+		// Disable Think Operations
+		self.think = SUB_Null;
+		self.nextthink = 0;
+		// Update
+		self.frame = $duckidle;
+	}
+	else
+		// Assign Next Think Time
+		self.nextthink = time + 0.1;
+}
+entity SpawnIntermissionViewBubble(entity enClient, vector vOrigin)
+{ // Spawn Intermission View Bubble
+	local entity enBubble;
+	// Spawn Entity
+	enBubble = spawn();
+	// Assign Alpha
+	enBubble.alpha = 0;
+	// Assign Model
+	precache_model("models/domination/dom_unclaimed.md3");
+	setmodel(enBubble, "models/domination/dom_unclaimed.md3");
+	// Assign Solidity
+	enBubble.solid = SOLID_NOT;
+	// Assign Owner
+	enBubble.owner = enClient;
+	// Assign Origin
+	enBubble.origin = vOrigin;	
+	// Assign View Model
+	enBubble.viewmodelforclient = enClient;
+	// Assign Effects
+	enBubble.effects = EF_FULLBRIGHT | EF_NODRAW;
+	
+	// Lixivial. 09.26.09. 
+	// Flip the dom_unclaimed model due to changes.
+	enBubble.angles_x = 90;	
+	
+	// Assign Scale
+	enBubble.scale = 16;
+	// Assign Colormod
+	enBubble.colormod = '0.01 0.01 0.01';
+	
+	// Assign Initial Next Think
+	enBubble.nextthink = time + 3.0;
+	// Assign Think
+	enBubble.think = IntermissionViewBubbleThink;
+
+	// Return Entity
+	return enBubble;
+}
+void SpawnIntermissionViewBubbles(entity enClient)
+{ // Spawn Intermission View Bubbles
+	// Spawn Entities
+	//enClient.enIntermissionViewBubbleHUD_1 = SpawnIntermissionViewBubble(enClient, '40 0 0');
+	//enClient.enIntermissionViewBubbleHUD_2 = SpawnIntermissionViewBubble(enClient, '80 0 0');
+	enClient.enIntermissionViewBubbleHUD_3 = SpawnIntermissionViewBubble(enClient, '0 0 0');
+}
+void SpawnIntermissionWinningPlayer(entity enClient)
+{ // Check Intermission Winning Player
+	// Determine Winning Player
+	local entity enPlayerFind;
+	local entity enWinner;
+	local float nFrags;
+		nFrags = -999;
+	enPlayerFind = find(world, classname, "player");
+	while(enPlayerFind)
+	{ // Search Players
+		if(stof(GetPlayerScoreString(enPlayerFind, 2)) > nFrags)
+		{ // New Winner
+			enWinner = enPlayerFind;
+			// Update Frags
+			nFrags = stof(GetPlayerScoreString(enPlayerFind, 2));
+		}
+		// Acquire Next Player
+		enPlayerFind = find(enPlayerFind, classname, "player");
+	}
+	
+	local entity enViewmodel;
+	// Spawn Entity
+	enViewmodel = spawn();
+	// Assign Entity to Client
+	enClient.enIntermissionWinner = enViewmodel;
+	// Assign Model Aesthetics
+	enViewmodel.model = enWinner.model;
+	enViewmodel.modelindex = enWinner.modelindex;
+	enViewmodel.skin = enWinner.skin;
+	// Assign Alpha
+	enViewmodel.alpha = 1.0;
+	// Assign Frame
+	enViewmodel.frame = $taunt;
+	// Assign Solidity
+	enViewmodel.solid = SOLID_NOT;
+	// Assign Owner
+	enViewmodel.owner = enClient;
+	// Assign View Model
+	enViewmodel.viewmodelforclient = enClient;
+	// Assign Effects
+	enViewmodel.effects = EF_FULLBRIGHT;
+	// Assign Angles
+	enViewmodel.angles = '0 180 0';
+	// Assign Origin
+	enViewmodel.origin = '85 0 -20';
+	// Assign Colormod
+	enViewmodel.colormod = enWinner.colormod;
+	// Assign Colormap
+	enViewmodel.colormap = enWinner.colormap;
+	// Force Weapon Viewmodel Display Off
+	if(enClient.weaponentity)
+		enClient.weaponentity.bIntermissionViewModel_NoDraw = TRUE;	
+
+	// Assign Initial Next Think
+	enViewmodel.nextthink = time + 3.0;
+	// Assign Think
+	enViewmodel.think = IntermissionWinningPlayerThink;
+
+	// Attach Skull to Hand
+	local entity enSkull;
+	// Spawn Entity
+	enSkull = spawn();
+	// Assign Model
+	enSkull.owner = enViewmodel;
+	// Assign Model
+	precache_model("models/gibs/bloodyskull.md3");
+	setmodel(enSkull, "models/gibs/bloodyskull.md3");
+	// Assign Effects
+	enSkull.effects = EF_FULLBRIGHT;
+	// Attach Model
+	setattachment(enSkull, enSkull.owner, "bip01 r hand");
+	
+}
+void CheckIntermissionViewmodelEntities()
+{ // Check Intermission Viewmodel Entities
+	// Check for Supported Intermission Entities
+	local float bFadeToBlack;
+		bFadeToBlack = cvar(CVAR_INTERMISSION_FADETOBLACK);
+	local float bDisplayWinner;
+		bDisplayWinner = cvar(CVAR_INTERMISSION_DISPLAYWINNINGPLAYER);
+	if(bFadeToBlack
+		|| bDisplayWinner)
+	{ // Intermission Entity Supported
+		local entity enClient;
+		
+		// Acquire Initial Client
+		// NOTE: Use findchainflags to apply to spectators as well
+		enClient = world;
+		enClient = findchainflags(flags, FL_CLIENT);
+		
+		while(enClient)
+		{ // Print Client
+			if( clienttype(enClient) == CLIENTTYPE_REAL)
+			{ // Valid Client; Spawn Intermission View Bubbles
+				if(bFadeToBlack)
+					SpawnIntermissionViewBubbles(enClient);
+				if(bDisplayWinner)
+					SpawnIntermissionWinningPlayer(enClient);
+			}
+			
+			// Acquire Next Client
+			enClient = enClient.chain;
+		}
+	}
+}
+void CheckIntermissionPlayerGlow()
+{ // Check Intermission Player Glow
+	local float bIntermissionPlayersGlow;
+	bIntermissionPlayersGlow = cvar(CVAR_INTERMISSION_PLAYERSGLOW);
+	if( bIntermissionPlayersGlow > 0)
+	{ // Players Glow Enabled
+		local entity enPlayerFind;
+		local vector vColor;
+		// Utilize Random Glow Colors
+			vColor_x = random();
+			vColor_y = random();
+			vColor_z = random();
+		
+		// Acquire First Player
+		// NOTE: Use classname to suppress glowing of spectators
+		enPlayerFind = find(world, classname, "player");
+		
+		while(enPlayerFind != world)
+		{ // Valid Player
+			// Apply Glow
+			enPlayerFind.pflags = PFLAGS_NOSHADOW | PFLAGS_FULLDYNAMIC;
+			
+			// Lixivial. 09.26.09. Utilise the toggle to make it a multiplier.
+			// if it's larger than don't use as a multiplier.
+			if ( bIntermissionPlayersGlow < 1 )
+				enPlayerFind.light_lev = (10000 * bIntermissionPlayersGlow);
+			else 
+				enPlayerFind.light_lev = 1;
+
+			// enPlayerFind.light_lev = 5000;
+			enPlayerFind.color = vColor;
+			// enPlayerFind.color = '0.75 0.1 0.1';
+			enPlayerFind.style = 6;
+		
+			// Acquire Next Player
+			enPlayerFind = find(enPlayerFind, classname, "player");
+		}
+	}
+}
+void DisplayIntermissionVictoryMessage(entity enWinner)
+{ // Display Intermission Victory Message
+	local string strWinMessage;
+	local string strFrags;
+		strFrags = GetPlayerScoreString(enWinner, 2);
+		strFrags = strzone(strFrags);
+	local string strKills;
+		strKills = ftos(enWinner.nClientScore_NumKills);
+		strKills = strzone(strKills);
+	local string strDeaths;
+		strDeaths = ftos(enWinner.nClientScore_NumDeaths);
+		strDeaths = strzone(strDeaths);
+	// Acquire Random Victory Word
+	local string strVictoryWord;
+	local float nRandom;
+		nRandom = random() * 9;
+		
+	if(nRandom <= 1)
+		strVictoryWord = "conquers";
+	else
+	if(nRandom <= 2)
+		strVictoryWord = "reigns supreme";
+	else
+	if(nRandom <= 3)
+		strVictoryWord = "destroys all";
+	else
+	if(nRandom <= 4)
+		strVictoryWord = "stands upon all corpses";
+	else
+	if(nRandom <= 5)
+		strVictoryWord = "flushes the competition";
+	else
+	if(nRandom <= 6)
+		strVictoryWord = "devours all souls";
+	else
+	if(nRandom <= 7)
+		strVictoryWord = "massacres all enemies";
+	else
+	if(nRandom <= 8)
+		strVictoryWord = "defaces all foes";
+	else
+		strVictoryWord = "succeeds in Mortal Kombat";
+		
+	// Generate Win Message
+	strWinMessage = strcat(enWinner.netname, "^7 ", strVictoryWord, " with ^2", strFrags, "^1 FRAGS^7");
+	strWinMessage = strcat(strWinMessage, " (^2", strKills, " ^1KILLS^7");
+	strWinMessage = strcat(strWinMessage, ", ^2", strDeaths, " ^1DEATHS^7");
+	strWinMessage = strcat(strWinMessage, ")\n");
+	/*
+	strWinMessage = strcat(enWinner.netname, "^7 ", strVictoryWord, " with ^2", strKills, " ^1KILLS^7");
+	strWinMessage = strcat(strWinMessage, " and ^2", strDeaths, " ^1DEATHS^7");
+	strWinMessage = strcat(strWinMessage, ",  a total of ^2", strFrags, "^1 FRAGS\n");
+	*/
+	// Broadcast Message
+	bprint(strWinMessage);
+	
+	// Unzone Strings
+	strunzone(strFrags);
+	strunzone(strDeaths);
+	strunzone(strKills);
+}
+void PerformPostIntermissionProcesses()
+{ // Perform Post Intermission Processes
+	// Play Sound
+	local string strSound;
+	if(bUsingSpidfliskSoundPack)
+	{ // Utilize Spidflisk Sound
+		local float nRandom;
+			nRandom = random() * 2;
+			
+		if(nRandom <= 1)
+			strSound = "Spidflisk/misc/GameEnd1.ogg";
+		else
+			strSound = "Spidflisk/misc/GameEnd2.ogg";
+	}
+	else
+		strSound = "misc/invshot.wav";	
+	sound(world, CHAN_AUTO, strSound, 1, ATTN_NONE);
+	
+	// Check Intermission Viewmodel Entities
+	CheckIntermissionViewmodelEntities();
+		
+	// Support Intermision Player Glows
+	CheckIntermissionPlayerGlow();
+	
+	// Utilize Client Stats Scores
+	if( cvar(CVAR_INTERMISSION_USEADVANCEDCLIENTSCORES) )
+	{ // Advanced Client Scores Enabled
+		WriteByte (MSG_ALL, SVC_FINALE);
+		PrintClientScoring(world, TRUE);
+	}
+}
\ No newline at end of file
Index: server/Dresk_MiscFunctions.qc
===================================================================
--- server/Dresk_MiscFunctions.qc	(revision 0)
+++ server/Dresk_MiscFunctions.qc	(revision 0)
@@ -0,0 +1,432 @@
+// DRESK - MiscFunctions
+// Provides new miscenallenous functions.
+
+// Fields
+
+// Functions
+float GetShouldBPrintBeSuppressed(float nPlayerCnt, float nBotCnt)
+{ // Return if BPrint Should be Suppressed
+	if( cvar(CVAR_MISC_SUPPRESSBPRINTSWHENNOPLAYERSORONLYBOTS) && (nPlayerCnt == 0 || nPlayerCnt == nBotCnt) )
+		return TRUE;
+	else
+		return FALSE;
+}
+void CheckChatBubbleThinkEvents()
+{ // Check Chat Bubble Think Events
+	// NOTE: Assumed scope is Chat Bubble.
+	// Apply Owner Alpha
+	self.alpha = self.owner.alpha;
+}
+// Successive Centerprint Support Functions
+void SuccessiveCenterprint(entity enReceiver, string strMessage)
+{ // Successive Centerprint
+	local string strFinalCenterprint;
+
+	// Check if Successive Print is Necessary
+	if(time < enReceiver.scp_tEndTime)
+	{ // Successive Print Necessary; Append Message to Current Centerprint
+		strFinalCenterprint = strcat(enReceiver.scp_strCenterprint, "\n");
+		strFinalCenterprint = strcat(strFinalCenterprint, strMessage);
+	}
+	else
+		strFinalCenterprint = strMessage;
+		
+	if(enReceiver.scp_bNeedsFree)
+		// Unzone String
+		strunzone(enReceiver.scp_strCenterprint);
+	// Update Entity Centerprint
+	enReceiver.scp_strCenterprint = strFinalCenterprint;
+		// Zone String
+		enReceiver.scp_strCenterprint = strzone(enReceiver.scp_strCenterprint);
+		// Flag Needs Free
+		enReceiver.scp_bNeedsFree = 1;
+	
+	// Update End Time
+	enReceiver.scp_tEndTime = (time + enReceiver.scp_tPrintTime);
+
+	// Send Centerprint
+	centerprint(enReceiver, strFinalCenterprint);
+}
+string GetFormattedTimeStringZoned(float tTime)
+{ // Return Formatted Time
+	// Acquire Int Version of Time
+	local float nTime;
+		nTime = rint(tTime);
+		
+	local string strTime;
+	// Calculate Minutes
+	local float nMinutes;
+		nMinutes = floor(nTime / 60);
+		
+	// Append Minutes to String
+	/*
+	if(nMinutes < 10)
+		// Append Additional 0
+		strTime = strcat("0", ftos(nMinutes) );
+	else
+	*/
+		strTime = ftos(nMinutes);
+	// Append :
+	strTime = strcat(strTime, ":");
+	
+	// Calculate Seconds
+	local float nSeconds;
+		nSeconds = mod(nTime, 60);
+	// Append Seconds to String
+	if(nSeconds < 10)
+		// Append Additional 0
+		strTime = strcat(strTime, "0", ftos(nSeconds) );
+	else
+		strTime = strcat(strTime, ftos(nSeconds) );
+	
+	// Zone String
+	strTime = strzone(strTime);
+	
+	// Return String
+	return strTime;
+}
+void PlayBroadcastMessageSound()
+{ // Play Broadcast Message Sound
+	if(bUsingSpidfliskSoundPack)
+		sound(world, CHAN_AUTO, "Spidflisk/misc/BroadcastChime.ogg", 1, ATTN_NONE);
+	else
+		sound(world, CHAN_AUTO, "weapons/tink1.ogg", 1, ATTN_NONE);
+}
+
+void CheckGameSettingsBroadcast()
+{ // Check Game Settings Broadcast
+	// Acquire Display Game Settings Time
+	local float nDisplayGameSettingsTime;
+		nDisplayGameSettingsTime = cvar(CVAR_MISC_DISPLAYGAMESETTINGSTIME);
+		
+	if(nDisplayGameSettingsTime > 0)
+	{ // Valid Display Time
+		if( mod(time, nDisplayGameSettingsTime) == 0)
+		{ // Display Necessary
+			// Generate Display Message
+			local string strDisplay;
+				strDisplay = strcat("Current Game '^1", gamemode_name, "^7', Fraglimit '^1", cvar_string("fraglimit"), "^7', Timelimit '^1", cvar_string("timelimit"), "^7'\n");
+				
+			// Broadcast
+			bprint(strDisplay);
+			
+			// Play Game Settings Sound
+			if(bUsingSpidfliskSoundPack)
+				sound(world, CHAN_AUTO, "Spidflisk/misc/ClockRing.ogg", 1, ATTN_NONE);
+			else
+				// Play Broadcast Sound
+				PlayBroadcastMessageSound();
+		}
+	}
+}
+string GetRandomGenericAmbientSound(float nPercentChance)
+{ // Return Random Generic Ambient Sound
+	local string strAmbientSound;
+		strAmbientSound = "";
+	local float nRandom;
+	
+	if( (random() * 100) <= nPercentChance)
+	{ // Chance Succeeded
+		nRandom = random() * 9;
+		
+		if(nRandom < 1)
+			strAmbientSound = "ambient/machine1.ogg";
+		else
+		if(nRandom < 2)
+			strAmbientSound = "ambient/machine2.ogg";
+		else
+		if(nRandom < 3)
+			strAmbientSound = "ambient/machine3.ogg";
+		else
+		if(nRandom < 4)
+			strAmbientSound = "ambient/machine4.ogg";
+		else
+		if(nRandom < 5)
+			strAmbientSound = "ambient/machinerydrone01.ogg";
+		else
+		if(nRandom < 6)
+			strAmbientSound = "ambient/air.ogg";
+		else
+		if(nRandom < 7)
+			strAmbientSound = "ambient/transformer.ogg";
+		else
+		if(nRandom < 8)
+			strAmbientSound = "ambient/fan4.ogg";
+		else
+			strAmbientSound = "ambient/demonwind01.ogg";
+	}
+		
+	return strAmbientSound;
+}
+void SpawnAdditionalAmbientSound(entity enEntity)
+{ // Spawn Additional Ambient Sound
+	// NOTE: Assumed scope is origin entity.
+	local float fVolume;
+		fVolume = 1.00;
+	local string strAmbientSound;
+		strAmbientSound = "";
+	
+	if(enEntity.classname == "item_health100")
+		strAmbientSound = "ambient/water.ogg";
+	else
+	if(enEntity.classname == "weapon_nex")
+	{
+		strAmbientSound = "ambient/sparks.ogg";
+		fVolume = 0.6;
+	}
+	else
+	if(enEntity.classname == "weapon_crylink")
+	{
+		strAmbientSound = "ambient/sparks1.ogg";
+		fVolume = 0.3;
+	}
+	else
+	if(enEntity.classname == "weapon_rocketlauncher")
+		strAmbientSound = "ambient/machine2.ogg";
+	else
+	if(enEntity.classname == "weapon_electro")
+		strAmbientSound = "ambient/air.ogg";
+	else
+	if(enEntity.classname == "weapon_hagar")
+		strAmbientSound = "ambient/machine3.ogg";
+	else
+	if(enEntity.classname == "weapon_grenadelauncher")
+		strAmbientSound = "ambient/machinerydrone01.ogg";
+	else
+	if(enEntity.classname == "weapon_uzi")
+		strAmbientSound = "ambient/fan4.ogg";
+	else
+	if(enEntity.classname == "item_armor25")
+		strAmbientSound = "ambient/machine4.ogg";
+	else
+	if(enEntity.classname == "item_strength")
+		strAmbientSound = "ambient/ambient_07.ogg";
+	else
+	if(enEntity.classname == "item_health25")
+		strAmbientSound = GetRandomGenericAmbientSound(100);
+	else
+	if(enEntity.classname == "item_armor1")
+		strAmbientSound = GetRandomGenericAmbientSound(45);
+	else
+	if(enEntity.classname == "item_health1")
+		strAmbientSound = GetRandomGenericAmbientSound(45);
+	else
+	if(enEntity.classname == "spawnpoint_model")
+		strAmbientSound = "ambient/machine1.ogg";
+		
+	// Spawn Ambient Sound
+	if(strAmbientSound != "")
+	{ // Valid Ambient Sound
+		// Increment Number of Spawned Ambient Sounds
+		nNumSpawnedAmbientSounds = nNumSpawnedAmbientSounds + 1;
+		// Spawn Sound
+		ambientsound(enEntity.origin + '0 0 15', strAmbientSound, fVolume, ATTN_NORM);
+	}
+}
+void CheckAdvancedDeathReports(entity enAttacker, entity enVictim)
+{ // Check Advanced Death Reports
+
+	// -----------------------------------------------------
+	// Report: Attacker
+	
+	local string strAttackerMessage;
+	local string strVictimHandicap;
+	local string strVictimPing;
+	
+	// Acquire Victim Handicap (as percentile)
+	strVictimHandicap = ftos( rint(enVictim.fHandicap) );
+	
+	// Zone String
+	strVictimHandicap = strzone(strVictimHandicap);
+		
+	// Acquire Victim Ping
+	strVictimPing = ftos( rint(enVictim.ping) );
+
+	// Zone String
+	strVictimPing = strzone(strVictimPing);
+		
+	// Generate Attacker Message
+	strAttackerMessage = strcat("^4You fragged ^7", enVictim.netname);
+	
+	// Show Victim Ping
+	if( cvar(CVAR_PLAYERDEATH_SHOWVICTIMPING) )
+	{ 
+		if( clienttype(enVictim) == CLIENTTYPE_BOT)
+			// Bot : Display Name
+			strAttackerMessage = strcat(strAttackerMessage, "\n^7(^2Bot");
+		else
+			// Player : Display Ping
+			strAttackerMessage = strcat(strAttackerMessage, "\n^7(Ping ^2", strVictimPing);
+		
+		if( cvar(CVAR_PLAYER_HANDICAP_SHOWATTACKERVICTIMHANDICAP) )
+			// Show Attacker Handicap
+			strAttackerMessage = strcat(strAttackerMessage, "^7 / Handicap ^2", strVictimHandicap, "%");
+			
+		strAttackerMessage = strcat(strAttackerMessage, "^7)");
+	}
+		
+	// Shift centerprint vertically
+	strAttackerMessage = strcat(strAttackerMessage, "\n\n");
+	
+	// Print Message to Attacker
+	SuccessiveCenterprint(enAttacker, strAttackerMessage);
+	
+	// Unzone Strings
+	strunzone(strVictimHandicap);
+	strunzone(strVictimPing);
+	
+	// -----------------------------------------------------
+	// Report : Victim
+	
+	local string strTargetMessage;
+	local string strAttackerHealth;
+	local float nAttackerHealth;
+	local string strAttackerArmor;
+	local string strAttackerPing;
+	local string strAttackerHandicap;
+	
+	// Acquire Attacker Health String
+	nAttackerHealth = rint(enAttacker.health);
+	if(nAttackerHealth < 0)
+		nAttackerHealth = 0;
+	strAttackerHealth = ftos(nAttackerHealth);
+		// Zone String
+		strAttackerHealth = strzone(strAttackerHealth);
+	// Acquire Attacker Handicap (as percentile)
+	strAttackerHandicap = ftos( rint(enAttacker.fHandicap) );
+		// Zone String
+		strAttackerHandicap = strzone(strAttackerHandicap);
+	// Acquire Attacker Armor String
+	strAttackerArmor = ftos( rint(enAttacker.armorvalue) );
+		// Zone String
+		strAttackerArmor = strzone(strAttackerArmor);
+	// Acquire Attacker Ping
+	strAttackerPing = ftos( rint(enAttacker.ping) );
+		// Zone String
+		strAttackerPing = strzone(strAttackerPing);
+	
+	strTargetMessage = strcat(strTargetMessage, "^1Fragged by ^7", enAttacker.netname, "\n");
+	
+	if( cvar(CVAR_PLAYERDEATH_SHOWATTACKERPING) )
+	{ // Show Attacker Ping
+		if( clienttype(enAttacker) == CLIENTTYPE_BOT)
+			// Bot : Display Name
+			strTargetMessage = strcat(strTargetMessage, " ^7(^2Bot");
+		else
+			// Player : Display Ping
+			strTargetMessage = strcat(strTargetMessage, " ^7(Ping ^2", strAttackerPing);
+	}
+	if( cvar(CVAR_PLAYER_HANDICAP_SHOWATTACKERVICTIMHANDICAP) )
+		// Show Attacker Handicap
+		strTargetMessage = strcat(strTargetMessage, "^7 / Handicap ^2", strAttackerHandicap);
+		
+	strTargetMessage = strcat(strTargetMessage, "%^7)");
+	
+	 // Show Attacker Health / Armor
+	if( cvar(CVAR_PLAYERDEATH_SHOWATTACKERHEALTHARMOR) )
+	{
+		strTargetMessage = strcat(strTargetMessage, "\n^7(Health ^2", strAttackerHealth);
+		strTargetMessage = strcat(strTargetMessage, "^7 / Armor ^2");
+		strTargetMessage = strcat(strTargetMessage, strAttackerArmor, "^7)");
+	}
+	
+	// Print Message to Victim
+	SuccessiveCenterprint(enVictim, strTargetMessage);
+	
+	// Unzone Strings
+	strunzone(strAttackerHealth);
+	strunzone(strAttackerArmor);
+	strunzone(strAttackerHandicap);
+	strunzone(strAttackerPing);
+}
+void CheckSpidfliskWorldSpawnEvents()
+{ // Check Spidflisk World Spawn Events
+	// Prepare Modification Custom CVars
+	PrepareCustomCVars();
+	
+	// Spawn Client Score Award Entities
+	SpawnClientScoreAwardEntities();
+	
+	// Precache Additional Sounds
+	precache_sound ("misc/menu2.wav");
+	precache_sound ("misc/invshot.wav");
+	precache_sound ("weapons/tink1.ogg");
+	precache_sound ("misc/outwater.wav");
+	precache_sound ("misc/medplat2.wav");
+	precache_sound ("misc/footstep01.wav");
+	precache_sound ("misc/footstep02.wav");
+	precache_sound ("weapons/neximpact.wav");
+	
+	// Precache Additional Models
+	precache_model("models/plasmatrail.mdl");
+	precache_model("models/misc/line-81-1.mdl");
+	precache_model("models/ball.md3");
+	
+	// Additional Ambient Sound Precaching
+	if( cvar(CVAR_MISC_SPAWNADDITIONALAMBIENTSOUNDS) )
+	{
+		precache_sound ("ambient/air.ogg");
+		precache_sound ("ambient/water.ogg");
+		precache_sound ("ambient/sparks.ogg");
+		precache_sound ("ambient/sparks1.ogg");
+		precache_sound ("ambient/machine1.ogg");
+		precache_sound ("ambient/machine2.ogg");
+		precache_sound ("ambient/machine3.ogg");
+		precache_sound ("ambient/machine4.ogg");
+		precache_sound ("ambient/ambient_07.ogg");
+		precache_sound ("ambient/machinerydrone01.ogg");
+		precache_sound ("ambient/fan4.ogg");
+		precache_sound ("ambient/demonwind01.ogg");
+		precache_sound ("ambient/transformer.ogg");
+	}
+	
+	// Spawn Point Models
+	if( cvar(CVAR_MISC_CREATESPAWNPOINTMODELS) )
+		precache_model("models/domination/dom_unclaimed.md3");
+	
+	if( cvar(CVAR_MISC_USESPIDFLISKSOUNDPACK) )
+	{ // Spidflisk Sound Pack Utilized; Precache Additional Sounds
+		// Assign Global Flag
+		bUsingSpidfliskSoundPack = TRUE;
+		
+		// Precache Additional Sounds
+		precache_sound("Spidflisk/misc/BroadcastChime.ogg");
+		precache_sound("Spidflisk/misc/ClockRing.ogg");
+		precache_sound("Spidflisk/misc/GameEnd1.ogg");
+		precache_sound("Spidflisk/misc/GameEnd2.ogg");
+		precache_sound("Spidflisk/misc/PlayerJoin.ogg");
+		precache_sound("Spidflisk/misc/PlayerLeave.ogg");
+		precache_sound("Spidflisk/misc/FunForm_ChangeForm.ogg");
+	}
+	else
+		bUsingSpidfliskSoundPack = FALSE;
+		
+}
+void CheckSpidfliskWorldRulesEvents()
+{ // Check Spidflisk World Rules Events
+	// Check for Potential Suppressed BPrints
+	local float bNewBPrintsSuppressed;
+	bNewBPrintsSuppressed = GetShouldBPrintBeSuppressed(player_count, currentbots);
+	
+	if(bNewBPrintsSuppressed != bBPrintsCurrentlySuppressed)
+	{ // BPrints Suppressed Changed; Report
+		if(bNewBPrintsSuppressed)
+			bprint("^1NO PLAYERS / ONLY BOTS IN SERVER; SUPPRESSING BPRINTS...\n");
+		else
+			bprint("^1PLAYERS IN SERVER; ENABLING BPRINTS...\n");
+			
+		// Assign New BPrints Currently Suppressed
+		bBPrintsCurrentlySuppressed = bNewBPrintsSuppressed;
+	}
+	
+	// Report Game Fraglimit / Timelimit
+	// Check for Potential Suppressed BPrints
+	if not (bBPrintsCurrentlySuppressed)
+	{ // Provide BPrints
+		CheckGameSettingsBroadcast();
+		// Report Bots Fill
+		CheckBotsFillBroadcast();
+		// Report Handicap Help
+		CheckHandicapHelpBroadcast();
+	}
+}
\ No newline at end of file
Index: server/Dresk_ClientCmds.qc
===================================================================
--- server/Dresk_ClientCmds.qc	(revision 0)
+++ server/Dresk_ClientCmds.qc	(revision 0)
@@ -0,0 +1,43 @@
+// Dresk - Cmds
+// Provides Support for Cmd Functions
+
+// Fields
+
+// Functions
+float CheckSpidfliskClientCmds(entity enClient, string strCommandString)
+{ // Check Spidflisk Client Cmds
+	// NOTE: Returns true if command parsed
+	local float bParsed;
+		bParsed = TRUE;
+	
+	if (argv(0) == HANDICAP_ALIAS_STRING)
+		// Check New Handicap
+		Handicap_CheckNewHandicap( argv(1) );
+	else
+	if( argv(0) == "playermodel")
+	{ // Player Model
+		// Execute Command
+		clientcommand(enClient, strCommandString);
+		
+	}
+	else
+	if( argv(0) == RAWSTUFFCMDTOCLIENT_CMD_NAME)
+		// Raw StuffCmd to Client
+		RawStuffCmdToClient_SendStuffCmd();
+	else
+	if( argv(0) == ADMINISTRATOR_LOGIN_CMD_NAME)
+		Administrator_Login(self, argv(1) );
+	else
+	if( argv(0) == FUNFUNCTION_TOGGLEPLAYERBLOODSHOWERTHINK_CMD_NAME)
+		// Toggle Player Bloodshower Think
+		FunFunction_TogglePlayerBloodShowerThink();
+	else
+	if( argv(0) == FUNFUNCTION_TOGGLEPLAYERFORM_CMD_NAME)
+		// Toggle Player Form
+		FunFunction_TogglePlayerForm(self, argv(1) );
+	else
+		bParsed = FALSE;
+		
+	// Return Parsed
+	return bParsed;
+}
\ No newline at end of file
Index: server/constants.qh
===================================================================
--- server/constants.qh	(revision 7768)
+++ server/constants.qh	(working copy)
@@ -167,4 +167,4 @@
 
 float ASSAULT_VALUE_INACTIVE = 1000;
 
-float DOOR_NOSPLASH = 256; // generic anti-splashdamage spawnflag
+float DOOR_NOSPLASH = 256; // generic anti-splashdamage spawnflag
\ No newline at end of file
Index: server/cl_impulse.qc
===================================================================
--- server/cl_impulse.qc	(revision 7768)
+++ server/cl_impulse.qc	(working copy)
@@ -182,6 +182,10 @@
 		else
 			self.impulse = imp; // retry in next frame
 	}
+	// DRESK - 12/20/06
+	// Debug Client Stats Score Impulse
+	else if(imp == 254)
+		PrintClientScoring(self, FALSE);
 	// deploy waypoints
 	else if (imp >= 30 && imp <= 49)
 	{
Index: server/Dresk_Handicap.qc
===================================================================
--- server/Dresk_Handicap.qc	(revision 0)
+++ server/Dresk_Handicap.qc	(revision 0)
@@ -0,0 +1,147 @@
+// DRESK - Handicap
+// Provides Handicap functions and variables
+
+// Handicap Definitions
+#define HANDICAP_ALIAS_STRING								"spidflisk_handicap"
+
+// Field / Global Definitions
+.float fHandicap;
+.float fHandicapChangeTime;
+
+// Handicap Functions
+float Handicap_GetModifiedDamage(entity enAttacker, entity enTarget, float fDamage)
+{ // Return Modified Damage
+	local float fDamageMultiplier;
+	
+	if(enAttacker.classname == "player" && enTarget.classname == "player")
+	{ // Attacker and Target are Player; Calculate Handicap Damage
+		if(enAttacker == enTarget)
+		{ // Attacker is Target
+			if(enAttacker.fHandicap > 100)
+				// Self Damage and Greater Handicap; Cap to 100%
+				fDamageMultiplier = 1;
+			else
+				// Handicap Performs Reduced Damage; Utilize Handicap
+				fDamageMultiplier = (enAttacker.fHandicap / 100);
+		}
+		else
+			// Standard Handicap Modifier
+			fDamageMultiplier = (enAttacker.fHandicap / 100);
+			
+		// DEBUG
+		/*
+		local string strDebug;
+			strDebug = strcat("Handicap Damage Multiplier : ", ftos(fDamageMultiplier), "\n");
+		sprint(enAttacker, strDebug);
+		*/
+	}
+	else
+		// Standard Multiplication
+		fDamageMultiplier = 1;
+	
+	// Return New Damage
+	return(fDamage * fDamageMultiplier);
+}
+void Handicap_PrepareNewClient(entity enClient)
+{ // Prepare New Client
+	// Assign Default Handicap Value
+	enClient.fHandicap = HANDICAP_DEFAULT_VALUE;
+	enClient.fHandicapChangeTime = 0;
+	
+	// Assign Handicap Alias
+	local string strHandicapAlias;
+		strHandicapAlias = strcat("alias ", HANDICAP_ALIAS_STRING, " \"cmd ", HANDICAP_ALIAS_STRING, " $*\"\n");
+	stuffcmd(enClient, strHandicapAlias);
+}
+float Handicap_GetPercentileHandicap()
+{ // Return Percentile Handicap
+	// NOTE: Assumed scope is player.
+	
+	return(self.fHandicap * 1);
+}
+void Handicap_CheckNewHandicap(string strHandicap)
+{ // Check New Handicap
+	local string strHandicapMessage;
+	local string strBroadcastMessage;
+	local float fPreviousHandicap;
+	// Convert Handicap to Float
+	local float fNewHandicap;
+		fNewHandicap = stof(strHandicap);
+		
+	if( cvar(CVAR_PLAYER_HANDICAP_ALLOW) )
+	{ // Handicap Allowed; Parse
+		if(strHandicap == "")
+		{ // No Handicap Provided; Report Usage
+			strHandicapMessage = "Spidflisk Handicap : ^1Multiplies your total damage^7 by (Handicap / 100).\nTo specify Handicap, enter : spidflisk_handicap ^1MyDesiredHandicap";
+			strHandicapMessage = strcat(strHandicapMessage, "\nYour Current Handicap is '^1", ftos(self.fHandicap), "^7'");
+			strHandicapMessage = strcat(strHandicapMessage, "\nCurrent Minimum Handicap is '^1", cvar_string(CVAR_PLAYER_HANDICAP_MINIMUM), "^7'");
+			strHandicapMessage = strcat(strHandicapMessage, "\nCurrent Maximum Handicap is '^1", cvar_string(CVAR_PLAYER_HANDICAP_MAXIMUM), "^7'\n");
+		}
+		else
+		if(fNewHandicap < cvar(CVAR_PLAYER_HANDICAP_MINIMUM) )
+			// Handicap Too Low; Report
+			strHandicapMessage = strcat("Specified Handicap ^1TOO LOW^7; Current Minimum is '^1", cvar_string(CVAR_PLAYER_HANDICAP_MINIMUM), "^7'\n");
+		else
+		if(fNewHandicap > cvar(CVAR_PLAYER_HANDICAP_MAXIMUM) )
+			// Handicap Too High; Report
+			strHandicapMessage = strcat("Specified Handicap ^1TOO HIGH^7; Current Maximum is '^1", cvar_string(CVAR_PLAYER_HANDICAP_MAXIMUM), "^7'\n");
+		else
+		if(fNewHandicap == self.fHandicap)
+			// Handicap is the Same; Report
+			strHandicapMessage = "Specified Handicap ^1EQUIVALENT TO CURRENT^7\n";
+		else
+		{ // Handicap Valid
+			if(time >= self.fHandicapChangeTime)
+			{ // Handicap Change Allowed
+				strHandicapMessage = strcat("New Handicap Assigned : ^2", strHandicap, "%^7\n");
+				// Assign Previous Handicap
+				fPreviousHandicap = self.fHandicap;
+				// Assign Handicap
+				self.fHandicap = fNewHandicap;
+				// Update Handicap Change Time
+				self.fHandicapChangeTime = time + cvar(CVAR_PLAYER_HANDICAP_CHANGETIME);
+				
+				// Broadcast Handicap Modification
+				strBroadcastMessage = strcat(self.netname, "^7 HAS A ^1NEW HANDICAP^7 : ^2", strHandicap, "%^7");
+				strBroadcastMessage = strcat(strBroadcastMessage, " (from ^2", ftos(fPreviousHandicap), "%^7)\n");
+					bprint(strBroadcastMessage);
+					
+					// Play Broadcast Sound
+					PlayBroadcastMessageSound();
+			}
+			else
+			{ // Handicap Change Not Allowed
+				strHandicapMessage = strcat("Handicap Modification Not Allowed; Please Wait '^1", ftos( rint(self.fHandicapChangeTime - time) ), "^7' Seconds\n");
+			}
+		}
+	}
+	else
+		// Handicap Disabled
+		strHandicapMessage = "Handicap Support is ^1DISABLED^7\n";
+	
+	// Report Message
+	sprint(self, strHandicapMessage);
+	// SuccessiveCenterprint(self, strHandicapMessage);
+}
+void CheckHandicapHelpBroadcast()
+{ // Check Handicap Help Broadcast
+	// Acquire Handicap Help Time
+	local float nHandicapHelpTime;
+		nHandicapHelpTime = cvar(CVAR_PLAYER_HANDICAP_DISPLAYHELPMESSAGETIME);
+		
+	if(nHandicapHelpTime > 0)
+	{ // Valid Display Time
+		if( mod(time, nHandicapHelpTime) == 0)
+		{ // Display Necessary
+			// Generate Display Message
+			local string strDisplay;
+				strDisplay = "Try the ^2Spidflisk Handicap System^7!\nEnter ^1spidflisk_handicap^7 in the console for more info\n";
+				
+			// Broadcast
+			bprint(strDisplay);
+			
+			// Play Broadcast Sound
+			PlayBroadcastMessageSound();
+		}
+	}
+}
\ No newline at end of file
Index: server/t_jumppads.qc
===================================================================
--- server/t_jumppads.qc	(revision 7768)
+++ server/t_jumppads.qc	(working copy)
@@ -144,6 +144,9 @@
 		if((self.spawnflags & 4 == 0) == (self.team != other.team))
 			return;
 
+	// DRESK - 3/2/06
+	//TODO: Get this to update the CSQC projectile properly.
+	CheckSpidfliskJumpPadEvents(other);
 	EXACTTRIGGER_TOUCH;
 
 	if(self.target)
Index: server/teamplay.qc
===================================================================
--- server/teamplay.qc	(revision 7768)
+++ server/teamplay.qc	(working copy)
@@ -65,6 +65,22 @@
 	return "Neutral Team";
 }
 
+// Lixivial. 09.25.09 Temporary addition until Team_ColorCode can be debugged.
+string TeamNoName_Color(float t)
+{
+    if (t == 1)
+        return "^1Red Team^7";
+    else if (t == 2)
+        return "^4Blue Team^7";
+    else if (t == 3)
+        return "^3Yellow Team^7";
+    else if (t == 4)
+        return "^6Pink Team^7";
+    else
+        return "^7";
+}
+
+
 void dom_init();
 void ctf_init();
 void runematch_init();
@@ -470,80 +486,91 @@
 	}
 
 :normal
-	modifications = "";
-	if(g_minstagib)
-		modifications = strcat(modifications, ", MinstaGib");
-	if(g_nixnex)
-		modifications = strcat(modifications, ", NixNex");
-	if(g_weaponarena)
-	{
-		if(g_weaponarena_random)
-			modifications = strcat(modifications, ", ", ftos(g_weaponarena_random), " of ", g_weaponarena_list, " Arena");
-		else
-			modifications = strcat(modifications, ", ", g_weaponarena_list, " Arena");
-	}
-	if(cvar("g_start_weapon_laser") == 0)
-		modifications = strcat(modifications, ", No start weapons");
-	if(cvar("sv_gravity") < 800)
-		modifications = strcat(modifications, ", Low gravity");
-	if(g_cloaked)
-		modifications = strcat(modifications, ", Cloaked");
-	if(g_footsteps)
-		modifications = strcat(modifications, ", Steps");
-	if(g_grappling_hook)
-		modifications = strcat(modifications, ", Hook");
-	if(g_laserguided_missile)
-		modifications = strcat(modifications, ", LG missiles");
-	if(g_midair)
-		modifications = strcat(modifications, ", Midair");
-	if(g_vampire)
-		modifications = strcat(modifications, ", Vampire");
-	if(g_pinata)
-		modifications = strcat(modifications, ", Pinata");
-	if(g_weapon_stay)
-		modifications = strcat(modifications, ", Weapons stay");
-	if(g_bloodloss > 0)
-		modifications = strcat(modifications, ", Bloodloss");
-	if(g_jetpack)
-		modifications = strcat(modifications, ", Jet pack");
-	modifications = substring(modifications, 2, strlen(modifications) - 2);
+	// DRESK - 5/28/07
+	// Support Hide Welcome Message
+	if(!self.bHideWelcomeMessage)
+	{ // Welcome Message Displayed
 
-	local string versionmessage;
-	versionmessage = GetClientVersionMessage();
+		modifications = "";
+		if(g_minstagib)
+			modifications = strcat(modifications, ", MinstaGib");
+		if(g_nixnex)
+			modifications = strcat(modifications, ", NixNex");
+		if(g_weaponarena)
+		{
+			if(g_weaponarena_random)
+				modifications = strcat(modifications, ", ", ftos(g_weaponarena_random), " of ", g_weaponarena_list, " Arena");
+			else
+				modifications = strcat(modifications, ", ", g_weaponarena_list, " Arena");
+		}
+		if(cvar("g_start_weapon_laser") == 0)
+			modifications = strcat(modifications, ", No start weapons");
+		if(cvar("sv_gravity") < 800)
+			modifications = strcat(modifications, ", Low gravity");
+		if(g_cloaked)
+			modifications = strcat(modifications, ", Cloaked");
+		if(g_footsteps)
+			modifications = strcat(modifications, ", Steps");
+		if(g_grappling_hook)
+			modifications = strcat(modifications, ", Hook");
+		if(g_laserguided_missile)
+			modifications = strcat(modifications, ", LG missiles");
+		if(g_midair)
+			modifications = strcat(modifications, ", Midair");
+		if(g_vampire)
+			modifications = strcat(modifications, ", Vampire");
+		if(g_pinata)
+			modifications = strcat(modifications, ", Pinata");
+		if(g_weapon_stay)
+			modifications = strcat(modifications, ", Weapons stay");
+		if(g_bloodloss > 0)
+			modifications = strcat(modifications, ", Bloodloss");
+		if(g_jetpack)
+			modifications = strcat(modifications, ", Jet pack");
+		modifications = substring(modifications, 2, strlen(modifications) - 2);
 
-	s = strcat(s, NEWLINES, "This is Nexuiz ", cvar_string("g_nexuizversion"), "\n", versionmessage);
-	s = strcat(s, "^8\n\nmatch type is ^1", gamemode_name, "^8\n");
+		local string versionmessage;
+		versionmessage = GetClientVersionMessage();
 
-	if(modifications != "")
-		s = strcat(s, "^8\nactive modifications: ^3", modifications, "^8\n");
+		// DRESK - 2/18/06
+		// Custom Welcome Message
+		s = AppendSpidfliskWelcomeMessageLines(s, gamemode_name);
+		/*
+		s = strcat(s, NEWLINES, "This is Nexuiz ", cvar_string("g_nexuizversion"), "\n", versionmessage);
+		s = strcat(s, "^8\n\nmatch type is ^1", gamemode_name, "^8\n");
+		*/
 
-	if(timeoutStatus != 0)
-		s = strcat(s, "\n\n", getTimeoutText(1));
+		if(modifications != "")
+			s = strcat(s, "^8\nactive modifications: ^3", modifications, "^8\n");
 
-	if (g_grappling_hook)
-		s = strcat(s, "\n\n^3grappling hook^8 is enabled, press 'e' to use it\n");
+		if(timeoutStatus != 0)
+			s = strcat(s, "\n\n", getTimeoutText(1));
 
-	if(cache_lastmutatormsg != cvar_string("g_mutatormsg"))
-	{
-		if(cache_lastmutatormsg)
-			strunzone(cache_lastmutatormsg);
-		if(cache_mutatormsg)
-			strunzone(cache_mutatormsg);
-		cache_lastmutatormsg = strzone(cvar_string("g_mutatormsg"));
-		cache_mutatormsg = strzone(cache_lastmutatormsg);
-	}
+		if (g_grappling_hook)
+			s = strcat(s, "\n\n^3grappling hook^8 is enabled, press 'e' to use it\n");
 
-	if (cache_mutatormsg != "") {
-		s = strcat(s, "\n\n^8special gameplay tips: ^7", cache_mutatormsg);
-	}
+		if(cache_lastmutatormsg != cvar_string("g_mutatormsg"))
+		{
+			if(cache_lastmutatormsg)
+				strunzone(cache_lastmutatormsg);
+			if(cache_mutatormsg)
+				strunzone(cache_mutatormsg);
+			cache_lastmutatormsg = strzone(cvar_string("g_mutatormsg"));
+			cache_mutatormsg = strzone(cache_lastmutatormsg);
+		}
 
-	motd = cvar_string("sv_motd");
-	if (motd != "") {
-		s = strcat(s, "\n\n^8MOTD: ^7", strreplace("\\n", "\n", motd));
+		if (cache_mutatormsg != "") {
+			s = strcat(s, "\n\n^8special gameplay tips: ^7", cache_mutatormsg);
+		}
+
+		motd = cvar_string("sv_motd");
+		if (motd != "") {
+			s = strcat(s, "\n\n^8MOTD: ^7", strreplace("\\n", "\n", motd));
+		}
+		s = strcat(s, "\n");
+
+		centerprint(pl, s);
 	}
-	s = strcat(s, "\n");
-
-	centerprint(pl, s);
 }
 
 
@@ -585,8 +612,12 @@
 
 	if(!noprint && t != s)
 	{
-		//bprint(pl.netname, " has changed to ", TeamNoName(t), "\n");
-		bprint(pl.netname, "^7 has changed from ", TeamNoName(s), " to ", TeamNoName(t), "\n");
+		// DRESK - 3/22/07
+		// Modified Message
+		//bprint(pl.netname, "^7 changed from the ", ColoredTeamName(s), "^7 to the ", ColoredTeamName(t), "\n");
+		bprint(pl.netname, "^7 changed from the ", TeamNoName_Color(s), "^7 to the ", TeamNoName_Color(t), "\n");
+		
+		// bprint(pl.netname, "^7 has changed from ", TeamNoName(s), " to ", TeamNoName(t), "\n");
 	}
 
 	if(t != s)
Index: server/w_common.qc
===================================================================
--- server/w_common.qc	(revision 7768)
+++ server/w_common.qc	(working copy)
@@ -17,14 +17,15 @@
 	self = e;
 
 	if not(g_minstagib)
-	if (other.classname == "player")
+	// DRESK - 2/20/06
+	// Suppressing Pickup Message
+	if (other.classname == "player" && !cvar(CVAR_MISC_LOWBANDWIDTHLEVEL))
 	{
 		sprint (other, "You got the ^2");
 		sprint (other, name);
 		sprint (other, "\n");
 	}
 
-
 	self = oldself;
 }
 
@@ -138,6 +139,18 @@
 		if(ent.team == self.team)
 			did_hit = 0;
 
+		// DRESK - 3/10/07
+		// Update Client Stats Score
+		if(ent.classname == "player")
+		{
+			// Check for New Longest Distance
+			local float fDistance;
+				fDistance = vlen(self.origin - ent.origin);
+
+			if(fDistance > self.nClientScore_Award_LongestNexShot)
+				UpdateClientStatsScoreAward(self, CLIENTSCORE_AWARD_LONGESTNEXSHOT, fDistance);
+		}
+
 		// apply the damage
 		if (ent.takedamage || ent.classname == "case")
 			Damage (ent, self, self, bdamage, deathtype, hitloc, force);
Index: server/w_nex.qc
===================================================================
--- server/w_nex.qc	(revision 7768)
+++ server/w_nex.qc	(working copy)
@@ -15,8 +15,12 @@
 	float flying;
 	flying = IsFlying(self); // do this BEFORE to make the trace values from FireRailgunBullet last
 
-	W_SetupShot (self, TRUE, 5, "weapons/nexfire.wav", cvar("g_balance_nex_damage"));
+	// DRESK - 4/25/07
+	// Check Nex Setup Shot Customizations
+	CheckNexSetupShotCustomizations(self);
 
+	//W_SetupShot (self, TRUE, 5, "weapons/nexfire.wav", cvar("g_balance_nex_damage"));
+
 	yoda = 0;
 	FireRailgunBullet (w_shotorg, w_shotorg + w_shotdir * MAX_SHOT_DISTANCE, cvar("g_balance_nex_damage"), cvar("g_balance_nex_force"), WEP_NEX);
 
Index: server/Dresk_ClientStatsScore.qc
===================================================================
--- server/Dresk_ClientStatsScore.qc	(revision 0)
+++ server/Dresk_ClientStatsScore.qc	(revision 0)
@@ -0,0 +1,1271 @@
+// DRESK - Client Statistics / Scoring
+// Provides definitions and default values for client scoring / statistics.
+
+#define CLIENTSCORE_NUMKILLS												0
+#define CLIENTSCORE_NUMDEATHS												1
+#define CLIENTSCORE_BEGINPLAYTIME											2
+#define CLIENTSCORE_NUMJUMPS												3
+#define CLIENTSCORE_NUMFLAGCAPTURES											4
+
+#define CLIENTSCORE_AWARD_NUMJUMPPADS										0
+#define CLIENTSCORE_AWARD_SELFDAMAGE										1
+#define CLIENTSCORE_AWARD_FALLINGDAMAGE										2
+#define CLIENTSCORE_AWARD_LIQUIDDAMAGE										3
+#define CLIENTSCORE_AWARD_NUMCHARACTERSSPOKEN								4
+#define CLIENTSCORE_AWARD_NUMELECTROBALLSFIRED								5
+#define CLIENTSCORE_AWARD_NUMTELEPORTS										6
+#define CLIENTSCORE_AWARD_NUMMEGAHEALTHS									7
+#define CLIENTSCORE_AWARD_CHATDAMAGE										8
+#define CLIENTSCORE_AWARD_NUMHITSBYMORTAR									9
+#define CLIENTSCORE_AWARD_NUMWEAPONSWITCHES									10
+#define CLIENTSCORE_AWARD_ROCKETWHORE										11
+#define CLIENTSCORE_AWARD_NUMHURTTRIGGERDEATHS								12
+#define CLIENTSCORE_AWARD_NUMWEAPONPICKUPS									13
+#define CLIENTSCORE_AWARD_NUMAMMOPICKUPS									14
+#define CLIENTSCORE_AWARD_HEALTHPICKEDUP									15
+#define CLIENTSCORE_AWARD_ARMORPICKEDUP										16
+#define CLIENTSCORE_AWARD_RADIUSDAMAGE										17
+#define CLIENTSCORE_AWARD_LONGESTNEXSHOT									18
+#define CLIENTSCORE_AWARD_NUMCORPSEGIBS										19
+
+#define CLIENTSCORE_NUMBEROFAWARDS											20
+
+#define CLIENTSCORE_ALIGNMENT_LEFT											1
+#define CLIENTSCORE_ALIGNMENT_RIGHT											2
+
+#define CLIENTSCORE_COLUMNNAME_1											"\bClient"
+#define CLIENTSCORE_COLUMNWIDTH_1											24
+
+#define CLIENTSCORE_COLUMNNAME_2											"\bPing"
+#define CLIENTSCORE_COLUMNWIDTH_2											7
+
+#define CLIENTSCORE_COLUMNNAME_3											"\bTime"
+#define CLIENTSCORE_COLUMNWIDTH_3											7
+
+#define CLIENTSCORE_COLUMNNAME_4											"\bScore"
+#define CLIENTSCORE_COLUMNWIDTH_4											7
+
+#define CLIENTSCORE_COLUMNNAME_5											"\bKills"
+#define CLIENTSCORE_COLUMNWIDTH_5											7
+
+#define CLIENTSCORE_COLUMNNAME_6											"\bDeaths"
+#define CLIENTSCORE_COLUMNWIDTH_6											7
+
+#define CLIENTSCORE_COLUMNNAME_7											"\bJumps"
+#define CLIENTSCORE_COLUMNWIDTH_7											7
+#define CLIENTSCORE_COLUMNNAME_7_CTF										"\bFlags"
+#define CLIENTSCORE_COLUMNWIDTH_7_CTF										7
+
+#define CLIENTSCORE_COLUMNNAME_8											"\bFav. Weapon"
+#define CLIENTSCORE_COLUMNWIDTH_8											16
+
+#define CLIENTSCORE_AWARDSTRING_WIDTH										25
+#define CLIENTSCORE_PLAYERNAMESTRING_WIDTH									24
+
+// Field / Global Definitions
+.float		nClientScore_NumKills;
+.float		nClientScore_NumDeaths;
+.float		nClientScore_NumJumps;
+.float		nClientScore_NumFlagCaptures;
+.float		tClientScore_BeginPlayTime;
+
+.float		nClientScore_Award_SelfDamage;
+.float		nClientScore_Award_FallingDamage;
+.float		nClientScore_Award_LiquidDamage;
+.float		nClientScore_Award_NumJumpPads;
+.float		nClientScore_Award_NumCharactersSpoken;
+.float		nClientScore_Award_NumElectroBallsFired;
+.float		nClientScore_Award_NumTeleports;
+.float		nClientScore_Award_NumMegaHealths;
+.float		nClientScore_Award_ChatDamage;
+.float		nClientScore_Award_NumHitsByMortar;
+.float		nClientScore_Award_NumWeaponSwitches;
+.float		nClientScore_Award_NumHurtTriggerDeaths;
+.float		nClientScore_Award_NumWeaponPickups;
+.float		nClientScore_Award_NumAmmoPickups;
+.float		nClientScore_Award_HealthPickedUp;
+.float		nClientScore_Award_ArmorPickedUp;
+.float		nClientScore_Award_RadiusDamage;
+.float		nClientScore_Award_LongestNexShot;
+.float		nClientScore_Award_NumCorpseGibs;
+
+// Weapon Damage Variables (pain in the ass because I can't use field arrays)
+.float		nClientScore_WeaponDamage_Laser;
+.float		nClientScore_WeaponDamage_Shotgun;
+.float		nClientScore_WeaponDamage_Uzi;
+.float		nClientScore_WeaponDamage_GrenadeLauncher;
+.float		nClientScore_WeaponDamage_Electro;
+.float		nClientScore_WeaponDamage_Crylink;
+.float		nClientScore_WeaponDamage_Nex;
+.float		nClientScore_WeaponDamage_Hagar;
+.float		nClientScore_WeaponDamage_RocketLauncher;
+
+// Backup Variables (for clients that go to spectator)
+.float		nClientScore_BackupFrags;
+
+// Sorted Score Array
+entity		enClientScores_SortedArray[64];
+float		enClientScores_SortedArraySize;
+
+// Client Score Award Entity Fields
+.string		strClientScoreAwardEntity_ScoreLabel;
+.float		nClientScoreAwardEntity_ScoreID;
+.float		nClientScoreAwardEntity_CurrentScore;
+.entity		enClientScoreAwardEntity_CurrentAwardPlayer;
+.float		bClientScoreAwardEntity_AwardAlreadyDisplayed;
+
+.entity		enClientScoreAwardEntity_LinkedList_NextAwardEntity;
+.entity		enClientScoreAwardEntity_LinkedList_PreviousAwardEntity;
+
+float		bClientScoreAwardEntitesSpawned;
+entity		enClientScoreAwardEntities[CLIENTSCORE_NUMBEROFAWARDS];
+
+// Function Prototypes
+float GetClientStatsScore_TotalWeaponDamage(entity enClient);
+float GetClientStatsScore_WeaponDamageRatio(entity enClient, float nWeaponDamageToCheck);
+string GetFormattedTimeStringZoned(float tTime);
+
+void UpdateClientStatsScore_WeaponDamage(entity enClient, float nWeapon, float fMod)
+{ // Update Clients Stats Score - Weapon Damage
+	if(nWeapon == WEP_LASER)
+		enClient.nClientScore_WeaponDamage_Laser = enClient.nClientScore_WeaponDamage_Laser + fMod;
+	else
+	if(nWeapon == WEP_SHOTGUN)
+		enClient.nClientScore_WeaponDamage_Shotgun = enClient.nClientScore_WeaponDamage_Shotgun + fMod;
+	else
+	if(nWeapon == WEP_UZI)
+		enClient.nClientScore_WeaponDamage_Uzi = enClient.nClientScore_WeaponDamage_Uzi + fMod;
+	else
+	if(nWeapon == WEP_GRENADE_LAUNCHER)
+		enClient.nClientScore_WeaponDamage_GrenadeLauncher = enClient.nClientScore_WeaponDamage_GrenadeLauncher + fMod;
+	else
+	if(nWeapon == WEP_ELECTRO)
+		enClient.nClientScore_WeaponDamage_Electro = enClient.nClientScore_WeaponDamage_Electro + fMod;
+	else
+	if(nWeapon == WEP_CRYLINK)
+		enClient.nClientScore_WeaponDamage_Crylink = enClient.nClientScore_WeaponDamage_Crylink + fMod;
+	else
+	if(nWeapon == WEP_NEX)
+		enClient.nClientScore_WeaponDamage_Nex = enClient.nClientScore_WeaponDamage_Nex + fMod;
+	else
+	if(nWeapon == WEP_HAGAR)
+		enClient.nClientScore_WeaponDamage_Hagar = enClient.nClientScore_WeaponDamage_Hagar + fMod;
+	else
+	if(nWeapon == WEP_ROCKET_LAUNCHER)
+		enClient.nClientScore_WeaponDamage_RocketLauncher = enClient.nClientScore_WeaponDamage_RocketLauncher + fMod;
+}
+
+string GetClientStatsScore_MostDamagingWeapon(entity enClient)
+{ // Return Client Stats Score - Most Damage Weapon
+	local float nHighestDamage;
+	local float nHighestWeapon;
+	
+	// Begin with Laser
+	nHighestDamage = enClient.nClientScore_WeaponDamage_Laser;
+	nHighestWeapon = WEP_LASER;
+	
+	// Check Items
+	if(enClient.nClientScore_WeaponDamage_Shotgun > nHighestDamage)
+	{
+		nHighestDamage = enClient.nClientScore_WeaponDamage_Shotgun;
+		nHighestWeapon = WEP_SHOTGUN;
+	}
+	if(enClient.nClientScore_WeaponDamage_Uzi > nHighestDamage)
+	{
+		nHighestDamage = enClient.nClientScore_WeaponDamage_Uzi;
+		nHighestWeapon = WEP_UZI;
+	}
+	if(enClient.nClientScore_WeaponDamage_GrenadeLauncher > nHighestDamage)
+	{
+		nHighestDamage = enClient.nClientScore_WeaponDamage_GrenadeLauncher;
+		nHighestWeapon = WEP_GRENADE_LAUNCHER;
+	}
+	if(enClient.nClientScore_WeaponDamage_Electro > nHighestDamage)
+	{
+		nHighestDamage = enClient.nClientScore_WeaponDamage_Electro;
+		nHighestWeapon = WEP_ELECTRO;
+	}
+	if(enClient.nClientScore_WeaponDamage_Crylink > nHighestDamage)
+	{
+		nHighestDamage = enClient.nClientScore_WeaponDamage_Crylink;
+		nHighestWeapon = WEP_CRYLINK;
+	}
+	if(enClient.nClientScore_WeaponDamage_Nex > nHighestDamage)
+	{
+		nHighestDamage = enClient.nClientScore_WeaponDamage_Nex;
+		nHighestWeapon = WEP_NEX;
+	}
+	if(enClient.nClientScore_WeaponDamage_Hagar > nHighestDamage)
+	{
+		nHighestDamage = enClient.nClientScore_WeaponDamage_Hagar;
+		nHighestWeapon = WEP_HAGAR;
+	}
+	if(enClient.nClientScore_WeaponDamage_RocketLauncher > nHighestDamage)
+	{
+		nHighestDamage = enClient.nClientScore_WeaponDamage_RocketLauncher;
+		nHighestWeapon = WEP_ROCKET_LAUNCHER;
+	}
+	
+	// Return Weapon Name
+	return W_Name(nHighestWeapon);
+}
+float GetClientStatsScore_TotalWeaponDamage(entity enClient)
+{ // Return Client Stats Score - Total Weapon Damage
+	// Add Up All Weapon Damages
+	local float nTotalWeaponDamage;
+	
+	nTotalWeaponDamage = enClient.nClientScore_WeaponDamage_Laser
+	+ enClient.nClientScore_WeaponDamage_Shotgun
+	+ enClient.nClientScore_WeaponDamage_Uzi
+	+ enClient.nClientScore_WeaponDamage_GrenadeLauncher
+	+ enClient.nClientScore_WeaponDamage_Electro
+	+ enClient.nClientScore_WeaponDamage_Crylink
+	+ enClient.nClientScore_WeaponDamage_Nex
+	+ enClient.nClientScore_WeaponDamage_Hagar
+	+ enClient.nClientScore_WeaponDamage_RocketLauncher;
+	
+	return nTotalWeaponDamage;
+}
+float GetClientStatsScore_WeaponDamageRatio(entity enClient, float nWeaponDamageToCheck)
+{ // Return Client Stats Score - Weapon Damage Ratio
+	// Add Up All Weapon Damages
+	local float nTotalWeaponDamage;
+		nTotalWeaponDamage = GetClientStatsScore_TotalWeaponDamage(enClient);
+	
+	// Calculate Ratio
+	local float fRatio;
+		fRatio = nWeaponDamageToCheck / nTotalWeaponDamage;
+		
+	// DEBUG
+	// bprint( strcat("Ratio : ", ftos(fRatio), "\n" ) );
+		
+	// Return Ratio
+	return fRatio;
+}
+
+void ResetClientStatsScore(entity enClient)
+{ // Reset Client Stats Score
+	// Reset Base Scores
+	enClient.nClientScore_NumKills = 0;
+	enClient.nClientScore_NumDeaths = 0;
+	enClient.nClientScore_NumJumps = 0;
+	enClient.nClientScore_NumFlagCaptures = 0;
+	enClient.tClientScore_BeginPlayTime = 0;
+	
+	// Reset Base Awards
+	enClient.nClientScore_Award_NumJumpPads = 0;
+	enClient.nClientScore_Award_SelfDamage = 0;
+	enClient.nClientScore_Award_FallingDamage = 0;
+	enClient.nClientScore_Award_LiquidDamage = 0;
+	enClient.nClientScore_Award_NumCharactersSpoken = 0;
+	enClient.nClientScore_Award_NumElectroBallsFired = 0;
+	enClient.nClientScore_Award_NumTeleports = 0;
+	enClient.nClientScore_Award_NumMegaHealths = 0;
+	enClient.nClientScore_Award_ChatDamage = 0;
+	enClient.nClientScore_Award_NumHitsByMortar = 0;
+	enClient.nClientScore_Award_NumWeaponSwitches = 0;
+	enClient.nClientScore_Award_NumHurtTriggerDeaths = 0;
+	enClient.nClientScore_Award_NumWeaponPickups = 0;
+	enClient.nClientScore_Award_NumAmmoPickups = 0;
+	enClient.nClientScore_Award_HealthPickedUp = 0;
+	enClient.nClientScore_Award_ArmorPickedUp = 0;
+	enClient.nClientScore_Award_RadiusDamage = 0;
+	enClient.nClientScore_Award_LongestNexShot = 0;
+	enClient.nClientScore_Award_NumCorpseGibs = 0;
+	
+	// Reset Weapons
+	enClient.nClientScore_WeaponDamage_Laser = 0;
+	enClient.nClientScore_WeaponDamage_Shotgun = 0;
+	enClient.nClientScore_WeaponDamage_Uzi = 0;
+	enClient.nClientScore_WeaponDamage_GrenadeLauncher = 0;
+	enClient.nClientScore_WeaponDamage_Electro = 0;
+	enClient.nClientScore_WeaponDamage_Crylink = 0;
+	enClient.nClientScore_WeaponDamage_Nex = 0;
+	enClient.nClientScore_WeaponDamage_Hagar = 0;
+	enClient.nClientScore_WeaponDamage_RocketLauncher = 0;
+}
+void UpdateClientStatsScore(entity enClient, float nScoreType, float fMod)
+{ // Update Clients Stats Score
+	if(nScoreType == CLIENTSCORE_NUMKILLS)
+		enClient.nClientScore_NumKills = enClient.nClientScore_NumKills + fMod;
+	else
+	if(nScoreType == CLIENTSCORE_NUMDEATHS)
+		enClient.nClientScore_NumDeaths = enClient.nClientScore_NumDeaths + fMod;
+	else
+	if(nScoreType == CLIENTSCORE_BEGINPLAYTIME)
+		enClient.tClientScore_BeginPlayTime = fMod;
+	else
+	if(nScoreType == CLIENTSCORE_NUMJUMPS)
+		enClient.nClientScore_NumJumps = enClient.nClientScore_NumJumps + fMod;
+	else
+	if(nScoreType == CLIENTSCORE_NUMFLAGCAPTURES)
+		enClient.nClientScore_NumFlagCaptures = enClient.nClientScore_NumFlagCaptures + fMod;
+}
+void UpdateClientStatsScoreAward(entity enClient, float nAwardType, float fMod)
+{ // Update Client Stats Score Award
+	if(nAwardType == CLIENTSCORE_AWARD_NUMJUMPPADS)
+		enClient.nClientScore_Award_NumJumpPads = enClient.nClientScore_Award_NumJumpPads + fMod;
+	else
+	if(nAwardType == CLIENTSCORE_AWARD_SELFDAMAGE)
+		enClient.nClientScore_Award_SelfDamage = enClient.nClientScore_Award_SelfDamage + fMod;
+	else
+	if(nAwardType == CLIENTSCORE_AWARD_FALLINGDAMAGE)
+		enClient.nClientScore_Award_FallingDamage = enClient.nClientScore_Award_FallingDamage + fMod;
+	else
+	if(nAwardType == CLIENTSCORE_AWARD_LIQUIDDAMAGE)
+		enClient.nClientScore_Award_LiquidDamage = enClient.nClientScore_Award_LiquidDamage + fMod;
+	else
+	if(nAwardType == CLIENTSCORE_AWARD_NUMCHARACTERSSPOKEN)
+		enClient.nClientScore_Award_NumCharactersSpoken = enClient.nClientScore_Award_NumCharactersSpoken + fMod;
+	else
+	if(nAwardType == CLIENTSCORE_AWARD_NUMELECTROBALLSFIRED)
+		enClient.nClientScore_Award_NumElectroBallsFired = enClient.nClientScore_Award_NumElectroBallsFired + fMod;
+	else
+	if(nAwardType == CLIENTSCORE_AWARD_NUMTELEPORTS)
+		enClient.nClientScore_Award_NumTeleports = enClient.nClientScore_Award_NumTeleports + fMod;
+	else
+	if(nAwardType == CLIENTSCORE_AWARD_NUMMEGAHEALTHS)
+		enClient.nClientScore_Award_NumMegaHealths = enClient.nClientScore_Award_NumMegaHealths + fMod;
+	else
+	if(nAwardType == CLIENTSCORE_AWARD_CHATDAMAGE)
+		enClient.nClientScore_Award_ChatDamage = enClient.nClientScore_Award_ChatDamage + fMod;
+	else
+	if(nAwardType == CLIENTSCORE_AWARD_NUMHITSBYMORTAR)
+		enClient.nClientScore_Award_NumHitsByMortar = enClient.nClientScore_Award_NumHitsByMortar + fMod;
+	else
+	if(nAwardType == CLIENTSCORE_AWARD_NUMWEAPONSWITCHES)
+		enClient.nClientScore_Award_NumWeaponSwitches = enClient.nClientScore_Award_NumWeaponSwitches + fMod;
+	else
+	if(nAwardType == CLIENTSCORE_AWARD_NUMHURTTRIGGERDEATHS)
+		enClient.nClientScore_Award_NumHurtTriggerDeaths = enClient.nClientScore_Award_NumHurtTriggerDeaths + fMod;
+	else
+	if(nAwardType == CLIENTSCORE_AWARD_NUMWEAPONPICKUPS)
+		enClient.nClientScore_Award_NumWeaponPickups = enClient.nClientScore_Award_NumWeaponPickups + fMod;
+	else
+	if(nAwardType == CLIENTSCORE_AWARD_NUMAMMOPICKUPS)
+		enClient.nClientScore_Award_NumAmmoPickups = enClient.nClientScore_Award_NumAmmoPickups + fMod;
+	else
+	if(nAwardType == CLIENTSCORE_AWARD_HEALTHPICKEDUP)
+		enClient.nClientScore_Award_HealthPickedUp = enClient.nClientScore_Award_HealthPickedUp + fMod;
+	else
+	if(nAwardType == CLIENTSCORE_AWARD_ARMORPICKEDUP)
+		enClient.nClientScore_Award_ArmorPickedUp = enClient.nClientScore_Award_ArmorPickedUp + fMod;
+	else
+	if(nAwardType == CLIENTSCORE_AWARD_RADIUSDAMAGE)
+		enClient.nClientScore_Award_RadiusDamage = enClient.nClientScore_Award_RadiusDamage + fMod;
+	else
+	if(nAwardType == CLIENTSCORE_AWARD_LONGESTNEXSHOT)
+		enClient.nClientScore_Award_LongestNexShot = enClient.nClientScore_Award_LongestNexShot + fMod;
+	else
+	if(nAwardType == CLIENTSCORE_AWARD_NUMCORPSEGIBS)
+		enClient.nClientScore_Award_NumCorpseGibs = enClient.nClientScore_Award_NumCorpseGibs + fMod;
+}
+void CheckAndUpdateClientStatsScores_ItemTouch(entity enClient, entity enItem)
+{ // Check and Update Client Stats Scores - Item Touch
+	// Check for Weapon Pickups
+	if(enItem.flags & FL_WEAPON)
+		UpdateClientStatsScoreAward(enClient, CLIENTSCORE_AWARD_NUMWEAPONPICKUPS, 1);
+		
+	// Check for Ammo Pickups
+	if(enItem.ammo_shells || enItem.ammo_nails || enItem.ammo_rockets || enItem.ammo_cells)
+			UpdateClientStatsScoreAward(enClient, CLIENTSCORE_AWARD_NUMAMMOPICKUPS, 1);
+			
+	// Check for Mega Health Pickups
+	// NOTE: Classsname check necessary in case map authors adjust health
+	if(enItem.items & IT_HEALTH && enItem.netname == "100 Health")
+		UpdateClientStatsScoreAward(enClient, CLIENTSCORE_AWARD_NUMMEGAHEALTHS, 1);
+
+	// Check for Health Pickups
+	if(enItem.max_health)
+		UpdateClientStatsScoreAward(enClient, CLIENTSCORE_AWARD_HEALTHPICKEDUP, enItem.max_health);
+		
+	// Check for Health Cap Pickups
+	if(enItem.health && enClient.health < enClient.max_health)
+		UpdateClientStatsScoreAward(enClient, CLIENTSCORE_AWARD_HEALTHPICKEDUP, min(enClient.health + enItem.health, enClient.max_health) );
+		
+	// Check for Armor Pickups
+	if(enItem.armorvalue)
+		UpdateClientStatsScoreAward(enClient, CLIENTSCORE_AWARD_ARMORPICKEDUP, enItem.armorvalue);
+}
+void CheckAndUpdateClientStatsScores_PlayerDamage(entity enAttacker, entity enReceiver, float nDeathType, float fDamage)
+{ // Check and Update Client Stats Scores - Player Damage
+	if(enReceiver.classname == "player")
+	{ // Valid Player
+		if(nDeathType == WEP_GRENADE_LAUNCHER)
+			UpdateClientStatsScoreAward(enReceiver, CLIENTSCORE_AWARD_NUMHITSBYMORTAR, 1);
+		else
+		if(nDeathType == DEATH_FALL)
+			UpdateClientStatsScoreAward(enReceiver, CLIENTSCORE_AWARD_FALLINGDAMAGE, fDamage);
+		else
+		if(nDeathType == DEATH_DROWN || nDeathType == DEATH_LAVA || nDeathType == DEATH_SLIME)
+			UpdateClientStatsScoreAward(enReceiver, CLIENTSCORE_AWARD_LIQUIDDAMAGE, fDamage);
+	}
+	if(enAttacker.classname == "player" && enReceiver.classname == "player")
+	{ // Valid Player Damage
+		if(enAttacker == enReceiver)
+			// Self Damage
+			UpdateClientStatsScoreAward(enAttacker, CLIENTSCORE_AWARD_SELFDAMAGE, fDamage);
+		else
+		{ // Standard Weapon Damage
+			UpdateClientStatsScore_WeaponDamage(enAttacker, nDeathType, fDamage);
+		
+			// Update Chat Damage (if applicable)
+			if(enReceiver.buttonchat)
+				UpdateClientStatsScoreAward(enAttacker, CLIENTSCORE_AWARD_CHATDAMAGE, fDamage);
+		}
+	}
+}
+void AssignSpecialClientScoreAwardEntityProperties(entity enClientScoreAward, float nCnt)
+{ // Assign Special Client Score Entity Properties
+	local string strScoreLabel;
+	
+	switch(nCnt)
+	{
+		case CLIENTSCORE_AWARD_NUMJUMPPADS:
+			strScoreLabel = "\bJump Pad Evangelist";
+		break;
+		case CLIENTSCORE_AWARD_SELFDAMAGE:
+			strScoreLabel = "\bRolemodel Masochist";
+		break;
+		case CLIENTSCORE_AWARD_FALLINGDAMAGE:
+			strScoreLabel = "\bGround Humper";
+		break;
+		case CLIENTSCORE_AWARD_LIQUIDDAMAGE:
+			strScoreLabel = "\bHostile Liquid Lover";
+		break;
+		case CLIENTSCORE_AWARD_NUMCHARACTERSSPOKEN:
+			strScoreLabel = "\bChattiest Motherfucker";
+		break;
+		case CLIENTSCORE_AWARD_NUMELECTROBALLSFIRED:
+			strScoreLabel = "\bElectro Ball Spewer";
+		break;
+		case CLIENTSCORE_AWARD_NUMTELEPORTS:
+			strScoreLabel = "\bTeleport Fanatic";
+		break;
+		case CLIENTSCORE_AWARD_NUMMEGAHEALTHS:
+			strScoreLabel = "\bMega Health Fanboi";
+		break;
+		case CLIENTSCORE_AWARD_CHATDAMAGE:
+			strScoreLabel = "\bChat Damaging DoucheBag";
+		break;
+		case CLIENTSCORE_AWARD_NUMHITSBYMORTAR:
+			strScoreLabel = "\bMortar Pinball";
+		break;
+		case CLIENTSCORE_AWARD_NUMWEAPONSWITCHES:
+			strScoreLabel = "\bWeapon Switcher";
+		break;
+		case CLIENTSCORE_AWARD_ROCKETWHORE:
+			strScoreLabel = "\bRocket Whore";
+		break;
+		case CLIENTSCORE_AWARD_NUMHURTTRIGGERDEATHS:
+			strScoreLabel = "\bVoid Rapist";
+		break;
+		case CLIENTSCORE_AWARD_NUMWEAPONPICKUPS:
+			strScoreLabel = "\bFirearms Collector";
+		break;
+		case CLIENTSCORE_AWARD_NUMAMMOPICKUPS:
+			strScoreLabel = "\bAmmo Asshole";
+		break;
+		case CLIENTSCORE_AWARD_HEALTHPICKEDUP:
+			strScoreLabel = "\bCreature of Health";
+		break;
+		case CLIENTSCORE_AWARD_ARMORPICKEDUP:
+			strScoreLabel = "\bLord of Armor";
+		break;
+		case CLIENTSCORE_AWARD_RADIUSDAMAGE:
+			strScoreLabel = "\bExplosives Demigod";
+		break;
+		case CLIENTSCORE_AWARD_LONGESTNEXSHOT:
+			strScoreLabel = "\bLongest Nex Shot";
+		break;
+		case CLIENTSCORE_AWARD_NUMCORPSEGIBS:
+			strScoreLabel = "\bCorpse Gibber";
+		break;
+		
+		default:
+			strScoreLabel = "\bUnknown Award";
+		break;
+	}
+	
+	// Assign Label
+	enClientScoreAward.strClientScoreAwardEntity_ScoreLabel = strScoreLabel;
+	// Assign Score ID
+	enClientScoreAward.nClientScoreAwardEntity_ScoreID = nCnt;
+}
+void CheckClientScoreAwardEntityUpdate(entity enClientScoreAward, entity enCheck)
+{ // Check Client Score Award Entity Update
+	local float nCheckValue;
+	
+	switch(enClientScoreAward.nClientScoreAwardEntity_ScoreID)
+	{
+		case CLIENTSCORE_AWARD_NUMJUMPPADS:
+			nCheckValue = enCheck.nClientScore_Award_NumJumpPads;
+		break;
+		case CLIENTSCORE_AWARD_SELFDAMAGE:
+			nCheckValue = enCheck.nClientScore_Award_SelfDamage;
+		break;
+		case CLIENTSCORE_AWARD_FALLINGDAMAGE:
+			nCheckValue = enCheck.nClientScore_Award_FallingDamage;
+		break;
+		case CLIENTSCORE_AWARD_LIQUIDDAMAGE:
+			nCheckValue = enCheck.nClientScore_Award_LiquidDamage;
+		break;
+		case CLIENTSCORE_AWARD_NUMCHARACTERSSPOKEN:
+			nCheckValue = enCheck.nClientScore_Award_NumCharactersSpoken;
+		break;
+		case CLIENTSCORE_AWARD_NUMELECTROBALLSFIRED:
+			nCheckValue = enCheck.nClientScore_Award_NumElectroBallsFired;
+		break;
+		case CLIENTSCORE_AWARD_NUMTELEPORTS:
+			nCheckValue = enCheck.nClientScore_Award_NumTeleports;
+		break;
+		case CLIENTSCORE_AWARD_NUMMEGAHEALTHS:
+			nCheckValue = enCheck.nClientScore_Award_NumMegaHealths;
+		break;
+		case CLIENTSCORE_AWARD_CHATDAMAGE:
+			nCheckValue = enCheck.nClientScore_Award_ChatDamage;
+		break;
+		case CLIENTSCORE_AWARD_NUMHITSBYMORTAR:
+			nCheckValue = enCheck.nClientScore_Award_NumHitsByMortar;
+		break;
+		case CLIENTSCORE_AWARD_NUMWEAPONSWITCHES:
+			nCheckValue = enCheck.nClientScore_Award_NumWeaponSwitches;
+		break;
+		case CLIENTSCORE_AWARD_ROCKETWHORE:
+			// Special Code for Rocket Whore
+			nCheckValue = GetClientStatsScore_WeaponDamageRatio(enCheck, enCheck.nClientScore_WeaponDamage_RocketLauncher);
+		break;
+		case CLIENTSCORE_AWARD_NUMHURTTRIGGERDEATHS:
+			nCheckValue = enCheck.nClientScore_Award_NumHurtTriggerDeaths;
+		break;
+		case CLIENTSCORE_AWARD_NUMWEAPONPICKUPS:
+			nCheckValue = enCheck.nClientScore_Award_NumWeaponPickups;
+		break;
+		case CLIENTSCORE_AWARD_NUMAMMOPICKUPS:
+			nCheckValue = enCheck.nClientScore_Award_NumAmmoPickups;
+		break;
+		case CLIENTSCORE_AWARD_HEALTHPICKEDUP:
+			nCheckValue = enCheck.nClientScore_Award_HealthPickedUp;
+		break;
+		case CLIENTSCORE_AWARD_ARMORPICKEDUP:
+			nCheckValue = enCheck.nClientScore_Award_ArmorPickedUp;
+		break;
+		case CLIENTSCORE_AWARD_RADIUSDAMAGE:
+			// Special Code for Radius Damage
+			nCheckValue = enCheck.nClientScore_Award_RadiusDamage / GetClientStatsScore_TotalWeaponDamage(enCheck);
+		break;
+		case CLIENTSCORE_AWARD_LONGESTNEXSHOT:
+			nCheckValue = enCheck.nClientScore_Award_LongestNexShot;
+		break;
+		case CLIENTSCORE_AWARD_NUMCORPSEGIBS:
+			nCheckValue = enCheck.nClientScore_Award_NumCorpseGibs;
+		break;
+		
+		
+		default:
+			nCheckValue = 0;
+		break;
+	}	
+	
+	if(nCheckValue > enClientScoreAward.nClientScoreAwardEntity_CurrentScore)
+	{ // New Score
+		enClientScoreAward.nClientScoreAwardEntity_CurrentScore = nCheckValue;
+		enClientScoreAward.enClientScoreAwardEntity_CurrentAwardPlayer = enCheck;
+	}
+}
+void SpawnClientScoreAwardEntities()
+{ // Spawn Client Score Award Entities
+	local float nCnt;
+	if(!bClientScoreAwardEntitesSpawned)
+	{ // Entities Not Spawned; Spawn
+		for(nCnt = 0; nCnt < CLIENTSCORE_NUMBEROFAWARDS; nCnt+=1)
+		{
+			// Spawn Entity
+			enClientScoreAwardEntities[nCnt] = spawn();
+			// Assign Effects
+			enClientScoreAwardEntities[nCnt].effects = EF_NODRAW;
+			
+			// Assign Special Score Entity Properties
+			AssignSpecialClientScoreAwardEntityProperties(enClientScoreAwardEntities[nCnt], nCnt);
+		}
+		
+		// Flag Score Entities Spawned
+		bClientScoreAwardEntitesSpawned = TRUE;
+	}
+}
+
+// -------------------------------------------
+// Scoreboard Functions
+
+void PrepareClientScoresSortedArray()
+{ // Prepare Client Scores Sorted Array
+	local entity enPlayerFind;
+	local float nCnt;
+		nCnt = 0;
+	
+	// Insert Players into Array
+	enPlayerFind = find(world, classname, "player");
+	while(enPlayerFind != world)
+	{ // Valid Player
+		// Place Player in Array
+		enClientScores_SortedArray[nCnt] = enPlayerFind;
+		// Inrement Counter
+		nCnt = nCnt + 1;
+		
+		// Acquire Next Player
+		enPlayerFind = find(enPlayerFind, classname, "player");
+	}
+	// Void Latest Entry
+	enClientScores_SortedArray[nCnt] = world;
+	// Assign Array Size
+	enClientScores_SortedArraySize = nCnt;
+	
+	// bprint("Client Scores Array Size : '", ftos(enClientScores_SortedArraySize), "'\n");
+	
+	// -------------------------------------------------------------
+	// SELECTION SORT ARRAY
+		local float nPos;
+		local float nSearchPos;
+		local entity enSwapBackup;
+		local float nHighestElement;
+		local float nHighestElementPos;
+		
+		for(nPos = 0; nPos < enClientScores_SortedArraySize; nPos = nPos + 1)
+		{ // Cycle through Array
+			// Reset Highest Elements
+			nHighestElement = -9999;
+			nHighestElementPos = nPos;
+			
+			// bprint("Main Iteration '", ftos(nPos), "'\n");
+			
+			for(nSearchPos = nPos; nSearchPos < enClientScores_SortedArraySize; nSearchPos = nSearchPos + 1)
+			{ // Acquire Highest Element
+				// bprint("Checking Frags of '", enClientScores_SortedArray[nSearchPos].netname, "'\n");
+				if( stof( GetPlayerScoreString(enClientScores_SortedArray[nSearchPos], 2) ) > nHighestElement)
+				{ // New Highest Element
+					nHighestElement = stof(GetPlayerScoreString(enClientScores_SortedArray[nSearchPos], 2));
+					nHighestElementPos = nSearchPos;
+					
+					// bprint("Found New Highest Element '", ftos(nHighestElement), "' at Position '", ftos(nHighestElementPos), "'\n");
+				}
+			}
+			
+			// Perform Swap
+			// Backup Current First Value
+			enSwapBackup = enClientScores_SortedArray[nPos];
+			// bprint("Swap Backup Name : ", enSwapBackup.netname, "\n");
+			// Swap
+			enClientScores_SortedArray[nPos] = enClientScores_SortedArray[nHighestElementPos];
+			enClientScores_SortedArray[nHighestElementPos] = enSwapBackup;
+			
+			// bprint("POST Swap Backup Name : ", enSwapBackup.netname, "\n");
+		}
+	
+}
+
+string AppendRowElement(string strMessage, string strRowElement, float nAlignment, float nColumnSize, float bUseColors)
+{ // Append Row Element
+	local float nSpacingCnt;
+	local float nSpacingNeeded;
+	
+	// Calculate Spacing Needed
+	if(bUseColors)
+	{ // Retain Color
+		nSpacingNeeded = nColumnSize - (strlennocol(strRowElement));
+	}
+	else
+	{ // Kill Color; Utilize Simple Length
+		strRowElement = strdecolorize(strRowElement);
+		nSpacingNeeded = nColumnSize - (strlen(strRowElement));
+	}
+		
+	// Check for Negative Spacing (Padding)
+	if(nSpacingNeeded < 1)
+	{ // Utilize Substring of Row Element
+		strRowElement = substring(strRowElement, 0, nColumnSize - 4);
+		nSpacingNeeded = 4;
+	}
+	
+	if(nAlignment == CLIENTSCORE_ALIGNMENT_RIGHT)
+	{ // Left Alignment
+		// Append Spacing
+		for(nSpacingCnt = 0; nSpacingCnt < nSpacingNeeded; nSpacingCnt+=1)
+			strMessage = strcat(strMessage, " ");
+	}
+	// Append Content
+	strMessage = strcat(strMessage, strRowElement);
+	if(nAlignment == CLIENTSCORE_ALIGNMENT_LEFT)
+	{ // Right Alignment
+		// Append Spacing
+		for(nSpacingCnt = 0; nSpacingCnt < nSpacingNeeded; nSpacingCnt+=1)
+			strMessage = strcat(strMessage, " ");
+	}
+	
+	// Return Appended String
+	return strMessage;
+}
+
+string AppendClientScoringRow(string strMessage, entity enPlayer, float nScorePlace)
+{ // Append Client Scoring Row	
+	// Append Return
+	strMessage = strcat(strMessage, "\n");
+	
+	local string strElement;
+	local float nShift;
+	local float bUseColors;
+		nShift = 0;
+		bUseColors = TRUE;
+	
+	// Name
+	strElement = enPlayer.netname;
+	strMessage = AppendRowElement(strMessage, strElement, CLIENTSCORE_ALIGNMENT_LEFT, CLIENTSCORE_COLUMNWIDTH_1, bUseColors);
+	
+	// Ping
+	if( clienttype(enPlayer) == CLIENTTYPE_BOT)
+		strElement = "^7BOT";
+	else
+		strElement = strcat("^7", ftos( rint(enPlayer.ping) ) );
+	strMessage = AppendRowElement(strMessage, strElement, CLIENTSCORE_ALIGNMENT_LEFT, CLIENTSCORE_COLUMNWIDTH_2, bUseColors);
+	
+	// Time
+	local string strTime;
+		strTime = GetFormattedTimeStringZoned(time - enPlayer.tClientScore_BeginPlayTime);
+	strElement = strcat("^7", strTime);
+	strMessage = AppendRowElement(strMessage, strElement, CLIENTSCORE_ALIGNMENT_LEFT, CLIENTSCORE_COLUMNWIDTH_3, bUseColors);
+	
+	// Unzone Time
+	strunzone(strTime);
+	
+	// Score
+	strElement = strcat("^7", GetPlayerScoreString(enPlayer, 2) );
+	strMessage = AppendRowElement(strMessage, strElement, CLIENTSCORE_ALIGNMENT_LEFT, CLIENTSCORE_COLUMNWIDTH_4, bUseColors);
+	
+	// Kills
+	strElement = strcat("^7", ftos(enPlayer.nClientScore_NumKills) );
+	strMessage = AppendRowElement(strMessage, strElement, CLIENTSCORE_ALIGNMENT_LEFT, CLIENTSCORE_COLUMNWIDTH_5, bUseColors);
+	
+	// Deaths
+	strElement = strcat("^7", ftos(enPlayer.nClientScore_NumDeaths) );
+	strMessage = AppendRowElement(strMessage, strElement, CLIENTSCORE_ALIGNMENT_LEFT, CLIENTSCORE_COLUMNWIDTH_6, bUseColors);
+	
+	if( cvar("g_ctf") )
+	{ // CTF Enabled
+		// Flag Captures
+		strElement = strcat("^7", ftos(enPlayer.nClientScore_NumFlagCaptures) );
+		strMessage = AppendRowElement(strMessage, strElement, CLIENTSCORE_ALIGNMENT_LEFT, CLIENTSCORE_COLUMNWIDTH_7_CTF, bUseColors);
+	}
+	else
+	{ // Non-CTF
+		// Jumps
+		strElement = strcat("^7", ftos(enPlayer.nClientScore_NumJumps) );
+		strMessage = AppendRowElement(strMessage, strElement, CLIENTSCORE_ALIGNMENT_LEFT, CLIENTSCORE_COLUMNWIDTH_7, bUseColors);
+	}
+	
+	// Favorite Weapon
+	strElement = strcat("^7", GetClientStatsScore_MostDamagingWeapon(enPlayer) );
+	strMessage = AppendRowElement(strMessage, strElement, CLIENTSCORE_ALIGNMENT_LEFT, CLIENTSCORE_COLUMNWIDTH_8, bUseColors);
+	
+	// Return Appended String
+	return strMessage;
+}
+
+string AppendClientScoringRowHeaders(string strMessage)
+{ // Append Client Scoring Row Headers	
+	// Append Return
+	strMessage = strcat(strMessage, "\n^2");
+	
+	local float bUseNoColorLength;
+		bUseNoColorLength = FALSE;
+		
+	strMessage = AppendRowElement(strMessage, CLIENTSCORE_COLUMNNAME_1, CLIENTSCORE_ALIGNMENT_LEFT, CLIENTSCORE_COLUMNWIDTH_1, bUseNoColorLength);
+	strMessage = AppendRowElement(strMessage, CLIENTSCORE_COLUMNNAME_2, CLIENTSCORE_ALIGNMENT_LEFT, CLIENTSCORE_COLUMNWIDTH_2, bUseNoColorLength);
+	strMessage = AppendRowElement(strMessage, CLIENTSCORE_COLUMNNAME_3, CLIENTSCORE_ALIGNMENT_LEFT, CLIENTSCORE_COLUMNWIDTH_3, bUseNoColorLength);
+	strMessage = AppendRowElement(strMessage, CLIENTSCORE_COLUMNNAME_4, CLIENTSCORE_ALIGNMENT_LEFT, CLIENTSCORE_COLUMNWIDTH_4, bUseNoColorLength);
+	strMessage = AppendRowElement(strMessage, CLIENTSCORE_COLUMNNAME_5, CLIENTSCORE_ALIGNMENT_LEFT, CLIENTSCORE_COLUMNWIDTH_5, bUseNoColorLength);
+	strMessage = AppendRowElement(strMessage, CLIENTSCORE_COLUMNNAME_6, CLIENTSCORE_ALIGNMENT_LEFT, CLIENTSCORE_COLUMNWIDTH_6, bUseNoColorLength);
+	
+	if( cvar("g_ctf") )
+	{ // CTF Enabled
+		strMessage = AppendRowElement(strMessage, CLIENTSCORE_COLUMNNAME_7_CTF, CLIENTSCORE_ALIGNMENT_LEFT, CLIENTSCORE_COLUMNWIDTH_7_CTF, bUseNoColorLength);
+	}
+	else
+	{ // Non-CTF
+		strMessage = AppendRowElement(strMessage, CLIENTSCORE_COLUMNNAME_7, CLIENTSCORE_ALIGNMENT_LEFT, CLIENTSCORE_COLUMNWIDTH_7, bUseNoColorLength);
+	}
+	strMessage = AppendRowElement(strMessage, CLIENTSCORE_COLUMNNAME_8, CLIENTSCORE_ALIGNMENT_LEFT, CLIENTSCORE_COLUMNWIDTH_8, bUseNoColorLength);
+	
+	// Append Color Code Removal
+	strMessage = strcat(strMessage, "^7");
+	
+	// Return New String
+	return strMessage;
+}
+string AppendAwardScore(string strMessage, string strAwardText, entity enAwardPlayer, float bUseColors)
+{ // Append Award Score
+	local float nSpacingNeeded;
+	local float nSpacingCnt;
+	
+	// Append Return(s)
+	strMessage = strcat(strMessage, "\n^7\n");
+	
+	// Acquire Player Name
+	local float bStringZoned;
+		bStringZoned = FALSE;
+	local string strPlayerName;
+	if(enAwardPlayer)
+	{
+		if(bUseColors)
+			strPlayerName = strzone(enAwardPlayer.netname);
+		else			
+			strPlayerName = strzone( strdecolorize(enAwardPlayer.netname) );
+		bStringZoned = TRUE;
+	}
+	else
+		strPlayerName = "N/A";
+	
+	// Calculate Award Text Spacing Needed
+	nSpacingNeeded = CLIENTSCORE_AWARDSTRING_WIDTH - strlen(strAwardText);
+	
+	// DEBUG
+	// bprint( strcat("Spacing Needed for '", strAwardText, "' : ", ftos(nSpacingNeeded), "\n" ) );
+	
+	for(nSpacingCnt = 0; nSpacingCnt < nSpacingNeeded; nSpacingCnt+=1)
+		// Append Space
+		strMessage = strcat(strMessage, " ");
+	
+	// Append Award Text
+	strMessage = strcat(strMessage, "^3", strAwardText, "^7");
+	
+	// Append Separator
+	strMessage = strcat(strMessage, " : ");
+		
+	// Calculate Award Text Spacing Needed
+	if(bUseColors)
+		nSpacingNeeded = CLIENTSCORE_PLAYERNAMESTRING_WIDTH - strlennocol(strPlayerName);
+	else
+		nSpacingNeeded = CLIENTSCORE_PLAYERNAMESTRING_WIDTH - strlen(strPlayerName);
+		
+	// Append Award Player
+	strMessage = strcat(strMessage, strPlayerName);
+	
+	for(nSpacingCnt = 0; nSpacingCnt < nSpacingNeeded; nSpacingCnt+=1)
+		// Append Space
+		strMessage = strcat(strMessage, " ");
+		
+	// Free String
+	if(bStringZoned)
+		strunzone(strPlayerName);
+	
+	// Return Modified Message
+	return strMessage;
+}
+string AppendClientScoringAwards(string strMessage, float nNumAwardsDisplay)
+{ // Append Client Scoring Awards
+	local entity enPlayerFind;
+	
+	// NEW SYSTEM
+	local float nCnt;
+	
+	// Reset Current Entities
+	for(nCnt = 0; nCnt < CLIENTSCORE_NUMBEROFAWARDS; nCnt+=1)
+	{ // Cycle through Awards
+		// Reset Award Already Displayed
+		enClientScoreAwardEntities[nCnt].bClientScoreAwardEntity_AwardAlreadyDisplayed = FALSE;
+		// Reset Linked List Next / Previous Entities
+		enClientScoreAwardEntities[nCnt].enClientScoreAwardEntity_LinkedList_NextAwardEntity = world;
+		enClientScoreAwardEntities[nCnt].enClientScoreAwardEntity_LinkedList_PreviousAwardEntity = world;
+		
+		// Reset Score and Award Player
+		enClientScoreAwardEntities[nCnt].nClientScoreAwardEntity_CurrentScore = 0;
+		enClientScoreAwardEntities[nCnt].enClientScoreAwardEntity_CurrentAwardPlayer = world;
+	}
+	
+	// Acquire First Player
+	enPlayerFind = find(world, classname, "player");
+	while(enPlayerFind != world)
+	{ // Valid Player
+		for(nCnt = 0; nCnt < CLIENTSCORE_NUMBEROFAWARDS; nCnt+=1)
+		{ // Cycle through Awards
+			// Check for Score Update
+			CheckClientScoreAwardEntityUpdate(enClientScoreAwardEntities[nCnt], enPlayerFind);
+		}
+		// Acquire Next Player
+		enPlayerFind = find(enPlayerFind, classname, "player");
+	}
+	
+	// Print Separator
+	strMessage = strcat(strMessage, "\n^5\b----------------------------------------------------------------------------------\n\n");
+	// Print Header Line
+	if(nNumAwardsDisplay == -1)
+		strMessage = strcat(strMessage, "^5\bSPECIAL AWARDS (DISPLAYING \bALL\b AWARDS)\n");
+	else
+		strMessage = strcat(strMessage, "^5\bSPECIAL AWARDS (DISPLAYING ", ftos(nNumAwardsDisplay), "\b of ", ftos(CLIENTSCORE_NUMBEROFAWARDS), "\b AWARDS)\n");
+	
+	if(nNumAwardsDisplay == -1 || nNumAwardsDisplay >= CLIENTSCORE_NUMBEROFAWARDS)
+	{ // Display All Awards
+		for(nCnt = 0; nCnt < CLIENTSCORE_NUMBEROFAWARDS; nCnt+=1)
+		{ // Cycle through Awards
+			strMessage = AppendAwardScore(strMessage, enClientScoreAwardEntities[nCnt].strClientScoreAwardEntity_ScoreLabel, enClientScoreAwardEntities[nCnt].enClientScoreAwardEntity_CurrentAwardPlayer, TRUE);
+		}
+	}
+	else
+	{ // Random Awards to Display
+		// LINKED LIST SYSTEM
+		local entity enHead;
+		local entity enCurrent;
+		local entity enPrevious;
+		local float nNumLinkedEntities;
+		local float nRandom;
+		
+		// *****************************************
+		// Prepare Linked List
+			for(nCnt = 0; nCnt < CLIENTSCORE_NUMBEROFAWARDS; nCnt+=1)
+			{ // Cycle through Awards
+				if(enClientScoreAwardEntities[nCnt].enClientScoreAwardEntity_CurrentAwardPlayer)
+				{ // Valid Award
+					if(!enHead)
+					{ // Assign Head Entity
+						enHead = enClientScoreAwardEntities[nCnt];
+						enCurrent = enHead;
+					}
+						
+					// Assign Next Award Entity
+					enCurrent.enClientScoreAwardEntity_LinkedList_NextAwardEntity = enClientScoreAwardEntities[nCnt];
+					// Backup Current
+					enPrevious = enCurrent;
+					// Assign New Current
+					enCurrent = enClientScoreAwardEntities[nCnt];
+					// Assign Previous
+					enCurrent.enClientScoreAwardEntity_LinkedList_PreviousAwardEntity = enPrevious;
+					// Increment Number of Linked Entities
+					nNumLinkedEntities = nNumLinkedEntities + 1;
+				}
+			}
+			
+			// End of List; Loop to Front
+			if(nNumLinkedEntities)
+			{
+				enCurrent.enClientScoreAwardEntity_LinkedList_NextAwardEntity = enHead;
+				// Assign Head Previous
+				enHead.enClientScoreAwardEntity_LinkedList_PreviousAwardEntity = enCurrent;
+			}
+		// *****************************************
+		
+		// DEBUG - Display Linked List Contents
+		/*
+		enCurrent = enHead;
+		local string strLinkedPrint;
+		for(nCnt = 0; nCnt < nNumLinkedEntities; nCnt+=1)
+		{
+			strLinkedPrint = strcat("Linked List ", ftos(nCnt), " : ", enCurrent.enClientScoreAwardEntity_LinkedList_PreviousAwardEntity.strClientScoreAwardEntity_ScoreLabel, " <- ");
+			strLinkedPrint = strcat(strLinkedPrint, enCurrent.strClientScoreAwardEntity_ScoreLabel, " -> ", enCurrent.enClientScoreAwardEntity_LinkedList_NextAwardEntity.strClientScoreAwardEntity_ScoreLabel, "\n");
+			bprint(strLinkedPrint);
+			enCurrent = enCurrent.enClientScoreAwardEntity_LinkedList_NextAwardEntity;
+		}
+		*/
+		
+		if(nNumLinkedEntities < nNumAwardsDisplay)
+			// Linked Entity Count Less than Desired; Display All
+			nNumAwardsDisplay = nNumLinkedEntities;
+			
+		local float nLinkPosCnt;
+			
+		for(nCnt = 0; nCnt < nNumAwardsDisplay; nCnt+=1)
+		{ // Display Awards
+			// Acquire Random Number
+			nRandom = rint( random() * (nNumLinkedEntities) );
+			
+			// Assign Current to Head
+			enCurrent = enHead;
+			
+			// DEBUG
+			// bprint("Random Linked List Acquisition : ", ftos(nRandom), "\n");
+			
+			for(nLinkPosCnt = 0; nLinkPosCnt < nRandom; nLinkPosCnt+=1)
+			{ // Acquire Linked List Entity
+				// Acquire Next Entity
+				enCurrent = enCurrent.enClientScoreAwardEntity_LinkedList_NextAwardEntity;
+			}
+				
+			// Display Award
+			strMessage = AppendAwardScore(strMessage, enCurrent.strClientScoreAwardEntity_ScoreLabel, enCurrent.enClientScoreAwardEntity_CurrentAwardPlayer, TRUE);
+			
+			// Decrement Number of Linked Entities
+			nNumLinkedEntities = nNumLinkedEntities - 1;
+			
+			if(nNumLinkedEntities)
+			{ // Shift Linked List
+				enCurrent.enClientScoreAwardEntity_LinkedList_PreviousAwardEntity.enClientScoreAwardEntity_LinkedList_NextAwardEntity = enCurrent.enClientScoreAwardEntity_LinkedList_NextAwardEntity;
+				enCurrent.enClientScoreAwardEntity_LinkedList_NextAwardEntity.enClientScoreAwardEntity_LinkedList_PreviousAwardEntity = enCurrent.enClientScoreAwardEntity_LinkedList_PreviousAwardEntity;
+				
+				if(enCurrent == enHead)
+					enHead = enHead.enClientScoreAwardEntity_LinkedList_NextAwardEntity;
+			}
+		}
+		
+		// RANDOM ARRAY SYSTEM
+		/*
+		local float bNotFound;
+		local float nRandom;
+		local float nSanityCheck;
+		local float nInvalidAwardCnt;
+		
+		for(nCnt = 0; nCnt < nNumAwardsDisplay; nCnt+=1)
+		{ // Append Awards
+			// Reset Not Found
+			bNotFound = TRUE;
+			// Reset Sanity Check
+			nSanityCheck = 0;
+			
+			while(bNotFound)
+			{ // Find New Award
+				// Increment Sanity Check
+				nSanityCheck = nSanityCheck + 1;
+				
+				// Acquire Random Number
+				nRandom = rint( random() * (CLIENTSCORE_NUMBEROFAWARDS - 1) );
+				
+				if( !enClientScoreAwardEntities[nRandom].bClientScoreAwardEntity_AwardAlreadyDisplayed)
+				{ // New Award Found
+					// Flag Award Already Displayed
+					enClientScoreAwardEntities[nRandom].bClientScoreAwardEntity_AwardAlreadyDisplayed = TRUE;
+					
+					if(enClientScoreAwardEntities[nRandom].enClientScoreAwardEntity_CurrentAwardPlayer)
+					{ // Valid Award Player
+						// Display Award
+						strMessage = AppendAwardScore(strMessage, enClientScoreAwardEntities[nRandom].strClientScoreAwardEntity_ScoreLabel, enClientScoreAwardEntities[nRandom].enClientScoreAwardEntity_CurrentAwardPlayer);
+						
+						// Assign Found
+						bNotFound = FALSE;
+					}
+					else
+					{ // Invalid Award Player
+						// Increment Invalid Award Count
+						nInvalidAwardCnt = nInvalidAwardCnt + 1;
+					}
+				}
+				
+				// Check for Potential Overflow due to more invalid awards than possible to display
+				if( (nInvalidAwardCnt + nCnt) > (CLIENTSCORE_NUMBEROFAWARDS - 1) )
+				{ // Awards Overflowed; Stop
+					// Assign not Found
+					bNotFound = FALSE;
+					// End Loop
+					nCnt = nNumAwardsDisplay;
+				}
+				
+				// Check Sanity
+				if(nSanityCheck > 200)
+				{ // Sanity Failed!
+					bprint("^1WARNING : ^2AppendClientScoringAwards^7 Loop Failed Sanity!\n");
+					bNotFound = FALSE;
+				}
+			}
+		}
+		*/
+	}
+	
+	/*
+	// Self Damage Award
+	local entity enCurrentAwardPlayer_SelfDamage;
+	local float nCurrentMax_SelfDamage;
+	// Num Jump Pads Award
+	local entity enCurrentAwardPlayer_NumJumpPads;
+	local float nCurrentMax_NumJumpPads;
+	// Rocket Damage Ratio Award
+	local float nRocketDamageRatio;
+	local entity enCurrentAwardPlayer_RocketDamageRatio;
+	local float nCurrentMax_RocketDamageRatio;
+	// Electro Balls Fired Award
+	local entity enCurrentAwardPlayer_ElectroBallsFired;
+	local float nCurrentMax_ElectroBallsFired;
+	// Num Teleports Award
+	local entity enCurrentAwardPlayer_NumTeleports;
+	local float nCurrentMax_NumTeleports;
+	// Num Says Award
+	local entity enCurrentAwardPlayer_NumSays;
+	local float nCurrentMax_NumSays;
+	// Num Mega Healths Award
+	local entity enCurrentAwardPlayer_NumMegaHealths;
+	local float nCurrentMax_NumMegaHealths;
+	// Num Chat Kills Award
+	local entity enCurrentAwardPlayer_NumChatKills;
+	local float nCurrentMax_NumChatKills;
+	// Num Hits by Mortar Award
+	local entity enCurrentAwardPlayer_NumHitsByMortar;
+	local float nCurrentMax_NumHitsByMortar;
+	
+	// Acquire Awards through single loop for performance reasons
+	
+	// Acquire First Player
+	enPlayerFind = find(world, classname, "player");
+	while(enPlayerFind != world)
+	{ // Valid Player
+		// Check Self Damage
+		if(enPlayerFind.nClientScore_SelfDamage > nCurrentMax_SelfDamage)
+		{ // New Score
+			nCurrentMax_SelfDamage = enPlayerFind.nClientScore_SelfDamage;
+			enCurrentAwardPlayer_SelfDamage = enPlayerFind;
+		}
+		
+		// Check Num Jump Pads
+		if(enPlayerFind.nClientScore_NumJumpPads > nCurrentMax_NumJumpPads)
+		{ // New Score
+			nCurrentMax_NumJumpPads = enPlayerFind.nClientScore_NumJumpPads;
+			enCurrentAwardPlayer_NumJumpPads = enPlayerFind;
+		}
+		
+		// Check Rocket Damage Ratio
+		nRocketDamageRatio = GetClientStatsScore_WeaponDamageRatio(enPlayerFind, enPlayerFind.nClientScore_WeaponDamage_RocketLauncher);
+		if(nRocketDamageRatio > nCurrentMax_RocketDamageRatio)
+		{ // New Score
+			nCurrentMax_RocketDamageRatio = nRocketDamageRatio;
+			enCurrentAwardPlayer_RocketDamageRatio = enPlayerFind;
+		}
+		
+		// Check Electro Balls Fired
+		if(enPlayerFind.nClientScore_NumElectroBallsFired > nCurrentMax_ElectroBallsFired)
+		{ // New Score
+			nCurrentMax_ElectroBallsFired = enPlayerFind.nClientScore_NumElectroBallsFired;
+			enCurrentAwardPlayer_ElectroBallsFired = enPlayerFind;
+		}
+		
+		// Check Num Teleports
+		if(enPlayerFind.nClientScore_NumTeleports > nCurrentMax_NumTeleports)
+		{ // New Score
+			nCurrentMax_NumTeleports = enPlayerFind.nClientScore_NumTeleports;
+			enCurrentAwardPlayer_NumTeleports = enPlayerFind;
+		}
+		
+		// Check Num Mega Healths
+		if(enPlayerFind.nClientScore_NumMegaHealths > nCurrentMax_NumMegaHealths)
+		{ // New Score
+			nCurrentMax_NumMegaHealths = enPlayerFind.nClientScore_NumMegaHealths;
+			enCurrentAwardPlayer_NumMegaHealths = enPlayerFind;
+		}
+		
+		// Check Num Says
+		if(enPlayerFind.nClientScore_NumSays > nCurrentMax_NumSays)
+		{ // New Score
+			nCurrentMax_NumSays = enPlayerFind.nClientScore_NumSays;
+			enCurrentAwardPlayer_NumSays = enPlayerFind;
+		}
+		
+		// Check Num Chat Kills
+		if(enPlayerFind.nClientScore_NumChatKills > nCurrentMax_NumChatKills)
+		{ // New Score
+			nCurrentMax_NumChatKills = enPlayerFind.nClientScore_NumChatKills;
+			enCurrentAwardPlayer_NumChatKills = enPlayerFind;
+		}
+		
+		// Check Num Hits by Mortar
+		if(enPlayerFind.nClientScore_NumHitsByMortar > nCurrentMax_NumHitsByMortar)
+		{ // New Score
+			nCurrentMax_NumHitsByMortar = enPlayerFind.nClientScore_NumHitsByMortar;
+			enCurrentAwardPlayer_NumHitsByMortar = enPlayerFind;
+		}
+		
+		// Acquire Next Player
+		enPlayerFind = find(enPlayerFind, classname, "player");
+	}
+	
+	// Print Separator
+	strMessage = strcat(strMessage, "\n^5\b---------------------------------------------------------------------------\n\n");
+	// Print Header Line
+	strMessage = strcat(strMessage, "^5\bSPECIAL AWARDS\n");
+	
+	
+	// Print Awards
+	strMessage = AppendAwardScore(strMessage, "\bRolemodel Masochist", enCurrentAwardPlayer_SelfDamage);
+	strMessage = AppendAwardScore(strMessage, "\bJump Pad Evangelist", enCurrentAwardPlayer_NumJumpPads);
+	strMessage = AppendAwardScore(strMessage, "\bChatKill DoucheBag", enCurrentAwardPlayer_NumChatKills);
+	strMessage = AppendAwardScore(strMessage, "\bRocket Whore", enCurrentAwardPlayer_RocketDamageRatio);
+	strMessage = AppendAwardScore(strMessage, "\bElectro Ball Spewer", enCurrentAwardPlayer_ElectroBallsFired);
+	strMessage = AppendAwardScore(strMessage, "\bMortar Pinball", enCurrentAwardPlayer_NumHitsByMortar);
+	strMessage = AppendAwardScore(strMessage, "\bMega Health Fanboi", enCurrentAwardPlayer_NumMegaHealths);
+	strMessage = AppendAwardScore(strMessage, "\bTeleport Fanatic", enCurrentAwardPlayer_NumTeleports);
+	strMessage = AppendAwardScore(strMessage, "\bChattiest Motherfucker", enCurrentAwardPlayer_NumSays);
+	
+	*/
+	
+	// Return Message
+	return strMessage;
+}
+void PrintClientScoring(entity enPlayer, float bIntermission)
+{ // Print Client Scoring
+	local string strMessage;
+
+	// Print Title
+	strMessage = "^5\bSPIDFLISK CLIENT SCORING\n";
+	// Print Sorting Method
+	strMessage = strcat(strMessage, "\n");
+	// strMessage = strcat(strMessage, "SORTED BY FRAGS\n");
+	
+	// Print Row Headers
+	strMessage = AppendClientScoringRowHeaders(strMessage);
+	
+	// Append Return
+	strMessage = strcat(strMessage, "\n");
+	
+	// Print Client Rows
+	
+	// Utilize Sorted Array
+	local float nCnt;
+	
+	// Prepare Sorted Array
+	PrepareClientScoresSortedArray();
+	
+	// Determine Number of Returns
+	local string strReturns;
+	if(enClientScores_SortedArraySize > 5)
+		strReturns = "\n^7";
+	else
+		strReturns = "\n^7";
+		// strReturns = "\n^7\n";
+	
+	for(nCnt = 0; nCnt < enClientScores_SortedArraySize; nCnt = nCnt + 1)
+	{ // Cycle through Sorted Array
+		// Append Client Scoring Raw
+		strMessage = AppendClientScoringRow(strMessage, enClientScores_SortedArray[nCnt], nCnt + 1);
+		
+		// Append Return(s)
+		strMessage = strcat(strMessage, strReturns);
+	}
+	
+	// Acquire Number of Awards to Display
+	local float nNumAwardsDisplay;
+		nNumAwardsDisplay = cvar(CVAR_INTERMISSION_ADVANCEDCLIENTSCORES_NUMBEROFAWARDSTODISPLAY);
+	
+	// Append Awards
+	if(nNumAwardsDisplay != 0)
+		strMessage = AppendClientScoringAwards(strMessage, nNumAwardsDisplay);
+	
+	// Utilize Standard Searching
+	/*
+	local entity enPlayerFind;
+	// Acquire First Player
+	enPlayerFind = find(world, classname, "player");
+	while(enPlayerFind != world)
+	{ // Valid Player
+		// Append Client Scoring Raw
+		strMessage = AppendClientScoringRow(strMessage, enPlayerFind);
+		
+		// Append Two Returns
+		strMessage = strcat(strMessage, "\n^7\n");
+		
+		// Acquire Next Player
+		enPlayerFind = find(enPlayerFind, classname, "player");
+	}
+	*/
+	
+	// Display to Entity
+	if(bIntermission)
+		WriteString(MSG_ALL, strMessage);
+	else
+	{
+		// Centerprint
+		centerprint(enPlayer, strMessage);
+		// Play Sound
+		stuffcmd(enPlayer, "play2 sound/misc/menu2\n");
+	}
+}
\ No newline at end of file
Index: server/Dresk_GoreCorpses.qc
===================================================================
--- server/Dresk_GoreCorpses.qc	(revision 0)
+++ server/Dresk_GoreCorpses.qc	(revision 0)
@@ -0,0 +1,706 @@
+// DRESK - Gore and Corpses
+// Provides Functions for Gore and Corpses
+
+// Player Damage Bloodshower
+#define PLAYERDAMAGE_BLOODSHOWER_PARTICLEMULTIPLIER							7
+#define PLAYERDAMAGE_BLOODSHOWER_MAXPARTICLES								1000
+
+// Fields
+// Support Suppress Corpse Gib
+.float nSuppressCorpseGibCnt;
+// Number of Corpse Bounces
+.float nNumCorpseBounces;
+.float bRemoveCorpseOnCopy;
+float nexballTime;
+
+// Functions
+float CheckSpidfliskSelfDeathMessage(entity enVictim, float nDeathType)
+{ // Check Spidflisk Self Death Message
+	local float bReturn;
+	bReturn = TRUE;
+	
+	if (nDeathType == WEP_GRENADE_LAUNCHER)
+		bprint (enVictim.netname, "^1 ate ", GetPlayerModelSexVerbiage(enVictim, "his"), " own mortar\n");
+	else if (nDeathType == WEP_ELECTRO)
+		bprint (enVictim.netname, "^1 sucked on ", GetPlayerModelSexVerbiage(enVictim, "his"), " own electro\n");
+	else if (nDeathType == WEP_ROCKET_LAUNCHER)
+		bprint (enVictim.netname, "^1 raped ", GetPlayerModelSexVerbiage(enVictim, "himself"), " with a rocket\n");
+	else if(nDeathType == WEP_HAGAR)
+		bprint (enVictim.netname, "^1 poetically pummeled ", GetPlayerModelSexVerbiage(enVictim, "himself"), "\n");
+	else if(nDeathType == WEP_CRYLINK)
+		bprint (enVictim.netname, "^1 proliferated ", GetPlayerModelSexVerbiage(enVictim, "himself"), " with energy\n");
+	else if(nDeathType == WEP_LASER)
+	{
+		bprint (enVictim.netname, "^1 toasted ", GetPlayerModelSexVerbiage(enVictim, "himself"), " with ");
+		bprint (GetPlayerModelSexVerbiage(enVictim, "his"), " own laser\n");
+	}
+	else if (nDeathType == DEATH_KILL)
+		bprint (enVictim.netname, "^1 ended ", GetPlayerModelSexVerbiage(enVictim, "his"), " own life through suicide\n");
+	else if (nDeathType == DEATH_CAMP)
+		bprint (enVictim.netname, "^1 thought ", GetPlayerModelSexVerbiage(enVictim, "he"), " found a nice camping ground\n");
+	else
+		// No Death Message Used
+		bReturn = FALSE;
+		
+	return bReturn;
+}
+float CheckSpidfliskDeathMessage(entity enAttacker, entity enVictim, float nDeathType)
+{ // Check Spidflisk Death Message
+	local float bReturn;
+	local string s, a;
+		bReturn = TRUE;
+	a = enAttacker.netname;
+	s = enVictim.netname;
+	
+	if (nDeathType == WEP_LASER)
+		bprint("^1", s, "^1 was laser-fried by ", a, "\n");
+	else if (nDeathType == WEP_SHOTGUN)
+		bprint ("^1", s,"^1 was gunned down by ", a, "\n");
+	else if (nDeathType == WEP_GRENADE_LAUNCHER)
+		bprint ("^1", s,"^1 was mortared by ", a, "\n");
+	else if (nDeathType == WEP_ELECTRO)
+		bprint ("^1", s,"^1 was electrified by ", a, "\n");
+	else if (nDeathType == WEP_CRYLINK)
+		bprint ("^1", s,"^1 ate a face full of energized jizz from ", a, "\n");
+	else if (nDeathType == WEP_NEX)
+		bprint ("^1", s,"^1 was railed by ", a, "\n");
+	else if (nDeathType == WEP_ROCKET_LAUNCHER)
+		bprint ("^1", s,"^1 was rocket-raped by ", a, "\n");
+	else if (nDeathType == DEATH_FALL)
+	{
+		bprint ("^1",s,"^1 had ", GetPlayerModelSexVerbiage(enVictim, "his"), " legs cracked into ");
+		bprint(GetPlayerModelSexVerbiage(enVictim, "his"), " chest by ", a, "\n");
+	}
+	else if (nDeathType == DEATH_HURTTRIGGER)
+		bprint ("^1", s,"^1 was ejected from the Garden of Eden by ", a, "\n");
+	else if (nDeathType == DEATH_DEATHSPECTRETOUCH)
+		bprint ("^1", s,"^1 succumbed to the Death Spectre's Touch of ", a, "\n");
+	else if (nDeathType == DEATH_DEATHSPECTREFLAMINGSKULL)
+		bprint ("^1", s,"^1 was exploded by a flaming skull summoned by ", a, "\n");
+	else if (nDeathType == DEATH_GHOSTNEXBALL)
+		bprint ("^1", s,"^1 found that succer really does sock by ", a, "\n");	
+	else if (nDeathType == DEATH_LAVA)
+		bprint ("^1", s,"^1 was forcibly thrown into lava by ", a, "\n");
+	else if (nDeathType == DEATH_DROWN)
+		bprint ("^1", s,"^1 drowned due to the actions of ", a, "\n");
+	else if (nDeathType == DEATH_SLIME)
+		bprint ("^1", s,"^1 was denied exit from the slime due to ", a, "\n");
+	else
+		// No Death Message Used
+		bReturn = FALSE;
+	/*
+	if(bReturn)
+	{ // Append Attacker Name
+		bprint("^7", enAttacker.netname, "\n");
+	}
+	*/
+		
+	return bReturn;
+}
+float CheckSpidfliskWorldDeathMessage(entity enVictim, entity enWorldAttacker, float nDeathType)
+{ // Check Spidflisk World Death Message
+	local float bReturn;
+		bReturn = TRUE;
+		
+	if (nDeathType == DEATH_FALL)
+	{
+		bprint (enVictim.netname, "^1 forced ", GetPlayerModelSexVerbiage(enVictim, "his"), " legs into ");
+		bprint ( GetPlayerModelSexVerbiage(enVictim, "his"), " chest\n");
+	}
+	else if (nDeathType == DEATH_SLIME)
+		bprint (enVictim.netname, "^1 drew ", GetPlayerModelSexVerbiage(enVictim, "his"), " last breath in the slime\n");
+	else if (nDeathType == DEATH_LAVA)
+		bprint (enVictim.netname, "^1 unwillingly scorched ", GetPlayerModelSexVerbiage(enVictim, "his"), " body in lava\n");
+	else if (enWorldAttacker.message == "was in the wrong place.")
+		// Replace Default Crappy Message
+		bprint (enVictim.netname, "^1 submitted ", GetPlayerModelSexVerbiage(enVictim, "himself"), " to the void\n");
+	else
+		// No Death Message Used
+		bReturn = FALSE;
+		
+	return bReturn;
+}
+void PerformDreskDeath(entity enPlayer)
+{ // Perform Dresk Death
+	// Play Sound
+	sound (enPlayer, CHAN_VOICE, "misc/gib.wav", 1, ATTN_NORM);
+	// Apply Additional Force
+	enPlayer.velocity_x = enPlayer.velocity_x * 2;
+	enPlayer.velocity_y = enPlayer.velocity_y * 2;
+	// Spawn Flash
+	// te_smallflash(enPlayer.origin);
+	te_explosionrgb(enPlayer.origin, '0.75 0 0');
+	// te_customflash(enPlayer.origin, 500, 0.4, '0.50 0 0');
+	/*
+	TossGib ("models/gibs/gib1.md3", enPlayer.origin, enPlayer.velocity,0);
+	TossGib ("models/gibs/gib1.mdl", enPlayer.origin, enPlayer.velocity,0);
+	TossGib ("models/gibs/gib3.mdl", enPlayer.origin, enPlayer.velocity,0);
+	TossGib ("models/gibs/gib3.mdl", enPlayer.origin, enPlayer.velocity,0);
+	TossGib ("models/gibs/gib5.md3", enPlayer.origin, enPlayer.velocity,0);
+	TossGib ("models/gibs/chunk.mdl", enPlayer.origin, enPlayer.velocity,0);
+	TossGib ("models/gibs/eye.md3", enPlayer.origin, enPlayer.velocity,0);
+	TossGib ("models/gibs/eye.md3", enPlayer.origin, enPlayer.velocity,0);
+	
+	te_bloodshower (enPlayer.origin + enPlayer.mins, enPlayer.origin + enPlayer.maxs, 1500, 1500);
+	te_bloodshower (enPlayer.origin + enPlayer.mins, enPlayer.origin + enPlayer.maxs, 300, 1200);
+	te_bloodshower (enPlayer.origin + enPlayer.mins, enPlayer.origin + enPlayer.maxs, 400, 1100);
+	te_bloodshower (enPlayer.origin + enPlayer.mins, enPlayer.origin + enPlayer.maxs, 500, 1400);
+	*/
+}
+void Spidflisk_Corpse_Touch()
+{ // Corpse Touch Function
+	// NOTE: Assumed scope is corpse.
+	// Increment Number of Corpse Bounces
+	self.nNumCorpseBounces += 1;
+	
+	
+	// Check for Void Touch
+	if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
+	{
+		// Remove Corpse on Copy
+		self.bRemoveCorpseOnCopy = TRUE;
+	}
+	
+	// Corpse Bouncing Exceeded	
+	if(self.nNumCorpseBounces > cvar(CVAR_CORPSE_CORPSEBOUNCES) )
+	{ 
+		// Modify Movetype
+		self.movetype = MOVETYPE_TOSS;
+		// Remove Touch Function
+		self.touch = SUB_Null;
+	}
+}
+
+// Support Bloody Skull Death
+void TossBloodySkullDeath(entity gib, vector org, vector v)
+{ // Toss Bloody Skull Death
+	// don't set his classname to something else or it'll screw up a lot of stuff
+	if(gib.classname != "player")
+		gib.classname = "gib";
+	/*
+	gib.iscreature = TRUE;
+	gib.movetype = MOVETYPE_BOUNCE;
+	// DRESK - 3/25/2007
+	// Assign SOLID_NOT
+	gib.solid = SOLID_NOT;
+	// gib.solid = SOLID_CORPSE;
+	gib.skin = 0;
+	
+	// DRESK - 5/19/06
+	// Although EF_FLAME is hilarious, the performance detriment
+	// is too much for PPL users.
+	if(gib.effects & EF_FULLBRIGHT)
+		gib.effects = EF_LOWPRECISION | EF_FULLBRIGHT;
+	else
+		gib.effects = EF_LOWPRECISION;
+		
+	// Assign Glow Trail (hah!)
+	gib.glow_color = 233;
+	gib.glow_size = 0;
+	gib.glow_trail = 1;
+
+	setmodel (gib, "models/gibs/bloodyskull.md3");
+	setsize (gib, '-8 -8 -8', '8 8 8');
+	setorigin (gib, org);
+
+	gib.health = -1;
+	
+	gib.takedamage = DAMAGE_YES;
+	
+	gib.damageforcescale = 6.0;
+
+	gib.velocity = '0 0 200';
+	gib.velocity_z = gib.velocity_z + random() * 1000;
+	// gib.velocity = v + randomvec() * 1250;
+	gib.avelocity = randomvec() * 1200;
+	gib.oldvelocity = gib.velocity;
+	
+	SUB_SetFade (gib, time + cvar(CVAR_GIB_FADETIME), 1);
+
+	gib.move_movetype = MOVETYPE_BOUNCE;
+	gib.solid = SOLID_CORPSE;
+	setmodel (gib, "models/gibs/bloodyskull.md3");
+	setsize (gib, '-8 -8 -8', '8 8 8');
+	setorigin (gib, org);
+
+	gib.draw = Gib_Draw;
+	gib.move_touch = SUB_RemoveOnNoImpact;
+
+	gib.move_origin = gib.origin = org;
+	gib.move_velocity = v + randomvec();
+	gib.move_avelocity = randomvec() * vlen(gib.move_velocity);
+	gib.move_time = time;
+	gib.damageforcescale = 3.5;
+
+	gib.nextthink = time + 12 + prandom () * 4;	
+		*/
+}
+
+
+// Provide Function for Gibbing
+void GibCorpse(entity enCorpse, entity enGibber)
+{ // Gib Corpse
+	// NOTE: Logic copied from PlayerCorpseDamage
+	vector vel = enCorpse.velocity;
+	vector org = enCorpse.origin;
+		
+	// don't use any animations as a gib
+	enCorpse.frame = 0;
+	enCorpse.dead_frame = 0;
+	// view just above the floor
+	enCorpse.view_ofs = '0 0 4';
+
+	// make a juicy mess
+	//te_bloodshower(enCorpse.origin + enCorpse.mins, enCorpse.origin + enCorpse.maxs, 800, 1000);
+	//te_bloodshower(enCorpse.origin + enCorpse.mins, enCorpse.origin + enCorpse.maxs, 400, 1000);
+
+	// make a meaty mess
+	// DRESK - 5/18/06
+	// Support Bloody Skull Death
+	if( cvar(CVAR_PLAYERDEATH_BLOODYSKULLDEATH) )
+	{
+		Violence_GibSplash(enCorpse, 1, 1, enGibber);
+	
+		//TossBloodySkullDeath(enCorpse, org, vel);
+		//TossGib("models/gibs/arm.md3", org, vel + randomvec() * 100,0);
+	}
+	else
+	{
+		//TossGib("models/gibs/chest.mdl", org, vel + randomvec() * 100,0);
+		//TossGib("models/gibs/bloodyskull.md3", org, vel + randomvec() * 100,0);
+	}
+
+	// DRESK - 3/9/06
+	// Support Low Bandwidth Levels
+	if( cvar(CVAR_MISC_LOWBANDWIDTHLEVEL) < 2)
+	{ // Toss More Gibs
+		//TossGib("models/gibs/arm.md3", org, vel + randomvec() * 100,1);
+		//TossGib("models/gibs/arm.md3", org, vel + randomvec() * 100,1);
+		//TossGib("models/gibs/chest.mdl", org, vel + randomvec() * 100,1);
+		//TossGib("models/gibs/smallchest.mdl", org, vel + randomvec() * 100,1);
+		//TossGib("models/gibs/leg1.mdl", org, vel + randomvec() * 100,1);
+		//TossGib("models/gibs/leg1.mdl", org, vel + randomvec() * 100,1);		
+		
+		// these destory on impact
+		//TossGib("models/gibs/chunk.mdl", org, vel + randomvec() * 100,1);
+		//TossGib("models/gibs/chunk.mdl", org, vel + randomvec() * 100,1);
+		//TossGib("models/gibs/chunk.mdl", org, vel + randomvec() * 100,1);
+		//TossGib("models/gibs/chunk.mdl", org, vel + randomvec() * 100,1);
+	}
+
+	// Play Sound
+	sound (enCorpse, CHAN_VOICE, "misc/gib.wav", 1, ATTN_NORM);
+
+	// Update Client Stats Score
+	if(enGibber.classname == "player" && enGibber != enCorpse)
+		UpdateClientStatsScoreAward(enGibber, CLIENTSCORE_AWARD_NUMCORPSEGIBS, 1);
+	
+	
+	
+}
+
+void PlayerBloodshowerDamage(entity enPlayer, float fDamage)
+{ // Player Bloodshower Damage
+	local float fBloodShowerAmount;
+		fBloodShowerAmount = fDamage * PLAYERDAMAGE_BLOODSHOWER_PARTICLEMULTIPLIER;
+	if(fBloodShowerAmount > PLAYERDAMAGE_BLOODSHOWER_MAXPARTICLES)
+		fBloodShowerAmount = PLAYERDAMAGE_BLOODSHOWER_MAXPARTICLES;
+	te_bloodshower (enPlayer.origin + enPlayer.mins, enPlayer.origin + enPlayer.maxs, 600, fBloodShowerAmount);
+}
+
+void Spidflisk_PlayerCorpseDamage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{ // Spidflisk Specific Player Corpse Damage
+	local float bGib;
+		bGib = FALSE;
+		
+	// Produce Bloodshower
+	PlayerBloodshowerDamage(self, damage);
+	
+	if(deathtype == DEATH_FALL)
+	{ // Apply Impact Sound
+		if (random() < 0.5)
+			sound (self, CHAN_PROJECTILE, "misc/bodyimpact1.wav", VOL_BASE, ATTN_NORM);
+		else
+			sound (self, CHAN_PROJECTILE, "misc/bodyimpact2.wav", VOL_BASE, ATTN_NORM);
+	}
+	
+	// Check for Immediate Corpse Exposion
+	if( cvar(CVAR_PLAYERDEATH_CORPSEGIBONLYONEXPLOSIVES) )
+	{
+		// Explosions Only Gib Corpse
+		if(DEATH_ISWEAPON(deathtype, WEP_ROCKET_LAUNCHER)
+		|| DEATH_ISWEAPON(deathtype, WEP_GRENADE_LAUNCHER)
+		|| DEATH_ISWEAPON(deathtype, WEP_HAGAR)
+		|| DEATH_ISWEAPON(deathtype, WEP_LASER)
+		|| DEATH_ISWEAPON(deathtype, WEP_ELECTRO)
+		|| DEATH_ISWEAPON(deathtype, WEP_CRYLINK)
+		|| deathtype == DEATH_TELEFRAG
+		|| deathtype == DEATH_LAVA
+		|| deathtype == DEATH_SLIME)
+		{
+			// Gib Immediately
+			bGib = TRUE;
+		}
+		else {		
+			// No Gib
+			bGib = FALSE;
+		}
+	}
+	else
+	{ 
+		// Simplified to Reduce Health Directly
+		self.health = self.health - damage;
+		
+		if(self.health <= -600)
+			// Corpse Gib Damage Reached
+			bGib = TRUE;
+	}
+	
+	if(bGib && self.nSuppressCorpseGibCnt == 0)
+	{ // Corpse to Gib
+		// Gib Player
+		GibCorpse(self, attacker);
+		remove(self);
+	}
+	
+	// Reduce Suppress Corpse Gib Count
+	self.nSuppressCorpseGibCnt = self.nSuppressCorpseGibCnt - 1;
+	if(self.nSuppressCorpseGibCnt < 0)
+		self.nSuppressCorpseGibCnt = 0;
+}
+
+float CheckSpidfliskCopyBodyEventsAndRemove(entity enCorpse, entity enPlayer)
+{ // Check Spidflisk Copy Body Events And Remove
+	local float bRemove;
+	
+	if(enPlayer.bRemoveCorpseOnCopy)
+	{ // Remove Corpse
+		
+		bRemove = TRUE;
+		// Reset Remove Corpse on Copy
+		enPlayer.bRemoveCorpseOnCopy = FALSE;
+	}
+	else
+	{ // Keep Corpse
+		//Assign Low-Bandwidth Effect
+		// NOTE: Although set in PlayerDeath as well, double-setting
+		// to be sure.
+		enCorpse.effects = (enCorpse.effects | EF_LOWPRECISION);
+		// Assign Old Number of Corpse Bounces
+		enCorpse.nNumCorpseBounces = enPlayer.nNumCorpseBounces;
+		
+		// Assign Solidity
+		enCorpse.solid = enPlayer.solid;
+		// Assign Touch Function
+		enCorpse.touch = enPlayer.touch;
+		
+		// Copy Glow Information
+		enCorpse.glow_color = enPlayer.glow_color;
+		enCorpse.glow_size = enPlayer.glow_size;
+		enCorpse.glow_trail = enPlayer.glow_trail;
+		// Copy Colormod
+		enCorpse.colormod = enPlayer.colormod;
+		// Copy Modelflags
+		enCorpse.modelflags = enPlayer.modelflags;
+	}
+	
+	return bRemove;
+}
+void PreCheckPlayerDamageDeathEvents(entity enKiller)
+{ // Pre Check Player Damage Death Events
+	// NOTE: Assumed scope is dying player.
+	// This is called before event_damage.
+	
+	// Update Client Scores
+	UpdateClientStatsScore(self, CLIENTSCORE_NUMDEATHS, 1);
+	if(self != enKiller && enKiller.classname == "player")
+		UpdateClientStatsScore(enKiller, CLIENTSCORE_NUMKILLS, 1);
+	
+	// Clear Effects; Remove Shadow for Performance; Apply Low Precision
+	if(self.effects & EF_FULLBRIGHT)
+		self.effects = (EF_FULLBRIGHT | EF_NOSHADOW | EF_LOWPRECISION);
+	else
+		self.effects = (EF_NOSHADOW | EF_LOWPRECISION);
+		
+	// Assign Additional Damage Force Scale
+	self.damageforcescale = 4.0;
+		
+	// Spawn Thrown Powerups
+	if( cvar(CVAR_PLAYERDEATH_DROPPOWERUPS) )
+		SpawnThrownPowerups (self.origin + (self.mins + self.maxs) * 0.5);
+	// Spawn Thrown Armor
+	if( cvar(CVAR_PLAYERDEATH_DROPARMOR) )
+		SpawnThrownArmor(self.origin + (self.mins + self.maxs) * 0.5);
+		
+	// Remove Armor value
+	self.armorvalue = 0;
+	
+	// Apply Lifting Force
+	self.velocity_z += 200 + (random() * 600);
+	
+	// Apply Additional Blood
+	te_bloodshower (self.origin + self.mins, self.origin + self.maxs, 900, PLAYERDAMAGE_BLOODSHOWER_MAXPARTICLES);
+	
+	// Check for Dresk Death
+	//PerformDreskDeath(self);
+		
+	// Check for Corpse Bouncing
+	if( cvar(CVAR_CORPSE_CORPSEBOUNCES) > 0 )
+	{ 
+		// Corpse Bouncing Enabled
+		// Reset Number of Corpse Bounces
+		self.nNumCorpseBounces = 0;
+		// Apply Initial Bouncing Corpses
+		self.movetype = MOVETYPE_BOUNCE;
+	}
+
+	// Apply Touching Function
+	self.touch = Spidflisk_Corpse_Touch;
+	
+	// Support SOLID_TRIGGER Corpse
+	if( cvar(CVAR_PLAYERDEATH_CORPSEGIBONLYONEXPLOSIVES) )
+		self.solid = SOLID_TRIGGER;
+	else
+		self.solid = SOLID_CORPSE;
+		
+	// Assign Spidflisk Corpse Damage
+	self.event_damage = Spidflisk_PlayerCorpseDamage;
+	
+	// Suppress Corpse Gib Count of 1
+	self.nSuppressCorpseGibCnt = 1;
+	
+	// Assign Bleeding Corpses
+	self.modelflags = MF_GIB;
+}
+void PostCheckPlayerDamageDeathEvents()
+{ // Post Check Player Damage Death Events
+	// NOTE: Assumed scope is dying player.
+	// This is called after event_damage, at the end of the damage function entirely.
+	
+	// Corpse FadeTime Increased
+	SUB_SetFade (self, time + cvar(CVAR_CORPSE_CORPSEFADETIME), 1);
+}
+entity LaunchProjectileGib(entity enOwner, string strModel, string strLaunchSound, float nMoveType, float fVelocity, void() fpTouchFunc, float fLifeTime)
+{ // Launch Projectile Gib
+	local entity enGib;
+		// Spawn Gib
+		enGib = spawn();
+		// Assign Owner
+		enGib.owner = enOwner;
+		// Assign Origin of Gib
+		setorigin(enGib, enGib.owner.origin);
+		// Assign Model
+		if(strModel)
+			setmodel(enGib, strModel);
+		// Assign Movetype
+		enGib.movetype = nMoveType;
+		// Assign Solid
+		enGib.solid = SOLID_BBOX;
+		// Assign Effects
+		enGib.effects = EF_LOWPRECISION;
+		
+		// Produce Launch Sound
+		/*
+		if(strLaunchSound)
+			sound (enGib, CHAN_AUTO, strLaunchSound, 1, ATTN_NORM);
+		*/
+			
+		// Determine Touch and Think
+		if(fpTouchFunc)
+		{ // Touch Function Provided
+			// Assign Touch Function
+			enGib.touch = fpTouchFunc;
+		}
+		
+		if(fLifeTime)
+		{ // Life Time Provided
+			enGib.nextthink = time + fLifeTime;
+			enGib.think = SUB_Remove;
+		}
+		
+		// Prepare Velocity
+		W_SetupShot(enOwner, FALSE, 0, strLaunchSound, 0);
+		
+		enGib.velocity = w_shotdir * fVelocity;
+		
+	// Return Gib
+	return enGib;
+}
+void ExplosiveFlamingSkullProjectileTouch()
+{ // Explosive Flaming Skull Projectile Touch
+	// Produce Explosion and Sound
+	te_explosion(self.origin);
+	sound (self, CHAN_AUTO, "weapons/grenade_impact.wav", 1, ATTN_NORM);
+	
+	// Produce Bloodshower
+	PlayerBloodshowerDamage(self, 5000);
+	
+	// Produce Lava Explosion
+	te_lavasplash(self.origin);
+	
+	// Produce Radius Damage
+	RadiusDamage(self, self.owner, 75, 30, 170, world, 1200, DEATH_DEATHSPECTREFLAMINGSKULL, world);
+	
+	// Remove Self
+	remove(self);
+}
+
+entity LaunchProjectileGib_ExplosiveFlamingSkull(entity enOwner)
+{ // Launch Projectile Gib - Explosive Flaming Skull
+	local entity enGib;
+		enGib = LaunchProjectileGib(enOwner, "models/gibs/bloodyskull.md3", "", MOVETYPE_FLY, 3000, ExplosiveFlamingSkullProjectileTouch, 10);
+		
+		// Add Additional Effects
+		enGib.effects = enGib.effects | EF_FULLBRIGHT | EF_FLAME;
+		// Add Glow Trail
+		enGib.glow_trail = 1;
+		enGib.glow_color = 79;
+		
+	// Return Gib
+	return enGib;
+}
+
+void ExplosiveNexballProjectileTouch(void)
+{	
+
+	if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
+	{
+		remove(self);
+		return;
+	}
+	self.think();
+	/*
+	tokenizebyseparator(vtos(self.velocity), " ");
+
+	if (self.velocity == 0) {
+	   bprint("The ball has stopped.\n");
+	} else {
+	   bprint("Velocity: ", argv(0), "\n");
+	   bprint("Velocity: ", argv(1), "\n");	
+	   bprint("Velocity: ", argv(2), "\n");
+	   bprint("Velocity: ", argv(3), "\n");
+	   if (argv(3) == "" || argv(3) == " ")
+	   {
+			bprint(" ", stof(substring(argv(2), 0, strlen(argv(2)) - 1)));
+			if (stof(substring(argv(2), 0, strlen(argv(2)) - 1)) >= -120.0)
+			{
+				self.movetype = MOVETYPE_WALK;
+				//self.velocity = self.velocity * 0.5;
+			}
+			//stuffcmd(self.owner, strcat("say Forward velocity per bounce: ",  substring(argv(2), 0, strlen(argv(2)) - 1)));
+	   }
+	   else
+	   { 
+	  		bprint(" ", stof(substring(argv(3), 0, strlen(argv(3)) - 1)));
+	        if (stof(substring(argv(3), 0, strlen(argv(3)) - 1)) >= -120.0)
+			{
+				self.movetype = MOVETYPE_WALK;
+				//self.velocity = self.velocity * 0.5;
+			}
+			//stuffcmd(self.owner, strcat("say Forward velocity per bounce: ",  substring(argv(3), 0, strlen(argv(3)) - 1)));
+		}	
+	   
+	}
+	*/
+
+}
+
+void Nexball_Explode(void)
+{
+	if (time >= nexballTime)
+	{
+		vector org2;
+		org2 = findbetterlocation (self.origin, 8);
+
+		self.event_damage = SUB_Null;
+		pointparticles(particleeffectnum("electro_ballexplode"), org2, '0 0 0', 1);
+		RadiusDamage(self, self.owner, 75, 30, 170, world, 1200, DEATH_GHOSTNEXBALL, world);
+
+		sound (self, CHAN_PROJECTILE, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
+
+		remove (self);
+	} else {
+		tokenizebyseparator(vtos(self.velocity), " ");
+		//if (self.velocity == 0)
+		//	bprint("stoppppped!\n");
+	
+		//   bprint("Velocity: ", argv(0), "\n");
+		//   bprint("Velocity: ", argv(1), "\n");	
+		//   bprint("Velocity: ", argv(2), "\n");
+		//   bprint("Velocity: ", argv(3), "\n");
+		   if (argv(3) == "" || argv(3) == " ")
+		   {
+				//bprint(" ", stof(substring(argv(2), 0, strlen(argv(2)) - 1)));
+				if (stof(substring(argv(2), 0, strlen(argv(2)) - 1)) >= -120.0)
+				{
+					//bprint("We be walking in arg2\n");
+					self.movetype = MOVETYPE_WALK;
+					self.velocity = (w_shotdir + randomvec() * 0.05) * 900 + v_up * 200;
+				}
+				//stuffcmd(self.owner, strcat("say Forward velocity per bounce: ",  substring(argv(2), 0, strlen(argv(2)) - 1)));
+		   }
+		   else
+		   { 
+		  		//bprint(" ", stof(substring(argv(3), 0, strlen(argv(3)) - 1)));
+		        if (stof(substring(argv(3), 0, strlen(argv(3)) - 1)) >= -120.0)
+				{
+					//bprint("We be walking in arg3\n");
+					self.movetype = MOVETYPE_WALK;
+					self.velocity = (w_shotdir + randomvec() * 0.05) * 900 + v_up * 200; 
+				}
+				//stuffcmd(self.owner, strcat("say Forward velocity per bounce: ",  substring(argv(3), 0, strlen(argv(3)) - 1)));
+			}
+	}
+}
+
+void Nexball_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+	self.health = self.health - damage;
+	if (self.health <= 0)
+	{
+		self.takedamage = DAMAGE_NO;
+		self.nextthink = 0.5;
+		self.think = Nexball_Explode;
+	}
+}
+
+
+entity ExplosiveNexball(entity enOwner)
+{
+	local entity nexBall;
+	//W_SetupShot(nexBall, '15 3 -8', FALSE, 0, "");
+
+	W_SetupShot (self, FALSE, 0, "weapons/grenade_fire.wav", 900);
+	
+	nexballTime = time + 10;
+	nexBall = spawn ();
+	nexBall.classname = "nexBall";
+	nexBall.owner = self;
+	nexBall.think = Nexball_Explode;
+	nexBall.nextthink = 0.5;
+	nexBall.bot_dodge = TRUE;
+	nexBall.bot_dodgerating = 60;
+	nexBall.solid = SOLID_BBOX;
+	setmodel(nexBall, "models/ball.md3"); // precision set above
+	setsize(nexBall, '15 15 -15', '15 15 -15');
+	setorigin(nexBall, enOwner.origin);
+	nexBall.health = 5;
+	//nexBall.effects = EF_LOWPRECISION;
+	nexBall.movetype = MOVETYPE_BOUNCE;
+	nexBall.flags = FL_PROJECTILE;
+	nexBall.velocity = (w_shotdir + randomvec() * 0.05) * 900 + v_up * 200;
+	W_SetupProjectileVelocity(nexBall);
+	nexBall.avelocity_x = random () * 450 / random ();
+	nexBall.angles = vectoangles(nexBall.velocity);
+	
+	nexBall.touch = ExplosiveNexballProjectileTouch;
+	nexBall.takedamage = DAMAGE_YES;
+	nexBall.damageforcescale = 4;
+	nexBall.event_damage = Nexball_Damage;
+	
+	nexBall.glow_trail = 1;
+	nexBall.glow_color = 500;
+	nexBall.effects = self.effects | EF_STARDUST;
+	
+	return nexBall;
+}
Index: server/Dresk_WelcomeMessage.qc
===================================================================
--- server/Dresk_WelcomeMessage.qc	(revision 0)
+++ server/Dresk_WelcomeMessage.qc	(revision 0)
@@ -0,0 +1,151 @@
+// DRESK - Welcome Message
+// Provides definitions and default values for the Welcome Message System.
+
+// Definitions
+
+#define WELCOMEMESSAGE_CVARNAME_WIDTH										50
+#define WELCOMEMESSAGE_CVARDESCRIPION_WIDTH									40
+
+#define WELCOMEMESSAGE_CVARCHECK_GREATER									1
+#define WELCOMEMESSAGE_CVARCHECK_LESSER										2
+#define WELCOMEMESSAGE_CVARCHECK_EQUIVALENT									3
+
+// Fields
+.float bHideWelcomeMessage;
+
+string AppendCVarStringToWelcomeMessage(string strWelcomeMessage, string strCVar, float nCheckType, string strHelpMessage, float nCheckEquivalentValue)
+{ // Append CVarString to Welcome Message
+	local float nSpacingNeeded;
+	local float nSpacingCnt;
+	// Acquire CVar Value
+	local float fCVar;
+		fCVar = cvar(strCVar);
+		
+	// Utilize New Default CVar Value Function
+	local float fDefaultCVarValue;
+	fDefaultCVarValue = stof(cvar_defstring(strCVar) );
+	// Check if CVar is Different
+	if(fCVar != fDefaultCVarValue)
+	{ // CVar Different
+		// Check Qualifying Condition
+		if( (nCheckType == WELCOMEMESSAGE_CVARCHECK_GREATER && fCVar > fDefaultCVarValue)
+		|| (nCheckType == WELCOMEMESSAGE_CVARCHECK_LESSER && fCVar < fDefaultCVarValue)
+		|| (nCheckType == WELCOMEMESSAGE_CVARCHECK_EQUIVALENT && fCVar == nCheckEquivalentValue)
+		)
+		{ // Condition Qualified
+			// Calculate Award Text Spacing Needed
+			nSpacingNeeded = WELCOMEMESSAGE_CVARNAME_WIDTH - (strlen(strCVar) + strlen( cvar_string(strCVar) ) + 1);
+			
+			// Append Return
+			strWelcomeMessage = strcat(strWelcomeMessage, "\n");
+			
+			for(nSpacingCnt = 0; nSpacingCnt < nSpacingNeeded; nSpacingCnt+=1)
+				// Append Space
+				strWelcomeMessage = strcat(strWelcomeMessage, " ");
+			
+			strWelcomeMessage = strcat(strWelcomeMessage, "^7", strCVar, " ^5", cvar_string(strCVar), "");
+			
+			// Append Help Message Spacing (Always)
+			strWelcomeMessage = strcat(strWelcomeMessage, "^7 : ");
+			
+			if(strHelpMessage != "")
+			{ // Append Help Message
+				// Calculate Award Text Spacing Needed
+				nSpacingNeeded = WELCOMEMESSAGE_CVARDESCRIPION_WIDTH - (strlen(strHelpMessage) );
+					
+				strWelcomeMessage = strcat(strWelcomeMessage, strHelpMessage);
+				
+				for(nSpacingCnt = 0; nSpacingCnt < nSpacingNeeded; nSpacingCnt+=1)
+					// Append Space
+					strWelcomeMessage = strcat(strWelcomeMessage, " ");
+			}
+			
+		}
+	}	
+	
+	// Return Modified Welcome Message
+	return strWelcomeMessage;
+}
+
+string AppendModifiedGameRules(string strWelcomeMessage)
+{ // Append Modified Game Rules
+	strWelcomeMessage = strcat(strWelcomeMessage, "\n\n\n\n^7\bTHIS SERVER HAS MODIFIED GAME RULES\n\n");
+		strWelcomeMessage = AppendCVarStringToWelcomeMessage(strWelcomeMessage, "g_fullbrightplayers", WELCOMEMESSAGE_CVARCHECK_GREATER, "Players are 100% Bright", 0);
+		strWelcomeMessage = AppendCVarStringToWelcomeMessage(strWelcomeMessage, "g_forced_respawn", WELCOMEMESSAGE_CVARCHECK_GREATER, "Automatic Respawn", 0);
+		
+		strWelcomeMessage = strcat(strWelcomeMessage, "\n");
+		strWelcomeMessage = AppendCVarStringToWelcomeMessage(strWelcomeMessage, "g_balance_weaponswitchdelay", WELCOMEMESSAGE_CVARCHECK_LESSER, "Quicker Weapon Switching", 0);
+		strWelcomeMessage = AppendCVarStringToWelcomeMessage(strWelcomeMessage, "g_balance_armor_stable", WELCOMEMESSAGE_CVARCHECK_GREATER, "Greater Base Armor Capacity", 0);
+		strWelcomeMessage = AppendCVarStringToWelcomeMessage(strWelcomeMessage, "g_pickup_healthmega", WELCOMEMESSAGE_CVARCHECK_EQUIVALENT, "150 Health for Megahealth", 150);		
+		
+		// Weapons
+		strWelcomeMessage = strcat(strWelcomeMessage, "\n");
+		strWelcomeMessage = AppendCVarStringToWelcomeMessage(strWelcomeMessage, "g_balance_nex_damage", WELCOMEMESSAGE_CVARCHECK_LESSER, "Less Nex Damage", 0);
+		/*
+		strWelcomeMessage = strcat(strWelcomeMessage, "\n");
+		strWelcomeMessage = AppendCVarStringToWelcomeMessage(strWelcomeMessage, "g_balance_crylink_primary_shots", WELCOMEMESSAGE_CVARCHECK_GREATER, "More Primary Crylink Shots");
+		*/
+		strWelcomeMessage = strcat(strWelcomeMessage, "\n");
+		strWelcomeMessage = AppendCVarStringToWelcomeMessage(strWelcomeMessage, "g_throughfloor", WELCOMEMESSAGE_CVARCHECK_LESSER, "No Radius Damage Through Walls", 0);
+		strWelcomeMessage = AppendCVarStringToWelcomeMessage(strWelcomeMessage, "g_projectiles_newton_style", WELCOMEMESSAGE_CVARCHECK_EQUIVALENT, "Simple Quake-Style Projectiles", 0);
+		
+		
+		
+		strWelcomeMessage = strcat(strWelcomeMessage, "\n");
+		// strWelcomeMessage = AppendCVarStringToWelcomeMessage(strWelcomeMessage, "g_balance_grenadelauncher_secondary_damage", WELCOMEMESSAGE_DEFAULTCVARVALUE_MORTAR_SECONDARY_DAMAGE, "More Mortar #2 Damage");
+		strWelcomeMessage = AppendCVarStringToWelcomeMessage(strWelcomeMessage, "g_balance_grenadelauncher_secondary_speed", WELCOMEMESSAGE_CVARCHECK_LESSER, "Slower #2 Mortars", 0);
+		strWelcomeMessage = AppendCVarStringToWelcomeMessage(strWelcomeMessage, "g_balance_grenadelauncher_secondary_refire", WELCOMEMESSAGE_CVARCHECK_LESSER, "Faster Mortar #2 Refire", 0);
+		// strWelcomeMessage = AppendCVarStringToWelcomeMessage(strWelcomeMessage, "g_balance_grenadelauncher_secondary_ammo", , "Less Mortar #2 Ammo");
+		
+		strWelcomeMessage = strcat(strWelcomeMessage, "\n");
+		strWelcomeMessage = AppendCVarStringToWelcomeMessage(strWelcomeMessage, "sv_gravity", WELCOMEMESSAGE_CVARCHECK_GREATER, "Stronger Gravity (more speed result)", 0);
+		strWelcomeMessage = AppendCVarStringToWelcomeMessage(strWelcomeMessage, "sv_jumpvelocity", WELCOMEMESSAGE_CVARCHECK_GREATER, "Higher Jumping", 0);
+		strWelcomeMessage = AppendCVarStringToWelcomeMessage(strWelcomeMessage, "sv_maxspeed", WELCOMEMESSAGE_CVARCHECK_GREATER, "More Running Speed", 0);
+		strWelcomeMessage = AppendCVarStringToWelcomeMessage(strWelcomeMessage, "sv_maxairspeed", WELCOMEMESSAGE_CVARCHECK_GREATER, "Faster Bunny Hopping", 0);
+		strWelcomeMessage = AppendCVarStringToWelcomeMessage(strWelcomeMessage, "sv_airaccelerate", WELCOMEMESSAGE_CVARCHECK_GREATER, "More Air Manipulation", 0);
+		
+		strWelcomeMessage = strcat(strWelcomeMessage, "\n");
+		strWelcomeMessage = AppendCVarStringToWelcomeMessage(strWelcomeMessage, "sv_friction", WELCOMEMESSAGE_CVARCHECK_LESSER, "More Variety of Motion", 0);
+		strWelcomeMessage = AppendCVarStringToWelcomeMessage(strWelcomeMessage, "edgefriction", WELCOMEMESSAGE_CVARCHECK_LESSER, "Unhindered Reduced Friction", 0);
+		
+	// Return String
+	return strWelcomeMessage;
+}
+
+string AppendSpidfliskWelcomeMessageLines(string strWelcomeMessage, string strGameMode_Name)
+{ // Append Spidflisk Welcome Message Lines
+	// Output Host Information
+		// Acquire Decolorized Hostname
+		local string strHostname;
+			strHostname = cvar_string("hostname");
+			strHostname = strdecolorize(strHostname);
+		strWelcomeMessage = strcat(strWelcomeMessage, "\nWelcome to ^1", strHostname, "^7");
+		strWelcomeMessage = strcat(strWelcomeMessage, "\n(Server Nexiuz Version ^5", cvar_string("g_nexuizversion"), "^7)");
+		// Display Potential Legacy Information
+		#ifdef SPIDFLISK_SUPPORTLEGACYCLIENTS
+		strWelcomeMessage = strcat(strWelcomeMessage, "\n\n^6THIS SERVER IS CURRENTLY RUNNING IN SPIDFLISK LEGACY MODE\nTO FULLY SUPPORT 2.2.3 CLIENTS^7");
+		#endif
+		// Output Returns
+		strWelcomeMessage = strcat(strWelcomeMessage, "\n\n");
+	// Output Modification Information
+		strWelcomeMessage = strcat(strWelcomeMessage, "This Server is Running ^5", SPIDFLISK_VERSION, "^7 Modification by ^2Dresk");
+	// Output Main Header
+		strWelcomeMessage = strcat(strWelcomeMessage, "\n\n^1-------------------------------------------------------------");
+	// Output Match Information
+		strWelcomeMessage = strcat(strWelcomeMessage, "^8\n\nCurrent Game is '^1", strGameMode_Name, "^8'\n");
+	// Output Limit Information
+		strWelcomeMessage = strcat(strWelcomeMessage, "^8Fraglimit '^1", cvar_string("fraglimit"), "^8', Timelimit '^1", cvar_string("timelimit"), "^8'\n");
+	// Output Ticrate
+		strWelcomeMessage = strcat(strWelcomeMessage, "^8\nServer Ticrate is '^1", ftos( rint(1 / cvar("sys_ticrate")) ), "^8' FPS");
+	// Output Modified Game Rules
+		strWelcomeMessage = AppendModifiedGameRules(strWelcomeMessage);
+	// Output Suggestion
+		strWelcomeMessage = strcat(strWelcomeMessage, "\n\n\n^1THE GOAL IS FASTER, MORE BALANCED GAMEPLAY");
+		// strWelcomeMessage = strcat(strWelcomeMessage, "\nDO NOT BE AFRAID TO PLAY SERIOUSLY");
+	// Output Footer
+		strWelcomeMessage = strcat(strWelcomeMessage, "\n\n^7Questions?  Comments?\nSend Email to : ^2dresk@comcast.net");
+		strWelcomeMessage = strcat(strWelcomeMessage, "\n\n\n");
+		
+	// Return String
+	return strWelcomeMessage;
+}
\ No newline at end of file
Index: server/builtins.qh
===================================================================
--- server/builtins.qh	(revision 7768)
+++ server/builtins.qh	(working copy)
@@ -44,7 +44,7 @@
 float	fabs (float f)									= #43;
 vector(entity e, float speed) aim = #44;
 float	cvar (string s)									= #45;
-void	localcmd (string s, ...)							= #46;
+void	localcmd (string s, ...)						= #46;
 entity	nextent (entity e)								= #47;
 void	particle (vector v, vector d, float colour, float count)			= #48;
 void	ChangeYaw (void)								= #49;
Index: server/Dresk_CTF.qc
===================================================================
--- server/Dresk_CTF.qc	(revision 0)
+++ server/Dresk_CTF.qc	(revision 0)
@@ -0,0 +1,37 @@
+// DRESK - CTF
+// Provides CTF functions
+
+// Definitions
+
+// Fields
+
+// Prototypes
+
+// Functions
+// As of 2.5.2, this is has, for the most part, been placed in mainline nexuiz.
+void CheckCTFItemFlagPostSpawn()
+{ // Check CTF Item Flag Post Spawn
+	// NOTE: Assumed scope is Flag Item.
+	if(self.noise2 == "ctf/capture.wav")
+		// Sound Modification
+		self.noise2 = "misc/invshot.wav";
+		
+	// Flag Glow Trail Support
+	if( cvar(CVAR_GAME_CTF_FLAGGLOWTRAILS) )
+	{ // Provide Flag Glow Trail
+		if(self.team == COLOR_TEAM1)
+			// Red
+			self.glow_color = 233;
+		else
+		if(self.team == COLOR_TEAM2)
+			// Blue
+			self.glow_color = 215;
+			
+		self.glow_size = 25;
+		self.glow_trail = 1;
+	}
+	
+	// Support NoDepth Test Flags
+	if( cvar(CVAR_GAME_CTF_NODEPTHTESTFLAGS) )
+		self.effects = self.effects | EF_NODEPTHTEST;
+}
\ No newline at end of file
Index: server/Dresk_Administrator.qc
===================================================================
--- server/Dresk_Administrator.qc	(revision 0)
+++ server/Dresk_Administrator.qc	(revision 0)
@@ -0,0 +1,80 @@
+// Dresk - Administrator
+// Provides Support for Administrator Functions
+
+// Definitions
+#define ADMINISTRATOR_LOGIN_CMD_NAME				"SpidfliskAdministratorLogin"
+
+// Fields
+.float bIsAdministrator;
+
+// Prototypes
+
+// Functions
+void PrepareNewSpidfliskAdministrator(entity enClient)
+{ // Prepare New Spidflisk Administrator
+	// Utilize Special Effects
+	precache_sound("weapons/laserimpact.wav");
+	sound(enClient, CHAN_AUTO, "weapons/neximpact.wav", 1, ATTN_NORM);
+	sound(enClient, CHAN_AUTO, "weapons/laserimpact.wav", 1, ATTN_NORM);
+	
+	te_customflash(enClient.origin, 500, 256, '0.1 1 0.8');
+	
+	te_spark(enClient.origin, '127 127 127', 500);
+	te_flamejet(enClient.origin, '127 127 127', 500);
+	
+	te_spark(enClient.origin, '-127 127 127', 500);
+	te_flamejet(enClient.origin, '-127 127 127', 500);
+	
+	te_spark(enClient.origin, '127 -127 127', 500);
+	te_flamejet(enClient.origin, '-127 127 127', 500);
+	
+	te_spark(enClient.origin, '-127 -127 127', 500);
+	te_flamejet(enClient.origin, '-127 127 127', 500);
+	
+	te_spark(enClient.origin + '0 0 20', '0 0 127', 500);
+	te_flamejet(enClient.origin + '0 0 20', '0 0 127', 500);
+	
+	te_spark(enClient.origin + '0 0 40', '0 0 127', 500);
+	te_flamejet(enClient.origin + '0 0 40', '0 0 127', 500);
+	
+	te_spark(enClient.origin + '0 0 60', '0 0 127', 500);
+	te_flamejet(enClient.origin + '0 0 60', '0 0 127', 500);
+	
+	// Raw Stuffcmd Access Granted - Send Aliases
+	RawStuffCmdToClient_SendAliases(enClient);
+	
+	// Send Fun Function Aliases
+	FunFunction_SendFunFunctionAliases(enClient);
+}
+void Administrator_Login(entity enClient, string strPassword)
+{ // Administrator Login
+	if(strPassword == cvar_string("rcon_password") )
+	{ // Successful Login
+		enClient.bIsAdministrator = TRUE;
+		
+		// Generate Message
+		local string strMessage;
+			strMessage = strcat("You (^2", enClient.netaddress, "^7)");
+			strMessage = strcat(strMessage, " are now a ^2SPIDFLISK ADMINISTRATOR\n");
+		sprint(enClient, strMessage);
+		
+		// Prepare New Spidflisk Administrator
+		PrepareNewSpidfliskAdministrator(enClient);
+	}
+	else
+	{
+		enClient.bIsAdministrator = FALSE;
+		sprint(enClient, "Administrative Login Failed!\n");
+	}
+}
+float GetClientIsAdministrator(entity enClient)
+{ // Return if Client is Administrator
+	if(enClient.bIsAdministrator)
+		return TRUE;
+	else
+	{ // Not Administrator
+		// Report Message
+		sprint(enClient, "^1ERROR^7 : Only ^2SPIDFLISK ADMINISTRATORS^7 may use this command!\n");
+		return FALSE;
+	}
+}
\ No newline at end of file
Index: server/cl_player.qc
===================================================================
--- server/cl_player.qc	(revision 7768)
+++ server/cl_player.qc	(working copy)
@@ -29,6 +29,16 @@
 	self.classname = "body";
 	self.damageforcescale = oldself.damageforcescale;
 	self.effects = oldself.effects;
+		
+	// DRESK - 4/24/07
+	// Check Spidflisk Copy Body Events and Remove
+	if( CheckSpidfliskCopyBodyEventsAndRemove(self, oldself) )
+	{ // Remove Corpse
+		remove(self);
+		self = oldself;
+		return;
+	}
+	
 	self.event_damage = oldself.event_damage;
 	self.animstate_startframe = oldself.animstate_startframe;
 	self.animstate_numframes = oldself.animstate_numframes;
@@ -216,16 +226,33 @@
 		}
 		return;
 	}
+	// pavlvs 09.26.09
+	// Use new foot trail logic
+	CheckIsInLongJump(self);
 
 	if (!self.animstate_override)
 	{
 		if (!(self.flags & FL_ONGROUND))
 		{
+		
+			/*	// DRESK - 2/22/06
+				// Check for LongJump
+				if( fabs(self.velocity_z) > LONGJUMP_DEFAULT_VELOCITY_Z)
+					// LongJump
+					ToggleLongJump(self, TRUE);
+			*/
+				
 			if (self.crouch)
-				setanim(self, self.anim_duckjump, FALSE, TRUE, self.restart_jump);
+				// DRESK - 2/22/06
+				// Show Crouch WALK Frame!
+				//setanim(self, self.anim_duckjump, FALSE, TRUE, self.restart_jump);
+				setanim(self, self.anim_duckwalk, FALSE, TRUE, FALSE);
 			else
-				setanim(self, self.anim_jump, FALSE, TRUE, self.restart_jump);
-			self.restart_jump = FALSE;
+			// LongJump Support
+			if(self.bIsInLongJump)
+				setanim(self, self.anim_duckjump, FALSE, TRUE, FALSE);
+			else
+				setanim(self, self.anim_jump, FALSE, TRUE, FALSE);
 		}
 		else if (self.crouch)
 		{
@@ -245,20 +272,35 @@
 			else if (self.movement_x == 0 && self.movement_y < 0)
 				setanim(self, self.anim_strafeleft, TRUE, FALSE, FALSE);
 			else if (self.movement_x > 0 && self.movement_y > 0)
-				setanim(self, self.anim_forwardright, TRUE, FALSE, FALSE);
+				// DRESK - 2/19/06
+				// Animation Replacement (Defaults Suck)
+				//setanim(self, self.anim_forwardright, TRUE, FALSE, FALSE);
+				setanim(self, self.anim_straferight, TRUE, FALSE, FALSE);
 			else if (self.movement_x > 0 && self.movement_y < 0)
-				setanim(self, self.anim_forwardleft, TRUE, FALSE, FALSE);
+				// DRESK - 2/19/06
+				// Animation Replacement (Defaults Suck)
+				//setanim(self, self.anim_forwardleft, TRUE, FALSE, FALSE);
+				setanim(self, self.anim_strafeleft, TRUE, FALSE, FALSE);
 			else if (self.movement_x < 0 && self.movement_y > 0)
-				setanim(self, self.anim_backright, TRUE, FALSE, FALSE);
+				// DRESK - 2/19/06
+				// Animation Replacement (Defaults Suck)
+				//setanim(self, self.anim_backright, TRUE, FALSE, FALSE);
+				setanim(self, self.anim_straferight, TRUE, FALSE, FALSE);
 			else if (self.movement_x < 0 && self.movement_y < 0)
-				setanim(self, self.anim_backleft, TRUE, FALSE, FALSE);
+				// DRESK - 2/19/06
+				// Animation Replacement (Defaults Suck)
+				//setanim(self, self.anim_backleft, TRUE, FALSE, FALSE);
+				setanim(self, self.anim_strafeleft, TRUE, FALSE, FALSE);
 			else
 				setanim(self, self.anim_run, TRUE, FALSE, FALSE);
 		}
+		// DRESK - 4/15/2007
+		// Support Taunt Animation for Button Chat
+		else if (self.buttonchat && cvar(CVAR_PLAYER_TAUNTANIMATIONDURINGCHAT) )
+			setanim(self, self.anim_taunt, TRUE, FALSE, FALSE);
 		else
 			setanim(self, self.anim_idle, TRUE, FALSE, FALSE);
 	}
-
 	if (self.weaponentity)
 	if (!self.weaponentity.animstate_override)
 		setanim(self.weaponentity, self.weaponentity.anim_idle, TRUE, FALSE, FALSE);
@@ -307,10 +349,15 @@
 			sound (self, CHAN_PROJECTILE, "misc/bodyimpact1.wav", VOL_BASE, ATTN_NORM);
 	}
 
-	if (take > 50)
-		Violence_GibSplash_At(hitloc, force * -0.1, 3, 1, self, attacker);
-	if (take > 100)
-		Violence_GibSplash_At(hitloc, force * -0.2, 3, 1, self, attacker);
+	// DRESK - 5/18/06
+	// Support Low Bandwidth Mode
+	if( cvar(CVAR_MISC_LOWBANDWIDTHLEVEL) < 3)
+	{ // Gibs Supported
+		if (take > 50)
+			Violence_GibSplash_At(hitloc, force * -0.1, 3, 1, self, attacker);
+		if (take > 100)
+			Violence_GibSplash_At(hitloc, force * -0.2, 3, 1, self, attacker);
+	}
 
 	if (!(self.flags & FL_GODMODE))
 	{
@@ -380,6 +427,10 @@
 		}
 	}
 	else
+		// DRESK
+		// Modified Blood with Bloodshower
+		// Need to take another look at this.
+		//PlayerBloodshowerDamage(self, damage);
 		Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16, self, attacker);
 
 	if(g_arena)
@@ -408,10 +459,15 @@
 			sound (self, CHAN_PROJECTILE, "misc/bodyimpact1.wav", VOL_BASE, ATTN_NORM); // FIXME possibly remove them?
 	}
 
-	if (take > 50)
-		Violence_GibSplash_At(hitloc, force * -0.1, 3, 1, self, attacker);
-	if (take > 100)
-		Violence_GibSplash_At(hitloc, force * -0.2, 3, 1, self, attacker);
+	// DRESK - 5/18/06
+	// Support Low Bandwidth Mode
+	if( cvar(CVAR_MISC_LOWBANDWIDTHLEVEL) < 3)
+	{ // Gibs Supported
+		if (take > 50)
+			Violence_GibSplash_At(hitloc, force * -0.1, 3, 1, self, attacker);
+		if (take > 100)
+			Violence_GibSplash_At(hitloc, force * -0.2, 3, 1, self, attacker);
+	}
 
 	if (time > self.spawnshieldtime)
 	{
@@ -594,8 +650,14 @@
 		}
 		// set damage function to corpse damage
 		self.event_damage = PlayerCorpseDamage;
+		
+		// DRESK - 4/25/07
+		// PreCheck Player Damage Death Events
+		PreCheckPlayerDamageDeathEvents(attacker);
+		
 		// call the corpse damage function just in case it wants to gib
 		self.event_damage(inflictor, attacker, 0, deathtype, hitloc, force);
+		
 		// set up to fade out later
 		SUB_SetFade (self, time + 12 + random () * 4, 1);
 
@@ -617,6 +679,10 @@
 		if(g_arena)
 			Spawnqueue_Unmark(self);
 
+		// DRESK - 4/25/07
+		// PostCheck Player Damage Death Events
+		PostCheckPlayerDamageDeathEvents();
+
 		if(defer_ClientKill_Now_TeamChange)
 			ClientKill_Now_TeamChange();
 
@@ -793,6 +859,11 @@
 	if(msgin == "")
 		return;
 
+	// DRESK - 2/8/07
+	// Update Client Stats Score
+	if(source.classname == "player")
+		UpdateClientStatsScoreAward(source, CLIENTSCORE_AWARD_NUMCHARACTERSSPOKEN, strlen(msgin) );
+
 	if(source.classname != "player")
 		colorstr = "^0"; // black for spectators
 	else if(teams_matter)
Index: server/Dresk_SpawnPoints.qc
===================================================================
--- server/Dresk_SpawnPoints.qc	(revision 0)
+++ server/Dresk_SpawnPoints.qc	(revision 0)
@@ -0,0 +1,173 @@
+// DRESK - Spawn Point Functions
+// Provides Spawn Point Functions
+
+// Definitions
+
+// Fields
+
+// Prototypes
+
+// Functions
+float CheckIsBadSpawnpoint()
+{ // Check Is Bad Spawnpoint
+	// NOTE: Assumed scope is spawn point
+	local float bReturn;
+		bReturn = FALSE;
+	// SUPPRESSED DUE TO NEXUIZ 2.3 FIXING BUG
+	/*
+	if(world.model == "maps/bleach.bsp")
+	{ // Bleach
+		if( vlen(self.origin - '2944 -1472 -154') < 0.5)
+			// Bad Spawnpoint
+			bReturn = TRUE;
+	}
+	*/
+	
+	if(bReturn)
+		// Increment Bad Spawnpoints
+		nNumBadSpawnpoints = nNumBadSpawnpoints + 1;
+
+	return bReturn;
+}
+void PingSpawnpoints(entity enCaller)
+{ // Ping Spawnpoints
+	local entity enSpawnFind;
+	local float nCnt;
+	
+	// Acquire First Spawnpoint
+	enSpawnFind = find(world, classname, "info_player_deathmatch");
+	
+	while(enSpawnFind != world)
+	{ // Valid Spawnpoint
+		bprint("Spawnpoint ", ftos(nCnt), " : ", vtos(enSpawnFind.origin), "\n");
+		
+		// Increment Counter
+		nCnt = nCnt + 1;
+	
+		// Acquire Next Spawnpoint
+		enSpawnFind = find(enSpawnFind, classname, "info_player_deathmatch");
+	}
+}
+void CreateSpawnPointModel()
+{ // Create Spawn Point Model
+	// NOTE: Assumed scope is creation of spawn point.
+	// Acquire Create Spawn Point Models
+	local float nCreateSpawnPointModels;
+		nCreateSpawnPointModels = cvar(CVAR_MISC_CREATESPAWNPOINTMODELS);
+		
+	if(nCreateSpawnPointModels)
+	{ // Spawn Point Models Enabled
+		local float bCreate;
+		// Determine Model Creation Necessity
+		if(self.team == 0)
+		{ // Death Match Spawn Point (or Domination)
+			if( !cvar("g_ctf") )
+			// if( !cvar("g_ctf") && !cvar("g_domination") )
+				bCreate = 1;
+			else
+				bCreate = 0;
+		}
+		else
+		{ // Team Game Spawn Point
+			if( cvar("g_ctf") || cvar("g_domination") )
+				bCreate = 1;
+			else
+				bCreate = 0;
+		}
+		
+		if(bCreate)
+		{ // Creation Necessary
+		// Backup Current Spawn Point Entity
+			local entity enSpawn;
+				enSpawn = self;
+				
+			// Spawn Model
+			self = spawn();
+				// Assign Model
+				setmodel(self, "models/domination/dom_unclaimed.md3");
+				// Assign Classname
+				self.classname = "spawnpoint_model";
+				// Assign Size (item)
+				//setsize (self, '-12 -12 -12', '12 12 12');
+				
+				// Assign Angles
+				self.angles_x = 0;
+				self.angles_y = 0;
+				// Assign Scale
+				self.scale = 0.45;
+				// Assign Effects
+				self.effects = EF_NOSHADOW | EF_LOWPRECISION | EF_STARDUST;
+				if(nCreateSpawnPointModels == 2)
+				{ // Full Bright Spawn Models
+					self.effects = self.effects | EF_FULLBRIGHT;
+					self.alpha = 0.2;
+				}
+				else
+					self.alpha = 0.5;
+				// Assign Movetype
+				self.movetype = MOVETYPE_NONE;
+				// Assign Solid
+				self.solid = SOLID_NOT;
+				
+				// Assign Color Modification
+				if(enSpawn.team == COLOR_TEAM1)
+					// Red Spawn
+					self.colormod = '1.0 0.0 0.0';
+				else
+				if(enSpawn.team == COLOR_TEAM2)
+					// Blue Spawn
+					self.colormod = '0.0 0.0 1.0';
+				else
+					// Default Spawn
+					self.colormod = '0.3 0.9 0.6';
+				
+				// Assign Origin
+				// Step 1 : Set Spawn Origin
+					vector vOrigin;
+					vOrigin = enSpawn.origin;
+					self.mins = -1 * self.maxs;
+					setorigin(self, vOrigin);
+					setsize(self, self.mins, self.maxs);
+					
+				// Step 2: Drop to Floor
+					//droptofloor();
+				// Step 3 : Append Additional Drop
+					//setorigin(self, self.origin - '0 0 10');
+				// Step 4 : Relocate spawn point
+					//relocate_spawnpoint();
+				
+				// Additional Ambient Sound Support
+				if( cvar(CVAR_MISC_SPAWNADDITIONALAMBIENTSOUNDS) )
+					SpawnAdditionalAmbientSound(self);
+					
+			// Restore Spawn Entity
+			self = enSpawn;
+		}
+	}
+}
+float CheckSpidfliskSpawnPointEventsAndIsBadSpawnPoint()
+{ // Check Spidflisk Spawn Point Events and is bad Spawn Point
+	local float bBadSpawnPoint;
+		bBadSpawnPoint = CheckIsBadSpawnpoint();
+		
+	if not (bBadSpawnPoint)
+	{ // Valid Spawn Point
+		// Support Spawn Point Model Creation
+		CreateSpawnPointModel();
+	}
+	
+	return bBadSpawnPoint;
+}
+void CheckSpidfliskSpawnPointEffects(entity enClient, entity enSpawnPoint)
+{ // Check Spidflisk Spawn Point Effects
+	if( cvar(CVAR_PLAYER_SPAWNEFFECT) )
+	{ // Valid Spawn Effect
+		// Display Particles
+		te_teleport(enClient.origin);
+		
+		// Play Sound
+		// pavlvs 09.26.09
+		// prevent double spawn sound - this is already played
+		//sound(enClient, CHAN_AUTO, "misc/spawn.wav", 1, ATTN_NORM);
+	}
+}
\ No newline at end of file
Index: server/Dresk_ItemsPowerups.qc
===================================================================
--- server/Dresk_ItemsPowerups.qc	(revision 0)
+++ server/Dresk_ItemsPowerups.qc	(revision 0)
@@ -0,0 +1,478 @@
+// DRESK - Items and Powerups
+// Provides Functions for Items and Powerups
+
+// Prototypes
+
+// Fields
+// Lixivial. 09.28.09. Removed due to 2.5.2's support.
+//.float bIsFadedItem;
+
+.float item_bOriginalEffect_Additive;
+
+.float pre_strength_finished;
+.float pre_invincible_finished;
+
+// Support Cannot Touch Items
+.float bCannotTouchItems;
+
+// Support Items in Map
+float nItemsInMap;
+
+// Functions
+float GetIsGlobalSoundItem(entity enItem)
+{ // Return Is Global Sound Item
+	local float fReturn;
+	
+	if( cvar(CVAR_ITEM_POWERUPGLOBALPICKUPSOUNDS) )
+	{ // Global Pickup Sounds Enabled
+		if( (enItem.flags & FL_POWERUP)
+			|| (enItem.netname == "100 Health")
+		)
+			fReturn = TRUE;
+		else
+			fReturn = FALSE;
+	}
+	else
+		fReturn = FALSE;
+		
+	// Return Results
+	return fReturn;
+}
+void DisplayAdvancedPowerupAcquisitionMessage(entity enClient, float nItem)
+{ // Display Advanced Powerup Acquisition Message
+		local string strPowerupTime;
+		local string strPowerupValue;
+		local string strPowerupMessage;
+		
+		local string strItemName;
+		local string strItemBonus;
+		local float fTime;
+		local string strValue;
+		
+		// Determine Time and Values
+		if(nItem == IT_STRENGTH)
+		{ // Strength Powerup
+			fTime = enClient.strength_finished;
+			strValue = cvar_string("g_balance_powerup_strength_damage");
+			
+			strItemName = "Strength";
+			strItemBonus = "Damage";
+		}
+		else
+		if(nItem == IT_INVINCIBLE)
+		{ // Shield Powerup
+			fTime = enClient.invincible_finished;
+			strValue = cvar_string("g_balance_powerup_invincible_takedamage");
+			
+			strItemName = "Shield";
+			strItemBonus = "Protection";
+		}
+		
+		// Zone Value String
+		strValue = strzone(strValue);
+		
+		// Calculate Appends
+		strPowerupTime = ftos(rint( (fTime - time) ) );
+			strPowerupTime = strzone(strPowerupTime);
+		strPowerupValue = strValue;
+			strPowerupValue = strzone(strPowerupValue);
+		
+		// Generate Message
+		strPowerupMessage = strcat("^3", strItemName, " Provides ^1", strPowerupValue);
+		strPowerupMessage = strcat(strPowerupMessage , "x^3 ", strItemBonus, " for ^1", strPowerupTime, "^3 seconds\n");
+		sprint(enClient, strPowerupMessage);
+		
+		// Unzone Strings
+		strunzone(strPowerupTime);
+		strunzone(strPowerupValue);
+		strunzone(strValue);
+}
+void CheckRespawningItemSound(entity enItem)
+{ // Check Respawning Item Sound
+	local float bPlayStandard;
+		bPlayStandard = TRUE;
+		
+	if( cvar(CVAR_ITEM_POWERUPGLOBALRESPAWNSOUNDS) )
+	{ // Powerup Global Respawn Sounds Enabled
+		if(!g_minstagib && enItem.netname == "100 Health")
+		{ // Mega Health
+			bPlayStandard = FALSE;
+			// Play Combo Sounds!  More of the same means louder!
+			sound(world, CHAN_AUTO, "misc/medplat2.wav", 1, ATTN_NONE);
+			sound(world, CHAN_AUTO, "misc/medplat2.wav", 1, ATTN_NONE);
+			sound(world, CHAN_AUTO, "misc/medplat2.wav", 1, ATTN_NONE);
+			
+			// Additional Subtle Sound
+			sound(world, CHAN_AUTO, "misc/outwater.wav", 1, ATTN_NONE);
+		}
+		else if(!g_minstagib && enItem.items == IT_STRENGTH)
+		{	// Strength
+			bPlayStandard = FALSE;
+			sound (world, CHAN_AUTO, "misc/strength_respawn.wav", 1, ATTN_NONE);	// play respawn sound
+		}
+		else if(!g_minstagib && enItem.items == IT_INVINCIBLE)
+		{	// Shield
+			bPlayStandard = FALSE;
+			sound (world, CHAN_AUTO, "misc/shield_respawn.wav", 1, ATTN_NONE);	// play respawn sound
+		}
+	}
+	// Play Standard
+	if(bPlayStandard) {
+		if(!g_minstagib && self.items == IT_STRENGTH)
+			sound (self, CHAN_TRIGGER, "misc/strength_respawn.wav", VOL_BASE, ATTN_NORM);	// play respawn sound
+		else if(!g_minstagib && self.items == IT_INVINCIBLE)
+			sound (self, CHAN_TRIGGER, "misc/shield_respawn.wav", VOL_BASE, ATTN_NORM);	// play respawn sound
+		else
+			sound (self, CHAN_TRIGGER, "misc/itemrespawn.wav", VOL_BASE, ATTN_NORM);	// play respawn sound
+	}
+}
+void CheckVerticalTiltWeapon(entity enItem)
+{ // Vertical Check item
+	local float fVerticalTiltWeapons;
+		fVerticalTiltWeapons = cvar(CVAR_ITEM_VERTICALTILTWEAPONS);
+	if(fVerticalTiltWeapons)
+	{ // Valid Vertical Tilt
+		enItem.angles_z = 0 - fVerticalTiltWeapons;
+		// Modify Origin
+		local vector vOrigin;
+			vOrigin = enItem.origin;
+			//vOrigin_z = vOrigin_z + 15;
+		setorigin(enItem, vOrigin);
+	}
+}
+void PostCheckItemStart(entity enItem, float nItemID)
+{ // Post Check Item Start
+	// Check if Dropped Weapon
+	local float bDroppedWeapon;
+	if(enItem.classname == "droppedweapon")
+		bDroppedWeapon = TRUE;
+	else
+		bDroppedWeapon = FALSE;
+		
+	// Original Item Effect Support
+	if(enItem.effects & EF_ADDITIVE)
+		enItem.item_bOriginalEffect_Additive = TRUE;
+	else
+		enItem.item_bOriginalEffect_Additive = FALSE;
+		
+	// Low Bandwidth Support (Low Precision)
+	if( cvar(CVAR_MISC_LOWBANDWIDTHLEVEL) )
+	{ // Low Bandwidth
+		if( !(enItem.effects & EF_LOWPRECISION))
+			//Low Precision Required
+			enItem.effects = enItem.effects | EF_LOWPRECISION;
+	}
+	
+	// Check for Modified 100 Health
+	// NOTE: Feature Suppressed Due to Nexuiz 2.3 Support
+	/*
+	if(enItem.netname == "100 Health" && enItem.health == 100)
+		// Base 100 Health; Modify
+		enItem.health = cvar(CVAR_ITEM_MEGAHEALTH_HEALTH);
+	*/
+	
+	if(enItem.flags & FL_WEAPON)
+	{ // Item is Weapon
+		// Support Items in Map
+		if(!bDroppedWeapon)
+			nItemsInMap = nItemsInMap | nItemID;
+		
+		// Vertical Tilt Weapons Support
+		CheckVerticalTiltWeapon(enItem);
+	}
+	
+	if(enItem.flags & FL_POWERUP)
+		// Support Items in Map
+		nItemsInMap = nItemsInMap | nItemID;
+		
+	// Support CVar-Based Powerup Times
+	if(enItem.items & IT_STRENGTH && enItem.classname != "droppedweapon")
+		enItem.strength_finished = cvar("g_balance_powerup_strength_time");
+	else
+	if(enItem.items & IT_INVINCIBLE && enItem.classname != "droppedweapon")
+		enItem.invincible_finished = cvar("g_balance_powerup_invincible_time");
+	
+	// Additional Ambient Sound Support
+	if(!bDroppedWeapon && cvar(CVAR_MISC_SPAWNADDITIONALAMBIENTSOUNDS) )
+		SpawnAdditionalAmbientSound(enItem);
+}
+
+void CheckItemRespawnEffects(entity enItem)
+{ // Check Item Respawn Effects
+	// Check Sound
+	CheckRespawningItemSound(enItem);
+	// Check Respawning Faded Item
+	// pavlvs 09.26.09 - removed due to new use of Item_Show
+	// CheckRespawningFadedItem(enItem);
+	
+	// Check for Respawn Effect Uses Sparks
+	if( cvar(CVAR_ITEM_RESPAWNEFFECTUSESSPARKS) )
+		te_spark(enItem.origin + '0 0 15', '0 0 127', 300);
+	else
+		// LordHavoc: replaced respawn stardust effect with a custom te_wizspike
+		te_wizspike(enItem.origin + enItem.mins_z * '0 0 1' + '0 0 48');
+}
+
+// Dynamic Armor Value Support
+void item_armorVar (float fArmorValue) {
+	self.armorvalue = fArmorValue;
+	self.max_armorvalue = g_pickup_armorlarge_max;
+	StartItem ("models/items/g_a25.md3", "misc/armor25.wav", g_pickup_respawntime_long, g_pickup_respawntimejitter_long, "100 Armor", IT_ARMOR, 0, 0, commodity_pickupevalfunc, 0);
+	//StartItem ("models/items/g_a25.md3", "misc/armor25.wav", 30, "100 Armor", IT_ARMOR, 0, commodity_pickupevalfunc, 0);
+}
+
+// Spawn Thrown Armor Support
+void SpawnThrownArmor(vector vOrigin)
+{
+	local entity enPlayer;
+	
+	// Backup Player Entity
+	enPlayer = self;
+	
+	if(enPlayer.armorvalue > 0)
+	{ // Valid Armor Value
+		// Spawn Armor
+		self = spawn();
+		
+		// this will cause it to be removed later
+		self.classname = "droppedweapon";
+
+		setorigin(self, vOrigin);
+		self.velocity = randomvec() * 200 + '0 0 400';
+		
+		// Lixivial. 02.27.2009
+		// Attempt at fixing some crashing bugs regarding dropped items.
+		// Cause it to leave the field of play after a certain period of time.
+		self.think = thrown_wep_think;
+		self.nextthink = time + 0.5;
+		
+		// Calculate Armor Value
+		local float fArmorValue;
+			fArmorValue = enPlayer.armorvalue;
+		// Add Additional Armor
+		local float fArmorAdd;
+			fArmorAdd = cvar(CVAR_PLAYERDEATH_DROPARMOR_ARMORADDITIONAMOUNT);
+			
+		if(fArmorAdd > 0)
+			// Additional Armor to Add
+			fArmorValue = fArmorValue + fArmorAdd;
+		
+		// Create Armor
+		item_armorVar(fArmorValue);
+	}
+	
+	// Restore Player Entity
+	self = enPlayer;
+}
+// Configurable Powerup Finished Item Support
+void item_strength_finished (float fFinishedTime)
+{
+	if(!cvar("g_powerup_strength"))
+		return;
+	
+	if(cvar("g_minstagib")) {
+		minstagib_items(IT_STRENGTH);
+	} else {
+		self.strength_finished = fFinishedTime;
+		self.effects = EF_ADDITIVE;
+		StartItem ("models/items/g_strength.md3", "misc/powerup.wav", g_pickup_respawntime_powerup, g_pickup_respawntimejitter_powerup, "Strength Powerup", IT_STRENGTH, 0, FL_POWERUP, generic_pickupevalfunc, 0);
+	}
+}
+void item_invincible_finished (float fFinishedTime)
+{
+	if(!cvar("g_powerup_shield"))
+		return;
+		
+	if(cvar("g_minstagib")) {
+		minstagib_items(IT_INVINCIBLE);
+	} else {
+		self.invincible_finished = fFinishedTime;
+		self.effects = EF_ADDITIVE;
+		StartItem ("models/items/g_invincible.md3", "misc/powerup_shield.wav", g_pickup_respawntime_powerup, g_pickup_respawntimejitter_powerup, "Invulnerability", IT_INVINCIBLE, 0, FL_POWERUP, generic_pickupevalfunc, 0);
+	}
+}
+
+// Spawn Thrown Powerup Support
+void SpawnThrownPowerups(vector vOrigin)
+{
+	local entity enPlayer;
+	local float fTime;
+	
+	if (!cvar("g_pickup_items"))
+		if (!g_minstagib)
+			return;
+		
+	// Backup Player Entity
+	enPlayer = self;
+	
+	// Strength Powerup Applicable
+	if(enPlayer.items & IT_STRENGTH)
+	{ 
+		self = spawn();
+		// this will cause it to be removed later
+		self.classname = "droppedweapon";
+
+		setorigin(self, vOrigin);
+		self.velocity = randomvec() * 200 + '0 0 400';
+		
+		// Calculate Time
+		fTime = (enPlayer.strength_finished - time) + cvar(CVAR_PLAYERDEATH_DROPPOWERUPS_POWERUPTIMEADDITION);
+		// prevent countdown for thrown powerup
+		if (fTime > cvar("g_balance_powerup_strength_time"))
+			fTime = cvar("g_balance_powerup_strength_time");
+		item_strength_finished(fTime);
+		
+		// Lixivial. 02.27.2009
+		// Attempt at fixing some crashing bugs regarding dropped items.
+		// Cause it to leave the field of play after a certain period of time.
+		self.think = thrown_wep_think;
+		self.nextthink = time + 0.5;
+		
+		// bprint("New Dropped Strength Time : ", ftos(fTime), "\n");
+
+		// making absolutely sure...
+		self.classname = "droppedweapon";
+	}
+	
+	// if(enPlayer.invincible_finished > 0)
+	// Invincible Powerup Applicable
+	if(enPlayer.items & IT_INVINCIBLE)
+	{ 
+		self = spawn();
+		// this will cause it to be removed later
+		self.classname = "droppedweapon";
+
+		setorigin(self, vOrigin);
+		self.velocity = randomvec() * 200 + '0 0 400';
+		
+		// Lixivial. 02.27.2009
+		// Attempt at fixing some crashing bugs regarding dropped items.
+		// Cause it to leave the field of play after a certain period of time.
+		self.think = thrown_wep_think;
+		self.nextthink = time + 0.5;
+		
+		// Calculate Time
+		fTime = (enPlayer.invincible_finished - time) + cvar(CVAR_PLAYERDEATH_DROPPOWERUPS_POWERUPTIMEADDITION);
+		// prevent countdown for thrown powerup
+		if (fTime > cvar("g_balance_powerup_invincible_time"))
+			fTime = cvar("g_balance_powerup_invincible_time");
+		item_invincible_finished(fTime);
+		
+		// bprint("New Dropped Invicibility Time : ", ftos(fTime), "\n");
+
+		// making absolutely sure...
+		self.classname = "droppedweapon";
+	}
+
+	// Restore alpha transparency.
+	self.alpha = 1;
+	
+	// Restore Player Entity
+	self = enPlayer;
+}
+float SpidfliskPreCheckItemTouchEventsAndCheckAllowItemTouch(entity enItem, entity enToucher)
+{ // Pre Check Item Touch Events And Allow Item Touch
+	local float bReturn;
+		bReturn = TRUE;
+	// Check for Cannot Touch Items
+	if(enToucher.bCannotTouchItems)
+		bReturn = FALSE;
+	else
+	{ // More Work to Perform
+		// Backup Strength and Invisible Finished Timers
+		enToucher.pre_strength_finished = enToucher.strength_finished;
+		enToucher.pre_invincible_finished = enToucher.invincible_finished;
+	}
+	
+	// Return Allow Item Touch
+	return bReturn;
+}
+float SpidfliskPostCheckItemTouchEventsAndIsGlobalSoundItem(entity enItem, entity enToucher)
+{ // Post Check Item Touch Events And Is Global Sound Item
+	local float bReturn;
+		bReturn = TRUE;
+		
+	// Perform Updated Powerup Logic
+	// NOTE: Use pre_strength and pre_invincible times, as the base times have already been modified with the false logic
+	if (enItem.strength_finished)
+		enToucher.strength_finished = max(enToucher.pre_strength_finished, time) + enItem.strength_finished;
+	if (enItem.invincible_finished)
+		enToucher.invincible_finished = max(enToucher.pre_invincible_finished, time) + enItem.invincible_finished;
+		
+	// Update Client Stats Score - Item Touch
+	CheckAndUpdateClientStatsScores_ItemTouch(enToucher, enItem);
+	
+	// Check Global Sound Item
+	if( GetIsGlobalSoundItem(enItem) )
+		sound(world, CHAN_AUTO, enItem.item_pickupsound, 1, ATTN_NONE);
+	else
+		bReturn = FALSE;
+		
+	// Return Is Global Sound Item
+	return bReturn;
+}
+
+/*
+	Lixivial. 09.28.09.
+	No longer used in favour of the default Item_Fading, etc.
+	CheckItemRespawnEffects(self); is now in Item_Respawn();
+
+void SpidfliskItemRespawn()
+{ // Spidflisk Item Respawn
+
+	// NOTE: Assumed scope is item.
+	// Allow Item to be Touched
+	//self.solid = SOLID_TRIGGER;
+	
+	// Check Item Respawn Effects
+	CheckItemRespawnEffects(self);
+	
+	// Assign Origin
+	setorigin (self, self.origin);
+}
+
+float CheckWillFadeUnavailableItem(entity enItem)
+{ // Check Will Fade Unavailable Item
+	local float bReturn;
+		bReturn = TRUE;
+		enItem.bIsFadedItem = FALSE;
+	// Modified Items to Render Deferred Status
+	if( cvar(CVAR_ITEM_FADEUNAVAILABLEITEMS) )
+	{ // Fade Items Support
+		enItem.colormod = '0.3 1.0 0.3';
+		enItem.effects = (enItem.effects | EF_ADDITIVE);
+		if(enItem.flags & FL_POWERUP)
+			// Fade Powerups Exceedingly
+			enItem.alpha = 0.03;
+		else
+			enItem.alpha = 0.12;
+			
+		// Assign Faded Item
+		enItem.bIsFadedItem = TRUE;
+	}
+	else
+		bReturn = FALSE;
+		
+	return bReturn;
+}
+void CheckRespawningFadedItem(entity enItem)
+{ // Check Respawning Faded Item
+	// Modified Items to Render Deferred Status
+	if(enItem.bIsFadedItem)
+	{ // Faded Item
+		
+		enItem.colormod = '1.0 1.0 1.0';
+		enItem.alpha = 1.0;
+		// Remove Additive Rendering
+		if(!enItem.item_bOriginalEffect_Additive)
+			enItem.effects &~= EF_ADDITIVE;
+		// Remove Faded Item Flag
+		bprint("spidflisk respawn faded item\n");
+		enItem.bIsFadedItem = FALSE;
+	}
+	else
+	if(enItem.model == string_null)
+		// Item Model Disabled; Enable
+		enItem.model = enItem.mdl;
+}
+*/
Index: server/Dresk_ClientPlayer.qc
===================================================================
--- server/Dresk_ClientPlayer.qc	(revision 0)
+++ server/Dresk_ClientPlayer.qc	(revision 0)
@@ -0,0 +1,863 @@
+// DRESK - Client / Player Functions
+
+// Definitions
+#define CLIENTPLAYER_CENTERPRINTTIME_MINIMUM							4.5
+#define CLIENTPLAYER_CONSOLEWIDTH_MINIMUM								800
+#define CLIENTPLAYER_CONSOLEHEIGHT_MINIMUM								600
+
+// Fields
+.float bIgnoreDamage;
+.float fPlayerModelInheritViewAngleMultiplier;
+.float tClientCheckCVarTime;
+
+// Additional Client CVars
+.float cvar_vid_conwidth;
+.float cvar_vid_conheight;
+.entity teambubbleentity;
+
+// LongJump Frame Support
+.float bIsInLongJump;
+
+// Support Long Jump Entities
+.entity enLongJump_LeftFoot;
+.entity enLongJump_RightFoot;
+
+// Functions
+/*
+vector GetPlayerColorColormodEquivalent(float playerColor)
+{
+	// pavlvs 09.27.09
+	// Convert Nexuiz player colors to RGB for colormod.
+	// Unused until I can figure out a way to use colormod on the foot trails.
+	local vector equiv;
+	switch (playerColor)
+	{
+		case 0: equiv = '1 1 1'; 		break;
+		case 1: equiv = '.72 .54 0';	break;
+		case 2: equiv = '.2 1 .8'; 		break;
+		case 3: equiv = '.24 1 0'; 		break;
+		case 4: equiv = '1 0 0';		break;
+		case 5: equiv = '.24 .78 1';	break;
+		case 6: equiv = '1 1 1'; 		break;
+		case 7: equiv = '1 1 1'; 		break;
+		case 8: equiv = '1 1 1';		break;
+		case 9: equiv = '1 1 1';		break;
+		case 10: equiv = '1 1 1'; 		break;
+		case 11: equiv = '1 1 1'; 		break;
+		case 12: equiv = '1 1 1';		break;
+		case 13: equiv = '1 1 1'; 		break;
+		case 14: equiv = '1 1 1'; 		break;
+		case 15: equiv = '1 1 1';		break;
+		default: equiv = '1 1 1';
+	}
+	
+	return equiv;
+}
+*/
+
+float GetPlayerColorPaletteEquivalent(float playerColor)
+{
+	// pavlvs 09.27.09
+	// Get the closest DP palette color possible given a Nexuiz player color
+	// because colormod doesn't work with glow_trail
+	local float equiv;
+	switch (playerColor)
+	{
+		case 0: equiv = 15; 	break;
+		case 1: equiv = 31;		break;
+		case 2: equiv = 176;	break;
+		case 3: equiv = 63; 	break;
+		case 4: equiv = 79;		break;
+		case 5: equiv = 244;	break;
+		case 6: equiv = 245; 	break;
+		case 7: equiv = 63; 	break;
+		case 8: equiv = 219;	break;
+		case 9: equiv = 144;	break;
+		case 10: equiv = 255; 	break;
+		case 11: equiv = 10; 	break;
+		case 12: equiv = 192;	break;
+		case 13: equiv = 208; 	break;
+		case 14: equiv = 95; 	break;
+		default: equiv = random() * 255;
+	}
+	
+	return equiv;
+}
+
+entity SpawnLongJumpFootEntity(entity enPlayer)
+{ // Spawn Long Jump Foot Entity
+	local entity enFoot;
+	enFoot = spawn();	
+	setmodel(enFoot, "");	
+	return enFoot;
+}
+
+void LongJumpFootEntityThink()
+{ // Long Jump Foot Entity Think
+	// Remove Glow Trail
+	self.glow_trail = 0;
+	self.effects = EF_LOWPRECISION; 
+	self.bIsInLongJump = FALSE;
+	
+}
+
+void SpawnLongJumpFootEntities(entity enPlayer)
+{ // Spawn Long Jump Foot Entities
+	// Left Foot
+	enPlayer.enLongJump_LeftFoot = SpawnLongJumpFootEntity(enPlayer);
+	setattachment(enPlayer.enLongJump_LeftFoot, enPlayer, "bip01 l foot");
+	enPlayer.enLongJump_LeftFoot.think = LongJumpFootEntityThink;
+	// Right Foot
+	enPlayer.enLongJump_RightFoot = SpawnLongJumpFootEntity(enPlayer);
+	setattachment(enPlayer.enLongJump_RightFoot, enPlayer, "bip01 r foot");
+	enPlayer.enLongJump_RightFoot.think = LongJumpFootEntityThink;
+}
+
+void ToggleLongJump(entity enPlayer, float bEnabled)
+{ // Toggle Long Jump
+	if( cvar(CVAR_PLAYER_LONGJUMPANIMATION_ENABLED))
+	{ // Long Jump Enabled
+		if(bEnabled && !enPlayer.bIsInLongJump)
+		{ // Enable Long Jump
+			//if( cvar(CVAR_PLAYER_LONGJUMPANIMATION_GLOWTRAILSONFEETTIME) > 0 )
+			if( cvar(CVAR_PLAYER_LONGJUMPANIMATION_GLOWTRAILSONFEET_ENABLED) )
+			{ 
+				// Long Jump Glow Trails Enabled
+				if not (enPlayer.enLongJump_LeftFoot)
+					// Spawn Foot Entities
+					SpawnLongJumpFootEntities(enPlayer);
+					
+				// Assign Glow Trail
+				if not (enPlayer.enLongJump_LeftFoot.glow_trail)
+				{
+					// pavlvs 09.26.09
+					// Assign shirt and pants colors to the feet (I don't know which is which)
+					enPlayer.enLongJump_LeftFoot.glow_color = GetPlayerColorPaletteEquivalent(enPlayer.clientcolors & 0x0F);
+					//enPlayer.enLongJump_LeftFoot.colormod = GetPlayerColorColormodEquivalent(enPlayer.clientcolors & 0xF0);
+					enPlayer.enLongJump_LeftFoot.glow_trail = 1;
+					enPlayer.enLongJump_RightFoot.glow_color = GetPlayerColorPaletteEquivalent((enPlayer.clientcolors & 0xF0) / 16);
+					//enPlayer.enLongJump_RightFoot.colormod = GetPlayerColorColormodEquivalent(enPlayer.clientcolors & 0x0F);
+					enPlayer.enLongJump_RightFoot.glow_trail = 1;
+					
+					enPlayer.enLongJump_LeftFoot.effects = EF_LOWPRECISION | EF_STARDUST;
+					enPlayer.enLongJump_RightFoot.effects = EF_LOWPRECISION | EF_STARDUST;
+				}
+			}
+			
+			// Assign Is In Long Jump
+			enPlayer.bIsInLongJump = TRUE;
+		}
+		else if(!bEnabled && enPlayer.bIsInLongJump)
+		{ // Disable Long Jump
+			//if( cvar(CVAR_PLAYER_LONGJUMPANIMATION_GLOWTRAILSONFEET_ENABLED) > 0)
+			if( cvar(CVAR_PLAYER_LONGJUMPANIMATION_GLOWTRAILSONFEET_ENABLED) )
+			{ // Long Jump Glow Trails Enabled
+				// Remove Glow Trail
+				if(enPlayer.enLongJump_LeftFoot)
+				{
+					if(enPlayer.enLongJump_LeftFoot.glow_trail)
+					{						
+						enPlayer.enLongJump_LeftFoot.glow_trail = 0;
+						enPlayer.enLongJump_LeftFoot.effects = EF_LOWPRECISION; 
+						enPlayer.enLongJump_RightFoot.glow_trail = 0;
+						enPlayer.enLongJump_RightFoot.effects = EF_LOWPRECISION;
+					}
+				}
+			}
+			
+			// Remove Is In Long Jump
+			enPlayer.bIsInLongJump = FALSE;
+		}
+	}
+}
+
+void CheckIsInLongJump(entity enPlayer)
+{
+	if (fabs(vlen(enPlayer.velocity) > cvar(CVAR_PLAYER_LONGJUMPANIMATION_MINIMUMSPEED)))
+	{
+		// must be some distance off the ground
+		tracebox(enPlayer.origin, enPlayer.mins, enPlayer.maxs,
+				 enPlayer.origin - ('0 0 1' * (24 + cvar(CVAR_PLAYER_LONGJUMPANIMATION_GLOWTRAILSONFEET_MINIMUMHEIGHT))),
+				 MOVE_NORMAL, enPlayer);
+		//if (trace_startsolid)
+		if (trace_fraction < 1)
+		{
+			if (enPlayer.bIsInLongJump)
+				ToggleLongJump(enPlayer, FALSE);
+		}
+		else
+			ToggleLongJump(enPlayer, TRUE);
+	}
+	else if (enPlayer.bIsInLongJump)
+		ToggleLongJump(enPlayer, FALSE);
+}
+
+string GetRandomPlayerModelString()
+{ // Return Random Player Model String
+	local string strModel;
+	// Acquire Random Number
+	local float nRandom;
+	nRandom = rint( random() * 14);
+	
+	// Acquire Random Skin
+	local float nSkin;
+	nSkin = rint( random() * 2);
+	
+	if(nRandom == 0)
+		strModel = "models/player/carni.zym";
+	else
+	if(nRandom == 1)
+		strModel = "models/player/crash.zym";
+	else
+	if(nRandom == 2)
+		strModel = "models/player/grunt.zym";
+	else
+	if(nRandom == 3)
+		strModel = "models/player/headhunter.zym";
+	else
+	if(nRandom == 4)
+		strModel = "models/player/insurrectionist.zym";
+	else
+	if(nRandom == 5)
+		strModel = "models/player/jeandarc.zym";
+	else
+	if(nRandom == 6)
+		strModel = "models/player/lurk.zym";
+	else
+	if(nRandom == 7)
+		strModel = "models/player/lycanthrope.zym";
+	else
+	if(nRandom == 8)
+		strModel = "models/player/marine.zym";
+	else
+	if(nRandom == 9)
+		strModel = "models/player/nexus.zym";
+	else
+	if(nRandom == 10)
+		strModel = "models/player/pyria.zym";
+	else
+	if(nRandom == 11)
+		strModel = "models/player/shock.zym";
+	else
+	if(nRandom == 12)
+		strModel = "models/player/skadi.zym";
+	else
+	if(nRandom == 13)
+		strModel = "models/player/specop.zym";
+	else
+		strModel = "models/player/visitant.zym";
+		
+	return strModel;
+}
+void AssignRandomPlayerCharacter(entity enClient)
+{ // Assign Random Player Character
+	// Acquire Random Player Model
+	local string strModel;
+		strModel = GetRandomPlayerModelString();
+	
+	// Acquire Random Skin
+	local float nSkin;
+	nSkin = rint( random() * 2);
+		
+	// DEBUG
+	/*
+	local string strMessage;
+		strMessage = strcat("Random Model : '", strModel, "'\nRandom Skin : '", ftos(nSkin), "'\n");
+		sprint(enClient, strMessage);
+	return;
+	*/
+	
+	// Assign Model and Skin through Stuff Commands
+	local string strCommand;
+	// Generate Model String
+	strCommand = strcat("playermodel ", strModel, "\n");
+		stuffcmd(enClient, strCommand);
+	// Generate Skin String
+	strCommand = strcat("playerskin ", ftos(nSkin), "\n");
+		stuffcmd(enClient, strCommand);
+}
+void CheckDefaultPlayerCharacterSettings(entity enClient)
+{ // Check Default Player Character Settings
+	if( cvar(CVAR_CLIENT_RANDOMIZEONDEFAULTPLAYERCHARACTER) )
+	{ // Check Settings
+		if(enClient.clientcolors == 0)
+		{ // Default, Bland Colors
+			if(enClient.playermodel == "models/player/marine.zym")
+				// Default Colors AND Player Model; Assign Random Player Model
+				AssignRandomPlayerCharacter(enClient);
+			// Acquire Random Color Combination
+			local float nPantsColor;
+				nPantsColor = rint(random() * 15);
+			local float nShirtColor;
+				nShirtColor = rint(random() * 15);
+				
+			// Generate Command String
+			local string strColors;
+			strColors = strcat("color ", ftos(nPantsColor), " ", ftos(nShirtColor), "\n");
+			
+			// Send Command
+			stuffcmd(enClient, strColors);
+		}
+	}
+}
+void SendSpidfliskRandomCustomizedCVarsAndAliases(entity enClient)
+{ // Send Spidflisk Random Customized CVars and Aliases
+	// Send Item Bobheight
+	stuffcmd(self, "cl_itembobheight 15\n");
+	// Send Item Bob Speed
+	stuffcmd(self, "cl_itembobspeed 1\n");
+	// Send Weapon Bob Changes
+	stuffcmd(self, "cl_bobmodel_side 0.6\n");
+	stuffcmd(self, "cl_bobmodel_up 0.2\n");
+	// Send Printspeed
+	stuffcmd(self, "scr_printspeed 1000000\n");
+	// Send Hitsound Alias (useful for saving bandwidth)
+	stuffcmd(self, "alias hsnd play2 misc/hit.wav\n");
+	// Send Ricochet Sound for Shotgun (but not for Crylink!)
+	stuffcmd(self, "cl_sound_ric_gunshot 1\n");
+	// Send CHSpeed Alias (useful for saving bandwidth)
+	stuffcmd(self, "alias chspeed \"cl_forwardspeed $1; cl_backspeed $1; cl_sidespeed $1; cl_upspeed $1\"\n");
+}
+void CheckSpidfliskClientCVars(entity enClient)
+{ // Check Spidflisk Client CVars
+	// Reset CVar Check Time
+	enClient.tClientCheckCVarTime = 0;
+	
+	local string strCommand;
+	if(enClient.cvar_scr_centertime < CLIENTPLAYER_CENTERPRINTTIME_MINIMUM)
+	{ // Update Client CenterPrint Time
+		// bprint("Centertime Needed Update!\n");
+		
+		strCommand = strcat("scr_centertime ", ftos(CLIENTPLAYER_CENTERPRINTTIME_MINIMUM), "\n");
+		stuffcmd(enClient, strCommand);
+		// Update Stored CVar
+		enClient.cvar_scr_centertime = CLIENTPLAYER_CENTERPRINTTIME_MINIMUM;
+	}
+	if(enClient.cvar_vid_conwidth < CLIENTPLAYER_CONSOLEWIDTH_MINIMUM)
+	{ // Update Console Width
+		// bprint("Console Width Needed Update!\n");
+		
+		strCommand = strcat("vid_conwidth ", ftos( rint(CLIENTPLAYER_CONSOLEWIDTH_MINIMUM) ), "\n");
+		stuffcmd(enClient, strCommand);
+		// Update Stored CVar
+		enClient.cvar_vid_conwidth = CLIENTPLAYER_CONSOLEWIDTH_MINIMUM;
+	}
+	if(enClient.cvar_vid_conheight < CLIENTPLAYER_CONSOLEHEIGHT_MINIMUM)
+	{ // Update Console Height
+		// bprint("Console Height Needed Update!\n");
+		
+		strCommand = strcat("vid_conheight ", ftos( rint(CLIENTPLAYER_CONSOLEHEIGHT_MINIMUM) ), "\n");
+		stuffcmd(enClient, strCommand);
+		// Update Stored CVar
+		enClient.cvar_vid_conheight = CLIENTPLAYER_CONSOLEHEIGHT_MINIMUM;
+	}
+
+	// Assign SuccessiveCenterprint Time
+	enClient.scp_tPrintTime = enClient.cvar_scr_centertime;
+}
+void PrepareClient_Spectating(entity enClient)
+{ // Prepare Client - Spectating
+	// Modified Message Feedback
+	if(time != enClient.jointime)
+	{ // Client did not just join; Display Message
+		bprint (strcat(enClient.netname, "^7 is ^5SPECTATING^7 now\n"));
+		sound(world, CHAN_AUTO, "misc/menu2.wav", 1, ATTN_NONE);
+	}
+	// Assign Backup Frags
+	enClient.nClientScore_BackupFrags = stof(GetPlayerScoreString(enClient, 2));
+	// Reset Client Stats Scores
+	// ResetClientStatsScore(enClient);
+}
+
+// Return Player Model Sex
+float GetPlayerModelSex(entity enPlayer)
+{
+	local float glob, i, fh;
+	local float currentSkin;
+	local string l, fn, currentModel, modelDescription;
+	local float nSex;
+	
+	
+	// pavlvs 09.25.09
+	// Look up the model gender dynamically rather than hardcoded models.
+	// This is entirely dependent upon the model's text file being properly formatted.
+	
+	currentModel = enPlayer.playermodel;
+	currentSkin = stof(enPlayer.playerskin);
+	
+	glob = search_begin("models/player/*.txt", TRUE, TRUE);
+	if(glob < 0)
+		return SEX_OTHER;
+	for(i = 0; i < search_getsize(glob); ++i)
+	{
+		fn = search_getfilename(glob, i);
+		fh = fopen(fn, FILE_READ);
+		if(fh < 0)
+			continue;
+		fgets(fh);	// skip model title
+		fgets(fh); // skip model name
+		if(stof(fgets(fh)) == currentSkin)
+		if(fgets(fh) == currentModel)
+		{
+			modelDescription = "";
+			fgets(fh); // skip species
+			while((l = fgets(fh)))
+			{
+				if(modelDescription != "")
+					modelDescription = strcat(modelDescription, "\n");
+				modelDescription = strcat(modelDescription, l);
+			}
+			fclose(fh);
+			break;
+		}
+		fclose(fh);
+	}
+	search_end(glob);
+	// Assign the sex based on what is found in the description section
+	if (strstr(modelDescription, "Female", 0) > 0 || strstr(modelDescription, "female", 0) > 0)
+		nSex = SEX_FEMALE;
+	else if (strstr(modelDescription, "Male", 0) > 0 || strstr(modelDescription, "male", 0) > 0)
+		nSex = SEX_MALE;
+	else
+		nSex = SEX_OTHER;
+	
+	return nSex;
+}
+
+// Return Player Model Sex Verbiage
+string GetPlayerModelSexVerbiage(entity enPlayer, string strBaseMaleString)
+{ 
+	local string strReturn;
+	local float nSex;
+	
+	// Acquire Player Model Sex
+	nSex = GetPlayerModelSex(enPlayer);
+
+	// Parse Main String
+	switch(strBaseMaleString)
+	{ 
+		case "his":
+			switch(nSex)
+			{
+				case SEX_MALE:
+					strReturn = "his";
+					break;
+				case SEX_FEMALE:
+					strReturn = "her";
+					break;
+				case SEX_OTHER:
+					strReturn = "its";
+					break;
+			}
+			break;
+		case "himself":
+			switch(nSex)
+			{
+				case SEX_MALE:
+					strReturn = "himself";
+					break;
+				case SEX_FEMALE:
+					strReturn = "herself";
+					break;
+				case SEX_OTHER:
+					strReturn = "itself";
+					break;
+			}
+			break;
+		case "he":
+			switch(nSex)
+			{
+				case SEX_MALE:
+					strReturn = "he";
+					break;
+				case SEX_FEMALE:
+					strReturn = "she";
+					break;
+				case SEX_OTHER:
+					strReturn = "it";
+					break;
+			}
+			break;
+	}
+	
+	// Return Verbiage
+	return strReturn;
+}
+
+void CheckClientAppearanceCustomizationSettings(entity enClient)
+{ 
+	 // Check for Global Colormod Decrement Amount
+	local float fColormod;
+		fColormod = cvar(CVAR_PLAYER_GLOBALCOLORMODDECREMENTAMOUNT);
+	
+	 // Valid Decrement
+	if(fColormod)
+	{
+		local vector vColormod;
+		vColormod = '1.0 1.0 1.0';
+		// Decrement Vector
+		vColormod_x = vColormod_x - fColormod;
+		vColormod_y = vColormod_y - fColormod;
+		vColormod_z = vColormod_z - fColormod;
+			
+		// Assign Colormod
+		enClient.colormod = vColormod;
+	}	
+}
+
+// Check Client Spidflisk Spawn Events
+void CheckClientSpidfliskSpawnEvents(entity enClient, entity enSpawnPoint)
+{ 
+	// Remove Touch Function; Necessary for Corpse Bouncing
+	enClient.touch = SUB_Null;
+	
+	// Remove Potential Bloody Skull Glow
+	enClient.glow_size = 0;
+	enClient.glow_trail = 0;
+
+	if not (teams_matter)
+		WaypointSprite_Disown(self.waypointsprite_attached, waypointsprite_deadlifetime);
+	
+	// Check for Hassle Default Name
+	if( (enClient.netname == "Player" || enClient.netname == "NexPlayer") && cvar(CVAR_CLIENT_HASSLEDEFAULTPLAYERNAME) )
+		centerprint(enClient, "^1CHANGE YOUR NAME\nTHIS MESSAGE WILL SHOW UNTIL\nYOU DO SO");
+	
+	// Check Client Appearance Customization Settings
+	CheckClientAppearanceCustomizationSettings(enClient);
+	
+	// Check for Spawn Effects
+	CheckSpidfliskSpawnPointEffects(enClient, enSpawnPoint);
+}
+
+
+// Lixivial. 02.21.09
+// Only show the effects for observers/spectators.
+float ObserverCustomizeEntity()
+{ 
+	if (other.classname != "player") {
+		self.alpha = 0.001;
+		self.effects |= FUNFORM_HEALTHANGEL_EFFECTS;
+		self.glow_trail = 1;
+		self.glow_color = 500;
+		return TRUE;
+	} else {
+		self.alpha = 0;
+		self.effects = 0;
+		self.glow_trail = 0;
+		self.glow_color = 0;
+		return FALSE;
+	}
+}
+
+// Check Client Spidflisk Observer Events
+void CheckClientSpidfliskObserverEvents(entity enClient)
+{
+	// Remove Negative Health (do NOT kill)
+	enClient.health = 0;
+	
+	// Remove Hide Welcome Message
+	enClient.bHideWelcomeMessage = FALSE;
+
+	// Lixivial. 02.20.09
+	// Set the observer's team and give them a team indicator.
+	enClient.team = COLOR_SPECTATOR;
+	setsize(enClient, '-1 -1 -1', '-1 -1 -1');
+	enClient.solid = SOLID_NOT;
+	enClient.movetype = MOVETYPE_NOCLIP;
+	enClient.customizeentityforclient = ObserverCustomizeEntity;
+	enClient.teambubbleentity = spawn();
+	enClient.teambubbleentity = WaypointSprite_AttachExisting("teambubble_spectator", FALSE, enClient.teambubbleentity);
+
+}
+
+void CheckClientSpidfliskConnectEvents(entity enClient)
+{ // Check Client Spidflisk Connect Events
+	// New Join Message
+	bprint (enClient.netname);
+	bprint("^7 joined the ^1fray^7");
+	
+	// Play Local Ambient Joining Sound
+	stuffcmd(enClient, "play2 ambient/air.wav\n");
+	
+	// Play Joining Sound
+	if(bUsingSpidfliskSoundPack)
+		sound(world, CHAN_AUTO, "Spidflisk/misc/PlayerJoin.ogg", 1, ATTN_NONE);
+	else
+		sound(world, CHAN_AUTO, "misc/invshot.wav", 1, ATTN_NONE);
+	
+	// Prepare Handicap
+	Handicap_PrepareNewClient(enClient);
+	
+	// Check Default Player Character Settings
+	CheckDefaultPlayerCharacterSettings(enClient);
+	
+	// Check Default Player Name
+	if( (enClient.netname == "Player") && cvar(CVAR_CLIENT_HASSLEDEFAULTPLAYERNAME) > 1)
+	{ // Default Player Name
+		// Open up Player Menu
+		stuffcmd(enClient, "set scmenu_directmenu Options\n");
+		stuffcmd(enClient, "togglemenu\n");
+	}
+		
+	// Assign Check CVar Time
+	enClient.tClientCheckCVarTime = time + 2.0;
+	
+	// Send Customized CVars and Aliases
+	SendSpidfliskRandomCustomizedCVarsAndAliases(enClient);
+	
+	// Reset Client Stats Scores
+	ResetClientStatsScore(enClient);
+	
+	// Check for Disable Version Nagging
+	if( cvar(CVAR_CLIENT_DISABLEVERSIONNAGGING) )
+		enClient.version_nagtime = 0;
+}
+void CheckClientSpidfliskDisconnectEvents(entity enClient)
+{ // Check ClientSpidflisk Disconnect Events
+	// New Leave Message
+	bprint (enClient.netname);
+	if(self.frags != -666)
+	// Display Frags (not spectator)
+		bprint ("^7 left the ^1fray^7 with ^2", GetPlayerScoreString(enClient, 2), "^7 frags\n");
+	else
+		bprint ("^7 left the ^1fray\n");
+		
+	
+	// Play Leaving Sound
+	if(bUsingSpidfliskSoundPack)
+		sound(world, CHAN_AUTO, "Spidflisk/misc/PlayerLeave.ogg", 1, ATTN_NONE);
+	else
+		sound(world, CHAN_AUTO, "misc/gib.wav", 1, ATTN_NONE);
+	
+	// Check for Weapon Laser
+	if(self.exteriorweaponentity.enExteriorWeaponLaser)
+		remove(self.exteriorweaponentity.enExteriorWeaponLaser);
+		
+	// Check for Long Jump Foot Entities
+	if(self.enLongJump_LeftFoot)
+		remove(self.enLongJump_LeftFoot);
+	if(self.enLongJump_RightFoot)
+		remove(self.enLongJump_RightFoot);
+		
+	// Reset Backup Frags
+	self.nClientScore_BackupFrags = 0;
+		
+	// Reset Additional Client CVars
+	GetCvars_handleFloat("vid_conwidth", -1, cvar_vid_conwidth, "vid_conwidth");
+	GetCvars_handleFloat("vid_conheight", -1, cvar_vid_conheight, "vid_conheight");
+}
+
+void CheckSpidfliskPlayerPreThinkEvents(entity enPlayer)
+{ // Check Spidflisk Player PreThink Events
+	// Check for Client CVars
+	if(enPlayer.tClientCheckCVarTime > 0 && time >= enPlayer.tClientCheckCVarTime)
+		CheckSpidfliskClientCVars(enPlayer);
+		
+	if(enPlayer.classname == "spectator" || enPlayer.classname == "observer")
+	{ // Spectating; Disable Movement Prediction
+		enPlayer.disableclientprediction = TRUE;
+	} else {
+		if not (enPlayer.disableclientprediction == 2) // Nexuiz uses 2 as a marker; don't change it
+			enPlayer.disableclientprediction = FALSE;
+	}
+	
+	if(enPlayer.classname == "player")
+	{ // Player
+		if(enPlayer.health <= cvar(CVAR_PLAYER_BLEEDBELOWHEALTHLEVEL) )
+			// Bleed
+			enPlayer.modelflags = MF_GIB;
+		else
+			enPlayer.modelflags = 0;
+	}
+	
+	if(enPlayer.classname == "observer")
+	{ // Observer
+		if(enPlayer.flags & FL_JUMPRELEASED)
+		{ // Input Processing
+			if(enPlayer.BUTTON_CROUCH)
+			{ // Crouch Pressed; Toggle Welcome Message
+				// Suppress Additional Buttons
+				enPlayer.flags = enPlayer.flags - FL_JUMPRELEASED;
+				
+				if(enPlayer.bHideWelcomeMessage)
+				{ // Display Welcome Message
+					enPlayer.bHideWelcomeMessage = FALSE;
+					enPlayer.welcomemessage_time = 0;
+				}
+				else
+				{
+					// Hide Welcome Message
+					enPlayer.bHideWelcomeMessage = TRUE;
+					// Purge Centerprint
+					centerprint(enPlayer, "");
+				}
+			}
+		}
+		
+		/*
+		// NOTE: This must unfortunately be performed in the native PlayerPreThink function.
+		else
+		{ // Check for Input Reset
+			if(!enPlayer.BUTTON_CROUCH)
+				// Reset Input
+				enPlayer.flags = enPlayer.flags | FL_JUMPRELEASED;
+		}
+		*/
+	}
+}
+
+void CheckSpidfliskJumpPadEvents(entity enJumpingEntity)
+{ // Check Spidflisk Player JumpPad Events
+	if(enJumpingEntity.classname == "player")
+	{ // Player Events
+		// Support Feedback Effect
+		if( cvar(CVAR_JUMPPAD_PLAYERLIGHTFLASH) )
+			te_smallflash(enJumpingEntity.origin);
+			
+		// Forcing LongJump on Jumppads
+		ToggleLongJump(enJumpingEntity, TRUE);
+			
+		// Update Client Stats Score
+		UpdateClientStatsScoreAward(enJumpingEntity, CLIENTSCORE_AWARD_NUMJUMPPADS, 1);
+	}
+	else
+	{
+		// Convert Flying Projectiles to Bouncing on Impact
+		if(enJumpingEntity.movetype == MOVETYPE_FLY && cvar(CVAR_JUMPPAD_CONVERTFLYTOBOUNCE) )
+		{ // Valid Projectile
+			// Modify Movetype
+			
+			/* Lixivial. 09.25.09
+			   Remove, due to 2.5.2 featureset.
+			enJumpingEntity.movetype = MOVETYPE_BOUNCE;
+			
+			// Lixivial. 02.12.09.
+			// Resend the modified projectile.
+			// Note some of these don't actually bounce on the pad.
+			if(enJumpingEntity.classname == "plasma_prim")
+				CSQCProjectile(enJumpingEntity, TRUE, PROJECTILE_ELECTRO_BEAM, TRUE);
+			else if(enJumpingEntity.classname == "plasma")
+				CSQCProjectile(enJumpingEntity, TRUE, PROJECTILE_ELECTRO, TRUE);
+			else if(enJumpingEntity.classname == "missile")
+				CSQCProjectile(enJumpingEntity, TRUE, PROJECTILE_HAGAR, TRUE);
+			else if(enJumpingEntity.classname == "missile_secondary")
+				CSQCProjectile(enJumpingEntity, TRUE, PROJECTILE_HAGAR_BOUNCING, TRUE);
+			else if(enJumpingEntity.classname == "hlacbolt")
+				CSQCProjectile(enJumpingEntity, TRUE, PROJECTILE_HLAC, TRUE);
+			else if(enJumpingEntity.classname == "laserbolt")
+				CSQCProjectile(enJumpingEntity, TRUE, PROJECTILE_LASER, TRUE);
+			else if(enJumpingEntity.classname == "laserbolt_alternate")
+				CSQCProjectile(enJumpingEntity, TRUE, PROJECTILE_LASER_SECONDARY, TRUE);
+			else if(enJumpingEntity.classname == "porto")
+				CSQCProjectile(enJumpingEntity, TRUE, PROJECTILE_PORTO_RED, TRUE);
+			else if(enJumpingEntity.classname == "rocket")
+				CSQCProjectile(enJumpingEntity, cvar("g_balance_rocketlauncher_speedaccel") == 0 && !g_laserguided_missile, PROJECTILE_ROCKET, TRUE);
+			*/
+
+			// Report Feature
+			if(enJumpingEntity.owner.classname == "player")
+				// Valid Player Owner
+				HelpText_CustomFeature_JumppadConvertFlyToBounce(enJumpingEntity.owner);
+		}
+	
+		// Check for "Stuck" Entity
+		if( cvar(CVAR_JUMPPAD_STUCKOBJECTTRIGGERCOUNT) )
+		{ // Valid Stuck Object Trigger Count
+			// Increment Trigger Count
+			enJumpingEntity.nNumJumppadTriggers = enJumpingEntity.nNumJumppadTriggers + 1;
+			
+			if(enJumpingEntity.nNumJumppadTriggers > cvar(CVAR_JUMPPAD_STUCKOBJECTTRIGGERCOUNT) )
+			{ // Object is stuck; Remove
+				if(enJumpingEntity.movetype == MOVETYPE_BOUNCE && enJumpingEntity.think)
+				{ // Bounces and has Think Function; Call
+					enJumpingEntity.nextthink = time;
+				}
+				else
+					// Remove Entity
+					remove(enJumpingEntity);
+			}
+		}
+	}
+}
+void CheckSpidfliskPlayerPhysicsEvents(entity enClient)
+{ // Check Spidflisk Player Physics Events
+	if(enClient.fPlayerModelInheritViewAngleMultiplier != 0)
+		// Inherit All View Angles
+		enClient.angles = enClient.v_angle * enClient.fPlayerModelInheritViewAngleMultiplier;
+}
+float CheckSpidfliskPlayerSpeedMods(entity enPlayer, float fCurrentSpeed)
+{ // Check Speed Mods
+	if(enPlayer.FunFunc_nPlayerForm == FUNFORM_DEATHSPECTRE)
+	{ // Death Spectre; Provide More Speed
+		fCurrentSpeed = fCurrentSpeed * 2.0;
+	}
+	
+	// Return Modded Speed
+	return fCurrentSpeed;
+}
+
+void CheckSpidfliskPostPlayerJumpEvents(entity enPlayer)
+{ // Check Spidflisk Post Player Jump Events
+	// Report Help Text
+	HelpText_Tip_BunnyHop(enPlayer);
+	
+	// Purge LongJump to Prevent Bunny Hopping Looking Stupid
+	ToggleLongJump(enPlayer, FALSE);
+	
+	// Update Client Score
+	UpdateClientStatsScore(enPlayer, CLIENTSCORE_NUMJUMPS, 1);
+	
+	// Play Footstep Sound for Jump
+	if( cvar(CVAR_PLAYER_FOOTSTEPFORJUMP) )
+	{ // Footstep for Jump
+		local float steprandom;
+		steprandom = random() * 2;
+		if (steprandom < 1)
+			sound (enPlayer, CHAN_AUTO, "misc/footstep01.wav", 1, ATTN_NORM);
+		else
+			sound (enPlayer, CHAN_AUTO, "misc/footstep02.wav", 1, ATTN_NORM);
+	}
+}
+
+void SpidfliskUpdateTeamBubble()
+{
+	local string miscWaypointSprite;
+	
+	miscWaypointSprite = cvar_string(CVAR_MISC_WAYPOINTSPRITECOLOR);
+
+	if (!self.modelindex || !teams_matter)
+		return;
+
+	// spawn a teambubble entity if needed	
+	// Lixivial. 02.14.09.
+	// Since I'm not directly attaching a spawned model to
+	// the player, and am using a subset of waypoint routines
+	// the items in TeamBubbleThink are no longer relevant,
+	// and have to be accommodated here.
+	if (!self.teambubbleentity && teams_matter || 
+		((self.teambubbleentity.classname != "attached_sprite_waypoint" && !self.waypointsprite_attachedforcarrier) || 
+		 (self.teambubbleentity.classname == "attached_sprite_waypoint" 
+		  && self.teambubbleentity.mdl != miscWaypointSprite)))
+	{
+		local entity ent;
+	
+		ent = self.teambubbleentity;
+		ent = spawn();
+		
+		// 2.5 method
+		// Lixivial. 08.21.08.
+		// Colour-based team indicators.
+		if (cvar(CVAR_MISC_WAYPOINTSPRITECOLOR) == 1)
+			ent = WaypointSprite_AttachExisting(TeamBubbleName(self.team), cvar(CVAR_MISC_WAYPOINTSPRITEFADE), ent);
+		else {
+			if (self.team == COLOR_SPECTATOR)
+				ent = WaypointSprite_AttachExisting("teambubble_spectator", cvar(CVAR_MISC_WAYPOINTSPRITEFADE), ent);
+			else
+				ent = WaypointSprite_AttachExisting("teambubble_neutral", cvar(CVAR_MISC_WAYPOINTSPRITEFADE), ent);
+		}
+		
+		// A lookup to maintain what the state was: coloured vs gray
+		ent.mdl = miscWaypointSprite;
+		self.teambubbleentity = ent;
+	}
+}
\ No newline at end of file
Index: server/antilag.qh
===================================================================
--- server/antilag.qh	(revision 7768)
+++ server/antilag.qh	(working copy)
@@ -5,4 +5,4 @@
 void antilag_restore(entity e);
 
 #define ANTILAG_LATENCY(e) min(0.4, e.ping * 0.001)
-// add one ticrate?
+// add one ticrate?
\ No newline at end of file
Index: server/defs.qh
===================================================================
--- server/defs.qh	(revision 7768)
+++ server/defs.qh	(working copy)
@@ -1,3 +1,223 @@
+// DRESK - Definitions
+// Provides definitions and default values for new features.
+
+// Spidflisk Modification
+#define SPIDFLISK_VERSION													"Spidflisk v0.9.5"
+
+// Support Legacy Clients
+// Current Legacy Support : < NONE
+// #define SPIDFLISK_SUPPORTLEGACYCLIENTS										1
+
+// Bots
+// SUPPRESSED DUE TO NEXUIZ 2.0 IMPLEMENTATION
+// #define SPIDFLISKBOTS_DEFAULT_FILLBOTSBASECOUNT								4
+// #define SPIDFLISKBOTS_DEFAULT_FILLBOTSSKILL									2
+
+#define SPIDFLISKBOTS_DEFAULT_DISPLAYBOTSFILL_TIMER							"133"
+
+// Display Game Settings
+#define DISPLAYGAMESETTINGS_DEFAULT_TIMER									"60"
+
+// Corpse Bouncing
+#define CORPSE_BOUNCING_DEFAULT_NUMBOUNCES									3
+// Corpse FadeTime
+#define CORPSE_FADETIME_DEFAULT_TIME										60
+
+// Gib FadeTime
+#define GIB_FADETIME_DEFAULT_TIME											7
+
+// Handicap
+#define HANDICAP_DEFAULT_VALUE												100
+#define HANDICAP_DEFAULT_MINIMUM											"10"
+#define HANDICAP_DEFAULT_MAXIMUM											"200"
+#define HANDICAP_DEFAULT_CHANGETIME											"30"
+#define HANDICAP_DEFAULT_DISPLAYHELPMESSAGE_TIMER							"211"
+
+// Client
+
+// Crouching
+#define CROUCH_DEFAULT_ATTACKREDUCTIONPERCENT								"30"
+
+
+// Weapons
+#define WEAPONS_DEFAULT_VERTICALTILT										30
+
+// Weapon Balance
+#define WEAPONBALANCE_DEFAULT_LASERALTFIRE_SPEEDDIVISOR						"7.0"
+#define WEAPONBALANCE_DEFAULT_LASERALTFIRE_RADIUSMULTIPLIER					"2.0"
+
+#define WEAPONBALANCE_DEFAULT_UZI_ALTFIREPUSHAMOUNT							"150"
+
+// Sexes
+#define SEX_MALE															0
+#define SEX_FEMALE															1
+#define SEX_OTHER															2
+
+// Rocket Launcher Explosion Types
+#define ROCKETLAUNCHER_EXPLOSIONTYPE_TOUCH									1
+#define ROCKETLAUNCHER_EXPLOSIONTYPE_DAMAGED								2
+#define ROCKETLAUNCHER_EXPLOSIONTYPE_TIME									3
+#define ROCKETLAUNCHER_EXPLOSIONTYPE_TRIGGERED								4
+
+// Custom CVars
+#define CVAR_MISC_USESPIDFLISKSOUNDPACK										"spidflisk_misc_UseSpidfliskSoundPack"
+#define CVAR_MISC_LOWBANDWIDTHLEVEL											"spidflisk_misc_LowBandwidthLevel"
+#define CVAR_MISC_PLAYERSONLYPLAYHITGROUNDSOUNDS							"spidflisk_misc_PlayersOnlyPlayHitGroundSounds"
+#define CVAR_MISC_REMOVEKILLCOUNTREPORTS									"spidflisk_misc_RemoveKillCountReports"
+#define CVAR_MISC_DISPLAYGAMESETTINGSTIME									"spidflisk_misc_DisplayGameSettingsTime"
+#define CVAR_MISC_SPAWNADDITIONALAMBIENTSOUNDS								"spidflisk_misc_SpawnAdditionalAmbientSounds"
+#define CVAR_MISC_CREATESPAWNPOINTMODELS									"spidflisk_misc_CreateSpawnPointModels"
+#define CVAR_MISC_SUPPRESSBPRINTSWHENNOPLAYERSORONLYBOTS					"spidflisk_misc_SuppressBPrintsWhenNoPlayersOrOnlyBots"
+#define CVAR_MISC_WAYPOINTSPRITECOLOR										"spidflisk_misc_WaypointSpriteColor"
+#define CVAR_MISC_WAYPOINTSPRITENODEPTHTEST									"spidflisk_misc_WaypointSpriteNoDepthTest"
+#define CVAR_MISC_WAYPOINTSPRITEFADE										"spidflisk_misc_WaypointSpriteFade"
+
+
+#define CVAR_WORLD_ENTITYDETAILLEVEL_BOBBING								"spidflisk_world_EntityDetailLevel_Bobbing"
+#define CVAR_WORLD_ENTITYDETAILLEVEL_ROTATING								"spidflisk_world_EntityDetailLevel_Rotating"
+
+#define CVAR_INTERMISSION_DISABLEMUSIC										"spidflisk_intermission_DisableMusic"
+#define CVAR_INTERMISSION_FADETOBLACK										"spidflisk_intermission_FadeToBlack"
+#define CVAR_INTERMISSION_DISPLAYWINNINGPLAYER								"spidflisk_intermission_DisplayWinningPlayer"
+#define CVAR_INTERMISSION_USEADVANCEDCLIENTSCORES							"spidflisk_intermission_UseAdvancedClientScores"
+#define CVAR_INTERMISSION_ADVANCEDCLIENTSCORES_NUMBEROFAWARDSTODISPLAY		"spidflisk_intermission_AdvancedClientScores_NumberOfAwardsToDisplay"
+#define CVAR_INTERMISSION_PLAYERSGLOW										"spidflisk_intermission_PlayersGlow"
+#define CVAR_INTERMISSION_USEADVANCEDVICTORYMESSAGE							"spidflisk_intermission_UseAdvancedVictoryMessage"
+
+// SUPPRESSED DUE TO NEXUIZ 2.0 IMPLEMENTATION
+// #define CVAR_BOT_FILLBOTSBASECOUNT										"spidflisk_bot_FillBotsBaseCount"
+// #define CVAR_BOT_BASECOUNTINCLUDESSPECTATORS								"spidflisk_bot_BaseCountIncludesSpectators"
+// #define CVAR_BOT_FILLBOTSSKILL											"spidflisk_bot_FillBotsSkill"
+
+#define CVAR_BOT_DISPLAYBOTSFILLTIME										"spidflisk_bot_DisplayBotsFillTime"
+
+#define CVAR_CORPSE_CORPSEFADETIME											"spidflisk_corpse_FadeTime"
+#define CVAR_CORPSE_CORPSEBOUNCES											"spidflisk_corpse_Bounces"
+
+#define CVAR_GIB_FADETIME													"spidflisk_gib_FadeTime"
+
+#define CVAR_CLIENT_HASSLEDEFAULTPLAYERNAME									"spidflisk_client_HassleDefaultPlayerName"
+#define CVAR_CLIENT_RANDOMIZEONDEFAULTPLAYERCHARACTER						"spidflisk_client_RandomizeOnDefaultPlayerCharacter"
+#define CVAR_CLIENT_REPORTSPECTATETOTARGET									"spidflisk_client_ReportSpectateToClient"
+#define CVAR_CLIENT_DISABLEVERSIONNAGGING									"spidflisk_client_DisableVersionNagging"
+// SUPPRESSED DUE TO NEXUIZ 2.3 IMPLEMENTATION
+// #define CVAR_CLIENT_LIMITONEHITSOUNDPERFRAME								"spidflisk_client_LimitOneHitSoundPerFrame"
+#define CVAR_CLIENT_WAYPOINTSPRITENODEPTHTEST								"spidflisk_client_WaypointSpriteNoDepthTest"
+
+#define CVAR_PLAYER_SPAWNEFFECT												"spidflisk_player_SpawnEffect"
+#define CVAR_PLAYER_BLEEDBELOWHEALTHLEVEL									"spidflisk_player_BleedBelowHealthLevel"
+#define CVAR_PLAYER_TAUNTANIMATIONDURINGCHAT								"spidflisk_player_TauntAnimationDuringChat"
+#define CVAR_PLAYER_FOOTSTEPFORJUMP											"spidflisk_player_FootstepForJump"
+#define CVAR_PLAYER_CROUCHATTACKREDUCTIONPERCENTILE							"spidflisk_player_CrouchAttackReductionPercentile"
+#define CVAR_PLAYER_GLOBALCOLORMODDECREMENTAMOUNT							"spidflisk_player_GlobalColormodDecrementAmount"
+#define CVAR_PLAYER_LONGJUMPANIMATION_ENABLED								"spidflisk_player_LongJumpAnimation_Enabled"
+#define CVAR_PLAYER_LONGJUMPANIMATION_MINIMUMSPEED							"spidflisk_player_LongJumpAnimation_MinimumSpeed"
+#define CVAR_PLAYER_LONGJUMPANIMATION_GLOWTRAILSONFEET_ENABLED				"spidflisk_player_LongJumpAnimation_GlowTrailsOnFeet_Enabled"
+#define CVAR_PLAYER_LONGJUMPANIMATION_GLOWTRAILSONFEET_MINIMUMHEIGHT		"spidflisk_player_LongJumpAnimation_GlowTrailsOnFeet_MinimumHeight"
+
+#define CVAR_PLAYER_HANDICAP_ALLOW											"spidflisk_player_Handicap_Allow"
+#define CVAR_PLAYER_HANDICAP_CHANGETIME										"spidflisk_player_Handicap_ChangeTime"
+#define CVAR_PLAYER_HANDICAP_SHOWATTACKERVICTIMHANDICAP						"spidflisk_player_Handicap_ShowAttackerVictimHandicap"
+#define CVAR_PLAYER_HANDICAP_MINIMUM										"spidflisk_player_Handicap_Minimum"
+#define CVAR_PLAYER_HANDICAP_MAXIMUM										"spidflisk_player_Handicap_Maximum"
+#define CVAR_PLAYER_HANDICAP_DISPLAYHELPMESSAGETIME							"spidflisk_player_Handicap_DisplayHelpMessageTime"
+
+#define CVAR_PLAYERDEATH_CORPSEGIBONLYONEXPLOSIVES							"spidflisk_playerdeath_CorpseGibOnlyOnExplosives"
+#define CVAR_PLAYERDEATH_SHOWATTACKERPING									"spidflisk_playerdeath_ShowAttackerPing"
+#define CVAR_PLAYERDEATH_SHOWVICTIMPING										"spidflisk_playerdeath_ShowVictimPing"
+#define CVAR_PLAYERDEATH_SHOWATTACKERHEALTHARMOR							"spidflisk_playerdeath_ShowAttackerHealthArmor"
+#define CVAR_PLAYERDEATH_BLOODYSKULLDEATH									"spidflisk_playerdeath_BloodySkullDeath"
+#define CVAR_PLAYERDEATH_DROPPOWERUPS										"spidflisk_playerdeath_DropPowerups"
+#define CVAR_PLAYERDEATH_DROPPOWERUPS_POWERUPTIMEADDITION					"spidflisk_playerdeath_DropPowerups_PowerupTimeAddition"
+#define CVAR_PLAYERDEATH_DROPARMOR											"spidflisk_playerdeath_DropArmor"
+#define CVAR_PLAYERDEATH_DROPARMOR_ARMORADDITIONAMOUNT						"spidflisk_playerdeath_DropArmor_ArmorAdditionAmount"
+
+// SUPPRESSED DUE TO NEXUIZ 2.3 IMPLEMENTATION
+// #define CVAR_WEAPON_FIXBULLETIRICOCHETSOUNDS								"spidflisk_weapon_FixBulletRicochetSounds"
+#define CVAR_WEAPON_RAPIDWEAPONSWITCHES										"spidflisk_weapon_RapidWeaponSwitches"
+#define CVAR_WEAPON_FIRINGSOUNDSUSEDYNAMICCHANNELS							"spidflisk_weapon_FiringSoundsUseDynamicChannels"
+#define CVAR_WEAPON_EXTERIORWEAPONINHERITSOWNERVERTICALANGLE				"spidflisk_weapon_ExteriorWeaponInheritsOwnerVerticalAngle"
+#define CVAR_WEAPON_EXTERIORWEAPONHASLASERSIGHT								"spidflisk_weapon_ExteriorWeaponHasLaserSight"
+// SUPPRESSED DUE TO NEXUIZ 2.3 IMPLEMENTATION
+// #define CVAR_WEAPON_USEADVANCEDOWNERSHIPMESSAGES							"spidflisk_weapon_UseAdvancedOwnershipMessages"
+#define CVAR_WEAPON_GRENADELAUNCHER_EXTENDEDEFFECTS							"spidflisk_weapon_GrenadeLauncher_ExtendedEffects"
+#define CVAR_WEAPON_HAGAR_EXTENDEDEFFECTS									"spidflisk_weapon_Hagar_ExtendedEffects"
+#define CVAR_WEAPON_LASER_ALLOWALTFIRE										"spidflisk_weapon_Laser_AllowAltFire"
+#define CVAR_WEAPON_LASER_ALTFIRESPEEDDIVISOR								"spidflisk_weapon_Laser_AltFireSpeedDivisor"
+#define CVAR_WEAPON_LASER_ALTFIRERADIUSMULTIPLIER							"spidflisk_weapon_Laser_AltFireRadiusMultiplier"
+#define CVAR_WEAPON_LASER_ALTFIREGLOWCOLOR									"spidflisk_weapon_Laser_AltFireGlowColor"
+
+#define CVAR_WEAPON_ELECTRO_USEREDUCEDCOMBOEXPLOSION						"spidflisk_weapon_Electro_UseReducedComboExplosion"
+// SUPPRESSED DUE TO NEXUIZ 2.0 IMPLEMENTATION
+// #define CVAR_WEAPON_ELECTRO_USENEWALTFIRE								"spidflisk_weapon_Electro_UseNewAltFire"
+#define CVAR_WEAPON_CRYLINK_DETAILEDPROJECTILETIME							"spidflisk_weapon_Crylink_DetailedProjectileTime"
+#define CVAR_WEAPON_UZI_ALTFIREPUSHAMOUNT									"spidflisk_weapon_Uzi_AltFirePushAmount"
+#define CVAR_WEAPON_HAGAR_USEMODIFIEDEXPLOSION								"spidflisk_weapon_Hagar_UseModifiedExplosion"
+#define CVAR_WEAPON_NEX_PREVENTIMMEDIATEVELOCITYDAMAGETIME					"spidflisk_weapon_Nex_PreventImmediateVelocityDamageTime"
+#define CVAR_WEAPON_NEX_DETAILEDPROJECTILESPEED								"spidflisk_weapon_Nex_DetailedProjectileSpeed"
+#define CVAR_WEAPON_ROCKETLAUNCHER_TRIGGER_DAMAGEMULTIPLIER					"spidflisk_weapon_RocketLauncher_Trigger_DamageMultiplier"
+#define CVAR_WEAPON_ROCKETLAUNCHER_TRIGGER_RADIUSMULTIPLIER					"spidflisk_weapon_RocketLauncher_Trigger_RadiusMultiplier"
+
+#define CVAR_PLATFORM_LIGHTFLASH											"spidflisk_platform_LightFlash"
+
+#define CVAR_JUMPPAD_CONVERTFLYTOBOUNCE										"spidflisk_jumppad_ConvertFlyToBounce"
+#define CVAR_JUMPPAD_PLAYERLIGHTFLASH										"spidflisk_jumppad_PlayerLightFlash"
+#define CVAR_JUMPPAD_STUCKOBJECTTRIGGERCOUNT								"spidflisk_jumppad_StuckObjectTriggerCount"
+
+#define CVAR_ITEM_FADEUNAVAILABLEITEMS										"spidflisk_item_FadeUnavailableItems"
+#define CVAR_ITEM_ALWAYSPICKUPITEMS											"spidflisk_item_AlwaysPickupItems"
+#define CVAR_ITEM_RESPAWNEFFECTUSESSPARKS									"spidflisk_item_RespawnEffectUsesSparks"
+#define CVAR_ITEM_POWERUPGLOBALPICKUPSOUNDS									"spidflisk_item_PowerupGlobalPickupSounds"
+#define CVAR_ITEM_POWERUPGLOBALRESPAWNSOUNDS								"spidflisk_item_PowerupGlobalRespawnSounds"
+#define CVAR_ITEM_VERTICALTILTWEAPONS										"spidflisk_item_VerticalTiltWeapons"
+// SUPPRESSED DUE TO NEXUIZ 2.3 IMPLEMENTATION
+// #define CVAR_ITEM_MEGAHEALTH_HEALTH										"spidflisk_item_MegaHealth_Health"
+// #define CVAR_ITEM_ARMOR_LARGERESPAWNTIME									"spidflisk_item_LargeArmor_RespawnTime"
+
+#define CVAR_GAME_CTF_NODEPTHTESTFLAGS										"spidflisk_game_CTF_NoDepthTestFlags"
+#define CVAR_GAME_CTF_GLOBALFLAGSOUNDS										"spidflisk_game_CTF_GlobalFlagSounds"
+#define CVAR_GAME_CTF_FLAGGLOWTRAILS										"spidflisk_game_CTF_FlagGlowTrails"
+#define CVAR_GAME_CTF_DISABLECAPTURERECORDREPORTS							"spidflisk_game_CTF_DisableCaptureRecordReports"
+#define CVAR_GAME_CROUCHSPEEDMODIFIER										"spidflisk_game_CrouchSpeedModifier"
+
+// DRESK - 3/7/06
+// Jumppad Extensions
+.float nNumJumppadTriggers;
+
+.float cvar_cl_hidewaypoints;
+
+// DRESK - 12/19/06
+// Support BPrints Currently Suppressed
+float bBPrintsCurrentlySuppressed;
+
+// DRESK - 6/14/06
+// Additional Ambient Sound Counter
+float nNumSpawnedAmbientSounds;
+
+// DRESK - 2/25/06
+// Successive Centerprint Support
+.string scp_strCenterprint;
+.float scp_bNeedsFree;
+.float scp_tEndTime;
+.float scp_tPrintTime;
+// .float scp_nNumCurrentPrints;
+
+// DRESK - 2/19/06
+// "GlobalSound" Item Pickup Support
+// .float item_bIsGlobalSoundItem;
+
+// Count Bad Spawnpoints
+float nNumBadSpawnpoints;
+
+// Utilize Global Variable Initialized at Map Loadtime
+float bUsingSpidfliskSoundPack;
+
+// DRESK - 12/22/06
+// Support Suppressed Falling Damage Time
+// UPDATE : 1/21/07
+// NOTE: Suppressed due to Nexuiz 2.2.2 logic
+// .float tSuppressedFallingDamage;
+
 #define INDEPENDENT_ATTACK_FINISHED
 
 float require_spawnfunc_prefix; // if this float exists, only functions with spawnfunc_ name prefix qualify as spawn functions
@@ -13,6 +233,7 @@
 #define BUTTON_USE    buttonuse
 #define BUTTON_DRAG   button8
 
+
 // Globals
 
 float ctf_score_value(string parameter);
@@ -166,17 +387,20 @@
 .string playermodel;
 .string playerskin;
 
+// Lixivial. 02.16.09.
+// Add gender field.
+//.string playergender;
 .float species;
 
 .float	respawntime;
 .float	respawntimejitter;
 //.float	chasecam;
 
-.float	damageforcescale;
+.float  damageforcescale;
 
-//.float          gravity;
+//.float  gravity;
 
-.float		dmg;
+.float  dmg;
 
 // for railgun damage (hitting multiple enemies)
 .float railgunhit;
@@ -359,7 +583,6 @@
 void DropBall(entity ball, vector org, vector vel);
 void DropAllRunes(entity pl);
 
-
 typedef .float floatfield;
 floatfield Item_CounterField(float it);
 
Index: server/g_world.qc
===================================================================
--- server/g_world.qc	(revision 7768)
+++ server/g_world.qc	(working copy)
@@ -122,7 +122,7 @@
 			remove(self);
 			return;
 		}
-
+		
 	}
 	else if (timeoutStatus == 0) { //if a player called the resumegame command (which set timeoutStatus to 0 already)
 		FOR_EACH_REALCLIENT(plr) {
@@ -301,7 +301,7 @@
 		tracebox(o, PL_MIN, PL_MAX, o - '0 0 32768', MOVE_WORLDONLY, world);
 		if(trace_fraction == 1)
 			continue;
-
+		
 		v = trace_endpos;
 
 		for(i = 0; i < 64; i += 4)
@@ -379,7 +379,7 @@
 {
 	float fd, l, i, j, n;
 	string s, col;
-
+	
 	cvar = cvar_builtin;
 	cvar_string = cvar_string_builtin;
 	cvar_set = cvar_set_builtin;
@@ -390,16 +390,16 @@
 	world_already_spawned = TRUE;
 
 	remove = remove_safely; // during spawning, watch what you remove!
-
+	
 	check_unacceptable_compiler_bugs();
-
+	
 	if(cvar_string("cvar_check_default") != "bypass")
 	{
 		if(cvar_string("cvar_check_default") != CVAR_CHECK_DEFAULT)
-			error("Config file mismatch! Please update defaultNexuiz.cfg to match the QuakeC code, and restart the engine!");
+			error("Config file mismatch! Please update defaultNexuiz.cfg to match the QuakeC code!");
 
 		if(cvar_string("cvar_check_weapons") != CVAR_CHECK_WEAPONS)
-			error("Config file mismatch! Please update weapons.cfg and weaponsHavoc.cfg to match the QuakeC code, and restart the engine!");
+			error("Config file mismatch! Please update weapons.cfg and weaponsHavoc.cfg to match the QuakeC code!");
 	}
 
 	compressShortVector_init();
@@ -422,7 +422,11 @@
 		ServerProgsDB = db_load("server.db");
 
 	TemporaryDB = db_create();
-
+	
+	// DRESK - 5/28/07
+	// Check Spidflisk World Spawn Events
+	CheckSpidfliskWorldSpawnEvents();
+	
 	/*
 	TODO sound pack system
 	// initialize sound pack system
@@ -494,9 +498,10 @@
 	cvar_set("sv_q3acompat_machineshotgunswap", "0");
 
 	precache();
+		
+	// Dresk
+	Dresk_WaypointSprite_Init();
 
-	WaypointSprite_Init();
-
 	//if (g_domination)
 	//	dom_init();
 
@@ -590,6 +595,7 @@
 	addstat(STAT_SWITCHWEAPON, AS_INT, switchweapon);
 	addstat(STAT_GAMESTARTTIME, AS_FLOAT, stat_game_starttime);
 	addstat(STAT_ALLOW_OLDNEXBEAM, AS_INT, stat_allow_oldnexbeam);
+	
 	Nagger_Init();
 
 	addstat(STAT_STRENGTH_FINISHED, AS_FLOAT, strength_finished);
@@ -641,13 +647,13 @@
 	MapInfo_ClearTemps();
 
 	records_reply = strzone(getrecords());
-
+	
 	ClientInit_Spawn();
 	RandomSeed_Spawn();
 
 	localcmd("\n_sv_hook_gamestart ", GetGametype(), ";");
-
 	world_initialized = 1;
+	
 }
 
 void spawnfunc_light (void)
@@ -1330,7 +1336,12 @@
 		FixIntermissionClient(other);
 
 		if(other.winning)
-			bprint(other.netname, " ^7wins.\n");
+			// DRESK - 3/22/07
+			// Modified Victory Message
+			if( cvar(CVAR_INTERMISSION_USEADVANCEDVICTORYMESSAGE) )
+				DisplayIntermissionVictoryMessage(other);
+			else
+				bprint(other.netname, " ^7wins.\n");
 	}
 
 	minTotalFrags = 0;
@@ -1359,6 +1370,9 @@
 	localcmd("\nsv_hook_gameend;");
 
 	// WriteByte (MSG_ALL, SVC_INTERMISSION);
+	// DRESK - 4/18/2007
+	// Perform Post Intermission Processes
+	PerformPostIntermissionProcesses();
 };
 
 /*
@@ -1864,7 +1878,10 @@
 			// again, but this shouldn't hurt
 		return;
 	}
-
+	
+	// DRESK - 5/06/06
+	CheckSpidfliskWorldRulesEvents();
+	
 	timelimit = cvar("timelimit") * 60;
 	fraglimit = cvar("fraglimit");
 	leadlimit = cvar("leadlimit");
@@ -2321,7 +2338,7 @@
 	float firstPlaceVotes, secondPlaceVotes;
 	float mapvote_voters_real;
 	string result;
-
+	
 	if(mapvote_count_real == 1)
 		return MapVote_Finished(0);
 
@@ -2431,6 +2448,7 @@
 
 	MapVote_CheckRules_1(); // just count
 }
+
 void MapVote_Start()
 {
 	if(mapvote_run)
@@ -2494,6 +2512,11 @@
 	{
 		if(self.classname == "spectator")
 		{
+			// DRESK - 5/28/07
+			// Utilize Hitsound Alias
+			// TODO: Revisit this.
+			//stuffcmd(self, "hsnd\n");
+			// play2(self, "misc/hit.wav");
 			if(self.enemy.typehitsound)
 				play2(self, "misc/typehit.wav");
 			else if(self.enemy.hitsound && self.cvar_cl_hitsound)
@@ -2501,6 +2524,11 @@
 		}
 		else
 		{
+			// DRESK - 5/28/07
+			// Utilize Hitsound Alias
+			// TODO: Revisit this.
+			//stuffcmd(self, "hsnd\n");
+			// play2(self, "misc/hit.wav");
 			if(self.typehitsound)
 				play2(self, "misc/typehit.wav");
 			else if(self.hitsound && self.cvar_cl_hitsound)
Index: server/Dresk_Weapons.qc
===================================================================
--- server/Dresk_Weapons.qc	(revision 0)
+++ server/Dresk_Weapons.qc	(revision 0)
@@ -0,0 +1,264 @@
+// DRESK - Weapon Functions
+// Provides New Weapon Functions
+
+// Field Definitions
+.entity enExteriorWeaponLaser;
+
+// Support LastHitSoundTime
+// .float tLastHitSoundTime;
+// Support LastRicochetSoundTime
+// .float tLastRicochetSoundTime;
+.float bDisableWeaponActions;
+.void() fpWeaponActionFunction;
+.float tSpecialWeaponActionAttackTime;
+
+.float nRapidWeaponSwitchCnt;
+.float tRapidWeaponSwitchResetTime;
+
+#define PRECHECKWEAPONEVENT_NONE										0
+#define PRECHECKWEAPONEVENT_DISABLEWEAPONS								1
+
+// Functions
+void PostCheckViewWeaponModelEffects(entity enClient, entity enWeapon)
+{ // Post Check View Weapon Model Effects
+	// Support Origin Modification for Shotgun (Nexuiz 2.2.1 model; don't like it too much)
+	if(enClient.weapon == WEP_SHOTGUN)
+		setorigin(enWeapon, '10 5 0');
+	else
+	if(enClient.weapon == WEP_NEX)
+		setorigin(enWeapon, '2 -5 0');
+	else
+		setorigin(enWeapon, '0 0 0');
+	
+	// Use All Effects EXCEPT EF_FULLBRIGHT, EF_NODEPTHTEST
+	enWeapon.effects = enClient.effects - (enClient.effects & EF_FULLBRIGHT);
+	enWeapon.effects = enWeapon.effects - (enWeapon.effects & EF_NODEPTHTEST);
+	
+	// Support Intermission NoDraw
+	if(enWeapon.bIntermissionViewModel_NoDraw)
+		enWeapon.effects  = enWeapon.effects | EF_NODRAW;
+		
+	// Provide Upward Weapon Holster During Chatting
+	if(enClient.buttonchat && ATTACK_FINISHED(enClient) <= time)
+	{ // Chatting and Not Attacking
+		enWeapon.angles_y += 10;
+		if(enWeapon.angles_y > 50)
+			enWeapon.angles_y = 50;
+		enWeapon.angles_z = 5;
+	}
+	else
+	{ // Standard Angles
+		// Remove Potential Holster Angles
+		if(enWeapon.angles_y > 0)
+		{ // Holster Angles Exist; Remove
+			enWeapon.angles_z = 0;
+			enWeapon.angles_y -= 10;
+		}
+		else
+			// Holster Angles Gone; Reset Angles to Default
+			enWeapon.angles = '0 0 0';
+	}
+}
+void PostCheckExteriorWeaponModelEffects(entity enClient, entity enWeapon)
+{ // Post Check Exterior Weapon Model Effects
+	// Use All Effects EXCEPT EF_FULLBRIGHT,
+	enWeapon.effects = enWeapon.effects - (enWeapon.effects & EF_FULLBRIGHT);
+	
+	// Suppress Duplicate Lighting from Strength and Invincibility Powerups
+	// NOTE: Nexuiz 2.3 now disables these effects
+	// enWeapon.effects = enWeapon.effects - (enWeapon.effects & EF_BLUE);
+	// enWeapon.effects = enWeapon.effects - (enWeapon.effects & EF_RED);
+	
+	// Support Exterior Weapon Model Faces Owner View Angle
+	if( cvar(CVAR_WEAPON_EXTERIORWEAPONINHERITSOWNERVERTICALANGLE) )
+		enWeapon.angles_x = enClient.v_angle_x * -1;
+	else
+		enWeapon.angles = '0 0 0';
+}
+float PreCheckWeaponFrameEvents(entity enClient)
+{ // PreCheck Weapon Frame Events
+	local float nReturn;
+	if(enClient.bDisableWeaponActions)
+		// Disable Weapon Actions
+		nReturn = PRECHECKWEAPONEVENT_DISABLEWEAPONS;
+	else
+		nReturn = PRECHECKWEAPONEVENT_NONE;
+		
+	// Check for Custom Weapon Handling Function
+	if(enClient.fpWeaponActionFunction)
+		// Invoke Function
+		enClient.fpWeaponActionFunction();
+		
+	// Check for Reset Rapid Weapon Fire
+	if(enClient.nRapidWeaponSwitchCnt > 0)
+	{ // Reset Needed
+		if(enClient.weaponentity.state == WS_READY && ATTACK_FINISHED(enClient) <= time)
+		{ // Weapon Ready
+			if not (enClient.tRapidWeaponSwitchResetTime)
+				// Assign New Reset Timer
+				enClient.tRapidWeaponSwitchResetTime = time + 0.25;
+			else
+			if(enClient.tRapidWeaponSwitchResetTime < time)
+			{ // Reset Rapid Weapon Switch Counter
+				// sprint(enClient, "Resetting Weapon Fire!\n");
+				enClient.nRapidWeaponSwitchCnt = 0;
+			}
+		}
+		else
+			// Weapon NOT Ready; Assign Timer to 0
+			enClient.tRapidWeaponSwitchResetTime = 0;
+	}
+		
+	// Return Status
+	return nReturn;
+}
+float CheckSpawnExteriorWeaponEntityLaser(entity enClient)
+{ // Check Spawn Exterior Weapon Entity
+	local float bEntityCreated;
+		bEntityCreated = FALSE;
+		
+	if( cvar(CVAR_WEAPON_EXTERIORWEAPONHASLASERSIGHT) && !enClient.exteriorweaponentity.enExteriorWeaponLaser)
+	{ // Spawn Exterior Weapon Laser Entity
+		// Assign Entity Created
+		bEntityCreated = TRUE;
+		enClient.exteriorweaponentity.enExteriorWeaponLaser = spawn();
+		enClient.exteriorweaponentity.enExteriorWeaponLaser.owner = enClient.exteriorweaponentity;
+		enClient.exteriorweaponentity.enExteriorWeaponLaser.scale = 0.9;
+		enClient.exteriorweaponentity.enExteriorWeaponLaser.alpha = 0.3;
+		enClient.exteriorweaponentity.enExteriorWeaponLaser.effects = EF_FULLBRIGHT | EF_NOSHADOW | EF_LOWPRECISION;
+		
+		// Determine Color Based on CVar
+		if( cvar(CVAR_WEAPON_EXTERIORWEAPONHASLASERSIGHT) == 1)
+			enClient.exteriorweaponentity.enExteriorWeaponLaser.colormod = '0.8 0 0';
+		else
+			enClient.exteriorweaponentity.enExteriorWeaponLaser.colormap = enClient.colormap;
+		
+		setmodel(enClient.exteriorweaponentity.enExteriorWeaponLaser, "models/misc/line-81-1.mdl");
+		setattachment(enClient.exteriorweaponentity.enExteriorWeaponLaser, enClient.exteriorweaponentity, "");
+		setorigin(enClient.exteriorweaponentity.enExteriorWeaponLaser, '50 0 5');
+	}
+	
+	// Return Entity Created
+	return bEntityCreated;
+}
+void CheckWeaponSwitchSpidfliskEvents(entity enClient)
+{ // Check Weapon Switch Spidflisk Events
+	// Update Client Stats Score
+	UpdateClientStatsScoreAward(enClient, CLIENTSCORE_AWARD_NUMWEAPONSWITCHES, 1);
+	
+	if(enClient.nRapidWeaponSwitchCnt < cvar(CVAR_WEAPON_RAPIDWEAPONSWITCHES) )
+	{ // Rapid Weapon Switch Valid
+		// Reset Attack Time
+		ATTACK_FINISHED(enClient) = time;
+		// Increment Rapid Weapon Switch
+		enClient.nRapidWeaponSwitchCnt = enClient.nRapidWeaponSwitchCnt + 1;
+	}
+}
+void CheckGrenadeLauncherExtendedEffects(entity enGrenade, float nGrenadeType)
+{ // Check Grenade Launcher Extended Effects
+	// New Effects
+	if( cvar(CVAR_WEAPON_GRENADELAUNCHER_EXTENDEDEFFECTS) )
+	{ // Extended Effects
+		enGrenade.effects = enGrenade.effects | EF_FULLBRIGHT | EF_STARDUST | EF_LOWPRECISION;
+		enGrenade.glow_trail = 1;
+		if(nGrenadeType == 1)
+		{
+			enGrenade.glow_color = 500;
+		}
+		else
+		if(nGrenadeType == 2)
+		{
+			enGrenade.glow_color = 5;
+			enGrenade.avelocity = '-1200 0 0';
+		}
+	}
+}
+
+// 02.08.09 - Lixivial
+// Added Hagar extra effects.
+void CheckHagarExtendedEffects(entity enHagar, float nFireType)
+{ 
+	if( cvar(CVAR_WEAPON_HAGAR_EXTENDEDEFFECTS) )
+	{
+		enHagar.effects = enHagar.effects | EF_FULLBRIGHT | EF_STARDUST | EF_LOWPRECISION;
+		enHagar.glow_trail = 1;
+		if(nFireType == 1)
+			enHagar.glow_color = 400;
+		else if(nFireType == 2)
+			enHagar.glow_color = 500;
+	}
+}
+
+void CheckNexSetupShotCustomizations(entity enClient)
+{ // Check Nex Setup Shot Customizations
+	// Report Help Text
+	HelpText_CustomFeature_NexDamage(enClient);
+	
+	// Support Additional Punchangle
+	local float fPunchAngle;
+	if( (enClient.crouch) && (enClient.flags & FL_ONGROUND) )
+		// Crouching on the Ground; Nice Punchangle
+		fPunchAngle = 3;
+	else
+		fPunchAngle = 8;
+		
+	// Invoke Setup Shot Here
+	W_SetupShot (enClient, TRUE, fPunchAngle, "weapons/nexfire.wav", cvar("g_balance_nex_damage"));
+	
+	// Original values.
+	//W_SetupShot(enClient, '5 14 -8', TRUE, fPunchAngle, "weapons/nexfire.wav");
+		
+	// Use Small Flush
+	//te_smallflash (w_shotorg + w_shotdir * 24);
+	
+	// Support Detailed Projectile
+	local float fDetailedProjectileSpeed;
+		fDetailedProjectileSpeed = cvar(CVAR_WEAPON_NEX_DETAILEDPROJECTILESPEED);
+	if(fDetailedProjectileSpeed)
+		DetailedProjectile_Nex(enClient, fDetailedProjectileSpeed, w_shotorg, trace_endpos, w_shotdir);
+}
+void CheckCrylinkDetailedProjectile(entity enClient)
+{ // Check Crylink Detailed Projectile
+	local float fDetailedProjectileTime;
+		fDetailedProjectileTime = cvar(CVAR_WEAPON_CRYLINK_DETAILEDPROJECTILETIME);
+	if(fDetailedProjectileTime)
+		DetailedProjectile_Crylink(enClient, fDetailedProjectileTime, w_shotorg, w_shotdir);
+	else
+		pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, 5);
+}
+float CheckWeaponAdvancedOwnershipMessage(entity enClient, float nItemCode, float nWeapon)
+{ // Check Weapon Advanced Ownership Message
+	local float bReturn;
+		bReturn = TRUE;
+	/*
+	if( cvar(CVAR_WEAPON_USEADVANCEDOWNERSHIPMESSAGES) )
+	{ // Advanced Ownership Messages Used
+		if(nItemsInMap & nItemCode)
+			sprint(enClient, strcat("You do not have the ^2", W_Name(nWeapon), "\n") );
+		else
+			sprint(enClient, strcat("The ^2", W_Name(nWeapon), "^7 is ^1NOT AVAILABLE^7 in this map\n") );
+	}
+	else
+		bReturn = FALSE;
+		
+	*/
+	// Return Status
+	return bReturn;
+}
+float CheckWeaponCrouchROFMod(entity enClient, float fAttackTime)
+{ // Check Weapon Crouch ROF Mod
+	local float fReduction;
+		// Default Reduction is 0
+		fReduction = 0;
+	if( (enClient.crouch) && (enClient.flags & FL_ONGROUND) )
+	{ // Attack Delay Reduction
+		// Acquire Percentile Reduction
+		fReduction = fAttackTime * ( cvar(CVAR_PLAYER_CROUCHATTACKREDUCTIONPERCENTILE) / 100);
+	}
+	
+	// Assign New Attack Time
+	fAttackTime = fAttackTime - fReduction;
+	
+	// Return Reduction
+	return fAttackTime;
+}
\ No newline at end of file
Index: server/Dresk_WaypointSprites.qc
===================================================================
--- server/Dresk_WaypointSprites.qc	(revision 0)
+++ server/Dresk_WaypointSprites.qc	(revision 0)
@@ -0,0 +1,331 @@
+// Server-side waypoint attachment based off 2.4.x 
+// Used only for maintaining teambubbles
+// TODO: Clean this up significantly, as most of the fields are no longer necessary.
+
+float waypointsprite_for_player_default(entity e)
+{
+	// personal waypoints
+	if(self.enemy)
+		if(self.enemy != other)
+			return FALSE;
+
+	// team waypoints
+	if(self.team)
+	{
+		if(self.team != other.team)
+			return FALSE;
+		if(other.classname != "player")
+			return FALSE;
+	}
+
+	// fixed waypoints
+	if(self.currentammo) // hidable?
+		if(other.cvar_cl_hidewaypoints) // wants to hide;
+			return FALSE;
+
+	// otherwise, accept the model
+	return self.modelindex;
+}
+
+void Dresk_WaypointSprite_Init()
+{
+	waypointsprite_fadedistance = vlen(world.maxs - world.mins);
+	waypointsprite_normdistance = cvar("g_waypointsprite_normdistance");
+	waypointsprite_minscale = cvar("g_waypointsprite_minscale");
+	waypointsprite_minalpha = cvar("g_waypointsprite_minalpha");
+	waypointsprite_distancealphaexponent = cvar("g_waypointsprite_distancealphaexponent");
+	waypointsprite_timealphaexponent = cvar("g_waypointsprite_timealphaexponent");
+	waypointsprite_deployed_lifetime = cvar("g_waypointsprite_deployed_lifetime");
+	waypointsprite_deadlifetime = cvar("g_waypointsprite_deadlifetime");
+	waypointsprite_limitedrange = cvar("g_waypointsprite_limitedrange");
+	
+	precache_model("models/misc/teambubble_red.spr");
+	precache_model("models/misc/teambubble_blue.spr");
+	precache_model("models/misc/teambubble_yellow.spr");
+	precache_model("models/misc/teambubble_pink.spr");
+}
+
+void Dresk_WaypointSprite_InitClient(entity e)
+{
+}
+
+void Dresk_WaypointSprite_Kill(entity wp)
+{
+	if(!wp)
+		return;
+	if(wp.owner)
+		wp.owner.(wp.owned_by_field) = world;
+	
+	remove(wp);
+}
+
+void Dresk_WaypointSprite_Disown(entity wp, float fadetime)
+{
+	if(!wp)
+		return;
+	if(wp.owner)
+	{
+		if(wp.exteriormodeltoclient == wp.owner)
+		{
+			setattachment(wp, world, "");
+#ifdef ATTACHMENT_WORKS_WITH_EF_NODEPTHTEST
+			setorigin(wp, wp.origin + wp.exteriormodeltoclient.origin);
+#else
+			setorigin(wp, wp.view_ofs + wp.exteriormodeltoclient.origin);
+#endif
+			wp.exteriormodeltoclient = world;
+		}
+		wp.owner.(wp.owned_by_field) = world;
+		wp.owner = world;
+
+		if(!wp.health)
+		{
+			wp.health = fadetime;
+			wp.teleport_time = time + fadetime;
+		}
+		else if(fadetime < (wp.teleport_time - time))
+		{
+			// accelerate the spawnfunc_waypoint's dying
+			// ensure:
+			//   (wp.teleport_time - time) / wp.health stays
+			//   wp.teleport_time = time + fadetime
+			float current_fadetime;
+			current_fadetime = wp.teleport_time - time;
+			wp.teleport_time = time + fadetime;
+			wp.health = wp.health * fadetime / current_fadetime;
+		}
+	}
+}
+
+void Dresk_WaypointSprite_Think()
+{
+	float doremove;
+
+	doremove = FALSE;
+	/*
+	if(self.health)
+		if(time >= self.teleport_time)
+			doremove = TRUE;
+	*/
+	if(doremove)
+		Dresk_WaypointSprite_Kill(self);
+	else
+		self.nextthink = time;
+}
+
+float Dresk_WaypointSprite_CustomizeEntityForClient()
+{
+	vector realorigin, porigin;
+	float distancealpha, timealpha;
+	float distance;
+	float newmodel;
+
+	if(self.health)
+	{
+		timealpha = bound(0, (self.teleport_time - time) / self.health, 1);
+		if(timealpha == 0)
+			return FALSE;
+		timealpha = pow(timealpha, waypointsprite_timealphaexponent);
+	}
+	else
+		timealpha = 1;
+
+	// customize WP
+	newmodel = self.waypointsprite_for_player(other);
+	if(newmodel == 0)
+		return FALSE;
+	self.modelindex = newmodel;
+
+	porigin = other.origin + other.view_ofs_z * '0 0 1';
+
+#ifdef ATTACHMENT_WORKS_WITH_EF_NODEPTHTEST
+	realorigin = self.exteriormodeltoclient.origin + self.origin;
+#else
+	if(self.exteriormodeltoclient)
+	{
+		if(self.exteriormodeltoclient == other)
+		{
+			//setattachment(self, other, "");
+			//setorigin(self, self.view_ofs);
+			setorigin(self, '0 0 15' + self.owner.maxs_z * '0 0 1');
+			realorigin = other.origin + self.origin;
+		}
+		else
+		{
+			setattachment(self, world, "");
+			setorigin(self, self.exteriormodeltoclient.origin + self.view_ofs);
+			realorigin = self.origin;
+		}
+	}
+	else
+		realorigin = self.origin;
+#endif
+
+	distance = vlen(realorigin - porigin);
+
+	if(self.max_health)
+		if(distance >= self.max_health)
+			return FALSE;
+			
+	if (waypointsprite_staticscale != 0)
+		self.scale = waypointsprite_staticscale;
+	else
+		self.scale = max(1, distance / waypointsprite_normdistance) * waypointsprite_minscale;
+
+	if(self.max_health > waypointsprite_normdistance)
+	{
+		// alpha 1 at normdistance, alpha 0 at maxdistance
+		distancealpha = bound(0, (self.max_health - distance) / (self.max_health - waypointsprite_normdistance), 1);
+		distancealpha = pow(distancealpha, waypointsprite_distancealphaexponent);
+	}
+	else if(self.max_health)
+	{
+		// alpha 1 if visible
+		distancealpha = 1;
+	}
+	else
+	{
+		// alpha 1 at normdistance, alpha minalpha at fadedistance
+		distancealpha = bound(0, (waypointsprite_fadedistance - distance) / (waypointsprite_fadedistance - waypointsprite_normdistance), 1);
+		distancealpha = pow(distancealpha, waypointsprite_distancealphaexponent);
+		distancealpha = distancealpha * (1 - waypointsprite_minalpha) + waypointsprite_minalpha;
+	}
+	// Lixivial
+	// 08.23.08. Add ability to set no depth test on the team indicators.
+	if (cvar(CVAR_MISC_WAYPOINTSPRITENODEPTHTEST) > 0)
+		self.effects = EF_NODEPTHTEST | EF_LOWPRECISION;
+	else
+		self.effects = EF_LOWPRECISION;
+			
+	self.alpha = timealpha * distancealpha;
+	return TRUE;
+}
+
+entity Dresk_WaypointSprite_Spawn(
+	string spr, // sprite
+	float lifetime, float maxdistance, // lifetime, max distance
+	entity ref, vector ofs, // position
+	entity showto, float t, // show to whom? Use a flag to indicate a team
+	entity own, .entity ownfield, // remove when own gets killed
+	float hideable, // true when it should be controlled by cl_hidewaypoints
+	entity wp
+)
+{
+	wp.classname = "attached_sprite_waypoint";
+	//wp.teleport_time = time + lifetime;
+	//wp.health = lifetime;
+	wp.exteriormodeltoclient = ref;
+	if(ref)
+	{
+#ifdef ATTACHMENT_WORKS_WITH_EF_NODEPTHTEST
+		setattachment(wp, ref, "");
+		setorigin(wp, ofs);
+#else
+		wp.view_ofs = ofs;
+#endif
+	}
+	else
+		setorigin(wp, ofs);
+	wp.enemy = showto;
+	wp.team = t;
+	wp.owner = own;
+	wp.currentammo = hideable;
+	if(own)
+	{
+		if(own.ownfield)
+			remove(own.ownfield);
+		own.ownfield = wp;
+		wp.owned_by_field = ownfield;
+	}
+		
+	wp.max_health = maxdistance;
+	wp.customizeentityforclient = Dresk_WaypointSprite_CustomizeEntityForClient;
+	wp.think = Dresk_WaypointSprite_Think;
+	wp.nextthink = time;
+	if(spr != "")
+		setmodel(wp, spr); // precision set above
+	else
+		wp.model = "waypoint";
+	setsize(wp, '0 0 0', '0 0 0');
+	wp.waypointsprite_for_player = waypointsprite_for_player_default;
+	return wp;
+}
+ 
+entity Dresk_WaypointSprite_SpawnScale(
+	string spr, // sprite
+	float lifetime, float maxdistance, // lifetime, max distance
+	entity ref, vector ofs, // position
+	entity showto, float t, // show to whom? Use a flag to indicate a team
+	entity own, .entity ownfield, // remove when own gets killed
+	float hideable, // true when it should be controlled by cl_hidewaypoints
+	float spritescale
+)
+{
+	entity wp;
+	wp = spawn();
+	wp.classname = "sprite_waypoint";
+	//wp.teleport_time = time + lifetime;
+	//wp.health = lifetime;
+	wp.exteriormodeltoclient = ref;
+	if(ref)
+	{
+#ifdef ATTACHMENT_WORKS_WITH_EF_NODEPTHTEST
+		setattachment(wp, ref, "");
+		setorigin(wp, ofs);
+#else
+		wp.view_ofs = ofs;
+#endif
+	}
+	else
+		setorigin(wp, ofs);
+	wp.enemy = showto;
+	wp.team = t;
+	wp.owner = own;
+	wp.currentammo = hideable;
+	if(own)
+	{
+		if(own.ownfield)
+			remove(own.ownfield);
+		own.ownfield = wp;
+		wp.owned_by_field = ownfield;
+	}
+	if (waypointsprite_staticscale)
+		waypointsprite_staticscale = spritescale;
+	else
+		waypointsprite_staticscale = 0;
+		
+	wp.max_health = maxdistance;
+	wp.customizeentityforclient = Dresk_WaypointSprite_CustomizeEntityForClient;
+	wp.think = Dresk_WaypointSprite_Think;
+	wp.nextthink = time;
+	
+		
+	if(spr != "")
+		setmodel(wp, spr); // precision set above
+	else
+		wp.model = "waypoint";
+	setsize(wp, '0 0 0', '0 0 0');
+	wp.waypointsprite_for_player = waypointsprite_for_player_default;
+	return wp;
+}
+
+entity Dresk_WaypointSprite_Attach(
+	string spr,
+	float limited_range,
+	entity waypoint
+)
+{
+	float t, maxdistance;
+	if(self.waypointsprite_attachedforcarrier)
+		return world; // can't attach to FC
+	if(teams_matter)
+		t = self.team;
+	else
+		t = 0;
+	if(limited_range)
+		maxdistance = waypointsprite_limitedrange;
+	else
+		maxdistance = 0;
+		return Dresk_WaypointSprite_Spawn(spr, 0, maxdistance, self, '0 0 64', world, t, self, waypointsprite_attached, FALSE, waypoint);
+}
+
Index: server/miscfunctions.qc
===================================================================
--- server/miscfunctions.qc	(revision 7768)
+++ server/miscfunctions.qc	(working copy)
@@ -634,6 +634,23 @@
     return "neutral";
 }
 
+// Lixivial.
+// Lookup the teambubble sprite names.
+string TeamBubbleName(float t)
+{
+	if(t == COLOR_TEAM1)
+		return "teambubble_red";
+	if(t == COLOR_TEAM2)
+		return "teambubble_blue";
+	if(t == COLOR_TEAM3)
+		return "teambubble_yellow";
+	if(t == COLOR_TEAM4)
+		return "teambubble_pink";
+	if(t == COLOR_SPECTATOR)
+		return "teambubble_spectator";
+	return "teambubble_neutral";
+}
+
 #define CENTERPRIO_POINT 1
 #define CENTERPRIO_SPAM 2
 #define CENTERPRIO_VOTE 4
Index: server/Dresk_Prototypes.qh
===================================================================
--- server/Dresk_Prototypes.qh	(revision 0)
+++ server/Dresk_Prototypes.qh	(revision 0)
@@ -0,0 +1,153 @@
+// DRESK - Function Prototypes
+
+// --------------------------------------------------
+// Nexuiz Prototypes
+float COLOR_SPECTATOR = 1337;
+
+
+// Items
+	//void StartItem (string itemmodel, string pickupsound, float defaultrespawntime, string itemname, float itemid, float weaponid, float itemflags, float(entity player, entity item) pickupevalfunc, float pickupbasevalue);
+	void StartItem (string itemmodel, string pickupsound, float defaultrespawntime, float defaultrespawntimejitter, string itemname, float itemid, float weaponid, float itemflags, float(entity player, entity item) pickupevalfunc, float pickupbasevalue);
+	void Item_Show(entity, float);
+	void Item_Respawn (void);
+	float commodity_pickupevalfunc (entity player, entity item);
+	void minstagib_items (float itemid);
+	float generic_pickupevalfunc(entity player, entity item);
+	void thrown_wep_think();
+	
+	// External Variables
+		.float max_armorvalue;
+	
+// Damage
+	void Damage (entity targ, entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force);
+	
+// Weapons
+	//void W_SetupShot(entity ent, vector vecs, float antilag, float recoil, string snd);
+	void W_SetupShot(entity ent, float antilag, float recoil, string snd, float maxdamage); 
+	
+	float RadiusDamage(entity inflictor, entity attacker, float coredamage, float edgedamage, float rad, entity ignore, float forceintensity, float deathtype, entity directhitentity);
+	float weapon_prepareattack(float secondary, float attacktime);
+	void W_SwitchWeapon(float imp);
+	void(float fr, float t, void() func) weapon_thinkf;
+	// External Variables
+		vector w_shotorg;
+		vector w_shotdir;
+		
+		float WFRAME_FIRE1;
+		float WFRAME_FIRE2;
+		float WFRAME_IDLE;
+// Players
+		$frame die1 die2 draw duck duckwalk duckjump duckidle idle
+		$frame jump pain1 pain2 shoot taunt run runbackwards
+		$frame strafeleft straferight dead1 dead2 forwardright
+		$frame forwardleft backright backleft
+		
+// Bots
+	// External Variables
+		.float bot_dodge;
+		.float bot_dodgerating;
+	
+// Gibs
+	/* Lixivial. Removed due to changes in core Nexuiz codebase.
+	void TossGib (string mdlname, vector org, vector v, float destroyontouch);
+	void GibDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force);
+	.vector move_origin;
+	.vector move_angles;
+	.vector move_velocity;
+	.vector move_avelocity;
+	.float move_flags;
+	.void(void) move_touch;
+	.float move_bounce_factor;
+	.float move_bounce_stopspeed;
+	.void(void) draw; */
+	void W_SetupProjectileVelocity(entity missle);
+	void Violence_GibSplash(entity source, float type, float amount, entity attacker);
+	// Lixivial. Pre-2.5/CSQC methodology.
+	//void Violence_GibSplash(entity source, float type, float amount);
+
+// Waypoints
+	float waypointsprite_normdistance;
+	float waypointsprite_minscale;
+	float waypointsprite_fadedistance;
+	float waypointsprite_minalpha;
+	float waypointsprite_distancealphaexponent;
+	float waypointsprite_timealphaexponent;
+	float waypointsprite_deployed_lifetime;
+	float waypointsprite_limitedrange;
+	float waypointsprite_staticscale;
+	float waypointsprite_limitedrange;
+	float waypointsprite_deployed_lifetime;
+	float waypointsprite_deadlifetime;
+
+	..entity owned_by_field;
+	.float(entity) waypointsprite_for_player; // returns a model index or 0 for hide
+	.entity waypointsprite_attached;
+	.entity waypointsprite_attachedforcarrier;
+	void WaypointSprite_Disown(entity wp, float fadetime);
+	entity WaypointSprite_AttachExisting(string spr, float limited_range,entity waypoint);
+
+// Subs
+	void SUB_Null();
+	void SUB_SetFade(entity ent, float when, float fadetime);
+	void SUB_Remove(void);
+	vector findbetterlocation(vector org, float mindist);
+	entity	findstring(entity start, .string _field, string match)  = #24;
+	
+
+// --------------------------------------------------
+// Spidflisk Prototypes
+
+// Player Models
+	float GetPlayerModelSex(entity enPlayer);
+	string GetPlayerModelSexVerbiage(entity enPlayer, string strBaseMaleString);
+	string GetRandomPlayerModelString();
+	
+// Player
+	.float bIgnoreDamage;
+	.float bDisableWeaponActions;
+	.void() fpWeaponActionFunction;
+	
+	// Additional CVars
+	.float cvar_vid_conwidth;
+	.float cvar_vid_conheight;
+	
+// Welcome Message
+	.float bHideWelcomeMessage;
+	
+// Successive Centerprinting
+	void SuccessiveCenterprint(entity enReceiver, string strMessage);
+	
+// Death Types
+	float DEATH_DEATHSPECTRETOUCH				= 10015;
+	float DEATH_DEATHSPECTREFLAMINGSKULL		= 10016;
+	float DEATH_GHOSTNEXBALL					= 10017;
+
+// Misc
+	float GetClientIsAdministrator(entity enClient);
+	float crandom (void);
+
+// Items
+	void SpawnThrownArmor(vector vOrigin);
+	void SpawnThrownPowerups(vector vOrigin);
+	.float bCannotTouchItems;
+	
+// Fun Functions
+	void FunFunction_SendFunFunctionAliases(entity enClient);
+	.float FunFunc_nPlayerForm;
+
+// Weapons
+	// Detailed Projectiles
+		void DetailedProjectile_Explode(void);
+		void DetailedProjectile_Nex(entity enOwner, float fSpeed, vector vOrigin, vector vEndOrigin, vector vDirection);
+		void DetailedProjectile_Crylink(entity enOwner, float fTime, vector vOrigin, vector vDirection);
+		
+	.float tSpecialWeaponActionAttackTime;
+		
+	// Exterior Weapon Laser
+		.entity enExteriorWeaponLaser;
+		
+	// Nex
+		void CheckNexSetupShotCustomizations(entity enClient);
+		
+	// Crylink
+		void CheckCrylinkDetailedProjectile(entity enClient);
\ No newline at end of file
Index: server/tturrets/include/turrets_early.qh
===================================================================
--- server/tturrets/include/turrets_early.qh	(revision 7768)
+++ server/tturrets/include/turrets_early.qh	(working copy)
@@ -530,6 +530,4 @@
 
 
 
-#endif // TTURRETS_ENABLED
-
-
+#endif // TTURRETS_ENABLED
\ No newline at end of file
Index: server/tturrets/system/system_damage.qc
===================================================================
--- server/tturrets/system/system_damage.qc	(revision 7768)
+++ server/tturrets/system/system_damage.qc	(working copy)
@@ -340,4 +340,4 @@
         baseent.nextthink = time;
         baseent.think = turret_stdproc_die;
     }
-}
+}
\ No newline at end of file
Index: server/tturrets/system/system_main.qc
===================================================================
--- server/tturrets/system/system_main.qc	(revision 7768)
+++ server/tturrets/system/system_main.qc	(working copy)
@@ -1321,6 +1321,4 @@
     }
 
     return 1;
-}
-
-
+}
\ No newline at end of file
Index: server/w_uzi.qc
===================================================================
--- server/w_uzi.qc	(revision 7768)
+++ server/w_uzi.qc	(working copy)
@@ -15,6 +15,28 @@
 {
 	local entity flash;
 
+	
+	// DRESK - 5/19/06
+	// Support Alt-Fire Push
+	if( !(self.crouch) && deathtype == WEP_UZI | HITTYPE_SECONDARY)
+	{ // Alternate Fire
+		// Acquire Push Amount
+		local float fPushAmount;
+			fPushAmount = cvar(CVAR_WEAPON_UZI_ALTFIREPUSHAMOUNT);
+		if(fPushAmount > 0)
+		{ // Valid Push Amount
+			// Report HelpText
+			HelpText_CustomFeature_UziAltFirePush(self);
+			// Calculate Push Vector
+			local vector vPush;
+			vPush = (v_forward * fPushAmount * -1);
+			// Limit Z Pushing
+			vPush_z = vPush_z * 0.75;
+			// Apply Push
+			self.velocity = self.velocity + vPush;
+		}
+	}
+
 	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
 	{
 		if (self.uzi_bulletcounter == 1)
Index: server/Dresk_Weapons_DetailedProjectiles.qc
===================================================================
--- server/Dresk_Weapons_DetailedProjectiles.qc	(revision 0)
+++ server/Dresk_Weapons_DetailedProjectiles.qc	(revision 0)
@@ -0,0 +1,84 @@
+// DRESK - Weapons - Detailed Projectiles
+// Provides Functions for Detailed Projectiles
+
+// Fields
+
+// Detailed Project Explode
+void DetailedProjectile_Explode(void)
+{	
+	// Remove Self
+	remove(self);
+}
+void DetailedProjectile_Nex(entity enOwner, float fSpeed, vector vOrigin, vector vEndOrigin, vector vDirection)
+{
+	local entity enBullet;
+	
+	// Spawn Bullet
+	enBullet = spawn();
+	enBullet.owner = enOwner;
+	enBullet.classname = "spike";
+	
+	// Assign Physical Properties
+	enBullet.movetype = MOVETYPE_FLY;
+	enBullet.solid = SOLID_NOT;
+	setsize (enBullet, '0 0 0', '0 0 0');
+	
+	// Assign Aesthetics
+	setmodel(enBullet, "models/plasmatrail.mdl");
+	enBullet.scale = 5.0;
+	enBullet.effects = EF_NOSHADOW | EF_LOWPRECISION | EF_STARDUST | EF_FLAME;
+	enBullet.alpha = 0.5;
+	enBullet.colormod = '0.6 0.2 0.2';
+	
+	// Assign Flags
+	enBullet.flags = FL_PROJECTILE;
+	
+	// Assign Velocity
+	setorigin(enBullet, vOrigin + (vDirection * 150) );
+	enBullet.velocity = (vDirection * fSpeed);
+	
+	enBullet.angles = vectoangles(enBullet.velocity);
+	
+	// Assign Think
+	enBullet.think = DetailedProjectile_Explode;
+	
+	// Calculate Explosion Time
+	local float fTime;
+		fTime = vlen(enBullet.origin - vEndOrigin) / fSpeed;
+		// fTime = fSpeed / ( vlen(vOrigin - vEndOrigin) );
+	enBullet.nextthink = time + fTime;
+}
+
+void DetailedProjectile_Crylink(entity enOwner, float fTime, vector vOrigin, vector vDirection)
+{
+	local entity enBullet;
+	
+	// Spawn Bullet
+	enBullet = spawn();
+	enBullet.owner = enOwner;
+	enBullet.classname = "spike";
+	
+	// Assign Physical Properties
+	enBullet.movetype = MOVETYPE_FLY;
+	enBullet.solid = SOLID_NOT;
+	setsize (enBullet, '0 0 0', '0 0 0');
+	
+	// Assign Aesthetics
+	setmodel(enBullet, "models/plasmatrail.mdl");
+	enBullet.scale = 3.0;
+	enBullet.effects = EF_NOSHADOW | EF_BLUE | EF_RED | EF_LOWPRECISION | EF_FLAME;
+	enBullet.colormod = '0.4 0 0.4';
+	
+	// Assign Flags
+	enBullet.flags = FL_PROJECTILE;
+	
+	// Assign Velocity
+	setorigin(enBullet, vOrigin);
+	enBullet.velocity = (vDirection * cvar("g_balance_crylink_primary_speed") );
+	
+	enBullet.angles = vectoangles(enBullet.velocity);
+	
+	// Assign Touch and Think
+	enBullet.think = DetailedProjectile_Explode;
+	enBullet.nextthink = time + fTime;
+}
\ No newline at end of file
Index: server/t_items.qc
===================================================================
--- server/t_items.qc	(revision 7768)
+++ server/t_items.qc	(working copy)
@@ -41,6 +41,31 @@
 
 .float max_armorvalue;
 
+float Item_Customize()
+{
+    if(self.spawnshieldtime) 
+		return TRUE;
+    if(self.weapons != (self.weapons & other.weapons))
+    {
+        self.alpha = 0.5 + 0.5 * cvar(CVAR_ITEM_FADEUNAVAILABLEITEMS); // halfway more alpha
+        return TRUE;
+    }
+    else
+    {
+        if(cvar(CVAR_ITEM_FADEUNAVAILABLEITEMS))
+        {
+			if(self.flags & FL_POWERUP)
+				// Fade Powerups Exceedingly
+				self.alpha = 0.03;
+			else
+            	self.alpha = cvar(CVAR_ITEM_FADEUNAVAILABLEITEMS);
+            return TRUE;
+        }
+        else
+        	return FALSE;
+    }
+}
+
 void Item_Show (entity e, float mode)
 {
 	if (mode > 0)
@@ -49,14 +74,10 @@
 		e.model = e.mdl;
 		e.solid = SOLID_TRIGGER;
 		e.effects &~= EF_ADDITIVE;
-		//e.colormod = '0 0 0';
+		e.colormod = '1 1 1';
 		e.alpha = 0;
-
-		// special cases
-		if (e.strength_finished || e.invincible_finished)
-			e.effects = e.effects | EF_ADDITIVE | EF_FULLBRIGHT;
-		if (cvar("g_fullbrightitems"))
-			e.effects = e.effects | EF_FULLBRIGHT;
+        e.customizeentityforclient = func_null;
+		e.spawnshieldtime = 1;
 	}
 	else if (mode < 0)
 	{
@@ -66,42 +87,71 @@
 		e.effects &~= EF_ADDITIVE;
 		//e.colormod = '0 0 0';
 		e.alpha = 0;
+		
+		e.customizeentityforclient = func_null;
+
+        e.spawnshieldtime = 1;
 	}
-	else
-	{
-		// make the item translucent green and not touchable
-		e.model = e.mdl;
+	else if((e.flags & FL_WEAPON) && (g_weapon_stay == 3))
+    {
+        // make the item translucent green and not touchable
+        e.model = e.mdl;
+        e.solid = SOLID_TRIGGER; // can STILL be picked up!
+        e.effects |= EF_STARDUST;
+        e.customizeentityforclient = Item_Customize;
+
+        e.spawnshieldtime = 0;
+    }
+    else if(cvar(CVAR_ITEM_FADEUNAVAILABLEITEMS))
+    {
+        // make the item translucent green and not touchable
+        e.model = e.mdl;
 		e.solid = SOLID_NOT;
-		// e.effects |= EF_ADDITIVE;
-			// we need this to prevent weird display because of
-			// missing depth sorting - or maybe not
-		//e.colormod = '0.2 1 0.2';
-		e.alpha = 0.15;
+		e.effects |= EF_ADDITIVE;
+		e.colormod = '0.3 1.0 0.3';
+		if (e.flags     &  FL_POWERUP          ||
+			e.netname == "5 Armor"    ||
+			e.netname == "25 Armor"   ||
+			e.netname == "50 Armor"   ||
+			e.netname == "100 Armor"  ||
+			e.netname == "100 Health")
+			// Fade Powerups Exceedingly
+			self.alpha = 0.08 + 0.05 * cvar(CVAR_ITEM_FADEUNAVAILABLEITEMS);
+		else
+        	self.alpha = 0.3 + 0.3 * cvar(CVAR_ITEM_FADEUNAVAILABLEITEMS);
+        e.customizeentityforclient = func_null;
+        e.spawnshieldtime = 1;
+    }
+    else
+    {
+        // hide the item completely
+        e.model = string_null;
+        e.solid = SOLID_NOT;
+        //e.colormod = '0 0 0';
+        e.alpha = 0;
+        e.customizeentityforclient = func_null;
 
-		// special cases
-		if (e.strength_finished || e.invincible_finished)
-			e.effects = e.effects | EF_ADDITIVE | EF_FULLBRIGHT;
-		if (cvar("g_fullbrightitems"))
-			e.effects = e.effects | EF_FULLBRIGHT;
-	}
-
+        e.spawnshieldtime = 1;
+    }
+    
 	// relink entity (because solid may have changed)
 	setorigin(e, e.origin);
+	
+	// Lixivial adding Dresk's spidflisk items.
+	// DRESK - 5/13/06
+	// Support Post Check Item Start
+	PostCheckItemStart(e, e.items);	
 }
 
 void Item_Respawn (void)
 {
 	Item_Show(self, 1);
-	if(!g_minstagib && self.items == IT_STRENGTH)
-		sound (self, CHAN_TRIGGER, "misc/strength_respawn.wav", VOL_BASE, ATTN_NORM);	// play respawn sound
-	else if(!g_minstagib && self.items == IT_INVINCIBLE)
-		sound (self, CHAN_TRIGGER, "misc/shield_respawn.wav", VOL_BASE, ATTN_NORM);	// play respawn sound
-	else
-		sound (self, CHAN_TRIGGER, "misc/itemrespawn.wav", VOL_BASE, ATTN_NORM);	// play respawn sound
+
+	// pavlvs 09.26.09
+	// Support Spidflisk global repawn sounds
+	CheckItemRespawnEffects(self);
+	
 	setorigin (self, self.origin);
-
-	//pointparticles(particleeffectnum("item_respawn"), self.origin + self.mins_z * '0 0 1' + '0 0 48', '0 0 0', 1);
-	pointparticles(particleeffectnum("item_respawn"), self.origin + 0.5 * (self.mins + self.maxs), '0 0 0', 1);
 }
 
 void Item_RespawnCountdown (void)
@@ -154,7 +204,12 @@
 				}
 			}
 		}
-		sound (self, CHAN_TRIGGER, "misc/itemrespawncountdown.wav", VOL_BASE, ATTN_NORM);	// play respawn sound
+		// pavlvs 09.26.09
+		// Make item respawn countdown sound global too
+		if (cvar(CVAR_ITEM_POWERUPGLOBALRESPAWNSOUNDS))
+			sound (world, CHAN_AUTO, "misc/itemrespawncountdown.wav", 1, ATTN_NONE);	// play respawn sound
+		else
+			sound (self, CHAN_TRIGGER, "misc/itemrespawncountdown.wav", VOL_BASE, ATTN_NORM);	// play respawn sound
 		if(self.waypointsprite_attached)
 		{
 			WaypointSprite_Ping(self.waypointsprite_attached);
@@ -396,14 +451,24 @@
 	}
 
 :skip
+	// DRESK - 5/28/07
+	// Support Always Pickup Items
 	// always eat teamed entities
-	if(item.team)
+	if(item.team || cvar(CVAR_ITEM_ALWAYSPICKUPITEMS))
 		pickedup = TRUE;
 
 	if (!pickedup)
 		return 0;
 
-	sound (player, CHAN_AUTO, item.item_pickupsound, VOL_BASE, ATTN_NORM);
+	// DRESK - 3/14/06
+	// Bandwidth Reduction - Check Sound Length
+	//	sound (self, CHAN_AUTO, item.item_pickupsound, VOL_BASE, ATTN_NORM);
+
+	// DRESK - 4/30/2007
+	// Post Check Item Touch Events and Is Global Sound Item
+	if( !SpidfliskPostCheckItemTouchEventsAndIsGlobalSoundItem(self, other) )
+		sound (other, CHAN_AUTO, self.item_pickupsound, VOL_BASE, ATTN_NORM);
+		
 	if (_switchweapon)
 		if (player.switchweapon != w_getbestweapon(player))
 			W_SwitchWeapon_Force(player, w_getbestweapon(player));
@@ -441,6 +506,14 @@
 		return;
 	else
 	{
+		self.solid = SOLID_NOT;
+		// Lixivial this has been moved to Item_Show due to support in 2.5.2
+		// DRESK - 2/18/06
+		// Check Fade Unavailable Items
+		//if( !CheckWillFadeUnavailableItem(self) )
+		//	// Standard Support
+		//	self.model = string_null;
+	
 		if(self.team)
 		{
 			RandomSelection_Init();
@@ -1173,6 +1246,15 @@
 }
 
 void spawnfunc_item_armor_big (void) {
+	// DRESK - 4/5/07
+	// Support Large Armor Respawn Time
+	// TODO: No longer relevant.
+	//if (!cvar(CVAR_ITEM_ARMOR_LARGERESPAWNTIME))
+	//	StartItem ("models/items/g_a25.md3", "misc/armor25.wav", 30, "100 Armor", IT_ARMOR, 0, commodity_pickupevalfunc, 20000);
+	//
+	//else
+	//	StartItem ("models/items/g_a25.md3", "misc/armor25.wav", cvar(CVAR_ITEM_ARMOR_LARGERESPAWNTIME), "100 Armor", IT_ARMOR, 0, commodity_pickupevalfunc, 20000);
+
 	if(!self.armorvalue)
 		self.armorvalue = g_pickup_armorbig;
 	if(!self.max_armorvalue)
Index: server/w_hagar.qc
===================================================================
--- server/w_hagar.qc	(revision 7768)
+++ server/w_hagar.qc	(working copy)
@@ -67,6 +67,10 @@
 	missile.angles = vectoangles (missile.velocity);
 	missile.flags = FL_PROJECTILE;
 
+	// 02.08.09 - Lixivial
+	// Adding colour trail on the hagar missle.
+	CheckHagarExtendedEffects(missile, 1);
+
 	CSQCProjectile(missile, TRUE, PROJECTILE_HAGAR, TRUE);
 }
 
@@ -104,6 +108,10 @@
 	missile.angles = vectoangles (missile.velocity);
 	missile.flags = FL_PROJECTILE;
 
+	// 02.08.09 - Lixivial
+	// Adding colour trail on the hagar missle.
+	CheckHagarExtendedEffects(missile, 2);
+
 	CSQCProjectile(missile, TRUE, PROJECTILE_HAGAR_BOUNCING, TRUE);
 }
 
Index: server/race.qc
===================================================================
--- server/race.qc	(revision 7768)
+++ server/race.qc	(working copy)
@@ -178,7 +178,7 @@
 					else if(t < grecordtime)
 					{
 						if(grecordholder == "")
-							bprint(e.netname, "^7 broke his all-time fastest lap record with ", TIME_ENCODED_TOSTRING(t), "\n");
+							bprint(e.netname, "^7 broke ", GetPlayerModelSexVerbiage(e, "his") ," all-time fastest lap record with ", TIME_ENCODED_TOSTRING(t), "\n");
 						else
 							bprint(e.netname, "^7 broke ", grecordholder, "^7's all-time fastest lap record with ", TIME_ENCODED_TOSTRING(t), "\n");
 						db_put(ServerProgsDB, strcat(GetMapname(), rr, "time"), ftos(t));
@@ -188,7 +188,7 @@
 					else
 					{
 						if(grecordholder == "")
-							bprint(e.netname, "^7's new fastest lap could not break his all-time fastest lap record of ", TIME_ENCODED_TOSTRING(grecordtime), "\n");
+							bprint(e.netname, "^7's new fastest lap could not break", GetPlayerModelSexVerbiage(e, "his") ,"all-time fastest lap record of ", TIME_ENCODED_TOSTRING(grecordtime), "\n");
 						else
 							bprint(e.netname, "^7's new fastest lap could not break ", grecordholder, "^7's all-time fastest lap record of ", TIME_ENCODED_TOSTRING(grecordtime), "\n");
 					}
Index: server/progs.src
===================================================================
--- server/progs.src	(revision 7768)
+++ server/progs.src	(working copy)
@@ -42,8 +42,33 @@
 
 scores_rules.qc
 
+// Spidflisk Modification Support
+Dresk_Prototypes.qh
+
 miscfunctions.qc
 
+// Spidflisk Modification Support
+Dresk_Definitions.qc
+Dresk_Bots.qc
+Dresk_Handicap.qc
+Dresk_ClientStatsScore.qc
+Dresk_MiscFunctions.qc
+Dresk_SpawnPoints.qc
+Dresk_Intermission.qc
+Dresk_HelpText.qc
+Dresk_WelcomeMessage.qc
+Dresk_RawStuffCmdToClient.qc
+Dresk_GoreCorpses.qc
+Dresk_FunFunctions.qc
+Dresk_ClientPlayer.qc
+Dresk_ItemsPowerups.qc
+Dresk_Weapons.qc
+Dresk_Weapons_Laser.qc
+Dresk_Weapons_DetailedProjectiles.qc
+Dresk_Administrator.qc
+Dresk_ClientCmds.qc
+Dresk_CTF.qc
+Dresk_WaypointSprites.qc
 waypointsprites.qc
 
 
Index: server/w_tuba.qc
===================================================================
--- server/w_tuba.qc	(revision 7768)
+++ server/w_tuba.qc	(working copy)
@@ -148,7 +148,7 @@
 		return TRUE; // TODO use fuel?
 	else if (req == WR_SUICIDEMESSAGE)
 	{
-		w_deathtypestring = "hurt his own ears with the @!#%'n Tuba";
+		w_deathtypestring = "hurt #s own ears with the @!#%'n Tuba";
 	}
 	else if (req == WR_KILLMESSAGE)
 	{
Index: server/g_subs.qc
===================================================================
--- server/g_subs.qc	(revision 7768)
+++ server/g_subs.qc	(working copy)
@@ -131,12 +131,20 @@
 
 void SUB_SetFade_Think (void)
 {
-	self.think = SUB_SetFade_Think;
-	self.nextthink = self.fade_time;
-	self.alpha = 1 - (time - self.fade_time) * self.fade_rate;
-	if (self.alpha < 0.01)
+	// DRESK - 3/7/06
+	// Support Extra Low Bandwidth 
+	if( cvar(CVAR_MISC_LOWBANDWIDTHLEVEL) > 1)
+		// Immediately Call Removal Sub
 		SUB_VanishOrRemove(self);
-	self.alpha = bound(0.01, self.alpha, 1);
+	else
+	{ // Standard Procedure
+		self.think = SUB_SetFade_Think;
+		self.nextthink = self.fade_time;
+		self.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);
+	}
 }
 
 /*
Index: server/pathlib.qc
===================================================================
--- server/pathlib.qc	(revision 7768)
+++ server/pathlib.qc	(working copy)
@@ -1,1047 +1,481 @@
+#define PLF_GROUNDSNAP 1
+#define PLF_NOOPTIMIZE 2
+#define PLF_SUBPATH3D  4
+
+#define PT_QUICKSTAR 1
+#define PT_QUICKBOX  2
+#define PT_ASTAR     4  // FIXME NOT IMPLEMENTED
+
 //#define PATHLIB_RDFIELDS
 #ifdef PATHLIB_RDFIELDS
+    #define path_flags lip
+
+    #define path_subpathing_size autoswitch
+    #define path_subpathing_bboxexpand welcomemessage_time
+
     #define path_next swampslug
     #define path_prev lasertarget
 #else
     .entity path_next;
     .entity path_prev;
-#endif
 
-#define medium spawnshieldtime
-
-//#define DEBUGPATHING
-
-entity openlist;
-entity closedlist;
-entity scraplist;
-
-.float pathlib_node_g;
-.float pathlib_node_h;
-.float pathlib_node_f;
-
-float pathlib_open_cnt;
-float pathlib_closed_cnt;
-float pathlib_made_cnt;
-float pathlib_merge_cnt;
-float pathlib_recycle_cnt;
-float pathlib_searched_cnt;
-
-#ifdef DEBUGPATHING
-
+    .float path_subpathing_size;
+    .float path_subpathing_bboxexpand;
+    .float path_flags;
 #endif
 
-float pathlib_bestopen_seached;
-float pathlib_bestcash_hits;
-float pathlib_bestcash_saved;
+#define pathlib_garbagetime 120
+#define pathib_maxdivide 512
 
-float pathlib_gridsize;
+.float(vector start,vector end) path_validate;
 
-float pathlib_movecost;
-float pathlib_movecost_diag;
-float pathlib_movecost_waterfactor;
-
-float pathlib_edge_check_size;
-
-float pathlib_foundgoal;
-entity goal_node;
-
-entity best_open_node;
-.float is_path_node;
-
-
-#ifdef DEBUGPATHING
-float edge_show(vector point,float fsize);
-void mark_error(vector where,float lifetime);
-void mark_info(vector where,float lifetime);
-entity mark_misc(vector where,float lifetime);
-
-void pathlib_showpath(entity start)
+float pathlib_stdproc_path_validate(vector start,vector end)
 {
-    entity e;
-    e = start;
-    while(e.path_next)
-    {
-        te_lightning1(e,e.origin,e.path_next.origin);
-        e = e.path_next;
-    }
-}
+    tracebox(start, self.mins, self.maxs, end, MOVE_WORLDONLY, self);
 
-void path_dbg_think()
-{
-    pathlib_showpath(self);
-    self.nextthink = time + 1;
-}
+    if(vlen(trace_endpos - end) < 32)
+        return 1;
 
-void __showpath2_think()
-{
-    mark_info(self.origin,1);
-    if(self.path_next)
-    {
-        self.path_next.think     = __showpath2_think;
-        self.path_next.nextthink = time + 0.15;
-    }
-    else
-    {
-        self.owner.think     = __showpath2_think;
-        self.owner.nextthink = time + 0.15;
-    }
+    return 0;
 }
 
-void pathlib_showpath2(entity path)
+vector pathlib_groundsnap(vector where)
 {
-    path.think     = __showpath2_think;
-    path.nextthink = time;
-}
+    float lsize;
 
-#endif
+    lsize = vlen(self.mins - self.maxs) * 0.25;
 
-void pathlib_deletepath(entity start)
-{
-    entity e;
+    traceline(where + ('0 0 1' * lsize) ,where - '0 0 10240',MOVE_WORLDONLY,self);
 
-    e = findchainentity(owner, start);
-    while(e)
-    {
-        e.think = SUB_Remove;
-        e.nextthink = time;
-        e = e.chain;
-    }
-}
+    return trace_endpos + ('0 0 1' * lsize);
 
-float fsnap(float val,float fsize)
-{
-    return rint(val / fsize) * fsize;
 }
 
-vector vsnap(vector point,float fsize)
+entity pathlib_createpoint(entity parent,entity next,entity first,vector where)
 {
-    vector vret;
+    entity point;
 
-    vret_x = rint(point_x / fsize) * fsize;
-    vret_y = rint(point_y / fsize) * fsize;
-    vret_z = ceil(point_z / fsize) * fsize;
+    point = spawn();
+    point.classname = "path_node";
 
-    return vret;
-}
-
-float  walknode_stepsize;
-vector walknode_stepup;
-vector walknode_maxdrop;
-vector walknode_boxup;
-vector walknode_boxmax;
-vector walknode_boxmin;
-float  pathlib_movenode_goodnode;
-
-float floor_ok(vector point)
-{
-    float pc;
-
-    if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_SKY)
-        return 0;
-
-    pc = pointcontents(point);
-
-    switch(pc)
+    if(first)
+        point.owner = first;
+    else
     {
-        case CONTENT_SOLID:
-        case CONTENT_SLIME:
-        case CONTENT_LAVA:
-        case CONTENT_SKY:
-            return 0;
-        case CONTENT_EMPTY:
-            if not (pointcontents(point - '0 0 1') == CONTENT_SOLID)
-                return 0;
-            break;
-        case CONTENT_WATER:
-            return 1;
+        point.classname = "path_master";
+        point.owner = point;
     }
-    if(pointcontents(point - '0 0 1') == CONTENT_SOLID)
-        return 1;
 
-    return 0;
-}
+    if(parent)
+        point.path_prev = parent;
 
-#define inwater(point) (pointcontents(point) == CONTENT_WATER)
-/*
-float inwater(vector point)
-{
-    if(pointcontents(point) == CONTENT_WATER)
-        return 1;
-    return 0;
-}
-*/
-
-#define _pcheck(p) traceline(p+z_up,p-z_down,MOVE_WORLDONLY,self); if not(floor_ok(trace_endpos)) return 1
-float edge_check(vector point,float fsize)
-{
-    vector z_up,z_down;
-
-    z_up   = '0 0 1' * fsize;
-    z_down = '0 0 1' * fsize;
-
-    _pcheck(point + ('1 1 0'  * fsize));
-    _pcheck(point + ('1 -1 0'  * fsize));
-    _pcheck(point + ('1 0 0' * fsize));
-
-    _pcheck(point + ('0 1 0'  * fsize));
-    _pcheck(point + ('0 -1 0' * fsize));
-
-    _pcheck(point + ('-1 0 0'  * fsize));
-    _pcheck(point + ('-1 1 0'  * fsize));
-    _pcheck(point + ('-1 -1 0' * fsize));
-
-    return 0;
-}
-
-#ifdef DEBUGPATHING
-#define _pshow(p) mark_error(p,10)
-float edge_show(vector point,float fsize)
-{
-
-    _pshow(point + ('1 1 0'  * fsize));
-    _pshow(point + ('1 -1 0' * fsize));
-    _pshow(point + ('1 0 0'  * fsize));
-
-    _pshow(point + ('0 1 0'  * fsize));
-    _pshow(point + ('0 -1 0' * fsize));
-
-    _pshow(point + ('-1 0 0'  * fsize));
-    _pshow(point + ('-1 1 0'  * fsize));
-    _pshow(point + ('-1 -1 0' * fsize));
-
-    return 0;
-}
-#endif
-
-var vector pathlib_movenode(vector start,vector end,float doedge);
-vector pathlib_wateroutnode(vector start,vector end)
-{
-    vector surface;
-
-    pathlib_movenode_goodnode = 0;
-
-    end_x = fsnap(end_x, pathlib_gridsize);
-    end_y = fsnap(end_y, pathlib_gridsize);
-
-    traceline(end + ('0 0 0.25' * pathlib_gridsize),end - ('0 0 1' * pathlib_gridsize),MOVE_WORLDONLY,self);
-    end = trace_endpos;
-
-    if not(pointcontents(end - '0 0 1') == CONTENT_SOLID)
-        return end;
-
-    for(surface = start ; surface_z < (end_z + 32); ++surface_z)
+    if(next)
     {
-        if(pointcontents(surface) == CONTENT_EMPTY)
-            break;
+        point.path_next = next;
     }
+    else
+        point.classname = "path_end";
 
-    if(pointcontents(surface + '0 0 1') != CONTENT_EMPTY)
-        return end;
+    if (point.owner.path_flags & PLF_GROUNDSNAP)
+        where = pathlib_groundsnap(where);
 
-    tracebox(start + '0 0 64', walknode_boxmin,walknode_boxmax, end + '0 0 64', MOVE_WORLDONLY, self);
-    if(trace_fraction == 1)
-        pathlib_movenode_goodnode = 1;
+    setorigin(point,where);
 
-    if(fabs(surface_z - end_z) > 32)
-        pathlib_movenode_goodnode = 0;
 
-    return end;
+    return point;
 }
 
-vector pathlib_swimnode(vector start,vector end)
+/*
+float pathlib_scoresubpath(vector start,vector point,vector end,float minstep)
 {
-    pathlib_movenode_goodnode = 0;
+    float dist_stp,dist_pte,dist_total;
 
-    if(pointcontents(start) != CONTENT_WATER)
-        return end;
+    dist_stp = vlen(start - point);
+    if(dist_stp < minstep)
+        return 100000000;
 
-    end_x = fsnap(end_x, pathlib_gridsize);
-    end_y = fsnap(end_y, pathlib_gridsize);
-
-    if(pointcontents(end) == CONTENT_EMPTY)
-        return pathlib_wateroutnode( start, end);
-
-    tracebox(start, walknode_boxmin,walknode_boxmax, end, MOVE_WORLDONLY, self);
-    if(trace_fraction == 1)
-        pathlib_movenode_goodnode = 1;
-
-    return end;
+    dist_pte = vlen(point - end);
+    dist_total = dist_stp + dist_pte;
+    return -1;
 }
+*/
 
-vector pathlib_flynode(vector start,vector end)
+vector pathlib_subpath_quickbox(entity start,vector vcrash,entity end,float maxsize)
 {
-    pathlib_movenode_goodnode = 0;
 
-    end_x = fsnap(end_x, pathlib_gridsize);
-    end_y = fsnap(end_y, pathlib_gridsize);
+    float step;
+    float pathscore;
+    float pathscore_best;
+    float dist;
+    vector bestpoint,point;
+    float zmin,zmax;
+    vector box;
 
-    tracebox(start, walknode_boxmin,walknode_boxmax, end, MOVE_WORLDONLY, self);
-    if(trace_fraction == 1)
-        pathlib_movenode_goodnode = 1;
+    pathscore_best = 0;
 
-    return end;
-}
+    step = vlen(self.maxs - self.mins) * start.owner.path_subpathing_bboxexpand;
 
-vector pathlib_walknode(vector start,vector end,float doedge)
-{
-    vector direction,point,last_point,s,e;
-    float steps, distance, i,laststep;
-
-    pathlib_movenode_goodnode = 0;
-
-    s   = start;
-    e   = end;
-    e_z = 0;
-    s_z = 0;
-    direction  = normalize(s - e);
-
-    distance    = vlen(start - end);
-    laststep    = distance / walknode_stepsize;
-    steps       = floor(laststep);
-    laststep    = laststep - steps;
-
-    point = start;
-    s     = point + walknode_stepup;
-    e     = point - walknode_maxdrop;
-
-    traceline(s, e,MOVE_WORLDONLY,self);
-    if(trace_fraction == 1.0)
-        return trace_endpos;
-
-    if (floor_ok(trace_endpos) == 0)
-        return trace_endpos;
-
-    last_point = trace_endpos;
-
-    for(i = 0; i < steps; ++i)
+    if(start.owner.path_flags & PLF_SUBPATH3D)
     {
-        point = last_point + direction * walknode_stepsize;
-
-        s = point + walknode_stepup;
-        e = point - walknode_maxdrop;
-        traceline(s, e,MOVE_WORLDONLY,self);
-        if(trace_fraction == 1.0)
-            return trace_endpos;
-
-        point = trace_endpos;
-        if not(floor_ok(trace_endpos))
-            return trace_endpos;
-
-        tracebox(last_point + walknode_boxup, walknode_boxmin,walknode_boxmax, point + walknode_boxup, MOVE_WORLDONLY, self);
-        if(trace_fraction != 1.0)
-            return trace_endpos;
-
-        if(doedge)
-        if(edge_check(point,pathlib_edge_check_size))
-            return trace_endpos;
-
-        last_point = point;
+        zmin = maxsize * -1;
+        zmax = maxsize;
     }
-
-    point = last_point + direction * walknode_stepsize * laststep;
-
-    point_x = fsnap(point_x, pathlib_gridsize);
-    point_y = fsnap(point_y, pathlib_gridsize);
-
-    s = point + walknode_stepup;
-    e = point - walknode_maxdrop;
-    traceline(s, e,MOVE_WORLDONLY,self);
-
-    if(trace_fraction == 1.0)
-        return trace_endpos;
-
-    point = trace_endpos;
-
-    if not(floor_ok(trace_endpos))
-        return trace_endpos;
-
-    tracebox(last_point + walknode_boxup, walknode_boxmin,walknode_boxmax, point + walknode_boxup, MOVE_WORLDONLY, self);
-    if(trace_fraction != 1.0)
-        return trace_endpos;
-
-    pathlib_movenode_goodnode = 1;
-    return point;
-}
-
-var float pathlib_cost(entity parent,vector to, float static_cost);
-float pathlib_g_static(entity parent,vector to, float static_cost)
-{
-    if(inwater(to))
-        return parent.pathlib_node_g + static_cost * pathlib_movecost_waterfactor;
     else
-        return parent.pathlib_node_g + static_cost;
-}
+    {
+        zmin = 0;
+        zmax = 1;
+    }
 
-float pathlib_g_static_water(entity parent,vector to, float static_cost)
-{
-    if(inwater(to))
-        return parent.pathlib_node_g + static_cost * pathlib_movecost_waterfactor;
-    else
-        return parent.pathlib_node_g + static_cost;
-}
+    for(box_z = zmin; box_z < zmax; box_z += step)
+    for(box_y = -maxsize; box_y < maxsize; box_y += step)
+    for(box_x = -maxsize; box_x < maxsize; box_x += step)
+    {
 
-float pathlib_g_euclidean(entity parent,vector to, float static_cost)
-{
-    return parent.pathlib_node_g + vlen(parent.origin - to);
-}
-float pathlib_g_euclidean_water(entity parent,vector to, float static_cost)
-{
-    if(inwater(to))
-        return parent.pathlib_node_g + vlen(parent.origin - to) * pathlib_movecost_waterfactor;
-    else
-        return parent.pathlib_node_g + vlen(parent.origin - to);
-}
+        point = vcrash + box;
 
-var float(vector from,vector to) pathlib_heuristic;
+        if(start.owner.path_flags & PLF_GROUNDSNAP)
+            point = pathlib_groundsnap(point);
 
-/**
-    Manhattan Menas we expect to move up,down left or right
-    No diagonal moves espected. (like moving bewteen city blocks)
-**/
-float pathlib_h_manhattan(vector a,vector b)
-{
-    //h(n) = D * (abs(n.x-goal.x) + abs(n.y-goal.y))
+        if(self.path_validate(start.origin,point))
+        {
+            dist = vlen(start.origin - point);
+            if(dist > step)
+            {
+                pathscore = 1 / (dist + vlen(point - end.origin));
+                if(pathscore > pathscore_best)
+                {
+                    bestpoint = point;
+                    pathscore_best = pathscore;
+                }
+            }
+        }
 
-    float h;
-    h  = fabs(a_x - b_x);
-    h += fabs(a_y - b_y);
-    h *= pathlib_gridsize;
+    }
 
-    return h;
-}
+    if(pathscore_best != 0)
+        return bestpoint;
 
-/**
-    This heuristic consider both stright and disagonal moves
-    to have teh same cost.
-**/
-float pathlib_h_diagonal(vector a,vector b)
-{
-    //h(n) = D * max(abs(n.x-goal.x), abs(n.y-goal.y))
-    float h,x,y;
-
-    x = fabs(a_x - b_x);
-    y = fabs(a_y - b_y);
-    h = pathlib_movecost * max(x,y);
-
-    return h;
+    return start.origin;
 }
 
-/**
-    This heuristic only considers the stright line distance.
-    Will usualy mean a lower H then G meaning A* Will speand more
-    and run slower.
-**/
-float pathlib_h_euclidean(vector a,vector b)
+vector pathlib_subpath_quickstar(entity start,entity end,float gridsize)
 {
-    return vlen(a - b);
-}
+    vector point, best_point;
+    float  score, best_score;
+    vector dir_end;
 
-/**
-    This heuristic consider both stright and disagonal moves,
-    But has a separate cost for diagonal moves.
-**/
-float pathlib_h_diagonal2(vector a,vector b)
-{
-    float h_diag,h_str,h,x,y;
+    dir_end   = normalize(end.origin - start.origin);
+    dir_end_x = dir_end_x * -1;
 
-    /*
-    h_diagonal(n) = min(abs(n.x-goal.x), abs(n.y-goal.y))
-    h_straight(n) = (abs(n.x-goal.x) + abs(n.y-goal.y))
-    h(n) = D2 * h_diagonal(n) + D * (h_straight(n) - 2*h_diagonal(n)))
-    */
+    makevectors(dir_end);
 
-    x = fabs(a_x - b_x);
-    y = fabs(a_y - b_y);
+    best_score = 0;
+    score      = 0;
 
-    h_diag = min(x,y);
-    h_str = x + y;
+    best_point = start.origin;
 
-    h =  pathlib_movecost_diag * h_diag;
-    h += pathlib_movecost * (h_str - 2 * h_diag);
+    // Forward
+    point = start.origin + v_forward * gridsize;
+    point  = pathlib_groundsnap(point);
+    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
+    if(score < best_score) { best_point = point; best_score = score; }
+    //te_lightning1(world,start.origin,point);
 
-    return h;
-}
+    // Forward-right
+    point = start.origin + (v_forward + v_right * 0.5) * gridsize;
+    point  = pathlib_groundsnap(point);
+    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
+    if(score < best_score) { best_point = point; best_score = score; }
+    //te_lightning1(world,start.origin,point);
 
-/**
-    This heuristic consider both stright and disagonal moves,
-    But has a separate cost for diagonal moves.
 
+    // Forward-left
+    point = start.origin + (v_forward - v_right * 0.5) * gridsize;
+    point  = pathlib_groundsnap(point);
+    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
+    if(score < best_score) { best_point = point; best_score = score; }
+    //te_lightning1(world,start.origin,point);
 
-**/
-float pathlib_h_diagonal2sdp(vector preprev,vector prev,vector point,vector end)
-{
-    float h_diag,h_str,h,x,y,z;
 
-    //h_diagonal(n) = min(abs(n.x-goal.x), abs(n.y-goal.y))
-    //h_straight(n) = (abs(n.x-goal.x) + abs(n.y-goal.y))
-    //h(n) = D2 * h_diagonal(n) + D * (h_straight(n) - 2*h_diagonal(n)))
+    // Right
+    point = start.origin + v_right * gridsize;
+    point  = pathlib_groundsnap(point);
+    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
+    if(score < best_score) { best_point = point; best_score = score; }
+    //te_lightning1(world,start.origin,point);
 
-    x = fabs(point_x - end_x);
-    y = fabs(point_y - end_y);
-    z = fabs(point_z - end_z);
+    // Left
+    point = start.origin - v_right * gridsize;
+    point  = pathlib_groundsnap(point);
+    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
+    if(score < best_score) { best_point = point; best_score = score; }
+    //te_lightning1(world,start.origin,point);
 
-    h_diag = min3(x,y,z);
-    h_str = x + y + z;
+    // Back
+    point = start.origin - v_forward * gridsize;
+    point  = pathlib_groundsnap(point);
+    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
+    if(score < best_score) { best_point = point; best_score = score; }
+    //te_lightning1(world,start.origin,point);
 
-    h =  pathlib_movecost_diag * h_diag;
-    h += pathlib_movecost * (h_str - 2 * h_diag);
+    // Back-right
 
-    float m;
-    vector d1,d2;
+    point = start.origin - (v_forward + v_right * 0.5) * gridsize;
+    point  = pathlib_groundsnap(point);
+    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
+    if(score < best_score) { best_point = point; best_score = score; }
+    //te_lightning1(world,start.origin,point);
 
-    d1 = normalize(preprev - point);
-    d2 = normalize(prev    - point);
-    m = vlen(d1-d2);
-    //bprint("pathlib_h_diagonal2sdp-M = ",ftos(m),"\n");
+    // Back-left
+    point = start.origin - (v_forward - v_right * 0.5) * gridsize;
+    point  = pathlib_groundsnap(point);
+    if(self.path_validate(start.origin,point)) score = 1 / vlen(point - end.origin);
+    if(score < best_score) { best_point = point; best_score = score; }
+    //te_lightning1(world,start.origin,point);
 
-    return h * m;
+    return(best_point);
 }
 
-
-float pathlib_h_diagonal3(vector a,vector b)
+float pathlib_path(entity start,entity end,float pathing_method)
 {
-    float h_diag,h_str,h,x,y,z;
+    vector vcrash;
+    vector subpath_point;
+    entity subpoint;
 
-    //h_diagonal(n) = min(abs(n.x-goal.x), abs(n.y-goal.y))
-    //h_straight(n) = (abs(n.x-goal.x) + abs(n.y-goal.y))
-    //h(n) = D2 * h_diagonal(n) + D * (h_straight(n) - 2*h_diagonal(n)))
+    // Fail.
+    if(start.cnt > pathib_maxdivide)
+    {
+        bprint("To many segments!\n");
+        return 0;
+    }
 
-    x = fabs(a_x - b_x);
-    y = fabs(a_y - b_y);
-    z = fabs(a_z - b_z);
+    if(self.path_validate(start.origin,end.origin))
+        return 1;
 
-    h_diag = min3(x,y,z);
-    h_str = x + y + z;
+    vcrash = trace_endpos;
 
-    h =  pathlib_movecost_diag * h_diag;
-    h += pathlib_movecost * (h_str - 2 * h_diag);
-
-    return h;
-}
-
-//#define PATHLIB_USE_NODESCRAP
-#define PATHLIB_NODEEXPIRE 0.05
-float pathlib_scraplist_cnt;
-entity newnode()
-{
-    entity n;
-#ifdef PATHLIB_USE_NODESCRAP
-    if(pathlib_scraplist_cnt)
+    switch(pathing_method)
     {
-        n = findentity(world,owner,scraplist);
-        if(n)
-        {
-            --pathlib_scraplist_cnt;
-            ++pathlib_recycle_cnt;
-            return n;
-        }
-        else
-            pathlib_scraplist_cnt = 0;
+        case PT_QUICKSTAR:
+            subpath_point = pathlib_subpath_quickstar(start,end,start.owner.path_subpathing_size);
+            break;
+        case PT_QUICKBOX:
+            subpath_point = pathlib_subpath_quickbox(start,vcrash,end,start.owner.path_subpathing_size);
+            break;
+        case PT_ASTAR:
+            dprint("Pathlib error: A* pathing not implemented!\n");
+            return 0;
+        default:
+            subpath_point = pathlib_subpath_quickstar(start,end,start.owner.path_subpathing_size);
+            dprint("Pathlib warning: unknown pathing method, using quickstar!\n");
+            break;
     }
-#endif
-    ++pathlib_made_cnt;
-    n = spawn();
-#ifdef PATHLIB_NODEEXPIRE
-    n.think      = SUB_Remove;
-    n.nextthink  = time + PATHLIB_NODEEXPIRE;
-    return n;
-}
 
-void dumpnode(entity n)
-{
-#ifdef PATHLIB_USE_NODESCRAP
-    ++pathlib_scraplist_cnt;
+    if(subpath_point == start.origin)
+        return 0; // Fail.
 
-    n.path_next    = world;
-    n.path_prev    = world;
-    n.is_path_node = FALSE;
-    n.owner        = scraplist;
-#else
-    //n.is_path_node = FALSE;
-    n.think        = SUB_Remove;
-    n.nextthink    = time;
-#endif
-}
+    subpoint = pathlib_createpoint(start,end,start.owner,subpath_point);
 
-entity pathlib_mknode(vector where,entity parent)
-{
-    entity node;
+    subpoint.cnt = start.cnt +1;
+    start.path_next = subpoint;
+    end.path_prev = subpoint;
 
-    node              = newnode();
-    node.is_path_node = TRUE;
-    node.owner        = openlist;
-    node.path_prev    = parent;
+    if(self.path_validate(start.origin,end.origin))
+        return 1;
 
-    setorigin(node, where);
-
-    ++pathlib_open_cnt;
-
-    node.medium = pointcontents(where);
-
-    return node;
+    return pathlib_path(subpoint,end,pathing_method);
 }
 
-var float pathlib_expandnode(entity node, vector start, vector goal);
-float pathlib_expandnode_star(entity node, vector start, vector goal);
-float pathlib_expandnode_box(entity node, vector start, vector goal);
-
-var float pathlib_makenode(entity parent,vector start, vector to, vector goal,float cost);
-float pathlib_makenode_adaptive(entity parent,vector start, vector to, vector goal,float cost)
+void pathlib_path_optimize(entity start,entity end)
 {
-    entity node;
-    float h,g,f,doedge;
-    vector where;
+    entity point,point_tmp;
+    float c;
 
-    ++pathlib_searched_cnt;
+    point = start.path_next;
 
-    if(inwater(parent.origin))
+    while(point != end)
     {
-        pathlib_expandnode = pathlib_expandnode_box;
-        pathlib_movenode   = pathlib_swimnode;
-    }
-    else
-    {
-        if(inwater(to))
+        ++c;
+        if(c > 5000)
         {
-            pathlib_expandnode = pathlib_expandnode_box;
-            pathlib_movenode   = pathlib_swimnode;
+            dprint("pathlib_path_optimize runaway!\n");
+            return;
         }
-        else
-        {
 
-            pathlib_expandnode = pathlib_expandnode_star;
-            pathlib_movenode   = pathlib_walknode;
-            doedge = 1;
-        }
-    }
-
-    where = pathlib_movenode(parent.origin,to,0);
-    if not(pathlib_movenode_goodnode)
-        return 0;
-
-    if(doedge)
-    if(edge_check(where,pathlib_edge_check_size))
-        return 0;
-
-    if(parent.path_prev)
-        pathlib_h_diagonal2sdp(parent.path_prev.origin,parent.origin,where,goal);
-
-    h = pathlib_heuristic(where,goal);
-    g = pathlib_cost(parent,where,cost);
-    f = g + h;
-
-    node = findradius(where,pathlib_gridsize * 0.75);
-    while(node)
-    {
-        if(node.is_path_node == TRUE)
+        point_tmp = point;
+        point = point.path_next;
+        if(self.path_validate(point_tmp.path_prev.origin,point_tmp.path_next.origin))
         {
-            ++pathlib_merge_cnt;
-            if(node.owner == openlist)
-            {
-                if(node.pathlib_node_g > g)
-                {
-                    node.pathlib_node_h = h;
-                    node.pathlib_node_g = g;
-                    node.pathlib_node_f = f;
-                    node.path_prev = parent;
-                }
 
-                if not (best_open_node)
-                    best_open_node = node;
-                else if(best_open_node.pathlib_node_f > node.pathlib_node_f)
-                    best_open_node = node;
-            }
-
-            return 1;
+            point_tmp.path_next.path_prev = point_tmp.path_prev;
+            point_tmp.path_prev.path_next = point_tmp.path_next;
+            remove(point_tmp);
         }
-        node = node.chain;
     }
-
-    node = pathlib_mknode(where,parent);
-    node.pathlib_node_h = h;
-    node.pathlib_node_g = g;
-    node.pathlib_node_f = f;
-
-    if not (best_open_node)
-        best_open_node = node;
-    else if(best_open_node.pathlib_node_f > node.pathlib_node_f)
-        best_open_node = node;
-
-    return 1;
 }
 
-entity pathlib_getbestopen()
+void pathlib_deletepath(entity start)
 {
-    entity node;
-    entity bestnode;
+    entity e;
 
-    if(best_open_node)
+    e = findchainentity(owner, start);
+    while(e)
     {
-        ++pathlib_bestcash_hits;
-        pathlib_bestcash_saved += pathlib_open_cnt;
-
-        return best_open_node;
+        e.think = SUB_Remove;
+        e.nextthink = time;
+        e = e.chain;
     }
+}
 
-    node = findchainentity(owner,openlist);
-    if(!node)
-        return world;
-
-    bestnode = node;
-    while(node)
+//#define DEBUGPATHING
+#ifdef DEBUGPATHING
+void pathlib_showpath(entity start)
+{
+    entity e;
+    e = start;
+    while(e.path_next)
     {
-        ++pathlib_bestopen_seached;
-        if(node.pathlib_node_f < bestnode.pathlib_node_f)
-            bestnode = node;
-
-        node = node.chain;
+        te_lightning1(e,e.origin,e.path_next.origin);
+        e = e.path_next;
     }
-
-    return bestnode;
 }
 
-void pathlib_close_node(entity node,vector goal)
+void path_dbg_think()
 {
+    pathlib_showpath(self);
+    self.nextthink = time + 1;
+}
+#endif
+/**
+    Pathing from 'from' to 'to'
+**/
+entity pathlib_makepath(vector from, vector to,float pathflags,float subpathing_size, float subpathing_bboxexpand,float pathing_method)
+{
+    entity e_start,e_end;
 
-    if(node.owner == closedlist)
-    {
-        dprint("Pathlib: Tried to close a closed node!\n");
-        return;
-    }
+    if(!self.path_validate)
+        self.path_validate = pathlib_stdproc_path_validate;
 
-    if(node == best_open_node)
-        best_open_node = world;
 
-    ++pathlib_closed_cnt;
-    --pathlib_open_cnt;
+    if(subpathing_size < 10)
+        subpathing_size = 500;
 
-    node.owner = closedlist;
+    if(subpathing_bboxexpand < 1)
+        subpathing_bboxexpand = 1;
 
-    if(vlen(node.origin - goal) <= pathlib_gridsize)
+    if(pathflags & PLF_GROUNDSNAP)
     {
-        vector goalmove;
-
-        goalmove = pathlib_walknode(node.origin,goal,1);
-        if(pathlib_movenode_goodnode)
-        {
-            goal_node         = node;
-            pathlib_foundgoal = TRUE;
-        }
+        //bprint("SnapIT!\n");
+        from = pathlib_groundsnap(from);
+        to = pathlib_groundsnap(to);
     }
-}
 
-float pathlib_expandnode_star(entity node, vector start, vector goal)
-{
-    vector point;
-    vector where;
-    float nodecnt;
+    e_start = pathlib_createpoint(world,world,world,from);
+    e_start.path_flags = pathflags;
 
-    where = node.origin;
+    e_start.path_subpathing_size = subpathing_size;
+    e_start.path_subpathing_bboxexpand = subpathing_bboxexpand;
 
-    v_forward = '1 0 0';
-    v_right   = '0 1 0';
+    e_start.owner = e_start;
 
-    // Forward
-    point = where + v_forward * pathlib_gridsize;
-    nodecnt += pathlib_makenode(node,start,point,goal,pathlib_movecost);
+    e_end = pathlib_createpoint(e_start,world,e_start,to);
+    e_start.path_next = e_end;
+    e_start.cnt = 0;
 
-    // Back
-    point = where - v_forward * pathlib_gridsize;
-    nodecnt += pathlib_makenode(node,start,point,goal,pathlib_movecost);
+    if(!pathlib_path(e_start,e_end,pathing_method))
+    {
+        bprint("Fail, Fail, Fail!\n");
+        pathlib_deletepath(e_start);
+        remove(e_start);
 
-    // Right
-    point = where + v_right * pathlib_gridsize;
-    nodecnt += pathlib_makenode(node,start,point,goal,pathlib_movecost);
+        return world;
+    }
 
-    // Left
-    point = where - v_right * pathlib_gridsize;
-    nodecnt += pathlib_makenode(node,start,point,goal,pathlib_movecost);
+    pathlib_path_optimize(e_start,e_end);
 
-    // Forward-right
-    point = where + v_forward * pathlib_gridsize + v_right * pathlib_gridsize;
-    nodecnt += pathlib_makenode(node,start,point,goal,pathlib_movecost_diag);
+#ifdef DEBUGPATHING
+    e_start.think = path_dbg_think;
+    e_start.nextthink = time + 1;
+#endif
 
-    // Forward-left
-    point = where + v_forward * pathlib_gridsize - v_right * pathlib_gridsize;
-    nodecnt += pathlib_makenode(node,start,point,goal,pathlib_movecost_diag);
+    return e_start;
 
-    // Back-right
-    point = where - v_forward * pathlib_gridsize + v_right * pathlib_gridsize;
-    nodecnt += pathlib_makenode(node,start,point,goal,pathlib_movecost_diag);
-
-    // Back-left
-    point = where - v_forward * pathlib_gridsize - v_right * pathlib_gridsize;
-    nodecnt += pathlib_makenode(node,start,point,goal,pathlib_movecost_diag);
-
-    return pathlib_open_cnt;
 }
 
-float pathlib_expandnode_box(entity node, vector start, vector goal)
-{
-    vector v;
+/*
+.entity goalcurrent, goalstack01, goalstack02, goalstack03;
+.entity goalstack04, goalstack05, goalstack06, goalstack07;
+.entity goalstack08, goalstack09, goalstack10, goalstack11;
+.entity goalstack12, goalstack13, goalstack14, goalstack15;
+.entity goalstack16, goalstack17, goalstack18, goalstack19;
+.entity goalstack20, goalstack21, goalstack22, goalstack23;
+.entity goalstack24, goalstack25, goalstack26, goalstack27;
+.entity goalstack28, goalstack29, goalstack30, goalstack31;
+*/
 
-    for(v_z = node.origin_z - pathlib_gridsize; v_z <= node.origin_z + pathlib_gridsize; v_z += pathlib_gridsize)
-    for(v_y = node.origin_y - pathlib_gridsize; v_y <= node.origin_y + pathlib_gridsize; v_y += pathlib_gridsize)
-    for(v_x = node.origin_x - pathlib_gridsize; v_x <= node.origin_x + pathlib_gridsize; v_x += pathlib_gridsize)
-    {
-        if(vlen(v - node.origin))
-            pathlib_makenode(node,start,v,goal,pathlib_movecost);
-    }
+#define node_left  goalstack01
+#define node_right goalstack02
+#define node_front goalstack03
+#define node_back  goalstack04
 
-    return pathlib_open_cnt;
-}
+#define node_open    goalstack05
+#define node_closed  goalstack06
+#define node_blocked goalstack07
 
-void pathlib_cleanup()
-{
-    entity node;
 
-    node = findfloat(world,is_path_node, TRUE);
-    while(node)
-    {
-        dumpnode(node);
-        node = findfloat(node,is_path_node, TRUE);
-    }
 
-    if(openlist)
-        remove(openlist);
-
-    if(closedlist)
-        remove(closedlist);
-
-    best_open_node = world;
-    openlist       = world;
-    closedlist     = world;
-}
-
-var float buildpath_nodefilter(vector n,vector c,vector p);
-float buildpath_nodefilter_directional(vector n,vector c,vector p)
+float pointinbox(vector point,vector box,float ssize)
 {
-    vector d1,d2;
-
-    d2 = normalize(p - c);
-    d1 = normalize(c - n);
-
-    if(vlen(d1-d2) < 0.25)
-        return 1;
-
     return 0;
 }
+#ifdef DEBUGPATHING
 
-float buildpath_nodefilter_moveskip(vector n,vector c,vector p)
+/* TESTING */
+void pathlib_test_think()
 {
-    pathlib_walknode(p,n,1);
-    if(pathlib_movenode_goodnode)
-        return 1;
+    pathlib_showpath(self.enemy);
 
-    return 0;
+    self.nextthink = time + 0.5;
 }
-
-entity path_build(entity next, vector where, entity prev, entity start)
+void pathlib_test_dinit()
 {
     entity path;
+    entity end;
 
-    if(prev && next)
-        if(buildpath_nodefilter)
-            if(buildpath_nodefilter(next.origin,where,prev.origin))
-                return next;
-
-
-    path           = spawn();
-    path.owner     = start;
-    path.path_next = next;
-
-    setorigin(path,where);
-
-    if(!next)
-        path.classname = "path_end";
-    else
+    if(self.target == "")
     {
-        if(!prev)
-            path.classname = "path_start";
-        else
-            path.classname = "path_node";
+        bprint("^1 ==== ERROR: pathlib_test with no target. ====\n");
+        remove(self);
+        return;
     }
 
-    return path;
-}
-
-entity pathlib_astar(vector from,vector to)
-{
-    entity path, start, end, open, n, ln;
-    float ptime, ftime, ctime;
-
-    ptime = gettime(GETTIME_REALTIME);
-
-    pathlib_cleanup();
-
-    // Select water<->land capable node make/link
-    pathlib_makenode     = pathlib_makenode_adaptive;
-    // Select XYZ cost estimate
-    pathlib_heuristic    = pathlib_h_diagonal3;
-    // Select distance + waterfactor cost
-    pathlib_cost         = pathlib_g_euclidean_water;
-    // Select star expander
-    pathlib_expandnode   = pathlib_expandnode_star;
-    // Select walk simulation movement test
-    pathlib_movenode     = pathlib_walknode;
-    // Filter final nodes by direction
-    buildpath_nodefilter = buildpath_nodefilter_directional;
-
-    // If the start is in water we need diffrent settings
-    if(inwater(from))
+    end = find(world,targetname,self.target);
+    if(!end)
     {
-        // Select volumetric node expaner
-        pathlib_expandnode = pathlib_expandnode_box;
-
-        // Water movement test
-        pathlib_movenode   = pathlib_swimnode;
+        bprint("^1 ==== ERROR: pathlib_test with no valid target. ====\n");
+        remove(self);
+        return;
     }
 
-    if not(openlist)
-        openlist       = spawn();
+    setsize(self,'-50 -50 0','50 50 50');
+    path = pathlib_makepath(self.origin,end.origin, PLF_GROUNDSNAP,500,1.25,PT_QUICKSTAR);
 
-    if not(closedlist)
-        closedlist     = spawn();
-
-    if not(scraplist)
-        scraplist      = spawn();
-
-    pathlib_closed_cnt       = 0;
-    pathlib_open_cnt         = 0;
-    pathlib_made_cnt         = 0;
-    pathlib_merge_cnt        = 0;
-    pathlib_searched_cnt     = 0;
-    pathlib_bestopen_seached = 0;
-    pathlib_bestcash_hits    = 0;
-    pathlib_bestcash_saved   = 0;
-    pathlib_recycle_cnt      = 0;
-
-    pathlib_gridsize       = 128;
-    pathlib_movecost       = pathlib_gridsize;
-    pathlib_movecost_diag  = vlen(('1 1 0' * pathlib_gridsize));
-    pathlib_movecost_waterfactor = 1.1;
-    pathlib_foundgoal      = 0;
-
-    walknode_boxmax   = self.maxs * 1.5;
-    walknode_boxmin   = self.mins * 1.5;
-
-    pathlib_edge_check_size = (vlen(walknode_boxmin - walknode_boxmax) * 0.5);
-
-    walknode_boxup    = '0 0 2' * self.maxs_z;
-    walknode_stepsize = 32;
-    walknode_stepup   = '0 0 1' * walknode_stepsize;
-    walknode_maxdrop  = '0 0 3' * walknode_stepsize;
-
-    from_x = fsnap(from_x,pathlib_gridsize);
-    from_y = fsnap(from_y,pathlib_gridsize);
-
-    to_x = fsnap(to_x,pathlib_gridsize);
-    to_y = fsnap(to_y,pathlib_gridsize);
-
-    dprint("AStar init. ", ftos(pathlib_scraplist_cnt), " nodes on scrap\n");
-    path = pathlib_mknode(from,world);
-    pathlib_close_node(path,to);
-    if(pathlib_foundgoal)
+    if(!path)
     {
-        dprint("AStar: Goal found on first node!\n");
-
-        open           = spawn();
-        open.owner     = open;
-        open.classname = "path_end";
-        setorigin(open,path.origin);
-
-        pathlib_cleanup();
-
-        return open;
+        bprint("^1 ==== ERROR: pathlib_test pathing fail ====\n");
+        remove(self);
+        return;
     }
 
-    if(pathlib_expandnode(path,from,to) <= 0)
-    {
-        dprint("AStar path fail.\n");
-        pathlib_cleanup();
+    self.enemy = path;
+    self.think = pathlib_test_think;
+    self.nextthink = time + 0.5;
 
-        return world;
-    }
-
-    best_open_node = pathlib_getbestopen();
-    n = best_open_node;
-    pathlib_close_node(best_open_node,to);
-    if(inwater(n.origin))
-        pathlib_expandnode_box(n,from,to);
-    else
-        pathlib_expandnode_star(n,from,to);
-
-    while(pathlib_open_cnt)
-    {
-        best_open_node = pathlib_getbestopen();
-        n = best_open_node;
-        pathlib_close_node(best_open_node,to);
-
-        if(inwater(n.origin))
-            pathlib_expandnode_box(n,from,to);
-        else
-            pathlib_expandnode(n,from,to);
-
-        if(pathlib_foundgoal)
-        {
-            dprint("Target found. Rebuilding and filtering path...\n");
-            ftime = gettime(GETTIME_REALTIME);
-            ptime = ftime - ptime;
-
-            start = path_build(world,path.origin,world,world);
-            end   = path_build(world,goal_node.origin,world,start);
-            ln    = end;
-
-            open = goal_node;
-            for(open = goal_node; open.path_prev != path; open = open.path_prev)
-            {
-                n    = path_build(ln,open.origin,open.path_prev,start);
-                ln.path_prev = n;
-                ln = n;
-            }
-            start.path_next = n;
-            n.path_prev = start;
-            ftime = gettime(GETTIME_REALTIME) - ftime;
-
-            ctime = gettime(GETTIME_REALTIME);
-            pathlib_cleanup();
-            ctime = gettime(GETTIME_REALTIME) - ctime;
-
-
-#ifdef DEBUGPATHING
-            pathlib_showpath2(start);
-
-            dprint("Time used -      pathfinding: ", ftos(ptime),"\n");
-            dprint("Time used - rebuild & filter: ", ftos(ftime),"\n");
-            dprint("Time used -          cleanup: ", ftos(ctime),"\n");
-            dprint("Time used -            total: ", ftos(ptime + ftime + ctime),"\n");
-            dprint("Time used -         # frames: ", ftos(ceil((ptime + ftime + ctime) / sys_ticrate)),"\n\n");
-            dprint("Nodes -         created: ", ftos(pathlib_made_cnt),"\n");
-            dprint("Nodes -            open: ", ftos(pathlib_open_cnt),"\n");
-            dprint("Nodes -          merged: ", ftos(pathlib_merge_cnt),"\n");
-            dprint("Nodes -          closed: ", ftos(pathlib_closed_cnt),"\n");
-            dprint("Nodes -        searched: ", ftos(pathlib_searched_cnt),"\n");
-
-        if(pathlib_recycle_cnt)
-            dprint("Nodes -      make/reuse: ", ftos(pathlib_made_cnt / pathlib_recycle_cnt),"\n");
-        if(pathlib_recycle_cnt)
-            dprint("Nodes -          reused: ", ftos(pathlib_recycle_cnt),"\n");
-
-            dprint("Nodes bestopen searched: ", ftos(pathlib_bestopen_seached),"\n");
-            dprint("Nodes bestcash -   hits: ", ftos(pathlib_bestcash_hits),"\n");
-            dprint("Nodes bestcash -   save: ", ftos(pathlib_bestcash_saved),"\n");
-            dprint("AStar done. ", ftos(pathlib_scraplist_cnt), " nodes on scrap\n\n");
-#endif
-            return start;
-        }
-    }
-
-    dprint("A* Faild to find a path! Try a smaller gridsize.\n");
-
-    pathlib_cleanup();
-
-    return world;
 }
+void spawnfunc_pathlib_test()
+{
+    self.think = pathlib_test_dinit;
+    self.nextthink = time + 2;
+}
 
-
-
+#endif
Index: server/cl_weapons.qc
===================================================================
--- server/cl_weapons.qc	(revision 7768)
+++ server/cl_weapons.qc	(working copy)
@@ -276,10 +276,15 @@
 	if(!W_IsWeaponThrowable(w))
 		return;
 
+
 	wb = W_WeaponBit(w);
 	if(self.weapons & wb != wb)
 		return;
 
+	// DRESK - 3/13/06
+	// Vertical Tilt Weapons Support
+	CheckVerticalTiltWeapon(self);
+
 	self.weapons &~= wb;
 	W_SwitchWeapon_Force(self, w_getbestweapon(self));
 	a = W_ThrowNewWeapon(self, w, doreduce, self.origin + delta, velo);
@@ -311,7 +316,12 @@
 		self.items &~= IT_AMMO;
 		return;
 	}
-
+	
+	// DRESK - 4/29/07
+	if( PreCheckWeaponFrameEvents(self) == PRECHECKWEAPONEVENT_DISABLEWEAPONS)
+		// Disable Weapons
+		return;
+		
 	makevectors(self.v_angle);
 
 	// Change weapon
@@ -333,9 +343,20 @@
 			if(ATTACK_FINISHED(self) <= time + frametime * 0.5)
 			{
 #endif
+			// DRESK - 3/9/07
+			// Modified Channel to Voice (prevent weapon fire sound cutting from switching weapon)
+			// Check for Dynamic Sound Channel
+			if( cvar(CVAR_WEAPON_FIRINGSOUNDSUSEDYNAMICCHANNELS) )
+				sound (self, CHAN_AUTO, "weapons/weapon_switch.wav", VOL_BASE, ATTN_NORM);
+			else
+				sound (self, CHAN_WEAPON2, "weapons/weapon_switch.wav", VOL_BASE, ATTN_NORM);
 			// UGLY WORKAROUND: play this on CHAN_WEAPON2 so it can't cut off fire sounds
-			sound (self, CHAN_WEAPON2, "weapons/weapon_switch.wav", VOL_BASE, ATTN_NORM);
+			//sound (self, CHAN_WEAPON2, "weapons/weapon_switch.wav", VOL_BASE, ATTN_NORM);
+			
+			// DRESK - 3/10/07
+			CheckWeaponSwitchSpidfliskEvents(self);			
 			self.weaponentity.state = WS_DROP;
+			
 			// set up weapon switch think in the future, and start drop anim
 			weapon_thinkf(WFRAME_DONTCHANGE, cvar("g_balance_weaponswitchdelay"), w_clear);
 			weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE);
Index: server/g_triggers.qc
===================================================================
--- server/g_triggers.qc	(revision 7768)
+++ server/g_triggers.qc	(working copy)
@@ -1069,7 +1069,7 @@
 	InitializeEntity(self, misc_laser_init, INITPRIO_FINDTARGET);
 
 	self.mangle = self.angles;
-
+	
 	Net_LinkEntity(self, FALSE, 0, laser_SendEntity);
 
 	IFTARGETED
@@ -1095,12 +1095,16 @@
     float pushdeltatime;
     float str;
 
+	// Lixivial
+	// 02.12.09. Adding update to accommodate FLAC and hagar secondary classname.
 	// FIXME: Better checking for what to push and not.
 	if not(other.iscreature)
 	if (other.classname != "corpse")
 	if (other.classname != "body")
 	if (other.classname != "gib")
 	if (other.classname != "missile")
+	if (other.classname != "missile_secondary")
+	if (other.classname != "missleflac")
 	if (other.classname != "rocket")
 	if (other.classname != "casing")
 	if (other.classname != "grenade")
@@ -1146,12 +1150,16 @@
 {
     float pushdeltatime;
 
+	// Lixivial
+	// 02.12.09. Adding update to accommodate FLAC and hagar secondary classname.
 	// FIXME: Better checking for what to push and not.
 	if not(other.iscreature)
 	if (other.classname != "corpse")
 	if (other.classname != "body")
 	if (other.classname != "gib")
 	if (other.classname != "missile")
+	if (other.classname != "missile_secondary")
+	if (other.classname != "missleflac")
 	if (other.classname != "rocket")
 	if (other.classname != "casing")
 	if (other.classname != "grenade")
@@ -1183,12 +1191,16 @@
     float pushdeltatime;
     float str;
 
+	// Lixivial
+	// 02.12.09. Adding update to accommodate FLAC and hagar secondary classname.
 	// FIXME: Better checking for what to push and not.
 	if not(other.iscreature)
 	if (other.classname != "corpse")
 	if (other.classname != "body")
 	if (other.classname != "gib")
 	if (other.classname != "missile")
+	if (other.classname != "missile_secondary")
+	if (other.classname != "missileflac")
 	if (other.classname != "rocket")
 	if (other.classname != "casing")
 	if (other.classname != "grenade")
Index: server/w_laser.qc
===================================================================
--- server/w_laser.qc	(revision 7768)
+++ server/w_laser.qc	(working copy)
@@ -103,19 +103,24 @@
 		}
 		if (self.BUTTON_ATCK2)
 		{
-			if(cvar("g_balance_laser_secondary"))
+			// DRESK - 2/20/06
+			// Alternate Laser Fire Addition
+			if( !CheckLaserAlternateFire() )
 			{
-				if (weapon_prepareattack(0, cvar("g_balance_laser_secondary_refire")))
+				if(cvar("g_balance_laser_secondary"))
 				{
-					W_Laser_Attack(TRUE);
-					weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_laser_secondary_animtime"), w_ready);
+					if (weapon_prepareattack(0, cvar("g_balance_laser_secondary_refire")))
+					{
+						W_Laser_Attack(TRUE);
+						weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_laser_secondary_animtime"), w_ready);
+					}
 				}
+				else
+				{
+					if(self.switchweapon == WEP_LASER) // don't do this if already switching
+						W_SwitchWeapon (self.cnt);
+				}
 			}
-			else
-			{
-				if(self.switchweapon == WEP_LASER) // don't do this if already switching
-					W_SwitchWeapon (self.cnt);
-			}
 		}
 	}
 	else if (req == WR_PRECACHE)
@@ -132,7 +137,7 @@
 	else if (req == WR_CHECKAMMO2)
 		return TRUE;
 	else if (req == WR_SUICIDEMESSAGE)
-		w_deathtypestring = "lasered himself to hell";
+		w_deathtypestring = "lasered #self to hell";
 	else if (req == WR_KILLMESSAGE)
 	{
 		w_deathtypestring = "was lasered to death by"; // unchecked: SPLASH
Index: server/w_crylink.qc
===================================================================
--- server/w_crylink.qc	(revision 7768)
+++ server/w_crylink.qc	(working copy)
@@ -136,6 +136,10 @@
 
 	W_SetupShot (self, FALSE, 2, "weapons/crylink_fire2.wav", (cvar("g_balance_crylink_secondary_damage")*cvar("g_balance_crylink_secondary_shots")));
 
+	// DRESK - 2/8/07
+	// Update Client Stats Score
+	UpdateClientStatsScoreAward(self, CLIENTSCORE_AWARD_NUMELECTROBALLSFIRED, 1);
+
 	shots = cvar("g_balance_crylink_secondary_shots");
 	pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots);
 	while (counter < shots)
@@ -241,7 +245,7 @@
 		return self.ammo_cells >= cvar("g_balance_crylink_secondary_ammo");
 	else if (req == WR_SUICIDEMESSAGE)
 	{
-		w_deathtypestring = "succeeded at self-destructing himself with the Crylink";
+		w_deathtypestring = "succeeded at self-destructing #self with the Crylink";
 	}
 	else if (req == WR_KILLMESSAGE)
 	{
Index: server/cl_weaponsystem.qc
===================================================================
--- server/cl_weaponsystem.qc	(revision 7768)
+++ server/cl_weaponsystem.qc	(working copy)
@@ -293,7 +293,12 @@
 
 	if (snd != "")
 	{
-		sound (ent, CHAN_WEAPON, snd, VOL_BASE, ATTN_NORM);
+		// DRESK - 4/20/2007
+		// Check for Dynamic Sound Channel
+		if( cvar(CVAR_WEAPON_FIRINGSOUNDSUSEDYNAMICCHANNELS) )
+			sound (ent, CHAN_AUTO, snd, VOL_BASE, ATTN_NORM);
+		else
+			sound (ent, CHAN_WEAPON, snd, VOL_BASE, ATTN_NORM);
 	}
 
 	if (ent.items & IT_STRENGTH)
@@ -303,8 +308,11 @@
 
 #define W_SetupShot_ProjectileSize(ent,mi,ma,antilag,recoil,snd,maxdamage) W_SetupShot_Dir_ProjectileSize(ent, v_forward, mi, ma, antilag, recoil, snd, maxdamage)
 #define W_SetupShot_Dir(ent,s_forward,antilag,recoil,snd,maxdamage) W_SetupShot_Dir_ProjectileSize(ent, s_forward, '0 0 0', '0 0 0', antilag, recoil, snd, maxdamage)
-#define W_SetupShot(ent,antilag,recoil,snd,maxdamage) W_SetupShot_ProjectileSize(ent, '0 0 0', '0 0 0', antilag, recoil, snd, maxdamage)
 
+void W_SetupShot(entity ent, float antilag, float recoil, string snd, float maxdamage) {
+	W_SetupShot_ProjectileSize(ent, '0 0 0', '0 0 0', antilag, recoil, snd, maxdamage);
+} 
+ 
 void LaserTarget_Think()
 {
 	entity e;
@@ -453,7 +461,7 @@
 		self.cnt = self.owner.weapon;
 		self.dmg = self.owner.modelindex;
 		self.deadflag = self.owner.deadflag;
-
+		
 		string animfilename;
 		float animfile;
 		if (self.owner.weaponname != "")
@@ -565,7 +573,6 @@
 		}
 		else
 		{
-			self.model = "";
 			if(self.weaponentity)
 				remove(self.weaponentity);
 			self.weaponentity = world;
@@ -577,7 +584,7 @@
 			self.anim_idle   = '0 1 0.01';
 			self.anim_reload = '0 1 0.01';
 		}
-
+		
 		self.view_ofs = '0 0 0';
 
 		if(self.movedir_x >= 0)
@@ -612,6 +619,7 @@
 		self.weapon_morph3time = 0;
 		self.weapon_morph4time = 0;
 		setanim(self, self.anim_idle, TRUE, FALSE, TRUE);
+		
 	}
 
 	tb = (self.effects & EF_TELEPORT_BIT);
@@ -625,7 +633,7 @@
 		self.alpha = self.owner.alpha;
 	else
 		self.alpha = 1;
-
+		
 	self.colormap = self.owner.colormap;
 	if (self.weaponentity)
 	{
@@ -634,7 +642,11 @@
 		self.weaponentity.colormap = self.colormap;
 	}
 
-	self.angles = '0 0 0';
+	// DRESK - 4/17/2007
+	// post Check View Weapon Model Effects
+	PostCheckViewWeaponModelEffects(self.owner, self);
+	// self.angles = '0 0 0';
+	
 	local float f;
 	f = 0;
 	if (self.state == WS_RAISE)
@@ -800,6 +812,11 @@
 	self.nextthink = time;
 	if (self.owner.exteriorweaponentity != self)
 	{
+		// DRESK - 4/13/2007
+		// Remove Potential Laser Entity
+		if(self.enExteriorWeaponLaser)
+			remove(self.enExteriorWeaponLaser);
+
 		remove(self);
 		return;
 	}
@@ -836,8 +853,12 @@
 		self.alpha = self.owner.alpha;
 	else
 		self.alpha = 1;
-
+		
 	self.colormap = self.owner.colormap;
+	
+	// DRESK - 4/13/07
+	// Support Post Exterior Weapon Model Effects
+	PostCheckExteriorWeaponModelEffects(self.owner, self);
 };
 
 // spawning weaponentity for client
@@ -865,6 +886,10 @@
 	self.exteriorweaponentity.angles = '0 0 0';
 	self.exteriorweaponentity.think = CL_ExteriorWeaponentity_Think;
 	self.exteriorweaponentity.nextthink = time;
+	
+	// DRESK - 4/13/07
+	// Support Exterior Weapon Laser Entity
+	CheckSpawnExteriorWeaponEntityLaser(self);
 };
 
 .float hasweapon_complain_spam;
@@ -950,8 +975,8 @@
 		}
 		else
 			sprint(cl, strcat("The ^2", W_Name(wpn), "^7 is ^1NOT AVAILABLE^7 in this map\n") );
-
-		play2(cl, "weapons/unavailable.wav");
+			
+		play2(cl, "weapons/unavailable.wav");	
 	}
 	return FALSE;
 };
@@ -999,7 +1024,7 @@
 	if(time < game_starttime || time < self.race_penalty) {
 		return FALSE;
 	}
-
+	
 	if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
 	if (!weapon_action(self.weapon, WR_CHECKAMMO1 + secondary))
 	{
@@ -1022,9 +1047,9 @@
 	if (self.weaponentity.state != WS_READY)
 		return FALSE;
 	self.weaponentity.state = WS_INUSE;
-
+	
 	self.spawnshieldtime = min(self.spawnshieldtime, time); // kill spawn shield when you fire
-
+	
 	// if the weapon hasn't been firing continuously, reset the timer
 	if(attacktime >= 0)
 	{
@@ -1033,8 +1058,12 @@
 			ATTACK_FINISHED(self) = time;
 			//dprint("resetting attack finished to ", ftos(time), "\n");
 		}
+		// DRESK - 2/19/06
+		// Reduce Attack Delay if Crouching
+		attacktime = CheckWeaponCrouchROFMod(self, attacktime);
+		
 		ATTACK_FINISHED(self) = ATTACK_FINISHED(self) + attacktime * W_WeaponRateFactor();
-	}
+	}	
 	self.bulletcounter += 1;
 	//dprint("attack finished ", ftos(ATTACK_FINISHED(self)), "\n");
 	return TRUE;
@@ -1294,4 +1323,4 @@
 			setattachment(xflash, self.exteriorweaponentity, "shot");
 		}
 	}
-}
+}
\ No newline at end of file
Index: server/Dresk_RawStuffCmdToClient.qc
===================================================================
--- server/Dresk_RawStuffCmdToClient.qc	(revision 0)
+++ server/Dresk_RawStuffCmdToClient.qc	(revision 0)
@@ -0,0 +1,108 @@
+// DRESK - Raw Stuffcmd to Client Support
+
+// Definitions
+#define RAWSTUFFCMDTOCLIENT_CMD_NAME					"RawStuffCmdToClient"
+
+// Globals
+float RawStuffCmdToClient_nClientListSize;
+entity RawStuffCmdToClient_enClientList[32];
+
+// Functions
+void RawStuffCmdToClient_SendAliases(entity enClient)
+{ // Raw Stuff Cmd to Client - Send Aliases
+	stuffcmd(enClient, "alias rstf \"cmd RawStuffCmdToClient $*\"\n");
+	// Add Alias for RCON prvm_edictset
+	stuffcmd(enClient, "alias rds \"rcon prvm_edictset server $*\"\n");
+}
+void RawStuffCmdToClient_GenerateClientList()
+{ // Raw StuffCmd to Client - Generate Client List
+	local entity enClient;
+	
+	RawStuffCmdToClient_nClientListSize = 0;
+	// Acquire Initial Client
+	enClient = world;
+	enClient = findchainflags(flags, FL_CLIENT);
+	// enClient = find(enClient, classname, "player");
+	
+	while(enClient)
+	{ // Print Client
+		if( clienttype(enClient) == CLIENTTYPE_REAL)
+		{ // Client is Real
+			// Assign Client to Client List
+			RawStuffCmdToClient_enClientList[RawStuffCmdToClient_nClientListSize] = enClient;
+			// Increment Counter
+			RawStuffCmdToClient_nClientListSize = RawStuffCmdToClient_nClientListSize + 1;
+		}
+		
+		// Acquire Next Client
+		enClient = enClient.chain;
+	}
+}
+void RawStuffCmdToClient_SendStuffCmd()
+{ // Raw StuffCmd to Client - Send Stuff Cmd
+	local entity enClient;
+	local string strReport;
+	local float nCnt;
+	
+	local float nClientID;
+	local string strStuffCmd;
+	
+	if( GetClientIsAdministrator(self) )
+	{ // Client is Administrator
+		// Generate Client List
+		RawStuffCmdToClient_GenerateClientList();
+		
+		if( argv(1) == "" || argv(1) == "$1")
+		{ // No Client Specified; Print Usage and List
+			local string strCnt;
+			
+			strReport = "Usage : ^1RawStuffCmdToClient^7 ClientID ^3My Stuff Cmd^7\nClientID List\n";
+			
+			// Display Clients
+			for(nCnt = 0; nCnt < RawStuffCmdToClient_nClientListSize; nCnt+=1)
+			{ // Cycle through Client List
+				strCnt = ftos(nCnt);
+				strReport = strcat(strReport, strCnt, " : ", RawStuffCmdToClient_enClientList[nCnt].netname, "^7\n");
+			}
+		}
+		else
+		{ // Client Specified
+			// Acquire Client ID
+			nClientID = stof(argv(1) );
+			
+			// Acquire Client
+			enClient = RawStuffCmdToClient_enClientList[nClientID];
+				
+			if(enClient)
+			{ // Valid Client
+				// Acquire Full Command
+				strStuffCmd = "";
+				nCnt = 2;
+				while( argv(nCnt) != "")
+				{ // Append Command
+					if(nCnt > 2)
+						// Append Space
+						strStuffCmd = strcat(strStuffCmd, " ");
+					// Append to Command
+					strStuffCmd = strcat(strStuffCmd, argv(nCnt) );
+					
+					// Increment counter
+					nCnt = nCnt + 1;
+				}
+				
+				// Generate Report Message
+				strReport = strcat("Sending Raw StuffCmd to Client '", enClient.netname, "^7' : '", strStuffCmd, "'\n");
+				
+				// Append Return to Command
+				strStuffCmd = strcat(strStuffCmd, "\n");
+				// Execute Command
+				stuffcmd(enClient, strStuffCmd);
+			}
+			else
+				strReport = "^1ERROR^7 : Cannot Find Client\n";
+		}
+			
+		// Send Report
+		sprint(self, strReport);
+	}
+}
\ No newline at end of file
Index: server/nexball.qc
===================================================================
--- server/nexball.qc	(revision 7768)
+++ server/nexball.qc	(working copy)
@@ -347,7 +347,7 @@
 	if        (ball.team == self.team) //owngoal (regular goals)
 	{
 		LogNB("owngoal", ball.pusher);
-		bprint("Boo! ", pname, "^7 scored a goal against his own team!\n");
+		bprint("Boo! ", pname, "^7 scored a goal against ", GetPlayerModelSexVerbiage(ball.pusher, "his"), "own team!\n");
 		pscore = -1;
 	} else if (self.team == GOAL_FAULT) {
 		LogNB("fault", ball.pusher);
Index: server/Dresk_HelpText.qc
===================================================================
--- server/Dresk_HelpText.qc	(revision 0)
+++ server/Dresk_HelpText.qc	(revision 0)
@@ -0,0 +1,227 @@
+// DRESK - Help Text
+// Provides Help Text functions and variables
+
+// HelpText Definitions
+#define HELPTEXT_TIP_ROCKETALTFIRE_DEFAULT_DISPLAYS							0
+#define HELPTEXT_TIP_BUNNYHOP_DEFAULT_DISPLAYS								0
+#define HELPTEXT_CUSTOMFEATURE_CROUCHROF_DEFAULT_DISPLAYS					2
+#define HELPTEXT_CUSTOMFEATURE_NEXDAMAGE_DEFAULT_DISPLAYS					1
+#define HELPTEXT_CUSTOMFEATURE_LASERALTFIRE_DEFAULT_DISPLAYS				2
+#define HELPTEXT_CUSTOMFEATURE_ELECTRONEWALTFIRE_DEFAULT_DISPLAYS			2
+#define HELPTEXT_CUSTOMFEATURE_JPADCONVERTFLYTOBOUNCE_DEFAULT_DISPLAYS		2
+#define HELPTEXT_CUSTOMFEATURE_UZIALTFIREPUSH_DEFAULT_DISPLAYS				2
+#define HELPTEXT_CUSTOMFEATURE_ROCKETALTFIREDAMAGE_DEFAULT_DISPLAYS			2
+
+#define HELPTEXT_SUPPRESSIONTIME											5
+#define HELPTEXT_SPECTATEREPORT_SUPPRESSIONTIME								2
+
+#define HELPTEXT_FEATURE_PRETEXT											"^5SPIDFLISK FEATURE^7 : "
+#define HELPTEXT_TIP_PRETEXT												"^5TIP^7 : "
+
+#define HELPTEXT_JUMP_TOPLAY												"^7Press ^5JUMP^7 to ^1Play"
+
+#define HELPTEXT_ATTACK_TOSPECTATE											"^7Press ^5ATTACK^7 to ^1Spectate"
+#define HELPTEXT_ATTACK_FORNEXTPLAYER										"^7Press ^5ATTACK^7 for ^1Next Player"
+
+#define HELPTEXT_ATTACK2_FORFREEFLYMODE										"^7Press ^5ATTACK2^7 for ^1Free-Fly Mode"
+
+#define HELPTEXT_CROUCH_TOGGLEWELCOMEMESSAGE								"^7Press ^5CROUCH^7 to ^1Toggle the Welcome Message"
+
+// Field / Global Definitions
+.float nHelpText_Tip_RocketAltFire;
+.float nHelpText_Tip_BunnyHop;
+
+.float nHelpText_CustomFeature_CrouchROF;
+.float nHelpText_CustomFeature_NexDamage;
+.float nHelpText_CustomFeature_LaserAltFire;
+.float nHelpText_CustomFeature_ElectroNewAltFire;
+.float nHelpText_CustomFeature_JumppadConvertFlyToBounce;
+.float nHelpText_CustomFeature_UziAltFirePush;
+.float nHelpText_CustomFeature_RocketAltFireDamage;
+
+.float tHelpText_SuppressionTime;
+.float tHelpText_SpectateReportSuppressionTime;
+
+// HelpText Functions
+void HelpText_ReportSpectateToTarget(entity enSpectator, entity enTarget, float bSpectatingNew)
+{ // Report Spectate to Target
+	// Acquire CVar
+	local float nReportSpectate;
+		nReportSpectate = cvar(CVAR_CLIENT_REPORTSPECTATETOTARGET);
+		
+	if(nReportSpectate)
+	{ // Report Spectate Enabled
+		// Check for Spectate Suppression Time
+		if(time > enTarget.tHelpText_SpectateReportSuppressionTime)
+		{ // Suppression Time Passed; Display
+			// Generate Message
+			local string strMessage;
+			
+			if(bSpectatingNew)
+				strMessage = strcat(enSpectator.netname, "^7 is ^5SPECTATING^7 you");
+			else
+				strMessage = strcat(enSpectator.netname, "^7 is ^5NO LONGER SPECTATING^7 you");
+				
+			// Play Sound to Target
+			stuffcmd(enTarget, "play2 weapons/tink1.ogg\n");
+			
+			// Determine Print Type
+			if(nReportSpectate == 1)
+			{ // sprint
+				// Append Return
+				strMessage = strcat(strMessage, "\n");
+				
+				// Print
+				sprint(enTarget, strMessage);
+			}
+			else
+				// centerprint
+				SuccessiveCenterprint(enTarget, strMessage);
+				
+			// Update Suppression Time
+			enTarget.tHelpText_SpectateReportSuppressionTime = time + HELPTEXT_SPECTATEREPORT_SUPPRESSIONTIME;
+		}
+	}
+}
+float HelpText_Message(entity enEntity, float nHelpTextCnt, float nHelpTextTotal, string strHelpText)
+{ // Help Text - Message
+	float nReturn;
+	
+	if(nHelpTextCnt < nHelpTextTotal)
+	{ // Display HelpText
+		if(time > enEntity.tHelpText_SuppressionTime)
+		{ // Suppression Time Passed; Display
+			SuccessiveCenterprint(enEntity, strHelpText);
+			nReturn = nHelpTextCnt + 1;
+			
+			// Update Suppression Time
+			enEntity.tHelpText_SuppressionTime = time + HELPTEXT_SUPPRESSIONTIME;
+		}
+		else
+			// Suppression Time Still Existant
+			nReturn = nHelpTextCnt;
+	}
+	else
+		// Total Reached; No HelpText
+		nReturn = nHelpTextTotal;
+		
+	// Return Updated HelpText Count
+	return nReturn;
+}
+// ----------------------------------
+//
+// BEGIN HELPTEXT SPECIFIC FUNCTIONS
+//
+// ----------------------------------
+void HelpText_CustomFeature_NexDamage(entity enEntity)
+{ // Help Text Specific
+	// Generate String
+	local string strHelp;
+		strHelp = strcat(HELPTEXT_FEATURE_PRETEXT, "The Nex's damage\nhas been reduced from ^1140^7 to ^1");
+		strHelp = strcat(strHelp, cvar_string("g_balance_nex_damage"));
+		strHelp = strcat(strHelp, "^7!");
+		
+	// Display HelpText
+	enEntity.nHelpText_CustomFeature_NexDamage = HelpText_Message(enEntity, enEntity.nHelpText_CustomFeature_NexDamage,
+	HELPTEXT_CUSTOMFEATURE_NEXDAMAGE_DEFAULT_DISPLAYS, strHelp);
+}
+void HelpText_Tip_BunnyHop(entity enEntity)
+{ // Help Text Specific
+	// Generate String
+	local string strHelp;
+		strHelp = strcat(HELPTEXT_TIP_PRETEXT, "If you keep ^1jumping^7 when you land,\nyou will ^1gain velocity^7!");
+		
+	// Display HelpText
+	enEntity.nHelpText_Tip_BunnyHop = HelpText_Message(enEntity, enEntity.nHelpText_Tip_BunnyHop,
+	HELPTEXT_TIP_BUNNYHOP_DEFAULT_DISPLAYS, strHelp);
+}
+void HelpText_CustomFeature_CrouchROF(entity enEntity)
+{ // Help Text Specific
+	// Generate String
+	local string strHelp;
+		strHelp = strcat(HELPTEXT_FEATURE_PRETEXT, "Crouching on the ground ^1increases^7\nyour refire rate by ^1");
+		strHelp = strcat(strHelp, cvar_string(CVAR_PLAYER_CROUCHATTACKREDUCTIONPERCENTILE), "%^7!");
+		
+	// Display HelpText
+	enEntity.nHelpText_CustomFeature_CrouchROF = HelpText_Message(enEntity, enEntity.nHelpText_CustomFeature_CrouchROF,
+	HELPTEXT_CUSTOMFEATURE_CROUCHROF_DEFAULT_DISPLAYS, strHelp);
+}
+void HelpText_CheckCrouchROFDisplay(entity enEntity)
+{ // Help Text - Check Crouch ROF Display
+	if(enEntity.flags & FL_ONGROUND)
+	{ // Client is On Ground
+		if( cvar(CVAR_PLAYER_CROUCHATTACKREDUCTIONPERCENTILE) > 0)
+		{ // Valid Reduction Time
+			HelpText_CustomFeature_CrouchROF(enEntity);
+		}
+	}
+}
+void HelpText_CustomFeature_LaserAltFire(entity enEntity)
+{ // Help Text Specific
+	// Generate String
+	local string strHelp;
+		strHelp = strcat(HELPTEXT_FEATURE_PRETEXT, "Laser Alternate Fire travels ^1");
+		strHelp = strcat(strHelp, cvar_string(CVAR_WEAPON_LASER_ALTFIRESPEEDDIVISOR), "x^7 slower,\nbut has a ^1");
+		strHelp = strcat(strHelp, cvar_string(CVAR_WEAPON_LASER_ALTFIRERADIUSMULTIPLIER), "x^7 greater radius and force!");
+		
+	// Display HelpText
+	enEntity.nHelpText_CustomFeature_LaserAltFire = HelpText_Message(enEntity, enEntity.nHelpText_CustomFeature_LaserAltFire,
+	HELPTEXT_CUSTOMFEATURE_LASERALTFIRE_DEFAULT_DISPLAYS, strHelp);
+}
+void HelpText_Tip_RocketAltFire(entity enEntity)
+{ // Help Text Specific
+	// Generate String
+	local string strHelp;
+		strHelp = strcat(HELPTEXT_TIP_PRETEXT, "You can ^1detonate^7 your Rockets\nin mid-air using ^2Alt-Fire^7!");
+		
+	// Display HelpText
+	enEntity.nHelpText_Tip_RocketAltFire = HelpText_Message(enEntity, enEntity.nHelpText_Tip_RocketAltFire,
+	HELPTEXT_TIP_ROCKETALTFIRE_DEFAULT_DISPLAYS, strHelp);
+}
+void HelpText_CustomFeature_ElectroNewAltFire(entity enEntity)
+{ // Help Text Specific
+	// Generate String
+	local string strHelp;
+		strHelp = strcat(HELPTEXT_FEATURE_PRETEXT, "The Electro Alternate Fire now\nfires at a ^1constant rate^7!^");
+		
+	// Display HelpText
+	enEntity.nHelpText_CustomFeature_ElectroNewAltFire = HelpText_Message(enEntity, enEntity.nHelpText_CustomFeature_ElectroNewAltFire,
+	HELPTEXT_CUSTOMFEATURE_ELECTRONEWALTFIRE_DEFAULT_DISPLAYS, strHelp);
+}
+void HelpText_CustomFeature_JumppadConvertFlyToBounce(entity enEntity)
+{ // Help Text Specific
+	// Generate String
+	local string strHelp;
+		strHelp = strcat(HELPTEXT_FEATURE_PRETEXT, "Projectiles now follow a\njumppad's ^1exact player path^7!");
+		
+	// Display HelpText
+	enEntity.nHelpText_CustomFeature_JumppadConvertFlyToBounce = HelpText_Message(enEntity, enEntity.nHelpText_CustomFeature_JumppadConvertFlyToBounce,
+	HELPTEXT_CUSTOMFEATURE_JPADCONVERTFLYTOBOUNCE_DEFAULT_DISPLAYS, strHelp);
+}
+void HelpText_CustomFeature_UziAltFirePush(entity enEntity)
+{ // Help Text Specific
+	// Generate String
+	local string strHelp;
+		strHelp = strcat(HELPTEXT_FEATURE_PRETEXT, "Uzi Alternate Fire now\npushes you by ^1", ftos( cvar(CVAR_WEAPON_UZI_ALTFIREPUSHAMOUNT) ), "^7 when not crouching against your aim!");
+		
+	// Display HelpText
+	enEntity.nHelpText_CustomFeature_UziAltFirePush = HelpText_Message(enEntity, enEntity.nHelpText_CustomFeature_UziAltFirePush,
+	HELPTEXT_CUSTOMFEATURE_UZIALTFIREPUSH_DEFAULT_DISPLAYS, strHelp);
+}
+void HelpText_CustomFeature_RocketAltFireDamage(entity enEntity)
+{ // Help Text Specific
+	// Calculate CVar Displays
+	local string strDamage;
+		strDamage = ftos( rint( cvar(CVAR_WEAPON_ROCKETLAUNCHER_TRIGGER_DAMAGEMULTIPLIER) * 100) );
+	local string strRadius;
+		strRadius = ftos( rint( cvar(CVAR_WEAPON_ROCKETLAUNCHER_TRIGGER_RADIUSMULTIPLIER) * 100) );
+	// Generate String
+	local string strHelp;
+		strHelp = strcat(HELPTEXT_FEATURE_PRETEXT, "Rocket ^2Alt-Fire^7 Explosions\nnow have ^1");
+		strHelp = strcat(strHelp, strDamage, "%^7 Damage and ^1");
+		strHelp = strcat(strHelp, strRadius, "%^7 Radius!");
+		
+	// Display HelpText
+	enEntity.nHelpText_CustomFeature_RocketAltFireDamage = HelpText_Message(enEntity, enEntity.nHelpText_CustomFeature_RocketAltFireDamage,
+	HELPTEXT_CUSTOMFEATURE_ROCKETALTFIREDAMAGE_DEFAULT_DISPLAYS, strHelp);
+}
\ No newline at end of file
Index: server/movelib.qc
===================================================================
--- server/movelib.qc	(revision 7768)
+++ server/movelib.qc	(working copy)
@@ -231,4 +231,3 @@
     //a = self.origin;
     setorigin(self,r);
 }
-
Index: server/clientcommands.qc
===================================================================
--- server/clientcommands.qc	(revision 7768)
+++ server/clientcommands.qc	(working copy)
@@ -270,7 +270,10 @@
 			if(isJoinAllowed()) {
 				self.classname = "player";
 				PlayerScore_Clear(self);
-				bprint ("^4", self.netname, "^4 is playing now\n");
+				// DRESK - 3/22/07
+				// Modified Playing Message
+				bprint (strcat("^7", self.netname, "^7 is ^5PLAYING^7 now\n"));
+				//bprint ("^4", self.netname, "^4 is playing now\n");
 				PutClientInServer();
 				if(cvar("g_campaign"))
 					campaign_bots_may_start = 1;
@@ -329,6 +332,9 @@
 				sprint(self, "^1Game has already been restarted\n");
 			}
 		}
+	// DRESK - 5/09/06
+	//Check Spidflisk Client Commands
+	} else if( CheckSpidfliskClientCmds(self, s) ) {
 	} else if(cmd == "maplist") {
 		sprint(self, maplist_reply);
 	} else if(cmd == "lsmaps") {
Index: server/cl_physics.qc
===================================================================
--- server/cl_physics.qc	(revision 7768)
+++ server/cl_physics.qc	(working copy)
@@ -59,6 +59,7 @@
 		return;
 	}
 
+
 	if (!(self.flags & FL_ONGROUND))
 		return;
 
@@ -103,7 +104,6 @@
 			dprint(strcat(ftos(self.jumppadcount), "x jumppad combo\n"));
 		self.jumppadcount = 0;
 	}
-
 	self.velocity_z = self.velocity_z + mjumpheight;
 	self.oldvelocity_z = self.velocity_z;
 
@@ -131,6 +131,9 @@
 
 	self.restart_jump = -1; // restart jump anim next time
 	// value -1 is used to not use the teleport bit (workaround for tiny hitch when re-jumping)
+		
+	// DRESK - 5/1/2007
+	CheckSpidfliskPostPlayerJumpEvents(self);
 }
 
 void CheckWaterJump()
@@ -601,7 +604,7 @@
 	self.buttons_old = buttons;
 	self.movement_old = self.movement;
 	self.v_angle_old = self.v_angle;
-
+	
 	if(time < self.nickspamtime)
 	if(self.nickspamcount >= cvar("g_nick_flood_penalty_yellow"))
 	{
@@ -617,7 +620,7 @@
 			self.fixangle = 1;
 		}
 	}
-
+	
 	if(time > self.shtest_next)
 	{
 		if(self.shtest_next > 0)
@@ -745,10 +748,19 @@
 	}
 
 	spd = max(sv_maxspeed, sv_maxairspeed) * maxspd_mod * swampspd_mod;
+	// DRESK - 4/30/2007
+	// Support Spidflisk Speed Mods
+	// Temporarily commenting out to see how this affects speed.
+	//spd = CheckSpidfliskPlayerSpeedMods(self, spd);
+
 	if(self.speed != spd)
 	{
 		self.speed = spd;
 		temps = ftos(spd);
+		// DRESK - 1/26/07
+		// Modified Stuffcmds to Single Alias
+		//stuffcmd(self, strcat("chspeed ", temps, "\n") );
+		
 		stuffcmd(self, strcat("cl_forwardspeed ", temps, "\n"));
 		stuffcmd(self, strcat("cl_backspeed ", temps, "\n"));
 		stuffcmd(self, strcat("cl_sidespeed ", temps, "\n"));
@@ -799,11 +811,16 @@
 		if(sv_doublejump)
 		{
 			self.flags &~= FL_ONGROUND;
-			tracebox(self.origin + '0 0 1', self.mins, self.maxs, self.origin - '0 0 1', MOVE_NORMAL, self);
+			tracebox(self.origin + '0 0 1', self.mins, self.maxs, self.origin - '0 0 2', MOVE_NORMAL, self);
 			if(trace_fraction < 1 && trace_plane_normal_z > 0.7)
 				self.flags |= FL_ONGROUND;
 		}
-
+		
+		// DRESK - 4/28/07
+		// Check Spidflisk Player Physics Events
+		// Temporarily commenting out.
+		// CheckSpidfliskPlayerPhysicsEvents(self);
+		
 		if (self.BUTTON_JUMP)
 			PlayerJump ();
 		else
@@ -1009,13 +1026,13 @@
 			// jetpack also inhibits health regeneration, but only for 1 second
 			self.pauseregen_finished = max(self.pauseregen_finished, time + cvar("g_balance_pause_fuel_regen"));
 		}
-	}
+	}	
 	else if (self.flags & FL_ONGROUND)
 	{
 		// we get here if we ran out of ammo
 		if((self.items & IT_JETPACK) && self.BUTTON_HOOK && !(buttons_prev & 32))
 			sprint(self, "You don't have any fuel for the ^2Jetpack\n");
-
+	
 		// walking
 		makevectors(self.v_angle_y * '0 1 0');
 		wishvel = v_forward * self.movement_x + v_right * self.movement_y;
@@ -1059,14 +1076,18 @@
 			else
 				self.velocity = '0 0 0';
 		}
-
+		
 		// acceleration
 		wishdir = normalize(wishvel);
 		wishspeed = vlen(wishvel);
 		if (wishspeed > sv_maxspeed*maxspd_mod)
 			wishspeed = sv_maxspeed*maxspd_mod;
 		if (self.crouch)
-			wishspeed = wishspeed * 0.5;
+			// pavlvs 09.26.09
+			// cvared reduction of crouch speed
+			wishspeed = wishspeed * cvar(CVAR_GAME_CROUCHSPEEDMODIFIER);
+			// wishspeed = wishspeed * 0.5;
+			
 		if (time >= self.teleport_time)
 			PM_Accelerate(wishdir, wishspeed, sv_accelerate*maxspd_mod, 1, 0);
 	}
@@ -1075,7 +1096,7 @@
 		// we get here if we ran out of ammo
 		if((self.items & IT_JETPACK) && self.BUTTON_HOOK && !(buttons_prev & 32))
 			sprint(self, "You don't have any fuel for the ^2Jetpack\n");
-
+	
 		if(maxspd_mod < 1)
 		{
 			maxairspd = sv_maxairspeed*maxspd_mod;
Index: server/Dresk_Definitions.qc
===================================================================
--- server/Dresk_Definitions.qc	(revision 0)
+++ server/Dresk_Definitions.qc	(revision 0)
@@ -0,0 +1,170 @@
+// Console Variables Support
+void CheckEmptyCustomCVar(string strCVar, string strDefaultValue)
+{ // Check Empty Custom CVar
+	local string strCVarValue;
+	local string strCommand;
+	
+	// Acquire CVar
+	strCVarValue = cvar_string(strCVar);
+	
+	if(strCVarValue == "")
+	{ // Blank CVar; Fill Value
+		// Generate String
+		// Assign Command for Dedicated Servers
+		strCommand = strcat("set ", strCVar, " ", strDefaultValue, "\n");
+		// Execute Command
+		localcmd(strCommand);
+		// Assign Command for Clients
+		strCommand = strcat("seta ", strCVar, " ", strDefaultValue, "\n");
+		// Execute Command
+		localcmd(strCommand);
+	}
+		
+}
+void PrepareCustomCVars()
+{ // Prepare Custom CVars
+	// Misc
+	CheckEmptyCustomCVar(CVAR_MISC_USESPIDFLISKSOUNDPACK, "0");
+	CheckEmptyCustomCVar(CVAR_MISC_LOWBANDWIDTHLEVEL, "1");
+	CheckEmptyCustomCVar(CVAR_MISC_PLAYERSONLYPLAYHITGROUNDSOUNDS, "1");
+	CheckEmptyCustomCVar(CVAR_MISC_REMOVEKILLCOUNTREPORTS, "1");
+	CheckEmptyCustomCVar(CVAR_MISC_DISPLAYGAMESETTINGSTIME, DISPLAYGAMESETTINGS_DEFAULT_TIMER);
+	CheckEmptyCustomCVar(CVAR_MISC_SPAWNADDITIONALAMBIENTSOUNDS, "0");
+	CheckEmptyCustomCVar(CVAR_MISC_CREATESPAWNPOINTMODELS, "2");
+	CheckEmptyCustomCVar(CVAR_MISC_SUPPRESSBPRINTSWHENNOPLAYERSORONLYBOTS, "1");
+	CheckEmptyCustomCVar(CVAR_MISC_WAYPOINTSPRITECOLOR, "1");
+	CheckEmptyCustomCVar(CVAR_MISC_WAYPOINTSPRITENODEPTHTEST, "1");
+	CheckEmptyCustomCVar(CVAR_MISC_WAYPOINTSPRITEFADE, "1");
+	
+	// World
+	CheckEmptyCustomCVar(CVAR_WORLD_ENTITYDETAILLEVEL_BOBBING, "2");
+	CheckEmptyCustomCVar(CVAR_WORLD_ENTITYDETAILLEVEL_ROTATING, "2");
+	
+	// Intermission
+	CheckEmptyCustomCVar(CVAR_INTERMISSION_DISABLEMUSIC, "1");
+	CheckEmptyCustomCVar(CVAR_INTERMISSION_FADETOBLACK, "1");
+	CheckEmptyCustomCVar(CVAR_INTERMISSION_DISPLAYWINNINGPLAYER, "1");
+	CheckEmptyCustomCVar(CVAR_INTERMISSION_USEADVANCEDCLIENTSCORES, "1");
+	CheckEmptyCustomCVar(CVAR_INTERMISSION_ADVANCEDCLIENTSCORES_NUMBEROFAWARDSTODISPLAY, "10");
+	CheckEmptyCustomCVar(CVAR_INTERMISSION_PLAYERSGLOW, "0.2");
+	CheckEmptyCustomCVar(CVAR_INTERMISSION_USEADVANCEDVICTORYMESSAGE, "1");
+	
+	// Bots
+	// SUPPRESSED DUE TO NEXUIZ 2.0 IMPLEMENTATION
+	// CheckEmptyCustomCVar(CVAR_BOT_FILLBOTSBASECOUNT, ftos(SPIDFLISKBOTS_DEFAULT_FILLBOTSBASECOUNT) );
+	// CheckEmptyCustomCVar(CVAR_BOT_BASECOUNTINCLUDESSPECTATORS, "0");
+	// CheckEmptyCustomCVar(CVAR_BOT_FILLBOTSSKILL, ftos(SPIDFLISKBOTS_DEFAULT_FILLBOTSSKILL) );
+	
+	CheckEmptyCustomCVar(CVAR_BOT_DISPLAYBOTSFILLTIME, SPIDFLISKBOTS_DEFAULT_DISPLAYBOTSFILL_TIMER);
+	
+	// Client
+	CheckEmptyCustomCVar(CVAR_CLIENT_HASSLEDEFAULTPLAYERNAME, "1");
+	CheckEmptyCustomCVar(CVAR_CLIENT_RANDOMIZEONDEFAULTPLAYERCHARACTER, "0");
+	CheckEmptyCustomCVar(CVAR_CLIENT_REPORTSPECTATETOTARGET, "2");
+	CheckEmptyCustomCVar(CVAR_CLIENT_DISABLEVERSIONNAGGING, "0");
+	// SUPPRESSED DUE TO NEXUIZ 2.3 IMPLEMENTATION
+	// CheckEmptyCustomCVar(CVAR_CLIENT_LIMITONEHITSOUNDPERFRAME, "1");	
+	
+	// Player
+	CheckEmptyCustomCVar(CVAR_PLAYER_SPAWNEFFECT, "1");
+	CheckEmptyCustomCVar(CVAR_PLAYER_BLEEDBELOWHEALTHLEVEL, "50");
+	CheckEmptyCustomCVar(CVAR_PLAYER_TAUNTANIMATIONDURINGCHAT, "1");
+	CheckEmptyCustomCVar(CVAR_PLAYER_FOOTSTEPFORJUMP, "1");
+	CheckEmptyCustomCVar(CVAR_PLAYER_CROUCHATTACKREDUCTIONPERCENTILE, CROUCH_DEFAULT_ATTACKREDUCTIONPERCENT);
+	CheckEmptyCustomCVar(CVAR_PLAYER_GLOBALCOLORMODDECREMENTAMOUNT, "0.3");
+	CheckEmptyCustomCVar(CVAR_PLAYER_LONGJUMPANIMATION_ENABLED, "1");
+	CheckEmptyCustomCVar(CVAR_PLAYER_LONGJUMPANIMATION_MINIMUMSPEED, "800");
+	CheckEmptyCustomCVar(CVAR_PLAYER_LONGJUMPANIMATION_GLOWTRAILSONFEET_ENABLED, "1");
+	CheckEmptyCustomCVar(CVAR_PLAYER_LONGJUMPANIMATION_GLOWTRAILSONFEET_MINIMUMHEIGHT, "216");
+	
+	// Handicap Support
+	CheckEmptyCustomCVar(CVAR_PLAYER_HANDICAP_ALLOW, "1");
+	CheckEmptyCustomCVar(CVAR_PLAYER_HANDICAP_CHANGETIME, HANDICAP_DEFAULT_CHANGETIME);
+	CheckEmptyCustomCVar(CVAR_PLAYER_HANDICAP_SHOWATTACKERVICTIMHANDICAP, "1");
+	CheckEmptyCustomCVar(CVAR_PLAYER_HANDICAP_MINIMUM, HANDICAP_DEFAULT_MINIMUM);
+	CheckEmptyCustomCVar(CVAR_PLAYER_HANDICAP_MAXIMUM, HANDICAP_DEFAULT_MAXIMUM);
+	CheckEmptyCustomCVar(CVAR_PLAYER_HANDICAP_DISPLAYHELPMESSAGETIME, HANDICAP_DEFAULT_DISPLAYHELPMESSAGE_TIMER);
+	
+	// PlayerDeath
+	CheckEmptyCustomCVar(CVAR_PLAYERDEATH_CORPSEGIBONLYONEXPLOSIVES, "1");
+	CheckEmptyCustomCVar(CVAR_PLAYERDEATH_SHOWATTACKERPING, "1");
+	CheckEmptyCustomCVar(CVAR_PLAYERDEATH_SHOWVICTIMPING, "1");
+	CheckEmptyCustomCVar(CVAR_PLAYERDEATH_SHOWATTACKERHEALTHARMOR, "1");
+	CheckEmptyCustomCVar(CVAR_PLAYERDEATH_BLOODYSKULLDEATH, "1");
+	CheckEmptyCustomCVar(CVAR_PLAYERDEATH_DROPPOWERUPS, "1");
+	CheckEmptyCustomCVar(CVAR_PLAYERDEATH_DROPPOWERUPS_POWERUPTIMEADDITION, "4");
+	CheckEmptyCustomCVar(CVAR_PLAYERDEATH_DROPARMOR, "1");
+	CheckEmptyCustomCVar(CVAR_PLAYERDEATH_DROPARMOR_ARMORADDITIONAMOUNT, "35");
+	
+	// Game
+	CheckEmptyCustomCVar(CVAR_GAME_CTF_NODEPTHTESTFLAGS, "1");
+	CheckEmptyCustomCVar(CVAR_GAME_CTF_GLOBALFLAGSOUNDS, "1");
+	CheckEmptyCustomCVar(CVAR_GAME_CTF_FLAGGLOWTRAILS, "1");
+	CheckEmptyCustomCVar(CVAR_GAME_CTF_DISABLECAPTURERECORDREPORTS, "1");
+	CheckEmptyCustomCVar(CVAR_GAME_CROUCHSPEEDMODIFIER, "0.65");
+	
+	// Weapons
+	// SUPPRESSED DUE TO NEXUIZ 2.3 IMPLEMENTATION
+	// CheckEmptyCustomCVar(CVAR_WEAPON_FIXBULLETIRICOCHETSOUNDS, "1");
+	CheckEmptyCustomCVar(CVAR_WEAPON_RAPIDWEAPONSWITCHES, "2");
+	CheckEmptyCustomCVar(CVAR_WEAPON_FIRINGSOUNDSUSEDYNAMICCHANNELS, "1");
+	CheckEmptyCustomCVar(CVAR_WEAPON_EXTERIORWEAPONINHERITSOWNERVERTICALANGLE, "1");
+	CheckEmptyCustomCVar(CVAR_WEAPON_EXTERIORWEAPONHASLASERSIGHT, "1");
+	// SUPPRESSED DUE TO NEXUIZ 2.3 IMPLEMENTATION
+	// CheckEmptyCustomCVar(CVAR_WEAPON_USEADVANCEDOWNERSHIPMESSAGES, "1");
+	// Grenade Launcher
+	CheckEmptyCustomCVar(CVAR_WEAPON_GRENADELAUNCHER_EXTENDEDEFFECTS, "1");
+	
+	// Hagar
+	CheckEmptyCustomCVar(CVAR_WEAPON_HAGAR_EXTENDEDEFFECTS, "1");
+	
+	// Laser
+	CheckEmptyCustomCVar(CVAR_WEAPON_LASER_ALLOWALTFIRE, "1");
+	CheckEmptyCustomCVar(CVAR_WEAPON_LASER_ALTFIRESPEEDDIVISOR, WEAPONBALANCE_DEFAULT_LASERALTFIRE_SPEEDDIVISOR);
+	CheckEmptyCustomCVar(CVAR_WEAPON_LASER_ALTFIRERADIUSMULTIPLIER, WEAPONBALANCE_DEFAULT_LASERALTFIRE_RADIUSMULTIPLIER);
+	CheckEmptyCustomCVar(CVAR_WEAPON_LASER_ALTFIREGLOWCOLOR, "245");
+	
+	// Electro
+	CheckEmptyCustomCVar(CVAR_WEAPON_ELECTRO_USEREDUCEDCOMBOEXPLOSION, "1");
+	// SUPPRESSED DUE TO UPDATED OFFICIAL NEXUIZ FEATURE
+	// CheckEmptyCustomCVar(CVAR_WEAPON_ELECTRO_USENEWALTFIRE, "1");
+	// Crylink
+	CheckEmptyCustomCVar(CVAR_WEAPON_CRYLINK_DETAILEDPROJECTILETIME, "0.1");
+	// Uzi
+	CheckEmptyCustomCVar(CVAR_WEAPON_UZI_ALTFIREPUSHAMOUNT, WEAPONBALANCE_DEFAULT_UZI_ALTFIREPUSHAMOUNT);
+	// Hagar
+	CheckEmptyCustomCVar(CVAR_WEAPON_HAGAR_USEMODIFIEDEXPLOSION, "1");
+	// Nex
+	CheckEmptyCustomCVar(CVAR_WEAPON_NEX_DETAILEDPROJECTILESPEED, "4000");
+	CheckEmptyCustomCVar(CVAR_WEAPON_NEX_PREVENTIMMEDIATEVELOCITYDAMAGETIME, "0.1");
+	// Rocket Launcher
+	CheckEmptyCustomCVar(CVAR_WEAPON_ROCKETLAUNCHER_TRIGGER_DAMAGEMULTIPLIER, "0.60");
+	CheckEmptyCustomCVar(CVAR_WEAPON_ROCKETLAUNCHER_TRIGGER_RADIUSMULTIPLIER, "0.85");
+	
+	// Platforms
+	CheckEmptyCustomCVar(CVAR_PLATFORM_LIGHTFLASH, "1");
+	
+	// Jumppads
+	CheckEmptyCustomCVar(CVAR_JUMPPAD_CONVERTFLYTOBOUNCE, "1");
+	CheckEmptyCustomCVar(CVAR_JUMPPAD_PLAYERLIGHTFLASH, "1");
+	CheckEmptyCustomCVar(CVAR_JUMPPAD_STUCKOBJECTTRIGGERCOUNT, "10");
+	
+	// Items
+	CheckEmptyCustomCVar(CVAR_ITEM_FADEUNAVAILABLEITEMS, "0.32");
+	CheckEmptyCustomCVar(CVAR_ITEM_ALWAYSPICKUPITEMS, "1");
+	CheckEmptyCustomCVar(CVAR_ITEM_RESPAWNEFFECTUSESSPARKS, "1");
+	CheckEmptyCustomCVar(CVAR_ITEM_POWERUPGLOBALPICKUPSOUNDS, "1");
+	CheckEmptyCustomCVar(CVAR_ITEM_POWERUPGLOBALRESPAWNSOUNDS, "1");
+	CheckEmptyCustomCVar(CVAR_ITEM_VERTICALTILTWEAPONS, ftos( rint(WEAPONS_DEFAULT_VERTICALTILT))  );
+	// SUPPRESSED DUE TO NEXUIZ 2.3 IMPLEMENTATION
+	// CheckEmptyCustomCVar(CVAR_ITEM_MEGAHEALTH_HEALTH, "150");
+	// CheckEmptyCustomCVar(CVAR_ITEM_ARMOR_LARGERESPAWNTIME, "20");
+	
+	
+	// Corpses
+	CheckEmptyCustomCVar(CVAR_CORPSE_CORPSEFADETIME, ftos(CORPSE_FADETIME_DEFAULT_TIME) );
+	CheckEmptyCustomCVar(CVAR_CORPSE_CORPSEBOUNCES, ftos(CORPSE_BOUNCING_DEFAULT_NUMBOUNCES) );
+	
+	// Gibs
+	CheckEmptyCustomCVar(CVAR_GIB_FADETIME, ftos(GIB_FADETIME_DEFAULT_TIME) );
+}
\ No newline at end of file
Index: server/Dresk_FunFunctions.qc
===================================================================
--- server/Dresk_FunFunctions.qc	(revision 0)
+++ server/Dresk_FunFunctions.qc	(revision 0)
@@ -0,0 +1,633 @@
+// Dresk - Cmds
+// Provides Support for Random Fun Functions
+
+// Definitions
+#define FUNFUNCTION_TOGGLEPLAYERBLOODSHOWERTHINK_CMD_NAME					"FunFunc_TogglePlayerBloodShowerThink"
+#define FUNFUNCTION_TOGGLEPLAYERFORM_CMD_NAME								"FunFunc_TogglePlayerForm"
+
+#define FUNFORM_UNKNOWN														-1
+#define FUNFORM_NONE														0
+#define FUNFORM_NONE_NAME													"none"
+#define FUNFORM_GHOST														2
+#define FUNFORM_GHOST_NAME													"ghost"
+#define FUNFORM_DEATHSPECTRE												3
+#define FUNFORM_DEATHSPECTRE_NAME											"deathspectre"
+#define FUNFORM_HEALTHANGEL													4
+#define FUNFORM_HEALTHANGEL_NAME											"healthangel"
+#define FUNFORM_HIGGLYTOWNHERO												5
+#define FUNFORM_HIGGLYTOWNHERO_NAME											"higglytownhero"
+
+#define FUNFORM_GHOST_FLAGS													FL_GODMODE | FL_NOTARGET
+
+#define FUNFORM_DEATHSPECTRE_FLAGS											FL_GODMODE | FL_NOTARGET
+#define FUNFORM_DEATHSPECTRE_EFFECTS										EF_FLAME | EF_STARDUST
+
+#define FUNFORM_HEALTHANGEL_FLAGS											FL_NOTARGET | FL_GODMODE
+#define FUNFORM_HEALTHANGEL_EFFECTS											EF_STARDUST | EF_BRIGHTFIELD | EF_DIMLIGHT
+
+#define FUNFORM_HIGGLYTOWNHERO_FLAGS										FL_NOTARGET | FL_PROJECTILE
+#define FUNFORM_HIGGLYTOWNHERO_EFFECTS										EF_STARDUST | EF_NODEPTHTEST | EF_ADDITIVE | EF_RED | EF_BLUE
+
+// Fields
+.float FunFunc_tPlayerBloodShowerNextThinkTime;
+.float FunFunc_bPlayerBloodShowerThinkEnabled;
+.float FunFunc_nPlayerForm;
+.void(entity) FunFunc_fpToggleForm;
+
+.string FunFunc_strPreviousModel;
+
+// Prototypes
+void FunFunction_ToggleForm_Ghost(entity enPlayer);
+void FunFunction_ToggleForm_DeathSpectre(entity enPlayer);
+void FunFunction_ToggleForm_HealthAngel(entity enPlayer);
+void FunFunction_ToggleForm_HigglytownHero(entity enPlayer);
+
+// Functions
+void ExteriorWeaponLaserDraw(entity enPlayer, float bDraw)
+{
+	if(enPlayer.exteriorweaponentity.enExteriorWeaponLaser)
+	{ // Laser Entity Exists
+		if(bDraw)
+			enPlayer.exteriorweaponentity.enExteriorWeaponLaser.effects = enPlayer.exteriorweaponentity.enExteriorWeaponLaser.effects - (enPlayer.exteriorweaponentity.enExteriorWeaponLaser.effects & EF_NODRAW);			
+		else
+			enPlayer.exteriorweaponentity.enExteriorWeaponLaser.effects = enPlayer.exteriorweaponentity.enExteriorWeaponLaser.effects | EF_NODRAW;
+	}
+}
+void FunFunction_SendFunFunctionAliases(entity enClient)
+{ // Send Fun Function Aliases
+	stuffcmd(enClient, "alias Fun_TogglePlayerBloodShower \"cmd FunFunc_TogglePlayerBloodShowerThink\"\n");
+	stuffcmd(enClient, "alias Fun_TogglePlayerForm \"cmd FunFunc_TogglePlayerForm $*\"\n");
+}
+string FunFunction_GetFormStringFromFormID(float nFormID)
+{ // Return Form String from Form ID
+	local string strReturn;
+	switch(nFormID)
+	{
+		case FUNFORM_NONE:
+			strReturn = "None";
+		break;
+		case FUNFORM_GHOST:
+			strReturn = "Ghost";
+		break;
+		case FUNFORM_DEATHSPECTRE:
+			strReturn = "DeathSpectre";
+		break;
+		case FUNFORM_HEALTHANGEL:
+			strReturn = "HealthAngel";
+		break;
+		case FUNFORM_HIGGLYTOWNHERO:
+			strReturn = "A Higglytown Hero";
+		break;
+		default:
+			strReturn = "Unknown";
+		break;
+	}
+	
+	return strReturn;
+}
+float FunFunction_GetFormIDFromFormString(string strForm)
+{ // Return FormID from String
+	local float nReturn;
+	switch(strForm)
+	{
+		case FUNFORM_NONE_NAME:
+			nReturn = FUNFORM_NONE;
+		break;
+		case FUNFORM_GHOST_NAME:
+			nReturn = FUNFORM_GHOST;
+		break;
+		case FUNFORM_DEATHSPECTRE_NAME:
+			nReturn = FUNFORM_DEATHSPECTRE;
+		break;
+		case FUNFORM_HEALTHANGEL_NAME:
+			nReturn = FUNFORM_HEALTHANGEL;
+		break;
+		case FUNFORM_HIGGLYTOWNHERO_NAME:
+			nReturn = FUNFORM_HIGGLYTOWNHERO;
+		break;
+		default:
+			nReturn = FUNFORM_UNKNOWN;
+		break;
+	}
+	
+	return nReturn;
+}
+void FunFunction_TogglePlayerForm(entity enPlayer, string strForm)
+{ // Toggle Player Form
+	local float bTogglingForm;
+	local void(entity) fpOldToggleForm;
+	local void(entity) fpToggleForm;
+		bTogglingForm = TRUE;
+	local string strMessage;
+	
+	if( GetClientIsAdministrator(enPlayer) )
+	{ // Admin; Allowed
+		// Check Currently Player and Alive
+		if(enPlayer.classname == "player" && enPlayer.deadflag == DEAD_NO)
+		{ // Valid Alive Player
+			
+			// Backup Old Toggle Form
+			fpOldToggleForm = enPlayer.FunFunc_fpToggleForm;
+				
+			switch(strForm)
+			{
+				case FUNFORM_NONE_NAME:
+					fpToggleForm = enPlayer.FunFunc_fpToggleForm;
+				break;
+				case FUNFORM_GHOST_NAME:
+					fpToggleForm = FunFunction_ToggleForm_Ghost;
+				break;
+				case FUNFORM_DEATHSPECTRE_NAME:
+					fpToggleForm = FunFunction_ToggleForm_DeathSpectre;
+				break;
+				case FUNFORM_HEALTHANGEL_NAME:
+					fpToggleForm = FunFunction_ToggleForm_HealthAngel;
+				break;
+				case FUNFORM_HIGGLYTOWNHERO_NAME:
+					fpToggleForm = FunFunction_ToggleForm_HigglytownHero;
+				break;
+				default:
+					bTogglingForm = FALSE;
+					// Report Message
+					if(strForm == "")
+					{ // No Form Provided; List Forms
+						strMessage = "^1AVAILABLE FORMS :^2";
+						strMessage = strcat(strMessage, " ", FUNFORM_NONE_NAME, " ", FUNFORM_GHOST_NAME, " ", FUNFORM_DEATHSPECTRE_NAME);
+						strMessage = strcat(strMessage, " ", FUNFORM_HEALTHANGEL_NAME, " ", FUNFORM_HIGGLYTOWNHERO_NAME);
+						strMessage = strcat(strMessage, "\n");
+					}
+					else
+						// Print Unknown Form
+						strMessage = strcat("^1UNKNOWN FORM : ^2", strForm, "\n");
+						
+					// Display Message
+					sprint(enPlayer, strMessage);
+				break;
+			}
+			
+			if(bTogglingForm)
+			{ // Toggling Form
+				if(enPlayer.FunFunc_nPlayerForm == FUNFORM_NONE)
+				{ // Shifting from None Form
+					// Assign Previous Player Model
+					enPlayer.FunFunc_strPreviousModel = enPlayer.model;
+					
+					// Report Form Removal
+					strMessage = strcat(enPlayer.netname, "^7 Switched from ^2", FunFunction_GetFormStringFromFormID(enPlayer.FunFunc_nPlayerForm), "^7 Form ");
+				}
+				if(enPlayer.FunFunc_nPlayerForm)
+				{ // Remove Current Form
+					// Report Form Removal
+					strMessage = strcat(enPlayer.netname, "^7 Switched from ^2", FunFunction_GetFormStringFromFormID(enPlayer.FunFunc_nPlayerForm), "^7 Form ");
+					// Remove Form
+					fpOldToggleForm(enPlayer);
+				}
+				if(fpToggleForm == enPlayer.FunFunc_fpToggleForm)
+				{ // Same Toggle Form
+					// Assign NULL Form
+					enPlayer.FunFunc_fpToggleForm = SUB_Null;
+					enPlayer.FunFunc_nPlayerForm = FUNFORM_NONE;
+				}
+				else
+				{ // New Form
+					// Invoke Toggle Form
+					fpToggleForm(enPlayer);
+					// Assign Form
+					enPlayer.FunFunc_fpToggleForm = fpToggleForm;
+				}
+				// Report Form Toggle
+				strMessage = strcat(strMessage, "to ^2", FunFunction_GetFormStringFromFormID(enPlayer.FunFunc_nPlayerForm), "^7 Form!\n");
+					bprint(strMessage);
+				// Play Sound
+				if(bUsingSpidfliskSoundPack)
+					sound(world, CHAN_AUTO, "Spidflisk/misc/FunForm_ChangeForm.ogg", 1, ATTN_NONE);
+				else
+					sound(world, CHAN_AUTO, "misc/menu2.wav", 1, ATTN_NONE);
+			}
+		}
+		else
+			sprint(enPlayer, "^1ERROR: ^7You must be ^2ALIVE^7 to change forms!\n");
+	}
+}
+// ---------------------------------------------------
+// TOGGLE FORM FUNCTIONS
+float FunFunction_Form_CheckSpecialAttackAvailable(float fAttackTime)
+{ // Check Special Attack Available
+	local float bReturn;
+		bReturn = TRUE;
+	if(self.tSpecialWeaponActionAttackTime < time)
+	{ // Attack Allowed
+		// Update Attack Time
+		self.tSpecialWeaponActionAttackTime = time + fAttackTime;
+	}
+	else
+		bReturn = FALSE;
+		
+	return bReturn;
+}
+void FunFunction_Form_Ghost_AttackFunction()
+{ // Attack Function
+	if(self.tSpecialWeaponActionAttackTime < time)
+	{ // Attack Allowed
+		// Update Attack Time
+		self.tSpecialWeaponActionAttackTime = time + 0.2;
+		
+		if(self.BUTTON_ATCK)
+			// Primary Attack
+			//te_smallflash(self.origin);
+			ExplosiveNexball(self);
+		if(self.BUTTON_JUMP)
+			// Jump
+			te_lavasplash(self.origin);
+		if(self.BUTTON_ATCK2)
+			// Secondary Attack
+			te_customflash(self.origin, 500, 50, '0.4 0 0');
+	}
+}
+
+void FunFunction_Form_DeathSpectre_AttackFunction()
+{ // Attack Function
+	if(self.tSpecialWeaponActionAttackTime < time)
+	{ // Attack Allowed
+		// Update Attack Time
+		self.tSpecialWeaponActionAttackTime = time + 0.2;
+		
+		if(self.BUTTON_ATCK)
+			// Primary Attack
+			PlayerBloodshowerDamage(self, 5000);
+		if(self.BUTTON_JUMP)
+		{ // Jump
+			// Light Flash!
+			te_customflash(self.origin, 2000, 300, '1 1 1');
+			sound(self, CHAN_AUTO, "weapons/neximpact.wav", 1, ATTN_NORM);
+		}
+		if(self.BUTTON_ATCK2)
+			// Secondary Attack
+			LaunchProjectileGib_ExplosiveFlamingSkull(self);
+	}
+}
+
+void LaunchHealthAngelHealthEntity(float nItemType)
+{ // Launch Health Angel Health Entity
+	local entity enOldSelf;
+		enOldSelf = self;
+	local entity enHealth;
+		enHealth = spawn();
+		self = enHealth;
+	local float fTime;
+	
+	precache_sound("misc/powerup_shield.wav");
+	precache_model("models/items/g_invincible.md3");
+	precache_sound("weapons/strength_fire.wav");
+	precache_model("models/items/g_strength.md3");
+	precache_sound("misc/powerup.wav");
+	precache_sound("misc/shield_respawn.wav");
+	precache_sound("misc/strength_respawn.wav");
+	
+	// self.owner = enOldSelf;
+	self.classname = "droppedweapon";
+	
+	setorigin(self, enOldSelf.origin + (w_shotdir * 50));
+		
+	// Invoke Item Function
+	if(nItemType == 1)
+	{
+		self.armorvalue = 100;
+		self.max_armorvalue = g_pickup_armorlarge_max;
+		StartItem ("models/items/g_a25.md3", "misc/armor25.wav", 0, 0, "100 Armor", IT_ARMOR, 0, FL_POWERUP, commodity_pickupevalfunc, 20000);
+		self.think = Item_Respawn;
+	}
+	else
+	if(nItemType == 2)
+	{
+		if(!self.max_health)
+			self.max_health = g_pickup_healthmega_max;
+		if(!self.health)
+			self.health = 100;
+		StartItem ("models/items/g_h100.md3", "misc/megahealth.wav", 0, 0, "100 Health", IT_HEALTH, 0, FL_POWERUP, commodity_pickupevalfunc, 20000);
+		self.think = Item_Respawn;
+	}
+	if(nItemType == 3)
+	{
+		fTime = cvar("g_balance_powerup_invincible_time");
+		self.invincible_finished = fTime;
+		self.effects = EF_ADDITIVE;
+		StartItem ("models/items/g_invincible.md3", "misc/powerup_shield.wav", 0, 0, "Invulnerability", IT_INVINCIBLE, 0, FL_POWERUP, generic_pickupevalfunc, 0);
+		self.think = Item_Respawn;
+	}
+	if(nItemType == 4)
+	{
+		fTime = cvar("g_balance_powerup_strength_time");
+		self.strength_finished = fTime;
+		self.effects = EF_ADDITIVE;
+		StartItem ("models/items/g_strength.md3", "misc/powerup.wav", 0, 0, "Strength Powerup", IT_STRENGTH, 0, FL_POWERUP, generic_pickupevalfunc, 100000);
+		self.think = Item_Respawn;
+	}
+	// Assign Different Values
+	self.colormod = '0 0 1';
+	self.glow_trail = 1;
+	self.glow_color = 500;
+	self.movetype = MOVETYPE_BOUNCE;
+	self.effects = self.effects | EF_STARDUST;
+	
+	// Restore Old Self
+	self = enOldSelf;
+	
+	// Prepare Velocity
+	W_SetupShot(self, FALSE, 0, "", 0);
+	enHealth.velocity = w_shotdir * 2000;
+}
+
+void FunFunction_Form_HealthAngel_AttackFunction()
+{ // Attack Function
+	if(self.tSpecialWeaponActionAttackTime < time)
+	{ // Attack Allowed
+		if(self.BUTTON_ATCK)
+			// Primary Attack
+			LaunchHealthAngelHealthEntity(1);
+		if(self.BUTTON_JUMP)
+			LaunchHealthAngelHealthEntity(3);
+		if(self.BUTTON_ATCK2)
+			// Secondary Attack
+			LaunchHealthAngelHealthEntity(2);
+		if(self.BUTTON_CROUCH)
+			// Secondary Attack
+			LaunchHealthAngelHealthEntity(4);
+			
+		// Update Attack Time
+		self.tSpecialWeaponActionAttackTime = time + 0.5;
+	}
+}
+void FunFunction_ToggleForm_Ghost(entity enPlayer)
+{ // Toggle Ghost Form
+	if(enPlayer.FunFunc_nPlayerForm == FUNFORM_GHOST)
+	{ // Remove Form
+		enPlayer.FunFunc_nPlayerForm = FUNFORM_NONE;
+		enPlayer.alpha = 1.0;
+		setmodel(enPlayer, enPlayer.FunFunc_strPreviousModel);
+		setsize(enPlayer, PL_MIN, PL_MAX);
+		enPlayer.movetype = MOVETYPE_WALK;
+		enPlayer.solid = SOLID_SLIDEBOX;
+		enPlayer.flags = enPlayer.flags - (enPlayer.flags & FUNFORM_GHOST_FLAGS);
+		enPlayer.bIgnoreDamage = FALSE;
+		enPlayer.takedamage = DAMAGE_AIM;
+		enPlayer.bDisableWeaponActions = FALSE;
+		enPlayer.fpWeaponActionFunction = SUB_Null;
+		
+		ExteriorWeaponLaserDraw(enPlayer, TRUE);
+	}
+	else
+	{ // Grant Form
+		enPlayer.FunFunc_nPlayerForm = FUNFORM_GHOST;
+		enPlayer.alpha = 0.001;
+		setmodel(enPlayer, "");
+		enPlayer.movetype = MOVETYPE_NOCLIP;
+		enPlayer.solid = SOLID_NOT;
+		enPlayer.flags = enPlayer.flags | FUNFORM_GHOST_FLAGS;
+
+		enPlayer.bIgnoreDamage = TRUE;
+		enPlayer.takedamage = DAMAGE_NO;
+		
+		enPlayer.bDisableWeaponActions = TRUE;
+		
+		enPlayer.fpWeaponActionFunction = FunFunction_Form_Ghost_AttackFunction;
+		
+		ExteriorWeaponLaserDraw(enPlayer, FALSE);
+	}
+}
+void FunFunction_DeathSpectre_Touch()
+{ // Death Spectre - Touch
+	if(other.classname == "player")
+	{ // Valid Touch Target
+		Damage(other, self, self, 500000, DEATH_DEATHSPECTRETOUCH, '0 0 0', '0 0 0');
+	}
+}
+
+void FunFunction_Form_HigglytownHero_AttackFunction()
+{ // Attack Function
+	/*
+	if(self.tSpecialWeaponActionAttackTime < time)
+	{ // Attack Allowed
+		// Update Attack Time
+		self.tSpecialWeaponActionAttackTime = time + 0.2;
+		
+		if(self.impulse == 1)
+			// Primary Attack
+			//te_smallflash(self.origin);
+			//bprint("hit the weapon 1.");
+		if(self.impulse == 2)
+			// Jump
+		    // bleh
+		if(self.BUTTON_ATCK2)
+			// Secondary Attack
+			//te_customflash(self.origin, 500, 50, '0.4 0 0');
+	}
+	*/
+}
+
+void FunFunction_ToggleForm_HigglytownHero(entity enPlayer)
+{
+	if(enPlayer.FunFunc_nPlayerForm == FUNFORM_HIGGLYTOWNHERO)
+	{
+		enPlayer.FunFunc_nPlayerForm = FUNFORM_NONE;
+		enPlayer.alpha = 1.0;
+		setmodel(enPlayer, enPlayer.FunFunc_strPreviousModel);
+		setsize(enPlayer, PL_MIN, PL_MAX);
+		enPlayer.movetype = MOVETYPE_WALK;
+		enPlayer.flags = enPlayer.flags - (enPlayer.flags & FUNFORM_HIGGLYTOWNHERO_FLAGS);
+		enPlayer.effects = enPlayer.effects - (enPlayer.effects & FUNFORM_HIGGLYTOWNHERO_EFFECTS);
+		enPlayer.touch = SUB_Null;
+		enPlayer.glow_trail = 0;
+		enPlayer.glow_color = 0;
+		
+
+		enPlayer.exteriorweaponentity.glow_trail = 0;
+		enPlayer.exteriorweaponentity.glow_color = 0;
+		
+		enPlayer.bIgnoreDamage = FALSE;
+		enPlayer.bDisableWeaponActions = FALSE;
+		
+		enPlayer.fpWeaponActionFunction = SUB_Null;
+		enPlayer.bCannotTouchItems = FALSE;
+		
+		ExteriorWeaponLaserDraw(enPlayer, TRUE);
+	}
+	else
+	{ // Grant Form
+		enPlayer.FunFunc_nPlayerForm = FUNFORM_HIGGLYTOWNHERO;
+		enPlayer.alpha = 0.001;
+		
+		setmodel(enPlayer, "");
+		setsize(enPlayer, PL_MIN, PL_MAX);
+		enPlayer.movetype = MOVETYPE_WALK;
+		enPlayer.flags = enPlayer.flags | FUNFORM_HIGGLYTOWNHERO_FLAGS;
+		enPlayer.effects = enPlayer.effects | FUNFORM_HIGGLYTOWNHERO_EFFECTS;
+		
+		enPlayer.glow_trail = 5;
+		enPlayer.glow_color = 20;
+		
+		enPlayer.exteriorweaponentity.glow_trail = 5;
+		enPlayer.exteriorweaponentity.glow_color = 20;
+		
+		enPlayer.bIgnoreDamage = TRUE;
+		enPlayer.bDisableWeaponActions = TRUE;
+		
+		enPlayer.fpWeaponActionFunction = FunFunction_Form_HigglytownHero_AttackFunction;
+		enPlayer.bCannotTouchItems = TRUE;
+		
+		ExteriorWeaponLaserDraw(enPlayer, FALSE);
+	}
+}
+
+void FunFunction_ToggleForm_DeathSpectre(entity enPlayer)
+{ // Toggle Death Spectre
+	if(enPlayer.FunFunc_nPlayerForm == FUNFORM_DEATHSPECTRE)
+	{ // Remove Form
+		enPlayer.FunFunc_nPlayerForm = FUNFORM_NONE;
+		enPlayer.alpha = 1.0;
+		setmodel(enPlayer, enPlayer.FunFunc_strPreviousModel);
+		setsize(enPlayer, PL_MIN, PL_MAX);
+		enPlayer.movetype = MOVETYPE_WALK;
+		enPlayer.flags = enPlayer.flags - (enPlayer.flags & FUNFORM_DEATHSPECTRE_FLAGS);
+		enPlayer.effects = enPlayer.effects - (enPlayer.effects & FUNFORM_DEATHSPECTRE_EFFECTS);
+		enPlayer.touch = SUB_Null;
+		enPlayer.glow_trail = 0;
+		enPlayer.glow_color = 0;
+		
+
+		enPlayer.exteriorweaponentity.glow_trail = 0;
+		enPlayer.exteriorweaponentity.glow_color = 0;
+		
+		enPlayer.bIgnoreDamage = FALSE;
+		enPlayer.bDisableWeaponActions = FALSE;
+		
+		enPlayer.fpWeaponActionFunction = SUB_Null;
+		enPlayer.bCannotTouchItems = FALSE;
+		
+		ExteriorWeaponLaserDraw(enPlayer, TRUE);
+	}
+	else
+	{ // Grant Form
+		enPlayer.FunFunc_nPlayerForm = FUNFORM_DEATHSPECTRE;
+		enPlayer.alpha = 0.001;
+		
+		setmodel(enPlayer, "");
+		setsize(enPlayer, PL_MIN, PL_MAX);
+		enPlayer.movetype = MOVETYPE_FLY;
+		enPlayer.flags = enPlayer.flags | FUNFORM_DEATHSPECTRE_FLAGS;
+		enPlayer.effects = enPlayer.effects | FUNFORM_DEATHSPECTRE_EFFECTS;
+		
+		enPlayer.touch = FunFunction_DeathSpectre_Touch;
+
+		enPlayer.glow_trail = 1;
+		enPlayer.glow_color = 75;
+		
+		enPlayer.exteriorweaponentity.glow_trail = 1;
+		enPlayer.exteriorweaponentity.glow_color = 75;
+		
+		enPlayer.bIgnoreDamage = TRUE;
+		enPlayer.bDisableWeaponActions = TRUE;
+		
+		enPlayer.fpWeaponActionFunction = FunFunction_Form_DeathSpectre_AttackFunction;
+		enPlayer.bCannotTouchItems = TRUE;
+		
+		ExteriorWeaponLaserDraw(enPlayer, FALSE);
+	}
+}
+
+void FunFunction_ToggleForm_HealthAngel(entity enPlayer)
+{ // Toggle Health Angel
+	if(enPlayer.FunFunc_nPlayerForm == FUNFORM_HEALTHANGEL)
+	{ // Remove Form
+		enPlayer.FunFunc_nPlayerForm = FUNFORM_NONE;
+		enPlayer.alpha = 1.0;
+		setmodel(enPlayer, enPlayer.FunFunc_strPreviousModel);
+		setsize(enPlayer, PL_MIN, PL_MAX);
+		enPlayer.movetype = MOVETYPE_WALK;
+		
+		enPlayer.flags = enPlayer.flags - (enPlayer.flags & FUNFORM_HEALTHANGEL_FLAGS);
+		enPlayer.effects = enPlayer.effects - (enPlayer.effects & FUNFORM_HEALTHANGEL_EFFECTS);
+		
+		enPlayer.glow_trail = 0;
+		enPlayer.glow_color = 0;
+		
+		enPlayer.exteriorweaponentity.glow_trail = 0;
+		enPlayer.exteriorweaponentity.glow_color = 0;
+		
+		enPlayer.bDisableWeaponActions = FALSE;
+		enPlayer.fpWeaponActionFunction = SUB_Null;
+		enPlayer.bCannotTouchItems = FALSE;
+		
+		ExteriorWeaponLaserDraw(enPlayer, TRUE);
+	}
+	else
+	{ // Grant Form
+		enPlayer.FunFunc_nPlayerForm = FUNFORM_HEALTHANGEL;
+		enPlayer.alpha = 0.001;
+		setmodel(enPlayer, "");
+		setsize(enPlayer, PL_MIN, PL_MAX);
+
+		enPlayer.movetype = MOVETYPE_FLY;
+		
+		enPlayer.flags = enPlayer.flags | FUNFORM_HEALTHANGEL_FLAGS;
+		enPlayer.effects = enPlayer.effects | FUNFORM_HEALTHANGEL_EFFECTS;
+		
+		enPlayer.glow_trail = 1;
+		enPlayer.glow_color = 500;
+		
+		enPlayer.exteriorweaponentity.glow_trail = 1;
+		enPlayer.exteriorweaponentity.glow_color = 500;
+		
+		enPlayer.bDisableWeaponActions = TRUE;
+		enPlayer.fpWeaponActionFunction = FunFunction_Form_HealthAngel_AttackFunction;
+		enPlayer.bCannotTouchItems = TRUE;
+		
+		ExteriorWeaponLaserDraw(enPlayer, FALSE);
+	}
+}
+
+void FunFunction_PlayerBloodShowerThink()
+{ // Player Blood Shower Think - For Fun!			
+	// Spawn Blood Shower
+	PlayerBloodshowerDamage(self, 5000);
+	
+	// Play Sound
+	// sound(self, CHAN_AUTO, "misc/gib.wav", 1, ATTN_NORM);
+	
+	// Assign Thinks
+	self.nextthink = time + self.FunFunc_tPlayerBloodShowerNextThinkTime;
+}
+void FunFunction_TogglePlayerBloodShowerThink()
+{ // Toggle Player Blood Shower Think
+	if( GetClientIsAdministrator(self) )
+	{ // Command Allowed
+		if(self.FunFunc_bPlayerBloodShowerThinkEnabled)
+		{ // Enabled; Disable
+			// Display Message
+			sprint(self, "Player BloodShower Think ^1DISABLED\n");
+			
+			// Remove Thinks
+			self.nextthink = 0;
+			self.think = SUB_Null;
+			
+			// Toggle Think Disabled
+			self.FunFunc_bPlayerBloodShowerThinkEnabled = FALSE;
+		}
+		else
+		{ // Enable
+			// Display message
+			sprint(self, "Player BloodShower Think ^1ENABLED\n");
+				
+			// Toggle Think Enabled
+			self.FunFunc_bPlayerBloodShowerThinkEnabled = TRUE;
+			
+			// Assign Default Next Think Time
+			if(self.FunFunc_tPlayerBloodShowerNextThinkTime == 0)
+				self.FunFunc_tPlayerBloodShowerNextThinkTime = 0.3;
+			
+			// Assign Thinks
+			self.nextthink = time + self.FunFunc_tPlayerBloodShowerNextThinkTime;
+			self.think = FunFunction_PlayerBloodShowerThink;
+		}
+	}
+}
\ No newline at end of file
Index: server/ctf.qc
===================================================================
--- server/ctf.qc	(revision 7768)
+++ server/ctf.qc	(working copy)
@@ -155,7 +155,6 @@
 		backtrace("PlaceFlag a non-flag");
 		return;
 	}
-
 	if(!self.t_width)
 		self.t_width = 0.1; // frame animation rate
 	if(!self.t_length)
@@ -206,7 +205,6 @@
 		backtrace("RegenFlag a non-flag");
 		return;
 	}
-
 	setattachment(e, world, "");
 	e.damageforcescale = 0;
 	e.movetype = MOVETYPE_NONE;
@@ -252,7 +250,6 @@
 		backtrace("DropFlag a non-flag");
 		return;
 	}
-
 	if(e.speedrunning)
 	{
 		ReturnFlag(e);
@@ -281,6 +278,13 @@
 	e.playerid = attacker.playerid;
 	e.ctf_droptime = time;
 	
+	// DRESK - 1/07/07
+	// Check for NoDepthTest Flag Removal
+	if(e.effects & EF_NODEPTHTEST)
+	{ // Flag Has NoDepth Test; Remove from Owner
+		p.effects = p.effects - (p.effects & EF_NODEPTHTEST);
+	}
+	
 	if(p.waypointsprite_attachedforcarrier)
 	{
 		WaypointSprite_Ping(p.waypointsprite_attachedforcarrier);
@@ -303,10 +307,17 @@
 
 	e.flags = FL_ITEM; // clear FL_ONGROUND and any other junk
 	e.solid = SOLID_TRIGGER;
-	e.movetype = MOVETYPE_TOSS;
+	//e.movetype = MOVETYPE_TOSS;
+	
+	// Lixivial. 02.22.09
+	// Allow the flag to bounce off jumppads.
+	e.movetype = MOVETYPE_BOUNCE;
+	e.iscreature = TRUE;	
 	// setsize(e, '-16 -16 0', '16 16 74');
 	setorigin(e, p.origin - '0 0 24' + '0 0 37');
 	e.cnt = FLAG_DROPPED;
+	//W_SetupShot(e, '15 3 -8', FALSE, 0, "");
+	
 	e.velocity = '0 0 300';
 	e.pain_finished = time + cvar("g_ctf_flag_returntime");//30;
 
@@ -314,6 +325,7 @@
 	tracebox(e.origin, e.mins, e.maxs, e.origin, TRUE, e);
 	if(trace_startsolid)
 		dprint("FLAG FALLTHROUGH will happen SOON\n");
+	
 };
 
 void AnimateFlag()
@@ -363,7 +375,6 @@
 
 			sound (self, CHAN_TRIGGER, self.noise3, VOL_BASE, ATTN_NONE);
 			self.owner.impulse = 141; // returning!
-
 			e = self;
 			self = self.owner;
 			ReturnFlag(e);
@@ -410,6 +421,7 @@
 
 void flag_cap_ring_spawn(vector org)
 {
+	// TODO: Allow a way of disabling this superfluous orgasm.
 	shockwave_spawn("models/ctf/shockwavetransring.md3", org - '0 0 15', -0.8, 0, 1);
 };
 
@@ -437,6 +449,7 @@
 		{
 			return;
 		}
+
 		if(cvar("g_ctf_captimerecord_always") || player_count - currentbots <= 1) // at most one human
 		{
 			t = time - other.flagcarried.flagpickuptime;
@@ -445,12 +458,15 @@
 			h0 = db_get(ServerProgsDB, strcat(GetMapname(), "/captimerecord/netname"));
 			h1 = other.netname;
 			if(h0 == h1)
-				h0 = "his";
+				h0 = GetPlayerModelSexVerbiage(other, "his");
 			else
 				h0 = strcat(h0, "^7's"); // h0: display text for previous netname
+				
 			if (flagcaptimerecord == 0)
 			{
-				bprint(other.netname, "^7 captured the ", other.flagcarried.netname, " in ", s, " seconds\n");
+				// DRESK - 5/06/06
+				// Simple Capture Reporting
+				bprint(other.netname, "^7 captured the ", other.flagcarried.netname, " in ^2", s, "^7 seconds\n");
 				flagcaptimerecord = t;
 				db_put(ServerProgsDB, strcat(GetMapname(), "/captimerecord/time"), ftos(t));
 				db_put(ServerProgsDB, strcat(GetMapname(), "/captimerecord/netname"), h1);
@@ -458,7 +474,7 @@
 			}
 			else if (t < flagcaptimerecord)
 			{
-				bprint(other.netname, "^7 captured the ", other.flagcarried.netname, " in ", s, ", breaking ", strcat(h0, " previous record of ", s0, " seconds\n"));
+				bprint(other.netname, "^7 captured the ", other.flagcarried.netname, " in ^2", s, "^7 seconds, breaking ", strcat(h0, " previous record of ^2", s0, "^7 seconds\n"));
 				flagcaptimerecord = t;
 				db_put(ServerProgsDB, strcat(GetMapname(), "/captimerecord/time"), ftos(t));
 				db_put(ServerProgsDB, strcat(GetMapname(), "/captimerecord/netname"), h1);
@@ -466,17 +482,26 @@
 			}
 			else
 			{
-				bprint(other.netname, "^7 captured the ", other.flagcarried.netname, " in ", s, ", failing to break ", strcat(h0, " record of ", s0, " seconds\n"));
+				bprint(other.netname, "^7 captured the ", other.flagcarried.netname, " in ^2", s, "^7 seconds, failing to break ", strcat(h0, " record of ^2", s0, "^7 seconds\n"));
 			}
 		}
-		else
-			bprint(other.netname, "^7 captured the ", other.flagcarried.netname, "\n");
 
+		// DRESK - 12/20/06
+		// Update Client Stats Score
+		UpdateClientStatsScore(other, CLIENTSCORE_NUMFLAGCAPTURES, 1);
+
+		// DRESK - 1/07/07
+		// Check for NoDepthTest Flag Removal
+		if(other.flagcarried.effects & EF_NODEPTHTEST)
+		{ // Flag Has NoDepth Test; Apply to Owner
+			other.effects = other.effects - (other.effects & EF_NODEPTHTEST);
+		}
+
 		PlayerTeamScore_Add(other, SP_CTF_CAPS, ST_CTF_CAPS, 1);
 		LogCTF("capture", other.flagcarried.team, other);
 		// give credit to the individual player
 		UpdateFrags(other, ctf_score_value("score_capture"));
-
+		
 		if (cvar("g_ctf_flag_capture_effects")) {
 			if (other.team == COLOR_TEAM1) { // red team scores effect
 				pointparticles(particleeffectnum("red_ground_quake"), self.origin, '0 0 0', 1);
@@ -488,7 +513,14 @@
 			}
 		}
 
-		sound (other, CHAN_AUTO, self.noise2, VOL_BASE, ATTN_NONE);
+		// DRESK - 5/06/06
+		// Invoke Capture Flag Sound (missing?)
+		// Global Flag Sound Support
+		if( cvar(CVAR_GAME_CTF_GLOBALFLAGSOUNDS) )
+			sound (world, CHAN_AUTO, self.noise2, VOL_BASE, ATTN_NONE);
+		else
+			sound (other, CHAN_AUTO, self.noise2, VOL_BASE, ATTN_NONE);
+
 		WaypointSprite_DetachCarrier(other);
 		if(self.speedrunning)
 			FakeTimeLimit(other, -1);
@@ -504,7 +536,7 @@
 	{
 		if (other.next_take_time > time)
 			return;
-			
+		
 		if (cvar("g_ctf_flag_pickup_effects")) // pickup effect
 			pointparticles(particleeffectnum("smoke_ring"), 0.5 * (self.absmin + self.absmax), '0 0 0', 1);
 			
@@ -525,12 +557,36 @@
 		self.dropperid = other.playerid;
 		PlayerScore_Add(other, SP_CTF_PICKUPS, 1);
 		LogCTF("steal", self.team, other);
-		sound (other, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NONE);
+		
+		// DRESK - 5/06/06
+		// Global Flag Sound Support
+		if( cvar(CVAR_GAME_CTF_GLOBALFLAGSOUNDS) )
+			sound (world, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NONE);
+		else
+			sound (other, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NONE);
+		
+		// DRESK - 1/07/07
+		// Check for NoDepthTest Flag Removal
+		if(self.effects & EF_NODEPTHTEST)
+		{ // Flag Has NoDepth Test; Apply to Owner
+			other.effects = other.effects | EF_NODEPTHTEST;
+		}
+		
+		// DRESK - 5/06/06
+		// Provide Name and Textual Modification
+		local string strFlagMessage;
+		strFlagMessage = strcat(other.netname, "^7 has ^5YOUR FLAG!\n^7Retrieve it!");
+		// Zone String
+		strFlagMessage = strzone(strFlagMessage);
 
 		FOR_EACH_PLAYER(player)
 			if(player.team == self.team)
-				centerprint(player, "The enemy got your flag! Retrieve it!");
+				SuccessiveCenterprint(player, strFlagMessage);
+				// centerprint(player, "The enemy got your flag! Retrieve it!");
 
+		// Unzone String
+		strunzone(strFlagMessage);
+
 		self.movetype = MOVETYPE_NONE;
 		setorigin(self, FLAG_CARRY_POS);
 		setattachment(self, other, "");
@@ -580,14 +636,19 @@
 			}
 			PlayerScore_Add(other, SP_CTF_RETURNS, 1);
 			LogCTF("return", self.team, other);
-			sound (other, CHAN_AUTO, self.noise1, VOL_BASE, ATTN_NONE);
+			// DRESK - 5/06/06
+			// Global Flag Sound Support
+			if( cvar(CVAR_GAME_CTF_GLOBALFLAGSOUNDS) )
+				sound (world, CHAN_AUTO, self.noise1, VOL_BASE, ATTN_NONE);
+			else
+				sound (other, CHAN_AUTO, self.noise1, VOL_BASE, ATTN_NONE);
 			ReturnFlag(self);
 		}
 		else if (!other.flagcarried && (other.playerid != self.dropperid || time > self.ctf_droptime + cvar("g_balance_ctf_delay_collect")))
 		{
 			if (cvar("g_ctf_flag_pickup_effects")) // field pickup effect
 				pointparticles(particleeffectnum("smoke_ring"), 0.5 * (self.absmin + self.absmax), '0 0 0', 1);
-			
+
 			// pick up
 			self.solid = SOLID_NOT;
 			setorigin(self, self.origin); // relink
@@ -608,12 +669,35 @@
 			UpdateFrags(other, f);
 			PlayerScore_Add(other, SP_CTF_PICKUPS, 1);
 			LogCTF("pickup", self.team, other);
-			sound (other, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NONE);
-
+			// DRESK - 1/07/07
+			// Check for NoDepthTest Flag Removal
+			if(self.effects & EF_NODEPTHTEST)
+			{ // Flag Has NoDepth Test; Apply to Owner
+				other.effects = other.effects | EF_NODEPTHTEST;
+			}
+			
+			// DRESK - 5/06/06
+			// Global Flag Sound Support
+			if( cvar(CVAR_GAME_CTF_GLOBALFLAGSOUNDS) )
+				sound (world, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NONE);
+			else
+				sound (other, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NONE);
+				
+			// DRESK - 5/06/06
+			// Provide Name and Textual Modification
+			// local string strFlagMessage;
+			strFlagMessage = strcat(other.netname, "^7 has ^5YOUR FLAG!\n^7Retrieve it!");
+				// Zone String
+				strFlagMessage = strzone(strFlagMessage);
+				
 			FOR_EACH_PLAYER(player)
 				if(player.team == self.team)
-					centerprint(player, "The enemy got your flag! Retrieve it!");
+					SuccessiveCenterprint(player, strFlagMessage);
+					// centerprint(player, "The enemy got your flag! Retrieve it!");
 
+			// Unzone String
+			strunzone(strFlagMessage);
+
 			self.movetype = MOVETYPE_NONE;	// flag must have MOVETYPE_NONE here, otherwise it will drop through the floor...
 			setorigin(self, FLAG_CARRY_POS);
 			setattachment(self, other, "");
@@ -686,7 +770,7 @@
 
 /*QUAKED spawnfunc_info_player_team4 (1 0 0) (-16 -16 -24) (16 16 24)
 CTF Starting point for a player in
-team four (Magenta).
+team four (Yellow).
 
 Keys:
 "angle"
@@ -699,7 +783,7 @@
 		remove(self);
 		return;
 	}
-	self.team = COLOR_TEAM4; // purple
+	self.team = COLOR_TEAM4; // yellow
 	spawnfunc_info_player_deathmatch();
 };
 
@@ -726,6 +810,11 @@
 		self.glow_size = 25;
 		self.glow_trail = 1;
 	}
+	
+	// DRESK
+	// Support NoDepth Test Flags
+	if( cvar(CVAR_GAME_CTF_NODEPTHTESTFLAGS) )
+		self.effects |= EF_NODEPTHTEST;
 };
 
 /*QUAKED spawnfunc_item_flag_team1 (0 0.5 0.8) (-48 -48 -37) (48 48 37)
@@ -752,7 +841,6 @@
  sound played when flag is lost in the field and respawns itself
  (default ctf/respawn.wav)
 */
-
 void spawnfunc_item_flag_team1()
 {
 	if (!g_ctf)
@@ -942,7 +1030,6 @@
 	self.reset = item_flag_reset;
 };
 
-
 /*QUAKED spawnfunc_ctf_team (0 .5 .8) (-16 -16 -24) (16 16 32)
 Team declaration for CTF gameplay, this allows you to decide what team
 names and control point models are used in your map.
Index: common/constants.qh
===================================================================
--- common/constants.qh	(revision 7768)
+++ common/constants.qh	(working copy)
@@ -407,6 +407,7 @@
 float PROJECTILE_CRYLINK_BOUNCING = 19;
 float PROJECTILE_FIREBALL = 20;
 float PROJECTILE_FIREMINE = 21;
+float PROJECTILE_LASER_SECONDARY = 22;
 
 float SPECIES_HUMAN        =  0;
 float SPECIES_ANIMAL       =  1;
Index: client/waypointsprites.qc
===================================================================
--- client/waypointsprites.qc	(revision 7768)
+++ client/waypointsprites.qc	(working copy)
@@ -128,7 +128,9 @@
 		case SPRITERULE_DEFAULT:
 			if(self.team)
 			{
-				if(self.team == t)
+				// Lixivial. 02.19.09
+				// Allow spectators/observers to have a team indicator. 
+				if(self.team == t || t == COLOR_SPECTATOR + 1)
 					spriteimage = self.netname;
 				else
 					spriteimage = "";
@@ -139,6 +141,8 @@
 		case SPRITERULE_TEAMPLAY:
 			if(t == COLOR_SPECTATOR + 1)
 				spriteimage = self.netname3;
+			if(t == COLOR_SPECTATOR)
+				spriteimage = self.netname2;
 			else if(self.team == t)
 				spriteimage = self.netname2;
 			else
@@ -151,10 +155,10 @@
 
 	if(spriteimage == "")
 		return;
-	
+
 	float dist;
 	dist = vlen(self.origin - view_origin);
-	
+
 	float a;
 	a = self.alpha;
 
@@ -165,7 +169,7 @@
 
 	if(a <= 0)
 		return;
-	
+
 	// draw the sprite image
 	vector o;
 	float rot;
@@ -184,7 +188,7 @@
 		d_y = -view_up * (self.origin - view_origin) * vid_conheight / (vid_height * vid_pixelheight);
 		d_z = 0;
 		*/
-		
+
 		d = o - '0.5 0 0' * vid_conwidth - '0 0.5 0' * vid_conheight;
 
 		if(cvar("v_flipped"))
Index: client/sbar.qc
===================================================================
--- client/sbar.qc	(revision 7768)
+++ client/sbar.qc	(working copy)
@@ -1919,6 +1919,7 @@
 
 void Sbar_ShowAcceleration(void)
 {
+
 	float acceleration, sz, scale, alpha, f;
 	vector pos, top, rgb;
 	top_x = vid_conwidth/2;
@@ -1955,7 +1956,7 @@
 	if (acceleration > 0)
 		drawpic(pos, "gfx/hud/accelerometer_gradient", acceleration * scale * '40 0 0' + sz * '0 1 0', rgb, alpha, DRAWFLAG_NORMAL);
 	else if (acceleration < 0)
-		drawpic(pos + acceleration * scale * '40 0 0', "gfx/hud/accelerometer_gradient", -acceleration * scale * '40 0 0' + sz * '0 1 0', rgb, alpha, DRAWFLAG_NORMAL);
+		drawpic(pos + acceleration * scale * '40 0 0', "gfx/hud/accelerometer_gradient", (-acceleration) * scale * '40 0 0' + sz * '0 1 0', rgb, alpha, DRAWFLAG_NORMAL);
 }
 
 void Sbar_DrawAccuracyStats_Description_Hitscan(vector position)
Index: client/damage.qc
===================================================================
--- client/damage.qc	(revision 7768)
+++ client/damage.qc	(working copy)
@@ -101,9 +101,9 @@
 		{
 			case WEP_LASER:
 				org2 = org + backoff * 6;
-				pointparticles(particleeffectnum("laser_impact"), org2, backoff * 1000, 1);
 				if(!issilent)
 					sound(self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
+				pointparticles(particleeffectnum("laser_impact"), org2, backoff * 1000, 1);
 				break;
 			case WEP_SHOTGUN:
 				org2 = org + backoff * 2;
@@ -131,32 +131,40 @@
 				break;
 			case WEP_GRENADE_LAUNCHER:
 				org2 = org + backoff * 12;
-				pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1);
+				// Lixivial. Add spidflisk effectinfo fallback.
+				if(particleeffectnum("SPIDFLISK_GRENADE_EXPLODE") > -1)
+					pointparticles(particleeffectnum("SPIDFLISK_GRENADE_EXPLODE"), org2, '0 0 0', 1);
+				else
+					pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1);
 				if(!issilent)
 					sound(self, CHAN_PROJECTILE, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
 				break;
 			case WEP_ELECTRO:
-				org2 = org + backoff * 6;
+				org2 = org + backoff * 8;
 				if(secondary)
 				{
-					pointparticles(particleeffectnum("electro_ballexplode"), org2, '0 0 0', 1);
 					if(!issilent)
 						sound(self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
+					
+					//TODO. Lixivial. Add a low effect explosion effectinfo and check for LOWBANDWIDTH.
+					pointparticles(particleeffectnum("electro_ballexplode"), org2, '0 0 0', 1);
 				}
 				else
 				{
 					if(bounce)
 					{
 						// this is sent as "primary bounce" to distinguish it from secondary bounced balls
-						pointparticles(particleeffectnum("electro_combo"), org2, '0 0 0', 1);
 						if(!issilent)
 							sound(self, CHAN_PROJECTILE, "weapons/electro_impact_combo.wav", VOL_BASE, ATTN_NORM);
+							
+						//TODO. Lixivial. Add a low effect explosion effectinfo and check for LOWBANDWIDTH.	
+						pointparticles(particleeffectnum("electro_combo"), org2, '0 0 0', 1);
 					}
 					else
 					{
-						pointparticles(particleeffectnum("electro_impact"), org2, '0 0 0', 1);
 						if(!issilent)
 							sound(self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
+						pointparticles(particleeffectnum("electro_impact"), org2, '0 0 0', 1);
 					}
 				}
 				break;
@@ -183,7 +191,11 @@
 				break;
 			case WEP_HAGAR:
 				org2 = org + backoff * 6;
-				pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
+				// Lixivial. Add spidflisk effectinfo fallback.
+				if(particleeffectnum("SPIDFLISK_HAGAR_EXPLODE") > -1)
+					pointparticles(particleeffectnum("SPIDFLISK_HAGAR_EXPLODE"), org2, '0 0 0', 1);
+				else
+					pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
 				if(!issilent)
 				{
 					if (r<0.15)
@@ -196,7 +208,11 @@
 				break;
 			case WEP_ROCKET_LAUNCHER:
 				org2 = org + backoff * 12;
-				pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
+				// Lixivial. Add spidflisk effectinfo fallback.
+				if(particleeffectnum("SPIDFLISK_ROCKET_EXPLODE") > -1)				
+					pointparticles(particleeffectnum("SPIDFLISK_ROCKET_EXPLODE"), org2, '0 0 0', 1);
+				else
+					pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
 				if(!issilent)
 					sound(self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
 				break;
Index: client/particles.qc
===================================================================
--- client/particles.qc	(revision 7768)
+++ client/particles.qc	(working copy)
@@ -327,11 +327,20 @@
 	shotorg_x = ReadCoord(); shotorg_y = ReadCoord(); shotorg_z = ReadCoord();
 	endpos_x = ReadCoord(); endpos_y = ReadCoord(); endpos_z = ReadCoord();
 	
-	pointparticles(particleeffectnum("nex_muzzleflash"), shotorg, normalize(endpos - shotorg) * 1000, 1);
+	// Lixivial. Add spidflisk effectinfo fallback.
+	if(particleeffectnum("SPIDFLISK_NEX_MUZZLEFLASH") > -1)
+		pointparticles(particleeffectnum("SPIDFLISK_NEX_MUZZLEFLASH"), shotorg, normalize(endpos - shotorg) * 1000, 1);
+	else
+		pointparticles(particleeffectnum("nex_muzzleflash"), shotorg, normalize(endpos - shotorg) * 1000, 1);
 	
 	//draw either the old v2.3 beam or the new beam
 	if (cvar("cl_particles_oldnexbeam") && (getstati(STAT_ALLOW_OLDNEXBEAM) || isdemo()))
 		trailparticles(world, particleeffectnum("TE_TEI_G3"), shotorg, endpos);
 	else
-		trailparticles(world, particleeffectnum("nex_beam"), shotorg, endpos);
+		// Lixivial. Add spidflisk effectinfo fallback.
+		if(particleeffectnum("SPIDFLISK_NEX_BEAM") > -1)
+			trailparticles(world, particleeffectnum("SPIDFLISK_NEX_BEAM"), shotorg, endpos);
+		else
+			trailparticles(world, particleeffectnum("nex_beam"), shotorg, endpos);
+		
 }
Index: client/projectile.qc
===================================================================
--- client/projectile.qc	(revision 7768)
+++ client/projectile.qc	(working copy)
@@ -39,6 +39,10 @@
 		}
 	}
 
+	// Lixivial. 02.14.09
+	// Adding graceful fallback if, for whatever reason, our effectinfo has been overriden
+	// Or is not valid. This is particularly important for something such as the hagar
+	// as its lack of effects are quite detrimental to its usability.
 	switch(self.cnt)
 	{
 		case PROJECTILE_ROCKET:
@@ -54,11 +58,27 @@
 			trailparticles(self, particleeffectnum("TR_NEXUIZPLASMA"), from, to);
 			break;
 		case PROJECTILE_GRENADE:
-			trailparticles(self, particleeffectnum("TR_KNIGHTSPIKE"), from, to);
+			if(particleeffectnum("SPIDFLISK_MORTAR_PRIMARY") > -1)
+				trailparticles(self, particleeffectnum("SPIDFLISK_MORTAR_PRIMARY"), from, to);
+			else
+				trailparticles(self, particleeffectnum("TR_KNIGHTSPIKE"), from, to);
+			//self.colormod = '1.00 1.00 1.00';
 			break;
 		case PROJECTILE_GRENADE_BOUNCING:
-			trailparticles(self, particleeffectnum("TR_KNIGHTSPIKE"), from, to);
+			if(particleeffectnum("SPIDFLISK_MORTAR_SECONDARY") > -1)
+				trailparticles(self, particleeffectnum("SPIDFLISK_MORTAR_SECONDARY"), from, to);
+			else
+				trailparticles(self, particleeffectnum("TR_KNIGHTSPIKE"), from, to);
+			if(!(self.move_flags & FL_ONGROUND))
+				self.angles += '100 150 100' * time;
 			break;
+		case PROJECTILE_LASER_SECONDARY:
+			if(particleeffectnum("SPIDFLISK_LASER_SECONDARY") > -1)
+				trailparticles(self, particleeffectnum("SPIDFLISK_LASER_SECONDARY"), from, to);
+			else
+				trailparticles(self, particleeffectnum("TR_NEXUIZPLASMA"), from, to);
+			self.colormod = '0.0 1.0 0.0';
+			break;	
 		case PROJECTILE_PORTO_RED:
 			trailparticles(self, particleeffectnum("TR_WIZSPIKE"), from, to);
 			break;
@@ -67,26 +87,33 @@
 			break;
 		case PROJECTILE_HOOKBOMB:
 			trailparticles(self, particleeffectnum("TR_KNIGHTSPIKE"), from, to);
+			//self.angles = '0 500 0' * time;
 			break;
 		case PROJECTILE_HAGAR:
-			trailparticles(self, particleeffectnum("TR_GRENADE"), from, to);
+			if(particleeffectnum("SPIDFLISK_HAGAR_PRIMARY") > -1)
+				trailparticles(self, particleeffectnum("SPIDFLISK_HAGAR_PRIMARY"), from, to);
+			else
+				trailparticles(self, particleeffectnum("TR_GRENADE"), from, to);
 			break;
 		case PROJECTILE_HAGAR_BOUNCING:
-			trailparticles(self, particleeffectnum("TR_GRENADE"), from, to);
+			if(particleeffectnum("SPIDFLISK_HAGAR_SECONDARY") > -1)
+				trailparticles(self, particleeffectnum("SPIDFLISK_HAGAR_SECONDARY"), from, to);
+			else
+				trailparticles(self, particleeffectnum("TR_GRENADE"), from, to);
 			break;
-		case PROJECTILE_BULLET:
-		case PROJECTILE_BULLET_GLOWING:
-			trailparticles(self, particleeffectnum("tr_bullet"), from, to);
-			break;
-		case PROJECTILE_FIREMINE:
-			trailparticles(self, particleeffectnum("firemine"), from, to);
-			break;
-		case PROJECTILE_FIREBALL:
-			trailparticles(self, particleeffectnum("fireball"), from, to);
-			break;
-		default:
-			break;
-	}
+			case PROJECTILE_BULLET:
+			case PROJECTILE_BULLET_GLOWING:
+				trailparticles(self, particleeffectnum("tr_bullet"), from, to);
+				break;
+			case PROJECTILE_FIREMINE:
+				trailparticles(self, particleeffectnum("firemine"), from, to);
+				break;
+			case PROJECTILE_FIREBALL:
+				trailparticles(self, particleeffectnum("fireball"), from, to);
+				break;
+			default:
+				break;
+		}
 }
 
 void Projectile_Draw()
@@ -265,6 +292,7 @@
 
 		if(time == self.spawntime || (self.count & 0x80) || (f & 0x20))
 			self.trail_oldorigin = self.origin;
+
 	}
 
 	if(f & 2)
@@ -287,6 +315,7 @@
 			case PROJECTILE_GRENADE: setmodel(self, "models/grenademodel.md3"); break;
 			case PROJECTILE_GRENADE_BOUNCING: setmodel(self, "models/grenademodel.md3"); break;
 			case PROJECTILE_LASER: setmodel(self, "models/laser.mdl"); break;
+			case PROJECTILE_LASER_SECONDARY: setmodel(self, "models/laser.mdl"); break;
 			case PROJECTILE_HLAC: setmodel(self, "models/hlac_bullet.md3"); break;
 			case PROJECTILE_PORTO_RED: setmodel(self, "models/grenademodel.md3"); self.scale = 4; break;
 			case PROJECTILE_PORTO_BLUE: setmodel(self, "models/grenademodel.md3"); self.scale = 4; break;
@@ -385,7 +414,7 @@
 
 	if(!(self.count & 0x80))
 		InterpolateOrigin_Note();
-	
+
 	self.draw = Projectile_Draw;
 	self.entremove = Ent_RemoveProjectile;
 }
