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