r4864 - trunk/data/qcsrc/server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Fri Oct 24 08:13:41 EDT 2008


Author: div0
Date: 2008-10-24 08:13:39 -0400 (Fri, 24 Oct 2008)
New Revision: 4864

Modified:
   trunk/data/qcsrc/server/portals.qc
   trunk/data/qcsrc/server/t_teleporters.qc
Log:
slightly different hook behaviour (projectiles that the hook teleports must now go THROUGH the hook's circle)


Modified: trunk/data/qcsrc/server/portals.qc
===================================================================
--- trunk/data/qcsrc/server/portals.qc	2008-10-24 09:45:12 UTC (rev 4863)
+++ trunk/data/qcsrc/server/portals.qc	2008-10-24 12:13:39 UTC (rev 4864)
@@ -226,8 +226,30 @@
 	return 1;
 }
 
+float Portal_WillHitPlane(vector eorg, vector emins, vector emaxs, vector evel, vector porg, vector pnorm, float psize)
+{
+	float dist, distpersec, delta;
+	vector v;
+
+	dist = (eorg - porg) * pnorm;
+	dist += min(emins_x * pnorm_x, emaxs_x * pnorm_x);
+	dist += min(emins_y * pnorm_y, emaxs_y * pnorm_y);
+	dist += min(emins_z * pnorm_z, emaxs_z * pnorm_z);
+	if(dist < -1) // other side?
+		return 0;
+	distpersec = evel * pnorm;
+	if(distpersec >= 0) // going away from the portal?
+		return 0;
+	delta = dist / distpersec;
+	v = eorg - evel * delta - porg;
+	v = v - pnorm * (pnorm * v);
+	return vlen(v) < psize;
+}
+
 void Portal_Touch()
 {
+	vector g;
+
 	// portal is being removed?
 	if(self.solid != SOLID_TRIGGER)
 		return; // possibly engine bug
@@ -239,9 +261,6 @@
 		return; // only handle TouchAreaGrid ones (only these can teleport)
 		// for some unknown reason, this also gets collisions from SV_Impact sometimes
 
-	if(other.classname == "grapplinghook")
-		return;
-
 	if(other.classname == "porto")
 	{
 		if(other.portal_id == self.portal_id)
@@ -262,7 +281,8 @@
 			if(IS_INDEPENDENT_PLAYER(other.owner) || IS_INDEPENDENT_PLAYER(self.owner))
 				return; // cannot go through someone else's portal
 	fixedmakevectors(self.angles);
-	if((other.origin - self.origin) * v_forward < 0)
+	g = frametime * '0 0 -1' * cvar("sv_gravity");
+	if(!Portal_WillHitPlane(other.origin, other.mins, other.maxs, other.velocity + g, self.origin, v_forward, self.maxs_x))
 		return;
 
 	/*
@@ -423,6 +443,7 @@
 void Portal_Think()
 {
 	entity e, o;
+	vector g;
 
 	// portal is being removed?
 	if(self.solid != SOLID_TRIGGER)
@@ -435,6 +456,8 @@
 	self.solid = SOLID_BBOX;
 	self.owner = world;
 
+	g = frametime * '0 0 -1' * cvar("sv_gravity");
+
 	fixedmakevectors(self.angles);
 
 	FOR_EACH_PLAYER(e)
@@ -445,7 +468,7 @@
 		if(e != o)
 			if(IS_INDEPENDENT_PLAYER(e) || IS_INDEPENDENT_PLAYER(o))
 				continue; // cannot go through someone else's portal
-		if((e.origin - self.origin) * v_forward < 0) // wrong side of the plane? no teleport
+		if(!Portal_WillHitPlane(e.origin, e.mins, e.maxs, e.velocity + g, self.origin, v_forward, self.maxs_x))
 			continue;
 
 		// if e would hit the portal in a frame...
@@ -599,7 +622,7 @@
 	portal.angles = ang;
 	portal.think = Portal_Think;
 	portal.nextthink = 0;
-	portal.portal_activatetime = time + 1.1;
+	portal.portal_activatetime = time + 0.1;
 	portal.event_damage = Portal_Damage;
 	portal.health = 200;
 	portal.fade_time = time + cvar("g_balance_portal_lifetime");

Modified: trunk/data/qcsrc/server/t_teleporters.qc
===================================================================
--- trunk/data/qcsrc/server/t_teleporters.qc	2008-10-24 09:45:12 UTC (rev 4863)
+++ trunk/data/qcsrc/server/t_teleporters.qc	2008-10-24 12:13:39 UTC (rev 4864)
@@ -25,8 +25,6 @@
 
 	if(player.classname == "player")
 	{
-		RemoveGrapplingHook(player);
-
 		// Kill anyone else in the teleporter box (NO MORE TDEATH)
 		if(player.takedamage && player.deadflag == DEAD_NO && !g_race)
 		{
@@ -104,6 +102,10 @@
 	EXACTTRIGGER_TOUCH;
 
 	makevectors(self.enemy.mangle);
+
+	if(other.classname == "player")
+		RemoveGrapplingHook(other);
+
 	TeleportPlayer(self, other, self.enemy.origin + '0 0 1' * (1 - other.mins_z - 24), self.enemy.mangle, v_forward * vlen(other.velocity), '0 0 0', '0 0 0');
 
 	if(self.enemy.target)




More information about the nexuiz-commits mailing list