From 173b99f6103bd9fc697960f13e21b2fada0db3bc Mon Sep 17 00:00:00 2001 From: Raffson Date: Sat, 29 Oct 2022 23:54:01 +0200 Subject: [PATCH] Fix for orbit's broken stop condition (cherry picked from commit 7e7c920816d384001ac1dbf1bcbcf8ccaad4a093) (cherry picked from commit 73ee2ba4c0308f5dc00be27a1c1586c4696fda71) --- gen/aircraft.py | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/gen/aircraft.py b/gen/aircraft.py index b56118c1..2b649d36 100644 --- a/gen/aircraft.py +++ b/gen/aircraft.py @@ -9,7 +9,7 @@ from functools import cached_property from typing import Any, Dict, Iterable, List, Optional, TYPE_CHECKING, Type, Union from dcs import helicopters -from dcs.action import AITaskPush, ActivateGroup +from dcs.action import AITaskPush, ActivateGroup, SetFlag from dcs.condition import CoalitionHasAirdrome, TimeAfter from dcs.country import Country from dcs.flyingunit import FlyingUnit @@ -1490,6 +1490,24 @@ class DefaultWaypointBuilder(PydcsWaypointBuilder): pass +def create_stop_orbit_trigger( + orbit: ControlledTask, package: Package, mission: Mission, stop_after: int +) -> None: + orbit.stop_if_user_flag(id(package), True) + orbits = [ + x + for x in mission.triggerrules.triggers + if x.comment == f"StopOrbit{id(package)}" + ] + if not any(orbits): + stop_trigger = TriggerOnce(Event.NoEvent, f"StopOrbit{id(package)}") + stop_condition = TimeAfter(stop_after) + stop_action = SetFlag(id(package)) + stop_trigger.add_condition(stop_condition) + stop_trigger.add_action(stop_action) + mission.triggerrules.triggers.append(stop_trigger) + + class HoldPointBuilder(PydcsWaypointBuilder): def build(self) -> MovingPoint: waypoint = super().build() @@ -1506,7 +1524,11 @@ class HoldPointBuilder(PydcsWaypointBuilder): return waypoint push_time = self.flight.flight_plan.push_time self.waypoint.departure_time = push_time - loiter.stop_after_time(int(push_time.total_seconds())) + stop_after = int(push_time.total_seconds()) + loiter.stop_after_time(stop_after) + # What follows is some code to cope with the broken 'stop after time' condition + create_stop_orbit_trigger(loiter, self.package, self.mission, stop_after) + # end of hotfix waypoint.add_task(loiter) return waypoint @@ -1875,7 +1897,11 @@ class RaceTrackBuilder(PydcsWaypointBuilder): racetrack = ControlledTask(orbit) self.set_waypoint_tot(waypoint, flight_plan.patrol_start_time) - racetrack.stop_after_time(int(flight_plan.patrol_end_time.total_seconds())) + stop_after = int(flight_plan.patrol_end_time.total_seconds()) + racetrack.stop_after_time(stop_after) + # What follows is some code to cope with the broken 'stop after time' condition + create_stop_orbit_trigger(racetrack, self.package, self.mission, stop_after) + # end of hotfix waypoint.add_task(racetrack) return waypoint