From 7f6fcd9531c26edea00e28bca53fe3f3bc878784 Mon Sep 17 00:00:00 2001 From: div0 Date: Sat, 6 Sep 2008 15:17:14 +0000 Subject: [PATCH] better fix for the portal math git-svn-id: svn://svn.icculus.org/nexuiz/trunk@4377 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/server/portals.qc | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/data/qcsrc/server/portals.qc b/data/qcsrc/server/portals.qc index ffdac9c37..8b9dd5116 100644 --- a/data/qcsrc/server/portals.qc +++ b/data/qcsrc/server/portals.qc @@ -78,6 +78,7 @@ float PlayerEdgeDistance(entity p, vector v) float Portal_TeleportPlayer(entity teleporter, entity player) { vector from, to, safe, step, transform, ang, newvel; + vector old_forward, new_forward; float planeshift, s, t; from = teleporter.origin; transform = teleporter.portal_transform; @@ -126,8 +127,42 @@ float Portal_TeleportPlayer(entity teleporter, entity player) if(player.classname == "player") { ang = player.v_angle; + /* ang_x = bound(-89, mod(-ang_x + 180, 360) - 180, 89); ang = Portal_Transform_Multiply(transform, ang); + */ + + // PLAYERS use different math + ang_x = -ang_x; + makevectors(ang); + old_forward = v_forward; + old_up = v_up; + + // their forward aiming direction is portalled... + new_forward = Portal_Transform_Multiply(transform, old_forward); + new_up = Portal_Transform_Multiply(transform, old_up); + + // but their "up" direction is difficult + // it must always go up... + // but if I used vectoangles2 on these now, it'd put part of it in the "roll" component + // DO NOT WANT + + if(new_forward_z > 0.9) // far up; in this case, the "up" vector points backwards + { + ang = fixedvectoangles(new_forward); // this still gets us a nice pitch value... + ang_y = vectoyaw(-1 * new_up); // this vector is the yaw we want + } + else if(new_forward_z < -0.9) // far down; in this case, the "up" vector points forward + { + ang = fixedvectoangles(new_forward); // this still gets us a nice pitch value... + ang_y = vectoyaw(new_up); // this vector is the yaw we want + } + else + { + // good angles + ang = fixedvectoangles2(new_forward, new_up); + } + ang_z = player.angles_z; } else -- 2.39.2