]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/warpzonelib/util_server.qc
Merge remote-tracking branch 'origin/master' into terencehill/hud_configure
[xonotic/xonotic-data.pk3dir.git] / qcsrc / warpzonelib / util_server.qc
1 #include "util_server.qh"
2
3 #include "common.qh"
4
5 #if defined(CSQC)
6 #elif defined(MENUQC)
7 #elif defined(SVQC)
8     #include "../csqcmodellib/sv_model.qh"
9     #include "../dpdefs/dpextensions.qh"
10         #include "../dpdefs/progsdefs.qh"
11 #endif
12
13 void WarpZoneLib_MoveOutOfSolid_Expand(entity e, vector by)
14 {
15         float eps = 0.0625;
16         tracebox(e.origin, e.mins - '1 1 1' * eps, e.maxs + '1 1 1' * eps, e.origin + by, MOVE_WORLDONLY, e);
17         if (trace_startsolid)
18                 return;
19         if (trace_fraction < 1)
20         {
21                 // hit something
22                 // adjust origin in the other direction...
23                 setorigin(e,e.origin - by * (1 - trace_fraction));
24         }
25 }
26
27 float WarpZoneLib_MoveOutOfSolid(entity e)
28 {
29         vector o, m0, m1;
30
31         o = e.origin;
32         traceline(o, o, MOVE_WORLDONLY, e);
33         if (trace_startsolid)
34                 return false;
35
36         tracebox(o, e.mins, e.maxs, o, MOVE_WORLDONLY, e);
37         if (!trace_startsolid)
38                 return true;
39
40         m0 = e.mins;
41         m1 = e.maxs;
42         e.mins = '0 0 0';
43         e.maxs = '0 0 0';
44         WarpZoneLib_MoveOutOfSolid_Expand(e, '1 0 0' * m0_x);
45         e.mins_x = m0_x;
46         WarpZoneLib_MoveOutOfSolid_Expand(e, '1 0 0' * m1_x);
47         e.maxs_x = m1_x;
48         WarpZoneLib_MoveOutOfSolid_Expand(e, '0 1 0' * m0_y);
49         e.mins_y = m0_y;
50         WarpZoneLib_MoveOutOfSolid_Expand(e, '0 1 0' * m1_y);
51         e.maxs_y = m1_y;
52         WarpZoneLib_MoveOutOfSolid_Expand(e, '0 0 1' * m0_z);
53         e.mins_z = m0_z;
54         WarpZoneLib_MoveOutOfSolid_Expand(e, '0 0 1' * m1_z);
55         e.maxs_z = m1_z;
56         setorigin(e, e.origin);
57
58         tracebox(e.origin, e.mins, e.maxs, e.origin, MOVE_WORLDONLY, e);
59         if (trace_startsolid)
60         {
61                 setorigin(e, o);
62                 return false;
63         }
64
65         return true;
66 }
67
68 float WarpZoneLib_ExactTrigger_Touch()
69 {
70         return !WarpZoneLib_BoxTouchesBrush(other.absmin, other.absmax, self, other);
71 }
72
73 void WarpZoneLib_ExactTrigger_Init()
74 {
75         vector mi, ma;
76         if (self.movedir == '0 0 0')
77         if (self.angles != '0 0 0')
78         {
79                 makevectors (self.angles);
80                 self.movedir = v_forward;
81         }
82         if(self.model == "")
83         {
84                 // It's a box! No need to match with exacttriggers.
85                 self.warpzone_isboxy = 1;
86         }
87         else
88         {
89                 mi = self.mins;
90                 ma = self.maxs;
91                 precache_model(self.model);
92                 setmodel(self, self.model);
93                 // let mapper-set mins/maxs override the model's bounds if set
94                 if(mi != '0 0 0' || ma != '0 0 0')
95                 {
96                         // It's a box! No need to match with exacttriggers.
97                         self.mins = mi;
98                         self.maxs = ma;
99                         self.warpzone_isboxy = 1;
100                 }
101         }
102         setorigin(self, self.origin);
103         if(self.scale)
104                 setsize(self, self.mins * self.scale, self.maxs * self.scale);
105         else
106                 setsize(self, self.mins, self.maxs);
107         self.movetype = MOVETYPE_NONE;
108         self.solid = SOLID_TRIGGER;
109         self.model = "";
110 }