From: Rudolf Polzer <divverent@xonotic.org>
Date: Mon, 27 Jun 2011 18:13:02 +0000 (+0200)
Subject: more warpzone projectile bugfix
X-Git-Tag: xonotic-v0.5.0~159^2~15^2~8
X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=a30b80417df77f6fd3b20f64a7a88cca8a191b85;p=xonotic%2Fxonotic-data.pk3dir.git

more warpzone projectile bugfix
---

diff --git a/qcsrc/warpzonelib/server.qc b/qcsrc/warpzonelib/server.qc
index 50cb953af..ca911d7ce 100644
--- a/qcsrc/warpzonelib/server.qc
+++ b/qcsrc/warpzonelib/server.qc
@@ -7,6 +7,7 @@
 // for all entities
 .vector warpzone_oldorigin, warpzone_oldvelocity, warpzone_oldangles;
 .float warpzone_teleport_time;
+.float warpzone_teleport_finishtime;
 .entity warpzone_teleport_zone;
 
 void WarpZone_StoreProjectileData(entity e)
@@ -65,19 +66,20 @@ float WarpZone_Teleported_Send(entity to, float sf)
 		WarpZone_TeleportPlayer(wz, player, o1 - player.view_ofs, a1, v1); \
 		WarpZone_StoreProjectileData(player); \
 		player.warpzone_teleport_time = time; \
+		player.warpzone_teleport_finishtime = time; \
 		player.warpzone_teleport_zone = wz; \
 	} \
 	while(0)
 
 float WarpZone_Teleport(entity wz, entity player, float f0, float f1)
 {
-	vector o0, a0, v0, o1, a1, v1;
+	vector o0, a0, v0, o1, a1, v1, o10;
 
 	o0 = player.origin + player.view_ofs;
 	v0 = player.velocity;
 	a0 = player.angles;
 
-	o1 = WarpZone_TransformOrigin(wz, o0);
+	o10 = o1 = WarpZone_TransformOrigin(wz, o0);
 	v1 = WarpZone_TransformVelocity(wz, v0);
 	if(clienttype(player) != CLIENTTYPE_NOTACLIENT)
 		a1 = WarpZone_TransformVAngles(wz, player.v_angle);
@@ -99,7 +101,8 @@ float WarpZone_Teleport(entity wz, entity player, float f0, float f1)
 		}
 		o1 = trace_endpos + player.view_ofs;
 
-		float d, dv;
+		float d, dv, md;
+		md = max(vlen(player.mins), vlen(player.maxs));
 		d = WarpZone_TargetPlaneDist(wz, o1);
 		dv = WarpZone_TargetPlaneDist(wz, v1);
 		if(d < 0)
@@ -113,6 +116,11 @@ float WarpZone_Teleport(entity wz, entity player, float f0, float f1)
 
 	WARPZONE_TELEPORT_DOTELEPORT();
 
+	// prevent further teleports back
+	float dt = (o1 - o10) * v1 * (1 / (v1 * v1));
+	if(dt < sys_frametime)
+		player.warpzone_teleport_finishtime += sys_frametime - dt;
+
 #ifndef WARPZONE_USE_FIXANGLE
 	if(player.classname == "player")
 	{
@@ -144,7 +152,7 @@ void WarpZone_Touch (void)
 	if(other.classname == "trigger_warpzone")
 		return;
 
-	if(other.warpzone_teleport_time == time) // already teleported this frame
+	if(time <= other.warpzone_teleport_finishtime) // already teleported this frame
 		return;
 
 	// FIXME needs a better check to know what is safe to teleport and what not
@@ -157,7 +165,7 @@ void WarpZone_Touch (void)
 	if(WarpZone_PlaneDist(self, other.origin + other.view_ofs) >= 0) // wrong side of the trigger_warpzone (don't teleport yet)
 		return;
 
-	if(WarpZone_Teleport(self, other, -1, 0))
+	if(WarpZone_Teleport(self, other, -1000, 0))
 	{
 		string save1, save2;
 		activator = other;
@@ -291,7 +299,7 @@ float WarpZone_CheckProjectileImpact(entity player)
 	v0 = player.velocity;
 
 	// if we teleported shortly before, abort
-	if(time < player.warpzone_teleport_time + 0.1)
+	if(time <= player.warpzone_teleport_finishtime + 0.1)
 		return 0;
 
 	// if player hit a warpzone, abort
@@ -344,7 +352,7 @@ float WarpZone_Projectile_Touch()
 		return TRUE;
 
 	// no further impacts if we teleported this frame!
-	if(self.warpzone_teleport_time == time)
+	if(time == self.warpzone_teleport_time)
 		return TRUE;
 
 	// this SEEMS to not happen at the moment, but if it did, it would be more reliable
@@ -395,15 +403,6 @@ float WarpZone_Projectile_Touch()
 	if(WarpZone_Projectile_Touch_ImpactFilter_Callback())
 		return TRUE;
 
-	if(self.warpzone_teleport_time == time)
-	{
-		// sequence: hit warpzone, get teleported, hit wall
-		// print("2 hits 1 frame\n");
-		setorigin(self, self.warpzone_oldorigin);
-		self.velocity = self.warpzone_oldvelocity;
-		self.angles = self.warpzone_oldangles;
-		return TRUE;
-	}
 	return FALSE;
 }