]> de.git.xonotic.org Git - voretournament/voretournament.git/blob - data/qcsrc/server/pathlib/utility.qc
Initial checkout of Vore Tournament 0.1.alpha.
[voretournament/voretournament.git] / data / qcsrc / server / pathlib / utility.qc
1 float fsnap(float val,float fsize)\r
2 {\r
3     return rint(val / fsize) * fsize;\r
4 }\r
5 \r
6 vector vsnap(vector point,float fsize)\r
7 {\r
8     vector vret;\r
9 \r
10     vret_x = rint(point_x / fsize) * fsize;\r
11     vret_y = rint(point_y / fsize) * fsize;\r
12     vret_z = ceil(point_z / fsize) * fsize;\r
13 \r
14     return vret;\r
15 }\r
16 \r
17 float location_isok(vector point, float water_isok, float air_isok)\r
18 {\r
19     float pc,pc2;\r
20 \r
21     if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_SKY)\r
22         return 0;\r
23 \r
24     pc  = pointcontents(point);\r
25     pc2 = pointcontents(point - '0 0 1');\r
26 \r
27     switch(pc)\r
28     {\r
29         case CONTENT_SOLID:\r
30             break;\r
31 \r
32         case CONTENT_SLIME:\r
33             break;\r
34 \r
35         case CONTENT_LAVA:\r
36             break;\r
37 \r
38         case CONTENT_SKY:\r
39             break;\r
40 \r
41         case CONTENT_EMPTY:\r
42             if (pc2 == CONTENT_SOLID)\r
43                 return 1;\r
44 \r
45             if (pc2 == CONTENT_EMPTY)\r
46                 if(air_isok)\r
47                     return 1;\r
48 \r
49             if (pc2 == CONTENT_WATER)\r
50                 if(water_isok)\r
51                     return 1;\r
52 \r
53             break;\r
54 \r
55         case CONTENT_WATER:\r
56             if (water_isok)\r
57                 return 1;\r
58 \r
59             break;\r
60     }\r
61 \r
62     return 0;\r
63 }\r
64 \r
65 entity pathlib_nodeatpoint(vector where)\r
66 {\r
67     entity node;\r
68 \r
69     ++pathlib_searched_cnt;\r
70 \r
71     where_x = fsnap(where_x,pathlib_gridsize);\r
72     where_y = fsnap(where_y,pathlib_gridsize);\r
73 \r
74     node = findradius(where,pathlib_gridsize * 0.5);\r
75     while(node)\r
76     {\r
77         if(node.is_path_node == TRUE)\r
78             return node;\r
79 \r
80         node = node.chain;\r
81     }\r
82 \r
83     return world;\r
84 }\r
85 \r
86 float tile_check_cross(vector where)\r
87 {\r
88     vector p,f,r;\r
89 \r
90     f = PLIB_FORWARD * tile_check_size;\r
91     r = PLIB_RIGHT   * tile_check_size;\r
92 \r
93     // forward-right\r
94     p = where + f + r;\r
95     traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,self);\r
96     if not (location_isok(trace_endpos,1,0))\r
97         return 0;\r
98 \r
99     // Forward-left\r
100     p = where + f - r;\r
101     traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,self);\r
102     if not (location_isok(trace_endpos,1,0))\r
103         return 0;\r
104 \r
105     // Back-right\r
106     p = where - f + r;\r
107     traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,self);\r
108     if not (location_isok(trace_endpos,1,0))\r
109         return 0;\r
110 \r
111     //Back-left\r
112     p = where - f - r;\r
113     traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,self);\r
114     if not (location_isok(trace_endpos,1,0))\r
115         return 0;\r
116 \r
117     return 1;\r
118 }\r
119 \r
120 float tile_check_plus(vector where)\r
121 {\r
122     vector p,f,r;\r
123 \r
124     f = PLIB_FORWARD * tile_check_size;\r
125     r = PLIB_RIGHT   * tile_check_size;\r
126 \r
127     // forward\r
128     p = where + f;\r
129     traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,self);\r
130     if not (location_isok(trace_endpos,1,0))\r
131         return 0;\r
132 \r
133     //left\r
134     p = where - r;\r
135     traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,self);\r
136     if not (location_isok(trace_endpos,1,0))\r
137         return 0;\r
138 \r
139 \r
140     // Right\r
141     p = where + r;\r
142     traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,self);\r
143     if not (location_isok(trace_endpos,1,0))\r
144         return 0;\r
145 \r
146     //Back\r
147     p = where - f;\r
148     traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,self);\r
149     if not (location_isok(trace_endpos,1,0))\r
150         return 0;\r
151 \r
152     return 1;\r
153 }\r
154 \r
155 float tile_check_star(vector where)\r
156 {\r
157     if(tile_check_plus(where))\r
158         return tile_check_cross(where);\r
159 \r
160     return 0;\r
161 }\r
162 \r