mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Update EW Script and refine logic (#555)
This commit is contained in:
@@ -123,6 +123,7 @@ class WeaponType(Enum):
|
||||
TGP = "TGP"
|
||||
DECOY = "DECOY"
|
||||
JAMMER = "JAMMER"
|
||||
OFFENSIVE_JAMMER = "OFFENSIVE_JAMMER"
|
||||
UNKNOWN = "unknown"
|
||||
|
||||
|
||||
|
||||
@@ -233,10 +233,14 @@ class AircraftType(UnitType[Type[FlyingType]]):
|
||||
# when no TGP is mounted on any station.
|
||||
has_built_in_target_pod: bool
|
||||
|
||||
# indicates if the aircraft has a built-in jammer allowing EWJamming to be used
|
||||
# indicates if the aircraft has a built-in jammer allowing Defensive EWJamming to be used
|
||||
# without the need for a jamming pod
|
||||
has_built_in_ecm: bool
|
||||
|
||||
# Indicates if the aircraft has a built in jammer allowing Offensive EWJamming to be used
|
||||
# without the need for a jamming pod
|
||||
has_built_in_jamming: bool
|
||||
|
||||
task_priorities: dict[FlightType, int]
|
||||
laser_code_configs: list[LaserCodeConfig]
|
||||
|
||||
@@ -600,6 +604,7 @@ class AircraftType(UnitType[Type[FlyingType]]):
|
||||
task_priorities=task_priorities,
|
||||
has_built_in_target_pod=data.get("has_built_in_target_pod", False),
|
||||
has_built_in_ecm=data.get("has_built_in_ecm", False),
|
||||
has_built_in_jamming=data.get("has_built_in_jamming", False),
|
||||
laser_code_configs=[
|
||||
LaserCodeConfig.from_yaml(d) for d in data.get("laser_codes", [])
|
||||
],
|
||||
|
||||
@@ -366,7 +366,9 @@ class AircraftGenerator:
|
||||
and (
|
||||
not self.need_ecm
|
||||
or flight.any_member_has_weapon_of_type(WeaponType.JAMMER)
|
||||
or flight.any_member_has_weapon_of_type(WeaponType.OFFENSIVE_JAMMER)
|
||||
or flight.squadron.aircraft.has_built_in_ecm
|
||||
or flight.squadron.aircraft.has_built_in_jamming
|
||||
)
|
||||
):
|
||||
self.ewrj_package_dict[id(flight.package)].append(group)
|
||||
|
||||
@@ -189,8 +189,17 @@ class FlightGroupConfigurator:
|
||||
return
|
||||
# Check if ecm_required option is enabled
|
||||
jammer_required = settings.plugin_option("ewrj.ecm_required")
|
||||
has_jammer = member.loadout.has_weapon_of_type(WeaponType.JAMMER)
|
||||
if jammer_required and not has_jammer:
|
||||
offensive_jammer = member.loadout.has_weapon_of_type(
|
||||
WeaponType.OFFENSIVE_JAMMER
|
||||
)
|
||||
offensive_inbuilt = self.flight.squadron.aircraft.has_built_in_jamming
|
||||
has_jammer = (
|
||||
member.loadout.has_weapon_of_type(WeaponType.JAMMER) or offensive_jammer
|
||||
)
|
||||
built_in_jammer = (
|
||||
self.flight.squadron.aircraft.has_built_in_ecm or offensive_inbuilt
|
||||
)
|
||||
if jammer_required and not (has_jammer or built_in_jammer):
|
||||
return
|
||||
# Create the original ewrj_menu_trigger for player flight members
|
||||
ewrj_menu_trigger = TriggerStart(comment=f"EWRJ-{unit.name}")
|
||||
@@ -199,6 +208,20 @@ class FlightGroupConfigurator:
|
||||
self.group.points[0].tasks[0] = OptReactOnThreat(
|
||||
OptReactOnThreat.Values.PassiveDefense
|
||||
)
|
||||
# Create LUA Flags for Offensive Jamming in EW Script for Player Flights
|
||||
if not (offensive_jammer or offensive_inbuilt):
|
||||
return
|
||||
ewrj_offensive_trigger = TriggerStart(
|
||||
comment=f"Offensive Jammer Flag {unit.name}"
|
||||
)
|
||||
ewrj_offensive_trigger.add_action(
|
||||
DoScript(
|
||||
String(
|
||||
f'trigger.action.setUserFlag("offensive_jamming_{unit.name}", 1)'
|
||||
)
|
||||
)
|
||||
)
|
||||
self.mission.triggerrules.triggers.append(ewrj_offensive_trigger)
|
||||
|
||||
def setup_radios(self) -> RadioFrequency:
|
||||
freq = self.flight.frequency
|
||||
|
||||
@@ -60,6 +60,7 @@ class JoinPointBuilder(PydcsWaypointBuilder):
|
||||
FlightType.SEAD_SWEEP,
|
||||
FlightType.SEAD,
|
||||
FlightType.SEAD_ESCORT,
|
||||
FlightType.DEAD,
|
||||
]:
|
||||
settings = self.flight.coalition.game.settings
|
||||
ai_jammer = settings.plugin_option("ewrj.ai_jammer_enabled")
|
||||
|
||||
@@ -164,12 +164,17 @@ class PydcsWaypointBuilder:
|
||||
settings = self.flight.coalition.game.settings
|
||||
ecm_required = settings.plugin_option("ewrj.ecm_required")
|
||||
for unit, member in zip(self.group.units, self.flight.iter_members()):
|
||||
has_jammer = member.loadout.has_weapon_of_type(WeaponType.JAMMER)
|
||||
built_in_jammer = self.flight.squadron.aircraft.has_built_in_ecm
|
||||
has_jammer = member.loadout.has_weapon_of_type(
|
||||
WeaponType.JAMMER
|
||||
) or member.loadout.has_weapon_of_type(WeaponType.OFFENSIVE_JAMMER)
|
||||
built_in_jammer = (
|
||||
self.flight.squadron.aircraft.has_built_in_ecm
|
||||
or self.flight.squadron.aircraft.has_built_in_jamming
|
||||
)
|
||||
if ecm_required and not (has_jammer or built_in_jammer):
|
||||
continue
|
||||
if not member.is_player:
|
||||
script_content = f'{action}Djamming("{unit.name}")'
|
||||
script_content = f'{action}IAdefjamming("{unit.name}")'
|
||||
jamming_script = RunScript(script_content)
|
||||
waypoint.tasks.append(jamming_script)
|
||||
|
||||
@@ -178,8 +183,8 @@ class PydcsWaypointBuilder:
|
||||
settings = self.flight.coalition.game.settings
|
||||
ecm_required = settings.plugin_option("ewrj.ecm_required")
|
||||
for unit, member in zip(self.group.units, self.flight.iter_members()):
|
||||
has_jammer = member.loadout.has_weapon_of_type(WeaponType.JAMMER)
|
||||
built_in_jammer = self.flight.squadron.aircraft.has_built_in_ecm
|
||||
has_jammer = member.loadout.has_weapon_of_type(WeaponType.OFFENSIVE_JAMMER)
|
||||
built_in_jammer = self.flight.squadron.aircraft.has_built_in_jamming
|
||||
if ecm_required and not (has_jammer or built_in_jammer):
|
||||
continue
|
||||
if not member.is_player:
|
||||
|
||||
@@ -43,6 +43,7 @@ class RaceTrackBuilder(PydcsWaypointBuilder):
|
||||
ai_jammer = settings.plugin_option("ewrj.ai_jammer_enabled")
|
||||
if settings.plugins.get("ewrj") and ai_jammer:
|
||||
self.defensive_jamming(waypoint, "start")
|
||||
self.offensive_jamming(waypoint, "start")
|
||||
|
||||
# NB: It's important that the engage task comes before the orbit task.
|
||||
# Though they're on the same waypoint, if the orbit task comes first it
|
||||
|
||||
@@ -23,6 +23,7 @@ class RaceTrackEndBuilder(PydcsWaypointBuilder):
|
||||
ai_jammer = settings.plugin_option("ewrj.ai_jammer_enabled")
|
||||
if settings.plugins.get("ewrj") and ai_jammer:
|
||||
self.defensive_jamming(waypoint, "stop")
|
||||
self.offensive_jamming(waypoint, "stop")
|
||||
|
||||
def build(self) -> MovingPoint:
|
||||
waypoint = super().build()
|
||||
|
||||
@@ -47,6 +47,7 @@ class SplitPointBuilder(PydcsWaypointBuilder):
|
||||
FlightType.SEAD_SWEEP,
|
||||
FlightType.SEAD,
|
||||
FlightType.SEAD_ESCORT,
|
||||
FlightType.DEAD,
|
||||
]:
|
||||
if self.flight.flight_type == FlightType.SEAD_ESCORT:
|
||||
# Moved previous escort split tasks
|
||||
|
||||
@@ -1057,6 +1057,7 @@ class PretenseAircraftGenerator:
|
||||
and (
|
||||
not self.need_ecm
|
||||
or flight.any_member_has_weapon_of_type(WeaponType.JAMMER)
|
||||
or flight.any_member_has_weapon_of_type(WeaponType.OFFENSIVE_JAMMER)
|
||||
)
|
||||
):
|
||||
self.ewrj_package_dict[id(flight.package)].append(group)
|
||||
|
||||
Reference in New Issue
Block a user