diff --git a/game/ato/flightplans/airassault.py b/game/ato/flightplans/airassault.py index d2db440b..9351d236 100644 --- a/game/ato/flightplans/airassault.py +++ b/game/ato/flightplans/airassault.py @@ -111,7 +111,7 @@ class Builder(IBuilder[AirAssaultFlightPlan, AirAssaultLayout]): altitude_is_agl, ), drop_off=builder.drop_off(drop_off_zone), - stopover=None, + refuel=None, target=assault_area, nav_to_home=builder.nav_path( drop_off_zone.position, diff --git a/game/ato/flightplans/airlift.py b/game/ato/flightplans/airlift.py index 4ff69d05..a2a64f6b 100644 --- a/game/ato/flightplans/airlift.py +++ b/game/ato/flightplans/airlift.py @@ -22,7 +22,7 @@ class AirliftLayout(StandardLayout): pickup: FlightWaypoint | None nav_to_drop_off: list[FlightWaypoint] drop_off: FlightWaypoint - stopover: FlightWaypoint | None + refuel: FlightWaypoint | None nav_to_home: list[FlightWaypoint] def iter_waypoints(self) -> Iterator[FlightWaypoint]: @@ -32,8 +32,8 @@ class AirliftLayout(StandardLayout): yield self.pickup yield from self.nav_to_drop_off yield self.drop_off - if self.stopover is not None: - yield self.stopover + if self.refuel is not None: + yield self.refuel yield from self.nav_to_home yield self.arrival if self.divert is not None: @@ -77,7 +77,7 @@ class Builder(IBuilder[AirliftFlightPlan, AirliftLayout]): builder = WaypointBuilder(self.flight, self.coalition) pickup = None - stopover = None + refuel = None if self.flight.is_helo: # Create a pickupzone where the cargo will be spawned pickup_zone = MissionTarget( @@ -96,12 +96,12 @@ class Builder(IBuilder[AirliftFlightPlan, AirliftLayout]): drop_off = builder.drop_off(drop_off_zone) # Add an additional stopover point so that the flight can refuel - stopover = builder.stopover(cargo.next_stop) + refuel = builder.land_refuel(cargo.next_stop) else: # Fixed Wing will get stopover points for pickup and dropoff if cargo.origin != self.flight.departure: - pickup = builder.stopover(cargo.origin, "PICKUP") - drop_off = builder.stopover(cargo.next_stop, "DROP OFF") + pickup = builder.land_refuel(cargo.origin) + drop_off = builder.land_refuel(cargo.next_stop) nav_to_pickup = builder.nav_path( self.flight.departure.position, @@ -118,7 +118,7 @@ class Builder(IBuilder[AirliftFlightPlan, AirliftLayout]): # base. Otherwise the Cargo drop will be the new Landing Waypoint and the # AI will end its mission there instead of flying back. # https://forum.dcs.world/topic/211775-landing-to-refuel-and-rearm-the-landingrefuar-waypoint/ - arrival = builder.stopover(self.flight.arrival, "LANDING") + arrival = builder.land_refuel(self.flight.arrival, True) return AirliftLayout( departure=builder.takeoff(self.flight.departure), @@ -131,7 +131,7 @@ class Builder(IBuilder[AirliftFlightPlan, AirliftLayout]): altitude_is_agl, ), drop_off=drop_off, - stopover=stopover, + refuel=refuel, nav_to_home=builder.nav_path( cargo.origin.position, self.flight.arrival.position, diff --git a/game/ato/flightplans/waypointbuilder.py b/game/ato/flightplans/waypointbuilder.py index 232d48a4..9980bb51 100644 --- a/game/ato/flightplans/waypointbuilder.py +++ b/game/ato/flightplans/waypointbuilder.py @@ -494,21 +494,35 @@ class WaypointBuilder: ) @staticmethod - def stopover(stopover: ControlPoint, name: str = "STOPOVER") -> FlightWaypoint: - """Creates a stopover waypoint. + def land_refuel( + control_point: ControlPoint, is_destination: bool = False + ) -> FlightWaypoint: + """Creates a land refuel waypoint. Args: - control_point: Pick up location. + control_point: The airbase to refuel. + is_destination: Due to an DCS Bug we need to set the last landing waypoint also as LandingReFuAr """ + if is_destination: + return FlightWaypoint( + "LANDING", + FlightWaypointType.LAND_REFUEL, + control_point.position, + meters(0), + "RADIO", + description=f"Land at {control_point}", + pretty_name="Landing", + control_point=control_point, + ) return FlightWaypoint( - name, - FlightWaypointType.STOPOVER, - stopover.position, + "REFUEL", + FlightWaypointType.LAND_REFUEL, + control_point.position, meters(0), "RADIO", - description=f"Stopover at {stopover}", - pretty_name="Stopover location", - control_point=stopover, + description=f"Refuel at {control_point}", + pretty_name="Refuel", + control_point=control_point, ) @staticmethod diff --git a/game/ato/flightwaypointtype.py b/game/ato/flightwaypointtype.py index 002c2d0c..f51a621b 100644 --- a/game/ato/flightwaypointtype.py +++ b/game/ato/flightwaypointtype.py @@ -47,4 +47,4 @@ class FlightWaypointType(IntEnum): DROP_OFF = 27 BULLSEYE = 28 REFUEL = 29 # Should look for nearby tanker to refuel from. - STOPOVER = 30 # Stopover landing point using the LandingReFuAr waypoint type + CARGO_STOP = 30 # Stopover landing point using the LandingReFuAr waypoint type diff --git a/game/missiongenerator/aircraft/waypoints/cargostop.py b/game/missiongenerator/aircraft/waypoints/cargostop.py index ea0302b7..f8aa06ef 100644 --- a/game/missiongenerator/aircraft/waypoints/cargostop.py +++ b/game/missiongenerator/aircraft/waypoints/cargostop.py @@ -1,9 +1,4 @@ -from dcs.point import MovingPoint -from dcs.task import Land - -from game.utils import feet -from dcs.point import PointAction - +from dcs.point import MovingPoint, PointAction from .pydcswaypointbuilder import PydcsWaypointBuilder @@ -11,16 +6,9 @@ from .pydcswaypointbuilder import PydcsWaypointBuilder class CargoStopBuilder(PydcsWaypointBuilder): def build(self) -> MovingPoint: waypoint = super().build() - # Create a landing task, currently only for Helos! - if self.flight.is_helo: - # Calculate a landing point with a small buffer to prevent AI from landing - # directly at the static ammo depot and exploding - landing_point = waypoint.position.random_point_within(15, 5) - # Use Land Task with 30s duration for helos - waypoint.add_task(Land(landing_point, duration=30)) - else: - # Fixed wing will drop the cargo at the waypoint so we set a lower altitude - waypoint.alt = int(feet(10000).meters) - waypoint.alt_type = "BARO" - waypoint.action = PointAction.FlyOverPoint + waypoint.type = "LandingReFuAr" + waypoint.action = PointAction.LandingReFuAr + waypoint.landing_refuel_rearm_time = 2 # Minutes. + if (control_point := self.waypoint.control_point) is not None: + waypoint.airdrome_id = control_point.airdrome_id_for_landing return waypoint diff --git a/game/missiongenerator/aircraft/waypoints/stopover.py b/game/missiongenerator/aircraft/waypoints/stopover.py deleted file mode 100644 index 9c292881..00000000 --- a/game/missiongenerator/aircraft/waypoints/stopover.py +++ /dev/null @@ -1,15 +0,0 @@ -from dcs.point import MovingPoint, PointAction -from dcs.task import Land - -from .pydcswaypointbuilder import PydcsWaypointBuilder - - -class StopoverBuilder(PydcsWaypointBuilder): - def build(self) -> MovingPoint: - waypoint = super().build() - waypoint.type = "LandingReFuAr" - waypoint.action = PointAction.LandingReFuAr - waypoint.landing_refuel_rearm_time = 2 # Minutes. - if (control_point := self.waypoint.control_point) is not None: - waypoint.airdrome_id = control_point.airdrome_id_for_landing - return waypoint diff --git a/game/missiongenerator/aircraft/waypoints/waypointgenerator.py b/game/missiongenerator/aircraft/waypoints/waypointgenerator.py index ffeecf7f..1ff4dfc8 100644 --- a/game/missiongenerator/aircraft/waypoints/waypointgenerator.py +++ b/game/missiongenerator/aircraft/waypoints/waypointgenerator.py @@ -16,7 +16,7 @@ from game.ato import Flight, FlightWaypoint from game.ato.flightstate import InFlight, WaitingForStart from game.ato.flightwaypointtype import FlightWaypointType from game.ato.starttype import StartType -from game.missiongenerator.aircraft.waypoints.stopover import StopoverBuilder +from game.missiongenerator.aircraft.waypoints.cargostop import CargoStopBuilder from game.missiongenerator.missiondata import MissionData from game.settings import Settings from game.utils import pairwise @@ -135,7 +135,7 @@ class WaypointGenerator: FlightWaypointType.PATROL_TRACK: RaceTrackBuilder, FlightWaypointType.PICKUP: CargoStopBuilder, FlightWaypointType.REFUEL: RefuelPointBuilder, - FlightWaypointType.STOPOVER: StopoverBuilder, + FlightWaypointType.CARGO_STOP: CargoStopBuilder, } builder = builders.get(waypoint.waypoint_type, DefaultWaypointBuilder) return builder(