Update EW Script and refine logic (#555)

This commit is contained in:
Drexyl
2025-08-28 03:20:27 +10:00
committed by GitHub
parent 756602e682
commit d2aa615133
22 changed files with 245 additions and 136 deletions

View File

@@ -123,6 +123,7 @@ class WeaponType(Enum):
TGP = "TGP"
DECOY = "DECOY"
JAMMER = "JAMMER"
OFFENSIVE_JAMMER = "OFFENSIVE_JAMMER"
UNKNOWN = "unknown"

View File

@@ -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", [])
],

View File

@@ -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)

View File

@@ -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

View File

@@ -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")

View File

@@ -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:

View File

@@ -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

View File

@@ -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()

View File

@@ -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

View File

@@ -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)