From e85be42ea62e8f381160ae6944f91eca8d66f044 Mon Sep 17 00:00:00 2001 From: terencehill Date: Wed, 7 Nov 2018 00:00:59 +0100 Subject: [PATCH] Bot waypoints: add 2 new commands "cmd wpeditor symaxis" and "cmd wpeditor symorigin" useful to determine axis / origin of symmetry on maps without ctf flags or where flags aren't perfectly symmetrical --- qcsrc/server/bot/api.qh | 3 + qcsrc/server/bot/default/waypoints.qc | 102 ++++++++++++++++++++++++++ qcsrc/server/command/cmd.qc | 35 ++++++++- 3 files changed, 137 insertions(+), 3 deletions(-) diff --git a/qcsrc/server/bot/api.qh b/qcsrc/server/bot/api.qh index 11e0707e9..9373319a4 100644 --- a/qcsrc/server/bot/api.qh +++ b/qcsrc/server/bot/api.qh @@ -123,3 +123,6 @@ void waypoint_spawnforteleporter_wz(entity e, entity tracetest_ent); void waypoint_spawn_fromeditor(entity pl); entity waypoint_spawn(vector m1, vector m2, float f); void waypoint_unreachable(entity pl); + +void waypoint_getSymmetricalOrigin_cmd(entity caller, bool save, int arg_idx); +void waypoint_getSymmetricalAxis_cmd(entity caller, bool save, int arg_idx); diff --git a/qcsrc/server/bot/default/waypoints.qc b/qcsrc/server/bot/default/waypoints.qc index 65a75e304..bd5d13e2c 100644 --- a/qcsrc/server/bot/default/waypoints.qc +++ b/qcsrc/server/bot/default/waypoints.qc @@ -128,6 +128,108 @@ void waypoint_unreachable(entity pl) if (j) LOG_INFOF("%d items have no nearest waypoint and cannot be walked to (marked with blue light)\n", j); } +void waypoint_getSymmetricalAxis_cmd(entity caller, bool save, int arg_idx) +{ + vector v1 = stov(argv(arg_idx++)); + vector v2 = stov(argv(arg_idx++)); + vector mid = (v1 + v2) / 2; + + float diffy = (v2.y - v1.y); + float diffx = (v2.x - v1.x); + if (v1.y == v2.y) + diffy = 0.000001; + if (v1.x == v2.x) + diffx = 0.000001; + float m = - diffx / diffy; + float q = - m * mid.x + mid.y; + if (fabs(m) <= 0.000001) m = 0; + if (fabs(q) <= 0.000001) q = 0; + + string axis_str = strcat(ftos(m), " ", ftos(q)); + if (save) + cvar_set("g_waypointeditor_symmetrical_axis", axis_str); + axis_str = strcat("\"", axis_str, "\""); + sprint(caller, strcat("Axis of symmetry based on input points: ", axis_str, "\n")); + if (save) + sprint(caller, sprintf(" ^3saved to %s\n", "g_waypointeditor_symmetrical_axis")); + if (save) + { + cvar_set("g_waypointeditor_symmetrical", "-2"); + sprint(caller, strcat("g_waypointeditor_symmetrical", " has been set to ", + cvar_string("g_waypointeditor_symmetrical"), "\n")); + } +} + +void waypoint_getSymmetricalOrigin_cmd(entity caller, bool save, int arg_idx) +{ + vector org = '0 0 0'; + int ctf_flags = 0; + for (int i = 0; i < 6; i++) + { + if (argv(arg_idx + i) != "") + ctf_flags++; + } + if (ctf_flags < 2) + { + ctf_flags = 0; + org = vec2(havocbot_middlepoint); + if (argv(arg_idx) != "") + sprint(caller, "WARNING: Ignoring single input point\n"); + if (havocbot_middlepoint_radius == 0) + { + sprint(caller, "Origin of symmetry can't be automatically determined\n"); + return; + } + } + else + { + vector v1, v2, v3, v4, v5, v6; + for (int i = 1; i <= ctf_flags; i++) + { + if (i == 1) { v1 = stov(argv(arg_idx++)); org = v1 / ctf_flags; } + else if (i == 2) { v2 = stov(argv(arg_idx++)); org += v2 / ctf_flags; } + else if (i == 3) { v3 = stov(argv(arg_idx++)); org += v3 / ctf_flags; } + else if (i == 4) { v4 = stov(argv(arg_idx++)); org += v4 / ctf_flags; } + else if (i == 5) { v5 = stov(argv(arg_idx++)); org += v5 / ctf_flags; } + else if (i == 6) { v6 = stov(argv(arg_idx++)); org += v6 / ctf_flags; } + } + } + + if (fabs(org.x) <= 0.000001) org.x = 0; + if (fabs(org.y) <= 0.000001) org.y = 0; + string org_str = strcat(ftos(org.x), " ", ftos(org.y)); + if (save) + { + cvar_set("g_waypointeditor_symmetrical_origin", org_str); + cvar_set("g_waypointeditor_symmetrical_order", ftos(ctf_flags)); + } + org_str = strcat("\"", org_str, "\""); + + if (ctf_flags < 2) + sprint(caller, strcat("Origin of symmetry based on flag positions: ", org_str, "\n")); + else + sprint(caller, strcat("Origin of symmetry based on input points: ", org_str, "\n")); + if (save) + sprint(caller, sprintf(" ^3saved to %s\n", "g_waypointeditor_symmetrical_origin")); + + if (ctf_flags < 2) + sprint(caller, "Order of symmetry: 0 (autodetected)\n"); + else + sprint(caller, strcat("Order of symmetry: ", ftos(ctf_flags), "\n")); + if (save) + sprint(caller, sprintf(" ^3saved to %s\n", "g_waypointeditor_symmetrical_order")); + + if (save) + { + if (ctf_flags < 2) + cvar_set("g_waypointeditor_symmetrical", "0"); + else + cvar_set("g_waypointeditor_symmetrical", "-1"); + sprint(caller, strcat("g_waypointeditor_symmetrical", " has been set to ", + cvar_string("g_waypointeditor_symmetrical"), "\n")); + } +} + vector waypoint_getSymmetricalPoint(vector org, int ctf_flags) { vector new_org = org; diff --git a/qcsrc/server/command/cmd.qc b/qcsrc/server/command/cmd.qc index 80716d811..e39d5039d 100644 --- a/qcsrc/server/command/cmd.qc +++ b/qcsrc/server/command/cmd.qc @@ -188,6 +188,7 @@ void ClientCommand_wpeditor(entity caller, int request, int argc) sprint(caller, "ERROR: this command works only if you are player\n"); else waypoint_spawn_fromeditor(caller); + return; } else if (argv(1) == "remove") { @@ -195,6 +196,7 @@ void ClientCommand_wpeditor(entity caller, int request, int argc) sprint(caller, "ERROR: this command works only if you are player\n"); else waypoint_remove_fromeditor(caller); + return; } else if (argv(1) == "unreachable") { @@ -202,13 +204,34 @@ void ClientCommand_wpeditor(entity caller, int request, int argc) sprint(caller, "ERROR: this command works only if you are player\n"); else waypoint_unreachable(caller); + return; } else if (argv(1) == "saveall") + { waypoint_saveall(); + return; + } else if (argv(1) == "relinkall") + { waypoint_schedulerelinkall(); - - return; + return; + } + else if (argv(1) == "symaxis") + { + if (argv(2) == "set" || argv(2) == "get") + { + waypoint_getSymmetricalAxis_cmd(caller, (argv(2) == "set"), 3); + return; + } + } + else if (argv(1) == "symorigin") + { + if (argv(2) == "set" || argv(2) == "get") + { + waypoint_getSymmetricalOrigin_cmd(caller, (argv(2) == "set"), 3); + return; + } + } } } @@ -217,7 +240,13 @@ void ClientCommand_wpeditor(entity caller, int request, int argc) case CMD_REQUEST_USAGE: { sprint(caller, "\nUsage:^3 cmd wpeditor action\n"); - sprint(caller, " Where 'action' can be: spawn, remove, unreachable, saveall, relinkall\n"); + sprint(caller, " Where 'action' can be: spawn, remove, unreachable, saveall, relinkall,\n"); + sprint(caller, " symorigin get|set\n"); + sprint(caller, " symorigin get|set p1 p2 ... pX\n"); + sprint(caller, " symaxis get|set p1 p2\n"); + sprint(caller, " where p1 p2 ... pX are positions \"x y z\" (z can be omitted)\n"); + sprint(caller, " symorigin and symaxis commands are useful to determine origin/axis of symmetry" + " on maps without ctf flags or where flags aren't perfectly symmetrical\n"); return; } } -- 2.39.2