]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/warpzonelib/common.qc
new physics config by Lee Stricklin; fix electro beam through warpzones when standing...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / warpzonelib / common.qc
index 2fa8d55e4c101aaeca35e116fbad93b6d4a15852..8536bd3d2c464bf575b32356ce60599432cd6190 100644 (file)
@@ -132,6 +132,8 @@ entity WarpZone_Find(vector mi, vector ma)
 {
        // if we are near any warpzone planes - MOVE AWAY (work around nearclip)
        entity e;
+       if(!warpzone_warpzones_exist)
+               return world;
        for(e = world; (e = find(e, classname, "trigger_warpzone")); )
                if(WarpZoneLib_BoxTouchesBrush(mi, ma, e, world))
                        return e;
@@ -141,6 +143,8 @@ entity WarpZone_Find(vector mi, vector ma)
 void WarpZone_MakeAllSolid()
 {
        entity e;
+       if(!warpzone_warpzones_exist)
+               return;
        for(e = world; (e = find(e, classname, "trigger_warpzone")); )
                e.solid = SOLID_BSP;
 }
@@ -148,6 +152,8 @@ void WarpZone_MakeAllSolid()
 void WarpZone_MakeAllOther()
 {
        entity e;
+       if(!warpzone_warpzones_exist)
+               return;
        for(e = world; (e = find(e, classname, "trigger_warpzone")); )
                e.solid = SOLID_TRIGGER;
 }
@@ -174,6 +180,27 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end,
        vector o0, e0;
        entity wz;
        vector vf, vr, vu;
+
+       WarpZone_Trace_InitTransform();
+       if(!warpzone_warpzones_exist)
+       {
+               if(nomonsters == MOVE_NOTHING)
+               {
+                       trace_endpos = end;
+                       trace_fraction = 1;
+                       if(cb)
+                               cb(org, trace_endpos, end);
+                       return;
+               }
+               else
+               {
+                       tracebox(org, mi, ma, end, nomonsters, forent);
+                       if(cb)
+                               cb(org, trace_endpos, end);
+                       return;
+               }
+       }
+
        vf = v_forward;
        vr = v_right;
        vu = v_up;
@@ -193,7 +220,6 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end,
        if((contentshack = (forent.dphitcontentsmask && !(forent.dphitcontentsmask & DPCONTENTS_SOLID))))
                forent.dphitcontentsmask |= DPCONTENTS_SOLID;
 
-       WarpZone_Trace_InitTransform();
        // if starting in warpzone, first transform
        wz = WarpZone_Find(org + mi, org + ma);
        if(wz)
@@ -207,7 +233,7 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end,
                        goto fail;
                }
                WarpZone_Trace_AddTransform(wz);
-               org = WarpZone_TransformOrigin(wz, trace_endpos);
+               org = WarpZone_TransformOrigin(wz, org);
                end = WarpZone_TransformOrigin(wz, end);
        }
        WarpZone_MakeAllSolid();
@@ -283,13 +309,28 @@ void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZo
        vector vf, vr, vu, v0, o0;
        entity wz;
 
-       vf = v_forward;
-       vr = v_right;
-       vu = v_up;
        o0 = e.origin;
        v0 = e.velocity;
 
        WarpZone_Trace_InitTransform();
+       WarpZone_tracetoss_time = 0;
+       if(!warpzone_warpzones_exist)
+       {
+               tracetoss(e, forent);
+               if(cb)
+                       cb(e.origin, trace_endpos, trace_endpos);
+               dt = vlen(e.origin - o0) / vlen(e.velocity);
+               WarpZone_tracetoss_time += dt;
+               e.velocity_z -= dt * g;
+               WarpZone_tracetoss_velocity = e.velocity;
+               e.velocity = v0;
+               return;
+       }
+
+       vf = v_forward;
+       vr = v_right;
+       vu = v_up;
+
        // if starting in warpzone, first transform
        wz = WarpZone_Find(e.origin + e.mins, e.origin + e.maxs);
        if(wz)
@@ -308,7 +349,6 @@ void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZo
        }
        WarpZone_MakeAllSolid();
        g = cvar("sv_gravity") * e.gravity;
-       WarpZone_tracetoss_time = 0;
        i = 16;
        for(;;)
        {
@@ -322,9 +362,9 @@ void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZo
                if(cb)
                        cb(e.origin, trace_endpos, trace_endpos);
                e.origin = trace_endpos;
-               e.velocity_z -= WarpZone_tracetoss_time * g;
                dt = vlen(e.origin - o0) / vlen(e.velocity);
                WarpZone_tracetoss_time += dt;
+               e.velocity_z -= dt * g;
                if(trace_fraction >= 1)
                        break;
                if(trace_ent.classname != "trigger_warpzone")