mirror of
https://github.com/Pax1601/DCSOlympus.git
synced 2025-10-29 16:56:34 +00:00
Completed unit nation selection and new spawn menu
This commit is contained in:
132
scripts/python/addLoadouts.py
Normal file
132
scripts/python/addLoadouts.py
Normal file
@@ -0,0 +1,132 @@
|
||||
import sys
|
||||
import json
|
||||
import inspect
|
||||
import difflib
|
||||
from slpp import slpp as lua
|
||||
|
||||
SEARCH_FOLDER = "D:\\Eagle Dynamics\\DCS World OpenBeta"
|
||||
|
||||
sys.path.append("..\..\..\dcs-master\dcs-master")
|
||||
|
||||
from dcs.weapons_data import Weapons
|
||||
from dcs.planes import *
|
||||
from dcs.helicopters import *
|
||||
|
||||
# Known id mismatches (because reasons, ask ED)
|
||||
mismatched_ids = {
|
||||
"A-10CII": "A-10C_2"
|
||||
}
|
||||
|
||||
# Get the weapons ids from pydcs
|
||||
weapon_ids = [a for a in dir(Weapons) if not a.startswith('__') and not callable(getattr(Weapons, a))]
|
||||
|
||||
# This function get the human readable name of a weapon from its CLSID
|
||||
def find_weapon_name(clsid):
|
||||
for weapon_id in weapon_ids:
|
||||
if getattr(Weapons, weapon_id)["clsid"] == clsid:
|
||||
return getattr(Weapons, weapon_id)["name"]
|
||||
|
||||
# The database file on which to operate is the first standard argument of the call
|
||||
if len(sys.argv) > 1:
|
||||
if (sys.argv[1] == "aircraft"):
|
||||
filename = '..\\..\\client\\public\\databases\\units\\aircraftdatabase.json'
|
||||
elif (sys.argv[1] == "helicopter"):
|
||||
filename = '..\\..\\client\\public\\databases\\units\\helicopterdatabase.json'
|
||||
elif (sys.argv[1] == "groundunit"):
|
||||
filename = '..\\..\\client\\public\\databases\\units\\groundunitdatabase.json'
|
||||
elif (sys.argv[1] == "navyunit"):
|
||||
filename = '..\\..\\client\\public\\databases\\units\\navyunitdatabase.json'
|
||||
|
||||
# Loads the database
|
||||
with open(filename) as f:
|
||||
database = json.load(f)
|
||||
for unit_name in database:
|
||||
database[unit_name]["enabled"] = True
|
||||
|
||||
# Loads the loadout names
|
||||
with open('../unitPayloads.lua') as f:
|
||||
lines = f.readlines()
|
||||
unit_payloads = lua.decode("".join(lines).replace("Olympus.unitPayloads = ", "").replace("\n", ""))
|
||||
|
||||
# Loads the loadout roles
|
||||
with open('payloadRoles.json') as f:
|
||||
payloads_roles = json.load(f)
|
||||
|
||||
# Loop on all the units in the database
|
||||
for unit_name in database:
|
||||
try:
|
||||
# Get the pydcs Python class for the unit
|
||||
if (sys.argv[1] == "aircraft"):
|
||||
unitmap = plane_map
|
||||
elif (sys.argv[1] == "helicopter"):
|
||||
unitmap = helicopter_map
|
||||
elif (sys.argv[1] == "groundunit"):
|
||||
unitmap = vehicle_map
|
||||
elif (sys.argv[1] == "navyunit"):
|
||||
unitmap = ship_map
|
||||
lowercase_keys = [key.lower() for key in unitmap.keys()]
|
||||
res = difflib.get_close_matches(unit_name.lower(), lowercase_keys)
|
||||
if len(res) > 0:
|
||||
found_name = list(unitmap.keys())[lowercase_keys.index(res[0])]
|
||||
cls = unitmap[found_name]
|
||||
else:
|
||||
print(f"Warning, could not find {unit_name} in classes list. Skipping...")
|
||||
continue
|
||||
|
||||
# Create the loadouts table and add the empty loadout for the default task
|
||||
database[unit_name]["loadouts"] = []
|
||||
empty_loadout = {
|
||||
"items": [],
|
||||
"enabled": True,
|
||||
"code": "",
|
||||
"name": "Empty loadout",
|
||||
"roles": [cls.task_default.name]
|
||||
}
|
||||
database[unit_name]["loadouts"].append(empty_loadout)
|
||||
|
||||
# Loop on all the loadouts for that unit
|
||||
for payload_name in unit_payloads[unit_name]:
|
||||
payload_weapons = {}
|
||||
# Get the names of all the weapons in the loadout and count how many there are for each
|
||||
for payload_idx in unit_payloads[unit_name][payload_name]:
|
||||
payload_clsid = unit_payloads[unit_name][payload_name][payload_idx]["CLSID"]
|
||||
weapon_name = find_weapon_name(payload_clsid)
|
||||
if weapon_name in payload_weapons:
|
||||
payload_weapons[weapon_name] += 1
|
||||
else:
|
||||
payload_weapons[weapon_name] = 1
|
||||
|
||||
# Get the roles of this loadout. Some are numeric, some are string. Convert them to be all string
|
||||
payload_roles = []
|
||||
for role in payloads_roles[unit_name][payload_name].values():
|
||||
if isinstance(role, int):
|
||||
for name, obj in inspect.getmembers(task):
|
||||
if inspect.isclass(obj) and issubclass(obj, task.MainTask):
|
||||
if (obj.id == role):
|
||||
payload_roles.append(obj.name)
|
||||
else:
|
||||
for name, obj in inspect.getmembers(task):
|
||||
if inspect.isclass(obj) and issubclass(obj, task.MainTask):
|
||||
if (name == role):
|
||||
payload_roles.append(obj.name)
|
||||
|
||||
# Create the loadout structure and append it to the table
|
||||
new_payload = {
|
||||
"items": [{"name": weapon_name, "quantity": payload_weapons[weapon_name]} for weapon_name in payload_weapons],
|
||||
"enabled": True,
|
||||
"code": payload_name,
|
||||
"name": payload_name,
|
||||
"roles": payload_roles
|
||||
}
|
||||
database[unit_name]["loadouts"].append(new_payload)
|
||||
except Exception as e:
|
||||
print(f"Could not find data for aircraft of type {unit_name}: {e}, skipping...")
|
||||
|
||||
# Dump everything in the database
|
||||
with open(filename, "w") as f:
|
||||
json.dump(database, f, indent=2)
|
||||
|
||||
# Done!
|
||||
print("Done!")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user