From 5f74fd81eb56f9c60c0fa77899e66d6000b354dc Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Fri, 25 Nov 2022 14:04:42 -0800 Subject: [PATCH] Unfilter the custom waypoint targets. There doesn't appear to be any reason for us to be poking at implementation details here aside from changing the name from "unit" to "building" for that case. Just iterate over the known strike targets. Making this change uncovered some latent type errors. Fixes https://github.com/dcs-liberation/dcs_liberation/issues/2564. (cherry picked from commit 5e7e5e2636c03e5b0da3fccf45b88951a3756059) --- game/ato/flightwaypoint.py | 6 +- .../aircraft/waypoints/strikeingress.py | 5 +- .../QPredefinedWaypointSelectionComboBox.py | 80 +++++-------------- 3 files changed, 24 insertions(+), 67 deletions(-) diff --git a/game/ato/flightwaypoint.py b/game/ato/flightwaypoint.py index c863b102..0efa17c1 100644 --- a/game/ato/flightwaypoint.py +++ b/game/ato/flightwaypoint.py @@ -1,6 +1,5 @@ from __future__ import annotations -from collections.abc import Sequence from dataclasses import dataclass, field from datetime import timedelta from typing import Literal, TYPE_CHECKING @@ -12,8 +11,7 @@ from game.theater.theatergroup import TheaterUnit from game.utils import Distance, meters if TYPE_CHECKING: - from game.theater import ControlPoint, MissionTarget - + from game.theater import ControlPoint AltitudeReference = Literal["BARO", "RADIO"] @@ -32,7 +30,7 @@ class FlightWaypoint: # having three names. A short and long form is enough. description: str = "" - targets: Sequence[MissionTarget | TheaterUnit] = field(default_factory=list) + targets: list[TheaterUnit] = field(default_factory=list) obj_name: str = "" pretty_name: str = "" only_for_player: bool = False diff --git a/game/missiongenerator/aircraft/waypoints/strikeingress.py b/game/missiongenerator/aircraft/waypoints/strikeingress.py index e6bbb5a5..89daa74f 100644 --- a/game/missiongenerator/aircraft/waypoints/strikeingress.py +++ b/game/missiongenerator/aircraft/waypoints/strikeingress.py @@ -1,8 +1,9 @@ import copy +from dcs import Point from dcs.planes import B_17G, B_52H, Tu_22M3 from dcs.point import MovingPoint -from dcs.task import Bombing, OptFormation, WeaponType, Expend +from dcs.task import Bombing, Expend, OptFormation, WeaponType from .pydcswaypointbuilder import PydcsWaypointBuilder @@ -21,7 +22,7 @@ class StrikeIngressBuilder(PydcsWaypointBuilder): if not targets: return - center = copy.copy(targets[0].position) + center: Point = copy.copy(targets[0].position) for target in targets[1:]: center += target.position center /= len(targets) diff --git a/qt_ui/widgets/combos/QPredefinedWaypointSelectionComboBox.py b/qt_ui/widgets/combos/QPredefinedWaypointSelectionComboBox.py index 0975c476..8b3a2b65 100644 --- a/qt_ui/widgets/combos/QPredefinedWaypointSelectionComboBox.py +++ b/qt_ui/widgets/combos/QPredefinedWaypointSelectionComboBox.py @@ -7,7 +7,6 @@ from game.missiongenerator.frontlineconflictdescription import ( FrontLineConflictDescription, ) from game.theater.controlpoint import ControlPointType -from game.theater.theatergroundobject import BuildingGroundObject, IadsGroundObject from game.utils import Distance from qt_ui.widgets.combos.QFilteredComboBox import QFilteredComboBox @@ -81,66 +80,25 @@ class QPredefinedWaypointSelectionComboBox(QFilteredComboBox): wpt.description = "Frontline" i = add_model_item(i, model, wpt.pretty_name, wpt) - if self.include_targets: - for cp in self.game.theater.controlpoints: - if (self.include_enemy and not cp.captured) or ( - self.include_friendly and cp.captured - ): - for ground_object in cp.ground_objects: - if not ground_object.is_dead and isinstance( - ground_object, BuildingGroundObject - ): - wpt = FlightWaypoint( - ground_object.waypoint_name, - FlightWaypointType.CUSTOM, - ground_object.position, - Distance.from_meters(0), - ) - wpt.alt_type = "RADIO" - wpt.pretty_name = wpt.name - wpt.obj_name = ground_object.obj_name - wpt.targets.append(ground_object) - if cp.captured: - wpt.description = "Friendly Building" - else: - wpt.description = "Enemy Building" - i = add_model_item(i, model, wpt.pretty_name, wpt) - - if self.include_units: - for cp in self.game.theater.controlpoints: - if (self.include_enemy and not cp.captured) or ( - self.include_friendly and cp.captured - ): - for ground_object in cp.ground_objects: - if not ground_object.is_dead and ( - isinstance(ground_object, IadsGroundObject) - ): - for g in ground_object.groups: - for j, u in enumerate(g.units): - wptname = ( - "[" - + str(ground_object.obj_name) - + "] : " - + u.name - + " #" - + str(j) - ) - wpt = FlightWaypoint( - wptname, - FlightWaypointType.CUSTOM, - u.position, - Distance.from_meters(0), - ) - wpt.alt_type = "RADIO" - wpt.pretty_name = wptname - wpt.targets.append(u) - wpt.obj_name = ground_object.obj_name - wpt.waypoint_type = FlightWaypointType.CUSTOM - if cp.captured: - wpt.description = "Friendly unit: " + u.name - else: - wpt.description = "Enemy unit: " + u.name - i = add_model_item(i, model, wpt.pretty_name, wpt) + for tgo in self.game.theater.ground_objects: + for target_idx, target in enumerate(tgo.strike_targets): + wptname = f"[{tgo.obj_name}] : {target.name} #{target_idx}" + wpt = FlightWaypoint( + wptname, + FlightWaypointType.CUSTOM, + target.position, + Distance.from_meters(0), + ) + wpt.alt_type = "RADIO" + wpt.pretty_name = wptname + wpt.targets.append(target) + wpt.obj_name = tgo.obj_name + wpt.waypoint_type = FlightWaypointType.CUSTOM + if tgo.is_friendly(to_player=True): + wpt.description = f"Friendly unit: {target.name}" + else: + wpt.description = f"Enemy unit: {target.name}" + i = add_model_item(i, model, wpt.pretty_name, wpt) if self.include_airbases: for cp in self.game.theater.controlpoints: