32 it.colormod =
'0.5 0.5 0.5';
39 LOG_INFO(
"Can't find any waypoint nearby\n");
49 LOG_INFO(
"unreachable: ", etos(it),
" ", vtos(it.origin),
"\n");
51 it.effects |= EF_NODEPTHTEST | EF_BLUE;
55 if (j)
LOG_INFOF(
"%d waypoints cannot be reached from here in any way (marked with blue light)\n", j);
61 LOG_INFO(
"cannot reach me: ", etos(it),
" ", vtos(it.origin),
"\n");
63 if (!(it.effects & EF_NODEPTHTEST))
65 it.effects |= EF_NODEPTHTEST | EF_RED;
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);
76 if(it.spawnpointmodel)
78 delete(it.spawnpointmodel);
79 it.spawnpointmodel =
NULL;
84 if(!it.spawnpointmodel)
91 it.spawnpointmodel = e;
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;
105 if (j)
LOG_INFOF(
"%d spawnpoints have no nearest waypoint (marked by player model)\n", j);
111 it.colormod =
'0.5 0.5 0.5';
122 if (j)
LOG_INFOF(
"%d items have no nearest waypoint and cannot be walked away from (marked with red light)\n", j);
134 if (j)
LOG_INFOF(
"%d items have no nearest waypoint and cannot be walked to (marked with blue light)\n", j);
141 vector mid = (v1 + v2) * 0.5;
143 float diffy = (v2.y - v1.y);
144 float diffx = (v2.x - v1.x);
149 float m = - diffx / diffy;
150 float q = - m * mid.x + mid.y;
151 if (
fabs(m) <= 0.000001) m = 0;
152 if (
fabs(q) <= 0.000001) q = 0;
156 cvar_set(
"g_waypointeditor_symmetrical_axis", axis_str);
157 axis_str =
strcat(
"\"", axis_str,
"\"");
158 sprint(caller,
strcat(
"Axis of symmetry based on input points: ", axis_str,
"\n"));
160 sprint(caller, sprintf(
" ^3saved to %s\n",
"g_waypointeditor_symmetrical_axis"));
163 cvar_set(
"g_waypointeditor_symmetrical",
"-2");
164 sprint(caller,
strcat(
"g_waypointeditor_symmetrical",
" has been set to ",
165 cvar_string(
"g_waypointeditor_symmetrical"),
"\n"));
173 for (
int i = 0; i < 6; ++i)
175 if (
argv(arg_idx + i) !=
"")
182 if (
argv(arg_idx) !=
"")
183 sprint(caller,
"WARNING: Ignoring single input point\n");
186 sprint(caller,
"Origin of symmetry can't be automatically determined\n");
192 vector v1, v2, v3, v4, v5, v6;
194 float r_ctf_flags = 1 / ctf_flags;
195 for (
int i = 1; i <= ctf_flags; ++i)
197 if (i == 1) { v1 =
stov(
argv(arg_idx++));
org = v1 * r_ctf_flags; }
198 else if (i == 2) { v2 =
stov(
argv(arg_idx++));
org += v2 * r_ctf_flags; }
199 else if (i == 3) { v3 =
stov(
argv(arg_idx++));
org += v3 * r_ctf_flags; }
200 else if (i == 4) { v4 =
stov(
argv(arg_idx++));
org += v4 * r_ctf_flags; }
201 else if (i == 5) { v5 =
stov(
argv(arg_idx++));
org += v5 * r_ctf_flags; }
202 else if (i == 6) { v6 =
stov(
argv(arg_idx++));
org += v6 * r_ctf_flags; }
211 cvar_set(
"g_waypointeditor_symmetrical_origin", org_str);
212 cvar_set(
"g_waypointeditor_symmetrical_order",
ftos(ctf_flags));
214 org_str =
strcat(
"\"", org_str,
"\"");
217 sprint(caller,
strcat(
"Origin of symmetry based on flag positions: ", org_str,
"\n"));
219 sprint(caller,
strcat(
"Origin of symmetry based on input points: ", org_str,
"\n"));
221 sprint(caller, sprintf(
" ^3saved to %s\n",
"g_waypointeditor_symmetrical_origin"));
224 sprint(caller,
"Order of symmetry: 0 (autodetected)\n");
228 sprint(caller, sprintf(
" ^3saved to %s\n",
"g_waypointeditor_symmetrical_order"));
233 cvar_set(
"g_waypointeditor_symmetrical",
"0");
235 cvar_set(
"g_waypointeditor_symmetrical",
"-1");
236 sprint(caller,
strcat(
"g_waypointeditor_symmetrical",
" has been set to ",
237 cvar_string(
"g_waypointeditor_symmetrical"),
"\n"));
250 new_org =
Rotate(
org - map_center, 2 *
M_PI / ctf_flags) + map_center;
262 new_org.x = (1 / (1 + m*m)) * ((1 - m*m) *
org.x + 2 * m *
org.y - 2 * m * q);
263 new_org.y = (1 / (1 + m*m)) * (2 * m *
org.x + (m*m - 1) *
org.y + 2 * q);
280 return (wp.wphw00 !=
NULL);
285 if (!(wp_from && wp_to))
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;
303 if (!(wp_from && wp_to))
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; }
320 if (!(wp_from && wp_to))
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;
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;
373 wp.colormod =
'1 0 0';
375 wp.colormod =
'1 1 0';
377 wp.colormod =
'0 1 0';
379 wp.colormod =
'1 0.5 0';
381 wp.colormod =
'1 0.5 0';
383 wp.colormod =
'1 0.5 0';
385 wp.colormod =
'1 0.5 0';
387 wp.colormod =
'0 1 1';
389 wp.colormod =
'0.5 0 1';
391 wp.colormod =
'1 1 1';
407 if (!wp.wpisbox)
return "^3Warpzone waypoint";
412 { return
"^3Jumppad waypoint"; });
413 return "^3Teleport waypoint";
457 w.createdtime =
time;
458 setorigin(w, (m1 + m2) * 0.5);
459 setsize(w, m1 - w.origin, m2 - w.origin);
473 LOG_TRACE(
"Killed a waypoint that was stuck in solid at ",
vtos(w.origin));
481 LOG_INFO(
"A generated waypoint is stuck in solid at ",
vtos(w.origin));
486 setsize(w,
'0 0 0',
'0 0 0');
510 wp_from.wp00 = wp_to;
511 wp_from.wp00mincost = cost;
512 jp.nearestwaypoint = wp_from;
513 jp.nearestwaypointtimeout = -1;
529 LOG_INFO(
"^xf80Start waypoint has been cleared.\n");
534 entity wp = pl.nearestwaypoint;
542 err =
"can't hardwire while in the process of creating a special link";
546 err =
"couldn't find any waypoint at crosshair";
548 err =
"couldn't find any waypoint nearby";
551 err =
"can't hardwire a waypoint with special links";
559 LOG_INFOF(
"^x80fWaypoint %s marked as hardwired link origin.\n",
vtos(wp.origin));
572 LOG_INFOF(
"^1Editing waypoints with a higher version number (%f) is not allowed.\n"
596 is_support_wp =
true;
599 if (jp || is_jump_wp || is_support_wp)
603 LOG_INFO(
"^xf80Spawning start waypoint...\n");
610 if (sym && ctf_flags < 2)
612 int wp_num = ctf_flags;
619 vector item_org = (it.absmin + it.absmax) * 0.5;
629 vector start_org =
'0 0 0';
633 LOG_INFO(
"^xf80Spawning destination waypoint...\n");
638 vector initial_origin =
'0 0 0';
639 bool initial_origin_is_set =
false;
656 else if (is_jump_wp || is_support_wp)
661 if (wp_found && !(wp_found.wpflags & type_flag))
663 LOG_INFOF(
"Error: can't spawn a %s waypoint over an existent waypoint of a different type\n", (is_jump_wp) ?
"Jump" :
"Support");
680 if (!initial_origin_is_set)
682 initial_origin = e.origin;
683 initial_origin_is_set =
true;
690 &&
boxesoverlap(start_org, start_org, it.absmin, it.absmax),
692 start_wp = it; break;
697 LOG_INFOF(
"Couldn't find start waypoint at %v\n", start_org);
708 LOG_INFOF(
"^x80fRemoved hardwired link %s.\n", s);
712 if (e.createdtime ==
time)
714 LOG_INFO(
"Error: hardwired links can be created only between 2 existing (and unconnected) waypoints.\n");
722 LOG_INFO(
"Error: start and destination waypoints coincide.\n");
728 LOG_INFO(
"Error: waypoints are already linked.\n");
735 LOG_INFOF(
"^x80fAdded hardwired link %s.\n", s);
744 LOG_INFOF(
"Waypoint %v has already a support waypoint, delete it first.\n", e.origin);
773 if (start_wp.wp00_original == start_wp.wp00)
801 if (jp || is_jump_wp || is_support_wp)
823 if (it.SUPPORT_WP == wp)
825 it.SUPPORT_WP =
NULL;
842 LOG_INFOF(
"^1Editing waypoints with a higher version number (%f) is not allowed.\n"
854 if (sym && ctf_flags < 2)
856 int wp_num = ctf_flags;
870 LOG_INFO(
"Can't remove a waypoint with hardwired links, remove links with \"wpeditor hardwire\" first\n");
879 if(vdist(org - it.origin, <, 3))
888 te_explosion(e.origin);
910 entity fromwp31_prev = from.wp31;
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;
949 if (fromwp31_prev && !from.wp31)
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;
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);
1033 if (submerged_from && submerged_to)
1041 float height = from.z - to.z;
1055 if (submerged_from || submerged_to)
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);
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);
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;
1141 to.SUPPORT_WP = from;
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;
1202 if (
vdist(dv, >=, maxdist))
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;
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;
1269 wp.wplinked =
false;
1279 wp.wpisbox =
vdist(wp.size, >, 0);
1287 wp.nextthink =
time;
1296 setorigin(
this, this.
origin);
1314#define GET_GAMETYPE_EXTENSION() ((g_race) ? ".race" : "")
1320 float file, tokens, c = 0, found;
1322 vector wp_to_pos, wp_from_pos;
1326 string filename = sprintf(
"maps/%s.waypoints.cache",
strcat(
mapname, gt_ext));
1329 if (gt_ext !=
"" && file < 0)
1332 filename = sprintf(
"maps/%s.waypoints.cache",
mapname);
1338 LOG_TRACE(
"waypoint links load from ", filename,
" failed");
1343 bool parse_comments =
true;
1347 while ((s =
fgets(file)))
1353 if(
substring(s, 2, 17) ==
"WAYPOINT_VERSION ")
1355 else if(
substring(s, 2, 14) ==
"WAYPOINT_TIME ")
1364 LOG_TRACE(
"waypoint links for this map are not made for these waypoints.");
1366 LOG_TRACE(
"waypoint links for this map are outdated.");
1369 LOG_TRACE(
"Assault waypoint links need to be manually updated in the editor");
1379 parse_comments =
false;
1397 if(!wp_from || wp_from.origin!=wp_from_pos)
1399 wp_from = findradius(wp_from_pos, 1);
1403 if(
vdist(wp_from.origin - wp_from_pos, <, 1))
1404 if(wp_from.classname ==
"waypoint")
1409 wp_from = wp_from.chain;
1414 LOG_TRACE(
"waypoint_load_links: couldn't find 'from' waypoint at ",
vtos(wp_from_pos));
1420 wp_to = findradius(wp_to_pos, 1);
1424 if(
vdist(wp_to.origin - wp_to_pos, <, 1))
1425 if(wp_to.classname ==
"waypoint")
1430 wp_to = wp_to.chain;
1435 LOG_TRACE(
"waypoint_load_links: couldn't find 'to' waypoint at ",
vtos(wp_to_pos));
1441 if (wp_from.wp00_original && wp_from.wp00_original != wp_from.wp00)
1447 LOG_TRACE(
"loaded ",
ftos(c),
" waypoint links from ", filename);
1449 bool scheduled =
false;
1454 waypoint_schedulerelink(it);
1468 float file, tokens, c = 0, found;
1470 vector wp_to_pos, wp_from_pos;
1474 string filename = sprintf(
"maps/%s.waypoints.hardwired",
strcat(
mapname, gt_ext));
1477 if (gt_ext !=
"" && file < 0)
1480 filename = sprintf(
"maps/%s.waypoints.hardwired",
mapname);
1488 LOG_TRACE(
"waypoint links load from ", filename,
" failed");
1492 bool is_special =
false;
1493 while ((s =
fgets(file)))
1518 if(!wp_from || wp_from.origin!=wp_from_pos)
1520 wp_from = findradius(wp_from_pos, 5);
1524 if(
vdist(wp_from.origin - wp_from_pos, <, 5))
1525 if(wp_from.classname ==
"waypoint")
1530 wp_from = wp_from.chain;
1535 s =
strcat(((is_special) ?
"special link " :
"hardwired link "), s);
1536 LOG_INFO(
"NOTICE: Can not find origin waypoint of the ", s,
". Path skipped");
1542 wp_to = findradius(wp_to_pos, 5);
1546 if(
vdist(wp_to.origin - wp_to_pos, <, 5))
1547 if(wp_to.classname ==
"waypoint")
1552 wp_to = wp_to.chain;
1557 s =
strcat(((is_special) ?
"special link " :
"hardwired link "), s);
1558 LOG_INFO(
"NOTICE: Can not find destination waypoint of the ", s,
". Path skipped");
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;
1625 case 0:
return w.wp00;
1626 case 1:
return w.wp01;
1627 case 2:
return w.wp02;
1628 case 3:
return w.wp03;
1629 case 4:
return w.wp04;
1630 case 5:
return w.wp05;
1631 case 6:
return w.wp06;
1632 case 7:
return w.wp07;
1633 case 8:
return w.wp08;
1634 case 9:
return w.wp09;
1635 case 10:
return w.wp10;
1636 case 11:
return w.wp11;
1637 case 12:
return w.wp12;
1638 case 13:
return w.wp13;
1639 case 14:
return w.wp14;
1640 case 15:
return w.wp15;
1641 case 16:
return w.wp16;
1642 case 17:
return w.wp17;
1643 case 18:
return w.wp18;
1644 case 19:
return w.wp19;
1645 case 20:
return w.wp20;
1646 case 21:
return w.wp21;
1647 case 22:
return w.wp22;
1648 case 23:
return w.wp23;
1649 case 24:
return w.wp24;
1650 case 25:
return w.wp25;
1651 case 26:
return w.wp26;
1652 case 27:
return w.wp27;
1653 case 28:
return w.wp28;
1654 case 29:
return w.wp29;
1655 case 30:
return w.wp30;
1656 case 31:
return w.wp31;
1657 default:
return NULL;
1666 string filename = sprintf(
"maps/%s.waypoints.hardwired",
strcat(
mapname, gt_ext));
1670 LOG_TRACE(
"waypoint hardwired links ", filename,
" creation failed");
1676 fputs(file,
"// HARDWIRED LINKS\n");
1679 for (
int j = 0; j < 32; ++j)
1685 string s =
strcat(
vtos(it.origin),
"*",
vtos(link.origin),
"\n");
1694 fputs(file,
"\n// SPECIAL LINKS\n");
1697 for (int j = 0; j < 32; ++j)
1699 entity link = waypoint_get_link(it, j);
1703 string s = strcat(
"*", vtos(it.origin),
"*", vtos(link.origin),
"\n");
1712 LOG_INFOF(
"saved %d hardwired links and %d special links to %s",
count, count2, filename);
1720 string filename = sprintf(
"maps/%s.waypoints.cache",
strcat(
mapname, gt_ext));
1724 LOG_INFOF(
"waypoint link save to %s failed", filename);
1735 for(int j = 0; j < 32; ++j)
1737 entity link = waypoint_get_link(it, j);
1738 if (link && !waypoint_is_hardwiredlink(it, link))
1741 string s = strcat(vtos(it.origin),
"*", vtos(link.origin),
"\n");
1751 LOG_INFOF(
"saved %d waypoint links to %s", c, filename);
1759 LOG_INFOF(
"^1Overwriting waypoints with a higher version number (%f) is not allowed.\n"
1765 string filename = sprintf(
"maps/%s.waypoints",
strcat(
mapname, gt_ext));
1772 LOG_INFOF(
"waypoint links: save to %s failed", filename);
1777 string sym_str =
ftos(sym);
1782 sym_str =
cons(sym_str,
"-");
1783 sym_str =
cons(sym_str,
"-");
1802 fputs(file,
strcat(
"//",
"WAYPOINT_SYMMETRY ", sym_str,
"\n"));
1833 LOG_INFOF(
"saved %d waypoints to %s", c, filename);
1840 int file, cwp, cwb, fl;
1847 string filename = sprintf(
"maps/%s.waypoints",
strcat(
mapname, gt_ext));
1850 if (gt_ext !=
"" && file < 0)
1853 filename = sprintf(
"maps/%s.waypoints",
mapname);
1859 LOG_TRACE(
"waypoint load from ", filename,
" failed");
1863 bool parse_comments =
true;
1866 float sym_param1 = 0, sym_param2 = 0, sym_param3 = 0;
1868 while ((s =
fgets(file)))
1874 if(
substring(s, 2, 17) ==
"WAYPOINT_VERSION ")
1876 else if(
substring(s, 2, 18) ==
"WAYPOINT_SYMMETRY ")
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)); }
1884 else if(
substring(s, 2, 14) ==
"WAYPOINT_TIME ")
1892 LOG_TRACE(
"waypoints for this map are outdated");
1893 LOG_TRACE(
"please update them in the editor");
1895 parse_comments =
false;
1920 string sym_str =
"";
1922 if (sym == 1 && sym_param3 < 2)
1923 cvar_set(
"g_waypointeditor_symmetrical_order",
"0");
1924 if (sym == -1 || (sym == 1 && sym_param3 >= 2))
1928 params =
cons(
"-",
"-");
1932 cvar_set(
"g_waypointeditor_symmetrical_origin", params);
1934 cvar_set(
"g_waypointeditor_symmetrical_order",
ftos(sym_param3));
1935 sym_str =
strcat(
ftos(sym),
" with origin ", params,
" and order ",
ftos(sym_param3));
1940 cvar_set(
"g_waypointeditor_symmetrical_axis", params);
1941 sym_str =
strcat(
ftos(sym),
" with axis ", params);
1944 sym_str =
ftos(sym);
1946 LOG_INFO(
"Waypoint editor: loaded symmetry ", sym_str);
1951 LOG_INFOF(
"^1Editing waypoints with a higher version number (%f) is not allowed.\n"
1957#define waypoint_fixorigin(position, tracetest_ent) \
1958 waypoint_fixorigin_down_dir(position, tracetest_ent, '0 0 -1')
1962 vector endpos = position + down_dir * 3000;
1985 e.nearestwaypoint = it;
1993 e.nearestwaypoint = it;
2017 w.wp00_original = dw;
2019 w.wp00mincost = timetaken;
2022 e.nearestwaypoint = w;
2023 e.nearestwaypointtimeout = -1;
2028 float src_angle = e.warpzone_angles.x;
2029 while (src_angle < -180) src_angle += 360;
2030 while (src_angle > 180) src_angle -= 360;
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;
2037 if (src_angle == -90 || dest_angle == -90)
2041 vector src = (e.absmin + e.absmax) * 0.5;
2046 vector dest = (e.enemy.absmin + e.enemy.absmax) * 0.5;
2052 if (src_angle != 90)
2080 w.nearestwaypoint =
NULL;
2081 w.nearestwaypointtimeout = 0;
2095 te_beam(
NULL, wp1.origin, wp2.origin);
2096 else if (display_type == 1)
2097 te_lightning2(
NULL, wp1.origin, wp2.origin);
2134 setsize(it,
'-16 -16 -16',
'16 16 16');
2142 setsize(it,
'0 0 0',
'0 0 0');
2158 int display_type = 0;
2159 if (wasfreed(it.wp_aimed))
2161 if (wasfreed(it.wp_locked))
2162 it.wp_locked = NULL;
2163 entity head = it.wp_locked;
2165 head = navigation_findnearestwaypoint(it, false);
2166 it.nearestwaypoint = head;
2167 it.nearestwaypointtimeout = time + 2;
2168 if (IS_ONGROUND(it) || it.waterlevel > WATERLEVEL_NONE || it.wp_locked)
2170 else if(waypoint_has_hardwiredlinks(head))
2180 te_lightning2(NULL, head.origin, it.origin);
2181 if(PHYS_INPUT_BUTTON_CROUCH(it))
2182 waypoint_showlinks_to(head, display_type);
2184 waypoint_showlinks_from(head, display_type);
2191 crosshair_trace_waypoints(it);
2195 if (wp != it.wp_aimed)
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));
2200 str = strcat(str, sprintf(
"echo \" absmin: %s, absmax: %s\"\n", vtos(wp.absmin), vtos(wp.absmax)));
2202 str = sprintf(
"Entity %d: %s^7\nflags: %d\norigin: %s", etof(wp), wp_type_str, wp.wpflags, vtos(wp.origin));
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');
2209 if (it.wp_aimed != wp)
2246 float t, tmin, tmax;
2263 maxdist =
vlen(wp.origin - porg);
2271 float bestdist = maxdist;
2274 float d = vlen(wp.origin - it.origin) + vlen(it.origin - porg);
2276 if(navigation_waypoint_will_link(wp.origin, it.origin, p, it.origin, 0, wp.origin, 0, walkfromwp, 1050))
2277 if(navigation_waypoint_will_link(it.origin, porg, p, porg, 0, it.origin, 0, walkfromwp, 1050))
2283 if(bestdist < maxdist)
2285 LOG_INFO(
"update chain to new nearest WP ",
etos(p.(fld)));
2317 if(tmax - tmin < 0.001)
2323 t = (tmin + tmax) * 0.5;
2364 LOG_INFO(
"spawning a waypoint for connecting to ",
etos(wp));
2379 LOG_INFO(
"emergency: got no good nearby WP to build a link from, starting a new chain");
2391 navigation_findnearestwaypoint(it, false);
2392 navigation_findnearestwaypoint(it, true);
2413 for (int m = 0; m < 32; ++m)
2415 entity w = waypoint_get_link(it, m);
2418 if (w.wpflags & WAYPOINTFLAG_PERSONAL)
2420 if (w.wpflags & WAYPOINTFLAG_USEFUL)
2422 for (int j = 0; j < 32; ++j)
2424 entity w2 = waypoint_get_link(w, j);
2429 if (w2.wpflags & WAYPOINTFLAG_PERSONAL)
2434 w.wpflags &= ~WAYPOINTFLAG_DEAD_END;
2435 for (int k = 0; k < 32; ++k)
2437 if (waypoint_get_link(it, k) == w2)
2441 w.wpflags |= WAYPOINTFLAG_USEFUL;
2453 LOG_INFOF(
"Removed a waypoint at %v. Try again for more!", it.origin);
2454 te_explosion(it.origin);
2455 waypoint_remove(it);
vector antilag_takebackorigin(entity e, entity store, float t)
const int WAYPOINTFLAG_CROUCH
const int WAYPOINTFLAG_PERSONAL
const int WAYPOINTFLAG_LADDER
const int WAYPOINTFLAG_DEAD_END
bool bot_waypoints_for_items
entity navigation_findnearestwaypoint(entity ent, float walkfromwp)
const int WAYPOINTFLAG_TELEPORT
const int WAYPOINTFLAG_PROTECTED
const int WAYPOINTFLAG_CUSTOM_JP
void navigation_markroutes_inverted(entity fixed_source_waypoint)
float havocbot_symmetry_axis_q
const int WAYPOINTFLAG_NORELINK__DEPRECATED
float havocbot_symmetry_axis_m
const int WAYPOINTFLAG_SUPPORT
bool tracewalk(entity e, vector start, vector m1, vector m2, vector end, float end_height, float movemode)
vector havocbot_middlepoint
void navigation_markroutes(entity this, entity fixed_source_waypoint)
float havocbot_symmetry_origin_order
const int WAYPOINTFLAG_USEFUL
const int WAYPOINTFLAG_ITEM
const int WAYPOINTFLAG_GENERATED
const int WPFLAGMASK_NORELINK
entity waypoint_spawn(vector m1, vector m2, float f)
vector set_tracewalk_dest_2(entity ent, vector org)
const int WAYPOINTFLAG_JUMP
float havocbot_middlepoint_radius
IntrusiveList g_waypoints
void bot_calculate_stepheightvec()
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
#define setmodel(this, m)
#define PHYS_INPUT_BUTTON_CROUCH(s)
float autocvar_sv_maxspeed
#define autocvar_sv_gravity
const vector PL_MIN_CONST
const vector PL_CROUCH_MIN_CONST
const vector PL_CROUCH_MAX_CONST
const vector PL_MAX_CONST
const float MOVE_NOMONSTERS
const float SOLID_TRIGGER
float DPCONTENTS_PLAYERCLIP
float checkpvs(vector viewpos, entity viewee)
const float EF_NODEPTHTEST
bool autocvar_bot_navigation_ignoreplayers
int autocvar_g_waypointeditor_auto
float autocvar_bot_ai_bunnyhop_skilloffset
#define tokenizebyseparator
ERASEABLE entity IL_PUSH(IntrusiveList this, entity it)
Push to tail.
#define IL_EACH(this, cond, body)
#define FOREACH_ENTITY_CLASS(class, cond, body)
#define move_out_of_solid(e)
noref int autocvar_developer
float navigation_waypoint_will_link(vector v, vector org, entity ent, vector v2, float v2_height, vector o2, float o2_height, float walkfromwp, float bestdist)
bool navigation_check_submerged_state(entity ent, vector pos)
float bot_navigation_movemode
float tracewalk_dest_height
float navigation_testtracewalk
strcat(_("^F4Countdown stopped!"), "\n^BG", _("Teams are too unbalanced."))
IntrusiveList g_spawnpoints
ClientState CS(Client this)
#define STATIC_INIT(func)
during worldspawn
ERASEABLE string ftos_decimals(float number, int decimals)
converts a number to a string with the indicated number of decimals
ERASEABLE string cons(string a, string b)
if(frag_attacker.flagcarried)
void WarpZone_crosshair_trace(entity pl)
#define IS_REAL_CLIENT(v)
#define FOREACH_CLIENT(cond, body)
#define vdist(v, cmp, f)
Vector distance comparison, avoids sqrt()
ERASEABLE float boxesoverlap(vector m1, vector m2, vector m3, vector m4)
requires that m2>m1 in all coordinates, and that m4>m3
ERASEABLE vector Rotate(vector v, float a)
void botframe_autowaypoints_fix(entity p, float walkfromwp,.entity fld)
void waypoint_lock(entity pl)
bool waypoint_load_links()
float waypoint_get_assigned_link_cost(entity w, float i)
void waypoint_unmark_hardwiredlink(entity wp_from, entity wp_to)
void waypoint_spawnforitem(entity e)
void waypoint_schedulerelinkall()
void waypoint_getSymmetricalAxis_cmd(entity caller, bool save, int arg_idx)
bool waypoint_has_hardwiredlinks(entity wp)
#define GET_GAMETYPE_EXTENSION()
void waypoint_showlink(entity wp1, entity wp2, int display_type)
void waypoint_addlink_customcost(entity from, entity to, float c)
void waypoint_clearlinks(entity wp)
float waypoint_getlinearcost_underwater(float dist)
entity waypoint_get(vector m1, vector m2)
bool waypoint_is_hardwiredlink(entity wp_from, entity wp_to)
float botframe_autowaypoints_createwp(vector v, entity p,.entity fld, float f)
void botframe_deleteuselesswaypoints()
float waypoint_gettravelcost(vector from, vector to, entity from_ent, entity to_ent)
entity botframe_autowaypoints_lastwp1
bool waypoint_islinked(entity from, entity to)
void waypoint_getSymmetricalOrigin_cmd(entity caller, bool save, int arg_idx)
void waypoint_updatecost_foralllinks()
void waypoint_spawnforteleporter(entity e, vector destination, float timetaken, entity tracetest_ent)
void waypoint_restore_hardwiredlinks(entity wp)
#define waypoint_fixorigin(position, tracetest_ent)
void waypoint_unreachable(entity pl)
string waypoint_get_type_name(entity wp)
void waypoint_addlink(entity from, entity to)
float botframe_autowaypoints_fixdown(vector v)
void waypoint_think(entity this)
void waypoint_showlinks_from(entity wp, int display_type)
void waypoint_schedulerelink(entity wp)
void waypoint_removelink(entity from, entity to)
void waypoint_spawnforteleporter_wz(entity e, entity tracetest_ent)
entity waypoint_get_link(entity w, float i)
void waypoint_load_hardwiredlinks()
bool start_wp_is_hardwired
void waypoint_save_hardwiredlinks()
void waypoint_addlink_for_custom_jumppad(entity wp_from, entity wp_to)
void waypoint_spawnforteleporter_boxes(entity e, int teleport_flag, vector org1, vector org2, vector destination1, vector destination2, float timetaken)
int waypoint_getlinknum(entity from, entity to)
float waypoint_getlinkcost(entity from, entity to)
void waypoint_showlinks_to(entity wp, int display_type)
float trigger_push_get_push_time(entity this, vector endpos)
entity waypoint_spawnpersonal(entity this, vector position)
entity waypoint_spawn(vector m1, vector m2, float f)
vector waypoint_getSymmetricalPoint(vector org, int ctf_flags)
void waypoint_setupmodel(entity wp)
float waypoint_getlinearcost_crouched(float dist)
void waypoint_remove_fromeditor(entity pl)
void waypoint_spawnforitem_force(entity e, vector org)
void waypoint_mark_hardwiredlink(entity wp_from, entity wp_to)
void waypoint_spawn_fromeditor(entity pl, bool at_crosshair, bool is_jump_wp, bool is_crouch_wp, bool is_support_wp)
void botframe_showwaypointlinks()
void waypoint_clear_start_wp_globals(entity pl, bool warn)
float waypoint_getlinearcost(float dist)
void waypoint_start_hardwiredlink(entity pl, bool at_crosshair)
void botframe_autowaypoints()
vector waypoint_fixorigin_down_dir(vector position, entity tracetest_ent, vector down_dir)
void waypoint_remove(entity wp)
void crosshair_trace_waypoints(entity pl)
float botframe_autowaypoints_fix_from(entity p, float walkfromwp, entity wp,.entity fld)
void waypoint_save_links()
bool waypointeditor_enabled
vector autocvar_g_waypointeditor_symmetrical_axis
float botframe_cachedwaypointlinks
float botframe_loadedforcedlinks
float waypoint_version_loaded
const float WAYPOINT_VERSION
bool autocvar_g_waypointeditor_symmetrical_allowload
float botframe_waypointeditorlightningtime
float relink_lengthculled
bool autocvar_g_waypointeditor_symmetrical
bool autocvar_g_waypointeditor
vector autocvar_g_waypointeditor_symmetrical_origin
int autocvar_g_waypointeditor_symmetrical_order