From 36e4c8a71740c2c015525750a415ef2d8094ebac Mon Sep 17 00:00:00 2001 From: terencehill Date: Tue, 4 Apr 2017 15:19:39 +0200 Subject: [PATCH] Move some waypoint code from impulse.qc to waypoints.qc --- qcsrc/server/bot/api.qh | 4 +- qcsrc/server/bot/default/waypoints.qc | 133 +++++++++++++++++++++++--- qcsrc/server/bot/default/waypoints.qh | 6 +- qcsrc/server/bot/null/bot_null.qc | 4 +- qcsrc/server/impulse.qc | 102 +------------------- 5 files changed, 135 insertions(+), 114 deletions(-) diff --git a/qcsrc/server/bot/api.qh b/qcsrc/server/bot/api.qh index d48821357..1339b43ea 100644 --- a/qcsrc/server/bot/api.qh +++ b/qcsrc/server/bot/api.qh @@ -87,7 +87,8 @@ void navigation_routerating(entity this, entity e, float f, float rangebias); bool tracewalk(entity e, vector start, vector m1, vector m2, vector end, float movemode); -void waypoint_remove(entity e); +void waypoint_remove_fromeditor(entity pl); +void waypoint_remove(entity wp); void waypoint_saveall(); void waypoint_schedulerelinkall(); void waypoint_schedulerelink(entity wp); @@ -95,6 +96,7 @@ void waypoint_spawnforitem(entity e); void waypoint_spawnforitem_force(entity e, vector org); void waypoint_spawnforteleporter(entity e, vector destination, float timetaken); void waypoint_spawnforteleporter_v(entity e, vector org, vector destination, float timetaken); +void waypoint_spawn_fromeditor(entity pl); entity waypoint_spawn(vector m1, vector m2, float f); .entity goalcurrent; diff --git a/qcsrc/server/bot/default/waypoints.qc b/qcsrc/server/bot/default/waypoints.qc index fbae55260..4af7fc456 100644 --- a/qcsrc/server/bot/default/waypoints.qc +++ b/qcsrc/server/bot/default/waypoints.qc @@ -15,6 +15,34 @@ #include #include +vector waypoint_getSymmetricalOrigin(vector org, int ctf_flags) +{ + vector new_org = org; + if (fabs(autocvar_g_waypointeditor_symmetrical) == 1) + { + vector map_center = havocbot_middlepoint; + if (autocvar_g_waypointeditor_symmetrical == -1) + map_center = autocvar_g_waypointeditor_symmetrical_origin; + + new_org = Rotate(org - map_center, 360 * DEG2RAD / ctf_flags) + map_center; + } + else if (fabs(autocvar_g_waypointeditor_symmetrical) == 2) + { + float m = havocbot_symmetryaxis_equation.x; + float q = havocbot_symmetryaxis_equation.y; + if (autocvar_g_waypointeditor_symmetrical == -2) + { + m = autocvar_g_waypointeditor_symmetrical_axis.x; + q = autocvar_g_waypointeditor_symmetrical_axis.y; + } + + new_org.x = (1 / (1 + m*m)) * ((1 - m*m) * org.x + 2 * m * org.y - 2 * m * q); + new_org.y = (1 / (1 + m*m)) * (2 * m * org.x + (m*m - 1) * org.y + 2 * q); + } + new_org.z = org.z; + return new_org; +} + void waypoint_setupmodel(entity wp) { if (autocvar_g_waypointeditor) @@ -90,6 +118,100 @@ entity waypoint_spawn(vector m1, vector m2, float f) return w; } +void waypoint_spawn_fromeditor(entity pl) +{ + entity e; + vector org = pl.origin; + int ctf_flags = havocbot_symmetryaxis_equation.z; + bool sym = ((autocvar_g_waypointeditor_symmetrical > 0 && ctf_flags >= 2) + || (autocvar_g_waypointeditor_symmetrical < 0)); + int order = ctf_flags; + if(autocvar_g_waypointeditor_symmetrical_order >= 2) + { + order = autocvar_g_waypointeditor_symmetrical_order; + ctf_flags = order; + } + + LABEL(add_wp); + e = waypoint_spawn(org, org, 0); + waypoint_schedulerelink(e); + bprint(strcat("Waypoint spawned at ", vtos(org), "\n")); + if(sym) + { + org = waypoint_getSymmetricalOrigin(e.origin, ctf_flags); + if (vdist(org - pl.origin, >, 32)) + { + if(order > 2) + order--; + else + sym = false; + goto add_wp; + } + } +} + +void waypoint_remove(entity wp) +{ + // tell all waypoints linked to wp that they need to relink + IL_EACH(g_waypoints, it != wp, + { + if (waypoint_islinked(it, wp)) + waypoint_removelink(it, wp); + }); + delete(wp); +} + +void waypoint_remove_fromeditor(entity pl) +{ + entity e = navigation_findnearestwaypoint(pl, false); + + int ctf_flags = havocbot_symmetryaxis_equation.z; + bool sym = ((autocvar_g_waypointeditor_symmetrical > 0 && ctf_flags >= 2) + || (autocvar_g_waypointeditor_symmetrical < 0)); + int order = ctf_flags; + if(autocvar_g_waypointeditor_symmetrical_order >= 2) + { + order = autocvar_g_waypointeditor_symmetrical_order; + ctf_flags = order; + } + + LABEL(remove_wp); + if (!e) return; + if (e.wpflags & WAYPOINTFLAG_GENERATED) return; + + if (e.wphardwired) + { + LOG_INFO("^1Warning: ^7Removal of hardwired waypoints is not allowed in the editor. Please remove links from/to this waypoint (", vtos(e.origin), ") by hand from maps/", mapname, ".waypoints.hardwired\n"); + return; + } + + entity wp_sym = NULL; + if (sym) + { + vector org = waypoint_getSymmetricalOrigin(e.origin, ctf_flags); + FOREACH_ENTITY_CLASS("waypoint", !(it.wpflags & WAYPOINTFLAG_GENERATED), { + if(vdist(org - it.origin, <, 3)) + { + wp_sym = it; + break; + } + }); + } + + bprint(strcat("Waypoint removed at ", vtos(e.origin), "\n")); + waypoint_remove(e); + + if (sym && wp_sym) + { + e = wp_sym; + if(order > 2) + order--; + else + sym = false; + goto remove_wp; + } +} + void waypoint_removelink(entity from, entity to) { if (from == to || (from.wpflags & WAYPOINTFLAG_NORELINK)) @@ -342,17 +464,6 @@ spawnfunc(waypoint) //waypoint_schedulerelink(this); } -void waypoint_remove(entity wp) -{ - // tell all waypoints linked to wp that they need to relink - IL_EACH(g_waypoints, it != wp, - { - if (waypoint_islinked(it, wp)) - waypoint_removelink(it, wp); - }); - delete(wp); -} - // tell all waypoints to relink // actually this is useful only to update relink_* stats void waypoint_schedulerelinkall() diff --git a/qcsrc/server/bot/default/waypoints.qh b/qcsrc/server/bot/default/waypoints.qh index 06c56d3c0..b8ac83f7c 100644 --- a/qcsrc/server/bot/default/waypoints.qh +++ b/qcsrc/server/bot/default/waypoints.qh @@ -29,12 +29,15 @@ float botframe_cachedwaypointlinks; */ spawnfunc(waypoint); +void waypoint_removelink(entity from, entity to); +bool waypoint_islinked(entity from, entity to); void waypoint_addlink(entity from, entity to); void waypoint_think(entity this); void waypoint_clearlinks(entity wp); void waypoint_schedulerelink(entity wp); -void waypoint_remove(entity e); +void waypoint_remove_fromeditor(entity pl); +void waypoint_remove(entity wp); void waypoint_schedulerelinkall(); void waypoint_load_links_hardwired(); void waypoint_save_links(); @@ -49,6 +52,7 @@ void botframe_showwaypointlinks(); float waypoint_loadall(); float waypoint_load_links(); +void waypoint_spawn_fromeditor(entity pl); entity waypoint_spawn(vector m1, vector m2, float f); entity waypoint_spawnpersonal(entity this, vector position); diff --git a/qcsrc/server/bot/null/bot_null.qc b/qcsrc/server/bot/null/bot_null.qc index 68ae41670..46a0ffbba 100644 --- a/qcsrc/server/bot/null/bot_null.qc +++ b/qcsrc/server/bot/null/bot_null.qc @@ -30,7 +30,8 @@ void navigation_routerating(entity this, entity e, float f, float rangebias) { } bool tracewalk(entity e, vector start, vector m1, vector m2, vector end, float movemode) { return false; } -void waypoint_remove(entity e) { } +void waypoint_remove_fromeditor(entity pl) { } +void waypoint_remove(entity wp) { } void waypoint_saveall() { } void waypoint_schedulerelinkall() { } void waypoint_schedulerelink(entity wp) { } @@ -38,5 +39,6 @@ void waypoint_spawnforitem(entity e) { } void waypoint_spawnforitem_force(entity e, vector org) { } void waypoint_spawnforteleporter(entity e, vector destination, float timetaken) { } void waypoint_spawnforteleporter_v(entity e, vector org, vector destination, float timetaken) { } +void waypoint_spawn_fromeditor(entity pl) { } entity waypoint_spawn(vector m1, vector m2, float f) { return NULL; } #endif diff --git a/qcsrc/server/impulse.qc b/qcsrc/server/impulse.qc index 35134798c..8bc28e3dc 100644 --- a/qcsrc/server/impulse.qc +++ b/qcsrc/server/impulse.qc @@ -571,114 +571,16 @@ IMPULSE(waypoint_clear) sprint(this, "all waypoints cleared\n"); } -vector waypoint_getSymmetricalOrigin(vector org, int ctf_flags) -{ - vector new_org = org; - if (fabs(autocvar_g_waypointeditor_symmetrical) == 1) - { - vector map_center = havocbot_middlepoint; - if (autocvar_g_waypointeditor_symmetrical == -1) - map_center = autocvar_g_waypointeditor_symmetrical_origin; - - new_org = Rotate(org - map_center, 360 * DEG2RAD / ctf_flags) + map_center; - } - else if (fabs(autocvar_g_waypointeditor_symmetrical) == 2) - { - float m = havocbot_symmetryaxis_equation.x; - float q = havocbot_symmetryaxis_equation.y; - if (autocvar_g_waypointeditor_symmetrical == -2) - { - m = autocvar_g_waypointeditor_symmetrical_axis.x; - q = autocvar_g_waypointeditor_symmetrical_axis.y; - } - - new_org.x = (1 / (1 + m*m)) * ((1 - m*m) * org.x + 2 * m * org.y - 2 * m * q); - new_org.y = (1 / (1 + m*m)) * (2 * m * org.x + (m*m - 1) * org.y + 2 * q); - } - new_org.z = org.z; - return new_org; -} - IMPULSE(navwaypoint_spawn) { if (!autocvar_g_waypointeditor) return; - entity e; - vector org = this.origin; - int ctf_flags = havocbot_symmetryaxis_equation.z; - bool sym = ((autocvar_g_waypointeditor_symmetrical > 0 && ctf_flags >= 2) - || (autocvar_g_waypointeditor_symmetrical < 0)); - int order = ctf_flags; - if(autocvar_g_waypointeditor_symmetrical_order >= 2) - { - order = autocvar_g_waypointeditor_symmetrical_order; - ctf_flags = order; - } - - LABEL(add_wp); - e = waypoint_spawn(org, org, 0); - waypoint_schedulerelink(e); - bprint(strcat("Waypoint spawned at ", vtos(org), "\n")); - if(sym) - { - org = waypoint_getSymmetricalOrigin(e.origin, ctf_flags); - if (vdist(org - this.origin, >, 32)) - { - if(order > 2) - order--; - else - sym = false; - goto add_wp; - } - } + waypoint_spawn_fromeditor(this); } IMPULSE(navwaypoint_remove) { if (!autocvar_g_waypointeditor) return; - entity e = navigation_findnearestwaypoint(this, false); - int ctf_flags = havocbot_symmetryaxis_equation.z; - bool sym = ((autocvar_g_waypointeditor_symmetrical > 0 && ctf_flags >= 2) - || (autocvar_g_waypointeditor_symmetrical < 0)); - int order = ctf_flags; - if(autocvar_g_waypointeditor_symmetrical_order >= 2) - { - order = autocvar_g_waypointeditor_symmetrical_order; - ctf_flags = order; - } - - LABEL(remove_wp); - if (!e) return; - if (e.wpflags & WAYPOINTFLAG_GENERATED) return; - - if (e.wphardwired) - { - LOG_INFO("^1Warning: ^7Removal of hardwired waypoints is not allowed in the editor. Please remove links from/to this waypoint (", vtos(e.origin), ") by hand from maps/", mapname, ".waypoints.hardwired\n"); - return; - } - - entity wp_sym = NULL; - if (sym) - { - vector org = waypoint_getSymmetricalOrigin(e.origin, ctf_flags); - FOREACH_ENTITY_CLASS("waypoint", !(it.wpflags & WAYPOINTFLAG_GENERATED), { - if(vdist(org - it.origin, <, 3)) - { - wp_sym = it; - break; - } - }); - } - bprint(strcat("Waypoint removed at ", vtos(e.origin), "\n")); - waypoint_remove(e); - if (sym && wp_sym) - { - e = wp_sym; - if(order > 2) - order--; - else - sym = false; - goto remove_wp; - } + waypoint_remove_fromeditor(this); } IMPULSE(navwaypoint_relink) -- 2.39.2