Snap to the ground waypoints of source and destination warpzones depending on their...
authorterencehill <piuntn@gmail.com>
Wed, 17 Oct 2018 20:18:11 +0000 (22:18 +0200)
committerterencehill <piuntn@gmail.com>
Wed, 17 Oct 2018 21:58:26 +0000 (23:58 +0200)
qcsrc/server/bot/api.qh
qcsrc/server/bot/default/waypoints.qc
qcsrc/server/bot/default/waypoints.qh
qcsrc/server/bot/null/bot_null.qc
qcsrc/server/sv_main.qc

index 0cddd3b..b5ff8e5 100644 (file)
@@ -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);
index 74d7c6c..ef75d7a 100644 (file)
@@ -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)
index 2f9b116..aa11778 100644 (file)
@@ -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();
index f8738f8..0256a9d 100644 (file)
@@ -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
index 539b30d..a9b8c66 100644 (file)
@@ -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);
 }