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