From 2f82c7e7896fe29d9f18cc720d8c9317255b3a9c Mon Sep 17 00:00:00 2001 From: div0 Date: Sun, 28 Feb 2010 19:42:50 +0000 Subject: [PATCH] more warpzone fixes - now angled warpzones work too git-svn-id: svn://svn.icculus.org/nexuiz/trunk@8692 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/warpzonelib/anglestransform.qc | 10 +++++- data/qcsrc/warpzonelib/anglestransform.qh | 2 +- data/qcsrc/warpzonelib/client.qc | 38 +++++++++++++++++------ data/qcsrc/warpzonelib/common.qc | 31 +++++++++++++++++- data/qcsrc/warpzonelib/server.qc | 20 ++++++++---- data/scripts/common.shader | 2 +- 6 files changed, 83 insertions(+), 20 deletions(-) diff --git a/data/qcsrc/warpzonelib/anglestransform.qc b/data/qcsrc/warpzonelib/anglestransform.qc index 89a0665fe..0caaf8ac4 100644 --- a/data/qcsrc/warpzonelib/anglestransform.qc +++ b/data/qcsrc/warpzonelib/anglestransform.qc @@ -93,10 +93,18 @@ vector AnglesTransform_Normalize(vector t, float minimize_roll) return t; } +vector AnglesTransform_ApplyToAngles(vector transform, vector v) +{ + //v_x = -v_x; + v = AnglesTransform_Multiply(transform, v); + //v_x = -v_x; + return v; +} + vector AnglesTransform_ApplyToVAngles(vector transform, vector v) { v_x = -v_x; - v = AnglesTransform_ApplyToAngles(transform, v); + v = AnglesTransform_Multiply(transform, v); v_x = -v_x; return v; } diff --git a/data/qcsrc/warpzonelib/anglestransform.qh b/data/qcsrc/warpzonelib/anglestransform.qh index fb2b99d0e..a91cddc27 100644 --- a/data/qcsrc/warpzonelib/anglestransform.qh +++ b/data/qcsrc/warpzonelib/anglestransform.qh @@ -11,5 +11,5 @@ vector AnglesTransform_Divide(vector to_transform, vector from_transform); vector AnglesTransform_Normalize(vector t, float minimize_roll); // makes sure all angles are in their range: yaw in -180..180, pitch in -90..90, roll in -180..180 (or if minimize_roll is set, pitch in -180..180, roll in -90..90) -#define AnglesTransform_ApplyToAngles(t,v) AnglesTransform_Multiply(t, v) +vector AnglesTransform_ApplyToAngles(vector transform, vector v); vector AnglesTransform_ApplyToVAngles(vector transform, vector v); diff --git a/data/qcsrc/warpzonelib/client.qc b/data/qcsrc/warpzonelib/client.qc index d961e2ce4..fae6cc57b 100644 --- a/data/qcsrc/warpzonelib/client.qc +++ b/data/qcsrc/warpzonelib/client.qc @@ -48,27 +48,45 @@ vector warpzone_saved_origin; vector warpzone_saved_angles; void WarpZone_FixView() { + float pd; entity e; - float roll; warpzone_saved = 0; + warpzone_saved_origin = warpzone_fixview_origin; + warpzone_saved_angles = warpzone_fixview_angles; + for(e = world; (e = find(e, classname, "warpzone_to")); ) { - //print(sprintf("does %s (%s to %s) touch %s?\n", e.model, vtos(e.absmin), vtos(e.absmax), vtos(pmove_org))); - if(WarpZoneLib_BoxTouchesBrush(pmove_org, pmove_org, e, world)) + if(WarpZoneLib_BoxTouchesBrush(warpzone_fixview_origin, warpzone_fixview_origin, e, world)) { - warpzone_saved_origin = warpzone_fixview_origin; - warpzone_saved_angles = warpzone_fixview_angles; warpzone_saved = 1; - roll = warpzone_fixview_angles_z; - warpzone_fixview_angles_z = 0; warpzone_fixview_origin = AnglesTransform_Apply(e.warpzone_transform, warpzone_fixview_origin - e.enemy.oldorigin) + e.oldorigin; warpzone_fixview_angles = WarpZone_TransformVAngles(e.warpzone_transform, warpzone_fixview_angles); - warpzone_fixview_angles_z = roll; - R_SetView(VF_ORIGIN, warpzone_fixview_origin); - R_SetView(VF_ANGLES, warpzone_fixview_angles); break; } } + + // if we are near any warpzone planes - MOVE AWAY (work around nearclip) + float nearclip = 2; + for(e = world; (e = find(e, classname, "warpzone_to")); ) + { + if(WarpZoneLib_BoxTouchesBrush(warpzone_fixview_origin - '1 1 1' * nearclip, warpzone_fixview_origin + '1 1 1' * nearclip, e, world)) + { + fixedmakevectors(e.enemy.avelocity); + pd = (warpzone_fixview_origin - e.enemy.oldorigin) * v_forward; + if(pd >= 0 && pd < nearclip) + { + warpzone_saved = 1; + warpzone_fixview_origin = warpzone_fixview_origin + v_forward * (nearclip - pd); + pd = (warpzone_fixview_origin - e.enemy.oldorigin) * v_forward; + } + } + } + + if(warpzone_saved) + { + R_SetView(VF_ORIGIN, warpzone_fixview_origin); + R_SetView(VF_ANGLES, warpzone_fixview_angles); + } } void WarpZone_UnFixView() { diff --git a/data/qcsrc/warpzonelib/common.qc b/data/qcsrc/warpzonelib/common.qc index 062c1f4b0..c28d958a4 100644 --- a/data/qcsrc/warpzonelib/common.qc +++ b/data/qcsrc/warpzonelib/common.qc @@ -1,9 +1,38 @@ vector WarpZone_TransformVAngles(vector t, vector ang) { float roll; + roll = ang_z; ang_z = 0; - ang = AnglesTransform_Normalize(AnglesTransform_ApplyToVAngles(t, ang), TRUE); + + /* + vector vf, vr, vu; + print(vtos(ang), " input\n"); + makevectors(ang); + vf = v_forward; + vr = v_right; + vu = v_up; + print(vtos(vf), " -> ", vtos(AnglesTransform_Apply(t, vf)), "\n"); + print(vtos(vr), " -> ", vtos(AnglesTransform_Apply(t, vr)), "\n"); + print(vtos(vu), " -> ", vtos(AnglesTransform_Apply(t, vu)), "\n"); + */ + + ang = AnglesTransform_ApplyToVAngles(t, ang); + + /* + print(vtos(ang), " output\n"); + makevectors(ang); + print(vtos(vf), " -> ", vtos(v_forward), "\n"); + print(vtos(vr), " -> ", vtos(v_right), "\n"); + print(vtos(vu), " -> ", vtos(v_up), "\n"); + */ + + ang = AnglesTransform_Normalize(ang, TRUE); + + /* + print(vtos(ang), " output\n"); + */ + ang_z = roll; return ang; } diff --git a/data/qcsrc/warpzonelib/server.qc b/data/qcsrc/warpzonelib/server.qc index 4b39827bb..37bf6be8d 100644 --- a/data/qcsrc/warpzonelib/server.qc +++ b/data/qcsrc/warpzonelib/server.qc @@ -52,14 +52,21 @@ float WarpZone_Teleport(entity player) tracebox(o1 - player.view_ofs, player.mins, player.maxs, o1 - player.view_ofs, MOVE_NOMONSTERS, player); if(trace_startsolid) { - setorigin(player, o1 - player.view_ofs); + vector mi, ma; + mi = player.mins; + ma = player.maxs; + setsize(player, mi - player.view_ofs, ma - player.view_ofs); + setorigin(player, o1); if(WarpZoneLib_MoveOutOfSolid(player)) { + o1 = player.origin; + setsize(player, mi, ma); setorigin(player, o0); - o1 = player.origin + player.view_ofs; } else { + print("would have to put player in solid, won't do that\n"); + setsize(player, mi, ma); setorigin(player, o0 - player.view_ofs); return 0; // cannot fix } @@ -87,7 +94,8 @@ void WarpZone_Touch (void) if(other.movetype == MOVETYPE_NONE) return; - EXACTTRIGGER_TOUCH; + if(WarpZoneLib_ExactTrigger_Touch()) + return; e = self.enemy; if(WarpZone_Teleport(other)) @@ -186,9 +194,6 @@ void WarpZone_InitStep_FindTarget() self.enemy.enemy = self; } } - - // now enable touch - self.touch = WarpZone_Touch; } void WarpZone_InitStep_UpdateTransform() @@ -212,4 +217,7 @@ void WarpZone_InitStep_UpdateTransform() // 3. store off a saved forward vector for plane hit decisions fixedmakevectors(self.warpzone_angles); self.warpzone_forward = v_forward; + + // now enable touch + self.touch = WarpZone_Touch; } diff --git a/data/scripts/common.shader b/data/scripts/common.shader index 967e93f07..27c3b2618 100644 --- a/data/scripts/common.shader +++ b/data/scripts/common.shader @@ -352,7 +352,7 @@ textures/common/lightgrid textures/common/warpzone { surfaceparm nolightmap - surfaceparm nonsolid + // surfaceparm nonsolid // no, it must be solid like trigger surfaceparm trans surfaceparm nomarks { -- 2.39.2