r4350 - trunk/data/qcsrc/server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Fri Sep 5 04:26:06 EDT 2008


Author: div0
Date: 2008-09-05 04:25:50 -0400 (Fri, 05 Sep 2008)
New Revision: 4350

Modified:
   trunk/data/qcsrc/server/cl_weapons.qc
   trunk/data/qcsrc/server/race.qc
   trunk/data/qcsrc/server/t_items.qc
   trunk/data/qcsrc/server/w_porto.qc
Log:
more behaviour fixes for race+portals


Modified: trunk/data/qcsrc/server/cl_weapons.qc
===================================================================
--- trunk/data/qcsrc/server/cl_weapons.qc	2008-09-05 07:58:20 UTC (rev 4349)
+++ trunk/data/qcsrc/server/cl_weapons.qc	2008-09-05 08:25:50 UTC (rev 4350)
@@ -179,7 +179,7 @@
 	setorigin(wep, org);
 	wep.classname = "droppedweapon";
 	wep.velocity = velo;
-	wep.owner = own;
+	wep.owner = wep.enemy = own;
 	wep.classname = "droppedweapon";
 	wep.flags = wep.flags | FL_TOSSED;
 	wep.colormap = own.colormap;

Modified: trunk/data/qcsrc/server/race.qc
===================================================================
--- trunk/data/qcsrc/server/race.qc	2008-09-05 07:58:20 UTC (rev 4349)
+++ trunk/data/qcsrc/server/race.qc	2008-09-05 08:25:50 UTC (rev 4350)
@@ -301,6 +301,9 @@
 
 void checkpoint_touch()
 {
+	string oldmsg;
+	entity oldself;
+
 	EXACTTRIGGER_TOUCH;
 
 	if(other.classname == "porto")
@@ -308,10 +311,22 @@
 		// do not allow portalling through checkpoints
 		trace_plane_normal = normalize(-1 * other.velocity);
 		self = other;
-		W_Porto_Fail();
+		W_Porto_Fail(0);
 		return;
 	}
 
+	/*
+	 * Trigger targets
+	 */
+	if not(self.spawnflags & 2)
+	{
+		activator = other;
+		oldmsg = self.message;
+		self.message = "";
+		SUB_UseTargets();
+		self.message = oldmsg;
+	}
+
 	if(other.classname != "player")
 		return;
 
@@ -319,14 +334,12 @@
 	 * Remove unauthorized equipment
 	 */
 	Portal_ClearAll(other);
-
-	/*
-	 * Trigger targets
-	 */
-	if(self.spawnflags & 2)
+	if(other.porto_current)
 	{
-		activator = other;
-		SUB_UseTargets();
+		oldself = self;
+		self = other.porto_current;
+		W_Porto_Fail(1);
+		self = other;
 	}
 
 	if(other.race_checkpoint == -1 || other.race_checkpoint == self.race_checkpoint)
@@ -334,10 +347,13 @@
 		/*
 		 * Trigger targets
 		 */
-		if not(self.spawnflags & 2)
+		if(self.spawnflags & 2)
 		{
 			activator = other;
+			oldmsg = self.message;
+			self.message = "";
 			SUB_UseTargets();
+			self.message = oldmsg;
 		}
 
 		other.race_checkpoint = race_NextCheckpoint(self.race_checkpoint);

Modified: trunk/data/qcsrc/server/t_items.qc
===================================================================
--- trunk/data/qcsrc/server/t_items.qc	2008-09-05 07:58:20 UTC (rev 4349)
+++ trunk/data/qcsrc/server/t_items.qc	2008-09-05 08:25:50 UTC (rev 4350)
@@ -123,6 +123,9 @@
 		if (player.switchweapon == w_getbestweapon(player))
 			_switchweapon = TRUE;
 
+		if not(player.weapons & W_WeaponBit(player.switchweapon))
+			_switchweapon = TRUE;
+
 		if (item.ammo_shells)
 		if (player.ammo_shells < g_pickup_shells_max)
 		{
@@ -912,6 +915,7 @@
 	return a - (a & b);
 }
 
+float trigger_item_changed;
 void trigger_item_change(float binary, .float field, float(float a, float b) func, string sound_increase, string sound_decrease)
 {
 	float n, d;
@@ -934,11 +938,13 @@
 	{
 		if(sound_decrease != "")
 			sound (activator, CHAN_AUTO, sound_decrease, VOL_BASE, ATTN_NORM);
+		trigger_item_changed = 1;
 	}
 	else if(d > 0)
 	{
 		if(sound_increase != "")
 			sound (activator, CHAN_AUTO, sound_increase, VOL_BASE, ATTN_NORM);
+		trigger_item_changed = 1;
 	}
 	activator.field = n;
 }
@@ -952,6 +958,11 @@
 		return;
 	EXACTTRIGGER_TOUCH;
 
+	entity e;
+	for(e = world; (e = find(e, classname, "droppedweapon")); )
+		if(e.enemy == activator)
+			remove(e);
+
 	float _switchweapon;
 	_switchweapon = FALSE;
 	if (activator.autoswitch)
@@ -960,6 +971,7 @@
 
 	a0 = activator.armorvalue;
 	h0 = activator.health;
+	trigger_item_changed = 0;
 
 	if(self.spawnflags == 0) // SET
 	{
@@ -1027,6 +1039,9 @@
 		_switchweapon = TRUE;
 	if(_switchweapon)
 		W_SwitchWeapon_Force(activator, w_getbestweapon(activator));
+
+	if(trigger_item_changed)
+		centerprint(activator, self.message);
 }
 
 void spawnfunc_trigger_items (void)
@@ -1040,7 +1055,7 @@
 	if(!self.invincible_finished)
 		self.invincible_finished = cvar("g_balance_powerup_invincible_time");
 	
-	n = tokenize(self.message);
+	n = tokenize(self.netname);
 	for(i = 0; i < n; ++i)
 	{
 		if(argv(i) == "unlimited_ammo") self.items |= IT_UNLIMITED_AMMO;

Modified: trunk/data/qcsrc/server/w_porto.qc
===================================================================
--- trunk/data/qcsrc/server/w_porto.qc	2008-09-05 07:58:20 UTC (rev 4349)
+++ trunk/data/qcsrc/server/w_porto.qc	2008-09-05 08:25:50 UTC (rev 4350)
@@ -1,40 +1,41 @@
 .float portal_id;
+.entity porto_current;
 .vector porto_v_angle; // holds "held" view angles
 .float porto_v_angle_held;
 .vector right_vector;
 
 void W_Porto_Success (void)
 {
-	self.owner.portal_id = 0;
+	self.owner.porto_current = world;
 	remove(self);
 }
 
 float W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vector velo);
-void W_Porto_Fail (void)
+void W_Porto_Fail (float failhard)
 {
-	centerprint(self.owner, "^1Portal deployment failed.\n\n^2Catch it to try again!");
-
 	// no portals here!
 	Portal_ClearWithID(self.owner, self.portal_id);
+	self.owner.porto_current = world;
 
-	self.owner.portal_id = 0;
-	// TODO maybe instead throw the portal gun there?
-	// self.owner.weapons = self.owner.weapons | WEPBIT_PORTO;
-	setsize (self, '-16 -16 0', '16 16 32');
-	setorigin(self, self.origin + trace_plane_normal);
-	if(move_out_of_solid(self))
+	if(!failhard)
 	{
-		self.flags = FL_ITEM;
-		self.velocity = trigger_push_calculatevelocity(self.origin, self.owner, 128);
-		tracetoss(self, self);
-		if(vlen(trace_endpos - self.owner.origin) > 128)
-			self.velocity = '0 0 0';
-		W_ThrowNewWeapon(self.owner, WEP_PORTO, 0, self.origin, self.velocity);
+		centerprint(self.owner, "^1Portal deployment failed.\n\n^2Catch it to try again!");
+		setsize (self, '-16 -16 0', '16 16 32');
+		setorigin(self, self.origin + trace_plane_normal);
+		if(move_out_of_solid(self))
+		{
+			self.flags = FL_ITEM;
+			self.velocity = trigger_push_calculatevelocity(self.origin, self.owner, 128);
+			tracetoss(self, self);
+			if(vlen(trace_endpos - self.owner.origin) > 128)
+				self.velocity = '0 0 0';
+			W_ThrowNewWeapon(self.owner, WEP_PORTO, 0, self.origin, self.velocity);
+		}
+		else
+		{
+			W_ThrowNewWeapon(self.owner, WEP_PORTO, 0, self.origin, '0 0 0');
+		}
 	}
-	else
-	{
-		W_ThrowNewWeapon(self.owner, WEP_PORTO, 0, self.origin, '0 0 0');
-	}
 	remove(self);
 }
 
@@ -44,13 +45,15 @@
 	if(self.owner.playerid != self.playerid)
 		remove(self);
 	else
-		W_Porto_Fail();
+		W_Porto_Fail(0);
 }
 
 void W_Porto_Touch (void)
 {
 	vector norm;
 	norm = trace_plane_normal;
+	print(ftos(trace_dphitq3surfaceflags), "\n");
+	print((trace_dphittexturename), "\n");
 	if(self.owner.playerid != self.playerid)
 	{
 		remove(self);
@@ -59,10 +62,11 @@
 	{
 		// just reflect
 		self.right_vector = self.right_vector - 2 * trace_plane_normal * (self.right_vector * trace_plane_normal);
+		self.angles = vectoangles(self.velocity);
 	}
 	else if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
 	{
-		W_Porto_Fail();
+		W_Porto_Fail(0);
 	}
 	else if(self.cnt == 0)
 	{
@@ -76,7 +80,7 @@
 		else
 		{
 			trace_plane_normal = norm;
-			W_Porto_Fail();
+			W_Porto_Fail(0);
 		}
 	}
 	else
@@ -88,7 +92,7 @@
 		else
 		{
 			trace_plane_normal = norm;
-			W_Porto_Fail();
+			W_Porto_Fail(0);
 		}
 	}
 
@@ -126,7 +130,8 @@
 	gren.angles = vectoangles (gren.velocity);
 	gren.flags = FL_PROJECTILE;
 
-	self.portal_id = gren.portal_id = time;
+	gren.portal_id = time;
+	self.porto_current = gren;
 	gren.playerid = self.playerid;
 	fixedmakevectors(vectoangles(gren.velocity));
 	gren.right_vector = v_right;
@@ -195,7 +200,7 @@
 			makevectors(self.porto_v_angle); // override the previously set angles
 
 		if (self.BUTTON_ATCK)
-		if (!self.portal_id)
+		if (!self.porto_current)
 		if (weapon_prepareattack(0, cvar("g_balance_porto_primary_refire")))
 		{
 			W_Porto_Attack();




More information about the nexuiz-commits mailing list