#include "utility.qh"
+#include <server/defs.qh>
+#include <server/miscfunctions.qh>
#include "pathlib.qh"
-float location_isok(vector point, float water_isok, float air_isok)
+bool location_isok(vector point, bool waterok, bool air_isok)
{
- float pc,pc2;
-
- if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_SKY)
- return 0;
-
- pc = pointcontents(point);
- pc2 = pointcontents(point - '0 0 1');
-
- switch(pc)
- {
- case CONTENT_SOLID:
- break;
-
- case CONTENT_SLIME:
- break;
-
- case CONTENT_LAVA:
- break;
-
- case CONTENT_SKY:
- break;
-
- case CONTENT_EMPTY:
- if (pc2 == CONTENT_SOLID)
- return 1;
-
- if (pc2 == CONTENT_EMPTY)
- if(air_isok)
- return 1;
-
- if (pc2 == CONTENT_WATER)
- if(water_isok)
- return 1;
-
- break;
-
- case CONTENT_WATER:
- if (water_isok)
- return 1;
-
- break;
- }
-
- return 0;
+ if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_SKY) {
+ return false;
+ }
+
+ int pc = pointcontents(point);
+ int pc2 = pointcontents(point - '0 0 1');
+
+ if (pc == CONTENT_EMPTY && pc2 == CONTENT_SOLID) {
+ return true;
+ }
+ if (pc == CONTENT_EMPTY && pc2 == CONTENT_WATER && waterok) {
+ return true;
+ }
+ if (pc == CONTENT_EMPTY && pc2 == CONTENT_EMPTY && air_isok) {
+ return true;
+ }
+ if (pc == CONTENT_WATER && waterok) {
+ return true;
+ }
+ return false;
}
entity pathlib_nodeatpoint(vector where)
{
- entity node;
+ ++pathlib_searched_cnt;
- ++pathlib_searched_cnt;
+ where.x = fsnap(where.x, pathlib_gridsize);
+ where.y = fsnap(where.y, pathlib_gridsize);
- where.x = fsnap(where.x,pathlib_gridsize);
- where.y = fsnap(where.y,pathlib_gridsize);
+ entity found = NULL; // TODO: using FOREACH_ENTITY_RADIUS here causes mutex loop warnings, this may need a proper fix!
+ IL_EACH(g_pathlib_nodes, it.is_path_node && vdist(it.origin - where, <, pathlib_gridsize * 0.5),
+ {
+ found = it;
+ break;
+ });
- node = findradius(where,pathlib_gridsize * 0.5);
- while(node)
- {
- if(node.is_path_node == true)
- return node;
-
- node = node.chain;
- }
-
- return world;
+ return found;
}
-float tile_check_cross(vector where)
-{SELFPARAM();
- vector p,f,r;
-
- f = PLIB_FORWARD * tile_check_size;
- r = PLIB_RIGHT * tile_check_size;
-
-
- // forward-right
- p = where + f + r;
- traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, self);
- if (!location_isok(trace_endpos, 1, 0))
- return 0;
-
- // Forward-left
- p = where + f - r;
- traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, self);
- if (!location_isok(trace_endpos, 1, 0))
- return 0;
-
- // Back-right
- p = where - f + r;
- traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, self);
- if (!location_isok(trace_endpos, 1 ,0))
- return 0;
-
- //Back-left
- p = where - f - r;
- traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, self);
- if (!location_isok(trace_endpos, 1, 0))
- return 0;
-
- return 1;
+bool tile_check_cross(entity this, vector where)
+{
+ vector p;
+ vector f = PLIB_FORWARD * tile_check_size;
+ vector r = PLIB_RIGHT * tile_check_size;
+
+
+ // forward-right
+ p = where + f + r;
+ traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, this);
+ if (!location_isok(trace_endpos, 1, 0)) {
+ return false;
+ }
+
+ // Forward-left
+ p = where + f - r;
+ traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, this);
+ if (!location_isok(trace_endpos, 1, 0)) {
+ return false;
+ }
+
+ // Back-right
+ p = where - f + r;
+ traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, this);
+ if (!location_isok(trace_endpos, 1, 0)) {
+ return false;
+ }
+
+ // Back-left
+ p = where - f - r;
+ traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, this);
+ if (!location_isok(trace_endpos, 1, 0)) {
+ return false;
+ }
+
+ return true;
}
-float tile_check_plus(vector where)
-{SELFPARAM();
- vector p,f,r;
-
- f = PLIB_FORWARD * tile_check_size;
- r = PLIB_RIGHT * tile_check_size;
-
- // forward
- p = where + f;
- traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,self);
- if (!location_isok(trace_endpos,1,0))
- return 0;
-
-
- //left
- p = where - r;
- traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,self);
- if (!location_isok(trace_endpos,1,0))
- return 0;
-
- // Right
- p = where + r;
- traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,self);
- if (!location_isok(trace_endpos,1,0))
- return 0;
-
- //Back
- p = where - f;
- traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,self);
- if (!location_isok(trace_endpos,1,0))
- return 0;
-
- return 1;
+bool tile_check_plus(entity this, vector where)
+{
+ vector p;
+
+ vector f = PLIB_FORWARD * tile_check_size;
+ vector r = PLIB_RIGHT * tile_check_size;
+
+ // forward
+ p = where + f;
+ traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, this);
+ if (!location_isok(trace_endpos, 1, 0)) {
+ return false;
+ }
+
+
+ // left
+ p = where - r;
+ traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, this);
+ if (!location_isok(trace_endpos, 1, 0)) {
+ return false;
+ }
+
+ // Right
+ p = where + r;
+ traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, this);
+ if (!location_isok(trace_endpos, 1, 0)) {
+ return false;
+ }
+
+ // Back
+ p = where - f;
+ traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, this);
+ if (!location_isok(trace_endpos, 1, 0)) {
+ return false;
+ }
+
+ return true;
}
-float tile_check_plus2(vector where)
-{SELFPARAM();
- vector p,f,r;
- float i = 0, e = 0;
-
- f = PLIB_FORWARD * pathlib_gridsize;
- r = PLIB_RIGHT * pathlib_gridsize;
-
-//#define pathlib_node_edgeflag_left 2
-//#define pathlib_node_edgeflag_right 4
-//#define pathlib_node_edgeflag_forward 8
-//#define pathlib_node_edgeflag_back 16
-
- // forward
- p = where + f;
- traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,self);
- if (location_isok(trace_endpos,1,0))
- {
- ++i;
- e |= pathlib_node_edgeflag_forward;
- }
-
-
- //left
- p = where - r;
- traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,self);
- if (location_isok(trace_endpos,1,0))
- {
- ++i;
- e |= pathlib_node_edgeflag_left;
- }
-
-
- // Right
- p = where + r;
- traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,self);
- if (location_isok(trace_endpos,1,0))
- {
- ++i;
- e |= pathlib_node_edgeflag_right;
- }
-
- //Back
- p = where - f;
- traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,self);
- if (location_isok(trace_endpos,1,0))
- {
- ++i;
- e |= pathlib_node_edgeflag_back;
- }
-
- // forward-right
- p = where + f + r;
- traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, self);
- if (location_isok(trace_endpos, 1, 0))
- {
- ++i;
- e |= pathlib_node_edgeflag_forwardright;
- }
-
- // Forward-left
- p = where + f - r;
- traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, self);
- if (location_isok(trace_endpos, 1, 0))
- {
- ++i;
- e |= pathlib_node_edgeflag_forwardleft;
- }
-
- // Back-right
- p = where - f + r;
- traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, self);
- if (location_isok(trace_endpos, 1 ,0))
- {
- ++i;
- e |= pathlib_node_edgeflag_backright;
- }
-
- //Back-left
- p = where - f - r;
- traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, self);
- if (location_isok(trace_endpos, 1, 0))
- {
- ++i;
- e |= pathlib_node_edgeflag_backleft;
- }
-
-
- if(i == 0)
- e = pathlib_node_edgeflag_none;
-
- return e;
+float tile_check_plus2(entity this, vector where)
+{
+ vector p;
+ int j = 0, e = 0;
+
+ vector f = PLIB_FORWARD * pathlib_gridsize;
+ vector r = PLIB_RIGHT * pathlib_gridsize;
+
+// #define pathlib_node_edgeflag_left 2
+// #define pathlib_node_edgeflag_right 4
+// #define pathlib_node_edgeflag_forward 8
+// #define pathlib_node_edgeflag_back 16
+
+ // forward
+ p = where + f;
+ traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, this);
+ if (location_isok(trace_endpos, 1, 0)) {
+ ++j;
+ e |= pathlib_node_edgeflag_forward;
+ }
+
+
+ // left
+ p = where - r;
+ traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, this);
+ if (location_isok(trace_endpos, 1, 0)) {
+ ++j;
+ e |= pathlib_node_edgeflag_left;
+ }
+
+
+ // Right
+ p = where + r;
+ traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, this);
+ if (location_isok(trace_endpos, 1, 0)) {
+ ++j;
+ e |= pathlib_node_edgeflag_right;
+ }
+
+ // Back
+ p = where - f;
+ traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, this);
+ if (location_isok(trace_endpos, 1, 0)) {
+ ++j;
+ e |= pathlib_node_edgeflag_back;
+ }
+
+ // forward-right
+ p = where + f + r;
+ traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, this);
+ if (location_isok(trace_endpos, 1, 0)) {
+ ++j;
+ e |= pathlib_node_edgeflag_forwardright;
+ }
+
+ // Forward-left
+ p = where + f - r;
+ traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, this);
+ if (location_isok(trace_endpos, 1, 0)) {
+ ++j;
+ e |= pathlib_node_edgeflag_forwardleft;
+ }
+
+ // Back-right
+ p = where - f + r;
+ traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, this);
+ if (location_isok(trace_endpos, 1, 0)) {
+ ++j;
+ e |= pathlib_node_edgeflag_backright;
+ }
+
+ // Back-left
+ p = where - f - r;
+ traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, this);
+ if (location_isok(trace_endpos, 1, 0)) {
+ ++j;
+ e |= pathlib_node_edgeflag_backleft;
+ }
+
+
+ if (j == 0) {
+ e = pathlib_node_edgeflag_none;
+ }
+
+ return e;
}
-float tile_check_star(vector where)
+bool tile_check_star(entity this, vector where)
{
- if(tile_check_plus(where))
- return tile_check_cross(where);
+ if (tile_check_plus(this, where)) {
+ return tile_check_cross(this, where);
+ }
- return 0;
+ return false;
}
-