Xonotic
waypoints.qh File Reference
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define SUPPORT_WP   goalentity
 

Functions

void botframe_autowaypoints ()
 
void botframe_showwaypointlinks ()
 
 spawnfunc (waypoint)
 
void waypoint_addlink (entity from, entity to)
 
void waypoint_addlink_customcost (entity from, entity to, float c)
 
void waypoint_clearlinks (entity wp)
 
vector waypoint_fixorigin_down_dir (vector position, entity tracetest_ent, vector down_dir)
 
float waypoint_get_assigned_link_cost (entity w, float i)
 
float waypoint_getlinearcost (float dist)
 
float waypoint_getlinkcost (entity from, entity to)
 
int waypoint_getlinknum (entity from, entity to)
 
float waypoint_gettravelcost (vector from, vector to, entity from_ent, entity to_ent)
 
bool waypoint_has_hardwiredlinks (entity wp)
 
bool waypoint_is_hardwiredlink (entity wp_from, entity wp_to)
 
bool waypoint_islinked (entity from, entity to)
 
void waypoint_load_hardwiredlinks ()
 
bool waypoint_load_links ()
 
float waypoint_loadall ()
 
void waypoint_mark_hardwiredlink (entity wp_from, entity wp_to)
 
void waypoint_remove (entity wp)
 
void waypoint_remove_fromeditor (entity pl)
 
void waypoint_removelink (entity from, entity to)
 
void waypoint_save_links ()
 
void waypoint_saveall ()
 
void waypoint_schedulerelink (entity wp)
 
void waypoint_schedulerelinkall ()
 
entity waypoint_spawn (vector m1, vector m2, float f)
 
void waypoint_spawn_fromeditor (entity pl, bool at_crosshair, bool is_jump_wp, bool is_crouch_wp, bool is_support_wp)
 
void waypoint_spawnforitem (entity e)
 
void waypoint_spawnforitem_force (entity e, vector org)
 
void waypoint_spawnforteleporter (entity e, vector destination, float timetaken, entity tracetest_ent)
 
void waypoint_spawnforteleporter_wz (entity e, entity tracetest_ent)
 
entity waypoint_spawnpersonal (entity this, vector position)
 
void waypoint_think (entity this)
 
void waypoint_unmark_hardwiredlink (entity wp_from, entity wp_to)
 
void waypoint_unreachable (entity pl)
 
void waypoint_updatecost_foralllinks ()
 

Variables

bool autocvar_g_waypointeditor
 
bool autocvar_g_waypointeditor_symmetrical
 
bool autocvar_g_waypointeditor_symmetrical_allowload = true
 
vector autocvar_g_waypointeditor_symmetrical_axis
 
int autocvar_g_waypointeditor_symmetrical_order
 
vector autocvar_g_waypointeditor_symmetrical_origin
 
float botframe_cachedwaypointlinks
 
float botframe_loadedforcedlinks
 
float botframe_waypointeditorlightningtime
 
entity goalentity
 
float relink_lengthculled
 
float relink_pvsculled
 
float relink_total
 
float relink_walkculled
 
string waypoint_time
 
const float WAYPOINT_VERSION = 1.04
 
float waypoint_version_loaded
 
bool waypointeditor_enabled
 
entity wp00
 
entity wp00_original
 
float wp00mincost
 
entity wp01
 
float wp01mincost
 
entity wp02
 
float wp02mincost
 
entity wp03
 
float wp03mincost
 
entity wp04
 
float wp04mincost
 
entity wp05
 
float wp05mincost
 
entity wp06
 
float wp06mincost
 
entity wp07
 
float wp07mincost
 
entity wp08
 
float wp08mincost
 
entity wp09
 
float wp09mincost
 
entity wp10
 
float wp10mincost
 
entity wp11
 
float wp11mincost
 
entity wp12
 
float wp12mincost
 
entity wp13
 
float wp13mincost
 
entity wp14
 
float wp14mincost
 
entity wp15
 
float wp15mincost
 
entity wp16
 
float wp16mincost
 
entity wp17
 
float wp17mincost
 
entity wp18
 
float wp18mincost
 
entity wp19
 
float wp19mincost
 
entity wp20
 
float wp20mincost
 
entity wp21
 
float wp21mincost
 
entity wp22
 
float wp22mincost
 
entity wp23
 
float wp23mincost
 
entity wp24
 
float wp24mincost
 
entity wp25
 
float wp25mincost
 
entity wp26
 
float wp26mincost
 
entity wp27
 
float wp27mincost
 
entity wp28
 
float wp28mincost
 
entity wp29
 
float wp29mincost
 
entity wp30
 
float wp30mincost
 
entity wp31
 
float wp31mincost
 
entity wp_aimed
 
entity wp_locked
 
int wpconsidered
 
float wpcost
 
int wpfire
 
int wpflags
 
entity wphw00
 
entity wphw01
 
entity wphw02
 
entity wphw03
 
entity wphw04
 
entity wphw05
 
entity wphw06
 
entity wphw07
 
int wpisbox
 
int wplinked
 
vector wpnearestpoint
 

Macro Definition Documentation

◆ SUPPORT_WP

#define SUPPORT_WP   goalentity

Definition at line 54 of file waypoints.qh.

Function Documentation

◆ botframe_autowaypoints()

void botframe_autowaypoints ( )

Definition at line 2472 of file waypoints.qc.

References autocvar_g_waypointeditor_auto, botframe_autowaypoints_fix(), botframe_autowaypoints_lastwp1, botframe_deleteuselesswaypoints(), FOREACH_CLIENT, IS_DEAD, IS_PLAYER, and IS_REAL_CLIENT.

Referenced by bot_serverframe().

2473 {
2474  FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it) && !IS_DEAD(it), {
2475  // going back is broken, so only fix waypoints to walk TO the player
2476  //botframe_autowaypoints_fix(p, false, botframe_autowaypoints_lastwp0);
2478  //te_explosion(p.botframe_autowaypoints_lastwp0.origin);
2479  });
2480 
2481  if (autocvar_g_waypointeditor_auto >= 2) {
2483  }
2484 }
#define FOREACH_CLIENT(cond, body)
Definition: utils.qh:49
void botframe_autowaypoints_fix(entity p, float walkfromwp,.entity fld)
Definition: waypoints.qc:2375
#define IS_REAL_CLIENT(v)
Definition: utils.qh:17
int autocvar_g_waypointeditor_auto
Definition: cvars.qh:63
entity botframe_autowaypoints_lastwp1
Definition: waypoints.qc:2471
#define IS_DEAD(s)
Definition: utils.qh:26
void botframe_deleteuselesswaypoints()
Definition: waypoints.qc:2390
#define IS_PLAYER(v)
Definition: utils.qh:9
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ botframe_showwaypointlinks()

void botframe_showwaypointlinks ( )

Definition at line 2156 of file waypoints.qc.

References botframe_waypointeditorlightningtime, entity(), FOREACH_CLIENT, if(), IS_PLAYER, NULL, time, vdist, and vec2.

Referenced by bot_serverframe().

2157 {
2159  return;
2161  FOREACH_CLIENT(IS_PLAYER(it) && !it.isbot,
2162  {
2163  int display_type = 0;
2164  if (wasfreed(it.wp_aimed))
2165  it.wp_aimed = NULL;
2166  if (wasfreed(it.wp_locked))
2167  it.wp_locked = NULL;
2168  entity head = it.wp_locked;
2169  if (!head)
2170  head = navigation_findnearestwaypoint(it, false);
2171  it.nearestwaypoint = head; // mainly useful for debug
2172  it.nearestwaypointtimeout = time + 2; // while I'm at it...
2173  if (IS_ONGROUND(it) || it.waterlevel > WATERLEVEL_NONE || it.wp_locked)
2174  display_type = 1; // default
2175  else if(waypoint_has_hardwiredlinks(head))
2176  display_type = 2; // only hardwired
2177 
2178  if (display_type)
2179  {
2180  //navigation_testtracewalk = true;
2181  //print("currently selected WP is ", etos(head), "\n");
2182  //navigation_testtracewalk = false;
2183  if (head)
2184  {
2185  te_lightning2(NULL, head.origin, it.origin);
2186  if(PHYS_INPUT_BUTTON_CROUCH(it))
2187  waypoint_showlinks_to(head, display_type);
2188  else
2189  waypoint_showlinks_from(head, display_type);
2190  }
2191  }
2192  string str;
2193  entity wp = NULL;
2194  if (vdist(vec2(it.velocity), <, autocvar_sv_maxspeed * 1.1))
2195  {
2196  crosshair_trace_waypoints(it);
2197  if (trace_ent)
2198  {
2199  wp = trace_ent;
2200  if (wp != it.wp_aimed)
2201  {
2202  string wp_type_str = waypoint_get_type_name(wp);
2203  str = sprintf("\necho Entity %d: %s^7, flags: %d, origin: %s\n", etof(wp), wp_type_str, wp.wpflags, vtos(wp.origin));
2204  if (wp.wpisbox)
2205  str = strcat(str, sprintf("echo \" absmin: %s, absmax: %s\"\n", vtos(wp.absmin), vtos(wp.absmax)));
2206  stuffcmd(it, str);
2207  str = sprintf("Entity %d: %s^7\nflags: %d\norigin: %s", etof(wp), wp_type_str, wp.wpflags, vtos(wp.origin));
2208  if (wp.wpisbox)
2209  str = strcat(str, sprintf(" \nabsmin: %s\nabsmax: %s", vtos(wp.absmin), vtos(wp.absmax)));
2210  debug_text_3d(wp.origin, str, 0, 7, '0 0 0');
2211  }
2212  }
2213  }
2214  if (it.wp_aimed != wp)
2215  it.wp_aimed = wp;
2216  });
2217 }
entity() spawn
#define FOREACH_CLIENT(cond, body)
Definition: utils.qh:49
#define NULL
Definition: post.qh:17
#define vdist(v, cmp, f)
Vector distance comparison, avoids sqrt()
Definition: vector.qh:8
#define vec2(...)
Definition: vector.qh:90
float botframe_waypointeditorlightningtime
Definition: waypoints.qh:22
if(IS_DEAD(this))
Definition: impulse.qc:92
float time
Definition: csprogsdefs.qc:16
#define IS_PLAYER(v)
Definition: utils.qh:9
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ spawnfunc()

spawnfunc ( waypoint  )

Definition at line 1294 of file waypoints.qc.

References g_waypoints, IL_PUSH(), make_pure, origin, setorigin(), waypoint_clearlinks(), and waypointeditor_enabled.

1295 {
1296  IL_PUSH(g_waypoints, this);
1297 
1299  setorigin(this, this.origin);
1300  else
1301  make_pure(this);
1302  // schedule a relink after other waypoints have had a chance to spawn
1303  waypoint_clearlinks(this);
1304  //waypoint_schedulerelink(this);
1305 }
origin
Definition: ent_cs.qc:114
bool waypointeditor_enabled
Definition: waypoints.qh:3
ERASEABLE entity IL_PUSH(IntrusiveList this, entity it)
Push to tail.
#define make_pure(e)
Definition: oo.qh:12
IntrusiveList g_waypoints
Definition: api.qh:148
void waypoint_clearlinks(entity wp)
Definition: waypoints.qc:1255
setorigin(ent, v)
+ Here is the call graph for this function:

◆ waypoint_addlink()

void waypoint_addlink ( entity  from,
entity  to 
)

Definition at line 1135 of file waypoints.qc.

References waypoint_addlink_customcost(), waypoint_addlink_for_custom_jumppad(), WAYPOINTFLAG_JUMP, WAYPOINTFLAG_SUPPORT, and WPFLAGMASK_NORELINK.

Referenced by waypoint_load_hardwiredlinks(), waypoint_load_links(), waypoint_restore_hardwiredlinks(), and waypoint_spawn_fromeditor().

1136 {
1137  if ((from.wpflags & WPFLAGMASK_NORELINK) && !(from.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT)))
1139  else
1140  waypoint_addlink_customcost(from, to, -1);
1141 
1142  if (from.wpflags & WAYPOINTFLAG_SUPPORT)
1143  to.SUPPORT_WP = from;
1144 }
const int WAYPOINTFLAG_JUMP
Definition: api.qh:20
const int WPFLAGMASK_NORELINK
Definition: api.qh:29
entity to
Definition: self.qh:96
void waypoint_addlink_customcost(entity from, entity to, float c)
Definition: waypoints.qc:1090
void waypoint_addlink_for_custom_jumppad(entity wp_from, entity wp_to)
Definition: waypoints.qc:500
const int WAYPOINTFLAG_SUPPORT
Definition: api.qh:23
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ waypoint_addlink_customcost()

void waypoint_addlink_customcost ( entity  from,
entity  to,
float  c 
)

Definition at line 1090 of file waypoints.qc.

References to, waypoint_getlinkcost(), waypoint_islinked(), WAYPOINTFLAG_JUMP, WAYPOINTFLAG_SUPPORT, and WPFLAGMASK_NORELINK.

Referenced by waypoint_addlink().

1091 {
1092  if (from == to || waypoint_islinked(from, to))
1093  return;
1094  if (c == -1 && (from.wpflags & WPFLAGMASK_NORELINK) && !(from.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT)))
1095  return;
1096 
1097  if(c == -1)
1098  c = waypoint_getlinkcost(from, to);
1099 
1100  if (from.wp31mincost < c) return;
1101  if (from.wp30mincost < c) {from.wp31 = to;from.wp31mincost = c;return;} from.wp31 = from.wp30;from.wp31mincost = from.wp30mincost;
1102  if (from.wp29mincost < c) {from.wp30 = to;from.wp30mincost = c;return;} from.wp30 = from.wp29;from.wp30mincost = from.wp29mincost;
1103  if (from.wp28mincost < c) {from.wp29 = to;from.wp29mincost = c;return;} from.wp29 = from.wp28;from.wp29mincost = from.wp28mincost;
1104  if (from.wp27mincost < c) {from.wp28 = to;from.wp28mincost = c;return;} from.wp28 = from.wp27;from.wp28mincost = from.wp27mincost;
1105  if (from.wp26mincost < c) {from.wp27 = to;from.wp27mincost = c;return;} from.wp27 = from.wp26;from.wp27mincost = from.wp26mincost;
1106  if (from.wp25mincost < c) {from.wp26 = to;from.wp26mincost = c;return;} from.wp26 = from.wp25;from.wp26mincost = from.wp25mincost;
1107  if (from.wp24mincost < c) {from.wp25 = to;from.wp25mincost = c;return;} from.wp25 = from.wp24;from.wp25mincost = from.wp24mincost;
1108  if (from.wp23mincost < c) {from.wp24 = to;from.wp24mincost = c;return;} from.wp24 = from.wp23;from.wp24mincost = from.wp23mincost;
1109  if (from.wp22mincost < c) {from.wp23 = to;from.wp23mincost = c;return;} from.wp23 = from.wp22;from.wp23mincost = from.wp22mincost;
1110  if (from.wp21mincost < c) {from.wp22 = to;from.wp22mincost = c;return;} from.wp22 = from.wp21;from.wp22mincost = from.wp21mincost;
1111  if (from.wp20mincost < c) {from.wp21 = to;from.wp21mincost = c;return;} from.wp21 = from.wp20;from.wp21mincost = from.wp20mincost;
1112  if (from.wp19mincost < c) {from.wp20 = to;from.wp20mincost = c;return;} from.wp20 = from.wp19;from.wp20mincost = from.wp19mincost;
1113  if (from.wp18mincost < c) {from.wp19 = to;from.wp19mincost = c;return;} from.wp19 = from.wp18;from.wp19mincost = from.wp18mincost;
1114  if (from.wp17mincost < c) {from.wp18 = to;from.wp18mincost = c;return;} from.wp18 = from.wp17;from.wp18mincost = from.wp17mincost;
1115  if (from.wp16mincost < c) {from.wp17 = to;from.wp17mincost = c;return;} from.wp17 = from.wp16;from.wp17mincost = from.wp16mincost;
1116  if (from.wp15mincost < c) {from.wp16 = to;from.wp16mincost = c;return;} from.wp16 = from.wp15;from.wp16mincost = from.wp15mincost;
1117  if (from.wp14mincost < c) {from.wp15 = to;from.wp15mincost = c;return;} from.wp15 = from.wp14;from.wp15mincost = from.wp14mincost;
1118  if (from.wp13mincost < c) {from.wp14 = to;from.wp14mincost = c;return;} from.wp14 = from.wp13;from.wp14mincost = from.wp13mincost;
1119  if (from.wp12mincost < c) {from.wp13 = to;from.wp13mincost = c;return;} from.wp13 = from.wp12;from.wp13mincost = from.wp12mincost;
1120  if (from.wp11mincost < c) {from.wp12 = to;from.wp12mincost = c;return;} from.wp12 = from.wp11;from.wp12mincost = from.wp11mincost;
1121  if (from.wp10mincost < c) {from.wp11 = to;from.wp11mincost = c;return;} from.wp11 = from.wp10;from.wp11mincost = from.wp10mincost;
1122  if (from.wp09mincost < c) {from.wp10 = to;from.wp10mincost = c;return;} from.wp10 = from.wp09;from.wp10mincost = from.wp09mincost;
1123  if (from.wp08mincost < c) {from.wp09 = to;from.wp09mincost = c;return;} from.wp09 = from.wp08;from.wp09mincost = from.wp08mincost;
1124  if (from.wp07mincost < c) {from.wp08 = to;from.wp08mincost = c;return;} from.wp08 = from.wp07;from.wp08mincost = from.wp07mincost;
1125  if (from.wp06mincost < c) {from.wp07 = to;from.wp07mincost = c;return;} from.wp07 = from.wp06;from.wp07mincost = from.wp06mincost;
1126  if (from.wp05mincost < c) {from.wp06 = to;from.wp06mincost = c;return;} from.wp06 = from.wp05;from.wp06mincost = from.wp05mincost;
1127  if (from.wp04mincost < c) {from.wp05 = to;from.wp05mincost = c;return;} from.wp05 = from.wp04;from.wp05mincost = from.wp04mincost;
1128  if (from.wp03mincost < c) {from.wp04 = to;from.wp04mincost = c;return;} from.wp04 = from.wp03;from.wp04mincost = from.wp03mincost;
1129  if (from.wp02mincost < c) {from.wp03 = to;from.wp03mincost = c;return;} from.wp03 = from.wp02;from.wp03mincost = from.wp02mincost;
1130  if (from.wp01mincost < c) {from.wp02 = to;from.wp02mincost = c;return;} from.wp02 = from.wp01;from.wp02mincost = from.wp01mincost;
1131  if (from.wp00mincost < c) {from.wp01 = to;from.wp01mincost = c;return;} from.wp01 = from.wp00;from.wp01mincost = from.wp00mincost;
1132  from.wp00 = to;from.wp00mincost = c;return;
1133 }
const int WAYPOINTFLAG_JUMP
Definition: api.qh:20
bool waypoint_islinked(entity from, entity to)
Definition: waypoints.qc:968
float waypoint_getlinkcost(entity from, entity to)
Definition: waypoints.qc:1067
const int WPFLAGMASK_NORELINK
Definition: api.qh:29
entity to
Definition: self.qh:96
const int WAYPOINTFLAG_SUPPORT
Definition: api.qh:23
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ waypoint_clearlinks()

void waypoint_clearlinks ( entity  wp)

Definition at line 1255 of file waypoints.qc.

References NULL.

Referenced by spawnfunc(), waypoint_schedulerelink(), and waypoint_spawn().

1256 {
1257  // clear links to other waypoints
1258  float f = 10000000;
1259  wp.wp00 = wp.wp01 = wp.wp02 = wp.wp03 = wp.wp04 = wp.wp05 = wp.wp06 = wp.wp07 = NULL;
1260  wp.wp08 = wp.wp09 = wp.wp10 = wp.wp11 = wp.wp12 = wp.wp13 = wp.wp14 = wp.wp15 = NULL;
1261  wp.wp16 = wp.wp17 = wp.wp18 = wp.wp19 = wp.wp20 = wp.wp21 = wp.wp22 = wp.wp23 = NULL;
1262  wp.wp24 = wp.wp25 = wp.wp26 = wp.wp27 = wp.wp28 = wp.wp29 = wp.wp30 = wp.wp31 = NULL;
1263 
1264  wp.wp00mincost = wp.wp01mincost = wp.wp02mincost = wp.wp03mincost = wp.wp04mincost = wp.wp05mincost = wp.wp06mincost = wp.wp07mincost = f;
1265  wp.wp08mincost = wp.wp09mincost = wp.wp10mincost = wp.wp11mincost = wp.wp12mincost = wp.wp13mincost = wp.wp14mincost = wp.wp15mincost = f;
1266  wp.wp16mincost = wp.wp17mincost = wp.wp18mincost = wp.wp19mincost = wp.wp20mincost = wp.wp21mincost = wp.wp22mincost = wp.wp23mincost = f;
1267  wp.wp24mincost = wp.wp25mincost = wp.wp26mincost = wp.wp27mincost = wp.wp28mincost = wp.wp29mincost = wp.wp30mincost = wp.wp31mincost = f;
1268 
1269  // don't remove references to hardwired links (.wphwXX fields)
1270 
1271  wp.wplinked = false;
1272 }
#define NULL
Definition: post.qh:17
+ Here is the caller graph for this function:

◆ waypoint_fixorigin_down_dir()

vector waypoint_fixorigin_down_dir ( vector  position,
entity  tracetest_ent,
vector  down_dir 
)

Definition at line 1965 of file waypoints.qc.

References MOVE_NOMONSTERS, trace_endpos, trace_fraction, trace_startsolid, and vector().

Referenced by waypoint_spawnforteleporter_wz().

1966 {
1967  vector endpos = position + down_dir * 3000;
1968  tracebox(position + '0 0 1', PL_MIN_CONST, PL_MAX_CONST, endpos, MOVE_NOMONSTERS, tracetest_ent);
1969  if(trace_startsolid)
1970  tracebox(position + '0 0 1' * (1 - PL_MIN_CONST.z / 2), PL_MIN_CONST, PL_MAX_CONST, endpos, MOVE_NOMONSTERS, tracetest_ent);
1971  if(trace_startsolid)
1972  tracebox(position + '0 0 1' * (1 - PL_MIN_CONST.z), PL_MIN_CONST, PL_MAX_CONST, endpos, MOVE_NOMONSTERS, tracetest_ent);
1973  if(trace_fraction < 1)
1974  position = trace_endpos;
1975  return position;
1976 }
const float MOVE_NOMONSTERS
Definition: csprogsdefs.qc:253
vector trace_endpos
Definition: csprogsdefs.qc:37
vector(float skel, float bonenum) _skel_get_boneabs_hidden
float trace_startsolid
Definition: csprogsdefs.qc:35
float trace_fraction
Definition: csprogsdefs.qc:36
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ waypoint_get_assigned_link_cost()

float waypoint_get_assigned_link_cost ( entity  w,
float  i 
)

Definition at line 1586 of file waypoints.qc.

1587 {
1588  switch(i)
1589  {
1590  case 0: return w.wp00mincost;
1591  case 1: return w.wp01mincost;
1592  case 2: return w.wp02mincost;
1593  case 3: return w.wp03mincost;
1594  case 4: return w.wp04mincost;
1595  case 5: return w.wp05mincost;
1596  case 6: return w.wp06mincost;
1597  case 7: return w.wp07mincost;
1598  case 8: return w.wp08mincost;
1599  case 9: return w.wp09mincost;
1600  case 10: return w.wp10mincost;
1601  case 11: return w.wp11mincost;
1602  case 12: return w.wp12mincost;
1603  case 13: return w.wp13mincost;
1604  case 14: return w.wp14mincost;
1605  case 15: return w.wp15mincost;
1606  case 16: return w.wp16mincost;
1607  case 17: return w.wp17mincost;
1608  case 18: return w.wp18mincost;
1609  case 19: return w.wp19mincost;
1610  case 20: return w.wp20mincost;
1611  case 21: return w.wp21mincost;
1612  case 22: return w.wp22mincost;
1613  case 23: return w.wp23mincost;
1614  case 24: return w.wp24mincost;
1615  case 25: return w.wp25mincost;
1616  case 26: return w.wp26mincost;
1617  case 27: return w.wp27mincost;
1618  case 28: return w.wp28mincost;
1619  case 29: return w.wp29mincost;
1620  case 30: return w.wp30mincost;
1621  case 31: return w.wp31mincost;
1622  default: return -1;
1623  }
1624 }

◆ waypoint_getlinearcost()

float waypoint_getlinearcost ( float  dist)

Definition at line 1012 of file waypoints.qc.

References autocvar_bot_ai_bunnyhop_skilloffset, and skill.

Referenced by func_ladder_think(), navigation_routerating(), and waypoint_gettravelcost().

1013 {
1015  return dist / (autocvar_sv_maxspeed * 1.25);
1016  return dist / autocvar_sv_maxspeed;
1017 }
float skill
Definition: api.qh:35
float autocvar_bot_ai_bunnyhop_skilloffset
Definition: cvars.qh:22
+ Here is the caller graph for this function:

◆ waypoint_getlinkcost()

float waypoint_getlinkcost ( entity  from,
entity  to 
)

Definition at line 1067 of file waypoints.qc.

References bound(), vector(), and waypoint_gettravelcost().

Referenced by waypoint_addlink_customcost().

1068 {
1069  vector v1 = from.origin;
1070  vector v2 = to.origin;
1071  if (from.wpisbox)
1072  {
1073  vector m1 = from.absmin, m2 = from.absmax;
1074  v1.x = bound(m1.x, v2.x, m2.x);
1075  v1.y = bound(m1.y, v2.y, m2.y);
1076  v1.z = bound(m1.z, v2.z, m2.z);
1077  }
1078  if (to.wpisbox)
1079  {
1080  vector m1 = to.absmin, m2 = to.absmax;
1081  v2.x = bound(m1.x, v1.x, m2.x);
1082  v2.y = bound(m1.y, v1.y, m2.y);
1083  v2.z = bound(m1.z, v1.z, m2.z);
1084  }
1085  return waypoint_gettravelcost(v1, v2, from, to);
1086 }
float waypoint_gettravelcost(vector from, vector to, entity from_ent, entity to_ent)
Definition: waypoints.qc:1030
entity to
Definition: self.qh:96
vector(float skel, float bonenum) _skel_get_boneabs_hidden
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ waypoint_getlinknum()

int waypoint_getlinknum ( entity  from,
entity  to 
)

Definition at line 955 of file waypoints.qc.

Referenced by waypoint_islinked(), and waypoint_removelink().

956 {
957  if (from.wp00 == to) return 0; if (from.wp01 == to) return 1; if (from.wp02 == to) return 2; if (from.wp03 == to) return 3;
958  if (from.wp04 == to) return 4; if (from.wp05 == to) return 5; if (from.wp06 == to) return 6; if (from.wp07 == to) return 7;
959  if (from.wp08 == to) return 8; if (from.wp09 == to) return 9; if (from.wp10 == to) return 10; if (from.wp11 == to) return 11;
960  if (from.wp12 == to) return 12; if (from.wp13 == to) return 13; if (from.wp14 == to) return 14; if (from.wp15 == to) return 15;
961  if (from.wp16 == to) return 16; if (from.wp17 == to) return 17; if (from.wp18 == to) return 18; if (from.wp19 == to) return 19;
962  if (from.wp20 == to) return 20; if (from.wp21 == to) return 21; if (from.wp22 == to) return 22; if (from.wp23 == to) return 23;
963  if (from.wp24 == to) return 24; if (from.wp25 == to) return 25; if (from.wp26 == to) return 26; if (from.wp27 == to) return 27;
964  if (from.wp28 == to) return 28; if (from.wp29 == to) return 29; if (from.wp30 == to) return 30; if (from.wp31 == to) return 31;
965  return -1;
966 }
entity to
Definition: self.qh:96
+ Here is the caller graph for this function:

◆ waypoint_gettravelcost()

float waypoint_gettravelcost ( vector  from,
vector  to,
entity  from_ent,
entity  to_ent 
)

Definition at line 1030 of file waypoints.qc.

References height, jumpheight_time, jumpheight_vec, navigation_check_submerged_state(), sqrt(), vec2, vlen(), waypoint_getlinearcost(), waypoint_getlinearcost_crouched(), waypoint_getlinearcost_underwater(), WAYPOINTFLAG_CROUCH, and WAYPOINTFLAG_JUMP.

Referenced by navigation_markroutes_checkwaypoint(), navigation_routerating(), and waypoint_getlinkcost().

1031 {
1032  bool submerged_from = navigation_check_submerged_state(from_ent, from);
1033  bool submerged_to = navigation_check_submerged_state(to_ent, to);
1034 
1035  if (submerged_from && submerged_to)
1036  return waypoint_getlinearcost_underwater(vlen(to - from));
1037 
1038  if ((from_ent.wpflags & WAYPOINTFLAG_CROUCH) && (to_ent.wpflags & WAYPOINTFLAG_CROUCH))
1039  return waypoint_getlinearcost_crouched(vlen(to - from));
1040 
1041  float c = waypoint_getlinearcost(vlen(to - from));
1042 
1043  float height = from.z - to.z;
1044  if(height > jumpheight_vec.z && autocvar_sv_gravity > 0)
1045  {
1046  float height_cost; // fall cost
1047  if (from_ent.wpflags & WAYPOINTFLAG_JUMP)
1048  height_cost = jumpheight_time + sqrt((height + jumpheight_vec.z) / (autocvar_sv_gravity / 2));
1049  else
1050  height_cost = sqrt(height / (autocvar_sv_gravity / 2));
1051  c = waypoint_getlinearcost(vlen(vec2(to - from))); // xy distance cost
1052  if(height_cost > c)
1053  c = height_cost;
1054  }
1055 
1056  // consider half path underwater
1057  if (submerged_from || submerged_to)
1058  return (c + waypoint_getlinearcost_underwater(vlen(to - from))) / 2;
1059 
1060  // consider half path crouched
1061  if ((from_ent.wpflags & WAYPOINTFLAG_CROUCH) || (to_ent.wpflags & WAYPOINTFLAG_CROUCH))
1062  return (c + waypoint_getlinearcost_crouched(vlen(to - from))) / 2;
1063 
1064  return c;
1065 }
const int WAYPOINTFLAG_CROUCH
Definition: api.qh:22
float waypoint_getlinearcost_underwater(float dist)
Definition: waypoints.qc:1019
const int WAYPOINTFLAG_JUMP
Definition: api.qh:20
entity to
Definition: self.qh:96
float height
Definition: jumppads.qh:12
float waypoint_getlinearcost_crouched(float dist)
Definition: waypoints.qc:1025
float waypoint_getlinearcost(float dist)
Definition: waypoints.qc:1012
#define vec2(...)
Definition: vector.qh:90
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ waypoint_has_hardwiredlinks()

bool waypoint_has_hardwiredlinks ( entity  wp)

Definition at line 274 of file waypoints.qc.

References NULL.

Referenced by waypoint_get_type_name(), waypoint_remove_fromeditor(), waypoint_save_hardwiredlinks(), and waypoint_setupmodel().

275 {
276  if (!wp)
277  return false;
278  return (wp.wphw00 != NULL);
279 }
#define NULL
Definition: post.qh:17
+ Here is the caller graph for this function:

◆ waypoint_is_hardwiredlink()

bool waypoint_is_hardwiredlink ( entity  wp_from,
entity  wp_to 
)

Definition at line 281 of file waypoints.qc.

References entity(), and waypoint_setupmodel().

Referenced by havocbot_movetogoal(), waypoint_remove(), waypoint_save_hardwiredlinks(), waypoint_showlink(), and waypoint_spawn_fromeditor().

282 {
283  if (!(wp_from && wp_to))
284  return false;
285 
286  if (!wp_from.wphw00) return false; else if (wp_from.wphw00 == wp_to) return true;
287  if (!wp_from.wphw01) return false; else if (wp_from.wphw01 == wp_to) return true;
288  if (!wp_from.wphw02) return false; else if (wp_from.wphw02 == wp_to) return true;
289  if (!wp_from.wphw03) return false; else if (wp_from.wphw03 == wp_to) return true;
290  if (!wp_from.wphw04) return false; else if (wp_from.wphw04 == wp_to) return true;
291  if (!wp_from.wphw05) return false; else if (wp_from.wphw05 == wp_to) return true;
292  if (!wp_from.wphw06) return false; else if (wp_from.wphw06 == wp_to) return true;
293  if (!wp_from.wphw07) return false; else if (wp_from.wphw07 == wp_to) return true;
294 
295  return false;
296 }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ waypoint_islinked()

bool waypoint_islinked ( entity  from,
entity  to 
)

Definition at line 968 of file waypoints.qc.

References waypoint_getlinknum().

Referenced by waypoint_addlink_customcost(), waypoint_remove(), waypoint_showlinks_to(), and waypoint_spawn_fromeditor().

969 {
970  return (waypoint_getlinknum(from, to) >= 0);
971 }
entity to
Definition: self.qh:96
int waypoint_getlinknum(entity from, entity to)
Definition: waypoints.qc:955
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ waypoint_load_hardwiredlinks()

void waypoint_load_hardwiredlinks ( )

Definition at line 1470 of file waypoints.qc.

References argv(), botframe_loadedforcedlinks, entity(), fclose(), fgets(), FILE_READ, fopen(), ftos(), GET_GAMETYPE_EXTENSION, LOG_INFO, LOG_TRACE, mapname, NULL, stov(), strcat(), substring(), tokenizebyseparator, vdist, vector(), waypoint_addlink(), waypoint_mark_hardwiredlink(), WAYPOINTFLAG_JUMP, WAYPOINTFLAG_SUPPORT, WAYPOINTFLAG_TELEPORT, and WPFLAGMASK_NORELINK.

Referenced by bot_serverframe(), and waypoint_schedulerelinkall().

1471 {
1472  string s;
1473  float file, tokens, c = 0, found;
1474  entity wp_from = NULL, wp_to;
1475  vector wp_to_pos, wp_from_pos;
1476 
1477  string gt_ext = GET_GAMETYPE_EXTENSION();
1478 
1479  string filename = sprintf("maps/%s.waypoints.hardwired", strcat(mapname, gt_ext));
1480  file = fopen(filename, FILE_READ);
1481 
1482  if (gt_ext != "" && file < 0)
1483  {
1484  // if race waypoint file doesn't exist load the default one
1485  filename = sprintf("maps/%s.waypoints.hardwired", mapname);
1486  file = fopen(filename, FILE_READ);
1487  }
1488 
1490 
1491  if (file < 0)
1492  {
1493  LOG_TRACE("waypoint links load from ", filename, " failed");
1494  return;
1495  }
1496 
1497  bool is_special = false;
1498  while ((s = fgets(file)))
1499  {
1500  if(substring(s, 0, 2)=="//")
1501  continue;
1502 
1503  if(substring(s, 0, 1)=="#")
1504  continue;
1505 
1506  // special links start with *, so old xonotic versions don't load them
1507  is_special = false;
1508  if (substring(s, 0, 1) == "*")
1509  {
1510  is_special = true;
1511  s = substring(s, 1, -1);
1512  }
1513 
1514  tokens = tokenizebyseparator(s, "*");
1515 
1516  if (tokens!=2)
1517  continue;
1518 
1519  wp_from_pos = stov(argv(0));
1520  wp_to_pos = stov(argv(1));
1521 
1522  // Search "from" waypoint
1523  if(!wp_from || wp_from.origin!=wp_from_pos)
1524  {
1525  wp_from = findradius(wp_from_pos, 5);
1526  found = false;
1527  while(wp_from)
1528  {
1529  if(vdist(wp_from.origin - wp_from_pos, <, 5))
1530  if(wp_from.classname == "waypoint")
1531  {
1532  found = true;
1533  break;
1534  }
1535  wp_from = wp_from.chain;
1536  }
1537 
1538  if(!found)
1539  {
1540  s = strcat(((is_special) ? "special link " : "hardwired link "), s);
1541  LOG_INFO("NOTICE: Can not find origin waypoint of the ", s, ". Path skipped");
1542  continue;
1543  }
1544  }
1545 
1546  // Search "to" waypoint
1547  wp_to = findradius(wp_to_pos, 5);
1548  found = false;
1549  while(wp_to)
1550  {
1551  if(vdist(wp_to.origin - wp_to_pos, <, 5))
1552  if(wp_to.classname == "waypoint")
1553  {
1554  found = true;
1555  break;
1556  }
1557  wp_to = wp_to.chain;
1558  }
1559 
1560  if(!found)
1561  {
1562  s = strcat(((is_special) ? "special link " : "hardwired link "), s);
1563  LOG_INFO("NOTICE: Can not find destination waypoint of the ", s, ". Path skipped");
1564  continue;
1565  }
1566 
1567  ++c;
1568 
1569  if (!is_special)
1570  {
1571  waypoint_addlink(wp_from, wp_to);
1572  waypoint_mark_hardwiredlink(wp_from, wp_to);
1573  } else if (wp_from.wpflags & WPFLAGMASK_NORELINK
1574  && ((wp_from.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT))
1575  || (wp_from.wpisbox && wp_from.wpflags & WAYPOINTFLAG_TELEPORT)))
1576  {
1577  waypoint_addlink(wp_from, wp_to);
1578  }
1579  }
1580 
1581  fclose(file);
1582 
1583  LOG_TRACE("loaded ", ftos(c), " waypoint links from maps/", mapname, ".waypoints.hardwired");
1584 }
float botframe_loadedforcedlinks
Definition: waypoints.qh:23
void waypoint_mark_hardwiredlink(entity wp_from, entity wp_to)
Definition: waypoints.qc:299
entity() spawn
const int WAYPOINTFLAG_JUMP
Definition: api.qh:20
const float FILE_READ
Definition: csprogsdefs.qc:231
const int WPFLAGMASK_NORELINK
Definition: api.qh:29
string mapname
Definition: csprogsdefs.qc:26
#define GET_GAMETYPE_EXTENSION()
Definition: waypoints.qc:1319
const int WAYPOINTFLAG_TELEPORT
Definition: api.qh:13
spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 f1 s1 strcat(_("Level %s: "), "^BG%s\3\, _("^BGPress ^F2%s^BG to enter the game"))
#define NULL
Definition: post.qh:17
#define LOG_INFO(...)
Definition: log.qh:70
vector(float skel, float bonenum) _skel_get_boneabs_hidden
void waypoint_addlink(entity from, entity to)
Definition: waypoints.qc:1135
#define vdist(v, cmp, f)
Vector distance comparison, avoids sqrt()
Definition: vector.qh:8
#define LOG_TRACE(...)
Definition: log.qh:81
#define tokenizebyseparator
Definition: dpextensions.qh:21
const int WAYPOINTFLAG_SUPPORT
Definition: api.qh:23
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ waypoint_load_links()

bool waypoint_load_links ( )

Definition at line 1322 of file waypoints.qc.

References argv(), botframe_cachedwaypointlinks, entity(), fclose(), fgets(), FILE_READ, fopen(), ftos(), g_assault, g_waypoints, GET_GAMETYPE_EXTENSION, IL_EACH, LOG_TRACE, mapname, NULL, stof(), stov(), strcat(), string_null, substring(), tokenizebyseparator, vdist, vector(), vtos(), waypoint_addlink(), waypoint_schedulerelinkall(), waypoint_time, WAYPOINT_VERSION, WAYPOINTFLAG_CUSTOM_JP, and WAYPOINTFLAG_ITEM.

Referenced by bot_serverframe().

1323 {
1324  string s;
1325  float file, tokens, c = 0, found;
1326  entity wp_from = NULL, wp_to;
1327  vector wp_to_pos, wp_from_pos;
1328 
1329  string gt_ext = GET_GAMETYPE_EXTENSION();
1330 
1331  string filename = sprintf("maps/%s.waypoints.cache", strcat(mapname, gt_ext));
1332  file = fopen(filename, FILE_READ);
1333 
1334  if (gt_ext != "" && file < 0)
1335  {
1336  // if race waypoint file doesn't exist load the default one
1337  filename = sprintf("maps/%s.waypoints.cache", mapname);
1338  file = fopen(filename, FILE_READ);
1339  }
1340 
1341  if (file < 0)
1342  {
1343  LOG_TRACE("waypoint links load from ", filename, " failed");
1345  return false;
1346  }
1347 
1348  bool parse_comments = true;
1349  float ver = 0;
1350  string links_time = string_null;
1351 
1352  while ((s = fgets(file)))
1353  {
1354  if(parse_comments)
1355  {
1356  if(substring(s, 0, 2) == "//")
1357  {
1358  if(substring(s, 2, 17) == "WAYPOINT_VERSION ")
1359  ver = stof(substring(s, 19, -1));
1360  else if(substring(s, 2, 14) == "WAYPOINT_TIME ")
1361  links_time = substring(s, 16, -1);
1362  continue;
1363  }
1364  else
1365  {
1366  if(ver < WAYPOINT_VERSION || links_time != waypoint_time)
1367  {
1368  if (links_time != waypoint_time)
1369  LOG_TRACE("waypoint links for this map are not made for these waypoints.");
1370  else
1371  LOG_TRACE("waypoint links for this map are outdated.");
1372  if (g_assault)
1373  {
1374  LOG_TRACE("Assault waypoint links need to be manually updated in the editor");
1375  }
1376  else
1377  {
1378  LOG_TRACE("automatically updating...");
1380  fclose(file);
1381  return false;
1382  }
1383  }
1384  parse_comments = false;
1385  }
1386  }
1387 
1388  tokens = tokenizebyseparator(s, "*");
1389 
1390  if (tokens!=2)
1391  {
1392  // bad file format
1393  fclose(file);
1394  waypoint_schedulerelinkall(); // link all the autogenerated waypoints (teleporters)
1395  return false;
1396  }
1397 
1398  wp_from_pos = stov(argv(0));
1399  wp_to_pos = stov(argv(1));
1400 
1401  // Search "from" waypoint
1402  if(!wp_from || wp_from.origin!=wp_from_pos)
1403  {
1404  wp_from = findradius(wp_from_pos, 1);
1405  found = false;
1406  while(wp_from)
1407  {
1408  if(vdist(wp_from.origin - wp_from_pos, <, 1))
1409  if(wp_from.classname == "waypoint")
1410  {
1411  found = true;
1412  break;
1413  }
1414  wp_from = wp_from.chain;
1415  }
1416 
1417  if(!found)
1418  {
1419  LOG_TRACE("waypoint_load_links: couldn't find 'from' waypoint at ", vtos(wp_from_pos));
1420  continue;
1421  }
1422  }
1423 
1424  // Search "to" waypoint
1425  wp_to = findradius(wp_to_pos, 1);
1426  found = false;
1427  while(wp_to)
1428  {
1429  if(vdist(wp_to.origin - wp_to_pos, <, 1))
1430  if(wp_to.classname == "waypoint")
1431  {
1432  found = true;
1433  break;
1434  }
1435  wp_to = wp_to.chain;
1436  }
1437 
1438  if(!found)
1439  {
1440  LOG_TRACE("waypoint_load_links: couldn't find 'to' waypoint at ", vtos(wp_to_pos));
1441  continue;
1442  }
1443 
1444  ++c;
1445  waypoint_addlink(wp_from, wp_to);
1446  if (wp_from.wp00_original && wp_from.wp00_original != wp_from.wp00)
1447  wp_from.wpflags |= WAYPOINTFLAG_CUSTOM_JP;
1448  }
1449 
1450  fclose(file);
1451 
1452  LOG_TRACE("loaded ", ftos(c), " waypoint links from ", filename);
1453 
1454  bool scheduled = false;
1455  IL_EACH(g_waypoints, it.wpflags & WAYPOINTFLAG_ITEM,
1456  {
1457  if (!it.wp00)
1458  {
1459  waypoint_schedulerelink(it);
1460  scheduled = true;
1461  }
1462  });
1463  if (scheduled)
1464  return false;
1465 
1467  return true;
1468 }
#define IL_EACH(this, cond, body)
string string_null
Definition: nil.qh:9
entity() spawn
const float FILE_READ
Definition: csprogsdefs.qc:231
float botframe_cachedwaypointlinks
Definition: waypoints.qh:24
string mapname
Definition: csprogsdefs.qc:26
#define GET_GAMETYPE_EXTENSION()
Definition: waypoints.qc:1319
spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 f1 s1 strcat(_("Level %s: "), "^BG%s\3\, _("^BGPress ^F2%s^BG to enter the game"))
#define g_assault
Definition: assault.qh:27
void waypoint_schedulerelinkall()
Definition: waypoints.qc:1309
#define NULL
Definition: post.qh:17
string waypoint_time
Definition: waypoints.qh:17
IntrusiveList g_waypoints
Definition: api.qh:148
vector(float skel, float bonenum) _skel_get_boneabs_hidden
void waypoint_addlink(entity from, entity to)
Definition: waypoints.qc:1135
#define vdist(v, cmp, f)
Vector distance comparison, avoids sqrt()
Definition: vector.qh:8
#define LOG_TRACE(...)
Definition: log.qh:81
#define tokenizebyseparator
Definition: dpextensions.qh:21
const int WAYPOINTFLAG_ITEM
Definition: api.qh:12
const int WAYPOINTFLAG_CUSTOM_JP
Definition: api.qh:21
const float WAYPOINT_VERSION
Definition: waypoints.qh:15
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ waypoint_loadall()

float waypoint_loadall ( )

Definition at line 1842 of file waypoints.qc.

References argv(), autocvar_g_waypointeditor_symmetrical_allowload, cons(), cvar_set(), cvar_string(), fclose(), fgets(), FILE_READ, floor(), fopen(), ftos(), GET_GAMETYPE_EXTENSION, LOG_INFO, LOG_INFOF, LOG_TRACE, mapname, stof(), stov(), strcat(), strcpy, substring(), tokenizebyseparator, vector(), waypoint_spawn(), waypoint_time, WAYPOINT_VERSION, waypoint_version_loaded, waypointeditor_enabled, and WAYPOINTFLAG_NORELINK__DEPRECATED.

Referenced by bot_serverframe().

1843 {
1844  string s;
1845  int file, cwp, cwb, fl;
1846  vector m1, m2;
1847  cwp = 0;
1848  cwb = 0;
1849 
1850  string gt_ext = GET_GAMETYPE_EXTENSION();
1851 
1852  string filename = sprintf("maps/%s.waypoints", strcat(mapname, gt_ext));
1853  file = fopen(filename, FILE_READ);
1854 
1855  if (gt_ext != "" && file < 0)
1856  {
1857  // if race waypoint file doesn't exist load the default one
1858  filename = sprintf("maps/%s.waypoints", mapname);
1859  file = fopen(filename, FILE_READ);
1860  }
1861 
1862  if (file < 0)
1863  {
1864  LOG_TRACE("waypoint load from ", filename, " failed");
1865  return 0;
1866  }
1867 
1868  bool parse_comments = true;
1869  float ver = 0;
1870  float sym = 0;
1871  float sym_param1 = 0, sym_param2 = 0, sym_param3 = 0;
1872 
1873  while ((s = fgets(file)))
1874  {
1875  if(parse_comments)
1876  {
1877  if(substring(s, 0, 2) == "//")
1878  {
1879  if(substring(s, 2, 17) == "WAYPOINT_VERSION ")
1880  ver = stof(substring(s, 19, -1));
1881  else if(substring(s, 2, 18) == "WAYPOINT_SYMMETRY ")
1882  {
1883  int tokens = tokenizebyseparator(substring(s, 20, -1), " ");
1884  if (tokens) { sym = stof(argv(0)); }
1885  if (tokens > 1) { sym_param1 = stof(argv(1)); }
1886  if (tokens > 2) { sym_param2 = stof(argv(2)); }
1887  if (tokens > 3) { sym_param3 = stof(argv(3)); }
1888  }
1889  else if(substring(s, 2, 14) == "WAYPOINT_TIME ")
1890  strcpy(waypoint_time, substring(s, 16, -1));
1891  continue;
1892  }
1893  else
1894  {
1895  if(floor(ver) < floor(WAYPOINT_VERSION))
1896  {
1897  LOG_TRACE("waypoints for this map are outdated");
1898  LOG_TRACE("please update them in the editor");
1899  }
1900  parse_comments = false;
1901  }
1902  }
1903  m1 = stov(s);
1904  s = fgets(file);
1905  if (!s)
1906  break;
1907  m2 = stov(s);
1908  s = fgets(file);
1909  if (!s)
1910  break;
1911  fl = stof(s);
1913  waypoint_spawn(m1, m2, fl);
1914  if (m1 == m2)
1915  cwp = cwp + 1;
1916  else
1917  cwb = cwb + 1;
1918  }
1919  fclose(file);
1921  LOG_TRACE("loaded ", ftos(cwp), " waypoints and ", ftos(cwb), " wayboxes from maps/", mapname, ".waypoints");
1922 
1924  {
1925  string sym_str = "";
1926  cvar_set("g_waypointeditor_symmetrical", ftos(sym));
1927  if (sym == 1 && sym_param3 < 2)
1928  cvar_set("g_waypointeditor_symmetrical_order", "0"); // make sure this is reset if not loaded
1929  if (sym == -1 || (sym == 1 && sym_param3 >= 2))
1930  {
1931  string params;
1932  if (sym == 1)
1933  params = cons("-", "-");
1934  else
1935  {
1936  params = cons(ftos(sym_param1), ftos(sym_param2));
1937  cvar_set("g_waypointeditor_symmetrical_origin", params);
1938  }
1939  cvar_set("g_waypointeditor_symmetrical_order", ftos(sym_param3));
1940  sym_str = strcat(ftos(sym), " with origin ", params, " and order ", ftos(sym_param3));
1941  }
1942  else if (sym == -2)
1943  {
1944  string params = strcat(ftos(sym_param1), " ", ftos(sym_param2));
1945  cvar_set("g_waypointeditor_symmetrical_axis", params);
1946  sym_str = strcat(ftos(sym), " with axis ", params);
1947  }
1948  else
1949  sym_str = ftos(sym);
1950  if (sym_str != "")
1951  LOG_INFO("Waypoint editor: loaded symmetry ", sym_str);
1952  LOG_INFO(strcat("g_waypointeditor_symmetrical", " has been set to ", cvar_string("g_waypointeditor_symmetrical")));
1953  }
1954 
1956  LOG_INFOF("^1Editing waypoints with a higher version number (%f) is not allowed.\n"
1957  "Update Xonotic to make them editable.", waypoint_version_loaded);
1958 
1959  return cwp + cwb;
1960 }
bool autocvar_g_waypointeditor_symmetrical_allowload
Definition: waypoints.qh:7
const float FILE_READ
Definition: csprogsdefs.qc:231
entity waypoint_spawn(vector m1, vector m2, float f)
Definition: waypoints.qc:431
const int WAYPOINTFLAG_NORELINK__DEPRECATED
Definition: api.qh:28
#define strcpy(this, s)
Definition: string.qh:49
string mapname
Definition: csprogsdefs.qc:26
bool waypointeditor_enabled
Definition: waypoints.qh:3
#define GET_GAMETYPE_EXTENSION()
Definition: waypoints.qc:1319
float waypoint_version_loaded
Definition: waypoints.qh:16
#define LOG_INFOF(...)
Definition: log.qh:71
spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 f1 s1 strcat(_("Level %s: "), "^BG%s\3\, _("^BGPress ^F2%s^BG to enter the game"))
#define LOG_INFO(...)
Definition: log.qh:70
string waypoint_time
Definition: waypoints.qh:17
vector(float skel, float bonenum) _skel_get_boneabs_hidden
#define LOG_TRACE(...)
Definition: log.qh:81
#define tokenizebyseparator
Definition: dpextensions.qh:21
ERASEABLE string cons(string a, string b)
Definition: string.qh:257
const float WAYPOINT_VERSION
Definition: waypoints.qh:15
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ waypoint_mark_hardwiredlink()

void waypoint_mark_hardwiredlink ( entity  wp_from,
entity  wp_to 
)

Definition at line 299 of file waypoints.qc.

References waypoint_setupmodel().

Referenced by waypoint_load_hardwiredlinks(), and waypoint_spawn_fromeditor().

300 {
301  if (!(wp_from && wp_to))
302  return;
303 
304  if (!wp_from.wphw00 || wp_from.wphw00 == wp_to) { wp_from.wphw00 = wp_to; waypoint_setupmodel(wp_from); return; }
305  if (!wp_from.wphw01 || wp_from.wphw01 == wp_to) { wp_from.wphw01 = wp_to; return; }
306  if (!wp_from.wphw02 || wp_from.wphw02 == wp_to) { wp_from.wphw02 = wp_to; return; }
307  if (!wp_from.wphw03 || wp_from.wphw03 == wp_to) { wp_from.wphw03 = wp_to; return; }
308  if (!wp_from.wphw04 || wp_from.wphw04 == wp_to) { wp_from.wphw04 = wp_to; return; }
309  if (!wp_from.wphw05 || wp_from.wphw05 == wp_to) { wp_from.wphw05 = wp_to; return; }
310  if (!wp_from.wphw06 || wp_from.wphw06 == wp_to) { wp_from.wphw06 = wp_to; return; }
311  if (!wp_from.wphw07 || wp_from.wphw07 == wp_to) { wp_from.wphw07 = wp_to; return; }
312 
313  return;
314 }
void waypoint_setupmodel(entity wp)
Definition: waypoints.qc:360
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ waypoint_remove()

void waypoint_remove ( entity  wp)

Definition at line 821 of file waypoints.qc.

References g_waypoints, if(), IL_EACH, waypoint_is_hardwiredlink(), waypoint_islinked(), waypoint_removelink(), and waypoint_unmark_hardwiredlink().

Referenced by waypoint_remove_fromeditor(), and waypoint_spawn_fromeditor().

822 {
823  IL_EACH(g_waypoints, it != wp,
824  {
825  if (it.SUPPORT_WP == wp)
826  {
827  it.SUPPORT_WP = NULL;
828  waypoint_schedulerelink(it); // restore incoming links
829  }
830  if (waypoint_islinked(it, wp))
831  {
832  if (waypoint_is_hardwiredlink(it, wp))
834  waypoint_removelink(it, wp);
835  }
836  });
837  delete(wp);
838 }
#define IL_EACH(this, cond, body)
bool waypoint_islinked(entity from, entity to)
Definition: waypoints.qc:968
void waypoint_unmark_hardwiredlink(entity wp_from, entity wp_to)
Definition: waypoints.qc:316
void waypoint_removelink(entity from, entity to)
Definition: waypoints.qc:907
IntrusiveList g_waypoints
Definition: api.qh:148
bool waypoint_is_hardwiredlink(entity wp_from, entity wp_to)
Definition: waypoints.qc:281
if(IS_DEAD(this))
Definition: impulse.qc:92
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ waypoint_remove_fromeditor()

void waypoint_remove_fromeditor ( entity  pl)

Definition at line 840 of file waypoints.qc.

References autocvar_g_waypointeditor_symmetrical, autocvar_g_waypointeditor_symmetrical_order, bprint(), entity(), FOREACH_ENTITY_CLASS, havocbot_symmetry_origin_order, LABEL, LOG_INFO, LOG_INFOF, navigation_findnearestwaypoint(), NULL, start_wp_is_spawned, strcat(), vector(), vtos(), waypoint_clear_start_wp_globals(), waypoint_getSymmetricalPoint(), waypoint_has_hardwiredlinks(), waypoint_remove(), WAYPOINT_VERSION, waypoint_version_loaded, and WAYPOINTFLAG_GENERATED.

841 {
843  {
844  LOG_INFOF("^1Editing waypoints with a higher version number (%f) is not allowed.\n"
845  "Update Xonotic to make them editable.", waypoint_version_loaded);
846  return;
847  }
848 
849  entity e = navigation_findnearestwaypoint(pl, false);
850 
851  int ctf_flags = havocbot_symmetry_origin_order;
852  bool sym = ((autocvar_g_waypointeditor_symmetrical > 0 && ctf_flags >= 2)
856  if (sym && ctf_flags < 2)
857  ctf_flags = 2;
858  int wp_num = ctf_flags;
859 
860  LABEL(remove_wp);
861  if (!e) return;
862 
863  if (e.wpflags & WAYPOINTFLAG_GENERATED)
864  {
867  return;
868  }
869 
871  {
872  LOG_INFO("Can't remove a waypoint with hardwired links, remove links with \"wpeditor hardwire\" first\n");
873  return;
874  }
875 
876  entity wp_sym = NULL;
877  if (sym)
878  {
879  vector org = waypoint_getSymmetricalPoint(e.origin, ctf_flags);
880  FOREACH_ENTITY_CLASS("waypoint", !(it.wpflags & WAYPOINTFLAG_GENERATED), {
881  if(vdist(org - it.origin, <, 3))
882  {
883  wp_sym = it;
884  break;
885  }
886  });
887  }
888 
889  bprint(strcat("Waypoint removed at ", vtos(e.origin), "\n"));
890  te_explosion(e.origin);
891  waypoint_remove(e);
892 
893  if (sym && wp_sym)
894  {
895  e = wp_sym;
896  if(wp_num > 2)
897  wp_num--;
898  else
899  sym = false;
900  goto remove_wp;
901  }
902 
905 }
bool start_wp_is_spawned
Definition: waypoints.qc:518
void waypoint_clear_start_wp_globals(entity pl, bool warn)
Definition: waypoints.qc:523
entity() spawn
vector waypoint_getSymmetricalPoint(vector org, int ctf_flags)
Definition: waypoints.qc:239
#define FOREACH_ENTITY_CLASS(class, cond, body)
Definition: iter.qh:189
float waypoint_version_loaded
Definition: waypoints.qh:16
#define LOG_INFOF(...)
Definition: log.qh:71
spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 f1 s1 strcat(_("Level %s: "), "^BG%s\3\, _("^BGPress ^F2%s^BG to enter the game"))
#define NULL
Definition: post.qh:17
#define LOG_INFO(...)
Definition: log.qh:70
bool waypoint_has_hardwiredlinks(entity wp)
Definition: waypoints.qc:274
vector(float skel, float bonenum) _skel_get_boneabs_hidden
bool autocvar_g_waypointeditor_symmetrical
Definition: waypoints.qh:6
#define LABEL(id)
Definition: compiler.qh:36
const int WAYPOINTFLAG_GENERATED
Definition: api.qh:11
float havocbot_symmetry_origin_order
Definition: api.qh:95
void waypoint_remove(entity wp)
Definition: waypoints.qc:821
int autocvar_g_waypointeditor_symmetrical_order
Definition: waypoints.qh:9
const float WAYPOINT_VERSION
Definition: waypoints.qh:15
entity navigation_findnearestwaypoint(entity ent, float walkfromwp)
Definition: navigation.qc:1011
+ Here is the call graph for this function:

◆ waypoint_removelink()

void waypoint_removelink ( entity  from,
entity  to 
)

Definition at line 907 of file waypoints.qc.

References entity(), NULL, waypoint_getlinknum(), waypoint_schedulerelink(), WAYPOINTFLAG_JUMP, WAYPOINTFLAG_SUPPORT, and WPFLAGMASK_NORELINK.

Referenced by waypoint_remove(), and waypoint_spawn_fromeditor().

908 {
909  if (from == to || ((from.wpflags & WPFLAGMASK_NORELINK) && !(from.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT))))
910  return;
911 
912  entity fromwp31_prev = from.wp31;
913 
914  switch (waypoint_getlinknum(from, to))
915  {
916  // fallthrough all the way
917  case 0: from.wp00 = from.wp01; from.wp00mincost = from.wp01mincost;
918  case 1: from.wp01 = from.wp02; from.wp01mincost = from.wp02mincost;
919  case 2: from.wp02 = from.wp03; from.wp02mincost = from.wp03mincost;
920  case 3: from.wp03 = from.wp04; from.wp03mincost = from.wp04mincost;
921  case 4: from.wp04 = from.wp05; from.wp04mincost = from.wp05mincost;
922  case 5: from.wp05 = from.wp06; from.wp05mincost = from.wp06mincost;
923  case 6: from.wp06 = from.wp07; from.wp06mincost = from.wp07mincost;
924  case 7: from.wp07 = from.wp08; from.wp07mincost = from.wp08mincost;
925  case 8: from.wp08 = from.wp09; from.wp08mincost = from.wp09mincost;
926  case 9: from.wp09 = from.wp10; from.wp09mincost = from.wp10mincost;
927  case 10: from.wp10 = from.wp11; from.wp10mincost = from.wp11mincost;
928  case 11: from.wp11 = from.wp12; from.wp11mincost = from.wp12mincost;
929  case 12: from.wp12 = from.wp13; from.wp12mincost = from.wp13mincost;
930  case 13: from.wp13 = from.wp14; from.wp13mincost = from.wp14mincost;
931  case 14: from.wp14 = from.wp15; from.wp14mincost = from.wp15mincost;
932  case 15: from.wp15 = from.wp16; from.wp15mincost = from.wp16mincost;
933  case 16: from.wp16 = from.wp17; from.wp16mincost = from.wp17mincost;
934  case 17: from.wp17 = from.wp18; from.wp17mincost = from.wp18mincost;
935  case 18: from.wp18 = from.wp19; from.wp18mincost = from.wp19mincost;
936  case 19: from.wp19 = from.wp20; from.wp19mincost = from.wp20mincost;
937  case 20: from.wp20 = from.wp21; from.wp20mincost = from.wp21mincost;
938  case 21: from.wp21 = from.wp22; from.wp21mincost = from.wp22mincost;
939  case 22: from.wp22 = from.wp23; from.wp22mincost = from.wp23mincost;
940  case 23: from.wp23 = from.wp24; from.wp23mincost = from.wp24mincost;
941  case 24: from.wp24 = from.wp25; from.wp24mincost = from.wp25mincost;
942  case 25: from.wp25 = from.wp26; from.wp25mincost = from.wp26mincost;
943  case 26: from.wp26 = from.wp27; from.wp26mincost = from.wp27mincost;
944  case 27: from.wp27 = from.wp28; from.wp27mincost = from.wp28mincost;
945  case 28: from.wp28 = from.wp29; from.wp28mincost = from.wp29mincost;
946  case 29: from.wp29 = from.wp30; from.wp29mincost = from.wp30mincost;
947  case 30: from.wp30 = from.wp31; from.wp30mincost = from.wp31mincost;
948  case 31: from.wp31 = NULL; from.wp31mincost = 10000000;
949  }
950 
951  if (fromwp31_prev && !from.wp31)
953 }
entity() spawn
const int WAYPOINTFLAG_JUMP
Definition: api.qh:20
const int WPFLAGMASK_NORELINK
Definition: api.qh:29
entity to
Definition: self.qh:96
void waypoint_schedulerelink(entity wp)
Definition: waypoints.qc:1275
#define NULL
Definition: post.qh:17
int waypoint_getlinknum(entity from, entity to)
Definition: waypoints.qc:955
const int WAYPOINTFLAG_SUPPORT
Definition: api.qh:23
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ waypoint_save_links()

void waypoint_save_links ( )

Definition at line 1721 of file waypoints.qc.

References botframe_cachedwaypointlinks, fclose(), FILE_WRITE, fopen(), fputs(), ftos_decimals(), g_waypoints, GET_GAMETYPE_EXTENSION, IL_EACH, LOG_INFOF, mapname, strcat(), waypoint_time, WAYPOINT_VERSION, WAYPOINTFLAG_CUSTOM_JP, WAYPOINTFLAG_JUMP, and WAYPOINTFLAG_SUPPORT.

Referenced by waypoint_saveall().

1722 {
1723  string gt_ext = GET_GAMETYPE_EXTENSION();
1724 
1725  string filename = sprintf("maps/%s.waypoints.cache", strcat(mapname, gt_ext));
1726  int file = fopen(filename, FILE_WRITE);
1727  if (file < 0)
1728  {
1729  LOG_INFOF("waypoint link save to %s failed", filename);
1730  return;
1731  }
1732 
1733  fputs(file, strcat("//", "WAYPOINT_VERSION ", ftos_decimals(WAYPOINT_VERSION, 2), "\n"));
1734  if (waypoint_time != "")
1735  fputs(file, strcat("//", "WAYPOINT_TIME ", waypoint_time, "\n"));
1736 
1737  int c = 0;
1739  {
1740  for(int j = 0; j < 32; ++j)
1741  {
1742  entity link = waypoint_get_link(it, j);
1743  if (link && !waypoint_is_hardwiredlink(it, link))
1744  {
1745  // NOTE: vtos rounds vector components to 1 decimal place
1746  string s = strcat(vtos(it.origin), "*", vtos(link.origin), "\n");
1747  fputs(file, s);
1748  ++c;
1749  }
1750  }
1751  });
1752  fclose(file);
1753 
1755 
1756  LOG_INFOF("saved %d waypoint links to %s", c, filename);
1757 }
#define IL_EACH(this, cond, body)
ERASEABLE string ftos_decimals(float number, int decimals)
converts a number to a string with the indicated number of decimals
Definition: string.qh:450
const int WAYPOINTFLAG_JUMP
Definition: api.qh:20
float botframe_cachedwaypointlinks
Definition: waypoints.qh:24
string mapname
Definition: csprogsdefs.qc:26
#define GET_GAMETYPE_EXTENSION()
Definition: waypoints.qc:1319
#define LOG_INFOF(...)
Definition: log.qh:71
spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 f1 s1 strcat(_("Level %s: "), "^BG%s\3\, _("^BGPress ^F2%s^BG to enter the game"))
string waypoint_time
Definition: waypoints.qh:17
IntrusiveList g_waypoints
Definition: api.qh:148
const float FILE_WRITE
Definition: csprogsdefs.qc:233
const int WAYPOINTFLAG_CUSTOM_JP
Definition: api.qh:21
const float WAYPOINT_VERSION
Definition: waypoints.qh:15
const int WAYPOINTFLAG_SUPPORT
Definition: api.qh:23
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ waypoint_saveall()

void waypoint_saveall ( )

Definition at line 1760 of file waypoints.qc.

References autocvar_g_waypointeditor_symmetrical, autocvar_g_waypointeditor_symmetrical_axis, autocvar_g_waypointeditor_symmetrical_order, autocvar_g_waypointeditor_symmetrical_origin, botframe_loadedforcedlinks, cons(), fclose(), FILE_WRITE, fopen(), fputs(), ftos(), ftos_decimals(), g_waypoints, GET_GAMETYPE_EXTENSION, IL_EACH, LOG_INFOF, mapname, strcat(), strcpy, vtos(), waypoint_save_hardwiredlinks(), waypoint_save_links(), waypoint_time, WAYPOINT_VERSION, waypoint_version_loaded, and WAYPOINTFLAG_GENERATED.

1761 {
1763  {
1764  LOG_INFOF("^1Overwriting waypoints with a higher version number (%f) is not allowed.\n"
1765  "Update Xonotic to make them editable.", waypoint_version_loaded);
1766  return;
1767  }
1768  string gt_ext = GET_GAMETYPE_EXTENSION();
1769 
1770  string filename = sprintf("maps/%s.waypoints", strcat(mapname, gt_ext));
1771  int file = fopen(filename, FILE_WRITE);
1772  if (file < 0)
1773  {
1774  waypoint_save_links(); // save anyway?
1776 
1777  LOG_INFOF("waypoint links: save to %s failed", filename);
1778  return;
1779  }
1780 
1782  string sym_str = ftos(sym);
1783  if (sym == -1 || (sym == 1 && autocvar_g_waypointeditor_symmetrical_order >= 2))
1784  {
1785  if (sym == 1)
1786  {
1787  sym_str = cons(sym_str, "-");
1788  sym_str = cons(sym_str, "-");
1789  }
1790  else
1791  {
1794  }
1797  }
1799  {
1800  sym_str = cons(sym_str, ftos(autocvar_g_waypointeditor_symmetrical_axis.x));
1801  sym_str = cons(sym_str, ftos(autocvar_g_waypointeditor_symmetrical_axis.y));
1802  }
1803 
1804  // a group of 3 comments doesn't break compatibility with older Xonotic versions
1805  // (they are read as a waypoint with origin '0 0 0' and flag 0 though)
1806  fputs(file, strcat("//", "WAYPOINT_VERSION ", ftos_decimals(WAYPOINT_VERSION, 2), "\n"));
1807  fputs(file, strcat("//", "WAYPOINT_SYMMETRY ", sym_str, "\n"));
1808 
1809  strcpy(waypoint_time, strftime(true, "%Y-%m-%d %H:%M:%S"));
1810  fputs(file, strcat("//", "WAYPOINT_TIME ", waypoint_time, "\n"));
1811  //fputs(file, strcat("//", "\n"));
1812  //fputs(file, strcat("//", "\n"));
1813  //fputs(file, strcat("//", "\n"));
1814 
1815  int c = 0;
1816  IL_EACH(g_waypoints, true,
1817  {
1818  if(it.wpflags & WAYPOINTFLAG_GENERATED)
1819  continue;
1820 
1821  string s;
1822  // NOTE: vtos rounds vector components to 1 decimal place
1823  s = strcat(vtos(it.origin + it.mins), "\n");
1824  s = strcat(s, vtos(it.origin + it.maxs));
1825  s = strcat(s, "\n");
1826  s = strcat(s, ftos(it.wpflags));
1827  s = strcat(s, "\n");
1828  fputs(file, s);
1829  c++;
1830  });
1831  fclose(file);
1834 
1836 
1838  LOG_INFOF("saved %d waypoints to %s", c, filename);
1839 }
#define IL_EACH(this, cond, body)
ERASEABLE string ftos_decimals(float number, int decimals)
converts a number to a string with the indicated number of decimals
Definition: string.qh:450
float botframe_loadedforcedlinks
Definition: waypoints.qh:23
#define strcpy(this, s)
Definition: string.qh:49
string mapname
Definition: csprogsdefs.qc:26
vector autocvar_g_waypointeditor_symmetrical_axis
Definition: waypoints.qh:10
#define GET_GAMETYPE_EXTENSION()
Definition: waypoints.qc:1319
float waypoint_version_loaded
Definition: waypoints.qh:16
#define LOG_INFOF(...)
Definition: log.qh:71
spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 f1 s1 strcat(_("Level %s: "), "^BG%s\3\, _("^BGPress ^F2%s^BG to enter the game"))
void waypoint_save_hardwiredlinks()
Definition: waypoints.qc:1667
string waypoint_time
Definition: waypoints.qh:17
IntrusiveList g_waypoints
Definition: api.qh:148
const float FILE_WRITE
Definition: csprogsdefs.qc:233
bool autocvar_g_waypointeditor_symmetrical
Definition: waypoints.qh:6
void waypoint_save_links()
Definition: waypoints.qc:1721
vector autocvar_g_waypointeditor_symmetrical_origin
Definition: waypoints.qh:8
const int WAYPOINTFLAG_GENERATED
Definition: api.qh:11
ERASEABLE string cons(string a, string b)
Definition: string.qh:257
int autocvar_g_waypointeditor_symmetrical_order
Definition: waypoints.qh:9
const float WAYPOINT_VERSION
Definition: waypoints.qh:15
+ Here is the call graph for this function:

◆ waypoint_schedulerelink()

void waypoint_schedulerelink ( entity  wp)

Definition at line 1275 of file waypoints.qc.

References EF_LOWPRECISION, NULL, setthink, time, vdist, waypoint_clearlinks(), waypoint_setupmodel(), waypoint_think(), WAYPOINTFLAG_PERSONAL, and WPFLAGMASK_NORELINK.

Referenced by botframe_autowaypoints_createwp(), waypoint_removelink(), waypoint_schedulerelinkall(), waypoint_spawn_fromeditor(), and waypoint_spawnpersonal().

1276 {
1277  if (wp == NULL)
1278  return;
1279 
1280  waypoint_setupmodel(wp);
1281  wp.wpisbox = vdist(wp.size, >, 0);
1282  wp.enemy = NULL;
1283  if (!(wp.wpflags & WAYPOINTFLAG_PERSONAL))
1284  wp.owner = NULL;
1285  if (!(wp.wpflags & WPFLAGMASK_NORELINK))
1286  waypoint_clearlinks(wp);
1287  // schedule an actual relink on next frame
1288  setthink(wp, waypoint_think);
1289  wp.nextthink = time;
1290  wp.effects = EF_LOWPRECISION;
1291 }
const int WPFLAGMASK_NORELINK
Definition: api.qh:29
void waypoint_think(entity this)
Definition: waypoints.qc:1149
#define NULL
Definition: post.qh:17
#define vdist(v, cmp, f)
Vector distance comparison, avoids sqrt()
Definition: vector.qh:8
void waypoint_clearlinks(entity wp)
Definition: waypoints.qc:1255
#define setthink(e, f)
const int WAYPOINTFLAG_PERSONAL
Definition: api.qh:15
float time
Definition: csprogsdefs.qc:16
float EF_LOWPRECISION
void waypoint_setupmodel(entity wp)
Definition: waypoints.qc:360
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ waypoint_schedulerelinkall()

void waypoint_schedulerelinkall ( )

Definition at line 1309 of file waypoints.qc.

References g_waypoints, IL_EACH, relink_lengthculled, relink_pvsculled, relink_total, relink_walkculled, waypoint_load_hardwiredlinks(), and waypoint_schedulerelink().

Referenced by waypoint_load_links().

1310 {
1312  IL_EACH(g_waypoints, true,
1313  {
1315  });
1317 }
#define IL_EACH(this, cond, body)
float relink_pvsculled
Definition: waypoints.qh:20
float relink_lengthculled
Definition: waypoints.qh:20
void waypoint_load_hardwiredlinks()
Definition: waypoints.qc:1470
void waypoint_schedulerelink(entity wp)
Definition: waypoints.qc:1275
IntrusiveList g_waypoints
Definition: api.qh:148
float relink_total
Definition: waypoints.qh:20
float relink_walkculled
Definition: waypoints.qh:20
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ waypoint_spawn()

entity waypoint_spawn ( vector  m1,
vector  m2,
float  f 
)

Definition at line 431 of file waypoints.qc.

References autocvar_developer, backtrace, boxesoverlap(), DPCONTENTS_BODY, DPCONTENTS_BOTCLIP, DPCONTENTS_PLAYERCLIP, DPCONTENTS_SOLID, entity(), g_waypoints, IL_EACH, IL_PUSH(), LOG_INFO, LOG_TRACE, make_pure, move_out_of_solid, NULL, setorigin(), SOLID_TRIGGER, time, trigger_push_get_push_time(), vector(), vtos(), waypoint_clearlinks(), waypoint_get(), waypoint_setupmodel(), waypointeditor_enabled, WAYPOINTFLAG_CROUCH, WAYPOINTFLAG_GENERATED, WAYPOINTFLAG_PERSONAL, and WPFLAGMASK_NORELINK.

Referenced by botframe_autowaypoints_createwp(), waypoint_loadall(), waypoint_spawn_fromeditor(), waypoint_spawnforitem_force(), waypoint_spawnforteleporter_boxes(), and waypoint_spawnpersonal().

432 {
433  if(!(f & (WAYPOINTFLAG_PERSONAL | WAYPOINTFLAG_GENERATED)) && m1 == m2)
434  {
435  entity wp_found = waypoint_get(m1, m2);
436  if (wp_found)
437  return wp_found;
438  }
439  // spawn only one destination waypoint for teleports teleporting player to the exact same spot
440  // otherwise links loaded from file would be applied only to the first destination
441  // waypoint since link format doesn't specify waypoint entities but just positions
442  if((f & WAYPOINTFLAG_GENERATED) && !(f & (WPFLAGMASK_NORELINK | WAYPOINTFLAG_PERSONAL)) && m1 == m2)
443  {
444  IL_EACH(g_waypoints, boxesoverlap(m1, m2, it.absmin, it.absmax),
445  {
446  return it;
447  });
448  }
449 
450  entity w = new(waypoint);
451  IL_PUSH(g_waypoints, w);
453  w.wpflags = f;
454  w.solid = SOLID_TRIGGER;
455  w.createdtime = time;
456  w.origin = (m1 + m2) * 0.5;
458  setorigin(w, w.origin);
459  else // don't link into the world, only bots are aware of waypoints
460  make_pure(w);
461  setsize(w, m1 - w.origin, m2 - w.origin);
462  if (w.size)
463  w.wpisbox = true;
464 
465  if(!w.wpisbox)
466  {
467  if (f & WAYPOINTFLAG_CROUCH)
468  setsize(w, PL_CROUCH_MIN_CONST - '1 1 0', PL_CROUCH_MAX_CONST + '1 1 0');
469  else
470  setsize(w, PL_MIN_CONST - '1 1 0', PL_MAX_CONST + '1 1 0');
471  if(!move_out_of_solid(w))
472  {
473  if(!(f & WAYPOINTFLAG_GENERATED))
474  {
475  LOG_TRACE("Killed a waypoint that was stuck in solid at ", vtos(w.origin));
476  delete(w);
477  return NULL;
478  }
479  else
480  {
481  if(autocvar_developer > 0)
482  {
483  LOG_INFO("A generated waypoint is stuck in solid at ", vtos(w.origin));
484  backtrace("Waypoint stuck");
485  }
486  }
487  }
488  setsize(w, '0 0 0', '0 0 0');
489  }
490 
492  //waypoint_schedulerelink(w);
493 
495 
496  return w;
497 }
const int WAYPOINTFLAG_CROUCH
Definition: api.qh:22
#define IL_EACH(this, cond, body)
entity() spawn
float DPCONTENTS_BOTCLIP
const int WPFLAGMASK_NORELINK
Definition: api.qh:29
float DPCONTENTS_PLAYERCLIP
#define move_out_of_solid(e)
Definition: common.qh:110
bool waypointeditor_enabled
Definition: waypoints.qh:3
ERASEABLE entity IL_PUSH(IntrusiveList this, entity it)
Push to tail.
ERASEABLE float boxesoverlap(vector m1, vector m2, vector m3, vector m4)
requires that m2>m1 in all coordinates, and that m4>m3
Definition: vector.qh:73
entity waypoint_get(vector m1, vector m2)
Definition: waypoints.qc:418
#define NULL
Definition: post.qh:17
#define LOG_INFO(...)
Definition: log.qh:70
float DPCONTENTS_SOLID
#define backtrace(msg)
Definition: log.qh:105
#define make_pure(e)
Definition: oo.qh:12
IntrusiveList g_waypoints
Definition: api.qh:148
float DPCONTENTS_BODY
void waypoint_clearlinks(entity wp)
Definition: waypoints.qc:1255
#define LOG_TRACE(...)
Definition: log.qh:81
const float SOLID_TRIGGER
Definition: csprogsdefs.qc:245
const int WAYPOINTFLAG_GENERATED
Definition: api.qh:11
setorigin(ent, v)
noref int autocvar_developer
Definition: log.qh:102
const int WAYPOINTFLAG_PERSONAL
Definition: api.qh:15
float time
Definition: csprogsdefs.qc:16
void waypoint_setupmodel(entity wp)
Definition: waypoints.qc:360
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ waypoint_spawn_fromeditor()

void waypoint_spawn_fromeditor ( entity  pl,
bool  at_crosshair,
bool  is_jump_wp,
bool  is_crouch_wp,
bool  is_support_wp 
)

Definition at line 570 of file waypoints.qc.

References autocvar_g_waypointeditor_symmetrical, autocvar_g_waypointeditor_symmetrical_order, boxesoverlap(), bprint(), crosshair_trace_waypoints(), entity(), g_items, g_jumppads, g_waypoints, havocbot_symmetry_origin_order, IL_EACH, LABEL, LOG_INFO, LOG_INFOF, NULL, PHYS_INPUT_BUTTON_CROUCH, start_wp_is_hardwired, start_wp_is_spawned, start_wp_is_support, start_wp_origin, strcat(), time, trace_endpos, trace_ent, vdist, vector(), vlen(), vtos(), waypoint_addlink(), waypoint_clear_start_wp_globals(), waypoint_get(), waypoint_get_type_name(), waypoint_getSymmetricalPoint(), waypoint_is_hardwiredlink(), waypoint_islinked(), waypoint_mark_hardwiredlink(), waypoint_remove(), waypoint_removelink(), waypoint_schedulerelink(), waypoint_spawn(), waypoint_spawn_fromeditor(), waypoint_unmark_hardwiredlink(), WAYPOINT_VERSION, waypoint_version_loaded, WAYPOINTFLAG_CROUCH, WAYPOINTFLAG_CUSTOM_JP, WAYPOINTFLAG_JUMP, WAYPOINTFLAG_SUPPORT, WAYPOINTFLAG_TELEPORT, and WPFLAGMASK_NORELINK.

Referenced by waypoint_spawn_fromeditor().

571 {
573  {
574  LOG_INFOF("^1Editing waypoints with a higher version number (%f) is not allowed.\n"
575  "Update Xonotic to make them editable.", waypoint_version_loaded);
576  return;
577  }
578 
579  entity e = NULL, jp = NULL;
580  vector org = pl.origin;
581  if (at_crosshair)
582  {
584  org = trace_endpos;
585  if (!trace_ent)
586  org.z -= PL_MIN_CONST.z;
588  IL_EACH(g_jumppads, boxesoverlap(org + PL_MIN_CONST, org + PL_MAX_CONST, it.absmin, it.absmax),
589  {
590  jp = it;
591  break;
592  });
593  if (!jp && !start_wp_is_spawned && trace_ent)
594  {
595  if (trace_ent.wpflags & (WAYPOINTFLAG_JUMP))
596  is_jump_wp = true;
597  else if (trace_ent.wpflags & (WAYPOINTFLAG_SUPPORT))
598  is_support_wp = true;
599  }
600  }
601  if (jp || is_jump_wp || is_support_wp)
602  {
604  start_wp_is_spawned = false;
605  LOG_INFO("^xf80Spawning start waypoint...\n");
606  }
607  int ctf_flags = havocbot_symmetry_origin_order;
608  bool sym = ((autocvar_g_waypointeditor_symmetrical > 0 && ctf_flags >= 2)
612  if (sym && ctf_flags < 2)
613  ctf_flags = 2;
614  int wp_num = ctf_flags;
615 
616  if(!PHYS_INPUT_BUTTON_CROUCH(pl) && !at_crosshair && !is_jump_wp && !is_support_wp)
617  {
618  // snap waypoint to item's origin if close enough
619  IL_EACH(g_items, true,
620  {
621  vector item_org = (it.absmin + it.absmax) * 0.5;
622  item_org.z = it.absmin.z - PL_MIN_CONST.z;
623  if (vlen(item_org - org) < 20)
624  {
625  org = item_org;
626  break;
627  }
628  });
629  }
630 
631  vector start_org = '0 0 0';
633  {
635  LOG_INFO("^xf80Spawning destination waypoint...\n");
636  start_org = start_wp_origin;
637  }
638 
639  // save org as it can be modified spawning symmetrycal waypoints
640  vector initial_origin = '0 0 0';
641  bool initial_origin_is_set = false;
642 
643  LABEL(add_wp);
644 
645  if (jp)
646  {
647  e = NULL;
648  IL_EACH(g_waypoints, (it.wpflags & WPFLAGMASK_NORELINK)
649  && boxesoverlap(org + PL_MIN_CONST, org + PL_MAX_CONST, it.absmin, it.absmax),
650  {
651  e = it; break;
652  });
653  if (!e)
654  e = waypoint_spawn(jp.absmin - PL_MAX_CONST + '1 1 1', jp.absmax - PL_MIN_CONST + '-1 -1 -1', WAYPOINTFLAG_TELEPORT);
655  if (!pl.wp_locked)
656  pl.wp_locked = e;
657  }
658  else if (is_jump_wp || is_support_wp)
659  {
660  int type_flag = (is_jump_wp) ? WAYPOINTFLAG_JUMP : WAYPOINTFLAG_SUPPORT;
661 
662  entity wp_found = waypoint_get(org, org);
663  if (wp_found && !(wp_found.wpflags & type_flag))
664  {
665  LOG_INFOF("Error: can't spawn a %s waypoint over an existent waypoint of a different type\n", (is_jump_wp) ? "Jump" : "Support");
666  return;
667  }
668  e = waypoint_spawn(org, org, type_flag);
669  if (!pl.wp_locked)
670  pl.wp_locked = e;
671  }
672  else
673  e = waypoint_spawn(org, org, (is_crouch_wp) ? WAYPOINTFLAG_CROUCH : 0);
674  if(!e)
675  {
676  LOG_INFOF("Couldn't spawn waypoint at %v\n", org);
679  return;
680  }
681 
682  if (!initial_origin_is_set)
683  {
684  initial_origin = e.origin;
685  initial_origin_is_set = true;
686  }
687 
688  entity start_wp = NULL;
690  {
692  && boxesoverlap(start_org, start_org, it.absmin, it.absmax),
693  {
694  start_wp = it; break;
695  });
696  if(!start_wp)
697  {
698  // should not happen
699  LOG_INFOF("Couldn't find start waypoint at %v\n", start_org);
701  return;
702  }
704  {
705  if (waypoint_is_hardwiredlink(start_wp, e))
706  {
707  waypoint_unmark_hardwiredlink(start_wp, e);
708  waypoint_removelink(start_wp, e);
709  string s = strcat(vtos(start_wp.origin), "*", vtos(e.origin));
710  LOG_INFOF("^x80fRemoved hardwired link %s.\n", s);
711  }
712  else
713  {
714  if (e.createdtime == time)
715  {
716  LOG_INFO("Error: hardwired links can be created only between 2 existing (and unconnected) waypoints.\n");
717  waypoint_remove(e);
719  waypoint_spawn_fromeditor(pl, at_crosshair, is_jump_wp, is_crouch_wp, is_support_wp);
720  return;
721  }
722  if (start_wp == e)
723  {
724  LOG_INFO("Error: start and destination waypoints coincide.\n");
726  return;
727  }
728  if (waypoint_islinked(start_wp, e))
729  {
730  LOG_INFO("Error: waypoints are already linked.\n");
732  return;
733  }
734  waypoint_addlink(start_wp, e);
735  waypoint_mark_hardwiredlink(start_wp, e);
736  string s = strcat(vtos(start_wp.origin), "*", vtos(e.origin));
737  LOG_INFOF("^x80fAdded hardwired link %s.\n", s);
738  }
739  }
740  else
741  {
743  {
744  if (e.SUPPORT_WP)
745  {
746  LOG_INFOF("Waypoint %v has already a support waypoint, delete it first.\n", e.origin);
748  return;
749  }
750  // clear all links to e
751  IL_EACH(g_waypoints, it != e,
752  {
753  if (waypoint_islinked(it, e) && !waypoint_is_hardwiredlink(it, e))
754  waypoint_removelink(it, e);
755  });
756  }
757  waypoint_addlink(start_wp, e);
758  }
759  }
760 
761  if (!(jp || is_jump_wp || is_support_wp || start_wp_is_hardwired))
763 
764  string wp_type_str = waypoint_get_type_name(e);
765 
766  bprint(strcat(wp_type_str, "^7 spawned at ", vtos(e.origin), "\n"));
767 
769  {
770  pl.wp_locked = NULL;
772  waypoint_schedulerelink(start_wp);
773  if (start_wp.wpflags & WAYPOINTFLAG_TELEPORT)
774  {
775  if (start_wp.wp00_original == start_wp.wp00)
776  start_wp.wpflags &= ~WAYPOINTFLAG_CUSTOM_JP;
777  else
778  start_wp.wpflags |= WAYPOINTFLAG_CUSTOM_JP;
779  }
780  }
781 
782  if (sym)
783  {
784  org = waypoint_getSymmetricalPoint(org, ctf_flags);
785  if (jp)
786  {
787  IL_EACH(g_jumppads, boxesoverlap(org + PL_MIN_CONST, org + PL_MAX_CONST, it.absmin, it.absmax),
788  {
789  jp = it; break;
790  });
791  }
793  start_org = waypoint_getSymmetricalPoint(start_org, ctf_flags);
794  if (vdist(org - pl.origin, >, 32))
795  {
796  if(wp_num > 2)
797  wp_num--;
798  else
799  sym = false;
800  goto add_wp;
801  }
802  }
803  if (jp || is_jump_wp || is_support_wp)
804  {
805  if (!start_wp_is_spawned)
806  {
807  // we've just created a custom jumppad waypoint
808  // the next one created by the user will be the destination waypoint
809  start_wp_is_spawned = true;
810  start_wp_origin = initial_origin;
811  if (is_support_wp)
812  start_wp_is_support = true;
813  }
814  }
815  else if (start_wp_is_spawned)
816  {
818  }
819 }
const int WAYPOINTFLAG_CROUCH
Definition: api.qh:22
#define IL_EACH(this, cond, body)
#define PHYS_INPUT_BUTTON_CROUCH(s)
Definition: player.qh:150
bool start_wp_is_spawned
Definition: waypoints.qc:518
void waypoint_clear_start_wp_globals(entity pl, bool warn)
Definition: waypoints.qc:523
void waypoint_mark_hardwiredlink(entity wp_from, entity wp_to)
Definition: waypoints.qc:299
bool start_wp_is_support
Definition: waypoints.qc:521
entity() spawn
const int WAYPOINTFLAG_JUMP
Definition: api.qh:20
bool waypoint_islinked(entity from, entity to)
Definition: waypoints.qc:968
vector waypoint_getSymmetricalPoint(vector org, int ctf_flags)
Definition: waypoints.qc:239
const int WPFLAGMASK_NORELINK
Definition: api.qh:29
entity waypoint_spawn(vector m1, vector m2, float f)
Definition: waypoints.qc:431
void waypoint_unmark_hardwiredlink(entity wp_from, entity wp_to)
Definition: waypoints.qc:316
entity trace_ent
Definition: csprogsdefs.qc:40
IntrusiveList g_jumppads
Definition: jumppads.qh:7
bool start_wp_is_hardwired
Definition: waypoints.qc:520
void waypoint_removelink(entity from, entity to)
Definition: waypoints.qc:907
float waypoint_version_loaded
Definition: waypoints.qh:16
#define LOG_INFOF(...)
Definition: log.qh:71
const int WAYPOINTFLAG_TELEPORT
Definition: api.qh:13
ERASEABLE float boxesoverlap(vector m1, vector m2, vector m3, vector m4)
requires that m2>m1 in all coordinates, and that m4>m3
Definition: vector.qh:73
spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 spree_cen s1 f1 s1 strcat(_("Level %s: "), "^BG%s\3\, _("^BGPress ^F2%s^BG to enter the game"))
IntrusiveList g_items
Definition: items.qh:126
entity waypoint_get(vector m1, vector m2)
Definition: waypoints.qc:418
void waypoint_schedulerelink(entity wp)
Definition: waypoints.qc:1275
#define NULL
Definition: post.qh:17
#define LOG_INFO(...)
Definition: log.qh:70
vector start_wp_origin
Definition: waypoints.qc:519
vector trace_endpos
Definition: csprogsdefs.qc:37
IntrusiveList g_waypoints
Definition: api.qh:148
vector(float skel, float bonenum) _skel_get_boneabs_hidden
void waypoint_addlink(entity from, entity to)
Definition: waypoints.qc:1135
#define vdist(v, cmp, f)
Vector distance comparison, avoids sqrt()
Definition: vector.qh:8
bool autocvar_g_waypointeditor_symmetrical
Definition: waypoints.qh:6
bool waypoint_is_hardwiredlink(entity wp_from, entity wp_to)
Definition: waypoints.qc:281
#define LABEL(id)
Definition: compiler.qh:36
void crosshair_trace_waypoints(entity pl)
Definition: waypoints.qc:2134
float havocbot_symmetry_origin_order
Definition: api.qh:95
void waypoint_spawn_fromeditor(entity pl, bool at_crosshair, bool is_jump_wp, bool is_crouch_wp, bool is_support_wp)
Definition: waypoints.qc:570
void waypoint_remove(entity wp)
Definition: waypoints.qc:821
float time
Definition: csprogsdefs.qc:16
const int WAYPOINTFLAG_CUSTOM_JP
Definition: api.qh:21
int autocvar_g_waypointeditor_symmetrical_order
Definition: waypoints.qh:9
const float WAYPOINT_VERSION
Definition: waypoints.qh:15
string waypoint_get_type_name(entity wp)
Definition: waypoints.qc:395
const int WAYPOINTFLAG_SUPPORT
Definition: api.qh:23
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ waypoint_spawnforitem()

void waypoint_spawnforitem ( entity  e)

Definition at line 2007 of file waypoints.qc.

References bot_waypoints_for_items, and waypoint_spawnforitem_force().

2008 {
2010  return;
2011 
2012  waypoint_spawnforitem_force(e, e.origin);
2013 }
bool bot_waypoints_for_items
Definition: api.qh:9
void waypoint_spawnforitem_force(entity e, vector org)
Definition: waypoints.qc:1978
+ Here is the call graph for this function:

◆ waypoint_spawnforitem_force()

void waypoint_spawnforitem_force ( entity  e,
vector  org 
)

Definition at line 1978 of file waypoints.qc.

References g_waypoints, IL_EACH, NULL, vdist, waypoint_fixorigin, waypoint_spawn(), WAYPOINTFLAG_GENERATED, and WAYPOINTFLAG_ITEM.

Referenced by waypoint_spawnforitem().

1979 {
1980  // Fix the waypoint altitude if necessary
1981  org = waypoint_fixorigin(org, NULL);
1982 
1983  // don't spawn an item spawnfunc_waypoint if it already exists
1984  IL_EACH(g_waypoints, true,
1985  {
1986  if(it.wpisbox)
1987  {
1988  if(boxesoverlap(org, org, it.absmin, it.absmax))
1989  {
1990  e.nearestwaypoint = it;
1991  return;
1992  }
1993  }
1994  else
1995  {
1996  if(vdist(it.origin - org, <, 16))
1997  {
1998  e.nearestwaypoint = it;
1999  return;
2000  }
2001  }
2002  });
2003 
2004  e.nearestwaypoint = waypoint_spawn(org, org, WAYPOINTFLAG_GENERATED | WAYPOINTFLAG_ITEM);
2005 }
#define IL_EACH(this, cond, body)
#define waypoint_fixorigin(position, tracetest_ent)
Definition: waypoints.qc:1962
entity waypoint_spawn(vector m1, vector m2, float f)
Definition: waypoints.qc:431
#define NULL
Definition: post.qh:17
IntrusiveList g_waypoints
Definition: api.qh:148
#define vdist(v, cmp, f)
Vector distance comparison, avoids sqrt()
Definition: vector.qh:8
const int WAYPOINTFLAG_GENERATED
Definition: api.qh:11
const int WAYPOINTFLAG_ITEM
Definition: api.qh:12
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ waypoint_spawnforteleporter()

void waypoint_spawnforteleporter ( entity  e,
vector  destination,
float  timetaken,
entity  tracetest_ent 
)

Definition at line 2069 of file waypoints.qc.

References waypoint_fixorigin, waypoint_spawnforteleporter_boxes(), and WAYPOINTFLAG_TELEPORT.

2070 {
2071  destination = waypoint_fixorigin(destination, tracetest_ent);
2072  waypoint_spawnforteleporter_boxes(e, WAYPOINTFLAG_TELEPORT, e.absmin - PL_MAX_CONST + '1 1 1', e.absmax - PL_MIN_CONST + '-1 -1 -1', destination, destination, timetaken);
2073 }
#define waypoint_fixorigin(position, tracetest_ent)
Definition: waypoints.qc:1962
const int WAYPOINTFLAG_TELEPORT
Definition: api.qh:13
void waypoint_spawnforteleporter_boxes(entity e, int teleport_flag, vector org1, vector org2, vector destination1, vector destination2, float timetaken)
Definition: waypoints.qc:2015
+ Here is the call graph for this function:

◆ waypoint_spawnforteleporter_wz()

void waypoint_spawnforteleporter_wz ( entity  e,
entity  tracetest_ent 
)

Definition at line 2031 of file waypoints.qc.

References dest, makevectors, v_forward, v_right, v_up, vector(), waypoint_fixorigin_down_dir(), waypoint_spawnforteleporter_boxes(), WAYPOINTFLAG_JUMP, and WAYPOINTFLAG_TELEPORT.

2032 {
2033  float src_angle = e.warpzone_angles.x;
2034  while (src_angle < -180) src_angle += 360;
2035  while (src_angle > 180) src_angle -= 360;
2036 
2037  float dest_angle = e.enemy.warpzone_angles.x;
2038  while (dest_angle < -180) dest_angle += 360;
2039  while (dest_angle > 180) dest_angle -= 360;
2040 
2041  // no waypoints for warpzones pointing upwards, they can't be used by the bots
2042  if (src_angle == -90 || dest_angle == -90)
2043  return;
2044 
2045  makevectors(e.warpzone_angles);
2046  vector src = (e.absmin + e.absmax) * 0.5;
2047  src += ((e.warpzone_origin - src) * v_forward) * v_forward + 16 * v_right;
2048  vector down_dir_src = -v_up;
2049 
2050  makevectors(e.enemy.warpzone_angles);
2051  vector dest = (e.enemy.absmin + e.enemy.absmax) * 0.5;
2052  dest += ((e.enemy.warpzone_origin - dest) * v_forward) * v_forward - 16 * v_right;
2053  vector down_dir_dest = -v_up;
2054 
2055  int extra_flag = 0;
2056  // don't snap to the ground waypoints for source warpzones pointing downwards
2057  if (src_angle != 90)
2058  {
2059  src = waypoint_fixorigin_down_dir(src, tracetest_ent, down_dir_src);
2060  dest = waypoint_fixorigin_down_dir(dest, tracetest_ent, down_dir_dest);
2061  // oblique warpzones need a jump otherwise bots gets stuck
2062  if (src_angle != 0)
2063  extra_flag = WAYPOINTFLAG_JUMP;
2064  }
2065 
2066  waypoint_spawnforteleporter_boxes(e, WAYPOINTFLAG_TELEPORT | extra_flag, src, src, dest, dest, 0);
2067 }
vector waypoint_fixorigin_down_dir(vector position, entity tracetest_ent, vector down_dir)
Definition: waypoints.qc:1965
vector dest
Definition: jumppads.qh:41
const int WAYPOINTFLAG_JUMP
Definition: api.qh:20
vector v_up
Definition: csprogsdefs.qc:31
const int WAYPOINTFLAG_TELEPORT
Definition: api.qh:13
vector(float skel, float bonenum) _skel_get_boneabs_hidden
vector v_right
Definition: csprogsdefs.qc:31
void waypoint_spawnforteleporter_boxes(entity e, int teleport_flag, vector org1, vector org2, vector destination1, vector destination2, float timetaken)
Definition: waypoints.qc:2015
#define makevectors
Definition: post.qh:21
vector v_forward
Definition: csprogsdefs.qc:31
+ Here is the call graph for this function:

◆ waypoint_spawnpersonal()

entity waypoint_spawnpersonal ( entity  this,
vector  position 
)

Definition at line 2075 of file waypoints.qc.

References entity(), NULL, waypoint_fixorigin, waypoint_schedulerelink(), waypoint_spawn(), WAYPOINTFLAG_GENERATED, and WAYPOINTFLAG_PERSONAL.

Referenced by havocbot_moveto().

2076 {
2077  entity w;
2078 
2079  // drop the waypoint to a proper location:
2080  // first move it up by a player height
2081  // then move it down to hit the floor with player bbox size
2082  position = waypoint_fixorigin(position, this);
2083 
2084  w = waypoint_spawn(position, position, WAYPOINTFLAG_GENERATED | WAYPOINTFLAG_PERSONAL);
2085  w.nearestwaypoint = NULL;
2086  w.nearestwaypointtimeout = 0;
2087  w.owner = this;
2088 
2090 
2091  return w;
2092 }
entity() spawn
#define waypoint_fixorigin(position, tracetest_ent)
Definition: waypoints.qc:1962
entity waypoint_spawn(vector m1, vector m2, float f)
Definition: waypoints.qc:431
void waypoint_schedulerelink(entity wp)
Definition: waypoints.qc:1275
#define NULL
Definition: post.qh:17
const int WAYPOINTFLAG_GENERATED
Definition: api.qh:11
const int WAYPOINTFLAG_PERSONAL
Definition: api.qh:15
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ waypoint_think()

void waypoint_think ( entity  this)

Definition at line 1149 of file waypoints.qc.

References absmax, absmin, autocvar_bot_navigation_ignoreplayers, bot_calculate_stepheightvec(), bot_navigation_movemode, boxesoverlap(), DPCONTENTS_BODY, DPCONTENTS_BOTCLIP, DPCONTENTS_PLAYERCLIP, DPCONTENTS_SOLID, dphitcontentsmask, func_null(), g_waypoints, if(), IL_EACH, MOVE_NOMONSTERS, MOVE_NORMAL, navigation_testtracewalk, nextthink, origin, relink_lengthculled, set_tracewalk_dest_2(), setthink, tracewalk_dest, tracewalk_dest_height, vdist, vector(), waypoint_restore_hardwiredlinks(), WAYPOINTFLAG_CROUCH, WAYPOINTFLAG_JUMP, WAYPOINTFLAG_SUPPORT, wpflags, wpisbox, and wplinked.

Referenced by waypoint_schedulerelink().

1150 {
1151  vector sv = '0 0 0', sv2 = '0 0 0', ev = '0 0 0', ev2 = '0 0 0', dv;
1152  float sv2_height = 0, ev2_height = 0;
1153 
1155 
1156  int dphitcontentsmask_save = this.dphitcontentsmask;
1158 
1160 
1161  //dprint("waypoint_think wpisbox = ", ftos(this.wpisbox), "\n");
1162  IL_EACH(g_waypoints, this != it,
1163  {
1164  if (boxesoverlap(this.absmin, this.absmax, it.absmin, it.absmax))
1165  {
1166  if (!(this.wpflags & WPFLAGMASK_NORELINK))
1167  waypoint_addlink(this, it);
1168  if (!(it.wpflags & WPFLAGMASK_NORELINK))
1169  waypoint_addlink(it, this);
1170  }
1171  else
1172  {
1173  ++relink_total;
1174  if(!checkpvs(this.origin, it))
1175  {
1176  ++relink_pvsculled;
1177  continue;
1178  }
1179 
1180  sv = set_tracewalk_dest_2(this, it.origin);
1181  sv2 = tracewalk_dest;
1182  sv2_height = tracewalk_dest_height;
1183  ev = set_tracewalk_dest_2(it, this.origin);
1184  ev2 = tracewalk_dest;
1185  ev2_height = tracewalk_dest_height;
1186 
1187  dv = ev - sv;
1188  dv.z = 0;
1189  int maxdist = 1050;
1190  vector m1 = PL_MIN_CONST;
1191  vector m2 = PL_MAX_CONST;
1192 
1193  if ((this.wpflags & WAYPOINTFLAG_CROUCH) || (it.wpflags & WAYPOINTFLAG_CROUCH))
1194  {
1195  m1 = PL_CROUCH_MIN_CONST;
1196  m2 = PL_CROUCH_MAX_CONST;
1197  // links from crouch wp to normal wp (and viceversa) are very short to avoid creating many links
1198  // that would be wasted due to rough travel cost calculation (the longer link is, the higher cost is)
1199  // links from crouch wp to crouch wp can be as long as normal links
1200  if (!((this.wpflags & WAYPOINTFLAG_CROUCH) && (it.wpflags & WAYPOINTFLAG_CROUCH)))
1201  maxdist = 100;
1202  }
1203 
1204  if (vdist(dv, >=, maxdist)) // max search distance in XY
1205  {
1207  continue;
1208  }
1209 
1211 
1212  //traceline(this.origin, it.origin, false, NULL);
1213  //if (trace_fraction == 1)
1214  if (this.wpisbox || (this.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT)) // forbid outgoing links
1215  || it.SUPPORT_WP) // forbid incoming links
1216  {
1217  relink_walkculled += 0.5;
1218  }
1219  else
1220  {
1221  if (tracewalk(this, sv, m1, m2, ev2, ev2_height, MOVE_NOMONSTERS))
1222  waypoint_addlink(this, it);
1223  else
1224  relink_walkculled += 0.5;
1225  }
1226 
1227  // reverse direction
1228  if (it.wpisbox || (it.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT)) // forbid incoming links
1229  || this.SUPPORT_WP) // forbid outgoing links
1230  {
1231  relink_walkculled += 0.5;
1232  }
1233  else
1234  {
1235  if (tracewalk(this, ev, m1, m2, sv2, sv2_height, MOVE_NOMONSTERS))
1236  waypoint_addlink(it, this);
1237  else
1238  relink_walkculled += 0.5;
1239  }
1240  }
1241  });
1242 
1243  // waypoint_clearlinks preserves references to old hardwired links (.wphwXX links)
1244  // so they can be restored here when a wp is spawned over an existing one
1246 
1248  this.wplinked = true;
1249  this.dphitcontentsmask = dphitcontentsmask_save;
1250 
1251  setthink(this, func_null);
1252  this.nextthink = 0;
1253 }
const int WAYPOINTFLAG_CROUCH
Definition: api.qh:22
#define IL_EACH(this, cond, body)
const float MOVE_NORMAL
Definition: csprogsdefs.qc:252
const int WAYPOINTFLAG_JUMP
Definition: api.qh:20
float DPCONTENTS_BOTCLIP
float DPCONTENTS_PLAYERCLIP
origin
Definition: ent_cs.qc:114
int wplinked
Definition: waypoints.qh:45
int wpflags
Definition: api.qh:64
void bot_calculate_stepheightvec()
Definition: bot.qc:583
vector absmax
Definition: csprogsdefs.qc:92
float relink_lengthculled
Definition: waypoints.qh:20
const float MOVE_NOMONSTERS
Definition: csprogsdefs.qc:253
ERASEABLE float boxesoverlap(vector m1, vector m2, vector m3, vector m4)
requires that m2>m1 in all coordinates, and that m4>m3
Definition: vector.qh:73
float DPCONTENTS_SOLID
vector set_tracewalk_dest_2(entity ent, vector org)
Definition: navigation.qc:177
float nextthink
Definition: csprogsdefs.qc:121
IntrusiveList g_waypoints
Definition: api.qh:148
vector(float skel, float bonenum) _skel_get_boneabs_hidden
float DPCONTENTS_BODY
#define vdist(v, cmp, f)
Vector distance comparison, avoids sqrt()
Definition: vector.qh:8
float dphitcontentsmask
#define setthink(e, f)
void waypoint_restore_hardwiredlinks(entity wp)
Definition: waypoints.qc:348
vector absmin
Definition: csprogsdefs.qc:92
if(IS_DEAD(this))
Definition: impulse.qc:92
var void func_null()
const int WAYPOINTFLAG_SUPPORT
Definition: api.qh:23
bool autocvar_bot_navigation_ignoreplayers
Definition: cvars.qh:53
int wpisbox
Definition: waypoints.qh:45
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ waypoint_unmark_hardwiredlink()

void waypoint_unmark_hardwiredlink ( entity  wp_from,
entity  wp_to 
)

Definition at line 316 of file waypoints.qc.

References NULL, and waypoint_setupmodel().

Referenced by waypoint_remove(), and waypoint_spawn_fromeditor().

317 {
318  if (!(wp_from && wp_to))
319  return;
320 
321  int removed = -1;
322  if (removed < 0 && wp_from.wphw00 == wp_to) removed = 0;
323  if (removed < 0 && wp_from.wphw01 == wp_to) removed = 1;
324  if (removed < 0 && wp_from.wphw02 == wp_to) removed = 2;
325  if (removed < 0 && wp_from.wphw03 == wp_to) removed = 3;
326  if (removed < 0 && wp_from.wphw04 == wp_to) removed = 4;
327  if (removed < 0 && wp_from.wphw05 == wp_to) removed = 5;
328  if (removed < 0 && wp_from.wphw06 == wp_to) removed = 6;
329  if (removed < 0 && wp_from.wphw07 == wp_to) removed = 7;
330 
331  if (removed >= 0)
332  {
333  if (removed <= 0) wp_from.wphw00 = wp_from.wphw01;
334  if (removed <= 1) wp_from.wphw01 = wp_from.wphw02;
335  if (removed <= 2) wp_from.wphw02 = wp_from.wphw03;
336  if (removed <= 3) wp_from.wphw03 = wp_from.wphw04;
337  if (removed <= 4) wp_from.wphw04 = wp_from.wphw05;
338  if (removed <= 5) wp_from.wphw05 = wp_from.wphw06;
339  if (removed <= 6) wp_from.wphw06 = wp_from.wphw07;
340  if (removed <= 7) wp_from.wphw07 = NULL;
341  if (!wp_from.wphw00)
342  waypoint_setupmodel(wp_from);
343  }
344 
345  return;
346 }
#define NULL
Definition: post.qh:17
void waypoint_setupmodel(entity wp)
Definition: waypoints.qc:360
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ waypoint_unreachable()

void waypoint_unreachable ( entity  pl)

Definition at line 28 of file waypoints.qc.

References EF_BLUE, EF_NODEPTHTEST, EF_RED, entity(), etos(), g_items, g_spawnpoints, g_waypoints, IL_EACH, LOG_INFO, LOG_INFOF, navigation_findnearestwaypoint(), navigation_markroutes(), navigation_markroutes_inverted(), and vtos().

29 {
30  IL_EACH(g_waypoints, true,
31  {
32  it.colormod = '0.5 0.5 0.5';
33  it.effects &= ~(EF_NODEPTHTEST | EF_RED | EF_BLUE);
34  });
35 
36  entity e2 = navigation_findnearestwaypoint(pl, false);
37  if(!e2)
38  {
39  LOG_INFO("Can't find any waypoint nearby\n");
40  return;
41  }
42 
43  navigation_markroutes(pl, e2);
44 
45  int j = 0;
46  int m = 0;
47  IL_EACH(g_waypoints, it.wpcost >= 10000000,
48  {
49  LOG_INFO("unreachable: ", etos(it), " ", vtos(it.origin), "\n");
50  it.colormod_z = 8;
51  it.effects |= EF_NODEPTHTEST | EF_BLUE;
52  j++;
53  m++;
54  });
55  if (j) LOG_INFOF("%d waypoints cannot be reached from here in any way (marked with blue light)\n", j);
57 
58  j = 0;
59  IL_EACH(g_waypoints, it.wpcost >= 10000000,
60  {
61  LOG_INFO("cannot reach me: ", etos(it), " ", vtos(it.origin), "\n");
62  it.colormod_x = 8;
63  if (!(it.effects & EF_NODEPTHTEST)) // not already reported before
64  m++;
65  it.effects |= EF_NODEPTHTEST | EF_RED;
66  j++;
67  });
68  if (j) LOG_INFOF("%d waypoints cannot walk to here in any way (marked with red light)\n", j);
69  if (m) LOG_INFOF("%d waypoints have been marked total\n", m);
70 
71  j = 0;
72  IL_EACH(g_spawnpoints, true,
73  {
74  if (navigation_findnearestwaypoint(it, false))
75  {
76  if(it.spawnpointmodel)
77  {
78  delete(it.spawnpointmodel);
79  it.spawnpointmodel = NULL;
80  }
81  }
82  else
83  {
84  if(!it.spawnpointmodel)
85  {
86  tracebox(it.origin, PL_MIN_CONST, PL_MAX_CONST, it.origin - '0 0 512', MOVE_NOMONSTERS, NULL);
87  entity e = new(spawnpointmodel);
88  vector org = trace_endpos + eZ;
89  setorigin(e, org);
90  e.solid = SOLID_TRIGGER;
91  it.spawnpointmodel = e;
92  }
93  LOG_INFO("spawn without waypoint: ", etos(it), " ", vtos(it.origin), "\n");
94  it.spawnpointmodel.effects |= EF_NODEPTHTEST;
95  _setmodel(it.spawnpointmodel, pl.model);
96  it.spawnpointmodel.frame = ANIM_idle.m_id;
97  it.spawnpointmodel.skin = pl.skin;
98  it.spawnpointmodel.colormap = 1024 + 68;
99  it.spawnpointmodel.glowmod = '1 0 0';
100  it.spawnpointmodel.angles = it.angles;
101  setsize(it.spawnpointmodel, PL_MIN_CONST, PL_MAX_CONST);
102  j++;
103  }
104  });
105  if (j) LOG_INFOF("%d spawnpoints have no nearest waypoint (marked by player model)\n", j);
106 
107  j = 0;
108  IL_EACH(g_items, true,
109  {
110  it.effects &= ~(EF_NODEPTHTEST | EF_RED | EF_BLUE);
111  it.colormod = '0.5 0.5 0.5';
112  });
113  IL_EACH(g_items, true,
114  {
115  if (navigation_findnearestwaypoint(it, false))
116  continue;
117  LOG_INFO("item without waypoint: ", etos(it), " ", vtos(it.origin), "\n");
118  it.effects |= EF_NODEPTHTEST | EF_RED;
119  it.colormod_x = 8;
120  j++;
121  });
122  if (j) LOG_INFOF("%d items have no nearest waypoint and cannot be walked away from (marked with red light)\n", j);
123 
124  j = 0;
125  IL_EACH(g_items, true,
126  {
127  if (navigation_findnearestwaypoint(it, true))
128  continue;
129  LOG_INFO("item without waypoint: ", etos(it), " ", vtos(it.origin), "\n");
130  it.effects |= EF_NODEPTHTEST | EF_BLUE;
131  it.colormod_z = 8;
132  j++;
133  });
134  if (j) LOG_INFOF("%d items have no nearest waypoint and cannot be walked to (marked with blue light)\n", j);
135 }
#define IL_EACH(this, cond, body)
void navigation_markroutes_inverted(entity fixed_source_waypoint)
Definition: navigation.qc:1171
entity() spawn
void navigation_markroutes(entity this, entity fixed_source_waypoint)
Definition: navigation.qc:1081
const float EF_NODEPTHTEST
Definition: csprogsdefs.qc:304
#define LOG_INFOF(...)
Definition: log.qh:71
const float EF_BLUE
Definition: csprogsdefs.qc:301
IntrusiveList g_items
Definition: items.qh:126
#define LOG_INFO(...)
Definition: log.qh:70
IntrusiveList g_waypoints
Definition: api.qh:148
const float EF_RED
Definition: csprogsdefs.qc:307
IntrusiveList g_spawnpoints
Definition: spawnpoints.qh:32
entity navigation_findnearestwaypoint(entity ent, float walkfromwp)
Definition: navigation.qc:1011
+ Here is the call graph for this function:

◆ waypoint_updatecost_foralllinks()

void waypoint_updatecost_foralllinks ( )

Definition at line 973 of file waypoints.qc.

References g_waypoints, IL_EACH, and WAYPOINTFLAG_TELEPORT.

Referenced by bot_serverframe().

974 {
975  IL_EACH(g_waypoints, !(it.wpflags & WAYPOINTFLAG_TELEPORT),
976  {
977  if(it.wp00) it.wp00mincost = waypoint_getlinkcost(it, it.wp00);
978  if(it.wp01) it.wp01mincost = waypoint_getlinkcost(it, it.wp01);
979  if(it.wp02) it.wp02mincost = waypoint_getlinkcost(it, it.wp02);
980  if(it.wp03) it.wp03mincost = waypoint_getlinkcost(it, it.wp03);
981  if(it.wp04) it.wp04mincost = waypoint_getlinkcost(it, it.wp04);
982  if(it.wp05) it.wp05mincost = waypoint_getlinkcost(it, it.wp05);
983  if(it.wp06) it.wp06mincost = waypoint_getlinkcost(it, it.wp06);
984  if(it.wp07) it.wp07mincost = waypoint_getlinkcost(it, it.wp07);
985  if(it.wp08) it.wp08mincost = waypoint_getlinkcost(it, it.wp08);
986  if(it.wp09) it.wp09mincost = waypoint_getlinkcost(it, it.wp09);
987  if(it.wp10) it.wp10mincost = waypoint_getlinkcost(it, it.wp10);
988  if(it.wp11) it.wp11mincost = waypoint_getlinkcost(it, it.wp11);
989  if(it.wp12) it.wp12mincost = waypoint_getlinkcost(it, it.wp12);
990  if(it.wp13) it.wp13mincost = waypoint_getlinkcost(it, it.wp13);
991  if(it.wp14) it.wp14mincost = waypoint_getlinkcost(it, it.wp14);
992  if(it.wp15) it.wp15mincost = waypoint_getlinkcost(it, it.wp15);
993  if(it.wp16) it.wp16mincost = waypoint_getlinkcost(it, it.wp16);
994  if(it.wp17) it.wp17mincost = waypoint_getlinkcost(it, it.wp17);
995  if(it.wp18) it.wp18mincost = waypoint_getlinkcost(it, it.wp18);
996  if(it.wp19) it.wp19mincost = waypoint_getlinkcost(it, it.wp19);
997  if(it.wp20) it.wp20mincost = waypoint_getlinkcost(it, it.wp20);
998  if(it.wp21) it.wp21mincost = waypoint_getlinkcost(it, it.wp21);
999  if(it.wp22) it.wp22mincost = waypoint_getlinkcost(it, it.wp22);
1000  if(it.wp23) it.wp23mincost = waypoint_getlinkcost(it, it.wp23);
1001  if(it.wp24) it.wp24mincost = waypoint_getlinkcost(it, it.wp24);
1002  if(it.wp25) it.wp25mincost = waypoint_getlinkcost(it, it.wp25);
1003  if(it.wp26) it.wp26mincost = waypoint_getlinkcost(it, it.wp26);
1004  if(it.wp27) it.wp27mincost = waypoint_getlinkcost(it, it.wp27);
1005  if(it.wp28) it.wp28mincost = waypoint_getlinkcost(it, it.wp28);
1006  if(it.wp29) it.wp29mincost = waypoint_getlinkcost(it, it.wp29);
1007  if(it.wp30) it.wp30mincost = waypoint_getlinkcost(it, it.wp30);
1008  if(it.wp31) it.wp31mincost = waypoint_getlinkcost(it, it.wp31);
1009  });
1010 }
#define IL_EACH(this, cond, body)
const int WAYPOINTFLAG_TELEPORT
Definition: api.qh:13
IntrusiveList g_waypoints
Definition: api.qh:148
+ Here is the caller graph for this function:

Variable Documentation

◆ autocvar_g_waypointeditor

bool autocvar_g_waypointeditor

Definition at line 5 of file waypoints.qh.

Referenced by STATIC_INIT().

◆ autocvar_g_waypointeditor_symmetrical

bool autocvar_g_waypointeditor_symmetrical

◆ autocvar_g_waypointeditor_symmetrical_allowload

bool autocvar_g_waypointeditor_symmetrical_allowload = true

Definition at line 7 of file waypoints.qh.

Referenced by waypoint_loadall().

◆ autocvar_g_waypointeditor_symmetrical_axis

vector autocvar_g_waypointeditor_symmetrical_axis

Definition at line 10 of file waypoints.qh.

Referenced by waypoint_getSymmetricalPoint(), and waypoint_saveall().

◆ autocvar_g_waypointeditor_symmetrical_order

int autocvar_g_waypointeditor_symmetrical_order

◆ autocvar_g_waypointeditor_symmetrical_origin

vector autocvar_g_waypointeditor_symmetrical_origin

Definition at line 8 of file waypoints.qh.

Referenced by waypoint_getSymmetricalPoint(), and waypoint_saveall().

◆ botframe_cachedwaypointlinks

float botframe_cachedwaypointlinks

Definition at line 24 of file waypoints.qh.

Referenced by bot_serverframe(), waypoint_load_links(), and waypoint_save_links().

◆ botframe_loadedforcedlinks

float botframe_loadedforcedlinks

Definition at line 23 of file waypoints.qh.

Referenced by bot_serverframe(), waypoint_load_hardwiredlinks(), and waypoint_saveall().

◆ botframe_waypointeditorlightningtime

float botframe_waypointeditorlightningtime

Definition at line 22 of file waypoints.qh.

Referenced by botframe_showwaypointlinks().

◆ goalentity

entity goalentity

Definition at line 53 of file waypoints.qh.

◆ relink_lengthculled

float relink_lengthculled

Definition at line 20 of file waypoints.qh.

Referenced by waypoint_schedulerelinkall(), and waypoint_think().

◆ relink_pvsculled

float relink_pvsculled

Definition at line 20 of file waypoints.qh.

Referenced by waypoint_schedulerelinkall().

◆ relink_total

float relink_total

Definition at line 20 of file waypoints.qh.

Referenced by waypoint_schedulerelinkall().

◆ relink_walkculled

float relink_walkculled

Definition at line 20 of file waypoints.qh.

Referenced by waypoint_schedulerelinkall().

◆ waypoint_time

string waypoint_time

◆ WAYPOINT_VERSION

◆ waypoint_version_loaded

float waypoint_version_loaded

◆ waypointeditor_enabled

◆ wp00

entity wp00

Definition at line 28 of file waypoints.qh.

◆ wp00_original

entity wp00_original

Definition at line 32 of file waypoints.qh.

◆ wp00mincost

float wp00mincost

Definition at line 34 of file waypoints.qh.

◆ wp01

entity wp01

Definition at line 28 of file waypoints.qh.

◆ wp01mincost

float wp01mincost

Definition at line 34 of file waypoints.qh.

◆ wp02

entity wp02

Definition at line 28 of file waypoints.qh.

◆ wp02mincost

float wp02mincost

Definition at line 34 of file waypoints.qh.

◆ wp03

entity wp03

Definition at line 28 of file waypoints.qh.

◆ wp03mincost

float wp03mincost

Definition at line 34 of file waypoints.qh.

◆ wp04

entity wp04

Definition at line 28 of file waypoints.qh.

◆ wp04mincost

float wp04mincost

Definition at line 34 of file waypoints.qh.

◆ wp05

entity wp05

Definition at line 28 of file waypoints.qh.

◆ wp05mincost

float wp05mincost

Definition at line 34 of file waypoints.qh.

◆ wp06

entity wp06

Definition at line 28 of file waypoints.qh.

◆ wp06mincost

float wp06mincost

Definition at line 34 of file waypoints.qh.

◆ wp07

entity wp07

Definition at line 28 of file waypoints.qh.

◆ wp07mincost

float wp07mincost

Definition at line 34 of file waypoints.qh.

◆ wp08

entity wp08

Definition at line 28 of file waypoints.qh.

◆ wp08mincost

float wp08mincost

Definition at line 35 of file waypoints.qh.

◆ wp09

entity wp09

Definition at line 28 of file waypoints.qh.

◆ wp09mincost

float wp09mincost

Definition at line 35 of file waypoints.qh.

◆ wp10

entity wp10

Definition at line 28 of file waypoints.qh.

◆ wp10mincost

float wp10mincost

Definition at line 35 of file waypoints.qh.

◆ wp11

entity wp11

Definition at line 28 of file waypoints.qh.

◆ wp11mincost

float wp11mincost

Definition at line 35 of file waypoints.qh.

◆ wp12

entity wp12

Definition at line 28 of file waypoints.qh.

◆ wp12mincost

float wp12mincost

Definition at line 35 of file waypoints.qh.

◆ wp13

entity wp13

Definition at line 28 of file waypoints.qh.

◆ wp13mincost

float wp13mincost

Definition at line 35 of file waypoints.qh.

◆ wp14

entity wp14

Definition at line 28 of file waypoints.qh.

◆ wp14mincost

float wp14mincost

Definition at line 35 of file waypoints.qh.

◆ wp15

entity wp15

Definition at line 28 of file waypoints.qh.

◆ wp15mincost

float wp15mincost

Definition at line 35 of file waypoints.qh.

◆ wp16

entity wp16

Definition at line 29 of file waypoints.qh.

◆ wp16mincost

float wp16mincost

Definition at line 36 of file waypoints.qh.

◆ wp17

entity wp17

Definition at line 29 of file waypoints.qh.

◆ wp17mincost

float wp17mincost

Definition at line 36 of file waypoints.qh.

◆ wp18

entity wp18

Definition at line 29 of file waypoints.qh.

◆ wp18mincost

float wp18mincost

Definition at line 36 of file waypoints.qh.

◆ wp19

entity wp19

Definition at line 29 of file waypoints.qh.

◆ wp19mincost

float wp19mincost

Definition at line 36 of file waypoints.qh.

◆ wp20

entity wp20

Definition at line 29 of file waypoints.qh.

◆ wp20mincost

float wp20mincost

Definition at line 36 of file waypoints.qh.

◆ wp21

entity wp21

Definition at line 29 of file waypoints.qh.

◆ wp21mincost

float wp21mincost

Definition at line 36 of file waypoints.qh.

◆ wp22

entity wp22

Definition at line 29 of file waypoints.qh.

◆ wp22mincost

float wp22mincost

Definition at line 36 of file waypoints.qh.

◆ wp23

entity wp23

Definition at line 29 of file waypoints.qh.

◆ wp23mincost

float wp23mincost

Definition at line 36 of file waypoints.qh.

◆ wp24

entity wp24

Definition at line 29 of file waypoints.qh.

◆ wp24mincost

float wp24mincost

Definition at line 37 of file waypoints.qh.

◆ wp25

entity wp25

Definition at line 29 of file waypoints.qh.

◆ wp25mincost

float wp25mincost

Definition at line 37 of file waypoints.qh.

◆ wp26

entity wp26

Definition at line 29 of file waypoints.qh.

◆ wp26mincost

float wp26mincost

Definition at line 37 of file waypoints.qh.

◆ wp27

entity wp27

Definition at line 29 of file waypoints.qh.

◆ wp27mincost

float wp27mincost

Definition at line 37 of file waypoints.qh.

◆ wp28

entity wp28

Definition at line 29 of file waypoints.qh.

◆ wp28mincost

float wp28mincost

Definition at line 37 of file waypoints.qh.

◆ wp29

entity wp29

Definition at line 29 of file waypoints.qh.

◆ wp29mincost

float wp29mincost

Definition at line 37 of file waypoints.qh.

◆ wp30

entity wp30

Definition at line 29 of file waypoints.qh.

◆ wp30mincost

float wp30mincost

Definition at line 37 of file waypoints.qh.

◆ wp31

entity wp31

Definition at line 29 of file waypoints.qh.

◆ wp31mincost

float wp31mincost

Definition at line 37 of file waypoints.qh.

◆ wp_aimed

entity wp_aimed

Definition at line 47 of file waypoints.qh.

◆ wp_locked

entity wp_locked

Definition at line 48 of file waypoints.qh.

◆ wpconsidered

int wpconsidered

Definition at line 45 of file waypoints.qh.

◆ wpcost

float wpcost

Definition at line 44 of file waypoints.qh.

◆ wpfire

int wpfire

Definition at line 45 of file waypoints.qh.

◆ wpflags

int wpflags

Definition at line 46 of file waypoints.qh.

◆ wphw00

entity wphw00

Definition at line 42 of file waypoints.qh.

◆ wphw01

entity wphw01

Definition at line 42 of file waypoints.qh.

◆ wphw02

entity wphw02

Definition at line 42 of file waypoints.qh.

◆ wphw03

entity wphw03

Definition at line 42 of file waypoints.qh.

◆ wphw04

entity wphw04

Definition at line 42 of file waypoints.qh.

◆ wphw05

entity wphw05

Definition at line 42 of file waypoints.qh.

◆ wphw06

entity wphw06

Definition at line 42 of file waypoints.qh.

◆ wphw07

entity wphw07

Definition at line 42 of file waypoints.qh.

◆ wpisbox

int wpisbox

Definition at line 45 of file waypoints.qh.

Referenced by waypoint_think().

◆ wplinked

int wplinked

Definition at line 45 of file waypoints.qh.

Referenced by waypoint_think().

◆ wpnearestpoint

vector wpnearestpoint

Definition at line 50 of file waypoints.qh.