r4435 - trunk/data/qcsrc/server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Tue Sep 9 09:33:55 EDT 2008


Author: div0
Date: 2008-09-09 09:33:55 -0400 (Tue, 09 Sep 2008)
New Revision: 4435

Modified:
   trunk/data/qcsrc/server/portals.qc
   trunk/data/qcsrc/server/w_porto.qc
Log:
prevent an exploit to create portals on noimpact


Modified: trunk/data/qcsrc/server/portals.qc
===================================================================
--- trunk/data/qcsrc/server/portals.qc	2008-09-09 12:07:15 UTC (rev 4434)
+++ trunk/data/qcsrc/server/portals.qc	2008-09-09 13:33:55 UTC (rev 4435)
@@ -602,13 +602,6 @@
 	vector ang;
 	vector org;
 
-	if(trace_ent.movetype == MOVETYPE_WALK)
-	{
-		trace_endpos = trace_ent.origin + '0 0 1' * PL_MIN_z;
-		trace_plane_normal = '0 0 1';
-		dir = -1 * dir; // create telefrag portals the other way round
-	}
-
 	org = trace_endpos;
 	ang = fixedvectoangles2(trace_plane_normal, dir);
 	fixedmakevectors(ang);
@@ -633,13 +626,6 @@
 	vector ang;
 	vector org;
 
-	if(trace_ent.movetype == MOVETYPE_WALK)
-	{
-		trace_endpos = trace_ent.origin + '0 0 1' * PL_MIN_z;
-		trace_plane_normal = '0 0 1';
-		dir = -1 * dir; // create telefrag portals the other way round
-	}
-
 	org = trace_endpos;
 	ang = fixedvectoangles2(trace_plane_normal, dir);
 	fixedmakevectors(ang);

Modified: trunk/data/qcsrc/server/w_porto.qc
===================================================================
--- trunk/data/qcsrc/server/w_porto.qc	2008-09-09 12:07:15 UTC (rev 4434)
+++ trunk/data/qcsrc/server/w_porto.qc	2008-09-09 13:33:55 UTC (rev 4435)
@@ -60,10 +60,20 @@
 void W_Porto_Touch (void)
 {
 	vector norm;
+	float noreflect;
 
 	if(other.classname == "portal")
 		return; // handled by the portal
 
+	noreflect = 0;
+	if(trace_ent.movetype == MOVETYPE_WALK)
+	{
+		traceline(trace_ent.origin, trace_ent.origin + '0 0 2' * PL_MIN_z, MOVE_NORMAL, self);
+		if(trace_fraction >= 1)
+			return;
+		noreflect = 1;
+	}
+
 	norm = trace_plane_normal;
 	if(self.owner.playerid != self.playerid)
 	{
@@ -71,13 +81,17 @@
 	}
 	else if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_SLICK)
 	{
-		// just reflect
-		self.right_vector = self.right_vector - 2 * trace_plane_normal * (self.right_vector * trace_plane_normal);
-		self.angles = vectoangles(self.velocity - 2 * trace_plane_normal * (self.velocity * trace_plane_normal));
+		if(!noreflect)
+		{
+			// just reflect
+			self.right_vector = self.right_vector - 2 * trace_plane_normal * (self.right_vector * trace_plane_normal);
+			self.angles = vectoangles(self.velocity - 2 * trace_plane_normal * (self.velocity * trace_plane_normal));
+		}
 	}
 	else if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
 	{
-		W_Porto_Fail(0);
+		if(!noreflect)
+			W_Porto_Fail(0);
 	}
 	else if(self.effects & EF_RED)
 	{
@@ -87,8 +101,11 @@
 			sound(self, CHAN_PROJECTILE, "misc/invshot.wav", VOL_BASE, ATTN_NORM);
 			centerprint(self.owner, "^1In^7-portal created.\n");
 			trace_plane_normal = norm;
-			self.right_vector = self.right_vector - 2 * trace_plane_normal * (self.right_vector * trace_plane_normal);
-			self.angles = vectoangles(self.velocity - 2 * trace_plane_normal * (self.velocity * trace_plane_normal));
+			if(!noreflect)
+			{
+				self.right_vector = self.right_vector - 2 * trace_plane_normal * (self.right_vector * trace_plane_normal);
+				self.angles = vectoangles(self.velocity - 2 * trace_plane_normal * (self.velocity * trace_plane_normal));
+			}
 		}
 		else
 		{




More information about the nexuiz-commits mailing list