mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Ability to configure liveries on flight/flight-member level
This commit is contained in:
parent
a7d65866e8
commit
ab32c44b9d
@ -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.
|
#### 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
|
## Features/Improvements
|
||||||
|
* **[Payload Editor]** Ability to configure liveries on flight/flight-member level
|
||||||
|
|
||||||
## Fixes
|
## Fixes
|
||||||
* **[UI/UX]** A-10A flights can be edited again.
|
* **[UI/UX]** A-10A flights can be edited again.
|
||||||
|
|||||||
@ -89,6 +89,7 @@ class Flight(
|
|||||||
|
|
||||||
self.initialize_fuel()
|
self.initialize_fuel()
|
||||||
self.use_same_loadout_for_all_members = True
|
self.use_same_loadout_for_all_members = True
|
||||||
|
self.use_same_livery_for_all_members = True
|
||||||
|
|
||||||
# Only used by transport missions.
|
# Only used by transport missions.
|
||||||
self.cargo = cargo
|
self.cargo = cargo
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
from __future__ import annotations
|
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.ato.loadouts import Loadout
|
||||||
from game.lasercodes import LaserCode
|
from game.lasercodes import LaserCode
|
||||||
@ -17,6 +17,7 @@ class FlightMember:
|
|||||||
self.tgp_laser_code: LaserCode | None = None
|
self.tgp_laser_code: LaserCode | None = None
|
||||||
self.weapon_laser_code: LaserCode | None = None
|
self.weapon_laser_code: LaserCode | None = None
|
||||||
self.properties: dict[str, bool | float | int] = {}
|
self.properties: dict[str, bool | float | int] = {}
|
||||||
|
self.livery: Optional[str] = None
|
||||||
|
|
||||||
def __setstate__(self, state: dict[str, Any]) -> None:
|
def __setstate__(self, state: dict[str, Any]) -> None:
|
||||||
if "tgp_laser_code" not in state:
|
if "tgp_laser_code" not in state:
|
||||||
|
|||||||
@ -95,6 +95,13 @@ class FlightMembers(IFlightRoster):
|
|||||||
# across all flight members.
|
# across all flight members.
|
||||||
member.loadout = loadout
|
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:
|
def use_distinct_loadouts_for_each_member(self) -> None:
|
||||||
for member in self.members:
|
for member in self.members:
|
||||||
member.loadout = member.loadout.clone()
|
member.loadout = member.loadout.clone()
|
||||||
|
|||||||
@ -124,10 +124,13 @@ class Migrator:
|
|||||||
try_set_attr(f, "tcn_name")
|
try_set_attr(f, "tcn_name")
|
||||||
try_set_attr(f, "fuel", f.unit_type.max_fuel)
|
try_set_attr(f, "fuel", f.unit_type.max_fuel)
|
||||||
try_set_attr(f, "plane_altitude_offset", 0)
|
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:
|
if f.package in f.squadron.coalition.ato.packages:
|
||||||
self._update_flight_plan(f)
|
self._update_flight_plan(f)
|
||||||
else:
|
else:
|
||||||
to_remove.append(f.id)
|
to_remove.append(f.id)
|
||||||
|
for m in f.roster.members:
|
||||||
|
try_set_attr(m, "livery", None)
|
||||||
for fid in to_remove:
|
for fid in to_remove:
|
||||||
self.game.db.flights.remove(fid)
|
self.game.db.flights.remove(fid)
|
||||||
|
|
||||||
|
|||||||
@ -38,7 +38,7 @@ class AircraftPainter:
|
|||||||
|
|
||||||
def apply_livery(self) -> None:
|
def apply_livery(self) -> None:
|
||||||
livery = self.determine_livery()
|
livery = self.determine_livery()
|
||||||
if livery is None:
|
for unit, member in zip(self.group.units, self.flight.iter_members()):
|
||||||
return
|
if not (livery or member.livery):
|
||||||
for unit in self.group.units:
|
continue
|
||||||
unit.livery_id = livery
|
unit.livery_id = member.livery if member.livery else livery
|
||||||
|
|||||||
@ -17,6 +17,7 @@ from game.ato.flight import Flight
|
|||||||
from game.ato.flightmember import FlightMember
|
from game.ato.flightmember import FlightMember
|
||||||
from game.ato.loadouts import Loadout
|
from game.ato.loadouts import Loadout
|
||||||
from qt_ui.widgets.QLabeledWidget import QLabeledWidget
|
from qt_ui.widgets.QLabeledWidget import QLabeledWidget
|
||||||
|
from qt_ui.widgets.combos.QSquadronLiverySelector import SquadronLiverySelector
|
||||||
from .QLoadoutEditor import QLoadoutEditor
|
from .QLoadoutEditor import QLoadoutEditor
|
||||||
from .ownlasercodeinfo import OwnLaserCodeInfo
|
from .ownlasercodeinfo import OwnLaserCodeInfo
|
||||||
from .propertyeditor import PropertyEditor
|
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()
|
scroll_content = QWidget()
|
||||||
scrolling_layout = QVBoxLayout()
|
scrolling_layout = QVBoxLayout()
|
||||||
scroll_content.setLayout(scrolling_layout)
|
scroll_content.setLayout(scrolling_layout)
|
||||||
@ -212,6 +231,9 @@ class QFlightPayloadTab(QFrame):
|
|||||||
self.property_editor.set_flight_member(member)
|
self.property_editor.set_flight_member(member)
|
||||||
self.loadout_selector.setCurrentText(member.loadout.name)
|
self.loadout_selector.setCurrentText(member.loadout.name)
|
||||||
self.loadout_selector.setDisabled(member.loadout.is_custom)
|
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.payload_editor.set_flight_member(member)
|
||||||
self.weapon_laser_code_selector.set_flight_member(member)
|
self.weapon_laser_code_selector.set_flight_member(member)
|
||||||
self.own_laser_code_info.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.payload_editor.setDisabled(
|
||||||
self.flight.use_same_loadout_for_all_members
|
self.flight.use_same_loadout_for_all_members
|
||||||
)
|
)
|
||||||
|
self.livery_selector.setDisabled(
|
||||||
|
self.flight.use_same_livery_for_all_members
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
self.loadout_selector.setEnabled(True)
|
self.loadout_selector.setEnabled(True)
|
||||||
self.payload_editor.setEnabled(True)
|
self.payload_editor.setEnabled(True)
|
||||||
|
self.livery_selector.setEnabled(True)
|
||||||
|
|
||||||
def loadout_at(self, index: int) -> Loadout:
|
def loadout_at(self, index: int) -> Loadout:
|
||||||
loadout = self.loadout_selector.itemData(index)
|
loadout = self.loadout_selector.itemData(index)
|
||||||
@ -273,3 +299,20 @@ class QFlightPayloadTab(QFrame):
|
|||||||
self.rebind_to_selected_member()
|
self.rebind_to_selected_member()
|
||||||
else:
|
else:
|
||||||
self.flight.roster.use_distinct_loadouts_for_each_member()
|
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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user