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, 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);
+ float src_angle = e.warpzone_angles.x;
+ while (src_angle < -180) src_angle += 360;
+ while (src_angle > 180) src_angle -= 360;
+
+ float dest_angle = e.enemy.warpzone_angles.x;
+ while (dest_angle < -180) dest_angle += 360;
+ while (dest_angle > 180) dest_angle -= 360;
+
+ // no waypoints for warpzones pointing upwards, they can't be used by the bots
+ if (src_angle == -90 || dest_angle == -90)
+ return;
+
+ makevectors(e.warpzone_angles);
+ vector src = (e.absmin + e.absmax) * 0.5;
+ src += ((e.warpzone_origin - src) * v_forward) * v_forward + 16 * v_right;
+ vector down_dir_src = -v_up;
+
+ makevectors(e.enemy.warpzone_angles);
+ vector dest = (e.enemy.absmin + e.enemy.absmax) * 0.5;
+ dest += ((e.enemy.warpzone_origin - dest) * v_forward) * v_forward - 16 * v_right;
+ vector down_dir_dest = -v_up;
+
+ // don't snap to the ground waypoints for source warpzones pointing downwards
+ if (src_angle != 90)
+ {
+ src = waypoint_fixorigin_down_dir(src, tracetest_ent, down_dir_src);
+ dest = waypoint_fixorigin_down_dir(dest, tracetest_ent, down_dir_dest);
+ }
+
+ waypoint_spawnforteleporter_boxes(e, WAYPOINTFLAG_TELEPORT, src, src, dest, dest, 0);
}
void waypoint_spawnforteleporter(entity e, vector destination, float timetaken, entity tracetest_ent)