mirror of
https://github.com/dcs-liberation/dcs_liberation.git
synced 2025-11-10 14:22:26 +00:00
69 lines
2.5 KiB
Python
69 lines
2.5 KiB
Python
from dcs.point import MovingPoint
|
|
from dcs.task import ActivateBeaconCommand, RecoveryTanker, Tanker
|
|
|
|
from game.ato import FlightType
|
|
from game.utils import feet, knots
|
|
from .pydcswaypointbuilder import PydcsWaypointBuilder
|
|
|
|
|
|
class RecoveryTankerBuilder(PydcsWaypointBuilder):
|
|
def add_tasks(self, waypoint: MovingPoint) -> None:
|
|
assert self.flight.flight_type == FlightType.REFUELING
|
|
|
|
# Tanker task required in conjunction with RecoveryTanker task.
|
|
# See link below for details.
|
|
# https://github.com/dcs-liberation/dcs_liberation/issues/2771
|
|
waypoint.add_task(Tanker())
|
|
|
|
group_id = self._get_carrier_group_id()
|
|
speed = knots(250).meters_per_second
|
|
altitude = feet(6000).meters
|
|
|
|
# Last waypoint has index of 1.
|
|
# Give the tanker a end condition of the last carrier waypoint.
|
|
# If the carrier ever gets more than one waypoint this approach needs to change.
|
|
last_waypoint = 2
|
|
recovery_tanker = RecoveryTanker(group_id, speed, altitude, last_waypoint)
|
|
|
|
waypoint.add_task(recovery_tanker)
|
|
|
|
self.configure_tanker_tacan(waypoint)
|
|
|
|
def _get_carrier_group_id(self) -> int:
|
|
name = self.package.target.name
|
|
carrier_position = self.package.target.position
|
|
theater_objects = self.unit_map.theater_objects
|
|
for key, value in theater_objects.items():
|
|
# Check name and position in case there are multiple of same carrier.
|
|
if (
|
|
name in key
|
|
and value.theater_unit.position.distance_to_point(carrier_position)
|
|
< 1.0
|
|
):
|
|
return value.dcs_group_id
|
|
raise RuntimeError(
|
|
f"Could not find a carrier in the mission matching {name} at "
|
|
f"({carrier_position.x}, {carrier_position.y})"
|
|
)
|
|
|
|
def configure_tanker_tacan(self, waypoint: MovingPoint) -> None:
|
|
if self.flight.unit_type.dcs_unit_type.tacan:
|
|
tanker_info = self.mission_data.tankers[-1]
|
|
tacan = tanker_info.tacan
|
|
tacan_callsign = {
|
|
"Texaco": "TEX",
|
|
"Arco": "ARC",
|
|
"Shell": "SHL",
|
|
}.get(tanker_info.callsign)
|
|
|
|
waypoint.add_task(
|
|
ActivateBeaconCommand(
|
|
tacan.number,
|
|
tacan.band.value,
|
|
tacan_callsign,
|
|
bearing=True,
|
|
unit_id=self.group.units[0].id,
|
|
aa=True,
|
|
)
|
|
)
|