Use ingress/arrival for helicopter join/split wpts

This commit is contained in:
Raffson 2024-02-18 13:42:21 +01:00
parent fc467b62e0
commit e5d199f20b
No known key found for this signature in database
GPG Key ID: B0402B2C9B764D99
6 changed files with 43 additions and 29 deletions

View File

@ -39,6 +39,7 @@ class AirAssaultLayout(FormationAttackLayout):
if self.pickup is not None: if self.pickup is not None:
yield self.pickup yield self.pickup
yield from self.nav_to yield from self.nav_to
yield self.join
yield self.ingress yield self.ingress
if self.drop_off is not None: if self.drop_off is not None:
yield self.drop_off yield self.drop_off
@ -151,8 +152,8 @@ class Builder(FormationAttackBuilder[AirAssaultFlightPlan, AirAssaultLayout]):
top3 = sorted( top3 = sorted(
tgt.ctld_zones, key=lambda x: ingress.position.distance_to_point(x[0]) tgt.ctld_zones, key=lambda x: ingress.position.distance_to_point(x[0])
)[:3] )[:3]
closest = random.choice(top3) pos, dist = random.choice(top3)
drop_pos = closest[0].random_point_within(closest[1]) drop_pos = pos.random_point_within(dist)
else: else:
heading = tgt.position.heading_between_point(ingress.position) heading = tgt.position.heading_between_point(ingress.position)
drop_pos = tgt.position.point_from_heading(heading, 1200) drop_pos = tgt.position.point_from_heading(heading, 1200)
@ -183,8 +184,8 @@ class Builder(FormationAttackBuilder[AirAssaultFlightPlan, AirAssaultLayout]):
divert=builder.divert(self.flight.divert), divert=builder.divert(self.flight.divert),
bullseye=builder.bullseye(), bullseye=builder.bullseye(),
hold=None, hold=None,
join=builder.join(pickup_position), join=builder.join(ingress.position),
split=builder.split(self.package.waypoints.split), split=builder.split(self.flight.arrival.position),
refuel=None, refuel=None,
) )

View File

@ -42,8 +42,8 @@ class AirliftLayout(StandardLayout):
drop_off: FlightWaypoint | None drop_off: FlightWaypoint | None
# drop_off_zone will be used for player flights to create the CTLD stuff # drop_off_zone will be used for player flights to create the CTLD stuff
ctld_drop_off_zone: FlightWaypoint | None ctld_drop_off_zone: FlightWaypoint | None
return_ascent: FlightWaypoint | None return_ascent: FlightWaypoint
return_descent: FlightWaypoint | None return_descent: FlightWaypoint
def add_waypoint( def add_waypoint(
self, wpt: FlightWaypoint, next_wpt: Optional[FlightWaypoint] self, wpt: FlightWaypoint, next_wpt: Optional[FlightWaypoint]
@ -83,13 +83,11 @@ class AirliftLayout(StandardLayout):
yield self.drop_off_descent yield self.drop_off_descent
if self.drop_off is not None: if self.drop_off is not None:
yield self.drop_off yield self.drop_off
if self.return_ascent is not None: yield self.return_ascent
yield self.return_ascent
if self.ctld_drop_off_zone is not None: if self.ctld_drop_off_zone is not None:
yield self.ctld_drop_off_zone yield self.ctld_drop_off_zone
yield from self.nav_from yield from self.nav_from
if self.return_descent is not None: yield self.return_descent
yield self.return_descent
yield self.arrival yield self.arrival
if self.divert is not None: if self.divert is not None:
yield self.divert yield self.divert

View File

@ -44,16 +44,17 @@ class Builder(FormationAttackBuilder[EscortFlightPlan, FormationAttackLayout]):
ingress.only_for_player = True ingress.only_for_player = True
target.only_for_player = True target.only_for_player = True
hold = None hold = None
if not self.primary_flight_is_air_assault: if not self.flight.is_helo:
hold = builder.hold(self._hold_point()) hold = builder.hold(self._hold_point())
elif self.package.primary_flight is not None:
fp = self.package.primary_flight.flight_plan
assert isinstance(fp.layout, AirAssaultLayout)
if fp.layout.pickup:
hold = builder.hold(fp.layout.pickup.position)
join = builder.join(self.package.waypoints.join) join_pos = (
split = builder.split(self.package.waypoints.split) self.package.waypoints.ingress
if self.flight.is_helo
else self.package.waypoints.join
)
join = builder.join(join_pos)
split = builder.split(self._get_split())
ingress_alt = self.doctrine.ingress_altitude ingress_alt = self.doctrine.ingress_altitude
is_helo = builder.flight.is_helo is_helo = builder.flight.is_helo
@ -70,11 +71,13 @@ class Builder(FormationAttackBuilder[EscortFlightPlan, FormationAttackLayout]):
layout, AirliftLayout layout, AirliftLayout
) )
if isinstance(layout, AirliftLayout): if isinstance(layout, AirliftLayout):
join = builder.join(layout.departure.position) ascent = layout.pickup_ascent or layout.drop_off_ascent
assert ascent is not None
join = builder.join(ascent.position)
else: else:
join = builder.join(layout.ingress.position) join = builder.join(layout.ingress.position)
if layout.pickup: if layout.pickup and layout.drop_off_ascent:
join = builder.join(layout.pickup.position) join = builder.join(layout.drop_off_ascent.position)
split = builder.split(layout.arrival.position) split = builder.split(layout.arrival.position)
if layout.drop_off: if layout.drop_off:
initial = builder.escort_hold( initial = builder.escort_hold(

View File

@ -17,7 +17,7 @@ if TYPE_CHECKING:
@dataclass @dataclass
class FormationLayout(LoiterLayout, ABC): class FormationLayout(LoiterLayout, ABC):
join: Optional[FlightWaypoint] join: FlightWaypoint
split: FlightWaypoint split: FlightWaypoint
refuel: Optional[FlightWaypoint] refuel: Optional[FlightWaypoint]

View File

@ -142,8 +142,7 @@ class FormationAttackLayout(FormationLayout):
if self.hold: if self.hold:
yield self.hold yield self.hold
yield from self.nav_to yield from self.nav_to
if self.join: yield self.join
yield self.join
if self.lineup: if self.lineup:
yield self.lineup yield self.lineup
yield self.ingress yield self.ingress
@ -187,11 +186,13 @@ class FormationAttackBuilder(IBuilder[FlightPlanT, LayoutT], ABC):
) )
hold = None hold = None
join = None if not self.flight.is_helo:
if not self.primary_flight_is_air_assault:
hold = builder.hold(self._hold_point()) hold = builder.hold(self._hold_point())
join = builder.join(self.package.waypoints.join) join_pos = self.package.waypoints.join
split = builder.split(self.package.waypoints.split) if self.flight.is_helo:
join_pos = self.package.waypoints.ingress
join = builder.join(join_pos)
split = builder.split(self._get_split())
refuel = self._build_refuel(builder) refuel = self._build_refuel(builder)
ingress = builder.ingress( ingress = builder.ingress(
@ -299,3 +300,13 @@ class FormationAttackBuilder(IBuilder[FlightPlanT, LayoutT], ABC):
return HoldZoneGeometry( return HoldZoneGeometry(
target, origin, ip, join, self.coalition, self.theater target, origin, ip, join, self.coalition, self.theater
).find_best_hold_point() ).find_best_hold_point()
def _get_split(self) -> Point:
assert self.package.waypoints is not None
assert self.package.primary_flight is not None
split_pos = (
self.package.primary_flight.arrival.position
if self.package.primary_flight.is_helo
else self.package.waypoints.split
)
return split_pos

View File

@ -11,7 +11,8 @@ from .pydcswaypointbuilder import PydcsWaypointBuilder
class BaiIngressBuilder(PydcsWaypointBuilder): class BaiIngressBuilder(PydcsWaypointBuilder):
def add_tasks(self, waypoint: MovingPoint) -> None: def add_tasks(self, waypoint: MovingPoint) -> None:
self.register_special_ingress_points() self.register_special_ingress_points()
waypoint.tasks.append(OptFormation.trail_open()) if not self.flight.is_helo:
waypoint.tasks.append(OptFormation.trail_open())
# TODO: Add common "UnitGroupTarget" base type. # TODO: Add common "UnitGroupTarget" base type.
group_names = [] group_names = []
target = self.package.target target = self.package.target