r4276 - trunk/data/qcsrc/server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Mon Sep 1 15:18:44 EDT 2008


Author: div0
Date: 2008-09-01 15:18:44 -0400 (Mon, 01 Sep 2008)
New Revision: 4276

Added:
   trunk/data/qcsrc/server/portals.qc
Modified:
   trunk/data/qcsrc/server/builtins.qh
   trunk/data/qcsrc/server/miscfunctions.qc
   trunk/data/qcsrc/server/t_teleporters.qc
Log:
beginning of map-portals (an upcoming alternative to teleporters? maybe I will do the portal grenade launcher?)


Modified: trunk/data/qcsrc/server/builtins.qh
===================================================================
--- trunk/data/qcsrc/server/builtins.qh	2008-09-01 18:51:45 UTC (rev 4275)
+++ trunk/data/qcsrc/server/builtins.qh	2008-09-01 19:18:44 UTC (rev 4276)
@@ -49,7 +49,7 @@
 void	particle (vector v, vector d, float colour, float count)			= #48;
 void	ChangeYaw (void)								= #49;
 
-vector	vectoangles (vector v)								= #51;
+vector	vectoangles (vector v, ...)								= #51;
 void(float to, float f)		WriteByte = #52;
 void(float to, float f)		WriteChar = #53;
 void(float to, float f)		WriteShort = #54;

Modified: trunk/data/qcsrc/server/miscfunctions.qc
===================================================================
--- trunk/data/qcsrc/server/miscfunctions.qc	2008-09-01 18:51:45 UTC (rev 4275)
+++ trunk/data/qcsrc/server/miscfunctions.qc	2008-09-01 19:18:44 UTC (rev 4276)
@@ -73,21 +73,18 @@
 	}
 }
 
-void move_out_of_solid(entity e)
+float move_out_of_solid(entity e)
 {
 	vector o, m0, m1;
 
 	o = e.origin;
 	traceline(o, o, MOVE_WORLDONLY, e);
 	if(trace_startsolid)
-	{
-		dprint("origin is in solid too! (", vtos(o), ")");
-		return;
-	}
+		return 0;
 
 	tracebox(o, e.mins, e.maxs, o, MOVE_WORLDONLY, e);
 	if(!trace_startsolid)
-		return;
+		return 1;
 
 	m0 = e.mins;
 	m1 = e.maxs;
@@ -103,10 +100,9 @@
 
 	tracebox(e.origin, e.mins, e.maxs, e.origin, MOVE_WORLDONLY, e);
 	if(trace_startsolid)
-	{
-		dprint("could not get out of solid (", vtos(o), ")\n");
-		return;
-	}
+		return 0;
+
+	return 1;
 }
 
 string STR_PLAYER = "player";
@@ -202,7 +198,8 @@
 		o = self.origin;
 		self.mins = PL_MIN;
 		self.maxs = PL_MAX;
-		move_out_of_solid(self);
+		if(!move_out_of_solid(self))
+			objerror("could not get out of solid at all!");
 		print("^1NOTE: this map needs FIXING. Spawnpoint at ", vtos(o - '0 0 1'));
 		print(" needs to be moved out of solid, e.g. by '", ftos(self.origin_x - o_x));
 		print(" ", ftos(self.origin_y - o_y));

Added: trunk/data/qcsrc/server/portals.qc
===================================================================
--- trunk/data/qcsrc/server/portals.qc	                        (rev 0)
+++ trunk/data/qcsrc/server/portals.qc	2008-09-01 19:18:44 UTC (rev 4276)
@@ -0,0 +1,77 @@
+vector fixedvectoangles(vector v)
+{
+	vector a;
+	a = vectoangles(v);
+	a_x = -a_x;
+	return a;
+}
+
+vector Portal_Transform_Apply(vector transform, vector v)
+{
+	makevectors(transform);
+	return v_forward * v_x
+	     + v_right   * v_y
+		 + v_up      * v_z;
+}
+
+vector Portal_Transform_Invert(vector transform)
+{
+	makevectors(transform);
+	// we want angles that turn v_forward into '1 0 0', v_right into '0 1 0' and v_up into '0 0 1'
+	// but these are orthogonal unit vectors!
+	// so to invert, we can simply vectoangles the TRANSPOSED matrix
+	// TODO is this always -transform?
+	return fixedvectoangles(
+		'1 0 0' * v_forward_x + '0 1 0' * v_right_x + '0 0 1' * v_up_x,
+		'1 0 0' * v_forward_y + '0 1 0' * v_right_y + '0 0 1' * v_up_y
+	);
+}
+
+vector Portal_Transform_Multiply(vector t1, vector t2)
+{
+	vector vx, vy;
+	makevectors(t2); vx = v_forward; vy = v_right;
+	vx = Portal_Transform_Apply(t1, vx);
+	vy = Portal_Transform_Apply(t1, vy);
+	return fixedvectoangles(vx, vy);
+}
+
+vector Portal_Transform_Divide(vector to_transform, vector from_transform)
+{
+	return Portal_Transform_Multiply(to_transform, Portal_Transform_Invert(from_transform));
+}
+
+void Portal_TeleportPlayer(entity teleporter, entity player)
+{
+	vector to, transform;
+	to = teleporter.velocity;
+	transform = teleporter.mangle;
+	TeleportPlayer(teleporter, player, to, Portal_Transform_Multiply(transform, player.angles), Portal_Transform_Apply(transform, player.velocity));
+}
+
+float Portal_Fix(entity teleporter)
+{
+	teleporter.mins = PL_MIN - '2 2 2';
+	teleporter.maxs = PL_MAX + '2 2 2';
+	return move_out_of_solid(teleporter);
+}
+
+void Portal_Connect(entity teleporter, entity destination)
+{
+	teleporter.mangle = Portal_Transform_Divide(-(destination.angles), teleporter.angles);
+	teleporter.touch = Portal_Touch;
+	teleporter.cnt = 0;
+	destination.touch = SUB_Null;
+	destination.cnt = 1;
+}
+
+entity Portal_Spawn(entity own, vector org, vector ang)
+{
+	entity portal;
+	portal = spawn();
+	portal.classname = "portal";
+	portal.owner = own;
+	portal.origin = org;
+	portal.angles = ang;
+	setmodel(portal, ...);
+}

Modified: trunk/data/qcsrc/server/t_teleporters.qc
===================================================================
--- trunk/data/qcsrc/server/t_teleporters.qc	2008-09-01 18:51:45 UTC (rev 4275)
+++ trunk/data/qcsrc/server/t_teleporters.qc	2008-09-01 19:18:44 UTC (rev 4276)
@@ -1,5 +1,5 @@
 .entity pusher;
-void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angles)
+void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angles, vector to_velocity)
 {
 	entity head;
 	entity oldself;
@@ -15,7 +15,7 @@
 	setorigin (player, to + '0 0 1' * (1 - player.mins_z - 24));
 	player.angles = to_angles;
 	player.fixangle = TRUE;
-	player.velocity = v_forward * vlen(player.velocity);
+	player.velocity = to_velocity;
 	RemoveGrapplingHook(player);
 
 	// Kill anyone else in the teleporter box (NO MORE TDEATH)
@@ -84,7 +84,8 @@
 
 	EXACTTRIGGER_TOUCH;
 
-	TeleportPlayer(self, other, self.enemy.origin + '0 0 1' * (1 - other.mins_z - 24), self.enemy.mangle);
+	makevectors(self.enemy.mangle);
+	TeleportPlayer(self, other, self.enemy.origin + '0 0 1' * (1 - other.mins_z - 24), self.enemy.mangle, v_forward * vlen(other.velocity));
 
 	if(self.enemy.target)
 	{




More information about the nexuiz-commits mailing list