From c163e2c981035ec9cd22c5a54ea4f1d9a3ffbb8d Mon Sep 17 00:00:00 2001 From: bgreman <47828384+bgreman@users.noreply.github.com> Date: Wed, 26 May 2021 15:49:49 -0400 Subject: [PATCH] Inject mod plane weapons into pydcs. Adds a simple injector that iterates over attrs of an input class and injects things that look like custom weapons into pydcs's weapons classes. Also updated all current mod aircraft configs to perform the injection. --- pydcs_extensions/a4ec/a4ec.py | 5 +++++ pydcs_extensions/f22a/f22a.py | 11 ++++++----- pydcs_extensions/hercules/hercules.py | 5 +++++ pydcs_extensions/mb339/mb339.py | 5 +++++ pydcs_extensions/su57/su57.py | 5 +++++ pydcs_extensions/weapon_injector.py | 17 +++++++++++++++++ 6 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 pydcs_extensions/weapon_injector.py diff --git a/pydcs_extensions/a4ec/a4ec.py b/pydcs_extensions/a4ec/a4ec.py index 6582ae94..e835ebf3 100644 --- a/pydcs_extensions/a4ec/a4ec.py +++ b/pydcs_extensions/a4ec/a4ec.py @@ -4,6 +4,8 @@ from dcs import task from dcs.planes import PlaneType from dcs.weapons_data import Weapons +from pydcs_extensions.weapon_injector import inject_weapons + class WeaponsA4EC: AN_M57__2__TER_ = { @@ -432,6 +434,9 @@ class WeaponsA4EC: } +inject_weapons(WeaponsA4EC) + + class A_4E_C(PlaneType): id = "A-4E-C" flyable = True diff --git a/pydcs_extensions/f22a/f22a.py b/pydcs_extensions/f22a/f22a.py index af6907af..33eea7ea 100644 --- a/pydcs_extensions/f22a/f22a.py +++ b/pydcs_extensions/f22a/f22a.py @@ -2,16 +2,17 @@ from enum import Enum from dcs import task from dcs.planes import PlaneType -from dcs.weapons_data import Weapons, weapon_ids +from dcs.weapons_data import Weapons + +from pydcs_extensions.weapon_injector import inject_weapons class F22AWeapons: AIM_9XX = {"clsid": "{AIM-9XX}", "name": "AIM-9XX", "weight": 85} AIM_120D = {"clsid": "{AIM-120D}", "name": "AIM-120D", "weight": 152} - Weapons.AIM_9XX = AIM_9XX - Weapons.AIM_120D = AIM_120D - weapon_ids["{AIM-9XX}"] = AIM_9XX - weapon_ids["{AIM-120D}"] = AIM_120D + + +inject_weapons(F22AWeapons) class F_22A(PlaneType): diff --git a/pydcs_extensions/hercules/hercules.py b/pydcs_extensions/hercules/hercules.py index 611b0eb0..012a2ad0 100644 --- a/pydcs_extensions/hercules/hercules.py +++ b/pydcs_extensions/hercules/hercules.py @@ -4,6 +4,8 @@ from dcs import task from dcs.planes import PlaneType from dcs.weapons_data import Weapons +from pydcs_extensions.weapon_injector import inject_weapons + class HerculesWeapons: GAU_23A_Chain_Gun__30mm_ = { @@ -679,6 +681,9 @@ class HerculesWeapons: } +inject_weapons(HerculesWeapons) + + class Hercules(PlaneType): id = "Hercules" flyable = True diff --git a/pydcs_extensions/mb339/mb339.py b/pydcs_extensions/mb339/mb339.py index 896a33b0..77fe9691 100644 --- a/pydcs_extensions/mb339/mb339.py +++ b/pydcs_extensions/mb339/mb339.py @@ -4,6 +4,8 @@ from dcs import task from dcs.planes import PlaneType from dcs.weapons_data import Weapons +from pydcs_extensions.weapon_injector import inject_weapons + class MB_339PAN_Weapons: ARF8M3_TP = {"clsid": "{ARF8M3_TP}", "name": "ARF8M3 TP", "weight": None} @@ -107,6 +109,9 @@ class MB_339PAN_Weapons: } +inject_weapons(MB_339PAN_Weapons) + + class MB_339PAN(PlaneType): id = "MB-339PAN" flyable = True diff --git a/pydcs_extensions/su57/su57.py b/pydcs_extensions/su57/su57.py index fa3ce0a2..5892dc33 100644 --- a/pydcs_extensions/su57/su57.py +++ b/pydcs_extensions/su57/su57.py @@ -4,6 +4,8 @@ from dcs import task from dcs.planes import PlaneType from dcs.weapons_data import Weapons +from pydcs_extensions.weapon_injector import inject_weapons + class Su57Weapons: Kh_59MK2 = {"clsid": "{KH_59MK2}", "name": "Kh-59MK2", "weight": None} @@ -18,6 +20,9 @@ class Su57Weapons: } +inject_weapons(Su57Weapons) + + class Su_57(PlaneType): id = "Su-57" flyable = True diff --git a/pydcs_extensions/weapon_injector.py b/pydcs_extensions/weapon_injector.py new file mode 100644 index 00000000..6341c594 --- /dev/null +++ b/pydcs_extensions/weapon_injector.py @@ -0,0 +1,17 @@ +from typing import List, Any + +from dcs.weapons_data import Weapons, weapon_ids + + +def inject_weapons(weapon_class: Any) -> None: + """ + Inject custom weapons from mods into pydcs weapons databases via introspection + :param weapon_class: The custom weapons class containing dictionaries with weapon info + :return: None + """ + for key, value in weapon_class.__dict__.items(): + if key.startswith("__"): + continue + if isinstance(value, dict) and value.get("clsid"): + setattr(Weapons, key, value) + weapon_ids[value["clsid"]] = value