From 1cbb4cb269821a3b47983816c99e1d5cf071507e Mon Sep 17 00:00:00 2001 From: terencehill Date: Wed, 17 Oct 2018 22:18:11 +0200 Subject: [PATCH] Snap to the ground waypoints of source and destination warpzones depending on their respective orientations, not just the one of the source warpzone; it fixes warpzones of the map newtonian-nightmare --- qcsrc/server/bot/api.qh | 2 +- qcsrc/server/bot/default/waypoints.qc | 17 ++++++++++------- qcsrc/server/bot/default/waypoints.qh | 2 +- qcsrc/server/bot/null/bot_null.qc | 2 +- qcsrc/server/sv_main.qc | 6 +++++- 5 files changed, 18 insertions(+), 11 deletions(-) diff --git a/qcsrc/server/bot/api.qh b/qcsrc/server/bot/api.qh index 0cddd3b27..b5ff8e53c 100644 --- a/qcsrc/server/bot/api.qh +++ b/qcsrc/server/bot/api.qh @@ -118,7 +118,7 @@ void waypoint_schedulerelink(entity 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, vector org, vector destination, float timetaken, vector down_dir, entity tracetest_ent); +void waypoint_spawnforteleporter_wz(entity e, vector org, vector destination, float timetaken, vector down_dir_src, vector down_dir_dest, entity tracetest_ent); void waypoint_spawn_fromeditor(entity pl); entity waypoint_spawn(vector m1, vector m2, float f); void waypoint_unreachable(entity pl); diff --git a/qcsrc/server/bot/default/waypoints.qc b/qcsrc/server/bot/default/waypoints.qc index 74d7c6c17..ef75d7aa2 100644 --- a/qcsrc/server/bot/default/waypoints.qc +++ b/qcsrc/server/bot/default/waypoints.qc @@ -1297,19 +1297,22 @@ void waypoint_spawnforteleporter_boxes(entity e, int teleport_flag, vector org1, e.nearestwaypointtimeout = -1; } -void waypoint_spawnforteleporter_wz(entity e, vector org, vector destination, float timetaken, vector down_dir, entity tracetest_ent) +void waypoint_spawnforteleporter_wz(entity e, vector src, vector destination, float timetaken, vector down_dir_src, vector down_dir_dest, entity tracetest_ent) { // warpzones with oblique warp plane rely on down_dir to snap waypoints // to the ground without leaving the warp plane // warpzones with horizontal warp plane (down_dir.x == -1) generate // destination waypoint snapped to the ground (leaving warpzone), source // waypoint in the center of the warp plane - if(down_dir.x != -1) - org = waypoint_fixorigin_down_dir(org, tracetest_ent, down_dir); - if(down_dir.x == -1) - down_dir = '0 0 -1'; - destination = waypoint_fixorigin_down_dir(destination, tracetest_ent, down_dir); - waypoint_spawnforteleporter_boxes(e, WAYPOINTFLAG_TELEPORT, org, org, destination, destination, timetaken); + + // snap to the ground only if source warpzone isn't horizontal + if(down_dir_src.x != -1) + src = waypoint_fixorigin_down_dir(src, tracetest_ent, down_dir_src); + if(down_dir_dest.x == -1) // horizontal + down_dir_dest = '0 0 -1'; // change to vertical + destination = waypoint_fixorigin_down_dir(destination, tracetest_ent, down_dir_dest); + + waypoint_spawnforteleporter_boxes(e, WAYPOINTFLAG_TELEPORT, src, src, destination, destination, timetaken); } void waypoint_spawnforteleporter(entity e, vector destination, float timetaken, entity tracetest_ent) diff --git a/qcsrc/server/bot/default/waypoints.qh b/qcsrc/server/bot/default/waypoints.qh index 2f9b11638..aa11778b1 100644 --- a/qcsrc/server/bot/default/waypoints.qh +++ b/qcsrc/server/bot/default/waypoints.qh @@ -59,7 +59,7 @@ void waypoint_saveall(); void waypoint_spawnforitem_force(entity e, vector org); void waypoint_spawnforitem(entity e); void waypoint_spawnforteleporter(entity e, vector destination, float timetaken, entity tracetest_ent); -void waypoint_spawnforteleporter_wz(entity e, vector org, vector destination, float timetaken, vector down_dir, entity tracetest_ent); +void waypoint_spawnforteleporter_wz(entity e, vector org, vector destination, float timetaken, vector down_dir_src, vector down_dir_dest, entity tracetest_ent); void botframe_showwaypointlinks(); float waypoint_loadall(); diff --git a/qcsrc/server/bot/null/bot_null.qc b/qcsrc/server/bot/null/bot_null.qc index f8738f80f..0256a9d1d 100644 --- a/qcsrc/server/bot/null/bot_null.qc +++ b/qcsrc/server/bot/null/bot_null.qc @@ -38,7 +38,7 @@ void waypoint_schedulerelink(entity 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, vector org, vector destination, float timetaken, vector down_dir, entity tracetest_ent) { } +void waypoint_spawnforteleporter_wz(entity e, vector org, vector destination, float timetaken, vector down_dir_src, vector down_dir_dest, entity tracetest_ent) { } void waypoint_spawn_fromeditor(entity pl) { } entity waypoint_spawn(vector m1, vector m2, float f) { return NULL; } #endif diff --git a/qcsrc/server/sv_main.qc b/qcsrc/server/sv_main.qc index 539b30d29..a9b8c66f7 100644 --- a/qcsrc/server/sv_main.qc +++ b/qcsrc/server/sv_main.qc @@ -378,9 +378,13 @@ void WarpZone_PostInitialize_Callback() makevectors(e.warpzone_angles); src = src + ((e.warpzone_origin - src) * v_forward) * v_forward + 16 * v_right; dst = (e.enemy.absmin + e.enemy.absmax) * 0.5; + vector down_dir_src = -v_up; + makevectors(e.enemy.warpzone_angles); dst = dst + ((e.enemy.warpzone_origin - dst) * v_forward) * v_forward - 16 * v_right; - waypoint_spawnforteleporter_wz(e, src, dst, 0, -v_up, tracetest_ent); + vector down_dir_dest = -v_up; + + waypoint_spawnforteleporter_wz(e, src, dst, 0, down_dir_src, down_dir_dest, tracetest_ent); } delete(tracetest_ent); } -- 2.39.2