diff --git a/game/missiongenerator/aircraft/waypoints/_helper.py b/game/missiongenerator/aircraft/waypoints/_helper.py new file mode 100644 index 00000000..b0800bf0 --- /dev/null +++ b/game/missiongenerator/aircraft/waypoints/_helper.py @@ -0,0 +1,25 @@ +from dcs import Mission +from dcs.action import SetFlag +from dcs.condition import TimeAfter +from dcs.task import ControlledTask +from dcs.triggers import TriggerOnce, Event + +from game.ato import Package + + +def create_stop_orbit_trigger( + orbit: ControlledTask, package: Package, mission: Mission, elapsed: 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(elapsed) + stop_action = SetFlag(id(package)) + stop_trigger.add_condition(stop_condition) + stop_trigger.add_action(stop_action) + mission.triggerrules.triggers.append(stop_trigger) diff --git a/game/missiongenerator/aircraft/waypoints/holdpoint.py b/game/missiongenerator/aircraft/waypoints/holdpoint.py index 3e116c92..04ad44ef 100644 --- a/game/missiongenerator/aircraft/waypoints/holdpoint.py +++ b/game/missiongenerator/aircraft/waypoints/holdpoint.py @@ -4,6 +4,7 @@ from dcs.point import MovingPoint from dcs.task import ControlledTask, OptFormation, OrbitAction from game.ato.flightplans.loiter import LoiterFlightPlan +from ._helper import create_stop_orbit_trigger from .pydcswaypointbuilder import PydcsWaypointBuilder @@ -22,8 +23,10 @@ class HoldPointBuilder(PydcsWaypointBuilder): return push_time = self.flight.flight_plan.push_time self.waypoint.departure_time = push_time - loiter.stop_after_time( - int((push_time - self.elapsed_mission_time).total_seconds()) - ) + elapsed = int((push_time - self.elapsed_mission_time).total_seconds()) + loiter.stop_after_time(elapsed) + # What follows is some code to cope with the broken 'stop after time' condition + create_stop_orbit_trigger(loiter, self.package, self.mission, elapsed) + # end of hotfix waypoint.add_task(loiter) waypoint.add_task(OptFormation.finger_four_close()) diff --git a/game/missiongenerator/aircraft/waypoints/racetrack.py b/game/missiongenerator/aircraft/waypoints/racetrack.py index 2013e0ec..e38c3734 100644 --- a/game/missiongenerator/aircraft/waypoints/racetrack.py +++ b/game/missiongenerator/aircraft/waypoints/racetrack.py @@ -12,6 +12,7 @@ from dcs.task import ( from game.ato import FlightType from game.ato.flightplans.patrolling import PatrollingFlightPlan +from ._helper import create_stop_orbit_trigger from .pydcswaypointbuilder import PydcsWaypointBuilder @@ -57,7 +58,11 @@ class RaceTrackBuilder(PydcsWaypointBuilder): racetrack = ControlledTask(orbit) self.set_waypoint_tot(waypoint, flight_plan.patrol_start_time) loiter_duration = flight_plan.patrol_end_time - self.elapsed_mission_time - racetrack.stop_after_time(int(loiter_duration.total_seconds())) + elapsed = int(loiter_duration.total_seconds()) + racetrack.stop_after_time(elapsed) + # What follows is some code to cope with the broken 'stop after time' condition + create_stop_orbit_trigger(racetrack, self.package, self.mission, elapsed) + # end of hotfix waypoint.add_task(racetrack) def configure_refueling_actions(self, waypoint: MovingPoint) -> None: