r3433 - trunk/data/qcsrc/server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Tue Feb 26 06:24:18 EST 2008


Author: lordhavoc
Date: 2008-02-26 06:24:13 -0500 (Tue, 26 Feb 2008)
New Revision: 3433

Modified:
   trunk/data/qcsrc/server/bots.qc
   trunk/data/qcsrc/server/ctf.qc
   trunk/data/qcsrc/server/defs.qh
   trunk/data/qcsrc/server/domination.qc
   trunk/data/qcsrc/server/havocbot.qc
   trunk/data/qcsrc/server/havocbot_roles.qc
   trunk/data/qcsrc/server/mode_onslaught.qc
   trunk/data/qcsrc/server/t_items.qc
   trunk/data/qcsrc/server/t_teleporters.qc
Log:
bots now play CTF properly
improved waypoint spawning code significantly
added waypoints to CTF flags, dom points, and onslaught points


Modified: trunk/data/qcsrc/server/bots.qc
===================================================================
--- trunk/data/qcsrc/server/bots.qc	2008-02-26 11:15:54 UTC (rev 3432)
+++ trunk/data/qcsrc/server/bots.qc	2008-02-26 11:24:13 UTC (rev 3433)
@@ -551,6 +551,12 @@
 		m2 = wp.maxs;
 		setmodel(wp, "models/runematch/rune.mdl"); wp.effects = EF_LOWPRECISION;
 		setsize(wp, m1, m2);
+		if (wp.wpflags & WAYPOINTFLAG_ITEM)
+			wp.colormod = '1 0 0';
+		else if (wp.wpflags & WAYPOINTFLAG_GENERATED)
+			wp.colormod = '1 1 0';
+		else
+			wp.colormod = '1 1 1';
 	}
 	else
 		wp.model = "";
@@ -572,75 +578,87 @@
 {
 	local entity w;
 	local vector org;
-	org = (m1 + m2) * 0.5;
-	m1 = m1 - org;
-	m2 = m2 - org;
 	w = find(world, classname, "waypoint");
 	while (w)
 	{
 		// if a matching waypoint already exists, don't add a duplicate
-		if (w.origin == org && w.mins == m1 && w.maxs == m2)
+		if (boxesoverlap(m1, m2, w.absmin, w.absmax))
 			return w;
 		w = find(w, classname, "waypoint");
 	}
 	w = spawn();
 	w.classname = "waypoint";
 	w.wpflags = f;
-	setorigin(w, org);
-	setsize(w, PL_MIN + m1, PL_MAX + m2);
+	setorigin(w, (m1 + m2) * 0.5);
+	setsize(w, m1 - w.origin, m2 - w.origin);
+	if (vlen(w.size) > 0)
+		w.wpisbox = TRUE;
 
 	if(!(f & WAYPOINTFLAG_GENERATED))
+	if(!w.wpisbox)
 	{
-		org = w.origin + '0 0 2';
-		tracebox(org, w.mins, w.maxs, w.origin, MOVE_WORLDONLY, w);
-		if(trace_startsolid)
+		traceline(w.origin + '0 0 1', w.origin + PL_MIN_z * '0 0 1' - '0 0 1', MOVE_NOMONSTERS, w);
+		if (trace_fraction < 1)
+			setorigin(w, trace_endpos - PL_MIN_z * '0 0 1');
+
+		// check if the start position is stuck
+		tracebox(w.origin, PL_MIN + '-1 -1 -1', PL_MAX + '1 1 1', w.origin, MOVE_NOMONSTERS, w);
+		if (trace_startsolid)
 		{
-			org = w.origin + '2 2 2';
-			tracebox(org, w.mins, w.maxs, w.origin, MOVE_WORLDONLY, w);
+			org = w.origin + '0 0 26';
+			tracebox(org, PL_MIN, PL_MAX, w.origin, MOVE_WORLDONLY, w);
 			if(trace_startsolid)
 			{
-				org = w.origin + '-2 -2 2';
-				tracebox(org, w.mins, w.maxs, w.origin, MOVE_WORLDONLY, w);
+				org = w.origin + '2 2 2';
+				tracebox(org, PL_MIN, PL_MAX, w.origin, MOVE_WORLDONLY, w);
 				if(trace_startsolid)
 				{
-					org = w.origin + '-2 2 2';
-					tracebox(org, w.mins, w.maxs, w.origin, MOVE_WORLDONLY, w);
+					org = w.origin + '-2 -2 2';
+					tracebox(org, PL_MIN, PL_MAX, w.origin, MOVE_WORLDONLY, w);
 					if(trace_startsolid)
 					{
-						org = w.origin + '2 -2 2';
-						tracebox(org, w.mins, w.maxs, w.origin, MOVE_WORLDONLY, w);
+						org = w.origin + '-2 2 2';
+						tracebox(org, PL_MIN, PL_MAX, w.origin, MOVE_WORLDONLY, w);
 						if(trace_startsolid)
 						{
-							// this WP is in solid, refuse it
-							dprint("Killed a waypoint that was stuck in solid at ", vtos(org), "\n");
-							remove(w);
-							return world;
+							org = w.origin + '2 -2 2';
+							tracebox(org, PL_MIN, PL_MAX, w.origin, MOVE_WORLDONLY, w);
+							if(trace_startsolid)
+							{
+								// this WP is in solid, refuse it
+								dprint("Killed a waypoint that was stuck in solid at ", vtos(org), "\n");
+								remove(w);
+								return world;
+							}
 						}
 					}
 				}
 			}
+			setorigin(w, org * 0.05 + trace_endpos * 0.95); // don't trust the trace fully
 		}
 
-		org = org * 0.05 + trace_endpos * 0.95; // don't trust the trace fully
-		tracebox(org, w.mins, w.maxs, org - '0 0 128', MOVE_WORLDONLY, w);
-
-		if(trace_fraction == 1 || trace_startsolid)
+		tracebox(w.origin, PL_MIN, PL_MAX, w.origin - '0 0 128', MOVE_WORLDONLY, w);
+		if(trace_startsolid)
 		{
-			// this WP is in air, refuse it
-			dprint("Killed a waypoint that was stuck in air/ceiling at ", vtos(w.origin), "\n");
+			dprint("Killed a waypoint that was stuck in solid ", vtos(w.origin), "\n");
 			remove(w);
 			return world;
 		}
-		trace_endpos_z += 0.1; // don't trust the trace fully
-
-//		dprint("Moved waypoint at ", vtos(w.origin), " by ", ftos(vlen(w.origin - trace_endpos)));
-//		dprint(" direction: ", vtos((trace_endpos - w.origin)), "\n");
-
-		setorigin(w, trace_endpos);
+		if (!trace_inwater)
+		{
+			if(trace_fraction == 1)
+			{
+				dprint("Killed a waypoint that was stuck in air at ", vtos(w.origin), "\n");
+				remove(w);
+				return world;
+			}
+			trace_endpos_z += 0.1; // don't trust the trace fully
+//			dprint("Moved waypoint at ", vtos(w.origin), " by ", ftos(vlen(w.origin - trace_endpos)));
+//			dprint(" direction: ", vtos((trace_endpos - w.origin)), "\n");
+			setorigin(w, trace_endpos);
+		}
 	}
 
-	setsize(w, m1, m2);
-
 	waypoint_clearlinks(w);
 	//waypoint_schedulerelink(w);
 	return w;
@@ -830,7 +848,7 @@
 	w = findchain(classname, "waypoint");
 	while (w)
 	{
-		if (vlen(w.size) > 1)
+		if (w.wpisbox)
 		{
 			if (boxesoverlap(org, org, w.absmin, w.absmax))
 			{
@@ -1205,7 +1223,9 @@
 };
 
 // updates the best goal according to a weighted calculation of travel cost and item value of a new proposed item
-void(entity e, float f) navigation_routerating =
+.void() havocbot_role;
+void() havocbot_role_ctf_offense;
+void(entity e, float f, float rangebias) navigation_routerating =
 {
 	if (!e)
 		return;
@@ -1224,7 +1244,9 @@
 	{
 		//te_wizspike(e.nearestwaypoint.wpnearestpoint);
 		//dprint(e.classname, " ", ftos(f), "*(500/(500+", ftos((e.nearestwaypoint.wpcost + vlen(e.origin - e.nearestwaypoint.wpnearestpoint))), " = ");
-		f = f * 500 / ((e.nearestwaypoint.wpcost + vlen(e.origin - e.nearestwaypoint.wpnearestpoint)) + 500);
+		f = f * rangebias / ((e.nearestwaypoint.wpcost + vlen(e.origin - e.nearestwaypoint.wpnearestpoint)) + rangebias);
+		if (self.havocbot_role == havocbot_role_ctf_offense)
+			dprint("-- considering ", e.classname, " (with rating ", ftos(f), ")\n");
 		//dprint(ftos(f));
 		if (navigation_bestrating < f)
 		{
@@ -1299,6 +1321,8 @@
 // ends a goal selection session (updates goal stack to the best goal)
 void() navigation_goalrating_end =
 {
+	if (self.havocbot_role == havocbot_role_ctf_offense)
+		dprint(navigation_bestgoal.classname, " (with rating ", ftos(navigation_bestrating), ")\n");
 	navigation_routetogoal(navigation_bestgoal);
 };
 

Modified: trunk/data/qcsrc/server/ctf.qc
===================================================================
--- trunk/data/qcsrc/server/ctf.qc	2008-02-26 11:15:54 UTC (rev 3432)
+++ trunk/data/qcsrc/server/ctf.qc	2008-02-26 11:24:13 UTC (rev 3433)
@@ -506,6 +506,8 @@
 	if(!self.noalign)
 		droptofloor();
 
+	waypoint_spawnforitem(self);
+
 	WaypointSprite_SpawnFixed("redbase", self.origin + '0 0 37', self, sprite);
 };
 
@@ -569,6 +571,8 @@
 	if(!self.noalign)
 		droptofloor();
 
+	waypoint_spawnforitem(self);
+
 	WaypointSprite_SpawnFixed("bluebase", self.origin + '0 0 37', self, sprite);
 };
 

Modified: trunk/data/qcsrc/server/defs.qh
===================================================================
--- trunk/data/qcsrc/server/defs.qh	2008-02-26 11:15:54 UTC (rev 3432)
+++ trunk/data/qcsrc/server/defs.qh	2008-02-26 11:24:13 UTC (rev 3433)
@@ -394,3 +394,5 @@
 // set when showing a kill countdown
 .entity killindicator;
 .float killindicator_teamchange;
+
+void Damage (entity targ, entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force);

Modified: trunk/data/qcsrc/server/domination.qc
===================================================================
--- trunk/data/qcsrc/server/domination.qc	2008-02-26 11:15:54 UTC (rev 3432)
+++ trunk/data/qcsrc/server/domination.qc	2008-02-26 11:24:13 UTC (rev 3433)
@@ -269,6 +269,8 @@
 	setsize(self, '-32 -32 -32', '32 32 32');
 	setorigin(self, self.origin + '0 0 20');
 	droptofloor();
+
+	waypoint_spawnforitem(self);
 };
 
 

Modified: trunk/data/qcsrc/server/havocbot.qc
===================================================================
--- trunk/data/qcsrc/server/havocbot.qc	2008-02-26 11:15:54 UTC (rev 3432)
+++ trunk/data/qcsrc/server/havocbot.qc	2008-02-26 11:24:13 UTC (rev 3433)
@@ -229,9 +229,9 @@
 			else
 				keyboard_y = 0;
 
-			if (keyboard_z >= trigger)
+			if (keyboard_z > trigger)
 				keyboard_z = 1;
-			else if (keyboard_z <= trigger1)
+			else if (keyboard_z < trigger1)
 				keyboard_z = -1;
 			else
 				keyboard_z = 0;

Modified: trunk/data/qcsrc/server/havocbot_roles.qc
===================================================================
--- trunk/data/qcsrc/server/havocbot_roles.qc	2008-02-26 11:15:54 UTC (rev 3432)
+++ trunk/data/qcsrc/server/havocbot_roles.qc	2008-02-26 11:24:13 UTC (rev 3433)
@@ -27,7 +27,7 @@
 			// get the value of the item
 			t = head.bot_pickupevalfunc(self, head);
 			if (t > 0)
-				navigation_routerating(head, t * ratingscale);
+				navigation_routerating(head, t * ratingscale, 2000);
 		}
 		head = head.chain;
 	}
@@ -42,11 +42,11 @@
 		if (vlen(head.origin - org) < sradius)
 		{
 			if(head.cnt > -1) // this is just being fought for
-				navigation_routerating(head, ratingscale);
+				navigation_routerating(head, ratingscale, 5000);
 			else if(head.goalentity.cnt == 0) // unclaimed point
-				navigation_routerating(head, ratingscale * 0.5);
+				navigation_routerating(head, ratingscale * 0.5, 5000);
 			else if(head.goalentity.team != self.team) // other team's point
-				navigation_routerating(head, ratingscale * 0.2);
+				navigation_routerating(head, ratingscale * 0.2, 5000);
 		}
 		head = head.chain;
 	}
@@ -63,7 +63,7 @@
 	while (head)
 	{
 		if (vlen(head.origin - org) < sradius && vlen(head.origin - org) > 100)
-			navigation_routerating(head, ratingscale);
+			navigation_routerating(head, ratingscale, 2000);
 		head = head.chain;
 	}
 };
@@ -89,7 +89,7 @@
 			if (t > 0)
 			{
 				//dprint("found: "); dprint(head.netname); dprint("\n");
-				navigation_routerating(head, t * ratingscale);
+				navigation_routerating(head, t * ratingscale, 500);
 			}
 		}
 	}
@@ -119,7 +119,7 @@
 			// get the value of the item
 			t = head.bot_pickupevalfunc(self, head) * 0.0001;
 			if (t > 0)
-				navigation_routerating(head, t * ratingscale);
+				navigation_routerating(head, t * ratingscale, 500);
 		}
 		head = head.chain;
 	}
@@ -137,7 +137,7 @@
 		head = head.enemy;
 	}
 	if (head)
-		navigation_routerating(head, ratingscale);
+		navigation_routerating(head, ratingscale, 10000);
 };
 
 void(float ratingscale) havocbot_goalrating_ctf_enemyflag =
@@ -151,7 +151,7 @@
 		head = head.enemy;
 	}
 	if (head)
-		navigation_routerating(head, ratingscale);
+		navigation_routerating(head, ratingscale, 10000);
 };
 
 void(float ratingscale) havocbot_goalrating_ctf_enemybase =
@@ -171,7 +171,7 @@
 	}
 	if (head)
 	if (head.cnt != FLAG_BASE)
-		navigation_routerating(head, ratingscale);
+		navigation_routerating(head, ratingscale, 10000);
 };
 
 void(float ratingscale) havocbot_goalrating_ctf_droppedflags =
@@ -181,7 +181,7 @@
 	while (head)
 	{
 		if (head.cnt != FLAG_BASE) // flag is carried or out in the field
-			navigation_routerating(head, ratingscale);
+			navigation_routerating(head, ratingscale, 10000);
 		head = head.enemy;
 	}
 };
@@ -206,6 +206,7 @@
 //role flag carrier:
 //pick up armor and health
 //go to our flag spot
+.float bot_cantfindflag;
 void() havocbot_role_ctf_carrier =
 {
 	if (self.flagcarried == world)
@@ -219,7 +220,14 @@
 	{
 		self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
 		navigation_goalrating_start();
-		havocbot_goalrating_ctf_ourflag(5000);
+		havocbot_goalrating_ctf_ourflag(50000);
+		if (navigation_bestgoal)
+			self.bot_cantfindflag = time + 10;
+		else if (time > self.bot_cantfindflag)
+		{
+			// can't navigate to our own flag :(
+			Damage(self, self, self, 100000, DEATH_KILL, self.origin, '0 0 0');
+		}
 		havocbot_goalrating_ctf_carrieritems(1000, self.origin, 1000);
 		navigation_goalrating_end();
 	}
@@ -240,6 +248,7 @@
 		dprint("changing role to carrier\n");
 		self.havocbot_role = havocbot_role_ctf_carrier;
 		self.havocbot_role_timeout = 0;
+		self.bot_cantfindflag = time + 10;
 		return;
 	}
 	// check our flag
@@ -260,7 +269,7 @@
 	}
 	if (!self.havocbot_role_timeout)
 		self.havocbot_role_timeout = time + random() * 30 + 60;
-	if (self.ammo_rockets < 15 || time > self.havocbot_role_timeout)
+	if (time > self.havocbot_role_timeout)
 	{
 		dprint("changing role to middle\n");
 		self.havocbot_role = havocbot_role_ctf_middle;
@@ -271,9 +280,9 @@
 	{
 		self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
 		navigation_goalrating_start();
-		havocbot_goalrating_ctf_ourstolenflag(5000);
-		havocbot_goalrating_ctf_enemyflag(3000);
-		havocbot_goalrating_ctf_enemybase(2000);
+		havocbot_goalrating_ctf_ourstolenflag(50000);
+		havocbot_goalrating_ctf_enemyflag(30000);
+		havocbot_goalrating_ctf_enemybase(20000);
 		havocbot_goalrating_items(10000, self.origin, 10000);
 		navigation_goalrating_end();
 	}
@@ -293,6 +302,7 @@
 		dprint("changing role to carrier\n");
 		self.havocbot_role = havocbot_role_ctf_carrier;
 		self.havocbot_role_timeout = 0;
+		self.bot_cantfindflag = time + 10;
 		return;
 	}
 	// check our flag
@@ -315,8 +325,8 @@
 	{
 		self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
 		navigation_goalrating_start();
-		havocbot_goalrating_ctf_ourstolenflag(5000);
-		havocbot_goalrating_ctf_droppedflags(5000);
+		havocbot_goalrating_ctf_ourstolenflag(50000);
+		havocbot_goalrating_ctf_droppedflags(50000);
 		havocbot_goalrating_items(10000, self.origin, 10000);
 		navigation_goalrating_end();
 	}
@@ -337,6 +347,7 @@
 		dprint("changing role to carrier\n");
 		self.havocbot_role = havocbot_role_ctf_carrier;
 		self.havocbot_role_timeout = 0;
+		self.bot_cantfindflag = time + 10;
 		return;
 	}
 	// check our flag
@@ -358,7 +369,6 @@
 	if (!self.havocbot_role_timeout)
 		self.havocbot_role_timeout = time + random() * 10 + 10;
 	if (time > self.havocbot_role_timeout)
-	if (self.ammo_rockets >= 25)
 	{
 		if (random() < 0.5)
 		{
@@ -378,8 +388,8 @@
 	{
 		self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
 		navigation_goalrating_start();
-		havocbot_goalrating_ctf_ourstolenflag(5000);
-		havocbot_goalrating_ctf_droppedflags(3000);
+		havocbot_goalrating_ctf_ourstolenflag(50000);
+		havocbot_goalrating_ctf_droppedflags(30000);
 		//havocbot_goalrating_enemyplayers(1000, self.origin, 1000);
 		havocbot_goalrating_items(10000, self.origin, 10000);
 		navigation_goalrating_end();
@@ -400,6 +410,7 @@
 		dprint("changing role to carrier\n");
 		self.havocbot_role = havocbot_role_ctf_carrier;
 		self.havocbot_role_timeout = 0;
+		self.bot_cantfindflag = time + 10;
 		return;
 	}
 	// check our flag
@@ -420,7 +431,7 @@
 	}
 	if (!self.havocbot_role_timeout)
 		self.havocbot_role_timeout = time + random() * 20 + 30;
-	if (self.ammo_rockets < 15 || time > self.havocbot_role_timeout)
+	if (time > self.havocbot_role_timeout)
 	{
 		dprint("changing role to middle\n");
 		self.havocbot_role = havocbot_role_ctf_middle;
@@ -431,8 +442,8 @@
 	{
 		self.bot_strategytime = time + cvar("bot_ai_strategyinterval");
 		navigation_goalrating_start();
-		havocbot_goalrating_ctf_ourstolenflag(20000);
-		havocbot_goalrating_ctf_droppedflags(500);
+		havocbot_goalrating_ctf_ourstolenflag(200000);
+		havocbot_goalrating_ctf_droppedflags(50000);
 		havocbot_goalrating_items(10000, f.origin, 10000);
 		navigation_goalrating_end();
 	}
@@ -548,11 +559,11 @@
 			if(!head.owner || head.team == self.team)
 				continue; // skip what I can't see
 		if(!head.owner)
-			navigation_routerating(head, ratingscale_dropped);
+			navigation_routerating(head, ratingscale_dropped, 10000);
 		else if(head.team == self.team)
-			navigation_routerating(head, ratingscale_team);
+			navigation_routerating(head, ratingscale_team, 10000);
 		else
-			navigation_routerating(head, ratingscale_enemy);
+			navigation_routerating(head, ratingscale_enemy, 10000);
 		head = head.enemy;
 	}
 };

Modified: trunk/data/qcsrc/server/mode_onslaught.qc
===================================================================
--- trunk/data/qcsrc/server/mode_onslaught.qc	2008-02-26 11:15:54 UTC (rev 3432)
+++ trunk/data/qcsrc/server/mode_onslaught.qc	2008-02-26 11:24:13 UTC (rev 3433)
@@ -757,6 +757,8 @@
 	e.colormap = self.colormap;
 	onslaught_updatelinks();
 
+	waypoint_spawnforitem(self);
+
 	WaypointSprite_SpawnFixed(string_null, e.origin + '0 0 1' * e.maxs_z, self, sprite);
 	self.sprite.waypointsprite_for_player = onslaught_controlpoint_waypointsprite_for_player;
 };

Modified: trunk/data/qcsrc/server/t_items.qc
===================================================================
--- trunk/data/qcsrc/server/t_items.qc	2008-02-26 11:15:54 UTC (rev 3432)
+++ trunk/data/qcsrc/server/t_items.qc	2008-02-26 11:24:13 UTC (rev 3433)
@@ -272,8 +272,49 @@
 {
 	startitem_failed = FALSE;
 
-	if (self.classname != "droppedweapon")
+	// is it a dropped weapon?
+	if (self.classname == "droppedweapon")
 	{
+		// it's a dropped weapon
+		self.movetype = MOVETYPE_TOSS;
+		self.solid = SOLID_TRIGGER;
+		// Savage: remove thrown items after a certain period of time ("garbage collection")
+		self.think = RemoveItem;
+		self.nextthink = time + 60;
+		// don't drop if in a NODROP zone (such as lava)
+		traceline(self.origin, self.origin, MOVE_NORMAL, self);
+		if (trace_dpstartcontents & DPCONTENTS_NODROP)
+		{
+			startitem_failed = TRUE;
+			remove(self);
+			return;
+		}
+	}
+	else
+	{
+		// it's a level item
+		if(self.spawnflags & 1)
+			self.noalign = 1;
+		if (self.noalign)
+			self.movetype = MOVETYPE_NONE;
+		else
+			self.movetype = MOVETYPE_TOSS;
+		self.solid = SOLID_TRIGGER;
+		// do item filtering according to game mode and other things
+		if (!self.noalign)
+		{
+			// first nudge it off the floor a little bit to avoid math errors
+			setorigin(self, self.origin + '0 0 1');
+			// set item size before we spawn a waypoint
+			if((itemflags & FL_POWERUP) || self.health || self.armorvalue)
+				setsize (self, '-16 -16 0', '16 16 48');
+			else
+				setsize (self, '-16 -16 0', '16 16 32');
+			// note droptofloor returns FALSE if stuck/or would fall too far
+			droptofloor();
+			waypoint_spawnforitem(self);
+		}
+
 		if(teams_matter)
 		{
 			if(self.notteam)
@@ -303,7 +344,7 @@
 			remove (self);
 			return;
 		}
-		
+
 		/*
 		 * can't do it that way, as it would break maps
 		 * TODO make a target_give like entity another way, that perhaps has
@@ -317,7 +358,7 @@
 			return;
 		}
 		*/
-		
+
 		if(cvar("spawn_debug") >= 2)
 		{
 			entity otheritem;
@@ -333,70 +374,41 @@
 			self.is_item = TRUE;
 		}
 
-		waypoint_spawnforitem(self);
-
 		itemsInMap |= itemid;
-	}
 
-	if (!(cvar("g_pickup_items") && !g_nixnex) && !g_minstagib &&
-			itemid != IT_STRENGTH && itemid != IT_INVINCIBLE && itemid != IT_HEALTH)
-	{
-		startitem_failed = TRUE;
-		remove (self);
-		return;
-	}
-
-	if (g_minstagib)
-	{
-		// don't remove dropped items and powerups
-		if (self.classname != "droppedweapon" &&
-		    self.classname != "minstagib")
+		if(g_lms || g_instagib || g_rocketarena)
 		{
 			startitem_failed = TRUE;
-			remove (self);
+			remove(self);
 			return;
 		}
-	}
-
-	if(g_lms && (self.classname != "droppedweapon"))
-	{
-		startitem_failed = TRUE;
-		remove(self);
-		return;
-	}
-
-	if(g_instagib || g_rocketarena)
-	{
-		startitem_failed = TRUE;
-		remove(self);
-		return;
-	}
-
-	if (self.classname == "droppedweapon")
-	{
-		// don't drop if in a NODROP zone (such as lava)
-		traceline(self.origin, self.origin, MOVE_NORMAL, self);
-		if (trace_dpstartcontents & DPCONTENTS_NODROP)
+		else if (g_minstagib)
 		{
+			// don't remove dropped items and powerups
+			if (self.classname != "minstagib")
+			{
+				startitem_failed = TRUE;
+				remove (self);
+				return;
+			}
+		}
+		else if ((!cvar("g_pickup_items") || g_nixnex) && itemid != IT_STRENGTH && itemid != IT_INVINCIBLE && itemid != IT_HEALTH)
+		{
 			startitem_failed = TRUE;
-			remove(self);
+			remove (self);
 			return;
 		}
-	}
 
-	if (self.classname != "droppedweapon")
-	{
 		precache_model (itemmodel);
 		precache_sound (pickupsound);
 		precache_sound ("misc/itemrespawn.wav");
-	}
 
-	if(itemid & (IT_STRENGTH | IT_INVINCIBLE | IT_HEALTH | IT_ARMOR | IT_KEY1 | IT_KEY2 |
-				IT_ROCKET_LAUNCHER | IT_HAGAR | IT_NEX | IT_CRYLINK | IT_ELECTRO |
-				IT_GRENADE_LAUNCHER | IT_UZI | IT_SHOTGUN | IT_LASER) && self.classname != "droppedweapon")
-	{
-		self.target = "###item###"; // for finding the nearest item using find()
+		if(itemid & (IT_STRENGTH | IT_INVINCIBLE | IT_HEALTH | IT_ARMOR | IT_KEY1 | IT_KEY2 |
+					IT_ROCKET_LAUNCHER | IT_HAGAR | IT_NEX | IT_CRYLINK | IT_ELECTRO |
+					IT_GRENADE_LAUNCHER | IT_UZI | IT_SHOTGUN | IT_LASER))
+			self.target = "###item###"; // for finding the nearest item using find()
 	}
+
 	self.bot_pickup = TRUE;
 	self.bot_pickupevalfunc = pickupevalfunc;
 	self.bot_pickupbasevalue = pickupbasevalue;
@@ -409,13 +421,6 @@
 	self.netname = itemname;
 	self.items = itemid;
 	self.flags = FL_ITEM | itemflags;
-	if(self.spawnflags & 1)
-		self.noalign = 1;
-	if (self.noalign)
-		self.movetype = MOVETYPE_NONE;
-	else
-		self.movetype = MOVETYPE_TOSS;
-	self.solid = SOLID_TRIGGER;
 	self.touch = Item_Touch;
 	setmodel (self, self.mdl); // precision set below
 	self.effects |= EF_LOWPRECISION;
@@ -429,20 +434,6 @@
 		self.colormap = 160 * 1024 + 160;
 	}
 
-	// Savage: remove thrown items after a certain period of time ("garbage collection")
-	if (self.classname == "droppedweapon")
-	{
-		self.think = RemoveItem;
-		self.nextthink = time + 60;
-	}
-	else if (!self.noalign)
-	{
-		// first nudge it off the floor a little bit to avoid math errors
-		setorigin(self, self.origin + '0 0 1');
-		// note droptofloor returns FALSE if stuck/or would fall too far
-		droptofloor();
-	}
-
 	if (cvar("g_fullbrightitems"))
 		self.effects = self.effects | EF_FULLBRIGHT;
 }
@@ -538,7 +529,7 @@
 
 	if(!self.ammo_nails)
 		self.ammo_nails = cvar("g_pickup_nails");
-	StartItem ("models/weapons/g_uzi.md3", "weapons/weaponpickup.wav", 15, W_Name(WEP_UZI), IT_UZI, FL_WEAPON, weapon_pickupevalfunc, 20000);
+	StartItem ("models/weapons/g_uzi.md3", "weapons/weaponpickup.wav", 15, W_Name(WEP_UZI), IT_UZI, FL_WEAPON, weapon_pickupevalfunc, 5000);
 	if (self.modelindex) // don't precache if self was removed
 		weapon_action(WEP_UZI, WR_PRECACHE);
 }
@@ -556,7 +547,7 @@
 
 	if(!self.ammo_shells)
 		self.ammo_shells = cvar("g_pickup_shells");
-	StartItem ("models/weapons/g_shotgun.md3", "weapons/weaponpickup.wav", 15, W_Name(WEP_SHOTGUN), IT_SHOTGUN, FL_WEAPON, weapon_pickupevalfunc, 10000);
+	StartItem ("models/weapons/g_shotgun.md3", "weapons/weaponpickup.wav", 15, W_Name(WEP_SHOTGUN), IT_SHOTGUN, FL_WEAPON, weapon_pickupevalfunc, 2500);
 	if (self.modelindex) // don't precache if self was removed
 		weapon_action(WEP_SHOTGUN, WR_PRECACHE);
 }
@@ -565,7 +556,7 @@
 {
 	if(!self.ammo_rockets)
 		self.ammo_rockets = cvar("g_pickup_rockets");
-	StartItem ("models/weapons/g_gl.md3", "weapons/weaponpickup.wav", 15, W_Name(WEP_GRENADE_LAUNCHER), IT_GRENADE_LAUNCHER, FL_WEAPON, weapon_pickupevalfunc, 20000);
+	StartItem ("models/weapons/g_gl.md3", "weapons/weaponpickup.wav", 15, W_Name(WEP_GRENADE_LAUNCHER), IT_GRENADE_LAUNCHER, FL_WEAPON, weapon_pickupevalfunc, 5000);
 	if (self.modelindex) // don't precache if self was removed
 		weapon_action(WEP_GRENADE_LAUNCHER, WR_PRECACHE);
 }
@@ -574,7 +565,7 @@
 {
 	if(!self.ammo_cells)
 		self.ammo_cells = cvar("g_pickup_cells");
-	StartItem ("models/weapons/g_electro.md3", "weapons/weaponpickup.wav", 15, W_Name(WEP_ELECTRO), IT_ELECTRO, FL_WEAPON, weapon_pickupevalfunc, 15000);
+	StartItem ("models/weapons/g_electro.md3", "weapons/weaponpickup.wav", 15, W_Name(WEP_ELECTRO), IT_ELECTRO, FL_WEAPON, weapon_pickupevalfunc, 5000);
 	if (self.modelindex) // don't precache if self was removed
 		weapon_action(WEP_ELECTRO, WR_PRECACHE);
 }
@@ -583,7 +574,7 @@
 {
 	if(!self.ammo_cells)
 		self.ammo_cells = cvar("g_pickup_cells");
-	StartItem ("models/weapons/g_crylink.md3", "weapons/weaponpickup.wav", 15, W_Name(WEP_CRYLINK), IT_CRYLINK, FL_WEAPON, weapon_pickupevalfunc, 10000);
+	StartItem ("models/weapons/g_crylink.md3", "weapons/weaponpickup.wav", 15, W_Name(WEP_CRYLINK), IT_CRYLINK, FL_WEAPON, weapon_pickupevalfunc, 2500);
 	if (self.modelindex) // don't precache if self was removed
 		weapon_action(WEP_CRYLINK, WR_PRECACHE);
 }
@@ -605,7 +596,7 @@
 		nextime = 15 * nextime;
 	else
 		nextime = 15;
-	StartItem ("models/weapons/g_nex.md3", "weapons/weaponpickup.wav", nextime, W_Name(WEP_NEX), IT_NEX, FL_WEAPON, weapon_pickupevalfunc, 30000);
+	StartItem ("models/weapons/g_nex.md3", "weapons/weaponpickup.wav", nextime, W_Name(WEP_NEX), IT_NEX, FL_WEAPON, weapon_pickupevalfunc, 10000);
 	if (self.modelindex) // don't precache if self was removed
 		weapon_action(WEP_NEX, WR_PRECACHE);
 }
@@ -614,7 +605,7 @@
 {
 	if(!self.ammo_rockets)
 		self.ammo_rockets = cvar("g_pickup_rockets");
-	StartItem ("models/weapons/g_hagar.md3", "weapons/weaponpickup.wav", 15, W_Name(WEP_HAGAR), IT_HAGAR, FL_WEAPON, weapon_pickupevalfunc, 10000);
+	StartItem ("models/weapons/g_hagar.md3", "weapons/weaponpickup.wav", 15, W_Name(WEP_HAGAR), IT_HAGAR, FL_WEAPON, weapon_pickupevalfunc, 5000);
 	if (self.modelindex) // don't precache if self was removed
 		weapon_action(WEP_HAGAR, WR_PRECACHE);
 }
@@ -630,7 +621,7 @@
 	}
 	if(!self.ammo_rockets)
 		self.ammo_rockets = g_pickup_rockets;
-	StartItem ("models/weapons/g_rl.md3", "weapons/weaponpickup.wav", 15, W_Name(WEP_ROCKET_LAUNCHER), IT_ROCKET_LAUNCHER, FL_WEAPON, weapon_pickupevalfunc, 30000);
+	StartItem ("models/weapons/g_rl.md3", "weapons/weaponpickup.wav", 15, W_Name(WEP_ROCKET_LAUNCHER), IT_ROCKET_LAUNCHER, FL_WEAPON, weapon_pickupevalfunc, 10000);
 	if (self.modelindex) // don't precache if self was removed
 		weapon_action(WEP_ROCKET_LAUNCHER, WR_PRECACHE);
 }
@@ -709,7 +700,7 @@
 		self.max_health = g_pickup_healthsmall_max;
 	if(!self.health)
 		self.health = g_pickup_healthsmall;
-	StartItem ("models/items/g_h1.md3", "misc/minihealth.wav", 15, "5 Health", IT_5HP, 0, commodity_pickupevalfunc, 1000);
+	StartItem ("models/items/g_h1.md3", "misc/minihealth.wav", 15, "5 Health", IT_5HP, 0, commodity_pickupevalfunc, 20000);
 }
 
 void item_health_medium (void) {
@@ -717,7 +708,7 @@
 		self.max_health = g_pickup_healthmedium_max;
 	if(!self.health)
 		self.health = g_pickup_healthmedium;
-	StartItem ("models/items/g_h25.md3", "misc/mediumhealth.wav", 15, "25 Health", IT_25HP, 0, commodity_pickupevalfunc, 5000);
+	StartItem ("models/items/g_h25.md3", "misc/mediumhealth.wav", 15, "25 Health", IT_25HP, 0, commodity_pickupevalfunc, 20000);
 }
 
 void item_health_large (void) {
@@ -725,7 +716,7 @@
 		self.max_health = g_pickup_healthlarge_max;
 	if(!self.health)
 		self.health = g_pickup_healthlarge;
-	StartItem ("models/items/g_h50.md3", "misc/mediumhealth.wav", 15, "50 Health", IT_25HP, 0, commodity_pickupevalfunc, 5000);
+	StartItem ("models/items/g_h50.md3", "misc/mediumhealth.wav", 15, "50 Health", IT_25HP, 0, commodity_pickupevalfunc, 20000);
 }
 
 void item_health_mega (void) {

Modified: trunk/data/qcsrc/server/t_teleporters.qc
===================================================================
--- trunk/data/qcsrc/server/t_teleporters.qc	2008-02-26 11:15:54 UTC (rev 3432)
+++ trunk/data/qcsrc/server/t_teleporters.qc	2008-02-26 11:24:13 UTC (rev 3433)
@@ -1,6 +1,3 @@
-void Damage (entity targ, entity inflictor, entity attacker, float
-damage, float deathtype, vector hitloc, vector force);
-
 void() tdeath_touch =
 {
 	if (other == self.owner)




More information about the nexuiz-commits mailing list