Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
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 2467 of file waypoints.qc.

2468{
2469 FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it) && !IS_DEAD(it), {
2470 // going back is broken, so only fix waypoints to walk TO the player
2471 //botframe_autowaypoints_fix(p, false, botframe_autowaypoints_lastwp0);
2473 //te_explosion(p.botframe_autowaypoints_lastwp0.origin);
2474 });
2475
2478 }
2479}
#define IS_DEAD(s)
Definition player.qh:245
#define IS_PLAYER(s)
Definition player.qh:243
int autocvar_g_waypointeditor_auto
Definition cvars.qh:60
#define IS_REAL_CLIENT(v)
Definition utils.qh:17
#define FOREACH_CLIENT(cond, body)
Definition utils.qh:50
void botframe_autowaypoints_fix(entity p, float walkfromwp,.entity fld)
void botframe_deleteuselesswaypoints()
entity botframe_autowaypoints_lastwp1

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().

◆ botframe_showwaypointlinks()

void botframe_showwaypointlinks ( )

Definition at line 2151 of file waypoints.qc.

2152{
2154 return;
2156 FOREACH_CLIENT(IS_PLAYER(it) && !it.isbot,
2157 {
2158 int display_type = 0;
2159 if (wasfreed(it.wp_aimed))
2160 it.wp_aimed = NULL;
2161 if (wasfreed(it.wp_locked))
2162 it.wp_locked = NULL;
2163 entity head = it.wp_locked;
2164 if (!head)
2165 head = navigation_findnearestwaypoint(it, false);
2166 it.nearestwaypoint = head; // mainly useful for debug
2167 it.nearestwaypointtimeout = time + 2; // while I'm at it...
2168 if (IS_ONGROUND(it) || it.waterlevel > WATERLEVEL_NONE || it.wp_locked)
2169 display_type = 1; // default
2170 else if(waypoint_has_hardwiredlinks(head))
2171 display_type = 2; // only hardwired
2172
2173 if (display_type)
2174 {
2175 //navigation_testtracewalk = true;
2176 //print("currently selected WP is ", etos(head), "\n");
2177 //navigation_testtracewalk = false;
2178 if (head)
2179 {
2180 te_lightning2(NULL, head.origin, it.origin);
2181 if(PHYS_INPUT_BUTTON_CROUCH(it))
2182 waypoint_showlinks_to(head, display_type);
2183 else
2184 waypoint_showlinks_from(head, display_type);
2185 }
2186 }
2187 string str;
2188 entity wp = NULL;
2189 if (vdist(vec2(it.velocity), <, autocvar_sv_maxspeed * 1.1))
2190 {
2191 crosshair_trace_waypoints(it);
2192 if (trace_ent)
2193 {
2194 wp = trace_ent;
2195 if (wp != it.wp_aimed)
2196 {
2197 string wp_type_str = waypoint_get_type_name(wp);
2198 str = sprintf("\necho Entity %d: %s^7, flags: %d, origin: %s\n", etof(wp), wp_type_str, wp.wpflags, vtos(wp.origin));
2199 if (wp.wpisbox)
2200 str = strcat(str, sprintf("echo \" absmin: %s, absmax: %s\"\n", vtos(wp.absmin), vtos(wp.absmax)));
2201 stuffcmd(it, str);
2202 str = sprintf("Entity %d: %s^7\nflags: %d\norigin: %s", etof(wp), wp_type_str, wp.wpflags, vtos(wp.origin));
2203 if (wp.wpisbox)
2204 str = strcat(str, sprintf(" \nabsmin: %s\nabsmax: %s", vtos(wp.absmin), vtos(wp.absmax)));
2205 debug_text_3d(wp.origin, str, 0, 7, '0 0 0');
2206 }
2207 }
2208 }
2209 if (it.wp_aimed != wp)
2210 it.wp_aimed = wp;
2211 });
2212}
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
float autocvar_sv_maxspeed
Definition player.qh:53
float time
#define NULL
Definition post.qh:14
if(frag_attacker.flagcarried)
Definition sv_ctf.qc:2325
#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

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

Referenced by bot_serverframe().

◆ spawnfunc()

spawnfunc ( waypoint )

Definition at line 1292 of file waypoints.qc.

1293{
1294 IL_PUSH(g_waypoints, this);
1295
1296 setorigin(this, this.origin);
1297 // schedule a relink after other waypoints have had a chance to spawn
1298 waypoint_clearlinks(this);
1299 //waypoint_schedulerelink(this);
1300}
IntrusiveList g_waypoints
Definition api.qh:148
vector origin
ERASEABLE entity IL_PUSH(IntrusiveList this, entity it)
Push to tail.
void waypoint_clearlinks(entity wp)

References g_waypoints, IL_PUSH(), origin, and waypoint_clearlinks().

◆ waypoint_addlink()

void waypoint_addlink ( entity from,
entity to )

Definition at line 1133 of file waypoints.qc.

1134{
1135 if ((from.wpflags & WPFLAGMASK_NORELINK) && !(from.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT)))
1137 else
1138 waypoint_addlink_customcost(from, to, -1);
1139
1140 if (from.wpflags & WAYPOINTFLAG_SUPPORT)
1141 to.SUPPORT_WP = from;
1142}
const int WAYPOINTFLAG_SUPPORT
Definition api.qh:23
const int WPFLAGMASK_NORELINK
Definition api.qh:29
const int WAYPOINTFLAG_JUMP
Definition api.qh:20
void waypoint_addlink_customcost(entity from, entity to, float c)
void waypoint_addlink_for_custom_jumppad(entity wp_from, entity wp_to)
Definition waypoints.qc:498

References entity(), 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(), waypoint_spawn_fromeditor(), and waypoint_think().

◆ waypoint_addlink_customcost()

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

Definition at line 1088 of file waypoints.qc.

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

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

Referenced by waypoint_addlink().

◆ waypoint_clearlinks()

void waypoint_clearlinks ( entity wp)

Definition at line 1253 of file waypoints.qc.

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

References entity(), and NULL.

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

◆ waypoint_fixorigin_down_dir()

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

Definition at line 1960 of file waypoints.qc.

1961{
1962 vector endpos = position + down_dir * 3000;
1963 tracebox(position + '0 0 1', PL_MIN_CONST, PL_MAX_CONST, endpos, MOVE_NOMONSTERS, tracetest_ent);
1965 tracebox(position + '0 0 1' * (1 - PL_MIN_CONST.z / 2), PL_MIN_CONST, PL_MAX_CONST, endpos, MOVE_NOMONSTERS, tracetest_ent);
1967 tracebox(position + '0 0 1' * (1 - PL_MIN_CONST.z), PL_MIN_CONST, PL_MAX_CONST, endpos, MOVE_NOMONSTERS, tracetest_ent);
1968 if(trace_fraction < 1)
1969 position = trace_endpos;
1970 return position;
1971}
const vector PL_MIN_CONST
Definition constants.qh:56
const vector PL_MAX_CONST
Definition constants.qh:55
const float MOVE_NOMONSTERS
vector trace_endpos
float trace_startsolid
float trace_fraction
vector
Definition self.qh:92

References entity(), MOVE_NOMONSTERS, PL_MAX_CONST, PL_MIN_CONST, trace_endpos, trace_fraction, trace_startsolid, and vector.

Referenced by waypoint_spawnforteleporter_wz().

◆ waypoint_get_assigned_link_cost()

float waypoint_get_assigned_link_cost ( entity w,
float i )

Definition at line 1581 of file waypoints.qc.

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

References entity().

◆ waypoint_getlinearcost()

float waypoint_getlinearcost ( float dist)

Definition at line 1010 of file waypoints.qc.

1011{
1013 return dist / (autocvar_sv_maxspeed * 1.25);
1014 return dist / autocvar_sv_maxspeed;
1015}
float skill
Definition api.qh:35
float autocvar_bot_ai_bunnyhop_skilloffset
Definition cvars.qh:19

References autocvar_bot_ai_bunnyhop_skilloffset, autocvar_sv_maxspeed, and skill.

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

◆ waypoint_getlinkcost()

float waypoint_getlinkcost ( entity from,
entity to )

Definition at line 1065 of file waypoints.qc.

1066{
1067 vector v1 = from.origin;
1068 vector v2 = to.origin;
1069 if (from.wpisbox)
1070 {
1071 vector m1 = from.absmin, m2 = from.absmax;
1072 v1.x = bound(m1.x, v2.x, m2.x);
1073 v1.y = bound(m1.y, v2.y, m2.y);
1074 v1.z = bound(m1.z, v2.z, m2.z);
1075 }
1076 if (to.wpisbox)
1077 {
1078 vector m1 = to.absmin, m2 = to.absmax;
1079 v2.x = bound(m1.x, v1.x, m2.x);
1080 v2.y = bound(m1.y, v1.y, m2.y);
1081 v2.z = bound(m1.z, v1.z, m2.z);
1082 }
1083 return waypoint_gettravelcost(v1, v2, from, to);
1084}
float bound(float min, float value, float max)
float waypoint_gettravelcost(vector from, vector to, entity from_ent, entity to_ent)

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

Referenced by waypoint_addlink_customcost().

◆ waypoint_getlinknum()

int waypoint_getlinknum ( entity from,
entity to )

Definition at line 953 of file waypoints.qc.

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

References entity().

Referenced by waypoint_islinked(), and waypoint_removelink().

◆ waypoint_gettravelcost()

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

Definition at line 1028 of file waypoints.qc.

1029{
1030 bool submerged_from = navigation_check_submerged_state(from_ent, from);
1031 bool submerged_to = navigation_check_submerged_state(to_ent, to);
1032
1033 if (submerged_from && submerged_to)
1034 return waypoint_getlinearcost_underwater(vlen(to - from));
1035
1036 if ((from_ent.wpflags & WAYPOINTFLAG_CROUCH) && (to_ent.wpflags & WAYPOINTFLAG_CROUCH))
1037 return waypoint_getlinearcost_crouched(vlen(to - from));
1038
1039 float c = waypoint_getlinearcost(vlen(to - from));
1040
1041 float height = from.z - to.z;
1043 {
1044 float height_cost; // fall cost
1045 if (from_ent.wpflags & WAYPOINTFLAG_JUMP)
1046 height_cost = jumpheight_time + sqrt((height + jumpheight_vec.z) / (autocvar_sv_gravity / 2));
1047 else
1048 height_cost = sqrt(height / (autocvar_sv_gravity / 2));
1049 c = waypoint_getlinearcost(vlen(vec2(to - from))); // xy distance cost
1050 if(height_cost > c)
1051 c = height_cost;
1052 }
1053
1054 // consider half path underwater
1055 if (submerged_from || submerged_to)
1056 return (c + waypoint_getlinearcost_underwater(vlen(to - from))) / 2;
1057
1058 // consider half path crouched
1059 if ((from_ent.wpflags & WAYPOINTFLAG_CROUCH) || (to_ent.wpflags & WAYPOINTFLAG_CROUCH))
1060 return (c + waypoint_getlinearcost_crouched(vlen(to - from))) / 2;
1061
1062 return c;
1063}
const int WAYPOINTFLAG_CROUCH
Definition api.qh:22
float height
Definition bobbing.qc:3
#define autocvar_sv_gravity
Definition stats.qh:421
float vlen(vector v)
float sqrt(float f)
bool navigation_check_submerged_state(entity ent, vector pos)
vector jumpheight_vec
Definition navigation.qh:12
float jumpheight_time
Definition navigation.qh:13
float waypoint_getlinearcost_underwater(float dist)
float waypoint_getlinearcost_crouched(float dist)
float waypoint_getlinearcost(float dist)

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

Referenced by navigation_markroutes_checkwaypoint(), and waypoint_getlinkcost().

◆ waypoint_has_hardwiredlinks()

bool waypoint_has_hardwiredlinks ( entity wp)

Definition at line 276 of file waypoints.qc.

277{
278 if (!wp)
279 return false;
280 return (wp.wphw00 != NULL);
281}

References entity(), and NULL.

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

◆ waypoint_is_hardwiredlink()

bool waypoint_is_hardwiredlink ( entity wp_from,
entity wp_to )

Definition at line 283 of file waypoints.qc.

284{
285 if (!(wp_from && wp_to))
286 return false;
287
288 if (!wp_from.wphw00) return false; else if (wp_from.wphw00 == wp_to) return true;
289 if (!wp_from.wphw01) return false; else if (wp_from.wphw01 == wp_to) return true;
290 if (!wp_from.wphw02) return false; else if (wp_from.wphw02 == wp_to) return true;
291 if (!wp_from.wphw03) return false; else if (wp_from.wphw03 == wp_to) return true;
292 if (!wp_from.wphw04) return false; else if (wp_from.wphw04 == wp_to) return true;
293 if (!wp_from.wphw05) return false; else if (wp_from.wphw05 == wp_to) return true;
294 if (!wp_from.wphw06) return false; else if (wp_from.wphw06 == wp_to) return true;
295 if (!wp_from.wphw07) return false; else if (wp_from.wphw07 == wp_to) return true;
296
297 return false;
298}

References entity().

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

◆ waypoint_islinked()

bool waypoint_islinked ( entity from,
entity to )

Definition at line 966 of file waypoints.qc.

967{
968 return (waypoint_getlinknum(from, to) >= 0);
969}
int waypoint_getlinknum(entity from, entity to)
Definition waypoints.qc:953

References entity(), and waypoint_getlinknum().

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

◆ waypoint_load_hardwiredlinks()

void waypoint_load_hardwiredlinks ( )

Definition at line 1465 of file waypoints.qc.

1466{
1467 string s;
1468 float file, tokens, c = 0, found;
1469 entity wp_from = NULL, wp_to;
1470 vector wp_to_pos, wp_from_pos;
1471
1472 string gt_ext = GET_GAMETYPE_EXTENSION();
1473
1474 string filename = sprintf("maps/%s.waypoints.hardwired", strcat(mapname, gt_ext));
1475 file = fopen(filename, FILE_READ);
1476
1477 if (gt_ext != "" && file < 0)
1478 {
1479 // if race waypoint file doesn't exist load the default one
1480 filename = sprintf("maps/%s.waypoints.hardwired", mapname);
1481 file = fopen(filename, FILE_READ);
1482 }
1483
1485
1486 if (file < 0)
1487 {
1488 LOG_TRACE("waypoint links load from ", filename, " failed");
1489 return;
1490 }
1491
1492 bool is_special = false;
1493 while ((s = fgets(file)))
1494 {
1495 if(substring(s, 0, 2)=="//")
1496 continue;
1497
1498 if(substring(s, 0, 1)=="#")
1499 continue;
1500
1501 // special links start with *, so old xonotic versions don't load them
1502 is_special = false;
1503 if (substring(s, 0, 1) == "*")
1504 {
1505 is_special = true;
1506 s = substring(s, 1, -1);
1507 }
1508
1509 tokens = tokenizebyseparator(s, "*");
1510
1511 if (tokens!=2)
1512 continue;
1513
1514 wp_from_pos = stov(argv(0));
1515 wp_to_pos = stov(argv(1));
1516
1517 // Search "from" waypoint
1518 if(!wp_from || wp_from.origin!=wp_from_pos)
1519 {
1520 wp_from = findradius(wp_from_pos, 5);
1521 found = false;
1522 while(wp_from)
1523 {
1524 if(vdist(wp_from.origin - wp_from_pos, <, 5))
1525 if(wp_from.classname == "waypoint")
1526 {
1527 found = true;
1528 break;
1529 }
1530 wp_from = wp_from.chain;
1531 }
1532
1533 if(!found)
1534 {
1535 s = strcat(((is_special) ? "special link " : "hardwired link "), s);
1536 LOG_INFO("NOTICE: Can not find origin waypoint of the ", s, ". Path skipped");
1537 continue;
1538 }
1539 }
1540
1541 // Search "to" waypoint
1542 wp_to = findradius(wp_to_pos, 5);
1543 found = false;
1544 while(wp_to)
1545 {
1546 if(vdist(wp_to.origin - wp_to_pos, <, 5))
1547 if(wp_to.classname == "waypoint")
1548 {
1549 found = true;
1550 break;
1551 }
1552 wp_to = wp_to.chain;
1553 }
1554
1555 if(!found)
1556 {
1557 s = strcat(((is_special) ? "special link " : "hardwired link "), s);
1558 LOG_INFO("NOTICE: Can not find destination waypoint of the ", s, ". Path skipped");
1559 continue;
1560 }
1561
1562 ++c;
1563
1564 if (!is_special)
1565 {
1566 waypoint_addlink(wp_from, wp_to);
1567 waypoint_mark_hardwiredlink(wp_from, wp_to);
1568 }
1569 else if ((wp_from.wpflags & WPFLAGMASK_NORELINK) && ((wp_from.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT))
1570 || (wp_from.wpisbox && (wp_from.wpflags & WAYPOINTFLAG_TELEPORT))))
1571 {
1572 waypoint_addlink(wp_from, wp_to);
1573 }
1574 }
1575
1576 fclose(file);
1577
1578 LOG_TRACE("loaded ", ftos(c), " waypoint links from maps/", mapname, ".waypoints.hardwired");
1579}
const int WAYPOINTFLAG_TELEPORT
Definition api.qh:13
string mapname
const float FILE_READ
#define tokenizebyseparator
#define LOG_INFO(...)
Definition log.qh:65
#define LOG_TRACE(...)
Definition log.qh:76
string fgets(float fhandle)
void fclose(float fhandle)
string substring(string s, float start, float length)
float fopen(string filename, float mode)
vector stov(string s)
string ftos(float f)
string argv(float n)
strcat(_("^F4Countdown stopped!"), "\n^BG", _("Teams are too unbalanced."))
#define GET_GAMETYPE_EXTENSION()
void waypoint_addlink(entity from, entity to)
void waypoint_mark_hardwiredlink(entity wp_from, entity wp_to)
Definition waypoints.qc:301
float botframe_loadedforcedlinks
Definition waypoints.qh:23

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().

◆ waypoint_load_links()

bool waypoint_load_links ( )

Definition at line 1317 of file waypoints.qc.

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

References argv(), 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().

◆ waypoint_loadall()

float waypoint_loadall ( )

Definition at line 1837 of file waypoints.qc.

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

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().

◆ waypoint_mark_hardwiredlink()

void waypoint_mark_hardwiredlink ( entity wp_from,
entity wp_to )

Definition at line 301 of file waypoints.qc.

302{
303 if (!(wp_from && wp_to))
304 return;
305
306 if (!wp_from.wphw00 || wp_from.wphw00 == wp_to) { wp_from.wphw00 = wp_to; waypoint_setupmodel(wp_from); return; }
307 if (!wp_from.wphw01 || wp_from.wphw01 == wp_to) { wp_from.wphw01 = wp_to; return; }
308 if (!wp_from.wphw02 || wp_from.wphw02 == wp_to) { wp_from.wphw02 = wp_to; return; }
309 if (!wp_from.wphw03 || wp_from.wphw03 == wp_to) { wp_from.wphw03 = wp_to; return; }
310 if (!wp_from.wphw04 || wp_from.wphw04 == wp_to) { wp_from.wphw04 = wp_to; return; }
311 if (!wp_from.wphw05 || wp_from.wphw05 == wp_to) { wp_from.wphw05 = wp_to; return; }
312 if (!wp_from.wphw06 || wp_from.wphw06 == wp_to) { wp_from.wphw06 = wp_to; return; }
313 if (!wp_from.wphw07 || wp_from.wphw07 == wp_to) { wp_from.wphw07 = wp_to; return; }
314
315 return;
316}
void waypoint_setupmodel(entity wp)
Definition waypoints.qc:362

References entity(), and waypoint_setupmodel().

Referenced by waypoint_load_hardwiredlinks(), and waypoint_spawn_fromeditor().

◆ waypoint_remove()

void waypoint_remove ( entity wp)

Definition at line 819 of file waypoints.qc.

820{
821 IL_EACH(g_waypoints, it != wp,
822 {
823 if (it.SUPPORT_WP == wp)
824 {
825 it.SUPPORT_WP = NULL;
826 waypoint_schedulerelink(it); // restore incoming links
827 }
828 if (waypoint_islinked(it, wp))
829 {
830 if (waypoint_is_hardwiredlink(it, wp))
832 waypoint_removelink(it, wp);
833 }
834 });
835 delete(wp);
836}
void waypoint_unmark_hardwiredlink(entity wp_from, entity wp_to)
Definition waypoints.qc:318
bool waypoint_is_hardwiredlink(entity wp_from, entity wp_to)
Definition waypoints.qc:283
void waypoint_schedulerelink(entity wp)
void waypoint_removelink(entity from, entity to)
Definition waypoints.qc:905

Referenced by waypoint_spawn_fromeditor().

◆ waypoint_remove_fromeditor()

void waypoint_remove_fromeditor ( entity pl)

Definition at line 838 of file waypoints.qc.

839{
841 {
842 LOG_INFOF("^1Editing waypoints with a higher version number (%f) is not allowed.\n"
843 "Update Xonotic to make them editable.", waypoint_version_loaded);
844 return;
845 }
846
848
849 int ctf_flags = havocbot_symmetry_origin_order;
850 bool sym = ((autocvar_g_waypointeditor_symmetrical > 0 && ctf_flags >= 2)
854 if (sym && ctf_flags < 2)
855 ctf_flags = 2;
856 int wp_num = ctf_flags;
857
858 LABEL(remove_wp);
859 if (!e) return;
860
861 if (e.wpflags & WAYPOINTFLAG_GENERATED)
862 {
865 return;
866 }
867
869 {
870 LOG_INFO("Can't remove a waypoint with hardwired links, remove links with \"wpeditor hardwire\" first\n");
871 return;
872 }
873
874 entity wp_sym = NULL;
875 if (sym)
876 {
877 vector org = waypoint_getSymmetricalPoint(e.origin, ctf_flags);
878 FOREACH_ENTITY_CLASS("waypoint", !(it.wpflags & WAYPOINTFLAG_GENERATED), {
879 if(vdist(org - it.origin, <, 3))
880 {
881 wp_sym = it;
882 break;
883 }
884 });
885 }
886
887 bprint(strcat("Waypoint removed at ", vtos(e.origin), "\n"));
888 te_explosion(e.origin);
890
891 if (sym && wp_sym)
892 {
893 e = wp_sym;
894 if(wp_num > 2)
895 wp_num--;
896 else
897 sym = false;
898 goto remove_wp;
899 }
900
903}
entity navigation_findnearestwaypoint(entity ent, float walkfromwp)
float havocbot_symmetry_origin_order
Definition api.qh:95
const int WAYPOINTFLAG_GENERATED
Definition api.qh:11
#define LABEL(id)
Definition compiler.qh:34
#define FOREACH_ENTITY_CLASS(class, cond, body)
Definition iter.qh:189
void bprint(string text,...)
vector org
Definition self.qh:92
bool waypoint_has_hardwiredlinks(entity wp)
Definition waypoints.qc:276
vector waypoint_getSymmetricalPoint(vector org, int ctf_flags)
Definition waypoints.qc:241
void waypoint_clear_start_wp_globals(entity pl, bool warn)
Definition waypoints.qc:521
bool start_wp_is_spawned
Definition waypoints.qc:516
void waypoint_remove(entity wp)
Definition waypoints.qc:819
bool autocvar_g_waypointeditor_symmetrical
Definition waypoints.qh:6
int autocvar_g_waypointeditor_symmetrical_order
Definition waypoints.qh:9

◆ waypoint_removelink()

void waypoint_removelink ( entity from,
entity to )

Definition at line 905 of file waypoints.qc.

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

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

Referenced by waypoint_remove(), and waypoint_spawn_fromeditor().

◆ waypoint_save_links()

void waypoint_save_links ( )

Definition at line 1716 of file waypoints.qc.

1717{
1718 string gt_ext = GET_GAMETYPE_EXTENSION();
1719
1720 string filename = sprintf("maps/%s.waypoints.cache", strcat(mapname, gt_ext));
1721 int file = fopen(filename, FILE_WRITE);
1722 if (file < 0)
1723 {
1724 LOG_INFOF("waypoint link save to %s failed", filename);
1725 return;
1726 }
1727
1728 fputs(file, strcat("//", "WAYPOINT_VERSION ", ftos_decimals(WAYPOINT_VERSION, 2), "\n"));
1729 if (waypoint_time != "")
1730 fputs(file, strcat("//", "WAYPOINT_TIME ", waypoint_time, "\n"));
1731
1732 int c = 0;
1734 {
1735 for(int j = 0; j < 32; ++j)
1736 {
1737 entity link = waypoint_get_link(it, j);
1738 if (link && !waypoint_is_hardwiredlink(it, link))
1739 {
1740 // NOTE: vtos rounds vector components to 1 decimal place
1741 string s = strcat(vtos(it.origin), "*", vtos(link.origin), "\n");
1742 fputs(file, s);
1743 ++c;
1744 }
1745 }
1746 });
1747 fclose(file);
1748
1750
1751 LOG_INFOF("saved %d waypoint links to %s", c, filename);
1752}
const float FILE_WRITE
void fputs(float fhandle, string s)
ERASEABLE string ftos_decimals(float number, int decimals)
converts a number to a string with the indicated number of decimals
Definition string.qh:469

References 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().

◆ waypoint_saveall()

void waypoint_saveall ( )

Definition at line 1755 of file waypoints.qc.

1756{
1758 {
1759 LOG_INFOF("^1Overwriting waypoints with a higher version number (%f) is not allowed.\n"
1760 "Update Xonotic to make them editable.", waypoint_version_loaded);
1761 return;
1762 }
1763 string gt_ext = GET_GAMETYPE_EXTENSION();
1764
1765 string filename = sprintf("maps/%s.waypoints", strcat(mapname, gt_ext));
1766 int file = fopen(filename, FILE_WRITE);
1767 if (file < 0)
1768 {
1769 waypoint_save_links(); // save anyway?
1771
1772 LOG_INFOF("waypoint links: save to %s failed", filename);
1773 return;
1774 }
1775
1777 string sym_str = ftos(sym);
1778 if (sym == -1 || (sym == 1 && autocvar_g_waypointeditor_symmetrical_order >= 2))
1779 {
1780 if (sym == 1)
1781 {
1782 sym_str = cons(sym_str, "-");
1783 sym_str = cons(sym_str, "-");
1784 }
1785 else
1786 {
1789 }
1792 }
1794 {
1797 }
1798
1799 // a group of 3 comments doesn't break compatibility with older Xonotic versions
1800 // (they are read as a waypoint with origin '0 0 0' and flag 0 though)
1801 fputs(file, strcat("//", "WAYPOINT_VERSION ", ftos_decimals(WAYPOINT_VERSION, 2), "\n"));
1802 fputs(file, strcat("//", "WAYPOINT_SYMMETRY ", sym_str, "\n"));
1803
1804 strcpy(waypoint_time, strftime(true, "%Y-%m-%d %H:%M:%S"));
1805 fputs(file, strcat("//", "WAYPOINT_TIME ", waypoint_time, "\n"));
1806 //fputs(file, strcat("//", "\n"));
1807 //fputs(file, strcat("//", "\n"));
1808 //fputs(file, strcat("//", "\n"));
1809
1810 int c = 0;
1811 IL_EACH(g_waypoints, true,
1812 {
1813 if(it.wpflags & WAYPOINTFLAG_GENERATED)
1814 continue;
1815
1816 string s;
1817 // NOTE: vtos rounds vector components to 1 decimal place
1818 s = strcat(vtos(it.origin + it.mins), "\n");
1819 s = strcat(s, vtos(it.origin + it.maxs));
1820 s = strcat(s, "\n");
1821 s = strcat(s, ftos(it.wpflags));
1822 s = strcat(s, "\n");
1823 fputs(file, s);
1824 c++;
1825 });
1826 fclose(file);
1829
1831
1833 LOG_INFOF("saved %d waypoints to %s", c, filename);
1834}
void waypoint_save_hardwiredlinks()
void waypoint_save_links()
vector autocvar_g_waypointeditor_symmetrical_axis
Definition waypoints.qh:10
vector autocvar_g_waypointeditor_symmetrical_origin
Definition waypoints.qh:8

◆ waypoint_schedulerelink()

void waypoint_schedulerelink ( entity wp)

Definition at line 1273 of file waypoints.qc.

1274{
1275 if (wp == NULL)
1276 return;
1277
1279 wp.wpisbox = vdist(wp.size, >, 0);
1280 wp.enemy = NULL;
1281 if (!(wp.wpflags & WAYPOINTFLAG_PERSONAL))
1282 wp.owner = NULL;
1283 if (!(wp.wpflags & WPFLAGMASK_NORELINK))
1285 // schedule an actual relink on next frame
1287 wp.nextthink = time;
1288 wp.effects = EF_LOWPRECISION;
1289}
const int WAYPOINTFLAG_PERSONAL
Definition api.qh:15
float EF_LOWPRECISION
#define setthink(e, f)
void waypoint_think(entity this)

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

◆ waypoint_schedulerelinkall()

void waypoint_schedulerelinkall ( )

Definition at line 1304 of file waypoints.qc.

1305{
1307 IL_EACH(g_waypoints, true,
1308 {
1310 });
1312}
void waypoint_load_hardwiredlinks()
float relink_total
Definition waypoints.qh:20
float relink_lengthculled
Definition waypoints.qh:20
float relink_walkculled
Definition waypoints.qh:20
float relink_pvsculled
Definition waypoints.qh:20

Referenced by waypoint_load_links().

◆ waypoint_spawn()

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

Definition at line 433 of file waypoints.qc.

434{
435 if(!(f & (WAYPOINTFLAG_PERSONAL | WAYPOINTFLAG_GENERATED)) && m1 == m2)
436 {
437 entity wp_found = waypoint_get(m1, m2);
438 if (wp_found)
439 return wp_found;
440 }
441 // spawn only one destination waypoint for teleports teleporting player to the exact same spot
442 // otherwise links loaded from file would be applied only to the first destination
443 // waypoint since link format doesn't specify waypoint entities but just positions
444 if((f & WAYPOINTFLAG_GENERATED) && !(f & (WPFLAGMASK_NORELINK | WAYPOINTFLAG_PERSONAL)) && m1 == m2)
445 {
446 IL_EACH(g_waypoints, boxesoverlap(m1, m2, it.absmin, it.absmax),
447 {
448 return it;
449 });
450 }
451
452 entity w = new(waypoint);
455 w.wpflags = f;
456 w.solid = SOLID_TRIGGER;
457 w.createdtime = time;
458 setorigin(w, (m1 + m2) * 0.5);
459 setsize(w, m1 - w.origin, m2 - w.origin);
460 if (w.size)
461 w.wpisbox = true;
462
463 if(!w.wpisbox)
464 {
465 if (f & WAYPOINTFLAG_CROUCH)
466 setsize(w, PL_CROUCH_MIN_CONST - '1 1 0', PL_CROUCH_MAX_CONST + '1 1 0');
467 else
468 setsize(w, PL_MIN_CONST - '1 1 0', PL_MAX_CONST + '1 1 0');
469 if(!move_out_of_solid(w))
470 {
471 if(!(f & WAYPOINTFLAG_GENERATED))
472 {
473 LOG_TRACE("Killed a waypoint that was stuck in solid at ", vtos(w.origin));
474 delete(w);
475 return NULL;
476 }
477 else
478 {
479 if(autocvar_developer > 0)
480 {
481 LOG_INFO("A generated waypoint is stuck in solid at ", vtos(w.origin));
482 backtrace("Waypoint stuck");
483 }
484 }
485 }
486 setsize(w, '0 0 0', '0 0 0');
487 }
488
490 //waypoint_schedulerelink(w);
491
493
494 return w;
495}
const vector PL_CROUCH_MIN_CONST
Definition constants.qh:58
const vector PL_CROUCH_MAX_CONST
Definition constants.qh:57
float DPCONTENTS_BOTCLIP
const float SOLID_TRIGGER
float DPCONTENTS_SOLID
float DPCONTENTS_BODY
float DPCONTENTS_PLAYERCLIP
#define move_out_of_solid(e)
Definition common.qh:110
noref int autocvar_developer
Definition log.qh:96
#define backtrace(msg)
Definition log.qh:99
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:420

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

◆ 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 568 of file waypoints.qc.

569{
571 {
572 LOG_INFOF("^1Editing waypoints with a higher version number (%f) is not allowed.\n"
573 "Update Xonotic to make them editable.", waypoint_version_loaded);
574 return;
575 }
576
577 entity e = NULL, jp = NULL;
578 vector org = pl.origin;
579 if (at_crosshair)
580 {
583 if (!trace_ent)
584 org.z -= PL_MIN_CONST.z;
586 IL_EACH(g_jumppads, boxesoverlap(org + PL_MIN_CONST, org + PL_MAX_CONST, it.absmin, it.absmax),
587 {
588 jp = it;
589 break;
590 });
591 if (!jp && !start_wp_is_spawned && trace_ent)
592 {
593 if (trace_ent.wpflags & (WAYPOINTFLAG_JUMP))
594 is_jump_wp = true;
595 else if (trace_ent.wpflags & (WAYPOINTFLAG_SUPPORT))
596 is_support_wp = true;
597 }
598 }
599 if (jp || is_jump_wp || is_support_wp)
600 {
602 start_wp_is_spawned = false;
603 LOG_INFO("^xf80Spawning start waypoint...\n");
604 }
605 int ctf_flags = havocbot_symmetry_origin_order;
606 bool sym = ((autocvar_g_waypointeditor_symmetrical > 0 && ctf_flags >= 2)
610 if (sym && ctf_flags < 2)
611 ctf_flags = 2;
612 int wp_num = ctf_flags;
613
614 if(!PHYS_INPUT_BUTTON_CROUCH(pl) && !at_crosshair && !is_jump_wp && !is_support_wp)
615 {
616 // snap waypoint to item's origin if close enough
617 IL_EACH(g_items, true,
618 {
619 vector item_org = (it.absmin + it.absmax) * 0.5;
620 item_org.z = it.absmin.z - PL_MIN_CONST.z;
621 if (vlen(item_org - org) < 20)
622 {
623 org = item_org;
624 break;
625 }
626 });
627 }
628
629 vector start_org = '0 0 0';
631 {
633 LOG_INFO("^xf80Spawning destination waypoint...\n");
634 start_org = start_wp_origin;
635 }
636
637 // save org as it can be modified spawning symmetrycal waypoints
638 vector initial_origin = '0 0 0';
639 bool initial_origin_is_set = false;
640
641 LABEL(add_wp);
642
643 if (jp)
644 {
645 e = NULL;
647 && boxesoverlap(org + PL_MIN_CONST, org + PL_MAX_CONST, it.absmin, it.absmax),
648 {
649 e = it; break;
650 });
651 if (!e)
652 e = waypoint_spawn(jp.absmin - PL_MAX_CONST, jp.absmax - PL_MIN_CONST, WAYPOINTFLAG_TELEPORT);
653 if (!pl.wp_locked)
654 pl.wp_locked = e;
655 }
656 else if (is_jump_wp || is_support_wp)
657 {
658 int type_flag = (is_jump_wp) ? WAYPOINTFLAG_JUMP : WAYPOINTFLAG_SUPPORT;
659
660 entity wp_found = waypoint_get(org, org);
661 if (wp_found && !(wp_found.wpflags & type_flag))
662 {
663 LOG_INFOF("Error: can't spawn a %s waypoint over an existent waypoint of a different type\n", (is_jump_wp) ? "Jump" : "Support");
664 return;
665 }
666 e = waypoint_spawn(org, org, type_flag);
667 if (!pl.wp_locked)
668 pl.wp_locked = e;
669 }
670 else
671 e = waypoint_spawn(org, org, (is_crouch_wp) ? WAYPOINTFLAG_CROUCH : 0);
672 if(!e)
673 {
674 LOG_INFOF("Couldn't spawn waypoint at %v\n", org);
677 return;
678 }
679
680 if (!initial_origin_is_set)
681 {
682 initial_origin = e.origin;
683 initial_origin_is_set = true;
684 }
685
686 entity start_wp = NULL;
688 {
690 && boxesoverlap(start_org, start_org, it.absmin, it.absmax),
691 {
692 start_wp = it; break;
693 });
694 if(!start_wp)
695 {
696 // should not happen
697 LOG_INFOF("Couldn't find start waypoint at %v\n", start_org);
699 return;
700 }
702 {
703 if (waypoint_is_hardwiredlink(start_wp, e))
704 {
706 waypoint_removelink(start_wp, e);
707 string s = strcat(vtos(start_wp.origin), "*", vtos(e.origin));
708 LOG_INFOF("^x80fRemoved hardwired link %s.\n", s);
709 }
710 else
711 {
712 if (e.createdtime == time)
713 {
714 LOG_INFO("Error: hardwired links can be created only between 2 existing (and unconnected) waypoints.\n");
717 waypoint_spawn_fromeditor(pl, at_crosshair, is_jump_wp, is_crouch_wp, is_support_wp);
718 return;
719 }
720 if (start_wp == e)
721 {
722 LOG_INFO("Error: start and destination waypoints coincide.\n");
724 return;
725 }
726 if (waypoint_islinked(start_wp, e))
727 {
728 LOG_INFO("Error: waypoints are already linked.\n");
730 return;
731 }
732 waypoint_addlink(start_wp, e);
733 waypoint_mark_hardwiredlink(start_wp, e);
734 string s = strcat(vtos(start_wp.origin), "*", vtos(e.origin));
735 LOG_INFOF("^x80fAdded hardwired link %s.\n", s);
736 }
737 }
738 else
739 {
741 {
742 if (e.SUPPORT_WP)
743 {
744 LOG_INFOF("Waypoint %v has already a support waypoint, delete it first.\n", e.origin);
746 return;
747 }
748 // clear all links to e
749 IL_EACH(g_waypoints, it != e,
750 {
751 if (waypoint_islinked(it, e) && !waypoint_is_hardwiredlink(it, e))
752 waypoint_removelink(it, e);
753 });
754 }
755 waypoint_addlink(start_wp, e);
756 }
757 }
758
759 if (!(jp || is_jump_wp || is_support_wp || start_wp_is_hardwired))
761
762 string wp_type_str = waypoint_get_type_name(e);
763
764 bprint(strcat(wp_type_str, "^7 spawned at ", vtos(e.origin), "\n"));
765
767 {
768 pl.wp_locked = NULL;
770 waypoint_schedulerelink(start_wp);
771 if (start_wp.wpflags & WAYPOINTFLAG_TELEPORT)
772 {
773 if (start_wp.wp00_original == start_wp.wp00)
774 start_wp.wpflags &= ~WAYPOINTFLAG_CUSTOM_JP;
775 else
776 start_wp.wpflags |= WAYPOINTFLAG_CUSTOM_JP;
777 }
778 }
779
780 if (sym)
781 {
783 if (jp)
784 {
785 IL_EACH(g_jumppads, boxesoverlap(org + PL_MIN_CONST, org + PL_MAX_CONST, it.absmin, it.absmax),
786 {
787 jp = it; break;
788 });
789 }
791 start_org = waypoint_getSymmetricalPoint(start_org, ctf_flags);
792 if (vdist(org - pl.origin, >, 32))
793 {
794 if(wp_num > 2)
795 wp_num--;
796 else
797 sym = false;
798 goto add_wp;
799 }
800 }
801 if (jp || is_jump_wp || is_support_wp)
802 {
804 {
805 // we've just created a custom jumppad waypoint
806 // the next one created by the user will be the destination waypoint
807 start_wp_is_spawned = true;
808 start_wp_origin = initial_origin;
809 if (is_support_wp)
810 start_wp_is_support = true;
811 }
812 }
813 else if (start_wp_is_spawned)
814 {
816 }
817}
#define PHYS_INPUT_BUTTON_CROUCH(s)
Definition player.qh:154
entity trace_ent
IntrusiveList g_jumppads
Definition jumppads.qh:18
IntrusiveList g_items
Definition items.qh:125
bool start_wp_is_support
Definition waypoints.qc:519
string waypoint_get_type_name(entity wp)
Definition waypoints.qc:397
bool start_wp_is_hardwired
Definition waypoints.qc:518
vector start_wp_origin
Definition waypoints.qc:517
void waypoint_spawn_fromeditor(entity pl, bool at_crosshair, bool is_jump_wp, bool is_crouch_wp, bool is_support_wp)
Definition waypoints.qc:568
void crosshair_trace_waypoints(entity pl)

Referenced by waypoint_spawn_fromeditor().

◆ waypoint_spawnforitem()

void waypoint_spawnforitem ( entity e)

Definition at line 2002 of file waypoints.qc.

2003{
2005 return;
2006
2007 waypoint_spawnforitem_force(e, e.origin);
2008}
bool bot_waypoints_for_items
Definition api.qh:9
void waypoint_spawnforitem_force(entity e, vector org)

◆ waypoint_spawnforitem_force()

void waypoint_spawnforitem_force ( entity e,
vector org )

Definition at line 1973 of file waypoints.qc.

1974{
1975 // Fix the waypoint altitude if necessary
1977
1978 // don't spawn an item spawnfunc_waypoint if it already exists
1979 IL_EACH(g_waypoints, true,
1980 {
1981 if(it.wpisbox)
1982 {
1983 if(boxesoverlap(org, org, it.absmin, it.absmax))
1984 {
1985 e.nearestwaypoint = it;
1986 return;
1987 }
1988 }
1989 else
1990 {
1991 if(vdist(it.origin - org, <, 16))
1992 {
1993 e.nearestwaypoint = it;
1994 return;
1995 }
1996 }
1997 });
1998
2000}
#define waypoint_fixorigin(position, tracetest_ent)

Referenced by waypoint_spawnforitem().

◆ waypoint_spawnforteleporter()

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

Definition at line 2064 of file waypoints.qc.

2065{
2066 destination = waypoint_fixorigin(destination, tracetest_ent);
2067 waypoint_spawnforteleporter_boxes(e, WAYPOINTFLAG_TELEPORT, e.absmin - PL_MAX_CONST, e.absmax - PL_MIN_CONST, destination, destination, timetaken);
2068}
void waypoint_spawnforteleporter_boxes(entity e, int teleport_flag, vector org1, vector org2, vector destination1, vector destination2, float timetaken)

◆ waypoint_spawnforteleporter_wz()

void waypoint_spawnforteleporter_wz ( entity e,
entity tracetest_ent )

Definition at line 2026 of file waypoints.qc.

2027{
2028 float src_angle = e.warpzone_angles.x;
2029 while (src_angle < -180) src_angle += 360;
2030 while (src_angle > 180) src_angle -= 360;
2031
2032 float dest_angle = e.enemy.warpzone_angles.x;
2033 while (dest_angle < -180) dest_angle += 360;
2034 while (dest_angle > 180) dest_angle -= 360;
2035
2036 // no waypoints for warpzones pointing upwards, they can't be used by the bots
2037 if (src_angle == -90 || dest_angle == -90)
2038 return;
2039
2040 makevectors(e.warpzone_angles);
2041 vector src = (e.absmin + e.absmax) * 0.5;
2042 src += ((e.warpzone_origin - src) * v_forward) * v_forward + 16 * v_right;
2043 vector down_dir_src = -v_up;
2044
2045 makevectors(e.enemy.warpzone_angles);
2046 vector dest = (e.enemy.absmin + e.enemy.absmax) * 0.5;
2047 dest += ((e.enemy.warpzone_origin - dest) * v_forward) * v_forward - 16 * v_right;
2048 vector down_dir_dest = -v_up;
2049
2050 int extra_flag = 0;
2051 // don't snap to the ground waypoints for source warpzones pointing downwards
2052 if (src_angle != 90)
2053 {
2054 src = waypoint_fixorigin_down_dir(src, tracetest_ent, down_dir_src);
2055 dest = waypoint_fixorigin_down_dir(dest, tracetest_ent, down_dir_dest);
2056 // oblique warpzones need a jump otherwise bots gets stuck
2057 if (src_angle != 0)
2058 extra_flag = WAYPOINTFLAG_JUMP;
2059 }
2060
2061 waypoint_spawnforteleporter_boxes(e, WAYPOINTFLAG_TELEPORT | extra_flag, src, src, dest, dest, 0);
2062}
vector v_up
vector v_right
vector v_forward
vector dest
Definition jumppads.qh:54
#define makevectors
Definition post.qh:21
vector waypoint_fixorigin_down_dir(vector position, entity tracetest_ent, vector down_dir)

◆ waypoint_spawnpersonal()

entity waypoint_spawnpersonal ( entity this,
vector position )

Definition at line 2070 of file waypoints.qc.

2071{
2072 entity w;
2073
2074 // drop the waypoint to a proper location:
2075 // first move it up by a player height
2076 // then move it down to hit the floor with player bbox size
2077 position = waypoint_fixorigin(position, this);
2078
2080 w.nearestwaypoint = NULL;
2081 w.nearestwaypointtimeout = 0;
2082 w.owner = this;
2083
2085
2086 return w;
2087}

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

Referenced by havocbot_moveto().

◆ waypoint_think()

void waypoint_think ( entity this)

Definition at line 1147 of file waypoints.qc.

1148{
1149 vector sv = '0 0 0', sv2 = '0 0 0', ev = '0 0 0', ev2 = '0 0 0', dv;
1150 float sv2_height = 0, ev2_height = 0;
1151
1153
1154 int dphitcontentsmask_save = this.dphitcontentsmask;
1156
1158
1159 //dprint("waypoint_think wpisbox = ", ftos(this.wpisbox), "\n");
1160 IL_EACH(g_waypoints, this != it,
1161 {
1162 if (boxesoverlap(this.absmin, this.absmax, it.absmin, it.absmax))
1163 {
1164 if (!(this.wpflags & WPFLAGMASK_NORELINK))
1165 waypoint_addlink(this, it);
1166 if (!(it.wpflags & WPFLAGMASK_NORELINK))
1167 waypoint_addlink(it, this);
1168 }
1169 else
1170 {
1171 ++relink_total;
1172 if(!checkpvs(this.origin, it))
1173 {
1175 continue;
1176 }
1177
1178 sv = set_tracewalk_dest_2(this, it.origin);
1179 sv2 = tracewalk_dest;
1180 sv2_height = tracewalk_dest_height;
1181 ev = set_tracewalk_dest_2(it, this.origin);
1182 ev2 = tracewalk_dest;
1183 ev2_height = tracewalk_dest_height;
1184
1185 dv = ev - sv;
1186 dv.z = 0;
1187 int maxdist = 1050;
1188 vector m1 = PL_MIN_CONST;
1189 vector m2 = PL_MAX_CONST;
1190
1191 if ((this.wpflags & WAYPOINTFLAG_CROUCH) || (it.wpflags & WAYPOINTFLAG_CROUCH))
1192 {
1195 // links from crouch wp to normal wp (and viceversa) are very short to avoid creating many links
1196 // that would be wasted due to rough travel cost calculation (the longer link is, the higher cost is)
1197 // links from crouch wp to crouch wp can be as long as normal links
1198 if (!((this.wpflags & WAYPOINTFLAG_CROUCH) && (it.wpflags & WAYPOINTFLAG_CROUCH)))
1199 maxdist = 100;
1200 }
1201
1202 if (vdist(dv, >=, maxdist)) // max search distance in XY
1203 {
1205 continue;
1206 }
1207
1209
1210 //traceline(this.origin, it.origin, false, NULL);
1211 //if (trace_fraction == 1)
1212 if (this.wpisbox || (this.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT)) // forbid outgoing links
1213 || it.SUPPORT_WP) // forbid incoming links
1214 {
1215 relink_walkculled += 0.5;
1216 }
1217 else
1218 {
1219 if (tracewalk(this, sv, m1, m2, ev2, ev2_height, MOVE_NOMONSTERS))
1220 waypoint_addlink(this, it);
1221 else
1222 relink_walkculled += 0.5;
1223 }
1224
1225 // reverse direction
1226 if (it.wpisbox || (it.wpflags & (WAYPOINTFLAG_JUMP | WAYPOINTFLAG_SUPPORT)) // forbid incoming links
1227 || this.SUPPORT_WP) // forbid outgoing links
1228 {
1229 relink_walkculled += 0.5;
1230 }
1231 else
1232 {
1233 if (tracewalk(this, ev, m1, m2, sv2, sv2_height, MOVE_NOMONSTERS))
1234 waypoint_addlink(it, this);
1235 else
1236 relink_walkculled += 0.5;
1237 }
1238 }
1239 });
1240
1241 // waypoint_clearlinks preserves references to old hardwired links (.wphwXX links)
1242 // so they can be restored here when a wp is spawned over an existing one
1244
1246 this.wplinked = true;
1247 this.dphitcontentsmask = dphitcontentsmask_save;
1248
1249 setthink(this, func_null);
1250 this.nextthink = 0;
1251}
bool tracewalk(entity e, vector start, vector m1, vector m2, vector end, float end_height, float movemode)
vector set_tracewalk_dest_2(entity ent, vector org)
int wpflags
Definition api.qh:64
void bot_calculate_stepheightvec()
Definition bot.qc:615
const float MOVE_NORMAL
float checkpvs(vector viewpos, entity viewee)
float nextthink
vector absmax
vector absmin
float dphitcontentsmask
bool autocvar_bot_navigation_ignoreplayers
Definition cvars.qh:50
float bot_navigation_movemode
Definition navigation.qh:7
vector tracewalk_dest
Definition navigation.qh:66
float tracewalk_dest_height
Definition navigation.qh:67
float navigation_testtracewalk
Definition navigation.qh:8
var void func_null()
void waypoint_restore_hardwiredlinks(entity wp)
Definition waypoints.qc:350
int wpisbox
Definition waypoints.qh:45
int wplinked
Definition waypoints.qh:45

References absmax, absmin, autocvar_bot_navigation_ignoreplayers, bot_calculate_stepheightvec(), bot_navigation_movemode, boxesoverlap(), checkpvs(), DPCONTENTS_BODY, DPCONTENTS_BOTCLIP, DPCONTENTS_PLAYERCLIP, DPCONTENTS_SOLID, dphitcontentsmask, entity(), func_null(), g_waypoints, IL_EACH, MOVE_NOMONSTERS, MOVE_NORMAL, navigation_testtracewalk, nextthink, origin, PL_CROUCH_MAX_CONST, PL_CROUCH_MIN_CONST, PL_MAX_CONST, PL_MIN_CONST, relink_lengthculled, relink_pvsculled, relink_total, relink_walkculled, set_tracewalk_dest_2(), setthink, tracewalk(), tracewalk_dest, tracewalk_dest_height, vdist, vector, waypoint_addlink(), waypoint_restore_hardwiredlinks(), WAYPOINTFLAG_CROUCH, WAYPOINTFLAG_JUMP, WAYPOINTFLAG_SUPPORT, WPFLAGMASK_NORELINK, wpflags, wpisbox, and wplinked.

Referenced by waypoint_schedulerelink().

◆ waypoint_unmark_hardwiredlink()

void waypoint_unmark_hardwiredlink ( entity wp_from,
entity wp_to )

Definition at line 318 of file waypoints.qc.

319{
320 if (!(wp_from && wp_to))
321 return;
322
323 int removed = -1;
324 if (removed < 0 && wp_from.wphw00 == wp_to) removed = 0;
325 if (removed < 0 && wp_from.wphw01 == wp_to) removed = 1;
326 if (removed < 0 && wp_from.wphw02 == wp_to) removed = 2;
327 if (removed < 0 && wp_from.wphw03 == wp_to) removed = 3;
328 if (removed < 0 && wp_from.wphw04 == wp_to) removed = 4;
329 if (removed < 0 && wp_from.wphw05 == wp_to) removed = 5;
330 if (removed < 0 && wp_from.wphw06 == wp_to) removed = 6;
331 if (removed < 0 && wp_from.wphw07 == wp_to) removed = 7;
332
333 if (removed >= 0)
334 {
335 if (removed <= 0) wp_from.wphw00 = wp_from.wphw01;
336 if (removed <= 1) wp_from.wphw01 = wp_from.wphw02;
337 if (removed <= 2) wp_from.wphw02 = wp_from.wphw03;
338 if (removed <= 3) wp_from.wphw03 = wp_from.wphw04;
339 if (removed <= 4) wp_from.wphw04 = wp_from.wphw05;
340 if (removed <= 5) wp_from.wphw05 = wp_from.wphw06;
341 if (removed <= 6) wp_from.wphw06 = wp_from.wphw07;
342 if (removed <= 7) wp_from.wphw07 = NULL;
343 if (!wp_from.wphw00)
344 waypoint_setupmodel(wp_from);
345 }
346
347 return;
348}

References entity(), NULL, and waypoint_setupmodel().

Referenced by waypoint_remove(), and waypoint_spawn_fromeditor().

◆ waypoint_unreachable()

void waypoint_unreachable ( entity pl)

Definition at line 28 of file waypoints.qc.

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
37 if(!e2)
38 {
39 LOG_INFO("Can't find any waypoint nearby\n");
40 return;
41 }
42
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;
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);
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}
void navigation_markroutes_inverted(entity fixed_source_waypoint)
void navigation_markroutes(entity this, entity fixed_source_waypoint)
const float EF_RED
const float EF_BLUE
const float EF_NODEPTHTEST
string etos(entity e)
IntrusiveList g_spawnpoints
const vector eZ
Definition vector.qh:46
entity spawnpointmodel
Definition waypoints.qc:27

◆ waypoint_updatecost_foralllinks()

void waypoint_updatecost_foralllinks ( )

Definition at line 971 of file waypoints.qc.

972{
974 {
975 if(it.wp00) it.wp00mincost = waypoint_getlinkcost(it, it.wp00);
976 if(it.wp01) it.wp01mincost = waypoint_getlinkcost(it, it.wp01);
977 if(it.wp02) it.wp02mincost = waypoint_getlinkcost(it, it.wp02);
978 if(it.wp03) it.wp03mincost = waypoint_getlinkcost(it, it.wp03);
979 if(it.wp04) it.wp04mincost = waypoint_getlinkcost(it, it.wp04);
980 if(it.wp05) it.wp05mincost = waypoint_getlinkcost(it, it.wp05);
981 if(it.wp06) it.wp06mincost = waypoint_getlinkcost(it, it.wp06);
982 if(it.wp07) it.wp07mincost = waypoint_getlinkcost(it, it.wp07);
983 if(it.wp08) it.wp08mincost = waypoint_getlinkcost(it, it.wp08);
984 if(it.wp09) it.wp09mincost = waypoint_getlinkcost(it, it.wp09);
985 if(it.wp10) it.wp10mincost = waypoint_getlinkcost(it, it.wp10);
986 if(it.wp11) it.wp11mincost = waypoint_getlinkcost(it, it.wp11);
987 if(it.wp12) it.wp12mincost = waypoint_getlinkcost(it, it.wp12);
988 if(it.wp13) it.wp13mincost = waypoint_getlinkcost(it, it.wp13);
989 if(it.wp14) it.wp14mincost = waypoint_getlinkcost(it, it.wp14);
990 if(it.wp15) it.wp15mincost = waypoint_getlinkcost(it, it.wp15);
991 if(it.wp16) it.wp16mincost = waypoint_getlinkcost(it, it.wp16);
992 if(it.wp17) it.wp17mincost = waypoint_getlinkcost(it, it.wp17);
993 if(it.wp18) it.wp18mincost = waypoint_getlinkcost(it, it.wp18);
994 if(it.wp19) it.wp19mincost = waypoint_getlinkcost(it, it.wp19);
995 if(it.wp20) it.wp20mincost = waypoint_getlinkcost(it, it.wp20);
996 if(it.wp21) it.wp21mincost = waypoint_getlinkcost(it, it.wp21);
997 if(it.wp22) it.wp22mincost = waypoint_getlinkcost(it, it.wp22);
998 if(it.wp23) it.wp23mincost = waypoint_getlinkcost(it, it.wp23);
999 if(it.wp24) it.wp24mincost = waypoint_getlinkcost(it, it.wp24);
1000 if(it.wp25) it.wp25mincost = waypoint_getlinkcost(it, it.wp25);
1001 if(it.wp26) it.wp26mincost = waypoint_getlinkcost(it, it.wp26);
1002 if(it.wp27) it.wp27mincost = waypoint_getlinkcost(it, it.wp27);
1003 if(it.wp28) it.wp28mincost = waypoint_getlinkcost(it, it.wp28);
1004 if(it.wp29) it.wp29mincost = waypoint_getlinkcost(it, it.wp29);
1005 if(it.wp30) it.wp30mincost = waypoint_getlinkcost(it, it.wp30);
1006 if(it.wp31) it.wp31mincost = waypoint_getlinkcost(it, it.wp31);
1007 });
1008}

References g_waypoints, IL_EACH, and WAYPOINTFLAG_TELEPORT.

Referenced by bot_serverframe().

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().

◆ 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(), and waypoint_think().

◆ relink_total

float relink_total

Definition at line 20 of file waypoints.qh.

Referenced by waypoint_schedulerelinkall(), and waypoint_think().

◆ relink_walkculled

float relink_walkculled

Definition at line 20 of file waypoints.qh.

Referenced by waypoint_schedulerelinkall(), and waypoint_think().

◆ 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.

Referenced by show_entnum().

◆ 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.