]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/pathlib/utility.qc
Update default video settings
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / pathlib / utility.qc
1 #include "utility.qh"
2
3 #include <common/stats.qh>
4 #include <common/weapons/_all.qh>
5 #include <server/pathlib/pathlib.qh>
6
7 bool location_isok(vector point, bool waterok, bool air_isok)
8 {
9     if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_SKY)
10         return false;
11
12     int pc = pointcontents(point);
13     int pc2 = pointcontents(point - '0 0 1');
14
15     if(pc == CONTENT_EMPTY && pc2 == CONTENT_SOLID)
16         return true;
17     if(pc == CONTENT_EMPTY && pc2 == CONTENT_WATER && waterok)
18         return true;
19     if(pc == CONTENT_EMPTY && pc2 == CONTENT_EMPTY && air_isok)
20         return true;
21     if(pc == CONTENT_WATER && waterok)
22         return true;
23     return false;
24 }
25
26 entity pathlib_nodeatpoint(vector where)
27 {
28     ++pathlib_searched_cnt;
29
30     where.x = fsnap(where.x,pathlib_gridsize);
31     where.y = fsnap(where.y,pathlib_gridsize);
32
33     entity found = NULL; // TODO: using FOREACH_ENTITY_RADIUS here causes mutex loop warnings, this may need a proper fix!
34     IL_EACH(g_pathlib_nodes, it.is_path_node && vdist(it.origin - where, <, pathlib_gridsize * 0.5),
35     {
36         found = it;
37         break;
38     });
39
40     return found;
41 }
42
43 bool tile_check_cross(entity this, vector where)
44 {
45         vector p;
46     vector f = PLIB_FORWARD * tile_check_size;
47     vector r = PLIB_RIGHT   * tile_check_size;
48
49
50     // forward-right
51     p = where + f + r;
52     traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, this);
53     if (!location_isok(trace_endpos, 1, 0))
54         return false;
55
56     // Forward-left
57     p = where + f - r;
58     traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, this);
59     if (!location_isok(trace_endpos, 1, 0))
60         return false;
61
62     // Back-right
63     p = where - f + r;
64     traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, this);
65     if (!location_isok(trace_endpos, 1 ,0))
66         return false;
67
68     //Back-left
69     p = where - f - r;
70     traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, this);
71     if (!location_isok(trace_endpos, 1, 0))
72         return false;
73
74     return true;
75 }
76
77 bool tile_check_plus(entity this, vector where)
78 {
79     vector p;
80
81     vector f = PLIB_FORWARD * tile_check_size;
82     vector r = PLIB_RIGHT   * tile_check_size;
83
84     // forward
85     p = where + f;
86     traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,this);
87     if (!location_isok(trace_endpos,1,0))
88         return false;
89
90
91     //left
92     p = where - r;
93     traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,this);
94     if (!location_isok(trace_endpos,1,0))
95         return false;
96
97     // Right
98     p = where + r;
99     traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,this);
100     if (!location_isok(trace_endpos,1,0))
101         return false;
102
103     //Back
104     p = where - f;
105     traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,this);
106     if (!location_isok(trace_endpos,1,0))
107         return false;
108
109     return true;
110 }
111
112 float tile_check_plus2(entity this, vector where)
113 {
114     vector p;
115     int j = 0, e = 0;
116
117     vector f = PLIB_FORWARD * pathlib_gridsize;
118     vector r = PLIB_RIGHT   * pathlib_gridsize;
119
120 //#define pathlib_node_edgeflag_left    2
121 //#define pathlib_node_edgeflag_right   4
122 //#define pathlib_node_edgeflag_forward 8
123 //#define pathlib_node_edgeflag_back    16
124
125     // forward
126     p = where + f;
127     traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,this);
128     if (location_isok(trace_endpos,1,0))
129     {
130        ++j;
131        e |= pathlib_node_edgeflag_forward;
132     }
133
134
135     //left
136     p = where - r;
137     traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,this);
138     if (location_isok(trace_endpos,1,0))
139     {
140        ++j;
141        e |= pathlib_node_edgeflag_left;
142     }
143
144
145     // Right
146     p = where + r;
147     traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,this);
148     if (location_isok(trace_endpos,1,0))
149     {
150        ++j;
151        e |= pathlib_node_edgeflag_right;
152     }
153
154     //Back
155     p = where - f;
156     traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,this);
157     if (location_isok(trace_endpos,1,0))
158     {
159        ++j;
160        e |= pathlib_node_edgeflag_back;
161     }
162
163     // forward-right
164     p = where + f + r;
165     traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, this);
166     if (location_isok(trace_endpos, 1, 0))
167     {
168        ++j;
169        e |= pathlib_node_edgeflag_forwardright;
170     }
171
172     // Forward-left
173     p = where + f - r;
174     traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, this);
175     if (location_isok(trace_endpos, 1, 0))
176     {
177        ++j;
178        e |= pathlib_node_edgeflag_forwardleft;
179     }
180
181     // Back-right
182     p = where - f + r;
183     traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, this);
184     if (location_isok(trace_endpos, 1 ,0))
185     {
186        ++j;
187        e |= pathlib_node_edgeflag_backright;
188     }
189
190     //Back-left
191     p = where - f - r;
192     traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, this);
193     if (location_isok(trace_endpos, 1, 0))
194     {
195        ++j;
196        e |= pathlib_node_edgeflag_backleft;
197     }
198
199
200     if(j == 0)
201         e = pathlib_node_edgeflag_none;
202
203     return e;
204 }
205
206 bool tile_check_star(entity this, vector where)
207 {
208     if(tile_check_plus(this, where))
209         return tile_check_cross(this, where);
210
211     return false;
212 }
213