]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/warpzonelib/util_server.qc
b11b823683d558c1e69402f216d67394d1edb64e
[divverent/nexuiz.git] / data / qcsrc / warpzonelib / util_server.qc
1 void WarpZoneLib_MoveOutOfSolid_Expand(entity e, vector by)
2 {
3         float eps = 0.0625;
4         tracebox(e.origin, e.mins - '1 1 1' * eps, e.maxs + '1 1 1' * eps, e.origin + by, MOVE_WORLDONLY, e);
5         if (trace_startsolid)
6                 return;
7         if (trace_fraction < 1)
8         {
9                 // hit something
10                 // adjust origin in the other direction...
11                 setorigin(e,e.origin - by * (1 - trace_fraction));
12         }
13 }
14
15 float WarpZoneLib_MoveOutOfSolid(entity e)
16 {
17         vector o, m0, m1;
18
19         o = e.origin;
20         traceline(o, o, MOVE_WORLDONLY, e);
21         if (trace_startsolid)
22                 return FALSE;
23
24         tracebox(o, e.mins, e.maxs, o, MOVE_WORLDONLY, e);
25         if (!trace_startsolid)
26                 return TRUE;
27
28         m0 = e.mins;
29         m1 = e.maxs;
30         e.mins = '0 0 0';
31         e.maxs = '0 0 0';
32         WarpZoneLib_MoveOutOfSolid_Expand(e, '1 0 0' * m0_x);
33         e.mins_x = m0_x;
34         WarpZoneLib_MoveOutOfSolid_Expand(e, '1 0 0' * m1_x);
35         e.maxs_x = m1_x;
36         WarpZoneLib_MoveOutOfSolid_Expand(e, '0 1 0' * m0_y);
37         e.mins_y = m0_y;
38         WarpZoneLib_MoveOutOfSolid_Expand(e, '0 1 0' * m1_y);
39         e.maxs_y = m1_y;
40         WarpZoneLib_MoveOutOfSolid_Expand(e, '0 0 1' * m0_z);
41         e.mins_z = m0_z;
42         WarpZoneLib_MoveOutOfSolid_Expand(e, '0 0 1' * m1_z);
43         e.maxs_z = m1_z;
44         setorigin(e, e.origin);
45
46         tracebox(e.origin, e.mins, e.maxs, e.origin, MOVE_WORLDONLY, e);
47         if (trace_startsolid)
48         {
49                 setorigin(e, o);
50                 return FALSE;
51         }
52
53         return TRUE;
54 }
55