From ab32c44b9d9b0f763a9ebde2daeb7095924b24f7 Mon Sep 17 00:00:00 2001 From: Raffson Date: Fri, 22 Mar 2024 20:41:28 +0100 Subject: [PATCH] Ability to configure liveries on flight/flight-member level --- changelog.md | 1 + game/ato/flight.py | 1 + game/ato/flightmember.py | 3 +- game/ato/flightmembers.py | 7 +++ game/migrator.py | 3 ++ .../aircraft/aircraftpainter.py | 8 ++-- .../flight/payload/QFlightPayloadTab.py | 43 +++++++++++++++++++ 7 files changed, 61 insertions(+), 5 deletions(-) diff --git a/changelog.md b/changelog.md index 4602d477..cc616035 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,7 @@ #### Note: Re-save your missions in DCS' Mission Editor to avoid possible crashes due to datalink (usually the case when F-16C blk50s are used) when hosting missions on a dedicated server. ## Features/Improvements +* **[Payload Editor]** Ability to configure liveries on flight/flight-member level ## Fixes * **[UI/UX]** A-10A flights can be edited again. diff --git a/game/ato/flight.py b/game/ato/flight.py index bc976144..96a13072 100644 --- a/game/ato/flight.py +++ b/game/ato/flight.py @@ -89,6 +89,7 @@ class Flight( self.initialize_fuel() self.use_same_loadout_for_all_members = True + self.use_same_livery_for_all_members = True # Only used by transport missions. self.cargo = cargo diff --git a/game/ato/flightmember.py b/game/ato/flightmember.py index 86dc1952..680dc7ae 100644 --- a/game/ato/flightmember.py +++ b/game/ato/flightmember.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING, Any, Optional from game.ato.loadouts import Loadout from game.lasercodes import LaserCode @@ -17,6 +17,7 @@ class FlightMember: self.tgp_laser_code: LaserCode | None = None self.weapon_laser_code: LaserCode | None = None self.properties: dict[str, bool | float | int] = {} + self.livery: Optional[str] = None def __setstate__(self, state: dict[str, Any]) -> None: if "tgp_laser_code" not in state: diff --git a/game/ato/flightmembers.py b/game/ato/flightmembers.py index df70aa34..92defd2e 100644 --- a/game/ato/flightmembers.py +++ b/game/ato/flightmembers.py @@ -95,6 +95,13 @@ class FlightMembers(IFlightRoster): # across all flight members. member.loadout = loadout + def use_same_livery_for_all_members(self) -> None: + if not self.members: + return + livery = self.members[0].livery + for member in self.members[1:]: + member.livery = livery + def use_distinct_loadouts_for_each_member(self) -> None: for member in self.members: member.loadout = member.loadout.clone() diff --git a/game/migrator.py b/game/migrator.py index 59d0c4c3..3ab2eab1 100644 --- a/game/migrator.py +++ b/game/migrator.py @@ -124,10 +124,13 @@ class Migrator: try_set_attr(f, "tcn_name") try_set_attr(f, "fuel", f.unit_type.max_fuel) try_set_attr(f, "plane_altitude_offset", 0) + try_set_attr(f, "use_same_livery_for_all_members", True) if f.package in f.squadron.coalition.ato.packages: self._update_flight_plan(f) else: to_remove.append(f.id) + for m in f.roster.members: + try_set_attr(m, "livery", None) for fid in to_remove: self.game.db.flights.remove(fid) diff --git a/game/missiongenerator/aircraft/aircraftpainter.py b/game/missiongenerator/aircraft/aircraftpainter.py index df45ccaf..1547600b 100644 --- a/game/missiongenerator/aircraft/aircraftpainter.py +++ b/game/missiongenerator/aircraft/aircraftpainter.py @@ -38,7 +38,7 @@ class AircraftPainter: def apply_livery(self) -> None: livery = self.determine_livery() - if livery is None: - return - for unit in self.group.units: - unit.livery_id = livery + for unit, member in zip(self.group.units, self.flight.iter_members()): + if not (livery or member.livery): + continue + unit.livery_id = member.livery if member.livery else livery diff --git a/qt_ui/windows/mission/flight/payload/QFlightPayloadTab.py b/qt_ui/windows/mission/flight/payload/QFlightPayloadTab.py index afe6b56a..2c1e9bb8 100644 --- a/qt_ui/windows/mission/flight/payload/QFlightPayloadTab.py +++ b/qt_ui/windows/mission/flight/payload/QFlightPayloadTab.py @@ -17,6 +17,7 @@ from game.ato.flight import Flight from game.ato.flightmember import FlightMember from game.ato.loadouts import Loadout from qt_ui.widgets.QLabeledWidget import QLabeledWidget +from qt_ui.widgets.combos.QSquadronLiverySelector import SquadronLiverySelector from .QLoadoutEditor import QLoadoutEditor from .ownlasercodeinfo import OwnLaserCodeInfo from .propertyeditor import PropertyEditor @@ -141,6 +142,24 @@ class QFlightPayloadTab(QFrame): ) ) + hbox = QHBoxLayout() + self.same_livery_for_all_checkbox = QCheckBox( + "Use same livery for all flight members" + ) + self.same_livery_for_all_checkbox.setChecked( + self.flight.use_same_livery_for_all_members + ) + self.same_livery_for_all_checkbox.toggled.connect(self.on_same_livery_toggled) + hbox.addWidget(self.same_livery_for_all_checkbox) + self.livery_selector = SquadronLiverySelector(self.flight.squadron) + self.livery_selector.insertItem(0, "Default", None) + self.livery_selector.setCurrentIndex( + self.livery_selector.findData(self.member_selector.selected_member.livery) + ) + self.livery_selector.currentIndexChanged.connect(self.on_livery_change) + hbox.addWidget(self.livery_selector) + layout.addLayout(hbox) + scroll_content = QWidget() scrolling_layout = QVBoxLayout() scroll_content.setLayout(scrolling_layout) @@ -212,6 +231,9 @@ class QFlightPayloadTab(QFrame): self.property_editor.set_flight_member(member) self.loadout_selector.setCurrentText(member.loadout.name) self.loadout_selector.setDisabled(member.loadout.is_custom) + self.livery_selector.setCurrentIndex( + self.livery_selector.findData(member.livery) + ) self.payload_editor.set_flight_member(member) self.weapon_laser_code_selector.set_flight_member(member) self.own_laser_code_info.set_flight_member(member) @@ -222,9 +244,13 @@ class QFlightPayloadTab(QFrame): self.payload_editor.setDisabled( self.flight.use_same_loadout_for_all_members ) + self.livery_selector.setDisabled( + self.flight.use_same_livery_for_all_members + ) else: self.loadout_selector.setEnabled(True) self.payload_editor.setEnabled(True) + self.livery_selector.setEnabled(True) def loadout_at(self, index: int) -> Loadout: loadout = self.loadout_selector.itemData(index) @@ -273,3 +299,20 @@ class QFlightPayloadTab(QFrame): self.rebind_to_selected_member() else: self.flight.roster.use_distinct_loadouts_for_each_member() + + def on_same_livery_toggled(self, checked: bool) -> None: + self.flight.use_same_livery_for_all_members = checked + if self.member_selector.value(): + self.livery_selector.setDisabled(checked) + if checked: + self.flight.roster.use_same_livery_for_all_members() + if self.member_selector.value(): + self.rebind_to_selected_member() + + def on_livery_change(self) -> None: + livery = self.livery_selector.currentData() + if self.flight.use_same_livery_for_all_members: + for m in self.flight.roster.members: + m.livery = livery + else: + self.member_selector.selected_member.livery = livery