From 6da84dd7b0c38adff4d7083cc9e01ba1f83e56cf Mon Sep 17 00:00:00 2001 From: PeekabooSteam Date: Sun, 13 Aug 2023 15:34:59 +0100 Subject: [PATCH 1/7] Moved code from broken branch. --- client/public/stylesheets/olympus.css | 2 +- .../public/stylesheets/other/contextmenus.css | 40 + client/routes/api/airbases.js | 3 +- client/src/airfields/caucasus.json | 615 +++--- client/src/airfields/marianas.json | 626 ++++-- client/src/airfields/nevada.json | 801 ++++--- client/src/airfields/persiangulf.json | 1306 +++++++----- client/src/airfields/syria.json | 1839 ++++++++++------- client/src/controls/airbasecontextmenu.ts | 69 + client/src/mission/airbase.ts | 44 +- client/src/mission/missionhandler.ts | 39 +- client/views/other/contextmenus.ejs | 21 +- 12 files changed, 3351 insertions(+), 2054 deletions(-) diff --git a/client/public/stylesheets/olympus.css b/client/public/stylesheets/olympus.css index 592eaffa..25b77890 100644 --- a/client/public/stylesheets/olympus.css +++ b/client/public/stylesheets/olympus.css @@ -1075,7 +1075,7 @@ dl.ol-data-grid { } dl.ol-data-grid dd { - width: fit-content; + width: 60%; } dl.ol-data-grid dt.icon { diff --git a/client/public/stylesheets/other/contextmenus.css b/client/public/stylesheets/other/contextmenus.css index 6a8494de..3e2ad830 100644 --- a/client/public/stylesheets/other/contextmenus.css +++ b/client/public/stylesheets/other/contextmenus.css @@ -264,6 +264,9 @@ width: 16px; } + +/* Buttons */ + #center-map::before { content: url("/resources/theme/images/icons/arrows-to-eye-solid.svg"); } @@ -443,4 +446,41 @@ margin-top: 5px; text-align: center; width: 100%; +} + + + +/* Airbase context menu */ +#airbase-contextmenu #airbase-runways { + display:flex; + flex-direction: column; + row-gap:4px; +} + +#airbase-contextmenu #airbase-runways > .runway { + border:1px solid #ccc; + display:flex; + flex-direction: row; + justify-content: space-between; +} + +#airbase-contextmenu #airbase-runways > .runway abbr { + cursor:help; + text-decoration: none; +} + +#airbase-contextmenu #airbase-runways > .runway > .heading { + align-items: center; + column-gap: 4px; + display:flex; + flex-direction: row; +} + +#airbase-contextmenu #airbase-runways > .runway > .heading > abbr { + font-weight: var( --font-weight-bolder ); + padding:4px; +} + +#airbase-contextmenu #airbase-runways > .runway > .heading:last-of-type { + flex-direction: row-reverse; } \ No newline at end of file diff --git a/client/routes/api/airbases.js b/client/routes/api/airbases.js index a080c794..e283040f 100644 --- a/client/routes/api/airbases.js +++ b/client/routes/api/airbases.js @@ -77,7 +77,8 @@ app.get( "/:theatreName/:airbaseName", ( req, res ) => { app.get( "/:theatreName", ( req, res ) => { - const airbases = getAirbasesData( req.params.theatreName ); + const theatreName = req.params.theatreName.toLowerCase().replace( /\s*/g, "" ); + const airbases = getAirbasesData( theatreName ); if ( !airbases ) { sendInvalidTheatre( res ); diff --git a/client/src/airfields/caucasus.json b/client/src/airfields/caucasus.json index 7c060874..5b27dcdc 100644 --- a/client/src/airfields/caucasus.json +++ b/client/src/airfields/caucasus.json @@ -1,361 +1,466 @@ { - "airfields": { + "airfields": { "Anapa-Vityazevo": { "ICAO": "URKA", - "Elevation": "141", + "elevation": "141", "TACAN": "", - "Runways:": { - "04": { - "Mag Hdg": "034", - "Length": "9000", - "ILS": "" - }, - "22": { - "Mag Hdg": "214", - "Length": "9000", - "ILS": "" + "runways": [ + { + "headings": [ + { + "22": { + "magHeading": "214", + "ILS": "" + }, + "04": { + "magHeading": "034", + "ILS": "" + } + } + ], + "length": "9000" } - } + ] }, "Batumi": { "ICAO": "UGSB", - "Elevation": "33", + "elevation": "33", "TACAN": "16X", - "Runways": { - "13": { - "Mag Hdg": "119", - "Length": "7500", - "ILS": "" - }, - "31": { - "Mag Hdg": "299", - "Length": "7500", - "ILS": "" + "runways": [ + { + "headings": [ + { + "13": { + "magHeading": "119", + "ILS": "" + }, + "31": { + "magHeading": "299", + "ILS": "" + } + } + ], + "length": "7500" } - } + ] }, "Beslan": { "ICAO": "URMO", - "Elevation": "1722", + "elevation": "1722", "TACAN": "", - "Runways": { - "10": { - "Mag Hdg": "086", - "Length": "9600", - "ILS": "110.50" - }, - "28": { - "Mag Hdg": "266", - "Length": "9600", - "ILS": "" + "runways": [ + { + "headings": [ + { + "10": { + "magHeading": "086", + "ILS": "110.50" + }, + "28": { + "magHeading": "266", + "ILS": "" + } + } + ], + "length": "9600" } - } + ] }, "Gelendzhik": { "ICAO": "URKG", - "Elevation": "72", + "elevation": "72", "TACAN": "", - "Runways": { - "01": { - "Mag Hdg": "032", - "Length": "5400", - "ILS": "" - }, - "19": { - "Mag Hdg": "212", - "Length": "5400", - "ILS": "" + "runways": [ + { + "headings": [ + { + "19": { + "magHeading": "212", + "ILS": "" + }, + "01": { + "magHeading": "032", + "ILS": "" + } + } + ], + "length": "5400" } - } + ] }, "Gudauta": { "ICAO": "UG23", - "Elevation": "69", + "elevation": "69", "TACAN": "", - "Runways": { - "15": { - "Mag Hdg": "144", - "Length": "7700", - "ILS": "" - }, - "33": { - "Mag Hdg": "324", - "Length": "7700", - "ILS": "" + "runways": [ + { + "headings": [ + { + "15": { + "magHeading": "144", + "ILS": "" + }, + "33": { + "magHeading": "324", + "ILS": "" + } + } + ], + "length": "7700" } - } + ] }, "Kobuleti": { "ICAO": "UG5X", - "Elevation": "69", + "elevation": "69", "TACAN": "67X", - "Runways": { - "07": { - "Mag Hdg": "063", - "Length": "7400", - "ILS": "111.50" - }, - "25": { - "Mag Hdg": "243", - "Length": "7400", - "ILS": "" + "runways": [ + { + "headings": [ + { + "25": { + "magHeading": "243", + "ILS": "" + }, + "07": { + "magHeading": "063", + "ILS": "111.50" + } + } + ], + "length": "7400" } - } + ] }, "Krasnodar-Center": { "ICAO": "URKL", - "Elevation": "98", + "elevation": "98", "TACAN": "", - "Runways": { - "09": { - "Mag Hdg": "079", - "Length": "7700", - "ILS": "" - }, - "27": { - "Mag Hdg": "259", - "Length": "7700", - "ILS": "" + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "259", + "ILS": "" + }, + "09": { + "magHeading": "079", + "ILS": "" + } + } + ], + "length": "7700" } - } + ] }, "Krasnodar-Pashkovsky": { "ICAO": "URKK", - "Elevation": "112", + "elevation": "112", "TACAN": "", - "Runways": { - "05": { - "Mag Hdg": "039", - "Length": "9600", - "ILS": "" - }, - "23": { - "Mag Hdg": "219", - "Length": "9600", - "ILS": "" + "runways": [ + { + "headings": [ + { + "23": { + "magHeading": "219", + "ILS": "" + }, + "05": { + "magHeading": "039", + "ILS": "" + } + } + ], + "length": "9600" } - } + ] }, "Krymsk": { "ICAO": "URKW", - "Elevation": "66", + "elevation": "66", "TACAN": "", - "Runways": { - "04": { - "Mag Hdg": "032", - "Length": "8000", - "ILS": "" - }, - "22": { - "Mag Hdg": "212", - "Length": "8000", - "ILS": "" + "runways": [ + { + "headings": [ + { + "22": { + "magHeading": "212", + "ILS": "" + }, + "04": { + "magHeading": "032", + "ILS": "" + } + } + ], + "length": "8000" } - } + ] }, "Kutaisi": { "ICAO": "UGKO", - "Elevation": "148", + "elevation": "148", "TACAN": "44X", - "Runways": { - "07": { - "Mag Hdg": "067'", - "Length": "7700", - "ILS": "109.75" - }, - "25": { - "Mag Hdg": "247", - "Length": "7700", - "ILS": "" + "runways": [ + { + "headings": [ + { + "25": { + "magHeading": "247", + "ILS": "" + }, + "07": { + "magHeading": "067'", + "ILS": "109.75" + } + } + ], + "length": "7700" } - } + ] }, "Maykop-Khanskaya": { "ICAO": "URKH", - "Elevation": "591", + "elevation": "591", "TACAN": "", - "Runways": { - "04": { - "Mag Hdg": "031", - "Length": "10100", - "ILS": "" - }, - "22": { - "Mag Hdg": "211", - "Length": "10100", - "ILS": "" + "runways": [ + { + "headings": [ + { + "22": { + "magHeading": "211", + "ILS": "" + }, + "04": { + "magHeading": "031", + "ILS": "" + } + } + ], + "length": "10100" } - } + ] }, "Mineralnye Vody": { "ICAO": "URMM", - "Elevation": "1050", + "elevation": "1050", "TACAN": "", - "Runways": { - "12": { - "Mag Hdg": "108", - "Length": "12700", - "ILS": "111.70" - }, - "30": { - "Mag Hdg": "288", - "Length": "12700", - "ILS": "109.30" + "runways": [ + { + "headings": [ + { + "12": { + "magHeading": "108", + "ILS": "111.70" + }, + "30": { + "magHeading": "288", + "ILS": "109.30" + } + } + ], + "length": "12700" } - } + ] }, "Mozdok": { "ICAO": "XRMF", - "Elevation": "507", + "elevation": "507", "TACAN": "", - "Runways": { - "08": { - "Mag Hdg": "075", - "Length": "9400", - "ILS": "" - }, - "26": { - "Mag Hdg": "255", - "Length": "9400", - "ILS": "" + "runways": [ + { + "headings": [ + { + "26": { + "magHeading": "255", + "ILS": "" + }, + "08": { + "magHeading": "075", + "ILS": "" + } + } + ], + "length": "9400" } - } + ] }, - "Nalchick": { + "Nalchik": { "ICAO": "URMN", - "Elevation": "1411", + "elevation": "1411", "TACAN": "", - "Runways": { - "06": { - "Mag Hdg": "048'", - "Length": "7000", - "ILS": "" - }, - "24": { - "Mag Hdg": "228", - "Length": "7000", - "ILS": "110.50" + "runways": [ + { + "headings": [ + { + "24": { + "magHeading": "228", + "ILS": "110.50" + }, + "06": { + "magHeading": "048'", + "ILS": "" + } + } + ], + "length": "7000" } - } + ] }, "Novorossiysk": { "ICAO": "URKN", - "Elevation": "131", + "elevation": "131", "TACAN": "", - "Runways": { - "04": { - "Mag Hdg": "034", - "Length": "5400", - "ILS": "" - }, - "22": { - "Mag Hdg": "214", - "Length": "5400", - "ILS": "" + "runways": [ + { + "headings": [ + { + "22": { + "magHeading": "214", + "ILS": "" + }, + "04": { + "magHeading": "034", + "ILS": "" + } + } + ], + "length": "5400" } - } + ] }, "Senaki-Kolkhi": { "ICAO": "UGKS", - "Elevation": "43", + "elevation": "43", "TACAN": "31X", - "Runways": { - "09": { - "Mag Hdg": "088'", - "Length": "7400", - "ILS": "108.90" - }, - "27": { - "Mag Hdg": "268", - "Length": "7400", - "ILS": "" + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "268", + "ILS": "" + }, + "09": { + "magHeading": "088'", + "ILS": "108.90" + } + } + ], + "length": "7400" } - } + ] }, "Sochi-Adler": { "ICAO": "URSS", - "Elevation": "98", + "elevation": "98", "TACAN": "", - "Runways": { - "06": { - "Mag Hdg": "055", - "Length": "9700", - "ILS": "111.10" - }, - "27": { - "Mag Hdg": "235", - "Length": "9700", - "ILS": "" + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "235", + "ILS": "" + }, + "06": { + "magHeading": "055", + "ILS": "111.10" + } + } + ], + "length": "9700" } - } + ] }, "Tbilisi-Lochini": { "ICAO": "UGTB", - "Elevation": "1574", + "elevation": "1574", "TACAN": "25X", - "Runways": { - "13": { - "Mag Hdg": "121", - "Length": "9300", - "ILS": "110.30" - }, - "31": { - "Mag Hdg": "301", - "Length": "9300", - "ILS": "108.90" + "runways": [ + { + "headings": [ + { + "13": { + "magHeading": "121", + "ILS": "110.30" + }, + "31": { + "magHeading": "301", + "ILS": "108.90" + } + } + ], + "length": "9300" } - } + ] }, "Soganlug": { "ICAO": "UG24", - "Elevation": "1500", + "elevation": "1500", "TACAN": "25X", - "Runways": { - "14": { - "Mag Hdg": "125", - "Length": "6500", - "ILS": "" - }, - "32": { - "Mag Hdg": "305", - "Length": "6500", - "ILS": "" + "runways": [ + { + "headings": [ + { + "14": { + "magHeading": "125", + "ILS": "" + }, + "32": { + "magHeading": "305", + "ILS": "" + } + } + ], + "length": "6500" } - } + ] }, "Sukhumi-Babushara": { "ICAO": "UGSS", - "Elevation": "43", + "elevation": "43", "TACAN": "", - "Runways": { - "12": { - "Mag Hdg": "109", - "Length": "11400", - "ILS": "" - }, - "30": { - "Mag Hdg": "289", - "Length": "11400", - "ILS": "" + "runways": [ + { + "headings": [ + { + "12": { + "magHeading": "109", + "ILS": "" + }, + "30": { + "magHeading": "289", + "ILS": "" + } + } + ], + "length": "11400" } - } + ] }, "Vaziani": { "ICAO": "UG27", - "Elevation": "1524", + "elevation": "1524", "TACAN": "22X", - "Runways": { - "13": { - "Mag Hdg": "129", - "Length": "7700", - "ILS": "108.75" - }, - "31": { - "Mag Hdg": "309", - "Length": "7700", - "ILS": "108.75" + "runways": [ + { + "headings": [ + { + "13": { + "magHeading": "129", + "ILS": "108.75" + }, + "31": { + "magHeading": "309", + "ILS": "108.75" + } + } + ], + "length": "7700" } - } + ] } } -} +} \ No newline at end of file diff --git a/client/src/airfields/marianas.json b/client/src/airfields/marianas.json index 3451c203..580c6f89 100644 --- a/client/src/airfields/marianas.json +++ b/client/src/airfields/marianas.json @@ -1,170 +1,466 @@ { "airfields": { - "Andersen_AFB": { - "ICAO": "PGUA", - "Elevation": "606", - "TACAN": "54X", - "Runways:": { - "06L": { - "Mag Hdg": "066", - "Length": "10300", - "ILS": "109.30" - }, - "24R": { - "Mag Hdg": "246", - "Length": "10300", - "ILS": "109.35" - }, - "06R": { - "Mag Hdg": "066", - "Length": "10900", - "ILS": "110.10" - }, - "24l": { - "Mag Hdg": "246", - "Length": "10900", - "ILS": "110.15" - } - } - }, - "Antonio_B._Won_Pat_Int_Airport": { - "ICAO": "PGUM", - "Elevation": "255", - "TACAN": "105X", - "Runways:": { - "06L": { - "Mag Hdg": "066", - "Length": "10600", - "ILS": "110.30" - }, - "24R": { - "Mag Hdg": "245", - "Length": "10600", - "ILS": "" - }, - "06R": { - "Mag Hdg": "066", - "Length": "8600", - "ILS": "110.90" - }, - "24L": { - "Mag Hdg": "245", - "Length": "8600", - "ILS": "" - } - } - }, - "North_West_Field": { - "ICAO": "", - "Elevation": "522", - "TACAN": "", - "Runways:": { - "06": { - "Mag Hdg": "063", - "Length": "4500", - "ILS": "" - }, - "24": { - "Mag Hdg": "243", - "Length": "4500", - "ILS": "" - } - } - }, - "Olf_Orote_Field": { - "ICAO": "", - "Elevation": "94", - "TACAN": "", - "Runways:": { - "07": { - "Mag Hdg": "067", - "Length": "3500", - "ILS": "" - }, - "25": { - "Mag Hdg": "247", - "Length": "3500", - "ILS": "" - } - } - }, - "Pagan_Airstrip": { - "ICAO": "", - "Elevation": "49", - "TACAN": "", - "Runways:": { - "11": { - "Mag Hdg": "112", - "Length": "1800", - "ILS": "" - }, - "29": { - "Mag Hdg": "292", - "Length": "1800", - "ILS": "" - } - } - }, - "Rota_Int": { - "ICAO": "PGRO", - "Elevation": "569", - "TACAN": "", - "Runways:": { - "09": { - "Mag Hdg": "092", - "Length": "6600", - "ILS": "" - }, - "27": { - "Mag Hdg": "272", - "Length": "6600", - "ILS": "" - } - } - }, - "Saipan_Int": { - "ICAO": "PGSN", - "Elevation": "213", - "TACAN": "", - "Runways:": { - "06": { - "Mag Hdg": "068", - "Length": "6200", - "ILS": "" - }, - "24": { - "Mag Hdg": "248", - "Length": "6200", - "ILS": "" - }, - "07": { - "Mag Hdg": "068", - "Length": "10600", - "ILS": "109.90" - }, - "25": { - "Mag Hdg": "248", - "Length": "10600", - "ILS": "" - } - } - }, - "Tinian_Int": { - "ICAO": "PGWT", - "Elevation": "284", - "TACAN": "", - "Runways:": { - "08": { - "Mag Hdg": "079", - "Length": "8200", - "ILS": "" - }, - "26": { - "Mag Hdg": "259", - "Length": "8200", - "ILS": "" - } + "Anapa-Vityazevo": { + "ICAO": "URKA", + "elevation": "141", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "22": { + "magHeading": "214", + "ILS": "" + }, + "04": { + "magHeading": "034", + "ILS": "" + } + } + ], + "length": "9000" + } + ] + }, + "Batumi": { + "ICAO": "UGSB", + "elevation": "33", + "TACAN": "16X", + "runways": [ + { + "headings": [ + { + "13": { + "magHeading": "119", + "ILS": "" + }, + "31": { + "magHeading": "299", + "ILS": "" + } + } + ], + "length": "7500" + } + ] + }, + "Beslan": { + "ICAO": "URMO", + "elevation": "1722", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "10": { + "magHeading": "086", + "ILS": "110.50" + }, + "28": { + "magHeading": "266", + "ILS": "" + } + } + ], + "length": "9600" + } + ] + }, + "Gelendzhik": { + "ICAO": "URKG", + "elevation": "72", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "19": { + "magHeading": "212", + "ILS": "" + }, + "01": { + "magHeading": "032", + "ILS": "" + } + } + ], + "length": "5400" + } + ] + }, + "Gudauta": { + "ICAO": "UG23", + "elevation": "69", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "15": { + "magHeading": "144", + "ILS": "" + }, + "33": { + "magHeading": "324", + "ILS": "" + } + } + ], + "length": "7700" + } + ] + }, + "Kobuleti": { + "ICAO": "UG5X", + "elevation": "69", + "TACAN": "67X", + "runways": [ + { + "headings": [ + { + "25": { + "magHeading": "243", + "ILS": "" + }, + "07": { + "magHeading": "063", + "ILS": "111.50" + } + } + ], + "length": "7400" + } + ] + }, + "Krasnodar-Center": { + "ICAO": "URKL", + "elevation": "98", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "259", + "ILS": "" + }, + "09": { + "magHeading": "079", + "ILS": "" + } + } + ], + "length": "7700" + } + ] + }, + "Krasnodar-Pashkovsky": { + "ICAO": "URKK", + "elevation": "112", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "23": { + "magHeading": "219", + "ILS": "" + }, + "05": { + "magHeading": "039", + "ILS": "" + } + } + ], + "length": "9600" + } + ] + }, + "Krymsk": { + "ICAO": "URKW", + "elevation": "66", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "22": { + "magHeading": "212", + "ILS": "" + }, + "04": { + "magHeading": "032", + "ILS": "" + } + } + ], + "length": "8000" + } + ] + }, + "Kutaisi": { + "ICAO": "UGKO", + "elevation": "148", + "TACAN": "44X", + "runways": [ + { + "headings": [ + { + "25": { + "magHeading": "247", + "ILS": "" + }, + "07": { + "magHeading": "067'", + "ILS": "109.75" + } + } + ], + "length": "7700" + } + ] + }, + "Maykop-Khanskaya": { + "ICAO": "URKH", + "elevation": "591", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "22": { + "magHeading": "211", + "ILS": "" + }, + "04": { + "magHeading": "031", + "ILS": "" + } + } + ], + "length": "10100" + } + ] + }, + "Mineralnye Vody": { + "ICAO": "URMM", + "elevation": "1050", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "12": { + "magHeading": "108", + "ILS": "111.70" + }, + "30": { + "magHeading": "288", + "ILS": "109.30" + } + } + ], + "length": "12700" + } + ] + }, + "Mozdok": { + "ICAO": "XRMF", + "elevation": "507", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "26": { + "magHeading": "255", + "ILS": "" + }, + "08": { + "magHeading": "075", + "ILS": "" + } + } + ], + "length": "9400" + } + ] + }, + "Nalchik": { + "ICAO": "URMN", + "elevation": "1411", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "24": { + "magHeading": "228", + "ILS": "110.50" + }, + "06": { + "magHeading": "048'", + "ILS": "" + } + } + ], + "length": "7000" + } + ] + }, + "Novorossiysk": { + "ICAO": "URKN", + "elevation": "131", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "22": { + "magHeading": "214", + "ILS": "" + }, + "04": { + "magHeading": "034", + "ILS": "" + } + } + ], + "length": "5400" + } + ] + }, + "Senaki-Kolkhi": { + "ICAO": "UGKS", + "elevation": "43", + "TACAN": "31X", + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "268", + "ILS": "" + }, + "09": { + "magHeading": "088'", + "ILS": "108.90" + } + } + ], + "length": "7400" + } + ] + }, + "Sochi-Adler": { + "ICAO": "URSS", + "elevation": "98", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "235", + "ILS": "" + }, + "06": { + "magHeading": "055", + "ILS": "111.10" + } + } + ], + "length": "9700" + } + ] + }, + "Tbilisi-Lochini": { + "ICAO": "UGTB", + "elevation": "1574", + "TACAN": "25X", + "runways": [ + { + "headings": [ + { + "13": { + "magHeading": "121", + "ILS": "110.30" + }, + "31": { + "magHeading": "301", + "ILS": "108.90" + } + } + ], + "length": "9300" + } + ] + }, + "Soganlug": { + "ICAO": "UG24", + "elevation": "1500", + "TACAN": "25X", + "runways": [ + { + "headings": [ + { + "14": { + "magHeading": "125", + "ILS": "" + }, + "32": { + "magHeading": "305", + "ILS": "" + } + } + ], + "length": "6500" + } + ] + }, + "Sukhumi-Babushara": { + "ICAO": "UGSS", + "elevation": "43", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "12": { + "magHeading": "109", + "ILS": "" + }, + "30": { + "magHeading": "289", + "ILS": "" + } + } + ], + "length": "11400" + } + ] + }, + "Vaziani": { + "ICAO": "UG27", + "elevation": "1524", + "TACAN": "22X", + "runways": [ + { + "headings": [ + { + "13": { + "magHeading": "129", + "ILS": "108.75" + }, + "31": { + "magHeading": "309", + "ILS": "108.75" + } + } + ], + "length": "7700" + } + ] } } - } } \ No newline at end of file diff --git a/client/src/airfields/nevada.json b/client/src/airfields/nevada.json index e94d1d4d..48159c97 100644 --- a/client/src/airfields/nevada.json +++ b/client/src/airfields/nevada.json @@ -1,413 +1,558 @@ { "airfields": { - "BeattyAirport": { + "Beatty": { "ICAO": "KBTY", - "Elevation": "3173", + "elevation": "3173", "TACAN": "94X", - "Runways:": { - "16": { - "Mag Hdg": "168", - "Length": "5500", - "ILS": "" - }, - "34": { - "Mag Hdg": "348", - "Length": "5500", - "ILS": "" + "runways": [ + { + "headings": [ + { + "16": { + "magHeading": "168", + "ILS": "" + }, + "34": { + "magHeading": "348", + "ILS": "" + } + } + ], + "length": "5500" } - } + ] }, - "BoulderCityAirport": { + "Boulder City": { "ICAO": "KBVU", - "Elevation": "2205", + "elevation": "2205", "TACAN": "114X", - "Runways:": { - "09": { - "Mag Hdg": "087", - "Length": "4400", - "ILS": "" + "runways": [ + { + "headings": [ + { + "15": { + "magHeading": "153", + "ILS": "" + }, + "33": { + "magHeading": "333", + "ILS": "" + } + } + ], + "length": "3700" }, - "27": { - "Mag Hdg": "267", - "Length": "4400", - "ILS": "" - }, - "15": { - "Mag Hdg": "153", - "Length": "3700", - "ILS": "" - }, - "33": { - "Mag Hdg": "333", - "Length": "3700", - "ILS": "" + { + "headings": [ + { + "27": { + "magHeading": "267", + "ILS": "" + }, + "09": { + "magHeading": "087", + "ILS": "" + } + } + ], + "length": "4400" } - } + ] }, "Creech": { "ICAO": "KINS", - "Elevation": "3126", + "elevation": "3126", "TACAN": "87X", - "Runways:": { - "08": { - "Mag Hdg": "080", - "Length": "8700", - "ILS": "108.70" + "runways": [ + { + "headings": [ + { + "13": { + "magHeading": "134", + "ILS": "" + }, + "31": { + "magHeading": "314", + "ILS": "" + } + } + ], + "length": "4700" }, - "26": { - "Mag Hdg": "260", - "Length": "8700", - "ILS": "" - }, - "13": { - "Mag Hdg": "134", - "Length": "4700", - "ILS": "" - }, - "31": { - "Mag Hdg": "314", - "Length": "4700", - "ILS": "" + { + "headings": [ + { + "26": { + "magHeading": "260", + "ILS": "" + }, + "08": { + "magHeading": "080", + "ILS": "108.70" + } + } + ], + "length": "8700" } - } + ] }, - "EchoBayAirport": { + "Echo Bay": { "ICAO": "0L9", - "Elevation": "1549", + "elevation": "1549", "TACAN": "", - "Runways:": { - "06": { - "Mag Hdg": "066", - "Length": "3300", - "ILS": "" - }, - "24": { - "Mag Hdg": "246", - "Length": "3300", - "ILS": "" + "runways": [ + { + "headings": [ + { + "24": { + "magHeading": "246", + "ILS": "" + }, + "06": { + "magHeading": "066", + "ILS": "" + } + } + ], + "length": "3300" } - } + ] }, - "groom": { + "Groom Lake": { "ICAO": "KXTA", - "Elevation": "4495", + "elevation": "4495", "TACAN": "18X", - "Runways:": { - "14L": { - "Mag Hdg": "145", - "Length": "11700", - "ILS": "" + "runways": [ + { + "headings": [ + { + "14L": { + "magHeading": "145", + "ILS": "" + }, + "32R": { + "magHeading": "325", + "ILS": "109.30" + } + } + ], + "length": "11700" }, - "32R": { - "Mag Hdg": "325", - "Length": "11700", - "ILS": "109.30" - }, - "14R (CLOSED)": { - "Mag Hdg": "145", - "Length": "17800", - "ILS": "" - }, - "32L (CLOSED)": { - "Mag Hdg": "325", - "Length": "17800", - "ILS": "" + { + "headings": [ + { + "14R (CLOSED)": { + "magHeading": "145", + "ILS": "" + }, + "32L (CLOSED)": { + "magHeading": "325", + "ILS": "" + } + } + ], + "length": "17800" } - } + ] }, - "HendersonExecutiveAirport": { + "Henderson Executive": { "ICAO": "KHND", - "Elevation": "2493", + "elevation": "2493", "TACAN": "", - "Runways:": { - "17L": { - "Mag Hdg": "168", - "Length": "4600", - "ILS": "" + "runways": [ + { + "headings": [ + { + "17L": { + "magHeading": "168", + "ILS": "" + }, + "35R": { + "magHeading": "348", + "ILS": "" + } + } + ], + "length": "4600" }, - "35R": { - "Mag Hdg": "348", - "Length": "4600", - "ILS": "" - }, - "17R": { - "Mag Hdg": "168", - "Length": "6100", - "ILS": "" - }, - "35L": { - "Mag Hdg": "348", - "Length": "6100", - "ILS": "" + { + "headings": [ + { + "17R": { + "magHeading": "168", + "ILS": "" + }, + "35L": { + "magHeading": "348", + "ILS": "" + } + } + ], + "length": "6100" } - } + ] }, - "JeanAirport": { + "Jean": { "ICAO": "", - "Elevation": "2825", + "elevation": "2825", "TACAN": "", - "Runways:": { - "02L": { - "Mag Hdg": "020", - "Length": "4500", - "ILS": "" + "runways": [ + { + "headings": [ + { + "02L": { + "magHeading": "020", + "ILS": "" + }, + "20R": { + "magHeading": "200", + "ILS": "" + } + } + ], + "length": "4500" }, - "20R": { - "Mag Hdg": "200", - "Length": "4500", - "ILS": "" - }, - "02R": { - "Mag Hdg": "020", - "Length": "3600", - "ILS": "" - }, - "20L": { - "Mag Hdg": "200", - "Length": "3600", - "ILS": "" + { + "headings": [ + { + "02R": { + "magHeading": "020", + "ILS": "" + }, + "20L": { + "magHeading": "200", + "ILS": "" + } + } + ], + "length": "3600" } - } + ] }, - "LasVegas": { + "McCarran International": { "ICAO": "KLAS", - "Elevation": "2178", + "elevation": "2178", "TACAN": "116X", - "Runways:": { - "01L": { - "Mag Hdg": "013", - "Length": "8000", - "ILS": "" + "runways": [ + { + "headings": [ + { + "01L": { + "magHeading": "013", + "ILS": "" + }, + "19R": { + "magHeading": "193", + "ILS": "" + } + } + ], + "length": "8000" }, - "19R": { - "Mag Hdg": "193", - "Length": "8000", - "ILS": "" + { + "headings": [ + { + "01R": { + "magHeading": "013", + "ILS": "" + }, + "19L": { + "magHeading": "193", + "ILS": "" + } + } + ], + "length": "8000" }, - "01R": { - "Mag Hdg": "013", - "Length": "8000", - "ILS": "" + { + "headings": [ + { + "07L": { + "magHeading": "078", + "ILS": "" + }, + "25R": { + "magHeading": "258", + "ILS": "110.30" + } + } + ], + "length": "10600" }, - "19L": { - "Mag Hdg": "193", - "Length": "8000", - "ILS": "" - }, - "07L": { - "Mag Hdg": "078", - "Length": "10600", - "ILS": "" - }, - "25R": { - "Mag Hdg": "258", - "Length": "10600", - "ILS": "110.30" - }, - "07R": { - "Mag Hdg": "078", - "Length": "10100", - "ILS": "" - }, - "25L": { - "Mag Hdg": "258", - "Length": "10100", - "ILS": "" + { + "headings": [ + { + "07R": { + "magHeading": "078", + "ILS": "" + }, + "25L": { + "magHeading": "258", + "ILS": "" + } + } + ], + "length": "10100" } - } + ] }, - "LaughlinAirport": { + "Laughlin": { "ICAO": "KIFP", - "Elevation": "673", + "elevation": "673", "TACAN": "", - "Runways:": { - "16": { - "Mag Hdg": "164", - "Length": "7100", - "ILS": "" - }, - "34": { - "Mag Hdg": "344", - "Length": "7100", - "ILS": "" + "runways": [ + { + "headings": [ + { + "16": { + "magHeading": "164", + "ILS": "" + }, + "34": { + "magHeading": "344", + "ILS": "" + } + } + ], + "length": "7100" } - } + ] }, - "LincolnCountyAirport": { + "Lincoln County": { "ICAO": "", - "Elevation": "4816", + "elevation": "4816", "TACAN": "", - "Runways:": { - "17": { - "Mag Hdg": "170", - "Length": "4500", - "ILS": "" - }, - "35": { - "Mag Hdg": "350", - "Length": "4500", - "ILS": "" + "runways": [ + { + "headings": [ + { + "17": { + "magHeading": "170", + "ILS": "" + }, + "35": { + "magHeading": "350", + "ILS": "" + } + } + ], + "length": "4500" } - } + ] }, - "MesquiteAirport": { + "Mesquite": { "ICAO": "67L", - "Elevation": "1859", + "elevation": "1859", "TACAN": "", - "Runways:": { - "01": { - "Mag Hdg": "017", - "Length": "5000", - "ILS": "" - }, - "19": { - "Mag Hdg": "197", - "Length": "5000", - "ILS": "" + "runways": [ + { + "headings": [ + { + "19": { + "magHeading": "197", + "ILS": "" + }, + "01": { + "magHeading": "017", + "ILS": "" + } + } + ], + "length": "5000" } - } + ] }, - "MinahAirport_3Q0": { + "Mina": { "ICAO": "", - "Elevation": "4560", + "elevation": "4560", "TACAN": "", - "Runways:": { - "13": { - "Mag Hdg": "140", - "Length": "4100", - "ILS": "" - }, - "31": { - "Mag Hdg": "320", - "Length": "4100", - "ILS": "" + "runways": [ + { + "headings": [ + { + "13": { + "magHeading": "140", + "ILS": "" + }, + "31": { + "magHeading": "320", + "ILS": "" + } + } + ], + "length": "4100" } - } + ] }, - "nellis": { + "Nellis": { "ICAO": "KLSV", - "Elevation": "1849", + "elevation": "1849", "TACAN": "12X", - "Runways:": { - "03L": { - "Mag Hdg": "029", - "Length": "9800", - "ILS": "" + "runways": [ + { + "headings": [ + { + "03L": { + "magHeading": "029", + "ILS": "" + }, + "21R": { + "magHeading": "209", + "ILS": "" + } + } + ], + "length": "9800" }, - "21R": { - "Mag Hdg": "209", - "Length": "9800", - "ILS": "" - }, - "03R": { - "Mag Hdg": "029", - "Length": "9800", - "ILS": "" - }, - "21L": { - "Mag Hdg": "209", - "Length": "9800", - "ILS": "109.10" + { + "headings": [ + { + "03R": { + "magHeading": "029", + "ILS": "" + }, + "21L": { + "magHeading": "209", + "ILS": "109.10" + } + } + ], + "length": "9800" } - } + ] }, - "NorthLasVegasAirport": { + "North Las Vegas": { "ICAO": "KVGT", - "Elevation": "2228", + "elevation": "2228", "TACAN": "", - "Runways:": { - "07": { - "Mag Hdg": "076", - "Length": "4900", - "ILS": "" + "runways": [ + { + "headings": [ + { + "25": { + "magHeading": "256", + "ILS": "" + }, + "07": { + "magHeading": "076", + "ILS": "" + } + } + ], + "length": "4900" }, - "25": { - "Mag Hdg": "256", - "Length": "4900", - "ILS": "" + { + "headings": [ + { + "12L": { + "magHeading": "122", + "ILS": "110.70" + }, + "30R": { + "magHeading": "302", + "ILS": "109.10" + } + } + ], + "length": "3800" }, - "12L": { - "Mag Hdg": "122", - "Length": "3800", - "ILS": "110.70" - }, - "30R": { - "Mag Hdg": "302", - "Length": "3800", - "ILS": "109.10" - }, - "12R": { - "Mag Hdg": "122", - "Length": "4600", - "ILS": "" - }, - "30L": { - "Mag Hdg": "302", - "Length": "4600", - "ILS": "" + { + "headings": [ + { + "12R": { + "magHeading": "122", + "ILS": "" + }, + "30L": { + "magHeading": "302", + "ILS": "" + } + } + ], + "length": "4600" } - } + ] }, - "PahuteMesaAirstrip": { + "Pahute Mesa": { "ICAO": "", - "Elevation": "5059", + "elevation": "5059", "TACAN": "", - "Runways:": { - "18": { - "Mag Hdg": "182", - "Length": "5500", - "ILS": "" - }, - "36": { - "Mag Hdg": "002", - "Length": "5500", - "ILS": "" + "runways": [ + { + "headings": [ + { + "18": { + "magHeading": "182", + "ILS": "" + }, + "36": { + "magHeading": "002", + "ILS": "" + } + } + ], + "length": "5500" } - } + ] }, - "TonopahAirport": { + "Tonopah": { "ICAO": "KTPH", - "Elevation": "5390", + "elevation": "5390", "TACAN": "119X", - "Runways:": { - "11": { - "Mag Hdg": "113", - "Length": "5600", - "ILS": "" + "runways": [ + { + "headings": [ + { + "11": { + "magHeading": "113", + "ILS": "" + }, + "29": { + "magHeading": "293", + "ILS": "" + } + } + ], + "length": "5600" }, - "29": { - "Mag Hdg": "293", - "Length": "5600", - "ILS": "" - }, - "15": { - "Mag Hdg": "153", - "Length": "6800", - "ILS": "" - }, - "33": { - "Mag Hdg": "333", - "Length": "6800", - "ILS": "" + { + "headings": [ + { + "15": { + "magHeading": "153", + "ILS": "" + }, + "33": { + "magHeading": "333", + "ILS": "" + } + } + ], + "length": "6800" } - } + ] }, - "TonopathAFB": { + "Tonopah Test Range": { "ICAO": "KTNX", - "Elevation": "5535", + "elevation": "5535", "TACAN": "77X", - "Runways:": { - "14": { - "Mag Hdg": "145", - "Length": "11700", - "ILS": "108.30" - }, - "32": { - "Mag Hdg": "325", - "Length": "11700", - "ILS": "111.70" + "runways": [ + { + "headings": [ + { + "14": { + "magHeading": "145", + "ILS": "108.30" + }, + "32": { + "magHeading": "325", + "ILS": "111.70" + } + } + ], + "length": "11700" } - } + ] } } } \ No newline at end of file diff --git a/client/src/airfields/persiangulf.json b/client/src/airfields/persiangulf.json index 81c3be69..cf3156bd 100644 --- a/client/src/airfields/persiangulf.json +++ b/client/src/airfields/persiangulf.json @@ -1,567 +1,747 @@ { - "airfields": { - "Abu_Dhabi_International_Airport": { - "ICAO": "OMAA", - "Elevation": "92", - "TACAN": "", - "Runways:": { - "13L": { - "Mag Hdg": "127", - "Length": "13100", - "ILS": "" - }, - "13R": { - "Mag Hdg": "127", - "Length": "13200", - "ILS": "" - }, - "31L": { - "Mag Hdg": "307", - "Length": "13100", - "ILS": "" - }, - "31R": { - "Mag Hdg": "307", - "Length": "13200", - "ILS": "" - } + "airfields": { + "Abu_Dhabi_International_Airport": { + "ICAO": "OMAA", + "elevation": "92", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "13L": { + "magHeading": "127", + "ILS": "" + }, + "31R": { + "magHeading": "307", + "ILS": "" + } + } + ], + "length": "13100" + }, + { + "headings": [ + { + "13R": { + "magHeading": "127", + "ILS": "" + }, + "31L": { + "magHeading": "307", + "ILS": "" + } + } + ], + "length": "13200" } - }, - "Ai_Ain_International_Airport": { - "ICAO": "OMAL", - "Elevation": "814", - "TACAN": "", - "Runways:": { - "01": { - "Mag Hdg": "006", - "Length": "12800", - "ILS": "" - }, - "19": { - "Mag Hdg": "186", - "Length": "12800", - "ILS": "" - } + ] + }, + "Ai_Ain_International_Airport": { + "ICAO": "OMAL", + "elevation": "814", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "19": { + "magHeading": "186", + "ILS": "" + }, + "01": { + "magHeading": "006", + "ILS": "" + } + } + ], + "length": "12800" } - }, - "abu_musa_airport": { - "ICAO": "OIBA", - "Elevation": "16", - "TACAN": "", - "Runways:": { - "08": { - "Mag Hdg": "082", - "Length": "7800", - "ILS": "" - }, - "26": { - "Mag Hdg": "262", - "Length": "7800", - "ILS": "" - } - } - }, - "Dhafra_AFB": { - "ICAO": "OMAM", - "Elevation": "52", - "TACAN": "96X", - "Runways:": { - "13L": { - "Mag Hdg": "126", - "Length": "11700", - "ILS": "111.10" - }, - "31R": { - "Mag Hdg": "306", - "Length": "11700", - "ILS": "109.10" - }, - "13R": { - "Mag Hdg": "16", - "Length": "11700", - "ILS": "108.70" - }, - "31L": { - "Mag Hdg": "306", - "Length": "11700", - "ILS": "108.70" - } - } - }, - "Al_Maktoum_International_Airport": { - "ICAO": "OMDW", - "Elevation": "125", - "TACAN": "", - "Runways:": { - "12": { - "Mag Hdg": "120", - "Length": "14400", - "ILS": "111.75" - }, - "30": { - "Mag Hdg": "300", - "Length": "14400", - "ILS": "109.75" - } - } - }, - "Minhad_AFB": { - "ICAO": "OMDM", - "Elevation": "190", - "TACAN": "99X", - "Runways:": { - "09": { - "Mag Hdg": "088", - "Length": "12600", - "ILS": "110.70" - }, - "27": { - "Mag Hdg": "268", - "Length": "12600", - "ILS": "110.75" - } - } - }, - "Al_Bateen_Airport": { - "ICAO": "OMAD", - "Elevation": "12", - "TACAN": "", - "Runways:": { - "13": { - "Mag Hdg": "127", - "Length": "7000", - "ILS": "" - }, - "31": { - "Mag Hdg": "307", - "Length": "7000", - "ILS": "" - } - } - }, - "Bandar_Abbas_airfield": { - "ICAO": "OIKB", - "Elevation": "29", - "TACAN": "78X", - "Runways:": { - "03L": { - "Mag Hdg": "25", - "Length": "11000", - "ILS": "" - }, - "21R": { - "Mag Hdg": "205", - "Length": "10000", - "ILS": "" - }, - "03R": { - "Mag Hdg": "25", - "Length": "11700", - "ILS": "" - }, - "21L": { - "Mag Hdg": "205", - "Length": "11700", - "ILS": "109.90" - } - } - }, - "Bandar_Lengeh_Airport": { - "ICAO": "OIBL", - "Elevation": "82", - "TACAN": "", - "Runways:": { - "08": { - "Mag Hdg": "079", - "Length": "7900", - "ILS": "" - }, - "26": { - "Mag Hdg": "259", - "Length": "7900", - "ILS": "" - } - } - }, - "Bandar_e_Jask_airfield": { - "ICAO": "OIZJ", - "Elevation": "26", - "TACAN": "110X", - "Runways:": { - "06": { - "Mag Hdg": "059", - "Length": "7300", - "ILS": "" - }, - "24": { - "Mag Hdg": "239", - "Length": "7300", - "ILS": "" - } - } - }, - "Dubai_International_Airport": { - "ICAO": "OMDB", - "Elevation": "16", - "TACAN": "", - "Runways:": { - "12L": { - "Mag Hdg": "120", - "Length": "11400", - "ILS": "110.10" - }, - "30R": { - "Mag Hdg": "300", - "Length": "11400", - "ILS": "110.90" - }, - "12R": { - "Mag Hdg": "120", - "Length": "11400", - "ILS": "109.50" - }, - "30L": { - "Mag Hdg": "300", - "Length": "11400", - "ILS": "111.30" - } - } - }, - "Fujarirah_AFB": { - "ICAO": "OMFJ", - "Elevation": "121", - "TACAN": "", - "Runways:": { - "11": { - "Mag Hdg": "111", - "Length": "9700", - "ILS": "" - }, - "29": { - "Mag Hdg": "291", - "Length": "9700", - "ILS": "111.50" - } - } - }, - "Havadarya_AFB": { - "ICAO": "OIKP", - "Elevation": "52", - "TACAN": "47X", - "Runways:": { - "08": { - "Mag Hdg": "077", - "Length": "7200", - "ILS": "108.90" - }, - "26": { - "Mag Hdg": "257", - "Length": "7200", - "ILS": "" - } - } - }, - "Jiroft_airfield": { - "ICAO": "OIKJ", - "Elevation": "2664", - "TACAN": "", - "Runways:": { - "13": { - "Mag Hdg": "125", - "Length": "9600", - "ILS": "" - }, - "31": { - "Mag Hdg": "305", - "Length": "9600", - "ILS": "" - } - } - }, - "Kerman_AFB": { - "ICAO": "OIKK", - "Elevation": "5745", - "TACAN": "97X", - "Runways:": { - "16": { - "Mag Hdg": "155", - "Length": "12400", - "ILS": "" - }, - "34": { - "Mag Hdg": "335", - "Length": "12400", - "ILS": "" - } - } - }, - "Khasab_AFB": { - "ICAO": "OOKB", - "Elevation": "102", - "TACAN": "", - "Runways:": { - "01": { - "Mag Hdg": "012", - "Length": "8000", - "ILS": "" - }, - "19": { - "Mag Hdg": "192", - "Length": "8000", - "ILS": "110.30" - } - } - }, - "Kish_International_Airport": { - "ICAO": "OIBK", - "Elevation": "115", - "TACAN": "112X", - "Runways:": { - "10": { - "Mag Hdg": "094", - "Length": "11700", - "ILS": "" - }, - "28": { - "Mag Hdg": "274", - "Length": "11700", - "ILS": "" - }, - "09R": { - "Mag Hdg": "094", - "Length": "11700", - "ILS": "" - }, - "27L": { - "Mag Hdg": "274", - "Length": "11700", - "ILS": "" - } - } - }, - "Lar_airbase": { - "ICAO": "OISL", - "Elevation": "2635", - "TACAN": "", - "Runways:": { - "09": { - "Mag Hdg": "088", - "Length": "10100", - "ILS": "" - }, - "27": { - "Mag Hdg": "268", - "Length": "10100", - "ILS": "" - } - } - }, - "Lavan_Island_Airport": { - "ICAO": "OIBV", - "Elevation": "75", - "TACAN": "", - "Runways:": { - "11": { - "Mag Hdg": "110", - "Length": "8600", - "ILS": "" - }, - "29": { - "Mag Hdg": "290", - "Length": "8600", - "ILS": "" - } - } - }, - "Liwa_Airbase": { - "ICAO": "OMLW", - "Elevation": "400", - "TACAN": "121X", - "Runways:": { - "13": { - "Mag Hdg": "130", - "Length": "11600", - "ILS": "" - }, - "31": { - "Mag Hdg": "310", - "Length": "11600", - "ILS": "" - } - } - }, - "Qeshm_Airport": { - "ICAO": "OIKQ", - "Elevation": "26", - "TACAN": "", - "Runways:": { - "05": { - "Mag Hdg": "047", - "Length": "13600", - "ILS": "" - }, - "23": { - "Mag Hdg": "227", - "Length": "13600", - "ILS": "" - } - } - }, - "Ras_Ai_Khaimah_International_Airport": { - "ICAO": "OMRK", - "Elevation": "330", - "TACAN": "", - "Runways:": { - "17": { - "Mag Hdg": "163", - "Length": "12000", - "ILS": "" - }, - "35": { - "Mag Hdg": "343", - "Length": "12000", - "ILS": "" - } - } - }, - "Sas_Ai_Nakheel_Airport": { - "ICAO": "OMNK", - "Elevation": "10", - "TACAN": "", - "Runways:": { - "16": { - "Mag Hdg": "160", - "Length": "6000", - "ILS": "" - }, - "34": { - "Mag Hdg": "340", - "Length": "6000", - "ILS": "" - } - } - }, - "Sharjah_International_Airport": { - "ICAO": "OMSJ", - "Elevation": "26", - "TACAN": "", - "Runways:": { - "12L": { - "Mag Hdg": "121", - "Length": "10500", - "ILS": "108.55" - }, - "30R": { - "Mag Hdg": "301", - "Length": "10500", - "ILS": "111.95" - }, - "12R": { - "Mag Hdg": "121", - "Length": "10500", - "ILS": "" - }, - "30L": { - "Mag Hdg": "301", - "Length": "10500", - "ILS": "" - } - } - }, - "Shiraz_AFB": { - "ICAO": "OISS", - "Elevation": "4879", - "TACAN": "94X", - "Runways:": { - "11L": { - "Mag Hdg": "113", - "Length": "14000", - "ILS": "" - }, - "29R": { - "Mag Hdg": "293", - "Length": "14000", - "ILS": "" - }, - "11R": { - "Mag Hdg": "113", - "Length": "13800", - "ILS": "" - }, - "29L": { - "Mag Hdg": "293", - "Length": "13800", - "ILS": "108.50" - } - } - }, - "Sir_Abu_Nuayr": { - "ICAO": "OMSN", - "Elevation": "26", - "TACAN": "", - "Runways:": { - "10": { - "Mag Hdg": "097", - "Length": "2300", - "ILS": "" - }, - "28": { - "Mag Hdg": "277", - "Length": "2300", - "ILS": "" - } - } - }, - "Sirri_Island_AFB": { - "ICAO": "OIBS", - "Elevation": "20", - "TACAN": "", - "Runways:": { - "12": { - "Mag Hdg": "125", - "Length": "7900", - "ILS": "" - }, - "30": { - "Mag Hdg": "305", - "Length": "7900", - "ILS": "" - } - } - }, - "Tunb_Islab_AFB": { - "ICAO": "OIGI", - "Elevation": "43", - "TACAN": "", - "Runways:": { - "03": { - "Mag Hdg": "025", - "Length": "6200", - "ILS": "" - }, - "21": { - "Mag Hdg": "205", - "Length": "6200", - "ILS": "" - } - } - }, - "Tonb_e_Kochak_Airport": { - "ICAO": "OITK", - "Elevation": "16", - "TACAN": "89X", - "Runways:": { - "08": { - "Mag Hdg": "079", - "Length": "2500", - "ILS": "" - }, - "26": { - "Mag Hdg": "259", - "Length": "2500", - "ILS": "" - } - } - } + ] + }, + "abu_musa_airport": { + "ICAO": "OIBA", + "elevation": "16", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "26": { + "magHeading": "262", + "ILS": "" + }, + "08": { + "magHeading": "082", + "ILS": "" + } + } + ], + "length": "7800" + } + ] + }, + "Dhafra_AFB": { + "ICAO": "OMAM", + "elevation": "52", + "TACAN": "96X", + "runways": [ + { + "headings": [ + { + "13L": { + "magHeading": "126", + "ILS": "111.10" + }, + "31R": { + "magHeading": "306", + "ILS": "109.10" + } + } + ], + "length": "11700" + }, + { + "headings": [ + { + "13R": { + "magHeading": "16", + "ILS": "108.70" + }, + "31L": { + "magHeading": "306", + "ILS": "108.70" + } + } + ], + "length": "11700" + } + ] + }, + "Al_Maktoum_International_Airport": { + "ICAO": "OMDW", + "elevation": "125", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "12": { + "magHeading": "120", + "ILS": "111.75" + }, + "30": { + "magHeading": "300", + "ILS": "109.75" + } + } + ], + "length": "14400" + } + ] + }, + "Minhad_AFB": { + "ICAO": "OMDM", + "elevation": "190", + "TACAN": "99X", + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "268", + "ILS": "110.75" + }, + "09": { + "magHeading": "088", + "ILS": "110.70" + } + } + ], + "length": "12600" + } + ] + }, + "Al_Bateen_Airport": { + "ICAO": "OMAD", + "elevation": "12", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "13": { + "magHeading": "127", + "ILS": "" + }, + "31": { + "magHeading": "307", + "ILS": "" + } + } + ], + "length": "7000" + } + ] + }, + "Bandar_Abbas_airfield": { + "ICAO": "OIKB", + "elevation": "29", + "TACAN": "78X", + "runways": [ + { + "headings": [ + { + "03L": { + "magHeading": "25", + "ILS": "" + }, + "21R": { + "magHeading": "205", + "ILS": "" + } + } + ], + "length": "11000" + }, + { + "headings": [ + { + "03R": { + "magHeading": "25", + "ILS": "" + }, + "21L": { + "magHeading": "205", + "ILS": "109.90" + } + } + ], + "length": "11700" + } + ] + }, + "Bandar_Lengeh_Airport": { + "ICAO": "OIBL", + "elevation": "82", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "26": { + "magHeading": "259", + "ILS": "" + }, + "08": { + "magHeading": "079", + "ILS": "" + } + } + ], + "length": "7900" + } + ] + }, + "Bandar_e_Jask_airfield": { + "ICAO": "OIZJ", + "elevation": "26", + "TACAN": "110X", + "runways": [ + { + "headings": [ + { + "24": { + "magHeading": "239", + "ILS": "" + }, + "06": { + "magHeading": "059", + "ILS": "" + } + } + ], + "length": "7300" + } + ] + }, + "Dubai_International_Airport": { + "ICAO": "OMDB", + "elevation": "16", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "12L": { + "magHeading": "120", + "ILS": "110.10" + }, + "30R": { + "magHeading": "300", + "ILS": "110.90" + } + } + ], + "length": "11400" + }, + { + "headings": [ + { + "12R": { + "magHeading": "120", + "ILS": "109.50" + }, + "30L": { + "magHeading": "300", + "ILS": "111.30" + } + } + ], + "length": "11400" + } + ] + }, + "Fujarirah_AFB": { + "ICAO": "OMFJ", + "elevation": "121", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "11": { + "magHeading": "111", + "ILS": "" + }, + "29": { + "magHeading": "291", + "ILS": "111.50" + } + } + ], + "length": "9700" + } + ] + }, + "Havadarya_AFB": { + "ICAO": "OIKP", + "elevation": "52", + "TACAN": "47X", + "runways": [ + { + "headings": [ + { + "26": { + "magHeading": "257", + "ILS": "" + }, + "08": { + "magHeading": "077", + "ILS": "108.90" + } + } + ], + "length": "7200" + } + ] + }, + "Jiroft_airfield": { + "ICAO": "OIKJ", + "elevation": "2664", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "13": { + "magHeading": "125", + "ILS": "" + }, + "31": { + "magHeading": "305", + "ILS": "" + } + } + ], + "length": "9600" + } + ] + }, + "Kerman_AFB": { + "ICAO": "OIKK", + "elevation": "5745", + "TACAN": "97X", + "runways": [ + { + "headings": [ + { + "16": { + "magHeading": "155", + "ILS": "" + }, + "34": { + "magHeading": "335", + "ILS": "" + } + } + ], + "length": "12400" + } + ] + }, + "Khasab_AFB": { + "ICAO": "OOKB", + "elevation": "102", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "19": { + "magHeading": "192", + "ILS": "110.30" + }, + "01": { + "magHeading": "012", + "ILS": "" + } + } + ], + "length": "8000" + } + ] + }, + "Kish_International_Airport": { + "ICAO": "OIBK", + "elevation": "115", + "TACAN": "112X", + "runways": [ + { + "headings": [ + { + "10": { + "magHeading": "094", + "ILS": "" + }, + "28": { + "magHeading": "274", + "ILS": "" + } + } + ], + "length": "11700" + }, + { + "headings": [ + { + "09R": { + "magHeading": "094", + "ILS": "" + }, + "27L": { + "magHeading": "274", + "ILS": "" + } + } + ], + "length": "11700" + } + ] + }, + "Lar_airbase": { + "ICAO": "OISL", + "elevation": "2635", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "268", + "ILS": "" + }, + "09": { + "magHeading": "088", + "ILS": "" + } + } + ], + "length": "10100" + } + ] + }, + "Lavan_Island_Airport": { + "ICAO": "OIBV", + "elevation": "75", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "11": { + "magHeading": "110", + "ILS": "" + }, + "29": { + "magHeading": "290", + "ILS": "" + } + } + ], + "length": "8600" + } + ] + }, + "Liwa_Airbase": { + "ICAO": "OMLW", + "elevation": "400", + "TACAN": "121X", + "runways": [ + { + "headings": [ + { + "13": { + "magHeading": "130", + "ILS": "" + }, + "31": { + "magHeading": "310", + "ILS": "" + } + } + ], + "length": "11600" + } + ] + }, + "Qeshm_Airport": { + "ICAO": "OIKQ", + "elevation": "26", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "23": { + "magHeading": "227", + "ILS": "" + }, + "05": { + "magHeading": "047", + "ILS": "" + } + } + ], + "length": "13600" + } + ] + }, + "Ras_Ai_Khaimah_International_Airport": { + "ICAO": "OMRK", + "elevation": "330", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "17": { + "magHeading": "163", + "ILS": "" + }, + "35": { + "magHeading": "343", + "ILS": "" + } + } + ], + "length": "12000" + } + ] + }, + "Sas_Ai_Nakheel_Airport": { + "ICAO": "OMNK", + "elevation": "10", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "16": { + "magHeading": "160", + "ILS": "" + }, + "34": { + "magHeading": "340", + "ILS": "" + } + } + ], + "length": "6000" + } + ] + }, + "Sharjah_International_Airport": { + "ICAO": "OMSJ", + "elevation": "26", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "12L": { + "magHeading": "121", + "ILS": "108.55" + }, + "30R": { + "magHeading": "301", + "ILS": "111.95" + } + } + ], + "length": "10500" + }, + { + "headings": [ + { + "12R": { + "magHeading": "121", + "ILS": "" + }, + "30L": { + "magHeading": "301", + "ILS": "" + } + } + ], + "length": "10500" + } + ] + }, + "Shiraz_AFB": { + "ICAO": "OISS", + "elevation": "4879", + "TACAN": "94X", + "runways": [ + { + "headings": [ + { + "11L": { + "magHeading": "113", + "ILS": "" + }, + "29R": { + "magHeading": "293", + "ILS": "" + } + } + ], + "length": "14000" + }, + { + "headings": [ + { + "11R": { + "magHeading": "113", + "ILS": "" + }, + "29L": { + "magHeading": "293", + "ILS": "108.50" + } + } + ], + "length": "13800" + } + ] + }, + "Sir_Abu_Nuayr": { + "ICAO": "OMSN", + "elevation": "26", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "10": { + "magHeading": "097", + "ILS": "" + }, + "28": { + "magHeading": "277", + "ILS": "" + } + } + ], + "length": "2300" + } + ] + }, + "Sirri_Island_AFB": { + "ICAO": "OIBS", + "elevation": "20", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "12": { + "magHeading": "125", + "ILS": "" + }, + "30": { + "magHeading": "305", + "ILS": "" + } + } + ], + "length": "7900" + } + ] + }, + "Tunb_Islab_AFB": { + "ICAO": "OIGI", + "elevation": "43", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "21": { + "magHeading": "205", + "ILS": "" + }, + "03": { + "magHeading": "025", + "ILS": "" + } + } + ], + "length": "6200" + } + ] + }, + "Tonb_e_Kochak_Airport": { + "ICAO": "OITK", + "elevation": "16", + "TACAN": "89X", + "runways": [ + { + "headings": [ + { + "26": { + "magHeading": "259", + "ILS": "" + }, + "08": { + "magHeading": "079", + "ILS": "" + } + } + ], + "length": "2500" + } + ] } -} + } +} \ No newline at end of file diff --git a/client/src/airfields/syria.json b/client/src/airfields/syria.json index b48949b7..4d670cf7 100644 --- a/client/src/airfields/syria.json +++ b/client/src/airfields/syria.json @@ -1,995 +1,1366 @@ { "airfields": { - "Abu_al-Duhur": { + "Abu al-Duhur": { "ICAO": "OS57", - "Elevation": "820", + "elevation": "820", "TACAN": "", - "Runways:": { - "09": { - "Mag Hdg": "088", - "Length": "9200", - "ILS": "" - }, - "27": { - "Mag Hdg": "268", - "Length": "9200", - "ILS": "" + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "268", + "ILS": "" + }, + "09": { + "magHeading": "088", + "ILS": "" + } + } + ], + "length": "9200" } - } + ] }, - "Adana": { + "Adana Sakirpasa": { "ICAO": "LTAF", - "Elevation": "56", + "elevation": "56", "TACAN": "", - "Runways": { - "05": { - "Mag Hdg": "050", - "Length": "8800", - "ILS": "108.70" - }, - "23": { - "Mag Hdg": "230", - "Length": "8800", - "ILS": "" + "runways": [ + { + "headings": [ + { + "23": { + "magHeading": "230", + "ILS": "" + }, + "05": { + "magHeading": "050", + "ILS": "108.70" + } + } + ], + "length": "8800" } - } + ] }, "Akrotiri": { "ICAO": "LCRA", - "Elevation": "69", + "elevation": "69", "TACAN": "107X", - "Runways": { - "10": { - "Mag Hdg": "106", - "Length": "8800", - "ILS": "" - }, - "28": { - "Mag Hdg": "286", - "Length": "8800", - "ILS": "109.70" + "runways": [ + { + "headings": [ + { + "10": { + "magHeading": "106", + "ILS": "" + }, + "28": { + "magHeading": "286", + "ILS": "109.70" + } + } + ], + "length": "8800" } - } + ] }, - "Al_Qusayr": { + "Al Qusayr": { "ICAO": "OS70", - "Elevation": "1729", + "elevation": "1729", "TACAN": "", - "Runways": { - "10": { - "Mag Hdg": "096", - "Length": "9500", - "ILS": "" - }, - "28": { - "Mag Hdg": "276", - "Length": "9500", - "ILS": "" + "runways": [ + { + "headings": [ + { + "10": { + "magHeading": "096", + "ILS": "" + }, + "28": { + "magHeading": "276", + "ILS": "" + } + } + ], + "length": "9500" } - } + ] }, - "Dumayr": { + "Al-Dumayr": { "ICAO": "OS61", - "Elevation": "2067", + "elevation": "2067", "TACAN": "", - "Runways": { - "06": { - "Mag Hdg": "060", - "Length": "9500", - "ILS": "" - }, - "24": { - "Mag Hdg": "240", - "Length": "9500", - "ILS": "" + "runways": [ + { + "headings": [ + { + "24": { + "magHeading": "240", + "ILS": "" + }, + "06": { + "magHeading": "060", + "ILS": "" + } + } + ], + "length": "9500" } - } + ] }, "Aleppo": { "ICAO": "OSAP", - "Elevation": "1254", + "elevation": "1254", "TACAN": "", - "Runways": { - "09": { - "Mag Hdg": "092", - "Length": "9200", - "ILS": "" - }, - "27": { - "Mag Hdg": "272", - "Length": "9200", - "ILS": "" + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "272", + "ILS": "" + }, + "09": { + "magHeading": "092", + "ILS": "" + } + } + ], + "length": "9200" } - } + ] }, - "An_Nasiriyah": { + "An Nasiriyah": { "ICAO": "OSAP", - "Elevation": "1254", + "elevation": "1254", "TACAN": "", - "Runways": { - "09": { - "Mag Hdg": "092", - "Length": "9200", - "ILS": "" - }, - "27": { - "Mag Hdg": "272", - "Length": "9200", - "ILS": "" + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "272", + "ILS": "" + }, + "09": { + "magHeading": "092", + "ILS": "" + } + } + ], + "length": "9200" } - } + ] }, - "At_Tanf": { + "At Tanf": { "ICAO": "", - "Elevation": "2329", + "elevation": "2329", "TACAN": "", - "Runways": "" + "runways": [] }, - "Bassel_Al-Assad": { + "Bassel Al-Assad": { "ICAO": "OSLK", - "Elevation": "92", + "elevation": "92", "TACAN": "", - "Runways": { - "17L": { - "Mag Hdg": "173", - "Length": "7900", - "ILS": "" + "runways": [ + { + "headings": [ + { + "17L": { + "magHeading": "173", + "ILS": "" + }, + "35R": { + "magHeading": "353", + "ILS": "" + } + } + ], + "length": "7900" }, - "35R": { - "Mag Hdg": "353", - "Length": "7900", - "ILS": "" - }, - "17R": { - "Mag Hdg": "173", - "Length": "8900", - "ILS": "109.10" - }, - "35L": { - "Mag Hdg": "353", - "Length": "8900", - "ILS": "" + { + "headings": [ + { + "17R": { + "magHeading": "173", + "ILS": "109.10" + }, + "35L": { + "magHeading": "353", + "ILS": "" + } + } + ], + "length": "8900" } - } + ] }, - "Beirut": { + "Beirut-Rafic Hariri": { "ICAO": "OLBA", - "Elevation": "39", + "elevation": "39", "TACAN": "", - "Runways": { - "03": { - "Mag Hdg": "030", - "Length": "7000", - "ILS": "110.70" + "runways": [ + { + "headings": [ + { + "16": { + "magHeading": "164", + "ILS": "110.10" + }, + "34": { + "magHeading": "344", + "ILS": "" + } + } + ], + "length": "10300" }, - "21": { - "Mag Hdg": "210", - "Length": "7000", - "ILS": "" + { + "headings": [ + { + "17": { + "magHeading": "174", + "ILS": "109.50" + }, + "35": { + "magHeading": "354", + "ILS": "" + } + } + ], + "length": "7600" }, - "16": { - "Mag Hdg": "164", - "Length": "10300", - "ILS": "110.10" - }, - "34": { - "Mag Hdg": "344", - "Length": "10300", - "ILS": "" - }, - "17": { - "Mag Hdg": "174", - "Length": "7600", - "ILS": "109.50" - }, - "35": { - "Mag Hdg": "354", - "Length": "7600", - "ILS": "" + { + "headings": [ + { + "21": { + "magHeading": "210", + "ILS": "" + }, + "03": { + "magHeading": "030", + "ILS": "110.70" + } + } + ], + "length": "7000" } - } + ] }, "Damascus": { "ICAO": "OSDI", - "Elevation": "2008", + "elevation": "2008", "TACAN": "", - "Runways": { - "05L": { - "Mag Hdg": "045", - "Length": "11600", - "ILS": "" + "runways": [ + { + "headings": [ + { + "05L": { + "magHeading": "045", + "ILS": "" + }, + "23R": { + "magHeading": "225", + "ILS": "109.90" + } + } + ], + "length": "11600" }, - "23R": { - "Mag Hdg": "225", - "Length": "11600", - "ILS": "109.90" - }, - "05R": { - "Mag Hdg": "045", - "Length": "11600", - "ILS": "111.10" - }, - "23L": { - "Mag Hdg": "225", - "Length": "11600", - "ILS": "" + { + "headings": [ + { + "05R": { + "magHeading": "045", + "ILS": "111.10" + }, + "23L": { + "magHeading": "225", + "ILS": "" + } + } + ], + "length": "11600" } - } + ] }, - "Deir_ez_Zor": { + "Deir ez-Zor": { "ICAO": "OSDZ", - "Elevation": "713", + "elevation": "713", "TACAN": "", - "Runways": { - "10": { - "Mag Hdg": "104", - "Length": "9500", - "ILS": "" - }, - "28": { - "Mag Hdg": "284", - "Length": "9500", - "ILS": "" + "runways": [ + { + "headings": [ + { + "10": { + "magHeading": "104", + "ILS": "" + }, + "28": { + "magHeading": "284", + "ILS": "" + } + } + ], + "length": "9500" } - } + ] }, "Ercan": { "ICAO": "LCEN", - "Elevation": "312", + "elevation": "312", "TACAN": "", - "Runways": { - "11": { - "Mag Hdg": "110", - "Length": "8700", - "ILS": "" - }, - "29": { - "Mag Hdg": "290", - "Length": "8700", - "ILS": "108.30" + "runways": [ + { + "headings": [ + { + "11": { + "magHeading": "110", + "ILS": "" + }, + "29": { + "magHeading": "290", + "ILS": "108.30" + } + } + ], + "length": "8700" } - } + ] }, - "Eyn_Shemer": { + "Eyn Shemer": { "ICAO": "LLES", - "Elevation": "110", + "elevation": "110", "TACAN": "", - "Runways": { - "09": { - "Mag Hdg": "095", - "Length": "4000", - "ILS": "" - }, - "27": { - "Mag Hdg": "2750", - "Length": "4000", - "ILS": "" + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "2750", + "ILS": "" + }, + "09": { + "magHeading": "095", + "ILS": "" + } + } + ], + "length": "4000" } - } + ] }, "Gaziantep": { "ICAO": "LTAJ", - "Elevation": "2290", + "elevation": "2290", "TACAN": "", - "Runways": { - "10": { - "Mag Hdg": "100", - "Length": "9100", - "ILS": "" - }, - "28": { - "Mag Hdg": "280", - "Length": "9100", - "ILS": "109.10" + "runways": [ + { + "headings": [ + { + "10": { + "magHeading": "100", + "ILS": "" + }, + "28": { + "magHeading": "280", + "ILS": "109.10" + } + } + ], + "length": "9100" } - } + ] }, "Gazipasa": { "ICAO": "LTFG", - "Elevation": "130", + "elevation": "130", "TACAN": "", - "Runways": { - "08": { - "Mag Hdg": "080", - "Length": "7500", - "ILS": "108.50" - }, - "26": { - "Mag Hdg": "260", - "Length": "7500", - "ILS": "" + "runways": [ + { + "headings": [ + { + "26": { + "magHeading": "260", + "ILS": "" + }, + "08": { + "magHeading": "080", + "ILS": "108.50" + } + } + ], + "length": "7500" } - } + ] }, "Gecitkale": { "ICAO": "LCGK", - "Elevation": "148", + "elevation": "148", "TACAN": "", - "Runways": { - "09": { - "Mag Hdg": "088", - "Length": "9100", - "ILS": "108.50" - }, - "27": { - "Mag Hdg": "268", - "Length": "9100", - "ILS": "" + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "268", + "ILS": "" + }, + "09": { + "magHeading": "088", + "ILS": "108.50" + } + } + ], + "length": "9100" } - } + ] }, "H3": { "ICAO": "", - "Elevation": "2583", + "elevation": "2583", "TACAN": "", - "Runways": { - "06": { - "Mag Hdg": "059", - "Length": "9800", - "ILS": "" + "runways": [ + { + "headings": [ + { + "11": { + "magHeading": "107", + "ILS": "" + }, + "29": { + "magHeading": "287", + "ILS": "" + } + } + ], + "length": "9500" }, - "24": { - "Mag Hdg": "239", - "Length": "9800", - "ILS": "" - }, - "11": { - "Mag Hdg": "107", - "Length": "9500", - "ILS": "" - }, - "29": { - "Mag Hdg": "287", - "Length": "9500", - "ILS": "" + { + "headings": [ + { + "24": { + "magHeading": "239", + "ILS": "" + }, + "06": { + "magHeading": "059", + "ILS": "" + } + } + ], + "length": "9800" } - } + ] }, - "H3_Northwest": { + "H3 Northwest": { "ICAO": "", - "Elevation": "2582", + "elevation": "2582", "TACAN": "", - "Runways": { - "12": { - "Mag Hdg": "117", - "Length": "8000", - "ILS": "" - }, - "30": { - "Mag Hdg": "297", - "Length": "8000", - "ILS": "" + "runways": [ + { + "headings": [ + { + "12": { + "magHeading": "117", + "ILS": "" + }, + "30": { + "magHeading": "297", + "ILS": "" + } + } + ], + "length": "8000" } - } + ] }, - "H3_Southwest": { + "H3 Southwest": { "ICAO": "", - "Elevation": "2671", + "elevation": "2671", "TACAN": "", - "Runways": { - "12": { - "Mag Hdg": "116", - "Length": "8000", - "ILS": "" - }, - "30": { - "Mag Hdg": "296", - "Length": "8000", - "ILS": "" + "runways": [ + { + "headings": [ + { + "12": { + "magHeading": "116", + "ILS": "" + }, + "30": { + "magHeading": "296", + "ILS": "" + } + } + ], + "length": "8000" } - } + ] }, "H4": { "ICAO": "OJHR", - "Elevation": "2257", + "elevation": "2257", "TACAN": "", - "Runways": { - "10": { - "Mag Hdg": "098", - "Length": "8000", - "ILS": "" - }, - "28": { - "Mag Hdg": "278", - "Length": "8000", - "ILS": "" + "runways": [ + { + "headings": [ + { + "10": { + "magHeading": "098", + "ILS": "" + }, + "28": { + "magHeading": "278", + "ILS": "" + } + } + ], + "length": "8000" } - } + ] }, "Haifa": { "ICAO": "LLHA", - "Elevation": "20", + "elevation": "20", "TACAN": "", - "Runways": { - "16": { - "Mag Hdg": "157", - "Length": "3300", - "ILS": "" - }, - "34": { - "Mag Hdg": "337", - "Length": "3300", - "ILS": "" + "runways": [ + { + "headings": [ + { + "16": { + "magHeading": "157", + "ILS": "" + }, + "34": { + "magHeading": "337", + "ILS": "" + } + } + ], + "length": "3300" } - } + ] }, "Hama": { "ICAO": "OS58", - "Elevation": "984", + "elevation": "984", "TACAN": "", - "Runways": { - "09": { - "Mag Hdg": "095", - "Length": "8600", - "ILS": "" - }, - "27": { - "Mag Hdg": "275", - "Length": "8600", - "ILS": "" + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "275", + "ILS": "" + }, + "09": { + "magHeading": "095", + "ILS": "" + } + } + ], + "length": "8600" } - } + ] }, "Hatay": { "ICAO": "LTDA", - "Elevation": "253", + "elevation": "253", "TACAN": "", - "Runways": { - "04": { - "Mag Hdg": "039", - "Length": "9600", - "ILS": "108.90" - }, - "22": { - "Mag Hdg": "219", - "Length": "9600", - "ILS": "" + "runways": [ + { + "headings": [ + { + "22": { + "magHeading": "219", + "ILS": "" + }, + "04": { + "magHeading": "039", + "ILS": "108.90" + } + } + ], + "length": "9600" } - } + ] }, "Incirlik": { "ICAO": "LTAG", - "Elevation": "230", + "elevation": "230", "TACAN": "21X", - "Runways": { - "05": { - "Mag Hdg": "049", - "Length": "9600", - "ILS": "109.30" - }, - "23": { - "Mag Hdg": "229", - "Length": "9500", - "ILS": "111.70" + "runways": [ + { + "headings": [ + { + "23": { + "magHeading": "229", + "ILS": "111.70" + }, + "05": { + "magHeading": "049", + "ILS": "109.30" + } + } + ], + "length": "9500" } - } + ] }, "Jirah": { "ICAO": "OS62", - "Elevation": "1173", + "elevation": "1173", "TACAN": "", - "Runways": { - "10": { - "Mag Hdg": "095", - "Length": "9600", - "ILS": "" - }, - "28": { - "Mag Hdg": "275", - "Length": "9600", - "ILS": "" + "runways": [ + { + "headings": [ + { + "10": { + "magHeading": "095", + "ILS": "" + }, + "28": { + "magHeading": "275", + "ILS": "" + } + } + ], + "length": "9600" } - } + ] }, "Khalkhalah": { "ICAO": "OS69", - "Elevation": "2418", + "elevation": "2418", "TACAN": "", - "Runways": { - "07": { - "Mag Hdg": "071", - "Length": "9500", - "ILS": "" + "runways": [ + { + "headings": [ + { + "15": { + "magHeading": "146", + "ILS": "" + }, + "33": { + "magHeading": "326", + "ILS": "" + } + } + ], + "length": "8300" }, - "25": { - "Mag Hdg": "251", - "Length": "9500", - "ILS": "" - }, - "15": { - "Mag Hdg": "146", - "Length": "8300", - "ILS": "" - }, - "33": { - "Mag Hdg": "326", - "Length": "8300", - "ILS": "" + { + "headings": [ + { + "25": { + "magHeading": "251", + "ILS": "" + }, + "07": { + "magHeading": "071", + "ILS": "" + } + } + ], + "length": "9500" } - } + ] }, - "Kharab_Ishk": { + "Kharab Ishk": { "ICAO": "", - "Elevation": "1416", + "elevation": "1416", "TACAN": "", - "Runways": "" + "runways": [] }, - "King_Hussein": { + "King Hussein Air College": { "ICAO": "OJMF", - "Elevation": "2205", + "elevation": "2205", "TACAN": "", - "Runways": { - "13": { - "Mag Hdg": "127", - "Length": "9500", - "ILS": "" - }, - "31": { - "Mag Hdg": "307", - "Length": "9500", - "ILS": "" + "runways": [ + { + "headings": [ + { + "13": { + "magHeading": "127", + "ILS": "" + }, + "31": { + "magHeading": "307", + "ILS": "" + } + } + ], + "length": "9500" } - } + ] }, "Kingsfield": { "ICAO": "LCRE", - "Elevation": "276", + "elevation": "276", "TACAN": "", - "Runways": { - "06": { - "Mag Hdg": "058", - "Length": "3300", - "ILS": "" - }, - "24": { - "Mag Hdg": "238", - "Length": "3300", - "ILS": "" + "runways": [ + { + "headings": [ + { + "24": { + "magHeading": "238", + "ILS": "" + }, + "06": { + "magHeading": "058", + "ILS": "" + } + } + ], + "length": "3300" } - } + ] }, - "Kiryat_Shmona": { + "Kiryat Shmona": { "ICAO": "LLKS", - "Elevation": "360", + "elevation": "360", "TACAN": "", - "Runways": { - "03": { - "Mag Hdg": "033", - "Length": "3500", - "ILS": "" - }, - "21": { - "Mag Hdg": "213", - "Length": "3500", - "ILS": "" + "runways": [ + { + "headings": [ + { + "21": { + "magHeading": "213", + "ILS": "" + }, + "03": { + "magHeading": "033", + "ILS": "" + } + } + ], + "length": "3500" } - } + ] }, "Kuweires": { "ICAO": "OS66", - "Elevation": "1201", + "elevation": "1201", "TACAN": "", - "Runways": { - "10": { - "Mag Hdg": "095", - "Length": "7700", - "ILS": "" - }, - "28": { - "Mag Hdg": "275", - "Length": "7700", - "ILS": "" + "runways": [ + { + "headings": [ + { + "10": { + "magHeading": "095", + "ILS": "" + }, + "28": { + "magHeading": "275", + "ILS": "" + } + } + ], + "length": "7700" } - } + ] }, "Lakatamia": { "ICAO": "", - "Elevation": "758", + "elevation": "758", "TACAN": "", - "Runways": "" + "runways": [] }, "Larnaca": { "ICAO": "LCRE", - "Elevation": "16", + "elevation": "16", "TACAN": "", - "Runways": { - "04": { - "Mag Hdg": "043", - "Length": "8800", - "ILS": "" - }, - "22": { - "Mag Hdg": "223", - "Length": "8800", - "ILS": "110.30" + "runways": [ + { + "headings": [ + { + "22": { + "magHeading": "223", + "ILS": "110.30" + }, + "04": { + "magHeading": "043", + "ILS": "" + } + } + ], + "length": "8800" } - } + ] }, - "Marj_Al_Sultan": { + "London": { "ICAO": "", - "Elevation": "2008", + "elevation": "", "TACAN": "", - "Runways": "" + "runways": [] }, - "Marj_Ruhayyil": { - "ICAO": "OS63", - "Elevation": "2161", + "Marj as Sultan North": { + "ICAO": "", + "elevation": "2008", "TACAN": "", - "Runways": { - "06L": { - "Mag Hdg": "059", - "Length": "9400", - "ILS": "" + "runways": [] + }, + "Marj as Sultan South": { + "ICAO": "", + "elevation": "2008", + "TACAN": "", + "runways": [] + }, + "Marj Ruhayyil": { + "ICAO": "OS63", + "elevation": "2161", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "06L": { + "magHeading": "059", + "ILS": "" + }, + "24R": { + "magHeading": "239", + "ILS": "" + } + } + ], + "length": "9400" }, - "24R": { - "Mag Hdg": "239", - "Length": "9400", - "ILS": "" - }, - "06R": { - "Mag Hdg": "059", - "Length": "8400", - "ILS": "" - }, - "24L": { - "Mag Hdg": "239", - "Length": "8400", - "ILS": "" + { + "headings": [ + { + "06R": { + "magHeading": "059", + "ILS": "" + }, + "24L": { + "magHeading": "239", + "ILS": "" + } + } + ], + "length": "8400" } - } + ] }, "Megiddo": { "ICAO": "LLMG", - "Elevation": "180", + "elevation": "180", "TACAN": "", - "Runways": { - "09": { - "Mag Hdg": "088", - "Length": "6200", - "ILS": "" - }, - "27": { - "Mag Hdg": "268", - "Length": "6200", - "ILS": "" + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "268", + "ILS": "" + }, + "09": { + "magHeading": "088", + "ILS": "" + } + } + ], + "length": "6200" } - } + ] }, "Mezzeh": { "ICAO": "OS67", - "Elevation": "2387", + "elevation": "2387", "TACAN": "", - "Runways": { - "06": { - "Mag Hdg": "056", - "Length": "8800", - "ILS": "" - }, - "24": { - "Mag Hdg": "236", - "Length": "8800", - "ILS": "" + "runways": [ + { + "headings": [ + { + "24": { + "magHeading": "236", + "ILS": "" + }, + "06": { + "magHeading": "056", + "ILS": "" + } + } + ], + "length": "8800" } - } + ] }, "Minakh": { "ICAO": "OS71", - "Elevation": "1614", + "elevation": "1614", "TACAN": "", - "Runways": { - "10": { - "Mag Hdg": "096", - "Length": "4500", - "ILS": "" - }, - "28": { - "Mag Hdg": "276", - "Length": "4500", - "ILS": "" + "runways": [ + { + "headings": [ + { + "10": { + "magHeading": "096", + "ILS": "" + }, + "28": { + "magHeading": "276", + "ILS": "" + } + } + ], + "length": "4500" } - } + ] }, "Naqoura": { "ICAO": "", - "Elevation": "381", + "elevation": "381", "TACAN": "", - "Runways": "" + "runways": [] + }, + "Nicosia": { + "ICAO": "", + "elevation": "722", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "09": { + "magHeading": "092", + "ILS": "" + }, + "27": { + "magHeading": "272", + "ILS": "" + } + } + ], + "length": "5791" + }, + { + "headings": [ + { + "14": { + "magHeading": "148", + "ILS": "" + }, + "27": { + "magHeading": "228", + "ILS": "" + } + } + ], + "length": "8385" + } + ] }, "Palmyra": { "ICAO": "OSPR", - "Elevation": "1325", + "elevation": "1325", "TACAN": "", - "Runways": { - "08": { - "Mag Hdg": "079", - "Length": "9200", - "ILS": "" - }, - "26": { - "Mag Hdg": "259", - "Length": "9200", - "ILS": "" + "runways": [ + { + "headings": [ + { + "26": { + "magHeading": "259", + "ILS": "" + }, + "08": { + "magHeading": "079", + "ILS": "" + } + } + ], + "length": "9200" } - } + ] }, "Paphos": { "ICAO": "LCPH", - "Elevation": "40", + "elevation": "40", "TACAN": "79X", - "Runways": { - "11": { - "Mag Hdg": "109", - "Length": "8600", - "ILS": "" - }, - "29": { - "Mag Hdg": "289", - "Length": "8600", - "ILS": "108.90" + "runways": [ + { + "headings": [ + { + "11": { + "magHeading": "109", + "ILS": "" + }, + "29": { + "magHeading": "289", + "ILS": "108.90" + } + } + ], + "length": "8600" } - } + ] }, - "Qabr_al_Sitt": { + "Pinarbashi": { "ICAO": "", - "Elevation": "2135", + "elevation": "771", "TACAN": "", - "Runways": "" - }, - "Ramat_David": { - "ICAO": "LLRD", - "Elevation": "146", - "TACAN": "84X", - "Runways": { - "09": { - "Mag Hdg": "084", - "Length": "7600", - "ILS": "" - }, - "27": { - "Mag Hdg": "264", - "Length": "7600", - "ILS": "" - }, - "11": { - "Mag Hdg": "105", - "Length": "7700", - "ILS": "" - }, - "29": { - "Mag Hdg": "285", - "Length": "7700", - "ILS": "" - }, - "15": { - "Mag Hdg": "141", - "Length": "7700", - "ILS": "" - }, - "33": { - "Mag Hdg": "321", - "Length": "7700", - "ILS": "111.10" + "runways": [ + { + "headings": [ + { + "16": { + "magHeading": "167", + "ILS": "" + }, + "34": { + "magHeading": "347", + "ILS": "" + } + } + ], + "length": "3577" } - } + ] + }, + "Qabr as Sitt": { + "ICAO": "", + "elevation": "2135", + "TACAN": "", + "runways": [] + }, + "Ramat David": { + "ICAO": "LLRD", + "elevation": "146", + "TACAN": "84X", + "runways": [ + { + "headings": [ + { + "11": { + "magHeading": "105", + "ILS": "" + }, + "29": { + "magHeading": "285", + "ILS": "" + } + } + ], + "length": "7700" + }, + { + "headings": [ + { + "15": { + "magHeading": "141", + "ILS": "" + }, + "33": { + "magHeading": "321", + "ILS": "111.10" + } + } + ], + "length": "7700" + }, + { + "headings": [ + { + "27": { + "magHeading": "264", + "ILS": "" + }, + "09": { + "magHeading": "084", + "ILS": "" + } + } + ], + "length": "7600" + } + ] }, "Rayak": { "ICAO": "OLRA", - "Elevation": "3035", + "elevation": "3035", "TACAN": "", - "Runways": { - "04": { - "Mag Hdg": "042", - "Length": "9400", - "ILS": "" - }, - "22": { - "Mag Hdg": "222", - "Length": "9400", - "ILS": "" + "runways": [ + { + "headings": [ + { + "22": { + "magHeading": "222", + "ILS": "" + }, + "04": { + "magHeading": "042", + "ILS": "" + } + } + ], + "length": "9400" } - } + ] }, - "Rene_Mouawad": { + "Rene Mouawad": { "ICAO": "OLKA", - "Elevation": "23", + "elevation": "23", "TACAN": "", - "Runways": { - "06": { - "Mag Hdg": "058", - "Length": "9000", - "ILS": "" - }, - "24": { - "Mag Hdg": "238", - "Length": "9000", - "ILS": "" + "runways": [ + { + "headings": [ + { + "24": { + "magHeading": "238", + "ILS": "" + }, + "06": { + "magHeading": "058", + "ILS": "" + } + } + ], + "length": "9000" } - } + ] }, - "Rosh_Pina": { + "Rosh Pina": { "ICAO": "LLIB", - "Elevation": "914", + "elevation": "914", "TACAN": "", - "Runways": { - "05": { - "Mag Hdg": "049", - "Length": "3200", - "ILS": "" + "runways": [ + { + "headings": [ + { + "15": { + "magHeading": "147", + "ILS": "" + }, + "33": { + "magHeading": "327", + "ILS": "" + } + } + ], + "length": "2900" }, - "23": { - "Mag Hdg": "229", - "Length": "3200", - "ILS": "" - }, - "15": { - "Mag Hdg": "147", - "Length": "2900", - "ILS": "" - }, - "33": { - "Mag Hdg": "327", - "Length": "2900", - "ILS": "" + { + "headings": [ + { + "23": { + "magHeading": "229", + "ILS": "" + }, + "05": { + "magHeading": "049", + "ILS": "" + } + } + ], + "length": "3200" } - } + ] }, "Ruwayshid": { "ICAO": "", - "Elevation": "2980", + "elevation": "2980", "TACAN": "", - "Runways": { - "09": { - "Mag Hdg": "091", - "Length": "7000", - "ILS": "" - }, - "27": { - "Mag Hdg": "271", - "Length": "7000", - "ILS": "" + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "271", + "ILS": "" + }, + "09": { + "magHeading": "091", + "ILS": "" + } + } + ], + "length": "7000" } - } + ] }, "Sanliurfa": { "ICAO": "LTCS", - "Elevation": "2703", + "elevation": "2703", "TACAN": "", - "Runways": { - "04": { - "Mag Hdg": "036", - "Length": "12900", - "ILS": "" - }, - "22": { - "Mag Hdg": "216", - "Length": "12900", - "ILS": "" + "runways": [ + { + "headings": [ + { + "22": { + "magHeading": "216", + "ILS": "" + }, + "04": { + "magHeading": "036", + "ILS": "" + } + } + ], + "length": "12900" } - } + ] }, "Sayqal": { "ICAO": "OS68", - "Elevation": "2274", + "elevation": "2274", "TACAN": "", - "Runways": { - "05": { - "Mag Hdg": "055", - "Length": "7600", - "ILS": "" + "runways": [ + { + "headings": [ + { + "23": { + "magHeading": "235", + "ILS": "" + }, + "05": { + "magHeading": "055", + "ILS": "" + } + } + ], + "length": "7600" }, - "23": { - "Mag Hdg": "235", - "Length": "7600", - "ILS": "" - }, - "08": { - "Mag Hdg": "085", - "Length": "9500", - "ILS": "" - }, - "26": { - "Mag Hdg": "265", - "Length": "9500", - "ILS": "" + { + "headings": [ + { + "26": { + "magHeading": "265", + "ILS": "" + }, + "08": { + "magHeading": "085", + "ILS": "" + } + } + ], + "length": "9500" } - } + ] }, "Shayrat": { "ICAO": "OS65", - "Elevation": "2638", + "elevation": "2638", "TACAN": "", - "Runways": { - "11": { - "Mag Hdg": "107", - "Length": "9300", - "ILS": "" - }, - "29": { - "Mag Hdg": "287", - "Length": "9300", - "ILS": "" + "runways": [ + { + "headings": [ + { + "11": { + "magHeading": "107", + "ILS": "" + }, + "29": { + "magHeading": "287", + "ILS": "" + } + } + ], + "length": "9300" } - } + ] }, "Tabqa": { "ICAO": "OS59", - "Elevation": "1099", + "elevation": "1099", "TACAN": "", - "Runways": { - "09": { - "Mag Hdg": "088", - "Length": "9300", - "ILS": "" - }, - "27": { - "Mag Hdg": "268", - "Length": "9300", - "ILS": "" + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "268", + "ILS": "" + }, + "09": { + "magHeading": "088", + "ILS": "" + } + } + ], + "length": "9300" } - } + ] }, "Taftanaz": { "ICAO": "", - "Elevation": "", + "elevation": "", "TACAN": "", - "Runways": "" + "runways": [] }, - "Tal_Siman": { + "Tal Siman": { "ICAO": "", - "Elevation": "", + "elevation": "", "TACAN": "", - "Runways": "" + "runways": [] }, - "thalah": { + "Tha'lah": { "ICAO": "OS60", - "Elevation": "2414", + "elevation": "2414", "TACAN": "", - "Runways": { - "05": { - "Mag Hdg": "053", - "Length": "9500", - "ILS": "" - }, - "23": { - "Mag Hdg": "233", - "Length": "9500", - "ILS": "" + "runways": [ + { + "headings": [ + { + "23": { + "magHeading": "233", + "ILS": "" + }, + "05": { + "magHeading": "053", + "ILS": "" + } + } + ], + "length": "9500" } - } + ] }, "Tiyas": { "ICAO": "OS72", - "Elevation": "1798", + "elevation": "1798", "TACAN": "", - "Runways": { - "09": { - "Mag Hdg": "085", - "Length": "9500", - "ILS": "" - }, - "27": { - "Mag Hdg": "265", - "Length": "9500", - "ILS": "" + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "265", + "ILS": "" + }, + "09": { + "magHeading": "085", + "ILS": "" + } + } + ], + "length": "9500" } - } + ] }, - "Wujah_Al_Hajar": { + "Wujah Al Hajar": { "ICAO": "Z190", - "Elevation": "641", + "elevation": "641", "TACAN": "", - "Runways": { - "02": { - "Mag Hdg": "024", - "Length": "4800", - "ILS": "" - }, - "20": { - "Mag Hdg": "204", - "Length": "4800", - "ILS": "" + "runways": [ + { + "headings": [ + { + "20": { + "magHeading": "204", + "ILS": "" + }, + "02": { + "magHeading": "024", + "ILS": "" + } + } + ], + "length": "4800" } - } + ] } } -} +} \ No newline at end of file diff --git a/client/src/controls/airbasecontextmenu.ts b/client/src/controls/airbasecontextmenu.ts index beb6bd14..19a32a1c 100644 --- a/client/src/controls/airbasecontextmenu.ts +++ b/client/src/controls/airbasecontextmenu.ts @@ -1,6 +1,7 @@ import { getMap, getMissionHandler, getUnitsManager, setActiveCoalition } from ".."; import { BLUE_COMMANDER, GAME_MASTER, RED_COMMANDER } from "../constants/constants"; import { Airbase } from "../mission/airbase"; +import { dataPointMap } from "../other/utils"; import { ContextMenu } from "./contextmenu"; export class AirbaseContextMenu extends ContextMenu { @@ -27,6 +28,74 @@ export class AirbaseContextMenu extends ContextMenu { this.setCoalition(airbase.getCoalition()); this.enableLandButton(getUnitsManager().getSelectedUnitsTypes().length == 1 && ["Aircraft", "Helicopter"].includes(getUnitsManager().getSelectedUnitsTypes()[0]) && (getUnitsManager().getSelectedUnitsCoalition() === airbase.getCoalition() || airbase.getCoalition() === "neutral")) this.enableSpawnButton(getMissionHandler().getCommandModeOptions().commandMode == GAME_MASTER || this.#airbase.getCoalition() == getMissionHandler().getCommandedCoalition()); + + + dataPointMap( this.getContainer(), { + "coalition": airbase.getCoalition(), + "airbaseName": airbase.getName() + }); + + dataPointMap( this.getContainer(), this.#airbase.getChartData() ); + + const runwaysContainer = this.getContainer()?.querySelector( "#airbase-runways" ); + runwaysContainer.innerHTML = ""; + + if ( runwaysContainer instanceof HTMLElement ) { + + const runways = this.#airbase.getChartData().runways; + + if ( runways.length === 0 ) { + runwaysContainer.innerText = "No data"; + } else { + runways.forEach( runway => { + + let runwayDiv = document.createElement( "div" ); + runwayDiv.classList.add( "runway" ); + + runway.headings.forEach( headings => { + + //* + for ( const [ heading, data ] of Object.entries( headings ) ) { + + let headingDiv = document.createElement( "div" ); + headingDiv.classList.add( "heading" ); + + let abbr = document.createElement( "abbr" ); + abbr.title = `Mag heading: ${data.magHeading}`; + abbr.innerText = heading; + + headingDiv.appendChild( abbr ); + + runwayDiv.appendChild( headingDiv ); + + if ( data.ILS ) { + let ilsDiv = document.createElement( "div" ); + ilsDiv.classList.add( "ils" ); + + abbr = document.createElement( "abbr" ); + abbr.title = data.ILS; + abbr.innerText = "ILS"; + + ilsDiv.appendChild( abbr ); + headingDiv.appendChild( ilsDiv ); + } + + + } + //*/ + + }); + + runwaysContainer.appendChild( runwayDiv ); + + }); + } + + } + + this.clip(); + + } setName(airbaseName: string) { diff --git a/client/src/mission/airbase.ts b/client/src/mission/airbase.ts index 2510d0da..35fbdc98 100644 --- a/client/src/mission/airbase.ts +++ b/client/src/mission/airbase.ts @@ -8,10 +8,37 @@ export interface AirbaseOptions position: L.LatLng } + +export interface AirbaseChartData { + elevation: string, + ICAO: string, + TACAN: string, + runways: AirbaseChartRunwayData[] +} + +export interface AirbaseChartRunwayData { + "headings": AirbaseChartRunwayHeadingData[], + "length": string +} + +export interface AirbaseChartRunwayHeadingData { + [index: string]: { + "magHeading": string, + "ILS": string + } +} + export class Airbase extends CustomMarker { #name: string = ""; + #chartData: AirbaseChartData = { + elevation: "", + ICAO: "", + TACAN: "", + runways: [] + }; #coalition: string = ""; + #hasChartDataBeenSet:boolean = false; #properties: string[] = []; #parkings: string[] = []; @@ -22,6 +49,10 @@ export class Airbase extends CustomMarker this.#name = options.name; } + chartDataHasBeenSet() { + return this.#hasChartDataBeenSet; + } + createIcon() { var icon = new DivIcon({ className: 'leaflet-airbase-marker', @@ -47,6 +78,11 @@ export class Airbase extends CustomMarker ( this.getElement()?.querySelector(".airbase-icon")).dataset.coalition = this.#coalition; } + getChartData() + { + return this.#chartData; + } + getCoalition() { return this.#coalition; @@ -62,6 +98,12 @@ export class Airbase extends CustomMarker return this.#name; } + setChartData( chartData:AirbaseChartData ) + { + this.#hasChartDataBeenSet = true; + this.#chartData = chartData; + } + setProperties(properties: string[]) { this.#properties = properties; @@ -81,4 +123,4 @@ export class Airbase extends CustomMarker { return this.#parkings; } -} +} \ No newline at end of file diff --git a/client/src/mission/missionhandler.ts b/client/src/mission/missionhandler.ts index facf7682..77e32f07 100644 --- a/client/src/mission/missionhandler.ts +++ b/client/src/mission/missionhandler.ts @@ -1,6 +1,6 @@ import { LatLng } from "leaflet"; import { getInfoPopup, getMap } from ".."; -import { Airbase } from "./airbase"; +import { Airbase, AirbaseChartData } from "./airbase"; import { Bullseye } from "./bullseye"; import { BLUE_COMMANDER, GAME_MASTER, NONE, RED_COMMANDER } from "../constants/constants"; import { refreshAll, setCommandModeOptions } from "../server/server"; @@ -66,11 +66,14 @@ export class MissionHandler { updateMission(data: MissionData) { if (data.mission) { + /* Set the mission theatre */ if (data.mission.theatre != this.#theatre) { this.#theatre = data.mission.theatre; getMap().setTheatre(this.#theatre); getInfoPopup().setText("Map set to " + this.#theatre); + + this.#loadAirbaseChartData(); } /* Set the date and time data */ @@ -231,4 +234,38 @@ export class MissionHandler { #onAirbaseClick(e: any) { getMap().showAirbaseContextMenu(e.originalEvent.x, e.originalEvent.y, e.latlng, e.sourceTarget); } + + + #loadAirbaseChartData() { + + if ( !this.#theatre ) { + return; + } + + fetch( '/api/airbases/' + this.#theatre , { + method: 'GET', + headers: { + 'Accept': '*/*', + 'Content-Type': 'application/json' + } + }) + .then( response => response.json() ) + .then( data => { + + for ( const [ id, airbase ] of Object.entries( this.#airbases ) ) { + + let airbaseName = airbase.getName(); + + if ( data.hasOwnProperty( airbaseName ) ) { + airbase.setChartData( data[ airbaseName ] ); + } else { + console.error( `Airbase "${airbaseName}" not found in chart data.` ); + } + } + + }); + + + } + } \ No newline at end of file diff --git a/client/views/other/contextmenus.ejs b/client/views/other/contextmenus.ejs index 8511626b..fe63ffbb 100644 --- a/client/views/other/contextmenus.ejs +++ b/client/views/other/contextmenus.ejs @@ -211,12 +211,23 @@

-
- -
-

Parking available:

-
+
+
ICAO
+
+
Coalition
+
+
Elevation
+
ft
+
TACAN
+
+
+ +

Runways

+
+
+ +
From 06e1cbeb7ed6a5b75575030c617c0ce9dcb23f7e Mon Sep 17 00:00:00 2001 From: PeekabooSteam Date: Mon, 14 Aug 2023 23:12:14 +0100 Subject: [PATCH 2/7] Changed events to use pre-existing names --- client/src/panels/unitcontrolpanel.ts | 4 ++-- client/src/unit/unit.ts | 8 +++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/client/src/panels/unitcontrolpanel.ts b/client/src/panels/unitcontrolpanel.ts index d2e55363..7c262781 100644 --- a/client/src/panels/unitcontrolpanel.ts +++ b/client/src/panels/unitcontrolpanel.ts @@ -87,8 +87,8 @@ export class UnitControlPanel extends Panel { this.hide(); // This is for when a ctrl-click happens on the map for deselection and we need to remove the selected unit from the panel - document.addEventListener( "unitDeselected", ( ev:CustomEventInit ) => { - this.getElement().querySelector( `button[data-unit-id="${ev.detail.unit.ID}"]` )?.remove(); + document.addEventListener( "unitDeselection", ( ev:CustomEventInit ) => { + this.getElement().querySelector( `button[data-unit-id="${ev.detail.ID}"]` )?.remove(); }); } diff --git a/client/src/unit/unit.ts b/client/src/unit/unit.ts index 3a3f2cd4..f44346e3 100644 --- a/client/src/unit/unit.ts +++ b/client/src/unit/unit.ts @@ -721,15 +721,13 @@ export class Unit extends CustomMarker { // Tell everyone a unit (de-)selection has happened, usually a panel or something. const detail = { - "detail": { - "unit": this - } + "detail": this }; if ( unitIsSelected ) { - document.dispatchEvent( new CustomEvent( "unitSelected", detail ) ); + document.dispatchEvent( new CustomEvent( "unitSelection", detail ) ); } else { - document.dispatchEvent( new CustomEvent( "unitDeselected", detail ) ); + document.dispatchEvent( new CustomEvent( "unitDeselection", detail ) ); } } From f544b0afaa5cd8f8c5081ecfabdffcb9826f4118 Mon Sep 17 00:00:00 2001 From: Pax1601 Date: Tue, 15 Aug 2023 11:09:00 +0200 Subject: [PATCH 3/7] Minimal code refactoring --- client/demo.js | 18 +++++++++++++++++- client/src/panels/unitcontrolpanel.ts | 3 --- client/src/unit/unit.ts | 23 +++++------------------ client/src/unit/unitsmanager.ts | 2 -- 4 files changed, 22 insertions(+), 24 deletions(-) diff --git a/client/demo.js b/client/demo.js index 2a3360b0..d4c68aff 100644 --- a/client/demo.js +++ b/client/demo.js @@ -80,7 +80,23 @@ const DEMO_UNIT_DATA = { contacts: [], activePath: [ ], isLeader: false - } + }, + ["6"]:{ category: "Aircraft", alive: true, human: false, controlled: false, coalition: 1, country: 0, name: "FA-18C_hornet", unitName: "Bad boi 1-2", groupName: "Bad group 1", state: 1, task: "Being bad", + hasTask: false, position: { lat: 36.8, lng: -116, alt: 1000 }, speed: 200, heading: 315 * Math.PI / 180, isTanker: false, isAWACS: false, onOff: true, followRoads: false, fuel: 50, + desiredSpeed: 300, desiredSpeedType: 1, desiredAltitude: 1000, desiredAltitudeType: 1, leaderID: 0, + formationOffset: { x: 0, y: 0, z: 0 }, + targetID: 0, + targetPosition: { lat: 0, lng: 0, alt: 0 }, + ROE: 1, + reactionToThreat: 1, + emissionsCountermeasures: 1, + TACAN: { isOn: false, XY: 'Y', callsign: 'TKR', channel: 40 }, + radio: { frequency: 124000000, callsign: 1, callsignNumber: 1 }, + generalSettings: { prohibitAA: false, prohibitAfterburner: false, prohibitAG: false, prohibitAirWpn: false, prohibitJettison: false }, + ammo: [{ quantity: 2, name: "A cool missile", guidance: 0, category: 0, missileCategory: 0 } ], + contacts: [{ID: 1, detectionMethod: 16}], + activePath: [ ] + }, } const DEMO_WEAPONS_DATA = { diff --git a/client/src/panels/unitcontrolpanel.ts b/client/src/panels/unitcontrolpanel.ts index 7c262781..0f276367 100644 --- a/client/src/panels/unitcontrolpanel.ts +++ b/client/src/panels/unitcontrolpanel.ts @@ -121,18 +121,15 @@ export class UnitControlPanel extends Panel { button.classList.add("pill", "highlight-coalition") button.addEventListener("click", ( ev:MouseEventInit ) => { - // Ctrl-click deselection if ( ev.ctrlKey === true && ev.shiftKey === false && ev.altKey === false ) { getUnitsManager().deselectUnit( unit.ID ); button.remove(); - // Deselect all } else { getUnitsManager().deselectAllUnits(); getUnitsManager().selectUnit(unit.ID, true); } - }); return (button); })); diff --git a/client/src/unit/unit.ts b/client/src/unit/unit.ts index f44346e3..409a4a14 100644 --- a/client/src/unit/unit.ts +++ b/client/src/unit/unit.ts @@ -708,28 +708,15 @@ export class Unit extends CustomMarker { #onClick(e: any) { if (!this.#preventClick) { if (getMap().getState() === IDLE || getMap().getState() === MOVE_UNIT || e.originalEvent.ctrlKey) { - - if (!e.originalEvent.ctrlKey) { + if (!e.originalEvent.ctrlKey) getUnitsManager().deselectAllUnits(); - } - - const unitIsSelected = !this.getSelected(); - - this.setSelected( unitIsSelected ); - - // Tell everyone a unit (de-)selection has happened, usually a panel or something. - - const detail = { - "detail": this - }; - - if ( unitIsSelected ) { - document.dispatchEvent( new CustomEvent( "unitSelection", detail ) ); + this.setSelected( !this.getSelected() ); + if ( this.getSelected() ) { + document.dispatchEvent( new CustomEvent( "unitSelection", { "detail": this })); } else { - document.dispatchEvent( new CustomEvent( "unitDeselection", detail ) ); + document.dispatchEvent( new CustomEvent( "unitDeselection", { "detail": this })); } - } } diff --git a/client/src/unit/unitsmanager.ts b/client/src/unit/unitsmanager.ts index 1ba92461..7cf35804 100644 --- a/client/src/unit/unitsmanager.ts +++ b/client/src/unit/unitsmanager.ts @@ -197,13 +197,11 @@ export class UnitsManager { } deselectUnit( ID:number ) { - if ( this.#units.hasOwnProperty( ID ) ) { this.#units[ID].setSelected(false); } else { console.error( `deselectUnit(): no unit found with ID "${ID}".` ); } - } selectUnitsByHotgroup(hotgroup: number) { From 3055378b86007e524d4fcd60112459a7fe9db120 Mon Sep 17 00:00:00 2001 From: Pax1601 Date: Tue, 15 Aug 2023 11:19:44 +0200 Subject: [PATCH 4/7] Minimal code refactoring --- .../public/stylesheets/other/contextmenus.css | 2 - client/src/controls/airbasecontextmenu.ts | 132 ++++++++---------- client/src/mission/missionhandler.ts | 5 - 3 files changed, 62 insertions(+), 77 deletions(-) diff --git a/client/public/stylesheets/other/contextmenus.css b/client/public/stylesheets/other/contextmenus.css index 3e2ad830..8ba2c64d 100644 --- a/client/public/stylesheets/other/contextmenus.css +++ b/client/public/stylesheets/other/contextmenus.css @@ -448,8 +448,6 @@ width: 100%; } - - /* Airbase context menu */ #airbase-contextmenu #airbase-runways { display:flex; diff --git a/client/src/controls/airbasecontextmenu.ts b/client/src/controls/airbasecontextmenu.ts index 19a32a1c..0d00d17d 100644 --- a/client/src/controls/airbasecontextmenu.ts +++ b/client/src/controls/airbasecontextmenu.ts @@ -22,80 +22,16 @@ export class AirbaseContextMenu extends ContextMenu { setAirbase(airbase: Airbase) { this.#airbase = airbase; - this.setName(airbase.getName()); - this.setProperties(airbase.getProperties()); - this.setParkings(airbase.getParkings()); - this.setCoalition(airbase.getCoalition()); - this.enableLandButton(getUnitsManager().getSelectedUnitsTypes().length == 1 && ["Aircraft", "Helicopter"].includes(getUnitsManager().getSelectedUnitsTypes()[0]) && (getUnitsManager().getSelectedUnitsCoalition() === airbase.getCoalition() || airbase.getCoalition() === "neutral")) + this.setName(this.#airbase.getName()); + this.setProperties(this.#airbase.getProperties()); + this.setParkings(this.#airbase.getParkings()); + this.setCoalition(this.#airbase.getCoalition()); + this.enableLandButton(getUnitsManager().getSelectedUnitsTypes().length == 1 && ["Aircraft", "Helicopter"].includes(getUnitsManager().getSelectedUnitsTypes()[0]) && (getUnitsManager().getSelectedUnitsCoalition() === this.#airbase.getCoalition() || this.#airbase.getCoalition() === "neutral")) this.enableSpawnButton(getMissionHandler().getCommandModeOptions().commandMode == GAME_MASTER || this.#airbase.getCoalition() == getMissionHandler().getCommandedCoalition()); - - - dataPointMap( this.getContainer(), { - "coalition": airbase.getCoalition(), - "airbaseName": airbase.getName() - }); - dataPointMap( this.getContainer(), this.#airbase.getChartData() ); + this.#setAirbaseData(); - const runwaysContainer = this.getContainer()?.querySelector( "#airbase-runways" ); - runwaysContainer.innerHTML = ""; - - if ( runwaysContainer instanceof HTMLElement ) { - - const runways = this.#airbase.getChartData().runways; - - if ( runways.length === 0 ) { - runwaysContainer.innerText = "No data"; - } else { - runways.forEach( runway => { - - let runwayDiv = document.createElement( "div" ); - runwayDiv.classList.add( "runway" ); - - runway.headings.forEach( headings => { - - //* - for ( const [ heading, data ] of Object.entries( headings ) ) { - - let headingDiv = document.createElement( "div" ); - headingDiv.classList.add( "heading" ); - - let abbr = document.createElement( "abbr" ); - abbr.title = `Mag heading: ${data.magHeading}`; - abbr.innerText = heading; - - headingDiv.appendChild( abbr ); - - runwayDiv.appendChild( headingDiv ); - - if ( data.ILS ) { - let ilsDiv = document.createElement( "div" ); - ilsDiv.classList.add( "ils" ); - - abbr = document.createElement( "abbr" ); - abbr.title = data.ILS; - abbr.innerText = "ILS"; - - ilsDiv.appendChild( abbr ); - headingDiv.appendChild( ilsDiv ); - } - - - } - //*/ - - }); - - runwaysContainer.appendChild( runwayDiv ); - - }); - } - - } - this.clip(); - - } setName(airbaseName: string) { @@ -144,4 +80,60 @@ export class AirbaseContextMenu extends ContextMenu { getMap().getMapContextMenu().setLatLng(this.#airbase.getLatLng()); } } + + #setAirbaseData() { + if (this.#airbase && this.getContainer()) { + dataPointMap(this.getContainer() as HTMLElement, { + "coalition": this.#airbase.getCoalition(), + "airbaseName": this.#airbase.getName() + }); + + dataPointMap( this.getContainer() as HTMLElement, this.#airbase.getChartData() ); + + const runwaysContainer = this.getContainer()?.querySelector( "#airbase-runways" ) as HTMLElement; + runwaysContainer.innerHTML = ""; + + if ( runwaysContainer instanceof HTMLElement ) { + const runways = this.#airbase.getChartData().runways; + + if ( runways.length === 0 ) { + runwaysContainer.innerText = "No data"; + } else { + runways.forEach( runway => { + let runwayDiv = document.createElement( "div" ); + runwayDiv.classList.add( "runway" ); + + runway.headings.forEach( headings => { + for ( const [ heading, data ] of Object.entries( headings ) ) { + + let headingDiv = document.createElement( "div" ); + headingDiv.classList.add( "heading" ); + + let abbr = document.createElement( "abbr" ); + abbr.title = `Mag heading: ${data.magHeading}`; + abbr.innerText = heading; + + headingDiv.appendChild( abbr ); + runwayDiv.appendChild( headingDiv ); + + if ( data.ILS ) { + let ilsDiv = document.createElement( "div" ); + ilsDiv.classList.add( "ils" ); + + abbr = document.createElement( "abbr" ); + abbr.title = data.ILS; + abbr.innerText = "ILS"; + + ilsDiv.appendChild( abbr ); + headingDiv.appendChild( ilsDiv ); + } + } + }); + + runwaysContainer.appendChild( runwayDiv ); + }); + } + } + } + } } \ No newline at end of file diff --git a/client/src/mission/missionhandler.ts b/client/src/mission/missionhandler.ts index 77e32f07..ebadaa82 100644 --- a/client/src/mission/missionhandler.ts +++ b/client/src/mission/missionhandler.ts @@ -235,9 +235,7 @@ export class MissionHandler { getMap().showAirbaseContextMenu(e.originalEvent.x, e.originalEvent.y, e.latlng, e.sourceTarget); } - #loadAirbaseChartData() { - if ( !this.#theatre ) { return; } @@ -264,8 +262,5 @@ export class MissionHandler { } }); - - } - } \ No newline at end of file From e96cb2716df2e4a86babcae95b64d9852bcd05fb Mon Sep 17 00:00:00 2001 From: Pax1601 Date: Tue, 15 Aug 2023 12:26:05 +0200 Subject: [PATCH 5/7] Moved airfields database to public/database folder --- client/demo.js | 2 +- .../databases/airbases}/caucasus.json | 0 .../databases/airbases}/marianas.json | 930 +++--- .../databases/airbases}/nevada.json | 1114 +++---- .../databases/airbases}/persiangulf.json | 0 .../databases/airbases}/syria.json | 2730 ++++++++--------- .../{ => units}/aircraftdatabase.json | 0 .../{ => units}/groundunitdatabase.json | 0 .../{ => units}/helicopterdatabase.json | 0 .../iran-iraq_fictional/aircraftdatabase.json | 0 .../groundunitdatabase.json | 0 .../helicopterdatabase.json | 0 .../iran-iraq_fictional/navyunitdatabase.json | 0 .../{ => units}/navyunitdatabase.json | 0 client/public/stylesheets/olympus.css | 4 - .../public/stylesheets/other/contextmenus.css | 47 +- client/routes/api/airbases.js | 27 +- client/src/@types/unit.d.ts | 6 +- client/src/mission/airbase.ts | 51 +- client/src/mission/missionhandler.ts | 52 +- client/src/unit/aircraftdatabase.ts | 2 +- client/src/unit/groundunitdatabase.ts | 2 +- client/src/unit/helicopterdatabase.ts | 2 +- client/src/unit/navyunitdatabase.ts | 2 +- 24 files changed, 2462 insertions(+), 2509 deletions(-) rename client/{src/airfields => public/databases/airbases}/caucasus.json (100%) rename client/{src/airfields => public/databases/airbases}/marianas.json (95%) rename client/{src/airfields => public/databases/airbases}/nevada.json (95%) rename client/{src/airfields => public/databases/airbases}/persiangulf.json (100%) rename client/{src/airfields => public/databases/airbases}/syria.json (95%) rename client/public/databases/{ => units}/aircraftdatabase.json (100%) rename client/public/databases/{ => units}/groundunitdatabase.json (100%) rename client/public/databases/{ => units}/helicopterdatabase.json (100%) rename client/public/databases/{ => units}/iran-iraq_fictional/aircraftdatabase.json (100%) rename client/public/databases/{ => units}/iran-iraq_fictional/groundunitdatabase.json (100%) rename client/public/databases/{ => units}/iran-iraq_fictional/helicopterdatabase.json (100%) rename client/public/databases/{ => units}/iran-iraq_fictional/navyunitdatabase.json (100%) rename client/public/databases/{ => units}/navyunitdatabase.json (100%) diff --git a/client/demo.js b/client/demo.js index 2a3360b0..332c4e34 100644 --- a/client/demo.js +++ b/client/demo.js @@ -344,7 +344,7 @@ class DemoDataGenerator { airbases(req, res){ var ret = {airbases: { ["0"]: { - callsign: "Neutral", + callsign: "Nellis", latitude: 37.3, longitude: -115.8, coalition: "neutral" diff --git a/client/src/airfields/caucasus.json b/client/public/databases/airbases/caucasus.json similarity index 100% rename from client/src/airfields/caucasus.json rename to client/public/databases/airbases/caucasus.json diff --git a/client/src/airfields/marianas.json b/client/public/databases/airbases/marianas.json similarity index 95% rename from client/src/airfields/marianas.json rename to client/public/databases/airbases/marianas.json index 580c6f89..5b27dcdc 100644 --- a/client/src/airfields/marianas.json +++ b/client/public/databases/airbases/marianas.json @@ -1,466 +1,466 @@ -{ - "airfields": { - "Anapa-Vityazevo": { - "ICAO": "URKA", - "elevation": "141", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "22": { - "magHeading": "214", - "ILS": "" - }, - "04": { - "magHeading": "034", - "ILS": "" - } - } - ], - "length": "9000" - } - ] - }, - "Batumi": { - "ICAO": "UGSB", - "elevation": "33", - "TACAN": "16X", - "runways": [ - { - "headings": [ - { - "13": { - "magHeading": "119", - "ILS": "" - }, - "31": { - "magHeading": "299", - "ILS": "" - } - } - ], - "length": "7500" - } - ] - }, - "Beslan": { - "ICAO": "URMO", - "elevation": "1722", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "10": { - "magHeading": "086", - "ILS": "110.50" - }, - "28": { - "magHeading": "266", - "ILS": "" - } - } - ], - "length": "9600" - } - ] - }, - "Gelendzhik": { - "ICAO": "URKG", - "elevation": "72", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "19": { - "magHeading": "212", - "ILS": "" - }, - "01": { - "magHeading": "032", - "ILS": "" - } - } - ], - "length": "5400" - } - ] - }, - "Gudauta": { - "ICAO": "UG23", - "elevation": "69", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "15": { - "magHeading": "144", - "ILS": "" - }, - "33": { - "magHeading": "324", - "ILS": "" - } - } - ], - "length": "7700" - } - ] - }, - "Kobuleti": { - "ICAO": "UG5X", - "elevation": "69", - "TACAN": "67X", - "runways": [ - { - "headings": [ - { - "25": { - "magHeading": "243", - "ILS": "" - }, - "07": { - "magHeading": "063", - "ILS": "111.50" - } - } - ], - "length": "7400" - } - ] - }, - "Krasnodar-Center": { - "ICAO": "URKL", - "elevation": "98", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "27": { - "magHeading": "259", - "ILS": "" - }, - "09": { - "magHeading": "079", - "ILS": "" - } - } - ], - "length": "7700" - } - ] - }, - "Krasnodar-Pashkovsky": { - "ICAO": "URKK", - "elevation": "112", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "23": { - "magHeading": "219", - "ILS": "" - }, - "05": { - "magHeading": "039", - "ILS": "" - } - } - ], - "length": "9600" - } - ] - }, - "Krymsk": { - "ICAO": "URKW", - "elevation": "66", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "22": { - "magHeading": "212", - "ILS": "" - }, - "04": { - "magHeading": "032", - "ILS": "" - } - } - ], - "length": "8000" - } - ] - }, - "Kutaisi": { - "ICAO": "UGKO", - "elevation": "148", - "TACAN": "44X", - "runways": [ - { - "headings": [ - { - "25": { - "magHeading": "247", - "ILS": "" - }, - "07": { - "magHeading": "067'", - "ILS": "109.75" - } - } - ], - "length": "7700" - } - ] - }, - "Maykop-Khanskaya": { - "ICAO": "URKH", - "elevation": "591", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "22": { - "magHeading": "211", - "ILS": "" - }, - "04": { - "magHeading": "031", - "ILS": "" - } - } - ], - "length": "10100" - } - ] - }, - "Mineralnye Vody": { - "ICAO": "URMM", - "elevation": "1050", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "12": { - "magHeading": "108", - "ILS": "111.70" - }, - "30": { - "magHeading": "288", - "ILS": "109.30" - } - } - ], - "length": "12700" - } - ] - }, - "Mozdok": { - "ICAO": "XRMF", - "elevation": "507", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "26": { - "magHeading": "255", - "ILS": "" - }, - "08": { - "magHeading": "075", - "ILS": "" - } - } - ], - "length": "9400" - } - ] - }, - "Nalchik": { - "ICAO": "URMN", - "elevation": "1411", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "24": { - "magHeading": "228", - "ILS": "110.50" - }, - "06": { - "magHeading": "048'", - "ILS": "" - } - } - ], - "length": "7000" - } - ] - }, - "Novorossiysk": { - "ICAO": "URKN", - "elevation": "131", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "22": { - "magHeading": "214", - "ILS": "" - }, - "04": { - "magHeading": "034", - "ILS": "" - } - } - ], - "length": "5400" - } - ] - }, - "Senaki-Kolkhi": { - "ICAO": "UGKS", - "elevation": "43", - "TACAN": "31X", - "runways": [ - { - "headings": [ - { - "27": { - "magHeading": "268", - "ILS": "" - }, - "09": { - "magHeading": "088'", - "ILS": "108.90" - } - } - ], - "length": "7400" - } - ] - }, - "Sochi-Adler": { - "ICAO": "URSS", - "elevation": "98", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "27": { - "magHeading": "235", - "ILS": "" - }, - "06": { - "magHeading": "055", - "ILS": "111.10" - } - } - ], - "length": "9700" - } - ] - }, - "Tbilisi-Lochini": { - "ICAO": "UGTB", - "elevation": "1574", - "TACAN": "25X", - "runways": [ - { - "headings": [ - { - "13": { - "magHeading": "121", - "ILS": "110.30" - }, - "31": { - "magHeading": "301", - "ILS": "108.90" - } - } - ], - "length": "9300" - } - ] - }, - "Soganlug": { - "ICAO": "UG24", - "elevation": "1500", - "TACAN": "25X", - "runways": [ - { - "headings": [ - { - "14": { - "magHeading": "125", - "ILS": "" - }, - "32": { - "magHeading": "305", - "ILS": "" - } - } - ], - "length": "6500" - } - ] - }, - "Sukhumi-Babushara": { - "ICAO": "UGSS", - "elevation": "43", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "12": { - "magHeading": "109", - "ILS": "" - }, - "30": { - "magHeading": "289", - "ILS": "" - } - } - ], - "length": "11400" - } - ] - }, - "Vaziani": { - "ICAO": "UG27", - "elevation": "1524", - "TACAN": "22X", - "runways": [ - { - "headings": [ - { - "13": { - "magHeading": "129", - "ILS": "108.75" - }, - "31": { - "magHeading": "309", - "ILS": "108.75" - } - } - ], - "length": "7700" - } - ] - } - } +{ + "airfields": { + "Anapa-Vityazevo": { + "ICAO": "URKA", + "elevation": "141", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "22": { + "magHeading": "214", + "ILS": "" + }, + "04": { + "magHeading": "034", + "ILS": "" + } + } + ], + "length": "9000" + } + ] + }, + "Batumi": { + "ICAO": "UGSB", + "elevation": "33", + "TACAN": "16X", + "runways": [ + { + "headings": [ + { + "13": { + "magHeading": "119", + "ILS": "" + }, + "31": { + "magHeading": "299", + "ILS": "" + } + } + ], + "length": "7500" + } + ] + }, + "Beslan": { + "ICAO": "URMO", + "elevation": "1722", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "10": { + "magHeading": "086", + "ILS": "110.50" + }, + "28": { + "magHeading": "266", + "ILS": "" + } + } + ], + "length": "9600" + } + ] + }, + "Gelendzhik": { + "ICAO": "URKG", + "elevation": "72", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "19": { + "magHeading": "212", + "ILS": "" + }, + "01": { + "magHeading": "032", + "ILS": "" + } + } + ], + "length": "5400" + } + ] + }, + "Gudauta": { + "ICAO": "UG23", + "elevation": "69", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "15": { + "magHeading": "144", + "ILS": "" + }, + "33": { + "magHeading": "324", + "ILS": "" + } + } + ], + "length": "7700" + } + ] + }, + "Kobuleti": { + "ICAO": "UG5X", + "elevation": "69", + "TACAN": "67X", + "runways": [ + { + "headings": [ + { + "25": { + "magHeading": "243", + "ILS": "" + }, + "07": { + "magHeading": "063", + "ILS": "111.50" + } + } + ], + "length": "7400" + } + ] + }, + "Krasnodar-Center": { + "ICAO": "URKL", + "elevation": "98", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "259", + "ILS": "" + }, + "09": { + "magHeading": "079", + "ILS": "" + } + } + ], + "length": "7700" + } + ] + }, + "Krasnodar-Pashkovsky": { + "ICAO": "URKK", + "elevation": "112", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "23": { + "magHeading": "219", + "ILS": "" + }, + "05": { + "magHeading": "039", + "ILS": "" + } + } + ], + "length": "9600" + } + ] + }, + "Krymsk": { + "ICAO": "URKW", + "elevation": "66", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "22": { + "magHeading": "212", + "ILS": "" + }, + "04": { + "magHeading": "032", + "ILS": "" + } + } + ], + "length": "8000" + } + ] + }, + "Kutaisi": { + "ICAO": "UGKO", + "elevation": "148", + "TACAN": "44X", + "runways": [ + { + "headings": [ + { + "25": { + "magHeading": "247", + "ILS": "" + }, + "07": { + "magHeading": "067'", + "ILS": "109.75" + } + } + ], + "length": "7700" + } + ] + }, + "Maykop-Khanskaya": { + "ICAO": "URKH", + "elevation": "591", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "22": { + "magHeading": "211", + "ILS": "" + }, + "04": { + "magHeading": "031", + "ILS": "" + } + } + ], + "length": "10100" + } + ] + }, + "Mineralnye Vody": { + "ICAO": "URMM", + "elevation": "1050", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "12": { + "magHeading": "108", + "ILS": "111.70" + }, + "30": { + "magHeading": "288", + "ILS": "109.30" + } + } + ], + "length": "12700" + } + ] + }, + "Mozdok": { + "ICAO": "XRMF", + "elevation": "507", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "26": { + "magHeading": "255", + "ILS": "" + }, + "08": { + "magHeading": "075", + "ILS": "" + } + } + ], + "length": "9400" + } + ] + }, + "Nalchik": { + "ICAO": "URMN", + "elevation": "1411", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "24": { + "magHeading": "228", + "ILS": "110.50" + }, + "06": { + "magHeading": "048'", + "ILS": "" + } + } + ], + "length": "7000" + } + ] + }, + "Novorossiysk": { + "ICAO": "URKN", + "elevation": "131", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "22": { + "magHeading": "214", + "ILS": "" + }, + "04": { + "magHeading": "034", + "ILS": "" + } + } + ], + "length": "5400" + } + ] + }, + "Senaki-Kolkhi": { + "ICAO": "UGKS", + "elevation": "43", + "TACAN": "31X", + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "268", + "ILS": "" + }, + "09": { + "magHeading": "088'", + "ILS": "108.90" + } + } + ], + "length": "7400" + } + ] + }, + "Sochi-Adler": { + "ICAO": "URSS", + "elevation": "98", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "235", + "ILS": "" + }, + "06": { + "magHeading": "055", + "ILS": "111.10" + } + } + ], + "length": "9700" + } + ] + }, + "Tbilisi-Lochini": { + "ICAO": "UGTB", + "elevation": "1574", + "TACAN": "25X", + "runways": [ + { + "headings": [ + { + "13": { + "magHeading": "121", + "ILS": "110.30" + }, + "31": { + "magHeading": "301", + "ILS": "108.90" + } + } + ], + "length": "9300" + } + ] + }, + "Soganlug": { + "ICAO": "UG24", + "elevation": "1500", + "TACAN": "25X", + "runways": [ + { + "headings": [ + { + "14": { + "magHeading": "125", + "ILS": "" + }, + "32": { + "magHeading": "305", + "ILS": "" + } + } + ], + "length": "6500" + } + ] + }, + "Sukhumi-Babushara": { + "ICAO": "UGSS", + "elevation": "43", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "12": { + "magHeading": "109", + "ILS": "" + }, + "30": { + "magHeading": "289", + "ILS": "" + } + } + ], + "length": "11400" + } + ] + }, + "Vaziani": { + "ICAO": "UG27", + "elevation": "1524", + "TACAN": "22X", + "runways": [ + { + "headings": [ + { + "13": { + "magHeading": "129", + "ILS": "108.75" + }, + "31": { + "magHeading": "309", + "ILS": "108.75" + } + } + ], + "length": "7700" + } + ] + } + } } \ No newline at end of file diff --git a/client/src/airfields/nevada.json b/client/public/databases/airbases/nevada.json similarity index 95% rename from client/src/airfields/nevada.json rename to client/public/databases/airbases/nevada.json index 48159c97..2eaf04df 100644 --- a/client/src/airfields/nevada.json +++ b/client/public/databases/airbases/nevada.json @@ -1,558 +1,558 @@ -{ - "airfields": { - "Beatty": { - "ICAO": "KBTY", - "elevation": "3173", - "TACAN": "94X", - "runways": [ - { - "headings": [ - { - "16": { - "magHeading": "168", - "ILS": "" - }, - "34": { - "magHeading": "348", - "ILS": "" - } - } - ], - "length": "5500" - } - ] - }, - "Boulder City": { - "ICAO": "KBVU", - "elevation": "2205", - "TACAN": "114X", - "runways": [ - { - "headings": [ - { - "15": { - "magHeading": "153", - "ILS": "" - }, - "33": { - "magHeading": "333", - "ILS": "" - } - } - ], - "length": "3700" - }, - { - "headings": [ - { - "27": { - "magHeading": "267", - "ILS": "" - }, - "09": { - "magHeading": "087", - "ILS": "" - } - } - ], - "length": "4400" - } - ] - }, - "Creech": { - "ICAO": "KINS", - "elevation": "3126", - "TACAN": "87X", - "runways": [ - { - "headings": [ - { - "13": { - "magHeading": "134", - "ILS": "" - }, - "31": { - "magHeading": "314", - "ILS": "" - } - } - ], - "length": "4700" - }, - { - "headings": [ - { - "26": { - "magHeading": "260", - "ILS": "" - }, - "08": { - "magHeading": "080", - "ILS": "108.70" - } - } - ], - "length": "8700" - } - ] - }, - "Echo Bay": { - "ICAO": "0L9", - "elevation": "1549", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "24": { - "magHeading": "246", - "ILS": "" - }, - "06": { - "magHeading": "066", - "ILS": "" - } - } - ], - "length": "3300" - } - ] - }, - "Groom Lake": { - "ICAO": "KXTA", - "elevation": "4495", - "TACAN": "18X", - "runways": [ - { - "headings": [ - { - "14L": { - "magHeading": "145", - "ILS": "" - }, - "32R": { - "magHeading": "325", - "ILS": "109.30" - } - } - ], - "length": "11700" - }, - { - "headings": [ - { - "14R (CLOSED)": { - "magHeading": "145", - "ILS": "" - }, - "32L (CLOSED)": { - "magHeading": "325", - "ILS": "" - } - } - ], - "length": "17800" - } - ] - }, - "Henderson Executive": { - "ICAO": "KHND", - "elevation": "2493", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "17L": { - "magHeading": "168", - "ILS": "" - }, - "35R": { - "magHeading": "348", - "ILS": "" - } - } - ], - "length": "4600" - }, - { - "headings": [ - { - "17R": { - "magHeading": "168", - "ILS": "" - }, - "35L": { - "magHeading": "348", - "ILS": "" - } - } - ], - "length": "6100" - } - ] - }, - "Jean": { - "ICAO": "", - "elevation": "2825", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "02L": { - "magHeading": "020", - "ILS": "" - }, - "20R": { - "magHeading": "200", - "ILS": "" - } - } - ], - "length": "4500" - }, - { - "headings": [ - { - "02R": { - "magHeading": "020", - "ILS": "" - }, - "20L": { - "magHeading": "200", - "ILS": "" - } - } - ], - "length": "3600" - } - ] - }, - "McCarran International": { - "ICAO": "KLAS", - "elevation": "2178", - "TACAN": "116X", - "runways": [ - { - "headings": [ - { - "01L": { - "magHeading": "013", - "ILS": "" - }, - "19R": { - "magHeading": "193", - "ILS": "" - } - } - ], - "length": "8000" - }, - { - "headings": [ - { - "01R": { - "magHeading": "013", - "ILS": "" - }, - "19L": { - "magHeading": "193", - "ILS": "" - } - } - ], - "length": "8000" - }, - { - "headings": [ - { - "07L": { - "magHeading": "078", - "ILS": "" - }, - "25R": { - "magHeading": "258", - "ILS": "110.30" - } - } - ], - "length": "10600" - }, - { - "headings": [ - { - "07R": { - "magHeading": "078", - "ILS": "" - }, - "25L": { - "magHeading": "258", - "ILS": "" - } - } - ], - "length": "10100" - } - ] - }, - "Laughlin": { - "ICAO": "KIFP", - "elevation": "673", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "16": { - "magHeading": "164", - "ILS": "" - }, - "34": { - "magHeading": "344", - "ILS": "" - } - } - ], - "length": "7100" - } - ] - }, - "Lincoln County": { - "ICAO": "", - "elevation": "4816", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "17": { - "magHeading": "170", - "ILS": "" - }, - "35": { - "magHeading": "350", - "ILS": "" - } - } - ], - "length": "4500" - } - ] - }, - "Mesquite": { - "ICAO": "67L", - "elevation": "1859", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "19": { - "magHeading": "197", - "ILS": "" - }, - "01": { - "magHeading": "017", - "ILS": "" - } - } - ], - "length": "5000" - } - ] - }, - "Mina": { - "ICAO": "", - "elevation": "4560", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "13": { - "magHeading": "140", - "ILS": "" - }, - "31": { - "magHeading": "320", - "ILS": "" - } - } - ], - "length": "4100" - } - ] - }, - "Nellis": { - "ICAO": "KLSV", - "elevation": "1849", - "TACAN": "12X", - "runways": [ - { - "headings": [ - { - "03L": { - "magHeading": "029", - "ILS": "" - }, - "21R": { - "magHeading": "209", - "ILS": "" - } - } - ], - "length": "9800" - }, - { - "headings": [ - { - "03R": { - "magHeading": "029", - "ILS": "" - }, - "21L": { - "magHeading": "209", - "ILS": "109.10" - } - } - ], - "length": "9800" - } - ] - }, - "North Las Vegas": { - "ICAO": "KVGT", - "elevation": "2228", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "25": { - "magHeading": "256", - "ILS": "" - }, - "07": { - "magHeading": "076", - "ILS": "" - } - } - ], - "length": "4900" - }, - { - "headings": [ - { - "12L": { - "magHeading": "122", - "ILS": "110.70" - }, - "30R": { - "magHeading": "302", - "ILS": "109.10" - } - } - ], - "length": "3800" - }, - { - "headings": [ - { - "12R": { - "magHeading": "122", - "ILS": "" - }, - "30L": { - "magHeading": "302", - "ILS": "" - } - } - ], - "length": "4600" - } - ] - }, - "Pahute Mesa": { - "ICAO": "", - "elevation": "5059", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "18": { - "magHeading": "182", - "ILS": "" - }, - "36": { - "magHeading": "002", - "ILS": "" - } - } - ], - "length": "5500" - } - ] - }, - "Tonopah": { - "ICAO": "KTPH", - "elevation": "5390", - "TACAN": "119X", - "runways": [ - { - "headings": [ - { - "11": { - "magHeading": "113", - "ILS": "" - }, - "29": { - "magHeading": "293", - "ILS": "" - } - } - ], - "length": "5600" - }, - { - "headings": [ - { - "15": { - "magHeading": "153", - "ILS": "" - }, - "33": { - "magHeading": "333", - "ILS": "" - } - } - ], - "length": "6800" - } - ] - }, - "Tonopah Test Range": { - "ICAO": "KTNX", - "elevation": "5535", - "TACAN": "77X", - "runways": [ - { - "headings": [ - { - "14": { - "magHeading": "145", - "ILS": "108.30" - }, - "32": { - "magHeading": "325", - "ILS": "111.70" - } - } - ], - "length": "11700" - } - ] - } - } +{ + "airfields": { + "Beatty": { + "ICAO": "KBTY", + "elevation": "3173", + "TACAN": "94X", + "runways": [ + { + "headings": [ + { + "16": { + "magHeading": "168", + "ILS": "" + }, + "34": { + "magHeading": "348", + "ILS": "" + } + } + ], + "length": "5500" + } + ] + }, + "Boulder City": { + "ICAO": "KBVU", + "elevation": "2205", + "TACAN": "114X", + "runways": [ + { + "headings": [ + { + "15": { + "magHeading": "153", + "ILS": "" + }, + "33": { + "magHeading": "333", + "ILS": "" + } + } + ], + "length": "3700" + }, + { + "headings": [ + { + "27": { + "magHeading": "267", + "ILS": "" + }, + "09": { + "magHeading": "087", + "ILS": "" + } + } + ], + "length": "4400" + } + ] + }, + "Creech": { + "ICAO": "KINS", + "elevation": "3126", + "TACAN": "87X", + "runways": [ + { + "headings": [ + { + "13": { + "magHeading": "134", + "ILS": "" + }, + "31": { + "magHeading": "314", + "ILS": "" + } + } + ], + "length": "4700" + }, + { + "headings": [ + { + "26": { + "magHeading": "260", + "ILS": "" + }, + "08": { + "magHeading": "080", + "ILS": "108.70" + } + } + ], + "length": "8700" + } + ] + }, + "Echo Bay": { + "ICAO": "0L9", + "elevation": "1549", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "24": { + "magHeading": "246", + "ILS": "" + }, + "06": { + "magHeading": "066", + "ILS": "" + } + } + ], + "length": "3300" + } + ] + }, + "Groom Lake": { + "ICAO": "KXTA", + "elevation": "4495", + "TACAN": "18X", + "runways": [ + { + "headings": [ + { + "14L": { + "magHeading": "145", + "ILS": "" + }, + "32R": { + "magHeading": "325", + "ILS": "109.30" + } + } + ], + "length": "11700" + }, + { + "headings": [ + { + "14R (CLOSED)": { + "magHeading": "145", + "ILS": "" + }, + "32L (CLOSED)": { + "magHeading": "325", + "ILS": "" + } + } + ], + "length": "17800" + } + ] + }, + "Henderson Executive": { + "ICAO": "KHND", + "elevation": "2493", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "17L": { + "magHeading": "168", + "ILS": "" + }, + "35R": { + "magHeading": "348", + "ILS": "" + } + } + ], + "length": "4600" + }, + { + "headings": [ + { + "17R": { + "magHeading": "168", + "ILS": "" + }, + "35L": { + "magHeading": "348", + "ILS": "" + } + } + ], + "length": "6100" + } + ] + }, + "Jean": { + "ICAO": "", + "elevation": "2825", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "02L": { + "magHeading": "020", + "ILS": "" + }, + "20R": { + "magHeading": "200", + "ILS": "" + } + } + ], + "length": "4500" + }, + { + "headings": [ + { + "02R": { + "magHeading": "020", + "ILS": "" + }, + "20L": { + "magHeading": "200", + "ILS": "" + } + } + ], + "length": "3600" + } + ] + }, + "McCarran International": { + "ICAO": "KLAS", + "elevation": "2178", + "TACAN": "116X", + "runways": [ + { + "headings": [ + { + "01L": { + "magHeading": "013", + "ILS": "" + }, + "19R": { + "magHeading": "193", + "ILS": "" + } + } + ], + "length": "8000" + }, + { + "headings": [ + { + "01R": { + "magHeading": "013", + "ILS": "" + }, + "19L": { + "magHeading": "193", + "ILS": "" + } + } + ], + "length": "8000" + }, + { + "headings": [ + { + "07L": { + "magHeading": "078", + "ILS": "" + }, + "25R": { + "magHeading": "258", + "ILS": "110.30" + } + } + ], + "length": "10600" + }, + { + "headings": [ + { + "07R": { + "magHeading": "078", + "ILS": "" + }, + "25L": { + "magHeading": "258", + "ILS": "" + } + } + ], + "length": "10100" + } + ] + }, + "Laughlin": { + "ICAO": "KIFP", + "elevation": "673", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "16": { + "magHeading": "164", + "ILS": "" + }, + "34": { + "magHeading": "344", + "ILS": "" + } + } + ], + "length": "7100" + } + ] + }, + "Lincoln County": { + "ICAO": "", + "elevation": "4816", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "17": { + "magHeading": "170", + "ILS": "" + }, + "35": { + "magHeading": "350", + "ILS": "" + } + } + ], + "length": "4500" + } + ] + }, + "Mesquite": { + "ICAO": "67L", + "elevation": "1859", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "19": { + "magHeading": "197", + "ILS": "" + }, + "01": { + "magHeading": "017", + "ILS": "" + } + } + ], + "length": "5000" + } + ] + }, + "Mina": { + "ICAO": "", + "elevation": "4560", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "13": { + "magHeading": "140", + "ILS": "" + }, + "31": { + "magHeading": "320", + "ILS": "" + } + } + ], + "length": "4100" + } + ] + }, + "Nellis": { + "ICAO": "KLSV", + "elevation": "1849", + "TACAN": "12X", + "runways": [ + { + "headings": [ + { + "03L": { + "magHeading": "029", + "ILS": "" + }, + "21R": { + "magHeading": "209", + "ILS": "" + } + } + ], + "length": "9800" + }, + { + "headings": [ + { + "03R": { + "magHeading": "029", + "ILS": "" + }, + "21L": { + "magHeading": "209", + "ILS": "109.10" + } + } + ], + "length": "9800" + } + ] + }, + "North Las Vegas": { + "ICAO": "KVGT", + "elevation": "2228", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "25": { + "magHeading": "256", + "ILS": "" + }, + "07": { + "magHeading": "076", + "ILS": "" + } + } + ], + "length": "4900" + }, + { + "headings": [ + { + "12L": { + "magHeading": "122", + "ILS": "110.70" + }, + "30R": { + "magHeading": "302", + "ILS": "109.10" + } + } + ], + "length": "3800" + }, + { + "headings": [ + { + "12R": { + "magHeading": "122", + "ILS": "" + }, + "30L": { + "magHeading": "302", + "ILS": "" + } + } + ], + "length": "4600" + } + ] + }, + "Pahute Mesa": { + "ICAO": "", + "elevation": "5059", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "18": { + "magHeading": "182", + "ILS": "" + }, + "36": { + "magHeading": "002", + "ILS": "" + } + } + ], + "length": "5500" + } + ] + }, + "Tonopah": { + "ICAO": "KTPH", + "elevation": "5390", + "TACAN": "119X", + "runways": [ + { + "headings": [ + { + "11": { + "magHeading": "113", + "ILS": "" + }, + "29": { + "magHeading": "293", + "ILS": "" + } + } + ], + "length": "5600" + }, + { + "headings": [ + { + "15": { + "magHeading": "153", + "ILS": "" + }, + "33": { + "magHeading": "333", + "ILS": "" + } + } + ], + "length": "6800" + } + ] + }, + "Tonopah Test Range": { + "ICAO": "KTNX", + "elevation": "5535", + "TACAN": "77X", + "runways": [ + { + "headings": [ + { + "14": { + "magHeading": "145", + "ILS": "108.30" + }, + "32": { + "magHeading": "325", + "ILS": "111.70" + } + } + ], + "length": "11700" + } + ] + } + } } \ No newline at end of file diff --git a/client/src/airfields/persiangulf.json b/client/public/databases/airbases/persiangulf.json similarity index 100% rename from client/src/airfields/persiangulf.json rename to client/public/databases/airbases/persiangulf.json diff --git a/client/src/airfields/syria.json b/client/public/databases/airbases/syria.json similarity index 95% rename from client/src/airfields/syria.json rename to client/public/databases/airbases/syria.json index 4d670cf7..e0ee84e6 100644 --- a/client/src/airfields/syria.json +++ b/client/public/databases/airbases/syria.json @@ -1,1366 +1,1366 @@ -{ - "airfields": { - "Abu al-Duhur": { - "ICAO": "OS57", - "elevation": "820", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "27": { - "magHeading": "268", - "ILS": "" - }, - "09": { - "magHeading": "088", - "ILS": "" - } - } - ], - "length": "9200" - } - ] - }, - "Adana Sakirpasa": { - "ICAO": "LTAF", - "elevation": "56", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "23": { - "magHeading": "230", - "ILS": "" - }, - "05": { - "magHeading": "050", - "ILS": "108.70" - } - } - ], - "length": "8800" - } - ] - }, - "Akrotiri": { - "ICAO": "LCRA", - "elevation": "69", - "TACAN": "107X", - "runways": [ - { - "headings": [ - { - "10": { - "magHeading": "106", - "ILS": "" - }, - "28": { - "magHeading": "286", - "ILS": "109.70" - } - } - ], - "length": "8800" - } - ] - }, - "Al Qusayr": { - "ICAO": "OS70", - "elevation": "1729", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "10": { - "magHeading": "096", - "ILS": "" - }, - "28": { - "magHeading": "276", - "ILS": "" - } - } - ], - "length": "9500" - } - ] - }, - "Al-Dumayr": { - "ICAO": "OS61", - "elevation": "2067", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "24": { - "magHeading": "240", - "ILS": "" - }, - "06": { - "magHeading": "060", - "ILS": "" - } - } - ], - "length": "9500" - } - ] - }, - "Aleppo": { - "ICAO": "OSAP", - "elevation": "1254", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "27": { - "magHeading": "272", - "ILS": "" - }, - "09": { - "magHeading": "092", - "ILS": "" - } - } - ], - "length": "9200" - } - ] - }, - "An Nasiriyah": { - "ICAO": "OSAP", - "elevation": "1254", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "27": { - "magHeading": "272", - "ILS": "" - }, - "09": { - "magHeading": "092", - "ILS": "" - } - } - ], - "length": "9200" - } - ] - }, - "At Tanf": { - "ICAO": "", - "elevation": "2329", - "TACAN": "", - "runways": [] - }, - "Bassel Al-Assad": { - "ICAO": "OSLK", - "elevation": "92", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "17L": { - "magHeading": "173", - "ILS": "" - }, - "35R": { - "magHeading": "353", - "ILS": "" - } - } - ], - "length": "7900" - }, - { - "headings": [ - { - "17R": { - "magHeading": "173", - "ILS": "109.10" - }, - "35L": { - "magHeading": "353", - "ILS": "" - } - } - ], - "length": "8900" - } - ] - }, - "Beirut-Rafic Hariri": { - "ICAO": "OLBA", - "elevation": "39", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "16": { - "magHeading": "164", - "ILS": "110.10" - }, - "34": { - "magHeading": "344", - "ILS": "" - } - } - ], - "length": "10300" - }, - { - "headings": [ - { - "17": { - "magHeading": "174", - "ILS": "109.50" - }, - "35": { - "magHeading": "354", - "ILS": "" - } - } - ], - "length": "7600" - }, - { - "headings": [ - { - "21": { - "magHeading": "210", - "ILS": "" - }, - "03": { - "magHeading": "030", - "ILS": "110.70" - } - } - ], - "length": "7000" - } - ] - }, - "Damascus": { - "ICAO": "OSDI", - "elevation": "2008", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "05L": { - "magHeading": "045", - "ILS": "" - }, - "23R": { - "magHeading": "225", - "ILS": "109.90" - } - } - ], - "length": "11600" - }, - { - "headings": [ - { - "05R": { - "magHeading": "045", - "ILS": "111.10" - }, - "23L": { - "magHeading": "225", - "ILS": "" - } - } - ], - "length": "11600" - } - ] - }, - "Deir ez-Zor": { - "ICAO": "OSDZ", - "elevation": "713", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "10": { - "magHeading": "104", - "ILS": "" - }, - "28": { - "magHeading": "284", - "ILS": "" - } - } - ], - "length": "9500" - } - ] - }, - "Ercan": { - "ICAO": "LCEN", - "elevation": "312", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "11": { - "magHeading": "110", - "ILS": "" - }, - "29": { - "magHeading": "290", - "ILS": "108.30" - } - } - ], - "length": "8700" - } - ] - }, - "Eyn Shemer": { - "ICAO": "LLES", - "elevation": "110", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "27": { - "magHeading": "2750", - "ILS": "" - }, - "09": { - "magHeading": "095", - "ILS": "" - } - } - ], - "length": "4000" - } - ] - }, - "Gaziantep": { - "ICAO": "LTAJ", - "elevation": "2290", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "10": { - "magHeading": "100", - "ILS": "" - }, - "28": { - "magHeading": "280", - "ILS": "109.10" - } - } - ], - "length": "9100" - } - ] - }, - "Gazipasa": { - "ICAO": "LTFG", - "elevation": "130", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "26": { - "magHeading": "260", - "ILS": "" - }, - "08": { - "magHeading": "080", - "ILS": "108.50" - } - } - ], - "length": "7500" - } - ] - }, - "Gecitkale": { - "ICAO": "LCGK", - "elevation": "148", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "27": { - "magHeading": "268", - "ILS": "" - }, - "09": { - "magHeading": "088", - "ILS": "108.50" - } - } - ], - "length": "9100" - } - ] - }, - "H3": { - "ICAO": "", - "elevation": "2583", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "11": { - "magHeading": "107", - "ILS": "" - }, - "29": { - "magHeading": "287", - "ILS": "" - } - } - ], - "length": "9500" - }, - { - "headings": [ - { - "24": { - "magHeading": "239", - "ILS": "" - }, - "06": { - "magHeading": "059", - "ILS": "" - } - } - ], - "length": "9800" - } - ] - }, - "H3 Northwest": { - "ICAO": "", - "elevation": "2582", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "12": { - "magHeading": "117", - "ILS": "" - }, - "30": { - "magHeading": "297", - "ILS": "" - } - } - ], - "length": "8000" - } - ] - }, - "H3 Southwest": { - "ICAO": "", - "elevation": "2671", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "12": { - "magHeading": "116", - "ILS": "" - }, - "30": { - "magHeading": "296", - "ILS": "" - } - } - ], - "length": "8000" - } - ] - }, - "H4": { - "ICAO": "OJHR", - "elevation": "2257", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "10": { - "magHeading": "098", - "ILS": "" - }, - "28": { - "magHeading": "278", - "ILS": "" - } - } - ], - "length": "8000" - } - ] - }, - "Haifa": { - "ICAO": "LLHA", - "elevation": "20", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "16": { - "magHeading": "157", - "ILS": "" - }, - "34": { - "magHeading": "337", - "ILS": "" - } - } - ], - "length": "3300" - } - ] - }, - "Hama": { - "ICAO": "OS58", - "elevation": "984", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "27": { - "magHeading": "275", - "ILS": "" - }, - "09": { - "magHeading": "095", - "ILS": "" - } - } - ], - "length": "8600" - } - ] - }, - "Hatay": { - "ICAO": "LTDA", - "elevation": "253", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "22": { - "magHeading": "219", - "ILS": "" - }, - "04": { - "magHeading": "039", - "ILS": "108.90" - } - } - ], - "length": "9600" - } - ] - }, - "Incirlik": { - "ICAO": "LTAG", - "elevation": "230", - "TACAN": "21X", - "runways": [ - { - "headings": [ - { - "23": { - "magHeading": "229", - "ILS": "111.70" - }, - "05": { - "magHeading": "049", - "ILS": "109.30" - } - } - ], - "length": "9500" - } - ] - }, - "Jirah": { - "ICAO": "OS62", - "elevation": "1173", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "10": { - "magHeading": "095", - "ILS": "" - }, - "28": { - "magHeading": "275", - "ILS": "" - } - } - ], - "length": "9600" - } - ] - }, - "Khalkhalah": { - "ICAO": "OS69", - "elevation": "2418", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "15": { - "magHeading": "146", - "ILS": "" - }, - "33": { - "magHeading": "326", - "ILS": "" - } - } - ], - "length": "8300" - }, - { - "headings": [ - { - "25": { - "magHeading": "251", - "ILS": "" - }, - "07": { - "magHeading": "071", - "ILS": "" - } - } - ], - "length": "9500" - } - ] - }, - "Kharab Ishk": { - "ICAO": "", - "elevation": "1416", - "TACAN": "", - "runways": [] - }, - "King Hussein Air College": { - "ICAO": "OJMF", - "elevation": "2205", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "13": { - "magHeading": "127", - "ILS": "" - }, - "31": { - "magHeading": "307", - "ILS": "" - } - } - ], - "length": "9500" - } - ] - }, - "Kingsfield": { - "ICAO": "LCRE", - "elevation": "276", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "24": { - "magHeading": "238", - "ILS": "" - }, - "06": { - "magHeading": "058", - "ILS": "" - } - } - ], - "length": "3300" - } - ] - }, - "Kiryat Shmona": { - "ICAO": "LLKS", - "elevation": "360", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "21": { - "magHeading": "213", - "ILS": "" - }, - "03": { - "magHeading": "033", - "ILS": "" - } - } - ], - "length": "3500" - } - ] - }, - "Kuweires": { - "ICAO": "OS66", - "elevation": "1201", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "10": { - "magHeading": "095", - "ILS": "" - }, - "28": { - "magHeading": "275", - "ILS": "" - } - } - ], - "length": "7700" - } - ] - }, - "Lakatamia": { - "ICAO": "", - "elevation": "758", - "TACAN": "", - "runways": [] - }, - "Larnaca": { - "ICAO": "LCRE", - "elevation": "16", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "22": { - "magHeading": "223", - "ILS": "110.30" - }, - "04": { - "magHeading": "043", - "ILS": "" - } - } - ], - "length": "8800" - } - ] - }, - "London": { - "ICAO": "", - "elevation": "", - "TACAN": "", - "runways": [] - }, - "Marj as Sultan North": { - "ICAO": "", - "elevation": "2008", - "TACAN": "", - "runways": [] - }, - "Marj as Sultan South": { - "ICAO": "", - "elevation": "2008", - "TACAN": "", - "runways": [] - }, - "Marj Ruhayyil": { - "ICAO": "OS63", - "elevation": "2161", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "06L": { - "magHeading": "059", - "ILS": "" - }, - "24R": { - "magHeading": "239", - "ILS": "" - } - } - ], - "length": "9400" - }, - { - "headings": [ - { - "06R": { - "magHeading": "059", - "ILS": "" - }, - "24L": { - "magHeading": "239", - "ILS": "" - } - } - ], - "length": "8400" - } - ] - }, - "Megiddo": { - "ICAO": "LLMG", - "elevation": "180", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "27": { - "magHeading": "268", - "ILS": "" - }, - "09": { - "magHeading": "088", - "ILS": "" - } - } - ], - "length": "6200" - } - ] - }, - "Mezzeh": { - "ICAO": "OS67", - "elevation": "2387", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "24": { - "magHeading": "236", - "ILS": "" - }, - "06": { - "magHeading": "056", - "ILS": "" - } - } - ], - "length": "8800" - } - ] - }, - "Minakh": { - "ICAO": "OS71", - "elevation": "1614", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "10": { - "magHeading": "096", - "ILS": "" - }, - "28": { - "magHeading": "276", - "ILS": "" - } - } - ], - "length": "4500" - } - ] - }, - "Naqoura": { - "ICAO": "", - "elevation": "381", - "TACAN": "", - "runways": [] - }, - "Nicosia": { - "ICAO": "", - "elevation": "722", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "09": { - "magHeading": "092", - "ILS": "" - }, - "27": { - "magHeading": "272", - "ILS": "" - } - } - ], - "length": "5791" - }, - { - "headings": [ - { - "14": { - "magHeading": "148", - "ILS": "" - }, - "27": { - "magHeading": "228", - "ILS": "" - } - } - ], - "length": "8385" - } - ] - }, - "Palmyra": { - "ICAO": "OSPR", - "elevation": "1325", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "26": { - "magHeading": "259", - "ILS": "" - }, - "08": { - "magHeading": "079", - "ILS": "" - } - } - ], - "length": "9200" - } - ] - }, - "Paphos": { - "ICAO": "LCPH", - "elevation": "40", - "TACAN": "79X", - "runways": [ - { - "headings": [ - { - "11": { - "magHeading": "109", - "ILS": "" - }, - "29": { - "magHeading": "289", - "ILS": "108.90" - } - } - ], - "length": "8600" - } - ] - }, - "Pinarbashi": { - "ICAO": "", - "elevation": "771", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "16": { - "magHeading": "167", - "ILS": "" - }, - "34": { - "magHeading": "347", - "ILS": "" - } - } - ], - "length": "3577" - } - ] - }, - "Qabr as Sitt": { - "ICAO": "", - "elevation": "2135", - "TACAN": "", - "runways": [] - }, - "Ramat David": { - "ICAO": "LLRD", - "elevation": "146", - "TACAN": "84X", - "runways": [ - { - "headings": [ - { - "11": { - "magHeading": "105", - "ILS": "" - }, - "29": { - "magHeading": "285", - "ILS": "" - } - } - ], - "length": "7700" - }, - { - "headings": [ - { - "15": { - "magHeading": "141", - "ILS": "" - }, - "33": { - "magHeading": "321", - "ILS": "111.10" - } - } - ], - "length": "7700" - }, - { - "headings": [ - { - "27": { - "magHeading": "264", - "ILS": "" - }, - "09": { - "magHeading": "084", - "ILS": "" - } - } - ], - "length": "7600" - } - ] - }, - "Rayak": { - "ICAO": "OLRA", - "elevation": "3035", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "22": { - "magHeading": "222", - "ILS": "" - }, - "04": { - "magHeading": "042", - "ILS": "" - } - } - ], - "length": "9400" - } - ] - }, - "Rene Mouawad": { - "ICAO": "OLKA", - "elevation": "23", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "24": { - "magHeading": "238", - "ILS": "" - }, - "06": { - "magHeading": "058", - "ILS": "" - } - } - ], - "length": "9000" - } - ] - }, - "Rosh Pina": { - "ICAO": "LLIB", - "elevation": "914", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "15": { - "magHeading": "147", - "ILS": "" - }, - "33": { - "magHeading": "327", - "ILS": "" - } - } - ], - "length": "2900" - }, - { - "headings": [ - { - "23": { - "magHeading": "229", - "ILS": "" - }, - "05": { - "magHeading": "049", - "ILS": "" - } - } - ], - "length": "3200" - } - ] - }, - "Ruwayshid": { - "ICAO": "", - "elevation": "2980", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "27": { - "magHeading": "271", - "ILS": "" - }, - "09": { - "magHeading": "091", - "ILS": "" - } - } - ], - "length": "7000" - } - ] - }, - "Sanliurfa": { - "ICAO": "LTCS", - "elevation": "2703", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "22": { - "magHeading": "216", - "ILS": "" - }, - "04": { - "magHeading": "036", - "ILS": "" - } - } - ], - "length": "12900" - } - ] - }, - "Sayqal": { - "ICAO": "OS68", - "elevation": "2274", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "23": { - "magHeading": "235", - "ILS": "" - }, - "05": { - "magHeading": "055", - "ILS": "" - } - } - ], - "length": "7600" - }, - { - "headings": [ - { - "26": { - "magHeading": "265", - "ILS": "" - }, - "08": { - "magHeading": "085", - "ILS": "" - } - } - ], - "length": "9500" - } - ] - }, - "Shayrat": { - "ICAO": "OS65", - "elevation": "2638", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "11": { - "magHeading": "107", - "ILS": "" - }, - "29": { - "magHeading": "287", - "ILS": "" - } - } - ], - "length": "9300" - } - ] - }, - "Tabqa": { - "ICAO": "OS59", - "elevation": "1099", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "27": { - "magHeading": "268", - "ILS": "" - }, - "09": { - "magHeading": "088", - "ILS": "" - } - } - ], - "length": "9300" - } - ] - }, - "Taftanaz": { - "ICAO": "", - "elevation": "", - "TACAN": "", - "runways": [] - }, - "Tal Siman": { - "ICAO": "", - "elevation": "", - "TACAN": "", - "runways": [] - }, - "Tha'lah": { - "ICAO": "OS60", - "elevation": "2414", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "23": { - "magHeading": "233", - "ILS": "" - }, - "05": { - "magHeading": "053", - "ILS": "" - } - } - ], - "length": "9500" - } - ] - }, - "Tiyas": { - "ICAO": "OS72", - "elevation": "1798", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "27": { - "magHeading": "265", - "ILS": "" - }, - "09": { - "magHeading": "085", - "ILS": "" - } - } - ], - "length": "9500" - } - ] - }, - "Wujah Al Hajar": { - "ICAO": "Z190", - "elevation": "641", - "TACAN": "", - "runways": [ - { - "headings": [ - { - "20": { - "magHeading": "204", - "ILS": "" - }, - "02": { - "magHeading": "024", - "ILS": "" - } - } - ], - "length": "4800" - } - ] - } - } +{ + "airfields": { + "Abu al-Duhur": { + "ICAO": "OS57", + "elevation": "820", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "268", + "ILS": "" + }, + "09": { + "magHeading": "088", + "ILS": "" + } + } + ], + "length": "9200" + } + ] + }, + "Adana Sakirpasa": { + "ICAO": "LTAF", + "elevation": "56", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "23": { + "magHeading": "230", + "ILS": "" + }, + "05": { + "magHeading": "050", + "ILS": "108.70" + } + } + ], + "length": "8800" + } + ] + }, + "Akrotiri": { + "ICAO": "LCRA", + "elevation": "69", + "TACAN": "107X", + "runways": [ + { + "headings": [ + { + "10": { + "magHeading": "106", + "ILS": "" + }, + "28": { + "magHeading": "286", + "ILS": "109.70" + } + } + ], + "length": "8800" + } + ] + }, + "Al Qusayr": { + "ICAO": "OS70", + "elevation": "1729", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "10": { + "magHeading": "096", + "ILS": "" + }, + "28": { + "magHeading": "276", + "ILS": "" + } + } + ], + "length": "9500" + } + ] + }, + "Al-Dumayr": { + "ICAO": "OS61", + "elevation": "2067", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "24": { + "magHeading": "240", + "ILS": "" + }, + "06": { + "magHeading": "060", + "ILS": "" + } + } + ], + "length": "9500" + } + ] + }, + "Aleppo": { + "ICAO": "OSAP", + "elevation": "1254", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "272", + "ILS": "" + }, + "09": { + "magHeading": "092", + "ILS": "" + } + } + ], + "length": "9200" + } + ] + }, + "An Nasiriyah": { + "ICAO": "OSAP", + "elevation": "1254", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "272", + "ILS": "" + }, + "09": { + "magHeading": "092", + "ILS": "" + } + } + ], + "length": "9200" + } + ] + }, + "At Tanf": { + "ICAO": "", + "elevation": "2329", + "TACAN": "", + "runways": [] + }, + "Bassel Al-Assad": { + "ICAO": "OSLK", + "elevation": "92", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "17L": { + "magHeading": "173", + "ILS": "" + }, + "35R": { + "magHeading": "353", + "ILS": "" + } + } + ], + "length": "7900" + }, + { + "headings": [ + { + "17R": { + "magHeading": "173", + "ILS": "109.10" + }, + "35L": { + "magHeading": "353", + "ILS": "" + } + } + ], + "length": "8900" + } + ] + }, + "Beirut-Rafic Hariri": { + "ICAO": "OLBA", + "elevation": "39", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "16": { + "magHeading": "164", + "ILS": "110.10" + }, + "34": { + "magHeading": "344", + "ILS": "" + } + } + ], + "length": "10300" + }, + { + "headings": [ + { + "17": { + "magHeading": "174", + "ILS": "109.50" + }, + "35": { + "magHeading": "354", + "ILS": "" + } + } + ], + "length": "7600" + }, + { + "headings": [ + { + "21": { + "magHeading": "210", + "ILS": "" + }, + "03": { + "magHeading": "030", + "ILS": "110.70" + } + } + ], + "length": "7000" + } + ] + }, + "Damascus": { + "ICAO": "OSDI", + "elevation": "2008", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "05L": { + "magHeading": "045", + "ILS": "" + }, + "23R": { + "magHeading": "225", + "ILS": "109.90" + } + } + ], + "length": "11600" + }, + { + "headings": [ + { + "05R": { + "magHeading": "045", + "ILS": "111.10" + }, + "23L": { + "magHeading": "225", + "ILS": "" + } + } + ], + "length": "11600" + } + ] + }, + "Deir ez-Zor": { + "ICAO": "OSDZ", + "elevation": "713", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "10": { + "magHeading": "104", + "ILS": "" + }, + "28": { + "magHeading": "284", + "ILS": "" + } + } + ], + "length": "9500" + } + ] + }, + "Ercan": { + "ICAO": "LCEN", + "elevation": "312", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "11": { + "magHeading": "110", + "ILS": "" + }, + "29": { + "magHeading": "290", + "ILS": "108.30" + } + } + ], + "length": "8700" + } + ] + }, + "Eyn Shemer": { + "ICAO": "LLES", + "elevation": "110", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "2750", + "ILS": "" + }, + "09": { + "magHeading": "095", + "ILS": "" + } + } + ], + "length": "4000" + } + ] + }, + "Gaziantep": { + "ICAO": "LTAJ", + "elevation": "2290", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "10": { + "magHeading": "100", + "ILS": "" + }, + "28": { + "magHeading": "280", + "ILS": "109.10" + } + } + ], + "length": "9100" + } + ] + }, + "Gazipasa": { + "ICAO": "LTFG", + "elevation": "130", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "26": { + "magHeading": "260", + "ILS": "" + }, + "08": { + "magHeading": "080", + "ILS": "108.50" + } + } + ], + "length": "7500" + } + ] + }, + "Gecitkale": { + "ICAO": "LCGK", + "elevation": "148", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "268", + "ILS": "" + }, + "09": { + "magHeading": "088", + "ILS": "108.50" + } + } + ], + "length": "9100" + } + ] + }, + "H3": { + "ICAO": "", + "elevation": "2583", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "11": { + "magHeading": "107", + "ILS": "" + }, + "29": { + "magHeading": "287", + "ILS": "" + } + } + ], + "length": "9500" + }, + { + "headings": [ + { + "24": { + "magHeading": "239", + "ILS": "" + }, + "06": { + "magHeading": "059", + "ILS": "" + } + } + ], + "length": "9800" + } + ] + }, + "H3 Northwest": { + "ICAO": "", + "elevation": "2582", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "12": { + "magHeading": "117", + "ILS": "" + }, + "30": { + "magHeading": "297", + "ILS": "" + } + } + ], + "length": "8000" + } + ] + }, + "H3 Southwest": { + "ICAO": "", + "elevation": "2671", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "12": { + "magHeading": "116", + "ILS": "" + }, + "30": { + "magHeading": "296", + "ILS": "" + } + } + ], + "length": "8000" + } + ] + }, + "H4": { + "ICAO": "OJHR", + "elevation": "2257", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "10": { + "magHeading": "098", + "ILS": "" + }, + "28": { + "magHeading": "278", + "ILS": "" + } + } + ], + "length": "8000" + } + ] + }, + "Haifa": { + "ICAO": "LLHA", + "elevation": "20", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "16": { + "magHeading": "157", + "ILS": "" + }, + "34": { + "magHeading": "337", + "ILS": "" + } + } + ], + "length": "3300" + } + ] + }, + "Hama": { + "ICAO": "OS58", + "elevation": "984", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "275", + "ILS": "" + }, + "09": { + "magHeading": "095", + "ILS": "" + } + } + ], + "length": "8600" + } + ] + }, + "Hatay": { + "ICAO": "LTDA", + "elevation": "253", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "22": { + "magHeading": "219", + "ILS": "" + }, + "04": { + "magHeading": "039", + "ILS": "108.90" + } + } + ], + "length": "9600" + } + ] + }, + "Incirlik": { + "ICAO": "LTAG", + "elevation": "230", + "TACAN": "21X", + "runways": [ + { + "headings": [ + { + "23": { + "magHeading": "229", + "ILS": "111.70" + }, + "05": { + "magHeading": "049", + "ILS": "109.30" + } + } + ], + "length": "9500" + } + ] + }, + "Jirah": { + "ICAO": "OS62", + "elevation": "1173", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "10": { + "magHeading": "095", + "ILS": "" + }, + "28": { + "magHeading": "275", + "ILS": "" + } + } + ], + "length": "9600" + } + ] + }, + "Khalkhalah": { + "ICAO": "OS69", + "elevation": "2418", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "15": { + "magHeading": "146", + "ILS": "" + }, + "33": { + "magHeading": "326", + "ILS": "" + } + } + ], + "length": "8300" + }, + { + "headings": [ + { + "25": { + "magHeading": "251", + "ILS": "" + }, + "07": { + "magHeading": "071", + "ILS": "" + } + } + ], + "length": "9500" + } + ] + }, + "Kharab Ishk": { + "ICAO": "", + "elevation": "1416", + "TACAN": "", + "runways": [] + }, + "King Hussein Air College": { + "ICAO": "OJMF", + "elevation": "2205", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "13": { + "magHeading": "127", + "ILS": "" + }, + "31": { + "magHeading": "307", + "ILS": "" + } + } + ], + "length": "9500" + } + ] + }, + "Kingsfield": { + "ICAO": "LCRE", + "elevation": "276", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "24": { + "magHeading": "238", + "ILS": "" + }, + "06": { + "magHeading": "058", + "ILS": "" + } + } + ], + "length": "3300" + } + ] + }, + "Kiryat Shmona": { + "ICAO": "LLKS", + "elevation": "360", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "21": { + "magHeading": "213", + "ILS": "" + }, + "03": { + "magHeading": "033", + "ILS": "" + } + } + ], + "length": "3500" + } + ] + }, + "Kuweires": { + "ICAO": "OS66", + "elevation": "1201", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "10": { + "magHeading": "095", + "ILS": "" + }, + "28": { + "magHeading": "275", + "ILS": "" + } + } + ], + "length": "7700" + } + ] + }, + "Lakatamia": { + "ICAO": "", + "elevation": "758", + "TACAN": "", + "runways": [] + }, + "Larnaca": { + "ICAO": "LCRE", + "elevation": "16", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "22": { + "magHeading": "223", + "ILS": "110.30" + }, + "04": { + "magHeading": "043", + "ILS": "" + } + } + ], + "length": "8800" + } + ] + }, + "London": { + "ICAO": "", + "elevation": "", + "TACAN": "", + "runways": [] + }, + "Marj as Sultan North": { + "ICAO": "", + "elevation": "2008", + "TACAN": "", + "runways": [] + }, + "Marj as Sultan South": { + "ICAO": "", + "elevation": "2008", + "TACAN": "", + "runways": [] + }, + "Marj Ruhayyil": { + "ICAO": "OS63", + "elevation": "2161", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "06L": { + "magHeading": "059", + "ILS": "" + }, + "24R": { + "magHeading": "239", + "ILS": "" + } + } + ], + "length": "9400" + }, + { + "headings": [ + { + "06R": { + "magHeading": "059", + "ILS": "" + }, + "24L": { + "magHeading": "239", + "ILS": "" + } + } + ], + "length": "8400" + } + ] + }, + "Megiddo": { + "ICAO": "LLMG", + "elevation": "180", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "268", + "ILS": "" + }, + "09": { + "magHeading": "088", + "ILS": "" + } + } + ], + "length": "6200" + } + ] + }, + "Mezzeh": { + "ICAO": "OS67", + "elevation": "2387", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "24": { + "magHeading": "236", + "ILS": "" + }, + "06": { + "magHeading": "056", + "ILS": "" + } + } + ], + "length": "8800" + } + ] + }, + "Minakh": { + "ICAO": "OS71", + "elevation": "1614", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "10": { + "magHeading": "096", + "ILS": "" + }, + "28": { + "magHeading": "276", + "ILS": "" + } + } + ], + "length": "4500" + } + ] + }, + "Naqoura": { + "ICAO": "", + "elevation": "381", + "TACAN": "", + "runways": [] + }, + "Nicosia": { + "ICAO": "", + "elevation": "722", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "09": { + "magHeading": "092", + "ILS": "" + }, + "27": { + "magHeading": "272", + "ILS": "" + } + } + ], + "length": "5791" + }, + { + "headings": [ + { + "14": { + "magHeading": "148", + "ILS": "" + }, + "27": { + "magHeading": "228", + "ILS": "" + } + } + ], + "length": "8385" + } + ] + }, + "Palmyra": { + "ICAO": "OSPR", + "elevation": "1325", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "26": { + "magHeading": "259", + "ILS": "" + }, + "08": { + "magHeading": "079", + "ILS": "" + } + } + ], + "length": "9200" + } + ] + }, + "Paphos": { + "ICAO": "LCPH", + "elevation": "40", + "TACAN": "79X", + "runways": [ + { + "headings": [ + { + "11": { + "magHeading": "109", + "ILS": "" + }, + "29": { + "magHeading": "289", + "ILS": "108.90" + } + } + ], + "length": "8600" + } + ] + }, + "Pinarbashi": { + "ICAO": "", + "elevation": "771", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "16": { + "magHeading": "167", + "ILS": "" + }, + "34": { + "magHeading": "347", + "ILS": "" + } + } + ], + "length": "3577" + } + ] + }, + "Qabr as Sitt": { + "ICAO": "", + "elevation": "2135", + "TACAN": "", + "runways": [] + }, + "Ramat David": { + "ICAO": "LLRD", + "elevation": "146", + "TACAN": "84X", + "runways": [ + { + "headings": [ + { + "11": { + "magHeading": "105", + "ILS": "" + }, + "29": { + "magHeading": "285", + "ILS": "" + } + } + ], + "length": "7700" + }, + { + "headings": [ + { + "15": { + "magHeading": "141", + "ILS": "" + }, + "33": { + "magHeading": "321", + "ILS": "111.10" + } + } + ], + "length": "7700" + }, + { + "headings": [ + { + "27": { + "magHeading": "264", + "ILS": "" + }, + "09": { + "magHeading": "084", + "ILS": "" + } + } + ], + "length": "7600" + } + ] + }, + "Rayak": { + "ICAO": "OLRA", + "elevation": "3035", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "22": { + "magHeading": "222", + "ILS": "" + }, + "04": { + "magHeading": "042", + "ILS": "" + } + } + ], + "length": "9400" + } + ] + }, + "Rene Mouawad": { + "ICAO": "OLKA", + "elevation": "23", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "24": { + "magHeading": "238", + "ILS": "" + }, + "06": { + "magHeading": "058", + "ILS": "" + } + } + ], + "length": "9000" + } + ] + }, + "Rosh Pina": { + "ICAO": "LLIB", + "elevation": "914", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "15": { + "magHeading": "147", + "ILS": "" + }, + "33": { + "magHeading": "327", + "ILS": "" + } + } + ], + "length": "2900" + }, + { + "headings": [ + { + "23": { + "magHeading": "229", + "ILS": "" + }, + "05": { + "magHeading": "049", + "ILS": "" + } + } + ], + "length": "3200" + } + ] + }, + "Ruwayshid": { + "ICAO": "", + "elevation": "2980", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "271", + "ILS": "" + }, + "09": { + "magHeading": "091", + "ILS": "" + } + } + ], + "length": "7000" + } + ] + }, + "Sanliurfa": { + "ICAO": "LTCS", + "elevation": "2703", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "22": { + "magHeading": "216", + "ILS": "" + }, + "04": { + "magHeading": "036", + "ILS": "" + } + } + ], + "length": "12900" + } + ] + }, + "Sayqal": { + "ICAO": "OS68", + "elevation": "2274", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "23": { + "magHeading": "235", + "ILS": "" + }, + "05": { + "magHeading": "055", + "ILS": "" + } + } + ], + "length": "7600" + }, + { + "headings": [ + { + "26": { + "magHeading": "265", + "ILS": "" + }, + "08": { + "magHeading": "085", + "ILS": "" + } + } + ], + "length": "9500" + } + ] + }, + "Shayrat": { + "ICAO": "OS65", + "elevation": "2638", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "11": { + "magHeading": "107", + "ILS": "" + }, + "29": { + "magHeading": "287", + "ILS": "" + } + } + ], + "length": "9300" + } + ] + }, + "Tabqa": { + "ICAO": "OS59", + "elevation": "1099", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "268", + "ILS": "" + }, + "09": { + "magHeading": "088", + "ILS": "" + } + } + ], + "length": "9300" + } + ] + }, + "Taftanaz": { + "ICAO": "", + "elevation": "", + "TACAN": "", + "runways": [] + }, + "Tal Siman": { + "ICAO": "", + "elevation": "", + "TACAN": "", + "runways": [] + }, + "Tha'lah": { + "ICAO": "OS60", + "elevation": "2414", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "23": { + "magHeading": "233", + "ILS": "" + }, + "05": { + "magHeading": "053", + "ILS": "" + } + } + ], + "length": "9500" + } + ] + }, + "Tiyas": { + "ICAO": "OS72", + "elevation": "1798", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "27": { + "magHeading": "265", + "ILS": "" + }, + "09": { + "magHeading": "085", + "ILS": "" + } + } + ], + "length": "9500" + } + ] + }, + "Wujah Al Hajar": { + "ICAO": "Z190", + "elevation": "641", + "TACAN": "", + "runways": [ + { + "headings": [ + { + "20": { + "magHeading": "204", + "ILS": "" + }, + "02": { + "magHeading": "024", + "ILS": "" + } + } + ], + "length": "4800" + } + ] + } + } } \ No newline at end of file diff --git a/client/public/databases/aircraftdatabase.json b/client/public/databases/units/aircraftdatabase.json similarity index 100% rename from client/public/databases/aircraftdatabase.json rename to client/public/databases/units/aircraftdatabase.json diff --git a/client/public/databases/groundunitdatabase.json b/client/public/databases/units/groundunitdatabase.json similarity index 100% rename from client/public/databases/groundunitdatabase.json rename to client/public/databases/units/groundunitdatabase.json diff --git a/client/public/databases/helicopterdatabase.json b/client/public/databases/units/helicopterdatabase.json similarity index 100% rename from client/public/databases/helicopterdatabase.json rename to client/public/databases/units/helicopterdatabase.json diff --git a/client/public/databases/iran-iraq_fictional/aircraftdatabase.json b/client/public/databases/units/iran-iraq_fictional/aircraftdatabase.json similarity index 100% rename from client/public/databases/iran-iraq_fictional/aircraftdatabase.json rename to client/public/databases/units/iran-iraq_fictional/aircraftdatabase.json diff --git a/client/public/databases/iran-iraq_fictional/groundunitdatabase.json b/client/public/databases/units/iran-iraq_fictional/groundunitdatabase.json similarity index 100% rename from client/public/databases/iran-iraq_fictional/groundunitdatabase.json rename to client/public/databases/units/iran-iraq_fictional/groundunitdatabase.json diff --git a/client/public/databases/iran-iraq_fictional/helicopterdatabase.json b/client/public/databases/units/iran-iraq_fictional/helicopterdatabase.json similarity index 100% rename from client/public/databases/iran-iraq_fictional/helicopterdatabase.json rename to client/public/databases/units/iran-iraq_fictional/helicopterdatabase.json diff --git a/client/public/databases/iran-iraq_fictional/navyunitdatabase.json b/client/public/databases/units/iran-iraq_fictional/navyunitdatabase.json similarity index 100% rename from client/public/databases/iran-iraq_fictional/navyunitdatabase.json rename to client/public/databases/units/iran-iraq_fictional/navyunitdatabase.json diff --git a/client/public/databases/navyunitdatabase.json b/client/public/databases/units/navyunitdatabase.json similarity index 100% rename from client/public/databases/navyunitdatabase.json rename to client/public/databases/units/navyunitdatabase.json diff --git a/client/public/stylesheets/olympus.css b/client/public/stylesheets/olympus.css index 25b77890..fabc3105 100644 --- a/client/public/stylesheets/olympus.css +++ b/client/public/stylesheets/olympus.css @@ -1074,10 +1074,6 @@ dl.ol-data-grid { row-gap: 4px; } -dl.ol-data-grid dd { - width: 60%; -} - dl.ol-data-grid dt.icon { text-indent: 10px; } diff --git a/client/public/stylesheets/other/contextmenus.css b/client/public/stylesheets/other/contextmenus.css index 8ba2c64d..e292bf95 100644 --- a/client/public/stylesheets/other/contextmenus.css +++ b/client/public/stylesheets/other/contextmenus.css @@ -148,7 +148,7 @@ } #aircaft-loadout-list, -#helicopter-loadout-list { +#helicopter-loadout-list { align-content: center; display: flex; flex-direction: column; @@ -156,7 +156,7 @@ } #aircraft-unit-image, -#helicopter-unit-image { +#helicopter-unit-image { filter: invert(100%); height: 100px; margin-bottom: 10px; @@ -210,10 +210,10 @@ } .ol-context-menu .ol-slider-value { - color: var(--accent-light-blue); - cursor: pointer; - font-size: 14px; - font-weight: bold; + color: var(--accent-light-blue); + cursor: pointer; + font-size: 14px; + font-weight: bold; } .ol-context-menu .ol-slider-container { @@ -449,36 +449,41 @@ } /* Airbase context menu */ -#airbase-contextmenu #airbase-runways { - display:flex; - flex-direction: column; - row-gap:4px; +#airbase-chart-data dd { + width: 60%; + font-weight: bold; } -#airbase-contextmenu #airbase-runways > .runway { - border:1px solid #ccc; - display:flex; +#airbase-runways { + display: flex; + flex-direction: column; + row-gap: 4px; +} + +#airbase-runways>.runway { + border: 1px solid #ccc; + display: flex; flex-direction: row; justify-content: space-between; } -#airbase-contextmenu #airbase-runways > .runway abbr { - cursor:help; +#airbase-runways>.runway abbr { + cursor: help; text-decoration: none; } -#airbase-contextmenu #airbase-runways > .runway > .heading { +#airbase-runways>.runway>.heading { align-items: center; column-gap: 4px; - display:flex; + display: flex; flex-direction: row; } -#airbase-contextmenu #airbase-runways > .runway > .heading > abbr { - font-weight: var( --font-weight-bolder ); - padding:4px; +#airbase-runways>.runway>.heading>abbr { + font-weight: var(--font-weight-bolder); + padding: 4px; } -#airbase-contextmenu #airbase-runways > .runway > .heading:last-of-type { +#airbase-runways>.runway>.heading:last-of-type { flex-direction: row-reverse; } \ No newline at end of file diff --git a/client/routes/api/airbases.js b/client/routes/api/airbases.js index e283040f..1c12bae8 100644 --- a/client/routes/api/airbases.js +++ b/client/routes/api/airbases.js @@ -15,68 +15,46 @@ const allowedTheatres = [ "syria" ]; - function getAirbasesData( theatreName ) { - if ( !isValidTheatre( theatreName ) ) { return false; } - return JSON.parse( fs.readFileSync( `src/airfields/${theatreName}.json` ) ).airfields - + return JSON.parse( fs.readFileSync( `public/databases/airbases/${theatreName}.json` ) ).airfields } - function isValidTheatre( theatre ) { - return ( allowedTheatres.indexOf( theatre ) > -1 ) - } - function sendInvalidTheatre( res ) { - res.status( 400 ).send( "Missing/invalid theatre name; must be one of:\n\t" + allowedTheatres.join( "\n\t" ) ); - } - /**************************************************************************************************************/ // Endpoints /**************************************************************************************************************/ - - - app.get( "/", ( req, res ) => { - sendInvalidTheatre( res ); - }); - app.get( "/:theatreName/:airbaseName", ( req, res ) => { - const airbases = getAirbasesData( req.params.theatreName ); - if ( !airbases ) { sendInvalidTheatre( res ); return; } const airbaseName = req.params.airbaseName; - if ( !airbases.hasOwnProperty( airbaseName ) ) { res.status( 404 ).send( `Unknown airbase name "${airbaseName}". Available options are:\n\t` + Object.keys( airbases ).join( "\n\t" ) ); } else { res.status( 200 ).json( airbases[ airbaseName ] ); } - - }); app.get( "/:theatreName", ( req, res ) => { - const theatreName = req.params.theatreName.toLowerCase().replace( /\s*/g, "" ); const airbases = getAirbasesData( theatreName ); @@ -86,9 +64,6 @@ app.get( "/:theatreName", ( req, res ) => { } res.status( 200 ).json( airbases ); - }); - - module.exports = app; \ No newline at end of file diff --git a/client/src/@types/unit.d.ts b/client/src/@types/unit.d.ts index 94bb0e7d..aced0a44 100644 --- a/client/src/@types/unit.d.ts +++ b/client/src/@types/unit.d.ts @@ -9,7 +9,7 @@ interface ObjectIconOptions { showFuel: boolean, showAmmo: boolean, showSummary: boolean, - showCallsign: boolean, + showCallsign: boolean, rotateToHeading: boolean } @@ -48,7 +48,7 @@ interface Contact { } interface Offset { - x: number, - y: number, + x: number, + y: number, z: number } \ No newline at end of file diff --git a/client/src/mission/airbase.ts b/client/src/mission/airbase.ts index 35fbdc98..e1477acd 100644 --- a/client/src/mission/airbase.ts +++ b/client/src/mission/airbase.ts @@ -2,8 +2,7 @@ import { DivIcon } from 'leaflet'; import { CustomMarker } from '../map/custommarker'; import { SVGInjector } from '@tanem/svg-injector'; -export interface AirbaseOptions -{ +export interface AirbaseOptions { name: string, position: L.LatLng } @@ -28,8 +27,7 @@ export interface AirbaseChartRunwayHeadingData { } } -export class Airbase extends CustomMarker -{ +export class Airbase extends CustomMarker { #name: string = ""; #chartData: AirbaseChartData = { elevation: "", @@ -38,12 +36,11 @@ export class Airbase extends CustomMarker runways: [] }; #coalition: string = ""; - #hasChartDataBeenSet:boolean = false; + #hasChartDataBeenSet: boolean = false; #properties: string[] = []; #parkings: string[] = []; - constructor(options: AirbaseOptions) - { + constructor(options: AirbaseOptions) { super(options.position, { riseOnHover: true }); this.#name = options.name; @@ -54,12 +51,12 @@ export class Airbase extends CustomMarker } createIcon() { - var icon = new DivIcon({ + var icon = new DivIcon({ className: 'leaflet-airbase-marker', iconSize: [40, 40], iconAnchor: [20, 20] - }); // Set the marker, className must be set to avoid white square - this.setIcon(icon); + }); // Set the marker, className must be set to avoid white square + this.setIcon(icon); var el = document.createElement("div"); el.classList.add("airbase-icon"); @@ -72,55 +69,45 @@ export class Airbase extends CustomMarker el.dataset.coalition = this.#coalition; } - setCoalition(coalition: string) - { + setCoalition(coalition: string) { this.#coalition = coalition; - ( this.getElement()?.querySelector(".airbase-icon")).dataset.coalition = this.#coalition; + (this.getElement()?.querySelector(".airbase-icon")).dataset.coalition = this.#coalition; } - getChartData() - { + getChartData() { return this.#chartData; } - getCoalition() - { + getCoalition() { return this.#coalition; } - setName(name: string) - { + setName(name: string) { this.#name = name; } - getName() - { + getName() { return this.#name; } - setChartData( chartData:AirbaseChartData ) - { + setChartData(chartData: AirbaseChartData) { this.#hasChartDataBeenSet = true; - this.#chartData = chartData; + this.#chartData = chartData; } - setProperties(properties: string[]) - { + setProperties(properties: string[]) { this.#properties = properties; } - getProperties() - { + getProperties() { return this.#properties; } - setParkings(parkings: string[]) - { + setParkings(parkings: string[]) { this.#parkings = parkings; } - getParkings() - { + getParkings() { return this.#parkings; } } \ No newline at end of file diff --git a/client/src/mission/missionhandler.ts b/client/src/mission/missionhandler.ts index ebadaa82..301f312a 100644 --- a/client/src/mission/missionhandler.ts +++ b/client/src/mission/missionhandler.ts @@ -49,17 +49,18 @@ export class MissionHandler { updateAirbases(data: AirbasesData) { for (let idx in data.airbases) { var airbase = data.airbases[idx] - if (this.#airbases[idx] === undefined && airbase.callsign != '') { - this.#airbases[idx] = new Airbase({ + if (this.#airbases[airbase.callsign] === undefined && airbase.callsign != '') { + this.#airbases[airbase.callsign] = new Airbase({ position: new LatLng(airbase.latitude, airbase.longitude), name: airbase.callsign }).addTo(getMap()); - this.#airbases[idx].on('contextmenu', (e) => this.#onAirbaseClick(e)); + this.#airbases[airbase.callsign].on('contextmenu', (e) => this.#onAirbaseClick(e)); + this.#loadAirbaseChartData(airbase.callsign); } - if (this.#airbases[idx] != undefined && airbase.latitude && airbase.longitude && airbase.coalition) { - this.#airbases[idx].setLatLng(new LatLng(airbase.latitude, airbase.longitude)); - this.#airbases[idx].setCoalition(airbase.coalition); + if (this.#airbases[airbase.callsign] != undefined && airbase.latitude && airbase.longitude && airbase.coalition) { + this.#airbases[airbase.callsign].setLatLng(new LatLng(airbase.latitude, airbase.longitude)); + this.#airbases[airbase.callsign].setCoalition(airbase.coalition); } } } @@ -72,8 +73,6 @@ export class MissionHandler { this.#theatre = data.mission.theatre; getMap().setTheatre(this.#theatre); getInfoPopup().setText("Map set to " + this.#theatre); - - this.#loadAirbaseChartData(); } /* Set the date and time data */ @@ -235,32 +234,23 @@ export class MissionHandler { getMap().showAirbaseContextMenu(e.originalEvent.x, e.originalEvent.y, e.latlng, e.sourceTarget); } - #loadAirbaseChartData() { + #loadAirbaseChartData(callsign: string) { if ( !this.#theatre ) { return; } - - fetch( '/api/airbases/' + this.#theatre , { - method: 'GET', - headers: { - 'Accept': '*/*', - 'Content-Type': 'application/json' + + var xhr = new XMLHttpRequest(); + xhr.open('GET', `api/airbases/${this.#theatre.toLowerCase()}/${callsign}`, true); + xhr.responseType = 'json'; + xhr.onload = () => { + var status = xhr.status; + if (status === 200) { + const data = xhr.response; + this.getAirbases()[callsign].setChartData(data); + } else { + console.error(`Error retrieving data for ${callsign} airbase`) } - }) - .then( response => response.json() ) - .then( data => { - - for ( const [ id, airbase ] of Object.entries( this.#airbases ) ) { - - let airbaseName = airbase.getName(); - - if ( data.hasOwnProperty( airbaseName ) ) { - airbase.setChartData( data[ airbaseName ] ); - } else { - console.error( `Airbase "${airbaseName}" not found in chart data.` ); - } - } - - }); + }; + xhr.send(); } } \ No newline at end of file diff --git a/client/src/unit/aircraftdatabase.ts b/client/src/unit/aircraftdatabase.ts index f7781ef3..d3f4e5cb 100644 --- a/client/src/unit/aircraftdatabase.ts +++ b/client/src/unit/aircraftdatabase.ts @@ -4,7 +4,7 @@ import { UnitDatabase } from "./unitdatabase" export class AircraftDatabase extends UnitDatabase { constructor() { - super('databases/aircraftdatabase.json'); + super('databases/units/aircraftdatabase.json'); } getCategory() { diff --git a/client/src/unit/groundunitdatabase.ts b/client/src/unit/groundunitdatabase.ts index ea17316d..2a8d7c5f 100644 --- a/client/src/unit/groundunitdatabase.ts +++ b/client/src/unit/groundunitdatabase.ts @@ -4,7 +4,7 @@ import { UnitDatabase } from "./unitdatabase" export class GroundUnitDatabase extends UnitDatabase { constructor() { - super('databases/groundunitdatabase.json'); + super('databases/units/groundunitdatabase.json'); } getSpawnPointsByName(name: string) { diff --git a/client/src/unit/helicopterdatabase.ts b/client/src/unit/helicopterdatabase.ts index 362de71b..031e9ad8 100644 --- a/client/src/unit/helicopterdatabase.ts +++ b/client/src/unit/helicopterdatabase.ts @@ -4,7 +4,7 @@ import { UnitDatabase } from "./unitdatabase" export class HelicopterDatabase extends UnitDatabase { constructor() { - super('databases/helicopterdatabase.json'); + super('databases/units/helicopterdatabase.json'); } getSpawnPointsByName(name: string) { diff --git a/client/src/unit/navyunitdatabase.ts b/client/src/unit/navyunitdatabase.ts index 5e5f7cde..5f113943 100644 --- a/client/src/unit/navyunitdatabase.ts +++ b/client/src/unit/navyunitdatabase.ts @@ -4,7 +4,7 @@ import { UnitDatabase } from "./unitdatabase" export class NavyUnitDatabase extends UnitDatabase { constructor() { - super('databases/navyunitdatabase.json'); + super('databases/units/navyunitdatabase.json'); } getSpawnPointsByName(name: string) { From 9db07b2ff84cdc0c2674cc51fd4077baf0ee5fc7 Mon Sep 17 00:00:00 2001 From: Pax1601 Date: Tue, 15 Aug 2023 15:02:49 +0200 Subject: [PATCH 6/7] Reordered scripts folder --- scripts/{ => examples}/baseFunctions.lua | 0 scripts/{ => examples}/coals.lua | 92 +- scripts/{ => examples}/coolEffects.lua | 608 ++++---- scripts/{ => examples}/dynamicTanking.lua | 1360 ++++++++--------- scripts/{ => examples}/forceBubble.lua | 222 +-- .../{ => examples}/laserDiscoDiscoLaser.lua | 40 +- scripts/{ => examples}/parrotSpeak.lua | 368 ++--- scripts/{ => examples}/poleGen.lua | 1256 +++++++-------- scripts/{ => examples}/raisedShots.lua | 636 ++++---- scripts/{ => examples}/samSimulator.lua | 1078 ++++++------- scripts/payloadNames.js | 1 - scripts/{ => python}/generatePayloadTables.py | 0 scripts/{ => python}/payLoadConverter.py | 0 13 files changed, 2830 insertions(+), 2831 deletions(-) rename scripts/{ => examples}/baseFunctions.lua (100%) rename scripts/{ => examples}/coals.lua (96%) rename scripts/{ => examples}/coolEffects.lua (98%) rename scripts/{ => examples}/dynamicTanking.lua (97%) rename scripts/{ => examples}/forceBubble.lua (96%) rename scripts/{ => examples}/laserDiscoDiscoLaser.lua (96%) rename scripts/{ => examples}/parrotSpeak.lua (97%) rename scripts/{ => examples}/poleGen.lua (96%) rename scripts/{ => examples}/raisedShots.lua (96%) rename scripts/{ => examples}/samSimulator.lua (98%) delete mode 100644 scripts/payloadNames.js rename scripts/{ => python}/generatePayloadTables.py (100%) rename scripts/{ => python}/payLoadConverter.py (100%) diff --git a/scripts/baseFunctions.lua b/scripts/examples/baseFunctions.lua similarity index 100% rename from scripts/baseFunctions.lua rename to scripts/examples/baseFunctions.lua diff --git a/scripts/coals.lua b/scripts/examples/coals.lua similarity index 96% rename from scripts/coals.lua rename to scripts/examples/coals.lua index 445e1473..e37127d1 100644 --- a/scripts/coals.lua +++ b/scripts/examples/coals.lua @@ -1,47 +1,47 @@ -coal = {} - -function coal.notify(message, displayFor) - trigger.action.outText(message, displayFor) -end - -function coal.listRed() - coal.coals = env.mission.coalitions.red --solid naming this - coal.notify(mist.utils.tableShow(coal.coals),5) - pickOne = math.random(#coal.coals) - countryIs = country.name[coal.coals[pickOne]] - coal.notify(countryIs,10) -end - -function coal.listBlue() - coal.coals = env.mission.coalitions.blue --solid naming this - coal.notify(mist.utils.tableShow(coal.coals),5) - pickOne = math.random(#coal.coals) - countryIs = country.name[coal.coals[pickOne]] - coal.notify(countryIs,10) -end - -function coal.listNeutrals() - coal.coals = env.mission.coalitions.neutrals --solid naming this - coal.notify(mist.utils.tableShow(coal.coals),5) - pickOne = math.random(#coal.coals) - countryIs = country.name[coal.coals[pickOne]] - coal.notify(countryIs,10) -end - - -do - longRangeShots = missionCommands.addSubMenu("Coal check") - missionCommands.addCommand ("List reds", longRangeShots, coal.listRed) - missionCommands.addCommand ("List blue", longRangeShots, coal.listBlue) - missionCommands.addCommand ("List neutrals", longRangeShots, coal.listNeutrals) - -end - -coal.notify("coals.lua loaded", 2) - - --- env.mission.coalitions.red --- env.mission.coalitions.blue --- env.mission.coalitions.neutrals - +coal = {} + +function coal.notify(message, displayFor) + trigger.action.outText(message, displayFor) +end + +function coal.listRed() + coal.coals = env.mission.coalitions.red --solid naming this + coal.notify(mist.utils.tableShow(coal.coals),5) + pickOne = math.random(#coal.coals) + countryIs = country.name[coal.coals[pickOne]] + coal.notify(countryIs,10) +end + +function coal.listBlue() + coal.coals = env.mission.coalitions.blue --solid naming this + coal.notify(mist.utils.tableShow(coal.coals),5) + pickOne = math.random(#coal.coals) + countryIs = country.name[coal.coals[pickOne]] + coal.notify(countryIs,10) +end + +function coal.listNeutrals() + coal.coals = env.mission.coalitions.neutrals --solid naming this + coal.notify(mist.utils.tableShow(coal.coals),5) + pickOne = math.random(#coal.coals) + countryIs = country.name[coal.coals[pickOne]] + coal.notify(countryIs,10) +end + + +do + longRangeShots = missionCommands.addSubMenu("Coal check") + missionCommands.addCommand ("List reds", longRangeShots, coal.listRed) + missionCommands.addCommand ("List blue", longRangeShots, coal.listBlue) + missionCommands.addCommand ("List neutrals", longRangeShots, coal.listNeutrals) + +end + +coal.notify("coals.lua loaded", 2) + + +-- env.mission.coalitions.red +-- env.mission.coalitions.blue +-- env.mission.coalitions.neutrals + --coalition.getCountryCoalition(countryID) \ No newline at end of file diff --git a/scripts/coolEffects.lua b/scripts/examples/coolEffects.lua similarity index 98% rename from scripts/coolEffects.lua rename to scripts/examples/coolEffects.lua index 52efb537..fc70a94f 100644 --- a/scripts/coolEffects.lua +++ b/scripts/examples/coolEffects.lua @@ -1,305 +1,305 @@ -effects = {} -effects.shooterName = "TestInfantry" -effects.napalmCounter = 1 - -effects.fireCounter = 1 - -function effects.notify(message, displayFor) - trigger.action.outText(message, displayFor, false) -end - --------------------------------------------- --------------------------------------------- --------------------------------------------- -----NAPALM - - -function effects.napalmSingle () - unit = Unit.getByName(effects.shooterName) - local unitPos = unit:getPosition().p - vec3 = mist.utils.makeVec3GL(unitPos) - effects.spawnNapalm (vec3) -end - - -function effects.spawnNapalm (vec3) - - napeName = "napalmStrike" .. effects.napalmCounter - effects.napalmCounter = effects.napalmCounter + 1 - mist.dynAddStatic( - { - country = 20, - category = 'Fortifications', - hidden = true, - name = napeName, - type ="Fuel tank", - x = vec3.x, - y = vec3.z, - heading = 0, - } -- end of function - ) - timer.scheduleFunction(effects.explode,vec3, timer.getTime() + 0.1) - timer.scheduleFunction(effects.napalam_death,napeName, timer.getTime() + 0.12) -end - -function effects.explode(vec3) - trigger.action.explosion(vec3, 10) -end - -function effects.napalam_death(staticName) --yes i know bad pun, removes the fuel tank after a set time - StaticObject.getByName(staticName):destroy() -end - --------------------------------------------- --------------------------------------------- --------------------------------------------- -----Basic smoke or fire that despawns -function effects.smokeFire () - unit = Unit.getByName(effects.shooterName) - local unitPos = unit:getPosition().p - vec3 = mist.utils.makeVec3GL(unitPos) - effects.createFire (vec3, 2) - -- 1 = small smoke and fire - -- 2 = medium smoke and fire - -- 3 = large smoke and fire - -- 4 = huge smoke and fire - -- 5 = small smoke - -- 6 = medium smoke - -- 7 = large smoke - -- 8 = huge smoke -end - -function effects.createFire (vec3, size) - smokeName = "smokeName" .. effects.fireCounter - effects.fireCounter = effects.fireCounter + 1 - trigger.action.effectSmokeBig(vec3 , size , 1, smokeName) - trigger.action.explosion(vec3, 1) -- looks wierd to spawn in on flat land without this - timer.scheduleFunction(effects.removeFire,smokeName, timer.getTime() + 20) --you could set a timer, or if selected give option to despawn later -end - -function effects.removeFire (smokeName) - trigger.action.effectSmokeStop(smokeName) -end - --------------------------------------------- --------------------------------------------- --------------------------------------------- -----White phosporus secondaries extra effect, like round cooking off ---if you up the number going pop to somewhere in the 200-400 region with a white phosporus impact it would look mental cool -function effects.secondaries () - unit = Unit.getByName(effects.shooterName) - local unitPos = unit:getPosition().p - vec3 = mist.utils.makeVec3GL(unitPos) - --trigger.action.smoke(vec3 , 2 ) - for i = 1,math.random(3,10) do - angle = mist.utils.toRadian((math.random(1,360))) - local randVec = mist.utils.makeVec3GL((mist.getRandPointInCircle(vec3 ,5 , 1 ,0 ,360))) - trigger.action.signalFlare(randVec , 2 , angle ) - end - -end - --------------------------------------------- --------------------------------------------- --------------------------------------------- -----Depth Charges --- these also make, on land, good dust clouds for a bomb hit in a sandy area? --- local surface = land.getSurfaceType(mist.utils.makeVec2(unitPos)) -- optional check for water, value 3 or 2 - -function effects.depthCharge () - local unit = Unit.getByName(effects.shooterName) - local unitPos = unit:getPosition().p - - vec3 = mist.utils.makeVec3GL(unitPos) - vec3.y = vec3.y - 1000 - bang = vec3 - distance = 20 - explosionSize = 2 - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - trigger.action.explosion(vec3,explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - trigger.action.explosion(vec3,explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) - trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) - timer.scheduleFunction(effects.depthChargeMain,vec3, timer.getTime() + 5) -end - - - -function effects.depthChargeMain (vec3) - explosionSize = 250 - trigger.action.explosion(vec3,explosionSize) - trigger.action.explosion(vec3,explosionSize) - vec3.x = vec3.x - trigger.action.explosion(vec3,explosionSize) - vec3.x = vec3.x - 10 - trigger.action.explosion(vec3,explosionSize) - vec3.z = vec3.z - trigger.action.explosion(vec3,explosionSize) - vec3.z = vec3.z - 10 -end - --------------------------------------------- --------------------------------------------- --------------------------------------------- -----Normal small explosion - -function effects.normalSmallExplosion (vec3) - unit = Unit.getByName(effects.shooterName) - local unitPos = unit:getPosition().p - vec3 = mist.utils.makeVec3GL(unitPos) - trigger.action.explosion(vec3,10) -end - - - -do - longRangeShots = missionCommands.addSubMenu("Effects") - missionCommands.addCommand ("Napalm", longRangeShots, effects.napalmSingle) - missionCommands.addCommand ("Fire or smoke", longRangeShots, effects.smokeFire) - missionCommands.addCommand ("Secondary explosions", longRangeShots, effects.secondaries) - missionCommands.addCommand ("Depth Charge", longRangeShots, effects.depthCharge) - missionCommands.addCommand ("A regular explosion", longRangeShots, effects.normalSmallExplosion) -end - +effects = {} +effects.shooterName = "TestInfantry" +effects.napalmCounter = 1 + +effects.fireCounter = 1 + +function effects.notify(message, displayFor) + trigger.action.outText(message, displayFor, false) +end + +-------------------------------------------- +-------------------------------------------- +-------------------------------------------- +----NAPALM + + +function effects.napalmSingle () + unit = Unit.getByName(effects.shooterName) + local unitPos = unit:getPosition().p + vec3 = mist.utils.makeVec3GL(unitPos) + effects.spawnNapalm (vec3) +end + + +function effects.spawnNapalm (vec3) + + napeName = "napalmStrike" .. effects.napalmCounter + effects.napalmCounter = effects.napalmCounter + 1 + mist.dynAddStatic( + { + country = 20, + category = 'Fortifications', + hidden = true, + name = napeName, + type ="Fuel tank", + x = vec3.x, + y = vec3.z, + heading = 0, + } -- end of function + ) + timer.scheduleFunction(effects.explode,vec3, timer.getTime() + 0.1) + timer.scheduleFunction(effects.napalam_death,napeName, timer.getTime() + 0.12) +end + +function effects.explode(vec3) + trigger.action.explosion(vec3, 10) +end + +function effects.napalam_death(staticName) --yes i know bad pun, removes the fuel tank after a set time + StaticObject.getByName(staticName):destroy() +end + +-------------------------------------------- +-------------------------------------------- +-------------------------------------------- +----Basic smoke or fire that despawns +function effects.smokeFire () + unit = Unit.getByName(effects.shooterName) + local unitPos = unit:getPosition().p + vec3 = mist.utils.makeVec3GL(unitPos) + effects.createFire (vec3, 2) + -- 1 = small smoke and fire + -- 2 = medium smoke and fire + -- 3 = large smoke and fire + -- 4 = huge smoke and fire + -- 5 = small smoke + -- 6 = medium smoke + -- 7 = large smoke + -- 8 = huge smoke +end + +function effects.createFire (vec3, size) + smokeName = "smokeName" .. effects.fireCounter + effects.fireCounter = effects.fireCounter + 1 + trigger.action.effectSmokeBig(vec3 , size , 1, smokeName) + trigger.action.explosion(vec3, 1) -- looks wierd to spawn in on flat land without this + timer.scheduleFunction(effects.removeFire,smokeName, timer.getTime() + 20) --you could set a timer, or if selected give option to despawn later +end + +function effects.removeFire (smokeName) + trigger.action.effectSmokeStop(smokeName) +end + +-------------------------------------------- +-------------------------------------------- +-------------------------------------------- +----White phosporus secondaries extra effect, like round cooking off +--if you up the number going pop to somewhere in the 200-400 region with a white phosporus impact it would look mental cool +function effects.secondaries () + unit = Unit.getByName(effects.shooterName) + local unitPos = unit:getPosition().p + vec3 = mist.utils.makeVec3GL(unitPos) + --trigger.action.smoke(vec3 , 2 ) + for i = 1,math.random(3,10) do + angle = mist.utils.toRadian((math.random(1,360))) + local randVec = mist.utils.makeVec3GL((mist.getRandPointInCircle(vec3 ,5 , 1 ,0 ,360))) + trigger.action.signalFlare(randVec , 2 , angle ) + end + +end + +-------------------------------------------- +-------------------------------------------- +-------------------------------------------- +----Depth Charges +-- these also make, on land, good dust clouds for a bomb hit in a sandy area? +-- local surface = land.getSurfaceType(mist.utils.makeVec2(unitPos)) -- optional check for water, value 3 or 2 + +function effects.depthCharge () + local unit = Unit.getByName(effects.shooterName) + local unitPos = unit:getPosition().p + + vec3 = mist.utils.makeVec3GL(unitPos) + vec3.y = vec3.y - 1000 + bang = vec3 + distance = 20 + explosionSize = 2 + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + trigger.action.explosion(vec3,explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + trigger.action.explosion(vec3,explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + bang = mist.getRandPointInCircle(vec3 , distance ,1,359,0) + trigger.action.explosion(mist.utils.makeVec3GL(bang),explosionSize) + timer.scheduleFunction(effects.depthChargeMain,vec3, timer.getTime() + 5) +end + + + +function effects.depthChargeMain (vec3) + explosionSize = 250 + trigger.action.explosion(vec3,explosionSize) + trigger.action.explosion(vec3,explosionSize) + vec3.x = vec3.x + trigger.action.explosion(vec3,explosionSize) + vec3.x = vec3.x - 10 + trigger.action.explosion(vec3,explosionSize) + vec3.z = vec3.z + trigger.action.explosion(vec3,explosionSize) + vec3.z = vec3.z - 10 +end + +-------------------------------------------- +-------------------------------------------- +-------------------------------------------- +----Normal small explosion + +function effects.normalSmallExplosion (vec3) + unit = Unit.getByName(effects.shooterName) + local unitPos = unit:getPosition().p + vec3 = mist.utils.makeVec3GL(unitPos) + trigger.action.explosion(vec3,10) +end + + + +do + longRangeShots = missionCommands.addSubMenu("Effects") + missionCommands.addCommand ("Napalm", longRangeShots, effects.napalmSingle) + missionCommands.addCommand ("Fire or smoke", longRangeShots, effects.smokeFire) + missionCommands.addCommand ("Secondary explosions", longRangeShots, effects.secondaries) + missionCommands.addCommand ("Depth Charge", longRangeShots, effects.depthCharge) + missionCommands.addCommand ("A regular explosion", longRangeShots, effects.normalSmallExplosion) +end + effects.notify("effects.lua ran", 2) \ No newline at end of file diff --git a/scripts/dynamicTanking.lua b/scripts/examples/dynamicTanking.lua similarity index 97% rename from scripts/dynamicTanking.lua rename to scripts/examples/dynamicTanking.lua index daa5761d..d4d94d79 100644 --- a/scripts/dynamicTanking.lua +++ b/scripts/examples/dynamicTanking.lua @@ -1,681 +1,681 @@ -tankers = {} -tankers.tankerName = "TankerClone" - -function tankers.notify(message, displayFor) - trigger.action.outText(message, displayFor, false) -end - - -function tankers.setFrequency(freq) - - unit = Unit.getByName(tankers.tankerName) - local controller = unit:getController() - - freq = freq or 260 --in MHz, 260 channel 19 is our default tanker thing in refs - - SetFrequency = { - id = 'SetFrequency', - params = { - frequency = freq*1000000 , --in Hz - modulation = 0, --AM 0 or FM 1 - } - } - - controller:setCommand(SetFrequency) -end - -function tankers.changeCallsign() - ---https://wiki.hoggitworld.com/view/DCS_command_setCallsign - unit = Unit.getByName(tankers.tankerName) - local controller = unit:getController() - - SetCallsign = { - id = 'SetCallsign', - params = { - callname = 3, --1 texaco, --2 arco -- 3 shell - number = 1, --1 through 9 valid for tankers only ever 1? - } - } - - controller:setCommand(SetCallsign) -end - ---remember to only pick valid tacan channel ranges - - --- https://wiki.radioreference.com/index.php/Instrument_Landing_System_(ILS)_Frequencies -- what freqs go with which tacans --- you want the reply channels on the tankers so the fighter tunes the one you want - -function tankers.setTacan(channel, xRay) - - defaultTac = 40 - defaultXray = true - channel = channel or defaultTac -- the channel you want to tell the fighters to enter in, if not provided defaults - xRay = xRay or defaultXray -- X or Y are only options so true or false - - unit = Unit.getByName(tankers.tankerName) - local controller = unit:getController() - - --tacan maths is easy - --for X ray reply it is, channel + 961, Yankee reply is channel + 1087 - - if xRay == true then - --to not break everyone elses datalink / tacan 37 and above (X) - if channel > 36 then - freq = channel + 961 - ActivateBeacon = { - id = 'ActivateBeacon', - params = { - type = 4, - system = 3, - name = "TKR", - callsign = "ABC", --what shows as a listed word / plays as morese code, 3 max no spaces - frequency = freq*1000000, - } - } - controller:setCommand(ActivateBeacon) - end - - elseif xRay == false then - --to not break everyone elses datalink / tacan 30 - 46 (Y) but I don't think the "above" is correct - if channel > 29 then - freq = channel + 1087 - ActivateBeacon = { - id = 'ActivateBeacon', - params = { - type = 4, - system = 3, - name = "TKR", - callsign = "ABC", --what shows as a listed word / plays as morese code, 3 max no spaces - frequency = freq*1000000, - } - } - controller:setCommand(ActivateBeacon) - end - end -end - -function tankers.dryPlugTanking () -- for whatever reason this ends up being no fuel transfer? - --tankers.setFrequency(260) - --tankers.setTacan(41, true) - --tankers.changeCallsign() - - unit = Unit.getByName(tankers.tankerName) - cvn = Unit.getByName("CVN") - local cvnPos = cvn:getPosition().p - local tnkrPos = unit:getPosition().p - local speed = 250 - local controller = unit:getController() - - --if you want to try making a tanker do something else - --https://www.digitalcombatsimulator.com/en/support/faq/1267/#3307682 maybe? stop conditions etc - --personally i think delete the thing if it doesn't work - --there is a recovery tanker option, but for me it makes planes stall and hit the floor and we can fake it with this already - - -- this might all seem very over the top compared to the docs, but if you don't do it the tanker instantly RTBs, though you can tank on final which is hillarious - - task1 = { - ["number"] = 1, - ["auto"] = false, - ["id"] = "ControlledTask", - ["enabled"] = true, - ["params"] = - { - ["task"] = - { - ["id"] = "Tanker", - ["params"] = - { - }, -- end of ["params"] - }, -- end of ["task"] - ["stopCondition"] = - { - ["duration"] = 600, - ["userFlag"] = "1", - }, -- end of ["stopCondition"] - }, -- end of ["params"] - } - - task2 = { - ["number"] = 2, - ["auto"] = false, - ["id"] = "WrappedAction", - ["enabled"] = true, - ["params"] = - { - ["action"] = - { - ["id"] = "ActivateBeacon", - ["params"] = - { - ["type"] = 4, - ["AA"] = false, - ["callsign"] = "TKR", - ["modeChannel"] = "Y", - ["channel"] = 71, - ["system"] = 5, - ["unitId"] = 188, - ["bearing"] = true, - ["frequency"] = 1032000000, - }, -- end of ["params"] - }, -- end of ["action"] - }, -- end of ["params"] - } - task3 = - { - ["number"] = 3, - ["auto"] = false, - ["id"] = "WrappedAction", - ["enabled"] = true, - ["params"] = - { - ["action"] = - { - ["id"] = "SetFrequency", - ["params"] = - { - ["power"] = 10, - ["modulation"] = 0, - ["frequency"] = 305000000, - }, -- end of ["params"] - }, -- end of ["action"] - }, -- end of ["params"] - } - - task4 = - { - ["number"] = 4, - ["auto"] = false, - ["id"] = "WrappedAction", - ["enabled"] = true, - ["params"] = - { - ["action"] = - { - ["id"] = "SetInvisible", - ["params"] = - { - ["value"] = true, - }, -- end of ["params"] - }, -- end of ["action"] - }, -- end of ["params"] - } - - point1 = { - ['speed_locked'] = false, - ['type'] = 'Turning Point', - ['action'] = 'Turning Point', - ['alt_type'] = 'BARO', - ['y'] = cvnPos.z, - ['x'] = cvnPos.x, - ['speed'] = 128.611, - ['task'] = { - ['id'] = 'ComboTask', - ['params'] = { - ['tasks'] = { - [1] = task1, --tanker first - [2] = task2, --whatever second - [3] = task3, - [4] = task4, - } - } - }, - ['alt'] = tnkrPos.y - } - point2 = { - ['speed_locked'] = true, - ['type'] = 'Turning Point', - ['action'] = 'Turning Point', - ['alt_type'] = 'BARO', - ['y'] = 30553, - ['x'] = 35881, - ['speed'] = 128.611, - ['task'] = { - ['id'] = 'ComboTask', - ['params'] = { - ['tasks'] = { - } - } - }, - ['alt'] = 2133.6 - } - - missionTask = - { - ['id'] = 'Mission', - ['params'] = { - ['route'] = { - ['points'] = { - [1] = point1, - --[2] = point2, - } - }, - ['airborne'] = true - } - } - controller:pushTask(missionTask) -end - -function tankers.followInFront () - unit = Unit.getByName(tankers.tankerName) - local controller = unit:getController() - - FollowAheadOfGroup = { - ["enabled"] = true, - ["auto"] = false, - ["id"] = "Follow", - ["number"] = 1, - ["params"] = - { - ["lastWptIndexFlagChangedManually"] = false, - ["groupId"] = 74, - ["lastWptIndex"] = 2, - ["lastWptIndexFlag"] = false, - ["pos"] = - { - ["y"] = 152.4, --mins for KC 135 to accidentally stern rejoin and overfly - ["x"] = 1000.8, - ["z"] = 39.9288, - }, -- end of ["pos"] - }, -- end of ["params"] - } - - controller:pushTask(FollowAheadOfGroup) -end - -function tankers.followInFrontClose () - unit = Unit.getByName(tankers.tankerName) - local controller = unit:getController() - - FollowAheadOfGroup = { - ["enabled"] = true, - ["auto"] = false, - ["id"] = "Follow", - ["number"] = 1, - ["params"] = - { - ["lastWptIndexFlagChangedManually"] = false, - ["groupId"] = 74, - ["lastWptIndex"] = 2, - ["lastWptIndexFlag"] = false, - ["pos"] = - { - ["y"] = 25, --mins for KC 135 to accidentally stern rejoin and overfly - ["x"] = 150, - ["z"] = 41.45, - }, -- end of ["pos"] - }, -- end of ["params"] - } - - controller:pushTask(FollowAheadOfGroup) -end - -function tankers.cloneTanker() - -local groupName = 'TankerClone' -- Name of the group in the ME - -group = mist.getGroupData(groupName) -group.route = { points = mist.getGroupRoute(groupName, true) } -group.groupName = "Tanker1" -group.groupId = nil -group.units[1].unitId = nil -group.units[1].unitName = newName -group.country = country -group.category = 'AIRPLANE' - -mist.dynAdd(group) - -end - -function tankers.newTanker() - -local groupName = 'TankerClone' -- Name of the group in the ME -local cloneGroupPos = Unit.getByName(groupName):getPosition().p -cvn = Unit.getByName("CVN") -local cvnPos = cvn:getPosition().p - - -group = mist.getGroupData(groupName) -group.route = { - ["points"] = - { - [1] = - { - ["alt"] = 2133.6, - ["action"] = "Turning Point", - ["alt_type"] = "BARO", - ["speed"] = 179.86111111111, - ["task"] = - { - ["id"] = "ComboTask", - ["params"] = - { - ["tasks"] = - { - [1] = - { - ["number"] = 1, - ["auto"] = false, - ["id"] = "ControlledTask", - ["enabled"] = true, - ["params"] = - { - ["task"] = - { - ["id"] = "Tanker", - ["params"] = - { - }, -- end of ["params"] - }, -- end of ["task"] - ["stopCondition"] = - { - ["duration"] = 900, - }, -- end of ["stopCondition"] - }, -- end of ["params"] - }, -- end of [1] - [2] = - { - ["number"] = 2, - ["auto"] = false, - ["id"] = "WrappedAction", - ["enabled"] = true, - ["params"] = - { - ["action"] = - { - ["id"] = "ActivateBeacon", - ["params"] = - { - ["type"] = 4, - ["AA"] = false, - ["callsign"] = "TKR", - ["modeChannel"] = "Y", - ["channel"] = 71, - ["system"] = 5, - ["unitId"] = 188, - ["bearing"] = true, - ["frequency"] = 1032000000, - }, -- end of ["params"] - }, -- end of ["action"] - }, -- end of ["params"] - }, -- end of [2] - [3] = - { - ["number"] = 3, - ["auto"] = false, - ["id"] = "WrappedAction", - ["enabled"] = true, - ["params"] = - { - ["action"] = - { - ["id"] = "SetFrequency", - ["params"] = - { - ["power"] = 10, - ["modulation"] = 0, - ["frequency"] = 260000000, - }, -- end of ["params"] - }, -- end of ["action"] - }, -- end of ["params"] - }, -- end of [3] - [4] = - { - ["number"] = 4, - ["auto"] = false, - ["id"] = "WrappedAction", - ["enabled"] = true, - ["params"] = - { - ["action"] = - { - ["id"] = "SetInvisible", - ["params"] = - { - ["value"] = true, - }, -- end of ["params"] - }, -- end of ["action"] - }, -- end of ["params"] - }, -- end of [4] - }, -- end of ["tasks"] - }, -- end of ["params"] - }, -- end of ["task"] - ["type"] = "Turning Point", - ["ETA"] = 96.50677034026, - ["ETA_locked"] = false, - ["y"] = cvnPos.z, - ["x"] = cvnPos.x, - ["formation_template"] = "", - ["speed_locked"] = true, - }, -- end of [1] - }, -- end of ["points"] - } - ---group.units[1].type = "S-3B Tanker" -group.groupName = "Tanker1" -group.groupId = nil -group.units[1].unitId = nil -group.units[1].unitName = newName -group.country = country -group.category = 'AIRPLANE' -group.units[1].x = cloneGroupPos.x -group.units[1].y = cloneGroupPos.z -group.units[1].z = cloneGroupPos.y -group.units[1].speed = 999999 - - -Group.destroy(Group.getByName(groupName)) -mist.dynAdd(group) ---timer.scheduleFunction(mist.dynAdd,group, timer.getTime() + 0.00000000001) - -end - - -function tankers.startEnrouteTankingTest (vec3) -- this is the one that works well, clone an existing tanker that is currently mission editor tanking - - --tankers.setFrequency(260) - --tankers.setTacan(41, true) - --tankers.changeCallsign() - route = mist.getGroupRoute(tankers.tankerName, true) - unit = Unit.getByName(tankers.tankerName) - cvn = Unit.getByName("CVN") - - local cvnPos = cvn:getPosition().p - - local vec3 = vec3 or cvnPos - route[1].x = unit:getPosition().p.x - route[1].y = unit:getPosition().p.z - route[2].x = vec3.x - route[2].y = vec3.z - route[2].z = vec3.y + 100 - - mist.goRoute(tankers.tankerName , route ) -end - -function tankers.hyperSpace (vec3) -- this is the one that works well, clone an existing tanker that is currently mission editor tanking -local groupName = 'TankerClone' -- Name of the group in the ME -local cloneGroupPos = Unit.getByName(groupName):getPosition().p -cvn = Unit.getByName("CVN") -local cvnPos = cvn:getPosition().p - - -group = mist.getGroupData(groupName) -group.route = { - ["points"] = - { - [1] = - { - ["alt"] = 2133.6, - ["action"] = "Turning Point", - ["alt_type"] = "BARO", - ["speed"] = 179.86111111111, - ["task"] = - { - ["id"] = "ComboTask", - ["params"] = - { - ["tasks"] = - { - [1] = - { - ["number"] = 1, - ["auto"] = false, - ["id"] = "ControlledTask", - ["enabled"] = true, - ["params"] = - { - ["task"] = - { - ["id"] = "Tanker", - ["params"] = - { - }, -- end of ["params"] - }, -- end of ["task"] - ["stopCondition"] = - { - ["duration"] = 900, - }, -- end of ["stopCondition"] - }, -- end of ["params"] - }, -- end of [1] - [2] = - { - ["number"] = 2, - ["auto"] = false, - ["id"] = "WrappedAction", - ["enabled"] = true, - ["params"] = - { - ["action"] = - { - ["id"] = "ActivateBeacon", - ["params"] = - { - ["type"] = 4, - ["AA"] = false, - ["callsign"] = "TKR", - ["modeChannel"] = "Y", - ["channel"] = 71, - ["system"] = 5, - ["unitId"] = 188, - ["bearing"] = true, - ["frequency"] = 1032000000, - }, -- end of ["params"] - }, -- end of ["action"] - }, -- end of ["params"] - }, -- end of [2] - [3] = - { - ["number"] = 3, - ["auto"] = false, - ["id"] = "WrappedAction", - ["enabled"] = true, - ["params"] = - { - ["action"] = - { - ["id"] = "SetFrequency", - ["params"] = - { - ["power"] = 10, - ["modulation"] = 0, - ["frequency"] = 260000000, - }, -- end of ["params"] - }, -- end of ["action"] - }, -- end of ["params"] - }, -- end of [3] - [4] = - { - ["number"] = 4, - ["auto"] = false, - ["id"] = "WrappedAction", - ["enabled"] = true, - ["params"] = - { - ["action"] = - { - ["id"] = "SetInvisible", - ["params"] = - { - ["value"] = true, - }, -- end of ["params"] - }, -- end of ["action"] - }, -- end of ["params"] - }, -- end of [4] - }, -- end of ["tasks"] - }, -- end of ["params"] - }, -- end of ["task"] - ["type"] = "Turning Point", - ["ETA"] = 96.50677034026, - ["ETA_locked"] = false, - ["y"] = cvnPos.z, - ["x"] = cvnPos.x, - ["formation_template"] = "", - ["speed_locked"] = true, - }, -- end of [1] - }, -- end of ["points"] - } - ---group.units[1].type = "S-3B Tanker" -group.groupName = "Tanker1" -group.groupId = nil -group.units[1].unitId = nil -group.units[1].unitName = newName -group.country = country -group.category = 'AIRPLANE' -group.units[1].x = cvnPos.x-100 -group.units[1].y = cvnPos.z -group.units[1].z = cloneGroupPos.y -group.units[1].heading = 0.000000000001 -group.units[1].speed = 300 - ---Group.destroy(Group.getByName(groupName)) -mist.dynAdd(group) -group.groupName = "Tanker2" -group.units[1].x = cvnPos.x+100 -group.units[1].heading = 3.1415926537 -group.units[1].y = cvnPos.z -mist.dynAdd(group) - -end - - -handler = {} - -local function protectedCall(...) - local status, retval = pcall(...) - if not status then - - end -end - -function tankers.eventHandler (event) - if (26 == event.id) then --this is when someone types into a mark - local vec3 = mist.utils.makeVec3GL(event.pos) - tankers.startEnrouteTankingTest (vec3) - end -end - -function handler:onEvent(event) - protectedCall(tankers.eventHandler, event) -end - -do - --world.addEventHandler(handler) - world.addEventHandler(handler) -end - -do - longRangeShots = missionCommands.addSubMenu("Dynamic Tanking") - missionCommands.addCommand ("Hyperspace entry", longRangeShots, tankers.hyperSpace) - missionCommands.addCommand ("Start tanking", longRangeShots, tankers.startEnrouteTankingTest) - missionCommands.addCommand ("Frequency change approved", longRangeShots, tankers.setFrequency) - missionCommands.addCommand ("Callsign change approved", longRangeShots, tankers.changeCallsign) - missionCommands.addCommand ("Tacan change approved", longRangeShots, tankers.setTacan) - missionCommands.addCommand ("Start a new tanker", longRangeShots, tankers.newTanker) - missionCommands.addCommand ("Rejoin on a unit", longRangeShots, tankers.followInFront) - missionCommands.addCommand ("Rejoin close", longRangeShots, tankers.followInFrontClose) - - -end - +tankers = {} +tankers.tankerName = "TankerClone" + +function tankers.notify(message, displayFor) + trigger.action.outText(message, displayFor, false) +end + + +function tankers.setFrequency(freq) + + unit = Unit.getByName(tankers.tankerName) + local controller = unit:getController() + + freq = freq or 260 --in MHz, 260 channel 19 is our default tanker thing in refs + + SetFrequency = { + id = 'SetFrequency', + params = { + frequency = freq*1000000 , --in Hz + modulation = 0, --AM 0 or FM 1 + } + } + + controller:setCommand(SetFrequency) +end + +function tankers.changeCallsign() + ---https://wiki.hoggitworld.com/view/DCS_command_setCallsign + unit = Unit.getByName(tankers.tankerName) + local controller = unit:getController() + + SetCallsign = { + id = 'SetCallsign', + params = { + callname = 3, --1 texaco, --2 arco -- 3 shell + number = 1, --1 through 9 valid for tankers only ever 1? + } + } + + controller:setCommand(SetCallsign) +end + +--remember to only pick valid tacan channel ranges + + +-- https://wiki.radioreference.com/index.php/Instrument_Landing_System_(ILS)_Frequencies -- what freqs go with which tacans +-- you want the reply channels on the tankers so the fighter tunes the one you want + +function tankers.setTacan(channel, xRay) + + defaultTac = 40 + defaultXray = true + channel = channel or defaultTac -- the channel you want to tell the fighters to enter in, if not provided defaults + xRay = xRay or defaultXray -- X or Y are only options so true or false + + unit = Unit.getByName(tankers.tankerName) + local controller = unit:getController() + + --tacan maths is easy + --for X ray reply it is, channel + 961, Yankee reply is channel + 1087 + + if xRay == true then + --to not break everyone elses datalink / tacan 37 and above (X) + if channel > 36 then + freq = channel + 961 + ActivateBeacon = { + id = 'ActivateBeacon', + params = { + type = 4, + system = 3, + name = "TKR", + callsign = "ABC", --what shows as a listed word / plays as morese code, 3 max no spaces + frequency = freq*1000000, + } + } + controller:setCommand(ActivateBeacon) + end + + elseif xRay == false then + --to not break everyone elses datalink / tacan 30 - 46 (Y) but I don't think the "above" is correct + if channel > 29 then + freq = channel + 1087 + ActivateBeacon = { + id = 'ActivateBeacon', + params = { + type = 4, + system = 3, + name = "TKR", + callsign = "ABC", --what shows as a listed word / plays as morese code, 3 max no spaces + frequency = freq*1000000, + } + } + controller:setCommand(ActivateBeacon) + end + end +end + +function tankers.dryPlugTanking () -- for whatever reason this ends up being no fuel transfer? + --tankers.setFrequency(260) + --tankers.setTacan(41, true) + --tankers.changeCallsign() + + unit = Unit.getByName(tankers.tankerName) + cvn = Unit.getByName("CVN") + local cvnPos = cvn:getPosition().p + local tnkrPos = unit:getPosition().p + local speed = 250 + local controller = unit:getController() + + --if you want to try making a tanker do something else + --https://www.digitalcombatsimulator.com/en/support/faq/1267/#3307682 maybe? stop conditions etc + --personally i think delete the thing if it doesn't work + --there is a recovery tanker option, but for me it makes planes stall and hit the floor and we can fake it with this already + + -- this might all seem very over the top compared to the docs, but if you don't do it the tanker instantly RTBs, though you can tank on final which is hillarious + + task1 = { + ["number"] = 1, + ["auto"] = false, + ["id"] = "ControlledTask", + ["enabled"] = true, + ["params"] = + { + ["task"] = + { + ["id"] = "Tanker", + ["params"] = + { + }, -- end of ["params"] + }, -- end of ["task"] + ["stopCondition"] = + { + ["duration"] = 600, + ["userFlag"] = "1", + }, -- end of ["stopCondition"] + }, -- end of ["params"] + } + + task2 = { + ["number"] = 2, + ["auto"] = false, + ["id"] = "WrappedAction", + ["enabled"] = true, + ["params"] = + { + ["action"] = + { + ["id"] = "ActivateBeacon", + ["params"] = + { + ["type"] = 4, + ["AA"] = false, + ["callsign"] = "TKR", + ["modeChannel"] = "Y", + ["channel"] = 71, + ["system"] = 5, + ["unitId"] = 188, + ["bearing"] = true, + ["frequency"] = 1032000000, + }, -- end of ["params"] + }, -- end of ["action"] + }, -- end of ["params"] + } + task3 = + { + ["number"] = 3, + ["auto"] = false, + ["id"] = "WrappedAction", + ["enabled"] = true, + ["params"] = + { + ["action"] = + { + ["id"] = "SetFrequency", + ["params"] = + { + ["power"] = 10, + ["modulation"] = 0, + ["frequency"] = 305000000, + }, -- end of ["params"] + }, -- end of ["action"] + }, -- end of ["params"] + } + + task4 = + { + ["number"] = 4, + ["auto"] = false, + ["id"] = "WrappedAction", + ["enabled"] = true, + ["params"] = + { + ["action"] = + { + ["id"] = "SetInvisible", + ["params"] = + { + ["value"] = true, + }, -- end of ["params"] + }, -- end of ["action"] + }, -- end of ["params"] + } + + point1 = { + ['speed_locked'] = false, + ['type'] = 'Turning Point', + ['action'] = 'Turning Point', + ['alt_type'] = 'BARO', + ['y'] = cvnPos.z, + ['x'] = cvnPos.x, + ['speed'] = 128.611, + ['task'] = { + ['id'] = 'ComboTask', + ['params'] = { + ['tasks'] = { + [1] = task1, --tanker first + [2] = task2, --whatever second + [3] = task3, + [4] = task4, + } + } + }, + ['alt'] = tnkrPos.y + } + point2 = { + ['speed_locked'] = true, + ['type'] = 'Turning Point', + ['action'] = 'Turning Point', + ['alt_type'] = 'BARO', + ['y'] = 30553, + ['x'] = 35881, + ['speed'] = 128.611, + ['task'] = { + ['id'] = 'ComboTask', + ['params'] = { + ['tasks'] = { + } + } + }, + ['alt'] = 2133.6 + } + + missionTask = + { + ['id'] = 'Mission', + ['params'] = { + ['route'] = { + ['points'] = { + [1] = point1, + --[2] = point2, + } + }, + ['airborne'] = true + } + } + controller:pushTask(missionTask) +end + +function tankers.followInFront () + unit = Unit.getByName(tankers.tankerName) + local controller = unit:getController() + + FollowAheadOfGroup = { + ["enabled"] = true, + ["auto"] = false, + ["id"] = "Follow", + ["number"] = 1, + ["params"] = + { + ["lastWptIndexFlagChangedManually"] = false, + ["groupId"] = 74, + ["lastWptIndex"] = 2, + ["lastWptIndexFlag"] = false, + ["pos"] = + { + ["y"] = 152.4, --mins for KC 135 to accidentally stern rejoin and overfly + ["x"] = 1000.8, + ["z"] = 39.9288, + }, -- end of ["pos"] + }, -- end of ["params"] + } + + controller:pushTask(FollowAheadOfGroup) +end + +function tankers.followInFrontClose () + unit = Unit.getByName(tankers.tankerName) + local controller = unit:getController() + + FollowAheadOfGroup = { + ["enabled"] = true, + ["auto"] = false, + ["id"] = "Follow", + ["number"] = 1, + ["params"] = + { + ["lastWptIndexFlagChangedManually"] = false, + ["groupId"] = 74, + ["lastWptIndex"] = 2, + ["lastWptIndexFlag"] = false, + ["pos"] = + { + ["y"] = 25, --mins for KC 135 to accidentally stern rejoin and overfly + ["x"] = 150, + ["z"] = 41.45, + }, -- end of ["pos"] + }, -- end of ["params"] + } + + controller:pushTask(FollowAheadOfGroup) +end + +function tankers.cloneTanker() + +local groupName = 'TankerClone' -- Name of the group in the ME + +group = mist.getGroupData(groupName) +group.route = { points = mist.getGroupRoute(groupName, true) } +group.groupName = "Tanker1" +group.groupId = nil +group.units[1].unitId = nil +group.units[1].unitName = newName +group.country = country +group.category = 'AIRPLANE' + +mist.dynAdd(group) + +end + +function tankers.newTanker() + +local groupName = 'TankerClone' -- Name of the group in the ME +local cloneGroupPos = Unit.getByName(groupName):getPosition().p +cvn = Unit.getByName("CVN") +local cvnPos = cvn:getPosition().p + + +group = mist.getGroupData(groupName) +group.route = { + ["points"] = + { + [1] = + { + ["alt"] = 2133.6, + ["action"] = "Turning Point", + ["alt_type"] = "BARO", + ["speed"] = 179.86111111111, + ["task"] = + { + ["id"] = "ComboTask", + ["params"] = + { + ["tasks"] = + { + [1] = + { + ["number"] = 1, + ["auto"] = false, + ["id"] = "ControlledTask", + ["enabled"] = true, + ["params"] = + { + ["task"] = + { + ["id"] = "Tanker", + ["params"] = + { + }, -- end of ["params"] + }, -- end of ["task"] + ["stopCondition"] = + { + ["duration"] = 900, + }, -- end of ["stopCondition"] + }, -- end of ["params"] + }, -- end of [1] + [2] = + { + ["number"] = 2, + ["auto"] = false, + ["id"] = "WrappedAction", + ["enabled"] = true, + ["params"] = + { + ["action"] = + { + ["id"] = "ActivateBeacon", + ["params"] = + { + ["type"] = 4, + ["AA"] = false, + ["callsign"] = "TKR", + ["modeChannel"] = "Y", + ["channel"] = 71, + ["system"] = 5, + ["unitId"] = 188, + ["bearing"] = true, + ["frequency"] = 1032000000, + }, -- end of ["params"] + }, -- end of ["action"] + }, -- end of ["params"] + }, -- end of [2] + [3] = + { + ["number"] = 3, + ["auto"] = false, + ["id"] = "WrappedAction", + ["enabled"] = true, + ["params"] = + { + ["action"] = + { + ["id"] = "SetFrequency", + ["params"] = + { + ["power"] = 10, + ["modulation"] = 0, + ["frequency"] = 260000000, + }, -- end of ["params"] + }, -- end of ["action"] + }, -- end of ["params"] + }, -- end of [3] + [4] = + { + ["number"] = 4, + ["auto"] = false, + ["id"] = "WrappedAction", + ["enabled"] = true, + ["params"] = + { + ["action"] = + { + ["id"] = "SetInvisible", + ["params"] = + { + ["value"] = true, + }, -- end of ["params"] + }, -- end of ["action"] + }, -- end of ["params"] + }, -- end of [4] + }, -- end of ["tasks"] + }, -- end of ["params"] + }, -- end of ["task"] + ["type"] = "Turning Point", + ["ETA"] = 96.50677034026, + ["ETA_locked"] = false, + ["y"] = cvnPos.z, + ["x"] = cvnPos.x, + ["formation_template"] = "", + ["speed_locked"] = true, + }, -- end of [1] + }, -- end of ["points"] + } + +--group.units[1].type = "S-3B Tanker" +group.groupName = "Tanker1" +group.groupId = nil +group.units[1].unitId = nil +group.units[1].unitName = newName +group.country = country +group.category = 'AIRPLANE' +group.units[1].x = cloneGroupPos.x +group.units[1].y = cloneGroupPos.z +group.units[1].z = cloneGroupPos.y +group.units[1].speed = 999999 + + +Group.destroy(Group.getByName(groupName)) +mist.dynAdd(group) +--timer.scheduleFunction(mist.dynAdd,group, timer.getTime() + 0.00000000001) + +end + + +function tankers.startEnrouteTankingTest (vec3) -- this is the one that works well, clone an existing tanker that is currently mission editor tanking + + --tankers.setFrequency(260) + --tankers.setTacan(41, true) + --tankers.changeCallsign() + route = mist.getGroupRoute(tankers.tankerName, true) + unit = Unit.getByName(tankers.tankerName) + cvn = Unit.getByName("CVN") + + local cvnPos = cvn:getPosition().p + + local vec3 = vec3 or cvnPos + route[1].x = unit:getPosition().p.x + route[1].y = unit:getPosition().p.z + route[2].x = vec3.x + route[2].y = vec3.z + route[2].z = vec3.y + 100 + + mist.goRoute(tankers.tankerName , route ) +end + +function tankers.hyperSpace (vec3) -- this is the one that works well, clone an existing tanker that is currently mission editor tanking +local groupName = 'TankerClone' -- Name of the group in the ME +local cloneGroupPos = Unit.getByName(groupName):getPosition().p +cvn = Unit.getByName("CVN") +local cvnPos = cvn:getPosition().p + + +group = mist.getGroupData(groupName) +group.route = { + ["points"] = + { + [1] = + { + ["alt"] = 2133.6, + ["action"] = "Turning Point", + ["alt_type"] = "BARO", + ["speed"] = 179.86111111111, + ["task"] = + { + ["id"] = "ComboTask", + ["params"] = + { + ["tasks"] = + { + [1] = + { + ["number"] = 1, + ["auto"] = false, + ["id"] = "ControlledTask", + ["enabled"] = true, + ["params"] = + { + ["task"] = + { + ["id"] = "Tanker", + ["params"] = + { + }, -- end of ["params"] + }, -- end of ["task"] + ["stopCondition"] = + { + ["duration"] = 900, + }, -- end of ["stopCondition"] + }, -- end of ["params"] + }, -- end of [1] + [2] = + { + ["number"] = 2, + ["auto"] = false, + ["id"] = "WrappedAction", + ["enabled"] = true, + ["params"] = + { + ["action"] = + { + ["id"] = "ActivateBeacon", + ["params"] = + { + ["type"] = 4, + ["AA"] = false, + ["callsign"] = "TKR", + ["modeChannel"] = "Y", + ["channel"] = 71, + ["system"] = 5, + ["unitId"] = 188, + ["bearing"] = true, + ["frequency"] = 1032000000, + }, -- end of ["params"] + }, -- end of ["action"] + }, -- end of ["params"] + }, -- end of [2] + [3] = + { + ["number"] = 3, + ["auto"] = false, + ["id"] = "WrappedAction", + ["enabled"] = true, + ["params"] = + { + ["action"] = + { + ["id"] = "SetFrequency", + ["params"] = + { + ["power"] = 10, + ["modulation"] = 0, + ["frequency"] = 260000000, + }, -- end of ["params"] + }, -- end of ["action"] + }, -- end of ["params"] + }, -- end of [3] + [4] = + { + ["number"] = 4, + ["auto"] = false, + ["id"] = "WrappedAction", + ["enabled"] = true, + ["params"] = + { + ["action"] = + { + ["id"] = "SetInvisible", + ["params"] = + { + ["value"] = true, + }, -- end of ["params"] + }, -- end of ["action"] + }, -- end of ["params"] + }, -- end of [4] + }, -- end of ["tasks"] + }, -- end of ["params"] + }, -- end of ["task"] + ["type"] = "Turning Point", + ["ETA"] = 96.50677034026, + ["ETA_locked"] = false, + ["y"] = cvnPos.z, + ["x"] = cvnPos.x, + ["formation_template"] = "", + ["speed_locked"] = true, + }, -- end of [1] + }, -- end of ["points"] + } + +--group.units[1].type = "S-3B Tanker" +group.groupName = "Tanker1" +group.groupId = nil +group.units[1].unitId = nil +group.units[1].unitName = newName +group.country = country +group.category = 'AIRPLANE' +group.units[1].x = cvnPos.x-100 +group.units[1].y = cvnPos.z +group.units[1].z = cloneGroupPos.y +group.units[1].heading = 0.000000000001 +group.units[1].speed = 300 + +--Group.destroy(Group.getByName(groupName)) +mist.dynAdd(group) +group.groupName = "Tanker2" +group.units[1].x = cvnPos.x+100 +group.units[1].heading = 3.1415926537 +group.units[1].y = cvnPos.z +mist.dynAdd(group) + +end + + +handler = {} + +local function protectedCall(...) + local status, retval = pcall(...) + if not status then + + end +end + +function tankers.eventHandler (event) + if (26 == event.id) then --this is when someone types into a mark + local vec3 = mist.utils.makeVec3GL(event.pos) + tankers.startEnrouteTankingTest (vec3) + end +end + +function handler:onEvent(event) + protectedCall(tankers.eventHandler, event) +end + +do + --world.addEventHandler(handler) + world.addEventHandler(handler) +end + +do + longRangeShots = missionCommands.addSubMenu("Dynamic Tanking") + missionCommands.addCommand ("Hyperspace entry", longRangeShots, tankers.hyperSpace) + missionCommands.addCommand ("Start tanking", longRangeShots, tankers.startEnrouteTankingTest) + missionCommands.addCommand ("Frequency change approved", longRangeShots, tankers.setFrequency) + missionCommands.addCommand ("Callsign change approved", longRangeShots, tankers.changeCallsign) + missionCommands.addCommand ("Tacan change approved", longRangeShots, tankers.setTacan) + missionCommands.addCommand ("Start a new tanker", longRangeShots, tankers.newTanker) + missionCommands.addCommand ("Rejoin on a unit", longRangeShots, tankers.followInFront) + missionCommands.addCommand ("Rejoin close", longRangeShots, tankers.followInFrontClose) + + +end + tankers.notify("tankers.lua loaded",2) \ No newline at end of file diff --git a/scripts/forceBubble.lua b/scripts/examples/forceBubble.lua similarity index 96% rename from scripts/forceBubble.lua rename to scripts/examples/forceBubble.lua index 803e887b..99271ccf 100644 --- a/scripts/forceBubble.lua +++ b/scripts/examples/forceBubble.lua @@ -1,112 +1,112 @@ ---Spawn a SAM integrated with IADS ---Spawn a normal SAM ---SAM bubble shields - -forceBub = {} -forceBub.handler = {} -forceBub.missileList = {} -forceBub.missilesActive = 0 -forceBub.shieldOn = false - -function forceBub.notify(message, displayFor) - trigger.action.outText(message, displayFor, true) -end - -function forceBub.setShield() - forceBub.notify("Shield on", 2) -end - -function forceBub.stopShield() - forceBub.shieldOn = false -end - - - -local function protectedCall(...) - local status, retval = pcall(...) - if not status then - --rf.notify("Caught error " .. retval,2) - end -end - -function forceBub.handler:onEvent(event) - protectedCall(forceBub.eventHandler, event) -end - -function forceBub.checkMissiles () - local currentTime = timer.getTime() - if forceBub.missilesActive > 0 then - for index, data in pairs(forceBub.missileList) do - output = mist.utils.tableShow(forceBub.missileList[index]) - if forceBub.missileList[index].exists == true then - if Object.isExist(forceBub.missileList[index].weapon) == true then - forceBub.missileList[index].pos = forceBub.missileList[index].weapon:getPosition() - - - local missilePosition = forceBub.missileList[index].pos.p - - unit = Unit.getByName("Test") - local unitPosition = unit:getPosition().p - - local distance = mist.utils.get3DDist(unitPosition , missilePosition ) - forceBub.notify(distance,1) - - if forceBub.shieldOn == true and distance < 100 then --this distance is the sweet spot any less and you probably take damage and die, less than 75 death - - trigger.action.explosion(missilePosition , 1) --just blows up the missile - - end - - - else - forceBub.missileList[index] = nil - forceBub.missilesActive = forceBub.missilesActive - 1 - end - else - end - - end - end - timer.scheduleFunction(forceBub.checkMisProtectCall,{},currentTime + 0.01) -end - - - -function forceBub.eventHandler (event) - --forceBub.notify(mist.utils.tableShow(event),10) - if (event.id == 1) then - --check if weapon is a missile - --rf.notify("Missile fired id " .. event.weapon.id_ ,2) - forceBub.notify(mist.utils.tableShow(Weapon.getDesc(event.weapon)),10) - if Weapon.getDesc(event.weapon).missileCategory == 2 then - local newMis = {} - newMis.id = event.weapon.id_ - newMis.pos = event.weapon:getPosition() - newMis.weapon = event.weapon - newMis.exists = Object.isExist(newMis.weapon) - forceBub.missileList[event.weapon.id_] = newMis - forceBub.missilesActive = forceBub.missilesActive + 1 - end - end -end - -function forceBub.checkMisProtectCall() - protectedCall(forceBub.checkMissiles,{}) -end - -function forceBub.setShield() - forceBub.shieldOn = true -end - -do - forceField = missionCommands.addSubMenu("Force Field") - missionCommands.addCommand ("Forcefield on", forceField, forceBub.setShield) - missionCommands.addCommand ("Stop Field", forceField, forceBub.stopShield) -end - -do - world.addEventHandler(forceBub.handler) -end - -protectedCall(forceBub.checkMissiles,{}) +--Spawn a SAM integrated with IADS +--Spawn a normal SAM +--SAM bubble shields + +forceBub = {} +forceBub.handler = {} +forceBub.missileList = {} +forceBub.missilesActive = 0 +forceBub.shieldOn = false + +function forceBub.notify(message, displayFor) + trigger.action.outText(message, displayFor, true) +end + +function forceBub.setShield() + forceBub.notify("Shield on", 2) +end + +function forceBub.stopShield() + forceBub.shieldOn = false +end + + + +local function protectedCall(...) + local status, retval = pcall(...) + if not status then + --rf.notify("Caught error " .. retval,2) + end +end + +function forceBub.handler:onEvent(event) + protectedCall(forceBub.eventHandler, event) +end + +function forceBub.checkMissiles () + local currentTime = timer.getTime() + if forceBub.missilesActive > 0 then + for index, data in pairs(forceBub.missileList) do + output = mist.utils.tableShow(forceBub.missileList[index]) + if forceBub.missileList[index].exists == true then + if Object.isExist(forceBub.missileList[index].weapon) == true then + forceBub.missileList[index].pos = forceBub.missileList[index].weapon:getPosition() + + + local missilePosition = forceBub.missileList[index].pos.p + + unit = Unit.getByName("Test") + local unitPosition = unit:getPosition().p + + local distance = mist.utils.get3DDist(unitPosition , missilePosition ) + forceBub.notify(distance,1) + + if forceBub.shieldOn == true and distance < 100 then --this distance is the sweet spot any less and you probably take damage and die, less than 75 death + + trigger.action.explosion(missilePosition , 1) --just blows up the missile + + end + + + else + forceBub.missileList[index] = nil + forceBub.missilesActive = forceBub.missilesActive - 1 + end + else + end + + end + end + timer.scheduleFunction(forceBub.checkMisProtectCall,{},currentTime + 0.01) +end + + + +function forceBub.eventHandler (event) + --forceBub.notify(mist.utils.tableShow(event),10) + if (event.id == 1) then + --check if weapon is a missile + --rf.notify("Missile fired id " .. event.weapon.id_ ,2) + forceBub.notify(mist.utils.tableShow(Weapon.getDesc(event.weapon)),10) + if Weapon.getDesc(event.weapon).missileCategory == 2 then + local newMis = {} + newMis.id = event.weapon.id_ + newMis.pos = event.weapon:getPosition() + newMis.weapon = event.weapon + newMis.exists = Object.isExist(newMis.weapon) + forceBub.missileList[event.weapon.id_] = newMis + forceBub.missilesActive = forceBub.missilesActive + 1 + end + end +end + +function forceBub.checkMisProtectCall() + protectedCall(forceBub.checkMissiles,{}) +end + +function forceBub.setShield() + forceBub.shieldOn = true +end + +do + forceField = missionCommands.addSubMenu("Force Field") + missionCommands.addCommand ("Forcefield on", forceField, forceBub.setShield) + missionCommands.addCommand ("Stop Field", forceField, forceBub.stopShield) +end + +do + world.addEventHandler(forceBub.handler) +end + +protectedCall(forceBub.checkMissiles,{}) forceBub.notify("forceBubble.lua loaded", 2) \ No newline at end of file diff --git a/scripts/laserDiscoDiscoLaser.lua b/scripts/examples/laserDiscoDiscoLaser.lua similarity index 96% rename from scripts/laserDiscoDiscoLaser.lua rename to scripts/examples/laserDiscoDiscoLaser.lua index f6b2ffde..0e96b15a 100644 --- a/scripts/laserDiscoDiscoLaser.lua +++ b/scripts/examples/laserDiscoDiscoLaser.lua @@ -1,21 +1,21 @@ -lddl = {} -lddl.refreshRate = 1 - - - - -function lddl.pointer () - origin = Unit.getByName("Laser") - originPos = origin:getPosition().p - targetPos = Unit.getByName("LaserTGT"):getPosition().p - laser = Spot.createInfraRed(origin , originPos, targetPos) - timer.scheduleFunction(lddl.removePointer,laser, timer.getTime() + lddl.refreshRate) - -end - -function lddl.removePointer(laser) - Spot.destroy(laser) - timer.scheduleFunction(lddl.pointer,{}, timer.getTime() + lddl.refreshRate) -end - +lddl = {} +lddl.refreshRate = 1 + + + + +function lddl.pointer () + origin = Unit.getByName("Laser") + originPos = origin:getPosition().p + targetPos = Unit.getByName("LaserTGT"):getPosition().p + laser = Spot.createInfraRed(origin , originPos, targetPos) + timer.scheduleFunction(lddl.removePointer,laser, timer.getTime() + lddl.refreshRate) + +end + +function lddl.removePointer(laser) + Spot.destroy(laser) + timer.scheduleFunction(lddl.pointer,{}, timer.getTime() + lddl.refreshRate) +end + lddl.pointer () \ No newline at end of file diff --git a/scripts/parrotSpeak.lua b/scripts/examples/parrotSpeak.lua similarity index 97% rename from scripts/parrotSpeak.lua rename to scripts/examples/parrotSpeak.lua index a24057a4..1e94773c 100644 --- a/scripts/parrotSpeak.lua +++ b/scripts/examples/parrotSpeak.lua @@ -1,184 +1,184 @@ ---------------------------------THIS FIRST BIT IS THE SRS CODE BLOCK------------------- --------------------- first 4 things need to be set correctly for the server, they are for ours, we don't do the google creds yet - -STTS = {} --- FULL Path to the FOLDER containing DCS-SR-ExternalAudio.exe - EDIT TO CORRECT FOLDER -STTS.DIRECTORY = "C:\\Users\\Administrator\\Desktop\\DCS\\SRS Refugees" - -STTS.SRS_PORT = 5002 -- LOCAL SRS PORT - DEFAULT IS 5002 -STTS.GOOGLE_CREDENTIALS = "C:\\Users\\Ciaran\\Downloads\\googletts.json" - --- DONT CHANGE THIS UNLESS YOU KNOW WHAT YOU'RE DOING -STTS.EXECUTABLE = "DCS-SR-ExternalAudio.exe" - -local random = math.random -function STTS.uuid() - local template ='yxxx-xxxxxxxxxxxx' - return string.gsub(template, '[xy]', function (c) - local v = (c == 'x') and random(0, 0xf) or random(8, 0xb) - return string.format('%x', v) - end) -end - -function STTS.round(x, n) - n = math.pow(10, n or 0) - x = x * n - if x >= 0 then x = math.floor(x + 0.5) else x = math.ceil(x - 0.5) end - return x / n -end - -function STTS.getSpeechTime(length,speed,isGoogle) - -- Function returns estimated speech time in seconds - - -- Assumptions for time calc: 100 Words per min, avarage of 5 letters for english word - -- so 5 chars * 100wpm = 500 characters per min = 8.3 chars per second - -- so lengh of msg / 8.3 = number of seconds needed to read it. rounded down to 8 chars per sec - -- map function: (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min - - local maxRateRatio = 3 - - speed = speed or 1.0 - isGoogle = isGoogle or false - - local speedFactor = 1.0 - if isGoogle then - speedFactor = speed - else - if speed ~= 0 then - speedFactor = math.abs(speed) * (maxRateRatio - 1) / 10 + 1 - end - if speed < 0 then - speedFactor = 1/speedFactor - end - end - - local wpm = math.ceil(100 * speedFactor) - local cps = math.floor((wpm * 5)/60) - - if type(length) == "string" then - length = string.len(length) - end - - return math.ceil(length/cps) -end - -function STTS.TextToSpeech(message,freqs,modulations, volume,name, coalition,point, speed,gender,culture,voice, googleTTS ) - if os == nil or io == nil then - env.info("[DCS-STTS] LUA modules os or io are sanitized. skipping. ") - return - end - - speed = speed or 1 - gender = gender or "female" - culture = culture or "" - voice = voice or "" - - - message = message:gsub("\"","\\\"") - - local cmd = string.format("start /min \"\" /d \"%s\" /b \"%s\" -f %s -m %s -c %s -p %s -n \"%s\" -h", STTS.DIRECTORY, STTS.EXECUTABLE, freqs, modulations, coalition,STTS.SRS_PORT, name ) - - if voice ~= "" then - cmd = cmd .. string.format(" -V \"%s\"",voice) - else - - if culture ~= "" then - cmd = cmd .. string.format(" -l %s",culture) - end - - if gender ~= "" then - cmd = cmd .. string.format(" -g %s",gender) - end - end - - if googleTTS == true then - cmd = cmd .. string.format(" -G \"%s\"",STTS.GOOGLE_CREDENTIALS) - end - - if speed ~= 1 then - cmd = cmd .. string.format(" -s %s",speed) - end - - if volume ~= 1.0 then - cmd = cmd .. string.format(" -v %s",volume) - end - - if point and type(point) == "table" and point.x then - local lat, lon, alt = coord.LOtoLL(point) - - lat = STTS.round(lat,4) - lon = STTS.round(lon,4) - alt = math.floor(alt) - - cmd = cmd .. string.format(" -L %s -O %s -A %s",lat,lon,alt) - end - - cmd = cmd ..string.format(" -t \"%s\"",message) - - if string.len(cmd) > 255 then - local filename = os.getenv('TMP') .. "\\DCS_STTS-" .. STTS.uuid() .. ".bat" - local script = io.open(filename,"w+") - script:write(cmd .. " && exit" ) - script:close() - cmd = string.format("\"%s\"",filename) - timer.scheduleFunction(os.remove, filename, timer.getTime() + 1) - end - - if string.len(cmd) > 255 then - env.info("[DCS-STTS] - cmd string too long") - env.info("[DCS-STTS] TextToSpeech Command :\n" .. cmd.."\n") - end - os.execute(cmd) - - return STTS.getSpeechTime(message,speed,googleTTS) - -end - -function STTS.PlayMP3(pathToMP3,freqs,modulations, volume,name, coalition,point ) - - local cmd = string.format("start \"\" /d \"%s\" /b /min \"%s\" -i \"%s\" -f %s -m %s -c %s -p %s -n \"%s\" -v %s -h", STTS.DIRECTORY, STTS.EXECUTABLE, pathToMP3, freqs, modulations, coalition,STTS.SRS_PORT, name, volume ) - - if point and type(point) == "table" and point.x then - local lat, lon, alt = coord.LOtoLL(point) - - lat = STTS.round(lat,4) - lon = STTS.round(lon,4) - alt = math.floor(alt) - - cmd = cmd .. string.format(" -L %s -O %s -A %s",lat,lon,alt) - end - - env.info("[DCS-STTS] MP3/OGG Command :\n" .. cmd.."\n") - os.execute(cmd) - -end - -------------------------THIS BIT IS THE CODE YOU'D RUN IN GAME - -tts = {} -tts.words = "All players, all players, AO update in 5 Magic to all players AO update as follows Weather over North ranges is good, recommending full up war. altimeter 3 0 decimal 1 2 , flare restrictions above 5000,in the MOA's and burnout by 100 ft in western ranges. Chaff below 20,000 for all playersAir picture is multiple groups bandits forming a north south CAP 60 miles north west of bullseye, no SAM,manpad or triple A. All units are approved to start moving into tracks for exercise start, exercise commences in 5 minutes" - -tts.atis = "All players, all players, AO update in 5 Magic to all players AO update as follows Weather over North ranges is good, recommending full up war. altimeter 3 0 decimal 1 2 , flare restrictions above 5000,in the MOA's and burnout by 100 ft in western ranges. Chaff below 20,000 for all playersAir picture is multiple groups bandits forming a north south CAP 60 miles north west of bullseye, no SAM,manpad or triple A. All units are approved to start moving into tracks for exercise start, exercise commences in 5 minutes" - -function tts.notify(message, displayFor) - trigger.action.outText(message, displayFor) -end - -function tts.normal () - STTS.TextToSpeech(tts.words,"251","AM","1.0","SRS",2) -end - -function tts.russian () - STTS.TextToSpeech(tts.words,"251","AM","1.0","SRS",2,null,1,"female","ru-RU","Microsoft Irina Desktop") -end - - -do - longRangeShots = missionCommands.addSubMenu("Crash checks") - missionCommands.addCommand ("Speak", longRangeShots, tts.normal) - missionCommands.addCommand ("Speak russian", longRangeShots, tts.russian) - -end - -tts.notify("crashTest.lua loaded", 2) - +--------------------------------THIS FIRST BIT IS THE SRS CODE BLOCK------------------- +-------------------- first 4 things need to be set correctly for the server, they are for ours, we don't do the google creds yet + +STTS = {} +-- FULL Path to the FOLDER containing DCS-SR-ExternalAudio.exe - EDIT TO CORRECT FOLDER +STTS.DIRECTORY = "C:\\Users\\Administrator\\Desktop\\DCS\\SRS Refugees" + +STTS.SRS_PORT = 5002 -- LOCAL SRS PORT - DEFAULT IS 5002 +STTS.GOOGLE_CREDENTIALS = "C:\\Users\\Ciaran\\Downloads\\googletts.json" + +-- DONT CHANGE THIS UNLESS YOU KNOW WHAT YOU'RE DOING +STTS.EXECUTABLE = "DCS-SR-ExternalAudio.exe" + +local random = math.random +function STTS.uuid() + local template ='yxxx-xxxxxxxxxxxx' + return string.gsub(template, '[xy]', function (c) + local v = (c == 'x') and random(0, 0xf) or random(8, 0xb) + return string.format('%x', v) + end) +end + +function STTS.round(x, n) + n = math.pow(10, n or 0) + x = x * n + if x >= 0 then x = math.floor(x + 0.5) else x = math.ceil(x - 0.5) end + return x / n +end + +function STTS.getSpeechTime(length,speed,isGoogle) + -- Function returns estimated speech time in seconds + + -- Assumptions for time calc: 100 Words per min, avarage of 5 letters for english word + -- so 5 chars * 100wpm = 500 characters per min = 8.3 chars per second + -- so lengh of msg / 8.3 = number of seconds needed to read it. rounded down to 8 chars per sec + -- map function: (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min + + local maxRateRatio = 3 + + speed = speed or 1.0 + isGoogle = isGoogle or false + + local speedFactor = 1.0 + if isGoogle then + speedFactor = speed + else + if speed ~= 0 then + speedFactor = math.abs(speed) * (maxRateRatio - 1) / 10 + 1 + end + if speed < 0 then + speedFactor = 1/speedFactor + end + end + + local wpm = math.ceil(100 * speedFactor) + local cps = math.floor((wpm * 5)/60) + + if type(length) == "string" then + length = string.len(length) + end + + return math.ceil(length/cps) +end + +function STTS.TextToSpeech(message,freqs,modulations, volume,name, coalition,point, speed,gender,culture,voice, googleTTS ) + if os == nil or io == nil then + env.info("[DCS-STTS] LUA modules os or io are sanitized. skipping. ") + return + end + + speed = speed or 1 + gender = gender or "female" + culture = culture or "" + voice = voice or "" + + + message = message:gsub("\"","\\\"") + + local cmd = string.format("start /min \"\" /d \"%s\" /b \"%s\" -f %s -m %s -c %s -p %s -n \"%s\" -h", STTS.DIRECTORY, STTS.EXECUTABLE, freqs, modulations, coalition,STTS.SRS_PORT, name ) + + if voice ~= "" then + cmd = cmd .. string.format(" -V \"%s\"",voice) + else + + if culture ~= "" then + cmd = cmd .. string.format(" -l %s",culture) + end + + if gender ~= "" then + cmd = cmd .. string.format(" -g %s",gender) + end + end + + if googleTTS == true then + cmd = cmd .. string.format(" -G \"%s\"",STTS.GOOGLE_CREDENTIALS) + end + + if speed ~= 1 then + cmd = cmd .. string.format(" -s %s",speed) + end + + if volume ~= 1.0 then + cmd = cmd .. string.format(" -v %s",volume) + end + + if point and type(point) == "table" and point.x then + local lat, lon, alt = coord.LOtoLL(point) + + lat = STTS.round(lat,4) + lon = STTS.round(lon,4) + alt = math.floor(alt) + + cmd = cmd .. string.format(" -L %s -O %s -A %s",lat,lon,alt) + end + + cmd = cmd ..string.format(" -t \"%s\"",message) + + if string.len(cmd) > 255 then + local filename = os.getenv('TMP') .. "\\DCS_STTS-" .. STTS.uuid() .. ".bat" + local script = io.open(filename,"w+") + script:write(cmd .. " && exit" ) + script:close() + cmd = string.format("\"%s\"",filename) + timer.scheduleFunction(os.remove, filename, timer.getTime() + 1) + end + + if string.len(cmd) > 255 then + env.info("[DCS-STTS] - cmd string too long") + env.info("[DCS-STTS] TextToSpeech Command :\n" .. cmd.."\n") + end + os.execute(cmd) + + return STTS.getSpeechTime(message,speed,googleTTS) + +end + +function STTS.PlayMP3(pathToMP3,freqs,modulations, volume,name, coalition,point ) + + local cmd = string.format("start \"\" /d \"%s\" /b /min \"%s\" -i \"%s\" -f %s -m %s -c %s -p %s -n \"%s\" -v %s -h", STTS.DIRECTORY, STTS.EXECUTABLE, pathToMP3, freqs, modulations, coalition,STTS.SRS_PORT, name, volume ) + + if point and type(point) == "table" and point.x then + local lat, lon, alt = coord.LOtoLL(point) + + lat = STTS.round(lat,4) + lon = STTS.round(lon,4) + alt = math.floor(alt) + + cmd = cmd .. string.format(" -L %s -O %s -A %s",lat,lon,alt) + end + + env.info("[DCS-STTS] MP3/OGG Command :\n" .. cmd.."\n") + os.execute(cmd) + +end + +------------------------THIS BIT IS THE CODE YOU'D RUN IN GAME + +tts = {} +tts.words = "All players, all players, AO update in 5 Magic to all players AO update as follows Weather over North ranges is good, recommending full up war. altimeter 3 0 decimal 1 2 , flare restrictions above 5000,in the MOA's and burnout by 100 ft in western ranges. Chaff below 20,000 for all playersAir picture is multiple groups bandits forming a north south CAP 60 miles north west of bullseye, no SAM,manpad or triple A. All units are approved to start moving into tracks for exercise start, exercise commences in 5 minutes" + +tts.atis = "All players, all players, AO update in 5 Magic to all players AO update as follows Weather over North ranges is good, recommending full up war. altimeter 3 0 decimal 1 2 , flare restrictions above 5000,in the MOA's and burnout by 100 ft in western ranges. Chaff below 20,000 for all playersAir picture is multiple groups bandits forming a north south CAP 60 miles north west of bullseye, no SAM,manpad or triple A. All units are approved to start moving into tracks for exercise start, exercise commences in 5 minutes" + +function tts.notify(message, displayFor) + trigger.action.outText(message, displayFor) +end + +function tts.normal () + STTS.TextToSpeech(tts.words,"251","AM","1.0","SRS",2) +end + +function tts.russian () + STTS.TextToSpeech(tts.words,"251","AM","1.0","SRS",2,null,1,"female","ru-RU","Microsoft Irina Desktop") +end + + +do + longRangeShots = missionCommands.addSubMenu("Crash checks") + missionCommands.addCommand ("Speak", longRangeShots, tts.normal) + missionCommands.addCommand ("Speak russian", longRangeShots, tts.russian) + +end + +tts.notify("crashTest.lua loaded", 2) + diff --git a/scripts/poleGen.lua b/scripts/examples/poleGen.lua similarity index 96% rename from scripts/poleGen.lua rename to scripts/examples/poleGen.lua index 16b9e336..246e7ea5 100644 --- a/scripts/poleGen.lua +++ b/scripts/examples/poleGen.lua @@ -1,628 +1,628 @@ ---max range, altitude and it fails? ---shoot right up ---fix sa10 and sa 11 - ---different static layouts on a carrier depending on what is going on ---guns on a static ship at sea? - - -pg = {} -handler = {} -pg.name = "Sam" -pg.cloneName = "Clone" -pg.fakeTargetName = "Player" -pg.samCounter = 1 -pg.droneAlt = 20000 -pg.delay = 40 -pg.missileSpeed = 565 -pg.samLoc = {} -pg.samLoc.x = 1 -pg.samLoc.y = 1 -pg.samLoc.z = 1 -pg.missilesActive = 0 -pg.droneName = nil -pg.droneSpeed = 300 -pg.hidden = false -pg.samDB = {[1] = {["missileDelay"] = 40, ["missileSpeed"] = 770}, - [2] = {["missileDelay"] = 40, ["missileSpeed"] = 770}, - [3] = {["missileDelay"] = 120, ["missileSpeed"] = 550}, - [4] = {["missileDelay"] = 40, ["missileSpeed"] = 770}, - [5] = {["missileDelay"] = 65, ["missileSpeed"] = 770}, - [6] = {["missileDelay"] = 60, ["missileSpeed"] = 500}, - [7] = {["missileDelay"] = 40, ["missileSpeed"] = 770}, - [8] = {["missileDelay"] = 40, ["missileSpeed"] = 770}, - [9] = {["missileDelay"] = 40, ["missileSpeed"] = 770}, - [10] = {["missileDelay"] = 60, ["missileSpeed"] = 1400}, - } - -function pg.notify(message, displayFor) - trigger.action.outText(message, displayFor, false) -end - - -function pg.fakeSam(vec3) - - playerTarget = Unit.getByName(pg.fakeTargetName) - pointFakeTarget = playerTarget:getPosition().p - vec3 = vec3 or pg.samLoc - - vecSub = mist.vec.sub(pointFakeTarget , vec3) - planeHeading = mist.utils.getDir(vecSub) - missileType = 2 - pg.spawnDrone (vec3,planeHeading,playerTarget,missileType) - - --pg.notify("FakeSam Ran", 10) - - targetID = Group.getByName("TargetDrone" .. pg.samCounter):getUnit(1):getID() - samGroup = Group.getByName("poleGenerator" .. pg.samCounter) - vars = {[1] = targetID, [2] = samGroup} - timer.scheduleFunction(pg.attack ,vars, timer.getTime() + 1) - pg.samCounter = pg.samCounter + 1 - -end - - -function pg.spawnSamSA2 (vec3,heading) - --where - --name - group = {} - group.groupName = "poleGenerator" .. pg.samCounter - group.units = { - [1] = - { - ["skill"] = "High", - ["coldAtStart"] = false, - ["hidden"] = pg.hidden, - ["type"] = "S_75M_Volhov", - --["unitId"] = 35, - ["y"] = vec3.z-40, - ["x"] = vec3.x-40, - --["name"] = "Ground-1-2", - ["heading"] = heading+math.pi, - ["playerCanDrive"] = false, - }, -- end of [1] - [2] = - { - ["skill"] = "High", - ["coldAtStart"] = false, - ["type"] = "SNR_75V", - --["unitId"] = 34, - ["y"] = vec3.z, - ["x"] = vec3.x, - --["name"] = "Ground-1-1", - ["heading"] = heading+math.pi, - ["playerCanDrive"] = false, - }, -- end of [2] - } - group.hidden = pg.hidden - group.category = "VEHICLE" - group.country = 54 - mist.dynAdd(group) - --heading -end - -function pg.spawnSamSA3 (vec3,heading) - --where - --name - group = {} - group.groupName = "poleGenerator" .. pg.samCounter - group.units = { - [1] = - { - ["skill"] = "High", - ["coldAtStart"] = false, - ["hidden"] = pg.hidden, - ["type"] = "snr s-125 tr", - --["unitId"] = 35, - ["y"] = vec3.z-40, - ["x"] = vec3.x-40, - --["name"] = "Ground-1-2", - ["heading"] = heading+math.pi, - ["playerCanDrive"] = false, - }, -- end of [1] - [2] = - { - ["skill"] = "High", - ["coldAtStart"] = false, - ["type"] = "5p73 s-125 ln", - --["unitId"] = 34, - ["y"] = vec3.z, - ["x"] = vec3.x, - --["name"] = "Ground-1-1", - ["heading"] = heading+math.pi, - ["playerCanDrive"] = false, - }, -- end of [2] - } - group.hidden = pg.hidden - group.category = "VEHICLE" - group.country = 54 - mist.dynAdd(group) - --heading -end - -function pg.spawnSamSA5 (vec3,heading) - --where - --name - group = {} - group.groupName = "poleGenerator" .. pg.samCounter - group.units = { - [1] = - { - ["skill"] = "High", - ["coldAtStart"] = false, - ["hidden"] = pg.hidden, - ["type"] = "RPC_5N62V", - --["unitId"] = 35, - ["y"] = vec3.z-40, - ["x"] = vec3.x-40, - --["name"] = "Ground-1-2", - ["heading"] = heading+math.pi, - ["playerCanDrive"] = false, - }, -- end of [1] - [2] = - { - ["skill"] = "High", - ["coldAtStart"] = false, - ["type"] = "RLS_19J6", - --["unitId"] = 34, - ["y"] = vec3.z, - ["x"] = vec3.x, - --["name"] = "Ground-1-1", - ["heading"] = heading+math.pi, - ["playerCanDrive"] = false, - }, -- end of [2] - [3] = - { - ["skill"] = "High", - ["coldAtStart"] = false, - ["type"] = "S-200_Launcher", - --["unitId"] = 34, - ["y"] = vec3.z-80, - ["x"] = vec3.x-80, - --["name"] = "Ground-1-1", - ["heading"] = heading+math.pi, - ["playerCanDrive"] = false, - }, -- end of [3] - } - group.hidden = pg.hidden - group.category = "VEHICLE" - group.country = 54 - mist.dynAdd(group) - --heading -end - -function pg.spawnSamSA6 (vec3,heading) - --where - --name - group = {} - group.groupName = "poleGenerator" .. pg.samCounter - group.units = { - [1] = - { - ["skill"] = "High", - ["coldAtStart"] = false, - ["hidden"] = pg.hidden, - ["type"] = "Kub 1S91 str", - --["unitId"] = 35, - ["y"] = vec3.z-40, - ["x"] = vec3.x-40, - --["name"] = "Ground-1-2", - ["heading"] = heading+math.pi, - ["playerCanDrive"] = false, - }, -- end of [1] - [2] = - { - ["skill"] = "High", - ["coldAtStart"] = false, - ["type"] = "Kub 2P25 ln", - --["unitId"] = 34, - ["y"] = vec3.z, - ["x"] = vec3.x, - --["name"] = "Ground-1-1", - ["heading"] = heading+math.pi, - ["playerCanDrive"] = false, - }, -- end of [2] - } - group.hidden = pg.hidden - group.category = "VEHICLE" - group.country = 54 - mist.dynAdd(group) - --heading -end - -function pg.spawnSamSA10 (vec3,heading) - --where - --name - group = {} - group.groupName = "poleGenerator" .. pg.samCounter - group.units = { - [1] = - { - ["skill"] = "High", - ["coldAtStart"] = false, - ["hidden"] = pg.hidden, - ["type"] = "S-300PS 40B6M tr", - --["unitId"] = 35, - ["y"] = vec3.z, - ["x"] = vec3.x, - --["name"] = "Ground-1-2", - ["heading"] = heading+math.pi, - ["playerCanDrive"] = false, - }, -- end of [1] - [2] = - { - ["skill"] = "High", - ["coldAtStart"] = false, - ["type"] = "S-300PS 64H6E sr", - --["unitId"] = 34, - ["y"] = vec3.z-10, - ["x"] = vec3.x-10, - --["name"] = "Ground-1-1", - ["heading"] = heading+math.pi, - ["playerCanDrive"] = false, - }, -- end of [2] - [3] = - { - ["skill"] = "High", - ["coldAtStart"] = false, - ["type"] = "S-300PS 54K6 cp", - --["unitId"] = 34, - ["y"] = vec3.z-20, - ["x"] = vec3.x-20, - --["name"] = "Ground-1-1", - ["heading"] = heading+math.pi, - ["playerCanDrive"] = false, - }, -- end of [3] - [4] = - { - ["skill"] = "High", - ["coldAtStart"] = false, - ["type"] = "S-300PS 5P85C ln", - --["unitId"] = 34, - ["y"] = vec3.z-40, - ["x"] = vec3.x-40, - --["name"] = "Ground-1-1", - ["heading"] = heading+math.pi, - ["playerCanDrive"] = false, - }, -- end of [4] - } - group.hidden = pg.hidden - group.category = "VEHICLE" - group.country = 54 - mist.dynAdd(group) - --heading -end - -function pg.spawnSamSA11 (vec3,heading) - --where - --name - group = {} - group.groupName = "poleGenerator" .. pg.samCounter - group.units = { - [1] = - { - ["skill"] = "High", - ["coldAtStart"] = false, - ["hidden"] = pg.hidden, - ["type"] = "SA-11 Buk SR 9S18M1", - --["unitId"] = 35, - ["y"] = vec3.z-40, - ["x"] = vec3.x-40, - --["name"] = "Ground-1-2", - ["heading"] = heading+math.pi, - ["playerCanDrive"] = false, - }, -- end of [1] - [2] = - { - ["skill"] = "High", - ["coldAtStart"] = false, - ["type"] = "SA-11 Buk CC 9S470M1", - --["unitId"] = 34, - ["y"] = vec3.z, - ["x"] = vec3.x, - --["name"] = "Ground-1-1", - ["heading"] = heading+math.pi, - ["playerCanDrive"] = false, - }, -- end of [2] - [2] = - { - ["skill"] = "High", - ["coldAtStart"] = false, - ["type"] = "SA-11 Buk LN 9A310M1", - --["unitId"] = 34, - ["y"] = vec3.z, - ["x"] = vec3.x, - --["name"] = "Ground-1-1", - ["heading"] = heading+math.pi, - ["playerCanDrive"] = false, - }, -- end of [2] - } - group.hidden = pg.hidden - group.category = "VEHICLE" - group.country = 54 - mist.dynAdd(group) - --heading -end - - - -function pg.spawnDrone(vec3,planeHeading,playerTarget,missileType) - -- where is the plane going to be in x seconds - playerTargetPos = playerTarget:getPosition().p - futurePlayerTargetPos = playerTargetPos - playerMotionVec = Object.getVelocity(playerTarget) - - --work out what type of SAM we are shooting to work out the delay, missile speed etc - - if missileType == 2 then - pg.delay = pg.samDB[2].missileDelay - pg.missileSpeed = pg.samDB[2].missileSpeed - elseif missileType == 3 then - pg.delay = pg.samDB[3].missileDelay - pg.missileSpeed = pg.samDB[3].missileSpeed - elseif missileType == 5 then - pg.delay = pg.samDB[5].missileDelay - pg.missileSpeed = pg.samDB[5].missileSpeed - elseif missileType == 6 then - pg.delay = pg.samDB[6].missileDelay - pg.missileSpeed = pg.samDB[5].missileSpeed - elseif missileType == 10 then - pg.delay = pg.samDB[10].missileDelay - pg.missileSpeed = pg.samDB[10].missileSpeed - elseif missileType == 11 then - pg.delay = pg.samDB[11].missileDelay - pg.missileSpeed = pg.samDB[11].missileSpeed - else --assume SA2 - pg.delay = pg.samDB[2].missileDelay - pg.missileSpeed = pg.samDB[2].missileSpeed - end - - futurePlayerTargetPos.x = playerTargetPos.x + playerMotionVec.x*pg.delay - futurePlayerTargetPos.y = playerTargetPos.y + playerMotionVec.y*pg.delay - futurePlayerTargetPos.z = playerTargetPos.z + playerMotionVec.z*pg.delay - droneTurnPoint = mist.projectPoint(futurePlayerTargetPos, 10000 ,planeHeading+math.pi) - --this is where the plane will be when the missile is launched - - - - --pythago to get hyp - --x^2 + y^x = hyp^2 - x = mist.utils.get2DDist(futurePlayerTargetPos,vec3) - - y = playerTargetPos.y - --pg.notify(y,5) - hyp = math.sqrt(x^2 + y^2) - roughFlightTime = hyp /pg.missileSpeed-- distance / speed - - futurePlayerTargetPos.x = futurePlayerTargetPos.x + playerMotionVec.x*roughFlightTime - futurePlayerTargetPos.y = futurePlayerTargetPos.y + playerMotionVec.y*roughFlightTime - futurePlayerTargetPos.z = futurePlayerTargetPos.z + playerMotionVec.z*roughFlightTime - --this is where the plane will be when the missile arrives at its altitude - - --now we need to work out where the drone is going to go - vecSub = mist.vec.sub(vec3,futurePlayerTargetPos) - heading = mist.utils.getDir(vecSub) --heading between picked location and future pos - extendDistance = x + 10000 - - alt = (((futurePlayerTargetPos.y) * extendDistance)/x) - - droneAtTimePos = mist.projectPoint(vec3, extendDistance ,heading +math.pi) - - extendDistance = extendDistance + pg.droneSpeed*roughFlightTime - droneAtStartPos = mist.projectPoint(vec3, extendDistance ,heading +math.pi) - --we want to curve the missile in the players direction - --planeHeading - - pg.makeDrone(droneAtStartPos,heading, droneAtTimePos, futurePlayerTargetPos,alt,droneTurnPoint) - if missileType == 2 then - pg.spawnSamSA2 (vec3,heading) - elseif missileType == 3 then - pg.spawnSamSA3 (vec3,heading) - elseif missileType == 5 then - pg.spawnSamSA5 (vec3,heading) - elseif missileType == 6 then - pg.spawnSamSA6 (vec3,heading) - elseif missileType == 10 then - pg.spawnSamSA10 (vec3,heading) - else --assume SA2 - pg.spawnSamSA2 (vec3,heading) - end - - -end - -function pg.makeDrone(spawnVec,heading, routeVec, nextRouteVec,alt,droneTurnPoint) - --this spawns in the drone - group = DroneClone - group.groupName = "TargetDrone" .. pg.samCounter - group.groupId = nil - group.units[1].unitId = nil - group.units[1].unitName = nil - group.units[1].y = spawnVec.z - group.units[1].x = spawnVec.x - group.units[1].heading = heading - group.units[1].alt = alt - group.route["points"][2] = group.route["points"][1] - group.route["points"][3] = group.route["points"][1] - group.route["points"][1]["y"] = routeVec.z - group.route["points"][1]["x"] = routeVec.x - group.route["points"][1]["alt"] = alt - group.route["points"][2]["y"] = nextRouteVec.z - group.route["points"][2]["x"] = nextRouteVec.x - group.route["points"][2]["alt"] = alt - group.route["points"][3]["y"] = droneTurnPoint.z - group.route["points"][3]["x"] = droneTurnPoint.x - group.route["points"][3]["alt"] = alt - group.countryId = 56 - group.category = 'AIRPLANE' - mist.dynAdd(group) -end - - -function pg.attack (vars) - targetID = vars[1] - samGroup = vars[2] - AttackUnit = { - id = 'AttackUnit', - params = { - unitId = targetID, - attackQtyLimit = true, - attackQty = 1, - } - } - - local controller = samGroup:getController() - controller:pushTask(AttackUnit) -end - - - -function pg.radarOff () - group = Group.getByName(pg.name) - local controller = group:getController() - controller:setOption(9,1) -end - -function pg.radarOn () - group = Group.getByName(pg.name) - local controller = group:getController() - controller:setOption(9,0) -end - - DroneClone= - { - ["modulation"] = 0, - ["tasks"] = - { - }, -- end of ["tasks"] - ["task"] = "Reconnaissance", - ["uncontrolled"] = false, - ["route"] = - { - ["points"] = - { - [1] = - { - ["alt"] = 2000, - ["action"] = "Turning Point", - ["alt_type"] = "BARO", - ["speed"] = 82.222222222222, - ["task"] = - { - ["id"] = "ComboTask", - ["params"] = - { - ["tasks"] = - {}, -- end of ["tasks"] - }, -- end of ["params"] - }, -- end of ["task"] - ["type"] = "Turning Point", - ["ETA"] = 0, - ["ETA_locked"] = true, - ["y"] = 0, - ["x"] = 0, - ["formation_template"] = "", - ["speed_locked"] = true, - }, -- end of [1] - [2] = - { - ["alt"] = 2000, - ["action"] = "Turning Point", - ["alt_type"] = "BARO", - ["speed"] = 82.222222222222, - ["task"] = - { - ["id"] = "ComboTask", - ["params"] = - { - ["tasks"] = - { - }, -- end of ["tasks"] - }, -- end of ["params"] - }, -- end of ["task"] - ["type"] = "Turning Point", - ["ETA"] = 157.20107538291, - ["ETA_locked"] = false, - ["y"] = 0, - ["x"] = 0, - ["formation_template"] = "", - ["speed_locked"] = true, - }, -- end of [2] - }, -- end of ["points"] - }, -- end of ["route"] - --["groupId"] = 1, - ["hidden"] = pg.hidden, - ["units"] = - { - [1] = - { - ["alt"] = 2000, - ["alt_type"] = "BARO", - ["livery_id"] = "'camo' scheme", - ["skill"] = "High", - ["speed"] = 82.222222222222, - ["type"] = "MQ-9 Reaper", - --["unitId"] = 1, - --["psi"] = -3.129323330636, - ["y"] = 0, - ["x"] = 0, - ["payload"] = - { - ["pylons"] = - { - }, -- end of ["pylons"] - ["fuel"] = 1300, - ["flare"] = 0, - ["chaff"] = 0, - ["gun"] = 100, - }, -- end of ["payload"] - ["heading"] = 0.5, - ["callsign"] = - { - [1] = 1, - [2] = 1, - [3] = 1, - ["name"] = "Enfield11", - }, -- end of ["callsign"] - ["onboard_num"] = "010", - }, -- end of [1] - }, -- end of ["units"] - ["y"] = 0, - ["x"] = 0, - ["communication"] = true, - ["start_time"] = 0, - ["frequency"] = 124, - } - - -local function protectedCall(...) - local status, retval = pcall(...) - if not status then - - end -end - -function handler:onEvent(event) - protectedCall(pg.eventHandler, event) -end - -function pg.eventHandler (event) - if (26 == event.id) then --this is when someone types into a mark - local vec3 = mist.utils.makeVec3GL(event.pos) - pg.fakeSam (vec3) - end -end - -function handler:onEvent(event) - protectedCall(pg.eventHandler, event) -end - - -do - longRangeShots = missionCommands.addSubMenu("SAM") - missionCommands.addCommand ("Generate pole", longRangeShots, pg.fakeSam) - world.addEventHandler(handler) -end - -pg.notify("poleGen.lua",10) - +--max range, altitude and it fails? +--shoot right up +--fix sa10 and sa 11 + +--different static layouts on a carrier depending on what is going on +--guns on a static ship at sea? + + +pg = {} +handler = {} +pg.name = "Sam" +pg.cloneName = "Clone" +pg.fakeTargetName = "Player" +pg.samCounter = 1 +pg.droneAlt = 20000 +pg.delay = 40 +pg.missileSpeed = 565 +pg.samLoc = {} +pg.samLoc.x = 1 +pg.samLoc.y = 1 +pg.samLoc.z = 1 +pg.missilesActive = 0 +pg.droneName = nil +pg.droneSpeed = 300 +pg.hidden = false +pg.samDB = {[1] = {["missileDelay"] = 40, ["missileSpeed"] = 770}, + [2] = {["missileDelay"] = 40, ["missileSpeed"] = 770}, + [3] = {["missileDelay"] = 120, ["missileSpeed"] = 550}, + [4] = {["missileDelay"] = 40, ["missileSpeed"] = 770}, + [5] = {["missileDelay"] = 65, ["missileSpeed"] = 770}, + [6] = {["missileDelay"] = 60, ["missileSpeed"] = 500}, + [7] = {["missileDelay"] = 40, ["missileSpeed"] = 770}, + [8] = {["missileDelay"] = 40, ["missileSpeed"] = 770}, + [9] = {["missileDelay"] = 40, ["missileSpeed"] = 770}, + [10] = {["missileDelay"] = 60, ["missileSpeed"] = 1400}, + } + +function pg.notify(message, displayFor) + trigger.action.outText(message, displayFor, false) +end + + +function pg.fakeSam(vec3) + + playerTarget = Unit.getByName(pg.fakeTargetName) + pointFakeTarget = playerTarget:getPosition().p + vec3 = vec3 or pg.samLoc + + vecSub = mist.vec.sub(pointFakeTarget , vec3) + planeHeading = mist.utils.getDir(vecSub) + missileType = 2 + pg.spawnDrone (vec3,planeHeading,playerTarget,missileType) + + --pg.notify("FakeSam Ran", 10) + + targetID = Group.getByName("TargetDrone" .. pg.samCounter):getUnit(1):getID() + samGroup = Group.getByName("poleGenerator" .. pg.samCounter) + vars = {[1] = targetID, [2] = samGroup} + timer.scheduleFunction(pg.attack ,vars, timer.getTime() + 1) + pg.samCounter = pg.samCounter + 1 + +end + + +function pg.spawnSamSA2 (vec3,heading) + --where + --name + group = {} + group.groupName = "poleGenerator" .. pg.samCounter + group.units = { + [1] = + { + ["skill"] = "High", + ["coldAtStart"] = false, + ["hidden"] = pg.hidden, + ["type"] = "S_75M_Volhov", + --["unitId"] = 35, + ["y"] = vec3.z-40, + ["x"] = vec3.x-40, + --["name"] = "Ground-1-2", + ["heading"] = heading+math.pi, + ["playerCanDrive"] = false, + }, -- end of [1] + [2] = + { + ["skill"] = "High", + ["coldAtStart"] = false, + ["type"] = "SNR_75V", + --["unitId"] = 34, + ["y"] = vec3.z, + ["x"] = vec3.x, + --["name"] = "Ground-1-1", + ["heading"] = heading+math.pi, + ["playerCanDrive"] = false, + }, -- end of [2] + } + group.hidden = pg.hidden + group.category = "VEHICLE" + group.country = 54 + mist.dynAdd(group) + --heading +end + +function pg.spawnSamSA3 (vec3,heading) + --where + --name + group = {} + group.groupName = "poleGenerator" .. pg.samCounter + group.units = { + [1] = + { + ["skill"] = "High", + ["coldAtStart"] = false, + ["hidden"] = pg.hidden, + ["type"] = "snr s-125 tr", + --["unitId"] = 35, + ["y"] = vec3.z-40, + ["x"] = vec3.x-40, + --["name"] = "Ground-1-2", + ["heading"] = heading+math.pi, + ["playerCanDrive"] = false, + }, -- end of [1] + [2] = + { + ["skill"] = "High", + ["coldAtStart"] = false, + ["type"] = "5p73 s-125 ln", + --["unitId"] = 34, + ["y"] = vec3.z, + ["x"] = vec3.x, + --["name"] = "Ground-1-1", + ["heading"] = heading+math.pi, + ["playerCanDrive"] = false, + }, -- end of [2] + } + group.hidden = pg.hidden + group.category = "VEHICLE" + group.country = 54 + mist.dynAdd(group) + --heading +end + +function pg.spawnSamSA5 (vec3,heading) + --where + --name + group = {} + group.groupName = "poleGenerator" .. pg.samCounter + group.units = { + [1] = + { + ["skill"] = "High", + ["coldAtStart"] = false, + ["hidden"] = pg.hidden, + ["type"] = "RPC_5N62V", + --["unitId"] = 35, + ["y"] = vec3.z-40, + ["x"] = vec3.x-40, + --["name"] = "Ground-1-2", + ["heading"] = heading+math.pi, + ["playerCanDrive"] = false, + }, -- end of [1] + [2] = + { + ["skill"] = "High", + ["coldAtStart"] = false, + ["type"] = "RLS_19J6", + --["unitId"] = 34, + ["y"] = vec3.z, + ["x"] = vec3.x, + --["name"] = "Ground-1-1", + ["heading"] = heading+math.pi, + ["playerCanDrive"] = false, + }, -- end of [2] + [3] = + { + ["skill"] = "High", + ["coldAtStart"] = false, + ["type"] = "S-200_Launcher", + --["unitId"] = 34, + ["y"] = vec3.z-80, + ["x"] = vec3.x-80, + --["name"] = "Ground-1-1", + ["heading"] = heading+math.pi, + ["playerCanDrive"] = false, + }, -- end of [3] + } + group.hidden = pg.hidden + group.category = "VEHICLE" + group.country = 54 + mist.dynAdd(group) + --heading +end + +function pg.spawnSamSA6 (vec3,heading) + --where + --name + group = {} + group.groupName = "poleGenerator" .. pg.samCounter + group.units = { + [1] = + { + ["skill"] = "High", + ["coldAtStart"] = false, + ["hidden"] = pg.hidden, + ["type"] = "Kub 1S91 str", + --["unitId"] = 35, + ["y"] = vec3.z-40, + ["x"] = vec3.x-40, + --["name"] = "Ground-1-2", + ["heading"] = heading+math.pi, + ["playerCanDrive"] = false, + }, -- end of [1] + [2] = + { + ["skill"] = "High", + ["coldAtStart"] = false, + ["type"] = "Kub 2P25 ln", + --["unitId"] = 34, + ["y"] = vec3.z, + ["x"] = vec3.x, + --["name"] = "Ground-1-1", + ["heading"] = heading+math.pi, + ["playerCanDrive"] = false, + }, -- end of [2] + } + group.hidden = pg.hidden + group.category = "VEHICLE" + group.country = 54 + mist.dynAdd(group) + --heading +end + +function pg.spawnSamSA10 (vec3,heading) + --where + --name + group = {} + group.groupName = "poleGenerator" .. pg.samCounter + group.units = { + [1] = + { + ["skill"] = "High", + ["coldAtStart"] = false, + ["hidden"] = pg.hidden, + ["type"] = "S-300PS 40B6M tr", + --["unitId"] = 35, + ["y"] = vec3.z, + ["x"] = vec3.x, + --["name"] = "Ground-1-2", + ["heading"] = heading+math.pi, + ["playerCanDrive"] = false, + }, -- end of [1] + [2] = + { + ["skill"] = "High", + ["coldAtStart"] = false, + ["type"] = "S-300PS 64H6E sr", + --["unitId"] = 34, + ["y"] = vec3.z-10, + ["x"] = vec3.x-10, + --["name"] = "Ground-1-1", + ["heading"] = heading+math.pi, + ["playerCanDrive"] = false, + }, -- end of [2] + [3] = + { + ["skill"] = "High", + ["coldAtStart"] = false, + ["type"] = "S-300PS 54K6 cp", + --["unitId"] = 34, + ["y"] = vec3.z-20, + ["x"] = vec3.x-20, + --["name"] = "Ground-1-1", + ["heading"] = heading+math.pi, + ["playerCanDrive"] = false, + }, -- end of [3] + [4] = + { + ["skill"] = "High", + ["coldAtStart"] = false, + ["type"] = "S-300PS 5P85C ln", + --["unitId"] = 34, + ["y"] = vec3.z-40, + ["x"] = vec3.x-40, + --["name"] = "Ground-1-1", + ["heading"] = heading+math.pi, + ["playerCanDrive"] = false, + }, -- end of [4] + } + group.hidden = pg.hidden + group.category = "VEHICLE" + group.country = 54 + mist.dynAdd(group) + --heading +end + +function pg.spawnSamSA11 (vec3,heading) + --where + --name + group = {} + group.groupName = "poleGenerator" .. pg.samCounter + group.units = { + [1] = + { + ["skill"] = "High", + ["coldAtStart"] = false, + ["hidden"] = pg.hidden, + ["type"] = "SA-11 Buk SR 9S18M1", + --["unitId"] = 35, + ["y"] = vec3.z-40, + ["x"] = vec3.x-40, + --["name"] = "Ground-1-2", + ["heading"] = heading+math.pi, + ["playerCanDrive"] = false, + }, -- end of [1] + [2] = + { + ["skill"] = "High", + ["coldAtStart"] = false, + ["type"] = "SA-11 Buk CC 9S470M1", + --["unitId"] = 34, + ["y"] = vec3.z, + ["x"] = vec3.x, + --["name"] = "Ground-1-1", + ["heading"] = heading+math.pi, + ["playerCanDrive"] = false, + }, -- end of [2] + [2] = + { + ["skill"] = "High", + ["coldAtStart"] = false, + ["type"] = "SA-11 Buk LN 9A310M1", + --["unitId"] = 34, + ["y"] = vec3.z, + ["x"] = vec3.x, + --["name"] = "Ground-1-1", + ["heading"] = heading+math.pi, + ["playerCanDrive"] = false, + }, -- end of [2] + } + group.hidden = pg.hidden + group.category = "VEHICLE" + group.country = 54 + mist.dynAdd(group) + --heading +end + + + +function pg.spawnDrone(vec3,planeHeading,playerTarget,missileType) + -- where is the plane going to be in x seconds + playerTargetPos = playerTarget:getPosition().p + futurePlayerTargetPos = playerTargetPos + playerMotionVec = Object.getVelocity(playerTarget) + + --work out what type of SAM we are shooting to work out the delay, missile speed etc + + if missileType == 2 then + pg.delay = pg.samDB[2].missileDelay + pg.missileSpeed = pg.samDB[2].missileSpeed + elseif missileType == 3 then + pg.delay = pg.samDB[3].missileDelay + pg.missileSpeed = pg.samDB[3].missileSpeed + elseif missileType == 5 then + pg.delay = pg.samDB[5].missileDelay + pg.missileSpeed = pg.samDB[5].missileSpeed + elseif missileType == 6 then + pg.delay = pg.samDB[6].missileDelay + pg.missileSpeed = pg.samDB[5].missileSpeed + elseif missileType == 10 then + pg.delay = pg.samDB[10].missileDelay + pg.missileSpeed = pg.samDB[10].missileSpeed + elseif missileType == 11 then + pg.delay = pg.samDB[11].missileDelay + pg.missileSpeed = pg.samDB[11].missileSpeed + else --assume SA2 + pg.delay = pg.samDB[2].missileDelay + pg.missileSpeed = pg.samDB[2].missileSpeed + end + + futurePlayerTargetPos.x = playerTargetPos.x + playerMotionVec.x*pg.delay + futurePlayerTargetPos.y = playerTargetPos.y + playerMotionVec.y*pg.delay + futurePlayerTargetPos.z = playerTargetPos.z + playerMotionVec.z*pg.delay + droneTurnPoint = mist.projectPoint(futurePlayerTargetPos, 10000 ,planeHeading+math.pi) + --this is where the plane will be when the missile is launched + + + + --pythago to get hyp + --x^2 + y^x = hyp^2 + x = mist.utils.get2DDist(futurePlayerTargetPos,vec3) + + y = playerTargetPos.y + --pg.notify(y,5) + hyp = math.sqrt(x^2 + y^2) + roughFlightTime = hyp /pg.missileSpeed-- distance / speed + + futurePlayerTargetPos.x = futurePlayerTargetPos.x + playerMotionVec.x*roughFlightTime + futurePlayerTargetPos.y = futurePlayerTargetPos.y + playerMotionVec.y*roughFlightTime + futurePlayerTargetPos.z = futurePlayerTargetPos.z + playerMotionVec.z*roughFlightTime + --this is where the plane will be when the missile arrives at its altitude + + --now we need to work out where the drone is going to go + vecSub = mist.vec.sub(vec3,futurePlayerTargetPos) + heading = mist.utils.getDir(vecSub) --heading between picked location and future pos + extendDistance = x + 10000 + + alt = (((futurePlayerTargetPos.y) * extendDistance)/x) + + droneAtTimePos = mist.projectPoint(vec3, extendDistance ,heading +math.pi) + + extendDistance = extendDistance + pg.droneSpeed*roughFlightTime + droneAtStartPos = mist.projectPoint(vec3, extendDistance ,heading +math.pi) + --we want to curve the missile in the players direction + --planeHeading + + pg.makeDrone(droneAtStartPos,heading, droneAtTimePos, futurePlayerTargetPos,alt,droneTurnPoint) + if missileType == 2 then + pg.spawnSamSA2 (vec3,heading) + elseif missileType == 3 then + pg.spawnSamSA3 (vec3,heading) + elseif missileType == 5 then + pg.spawnSamSA5 (vec3,heading) + elseif missileType == 6 then + pg.spawnSamSA6 (vec3,heading) + elseif missileType == 10 then + pg.spawnSamSA10 (vec3,heading) + else --assume SA2 + pg.spawnSamSA2 (vec3,heading) + end + + +end + +function pg.makeDrone(spawnVec,heading, routeVec, nextRouteVec,alt,droneTurnPoint) + --this spawns in the drone + group = DroneClone + group.groupName = "TargetDrone" .. pg.samCounter + group.groupId = nil + group.units[1].unitId = nil + group.units[1].unitName = nil + group.units[1].y = spawnVec.z + group.units[1].x = spawnVec.x + group.units[1].heading = heading + group.units[1].alt = alt + group.route["points"][2] = group.route["points"][1] + group.route["points"][3] = group.route["points"][1] + group.route["points"][1]["y"] = routeVec.z + group.route["points"][1]["x"] = routeVec.x + group.route["points"][1]["alt"] = alt + group.route["points"][2]["y"] = nextRouteVec.z + group.route["points"][2]["x"] = nextRouteVec.x + group.route["points"][2]["alt"] = alt + group.route["points"][3]["y"] = droneTurnPoint.z + group.route["points"][3]["x"] = droneTurnPoint.x + group.route["points"][3]["alt"] = alt + group.countryId = 56 + group.category = 'AIRPLANE' + mist.dynAdd(group) +end + + +function pg.attack (vars) + targetID = vars[1] + samGroup = vars[2] + AttackUnit = { + id = 'AttackUnit', + params = { + unitId = targetID, + attackQtyLimit = true, + attackQty = 1, + } + } + + local controller = samGroup:getController() + controller:pushTask(AttackUnit) +end + + + +function pg.radarOff () + group = Group.getByName(pg.name) + local controller = group:getController() + controller:setOption(9,1) +end + +function pg.radarOn () + group = Group.getByName(pg.name) + local controller = group:getController() + controller:setOption(9,0) +end + + DroneClone= + { + ["modulation"] = 0, + ["tasks"] = + { + }, -- end of ["tasks"] + ["task"] = "Reconnaissance", + ["uncontrolled"] = false, + ["route"] = + { + ["points"] = + { + [1] = + { + ["alt"] = 2000, + ["action"] = "Turning Point", + ["alt_type"] = "BARO", + ["speed"] = 82.222222222222, + ["task"] = + { + ["id"] = "ComboTask", + ["params"] = + { + ["tasks"] = + {}, -- end of ["tasks"] + }, -- end of ["params"] + }, -- end of ["task"] + ["type"] = "Turning Point", + ["ETA"] = 0, + ["ETA_locked"] = true, + ["y"] = 0, + ["x"] = 0, + ["formation_template"] = "", + ["speed_locked"] = true, + }, -- end of [1] + [2] = + { + ["alt"] = 2000, + ["action"] = "Turning Point", + ["alt_type"] = "BARO", + ["speed"] = 82.222222222222, + ["task"] = + { + ["id"] = "ComboTask", + ["params"] = + { + ["tasks"] = + { + }, -- end of ["tasks"] + }, -- end of ["params"] + }, -- end of ["task"] + ["type"] = "Turning Point", + ["ETA"] = 157.20107538291, + ["ETA_locked"] = false, + ["y"] = 0, + ["x"] = 0, + ["formation_template"] = "", + ["speed_locked"] = true, + }, -- end of [2] + }, -- end of ["points"] + }, -- end of ["route"] + --["groupId"] = 1, + ["hidden"] = pg.hidden, + ["units"] = + { + [1] = + { + ["alt"] = 2000, + ["alt_type"] = "BARO", + ["livery_id"] = "'camo' scheme", + ["skill"] = "High", + ["speed"] = 82.222222222222, + ["type"] = "MQ-9 Reaper", + --["unitId"] = 1, + --["psi"] = -3.129323330636, + ["y"] = 0, + ["x"] = 0, + ["payload"] = + { + ["pylons"] = + { + }, -- end of ["pylons"] + ["fuel"] = 1300, + ["flare"] = 0, + ["chaff"] = 0, + ["gun"] = 100, + }, -- end of ["payload"] + ["heading"] = 0.5, + ["callsign"] = + { + [1] = 1, + [2] = 1, + [3] = 1, + ["name"] = "Enfield11", + }, -- end of ["callsign"] + ["onboard_num"] = "010", + }, -- end of [1] + }, -- end of ["units"] + ["y"] = 0, + ["x"] = 0, + ["communication"] = true, + ["start_time"] = 0, + ["frequency"] = 124, + } + + +local function protectedCall(...) + local status, retval = pcall(...) + if not status then + + end +end + +function handler:onEvent(event) + protectedCall(pg.eventHandler, event) +end + +function pg.eventHandler (event) + if (26 == event.id) then --this is when someone types into a mark + local vec3 = mist.utils.makeVec3GL(event.pos) + pg.fakeSam (vec3) + end +end + +function handler:onEvent(event) + protectedCall(pg.eventHandler, event) +end + + +do + longRangeShots = missionCommands.addSubMenu("SAM") + missionCommands.addCommand ("Generate pole", longRangeShots, pg.fakeSam) + world.addEventHandler(handler) +end + +pg.notify("poleGen.lua",10) + diff --git a/scripts/raisedShots.lua b/scripts/examples/raisedShots.lua similarity index 96% rename from scripts/raisedShots.lua rename to scripts/examples/raisedShots.lua index 95fdc8f8..88dd53cc 100644 --- a/scripts/raisedShots.lua +++ b/scripts/examples/raisedShots.lua @@ -1,319 +1,319 @@ -shots = {} --https://www.youtube.com/watch?v=XNtTEibFvlQ mandatory terrible listening -shots.shooterName = "TestInfantry" -shots.targetName = "TestTarget1" - -function shots.notify(message, displayFor) - trigger.action.outText(message, displayFor, false) -end - - - ---infantry - -function shots.set556 () --red - roundVelocity = 910 - unitBarrelHeight = 1 - shotsToFire = 5 - shotDelay = 4.5 - shots.notify("5.56 M4 Georgia", 2) - shots.fire() -end - -function shots.set556SAW () --red - roundVelocity = 915 - unitBarrelHeight = 0.4 - shotsToFire = 5 - shotDelay = 4.5 - shots.notify("5.56 M249 SAW", 2) - shots.fire() - -end - -function shots.setAk74() --red - roundVelocity = 900 - unitBarrelHeight = 0.9 - shotsToFire = 5 - shotDelay = 4.5 - shots.notify("Ak74", 2) - shots.fire() -end - ---technicals - -function shots.hmmwv() --red - roundVelocity = 928 - unitBarrelHeight = 2.6 - shotsToFire = 5 - shotDelay = 2.5 - shots.notify("Humm drumm Vee", 2) - shots.fire() - shots.notify(unitBarrelHeight,2) - -end - -function shots.technicalDHSKA() --green - roundVelocity = 928 - unitBarrelHeight = 2.2 - shotsToFire = 5 - shotDelay = 2.5 - shots.notify("technicalDHSKA", 2) - shots.fire() - shots.notify(unitBarrelHeight,2) - -end - -function shots.cobra() --green - roundVelocity = 928 - unitBarrelHeight = 2.85 - shotsToFire = 5 - shotDelay = 2.6 - shots.notify("Cobra", 2) - shots.fire() - shots.notify(unitBarrelHeight,2) - -end ---IFVs - -function shots.setWarrior() --white - roundVelocity = 1070 - unitBarrelHeight = 2.28 - shotsToFire = 3 - shotDelay = 6.3 - shots.fire() -end - -function shots.setBMP2() --red - roundVelocity = 970 - unitBarrelHeight = 1.95 - shotsToFire = 3 - shotDelay = 6 - shots.fire() -end - ---Tanks - -function shots.m1a1() --red - roundVelocity = 928 - unitBarrelHeight = 2.15 - shotsToFire = 5 - shotDelay = 3 - shots.notify("Abrams 50 cal", 2) - shots.fire() - shots.notify(unitBarrelHeight,2) - -end - -function shots.t55() --red and green - roundVelocity = 928 - unitBarrelHeight = 1.75 - shotsToFire = 5 - shotDelay = 2.6 - shots.notify("T-72B", 2) - shots.fire() - shots.notify(unitBarrelHeight,2) -end - ----aaaaaaaaaaaaaaaa - -function shots.ZSU57() --red - roundVelocity = 1070 - shotsToFire = 2 - shotDelay = 10.5 - shots.notify("ZSU57", 2) - unitMaxRange = 6000 - shots.fireAAA() -end - -function shots.ZSU23() --red - roundVelocity = 1050 - shotsToFire = 2 - shotDelay = 12 - shots.notify("ZSU23", 2) - unitMaxRange = 2000 - shots.fireAAA() -end - -function shots.vulcan() --red - roundVelocity = 1030 - shotsToFire = 5 - shotDelay = 5 - shots.notify("Vulcan M163", 2) - unitMaxRange = 1500 - shots.fireAAA() -end - -function shots.flak18() --red and green - roundVelocity = 870 - shotsToFire = 1 - shotDelay = 10.5 - shots.notify("Flak 18", 2) - unitMaxRange = 4000 - shots.fireAAA() -end - - - - --- This one is really obvious, however I set towards the end of this file the "parameters" of the shots. -function shots.fire() - unit = Unit.getByName(shots.shooterName) - target = Unit.getByName(shots.targetName) - local targetMotionVec = Object.getVelocity(target) --if you don't want to do this i.e. shoot a point send a nil or a vec3 of 0's - --local targetMotionVec = nil - local targetPos = target:getPosition().p - shots.calculateAngle(roundVelocity, unit, targetPos, unitBarrelHeight, shotsToFire,shotDelay, targetMotionVec) -end - ---main bit that does the maths for simulating a "roughly level" fire fight, not to be used when aiming AAA at aircraft -function shots.calculateAngle(v, unit, targetPos, unitBarrelHeight, shotsToFire,shotDelay, targetMotionVector) - --v muzzle velocity - --unit is unit object you want shooting - --targetPos is a position on the ground, doesn't have to be a targets actual location - --unitBarrelHeigh is the height the gun is at when it fires - --shotsToFire is how many rounds to shoot, 5 is a nice number except for large calibre slow guns - --shotDelay how long it on average takes to aim from scratch at something and shoot, mostly used in aiming lead - --targetMotionVector a vec3 of the targets motion if nil just shoots at a spot - - g = 9.81 -- gravity, change if on the moon veltro you comment reading prick - - local unitPos = unit:getPosition().p - local x = mist.utils.get2DDist(unitPos,targetPos) -- horizontal range - local x3d = mist.utils.get3DDist(unitPos,targetPos) -- slant range - - y = targetPos.y - unitPos.y - y = y - unitBarrelHeight - - --works out some stuff for trig later, like x,y and hypoteneueussueee - - if targetMotionVector == nil then - --no moving? nothing to ammend - else --work out where target will be when the bullet arrives - shotDelay = shotDelay + x3d/v --time taken to aim and time for bullet to fly to spot - newPosition = mist.utils.tableShow(targetMotionVector) - targetPos.x = targetPos.x + targetMotionVector.x*shotDelay - targetPos.y = targetPos.y + targetMotionVector.y*shotDelay - targetPos.z = targetPos.z + targetMotionVector.z*shotDelay - end - - x = x - 10 --we actually are aiming 10m in front always so need to remove this - - local inner = v^4 - g * (g * x^2 + 2 * y * v^2) -- this is the inner bit of the quadratic equation for ease of code - - if inner < 0 then - -- No solution exists for these parameters, too far away do nothing we can't hit it, saves us crashing if sqrt of negative - else - local angle2 = math.atan((v^2 - math.sqrt(inner)) / (g * x)) -- do the whole quadratic equation - -- we didn't need to do the +- sqrt b^2..... bits as we care about the flat path not the one shot miles up falling down - - local aimUp = 10 * math.tan(angle2)*math.cos(angle2) -- we have to tell dcs to "aim up" at a point 10m ahead of it, this is distance * tan(angle) , so where the fuck has the cos come from? That is because aim correction for shooting up and down is basically modfied by cos(angle) so lazy correction and dcs can't shoot vertically up - local xPosDifference = (targetPos.x - unitPos.x) - local zPosDifference = (targetPos.z - unitPos.z) - local hyp = math.sqrt((xPosDifference*xPosDifference) + (zPosDifference*zPosDifference)) - xPosDifference = (xPosDifference /hyp) * 10 - zPosDifference = (zPosDifference / hyp) * 10 - - unitPos.x = unitPos.x + xPosDifference - unitPos.z = unitPos.z + zPosDifference - - --that was all basic trig maths - - local controller = unit:getController() - FireAtPoint = { - id = 'FireAtPoint', - params = { - point = {x = unitPos.x, y = unitPos.z}, - radius = 0.0001, - expendQty = shotsToFire, - expendQtyEnabled = true, - altitude = unitPos.y+unitBarrelHeight +aimUp, --this is a realtive to sea level shot, so we can shoot down - alt_type = 0, --0 = sea level, 1 = ground level - } - } - controller:pushTask(FireAtPoint) --FIREEEEEE - end -end - - -function shots.fireAAA() - unit = Unit.getByName(shots.shooterName) - target = Unit.getByName(shots.targetName) - targetMotionVec = Object.getVelocity(target) --if you don't want to do this i.e. shoot a point send a nil or a vec3 of 0's - --local targetMotionVec = nil - targetPos = target:getPosition().p - shots.aaa(roundVelocity, unit, unitMaxRange, targetPos, shotsToFire,shotDelay, targetMotionVec) -end - ---aaa fires almost straight up, no line of sight fakery needed or working out lobbing bullets onto random points ---if in range just needs to be told to shoot where the target will be in a few seconds ---if out of range, we just need to extrapolate back and fire inside max range and randomise the up and down, then let it miss - -function shots.aaa(v, unit, unitMaxRange, targetPos, shotsToFire,shotDelay, targetMotionVector) - local unitPos = unit:getPosition().p - local x = mist.utils.get2DDist(unitPos,targetPos) -- horizontal range - local x3d = mist.utils.get3DDist(unitPos,targetPos) -- slant range - - if x3d > unitMaxRange then - if targetMotionVector == nil then - --no moving? nothing to ammend - else --work out where target will be when the bullet arrives - shotDelay = shotDelay + x3d/(v/2) --time taken to aim and time for bullet to fly to spot long range roughly 50% slowdown - newPosition = mist.utils.tableShow(targetMotionVector) - targetPos.x = targetPos.x + targetMotionVector.x*shotDelay - targetPos.y = targetPos.y + targetMotionVector.y*shotDelay - targetPos.z = targetPos.z + targetMotionVector.z*shotDelay - end - - difference = mist.vec.sub(targetPos,unitPos) - unitVec = mist.vec.getUnitVec(difference) - extendPath = mist.vec.scalar_mult(unitVec ,unitMaxRange) - targetPos = mist.vec.add(extendPath,unitPos) - - - local controller = unit:getController() - FireAtPoint = { - id = 'FireAtPoint', - params = { - point = {x = targetPos.x, y = targetPos.z}, - radius = 0.0001, - expendQty = shotsToFire, - expendQtyEnabled = true, - altitude = targetPos.y+math.random(1,500), --this is a realtive to sea level shot, so we can shoot down - alt_type = 0, --0 = sea level, 1 = ground level - } - } - controller:pushTask(FireAtPoint) --FIREEEEEE - else - if targetMotionVector == nil then - --no moving? nothing to ammend - else --work out where target will be when the bullet arrives - shotDelay = shotDelay + x3d/v --time taken to aim and time for bullet to fly to spot - newPosition = mist.utils.tableShow(targetMotionVector) - targetPos.x = targetPos.x + targetMotionVector.x*shotDelay - targetPos.y = targetPos.y + targetMotionVector.y*shotDelay - targetPos.z = targetPos.z + targetMotionVector.z*shotDelay - end - - local controller = unit:getController() - FireAtPoint = { - id = 'FireAtPoint', - params = { - point = {x = targetPos.x, y = targetPos.z}, - radius = 0.0001, - expendQty = shotsToFire, - expendQtyEnabled = true, - altitude = targetPos.y, --this is a realtive to sea level shot, so we can shoot down - alt_type = 0, --0 = sea level, 1 = ground level - } - } - controller:pushTask(FireAtPoint) --FIREEEEEE - end -end - - -do - longRangeShots = missionCommands.addSubMenu("Firefight") - missionCommands.addCommand ("Fire", longRangeShots, shots.vulcan) - -end - +shots = {} --https://www.youtube.com/watch?v=XNtTEibFvlQ mandatory terrible listening +shots.shooterName = "TestInfantry" +shots.targetName = "TestTarget1" + +function shots.notify(message, displayFor) + trigger.action.outText(message, displayFor, false) +end + + + +--infantry + +function shots.set556 () --red + roundVelocity = 910 + unitBarrelHeight = 1 + shotsToFire = 5 + shotDelay = 4.5 + shots.notify("5.56 M4 Georgia", 2) + shots.fire() +end + +function shots.set556SAW () --red + roundVelocity = 915 + unitBarrelHeight = 0.4 + shotsToFire = 5 + shotDelay = 4.5 + shots.notify("5.56 M249 SAW", 2) + shots.fire() + +end + +function shots.setAk74() --red + roundVelocity = 900 + unitBarrelHeight = 0.9 + shotsToFire = 5 + shotDelay = 4.5 + shots.notify("Ak74", 2) + shots.fire() +end + +--technicals + +function shots.hmmwv() --red + roundVelocity = 928 + unitBarrelHeight = 2.6 + shotsToFire = 5 + shotDelay = 2.5 + shots.notify("Humm drumm Vee", 2) + shots.fire() + shots.notify(unitBarrelHeight,2) + +end + +function shots.technicalDHSKA() --green + roundVelocity = 928 + unitBarrelHeight = 2.2 + shotsToFire = 5 + shotDelay = 2.5 + shots.notify("technicalDHSKA", 2) + shots.fire() + shots.notify(unitBarrelHeight,2) + +end + +function shots.cobra() --green + roundVelocity = 928 + unitBarrelHeight = 2.85 + shotsToFire = 5 + shotDelay = 2.6 + shots.notify("Cobra", 2) + shots.fire() + shots.notify(unitBarrelHeight,2) + +end +--IFVs + +function shots.setWarrior() --white + roundVelocity = 1070 + unitBarrelHeight = 2.28 + shotsToFire = 3 + shotDelay = 6.3 + shots.fire() +end + +function shots.setBMP2() --red + roundVelocity = 970 + unitBarrelHeight = 1.95 + shotsToFire = 3 + shotDelay = 6 + shots.fire() +end + +--Tanks + +function shots.m1a1() --red + roundVelocity = 928 + unitBarrelHeight = 2.15 + shotsToFire = 5 + shotDelay = 3 + shots.notify("Abrams 50 cal", 2) + shots.fire() + shots.notify(unitBarrelHeight,2) + +end + +function shots.t55() --red and green + roundVelocity = 928 + unitBarrelHeight = 1.75 + shotsToFire = 5 + shotDelay = 2.6 + shots.notify("T-72B", 2) + shots.fire() + shots.notify(unitBarrelHeight,2) +end + +---aaaaaaaaaaaaaaaa + +function shots.ZSU57() --red + roundVelocity = 1070 + shotsToFire = 2 + shotDelay = 10.5 + shots.notify("ZSU57", 2) + unitMaxRange = 6000 + shots.fireAAA() +end + +function shots.ZSU23() --red + roundVelocity = 1050 + shotsToFire = 2 + shotDelay = 12 + shots.notify("ZSU23", 2) + unitMaxRange = 2000 + shots.fireAAA() +end + +function shots.vulcan() --red + roundVelocity = 1030 + shotsToFire = 5 + shotDelay = 5 + shots.notify("Vulcan M163", 2) + unitMaxRange = 1500 + shots.fireAAA() +end + +function shots.flak18() --red and green + roundVelocity = 870 + shotsToFire = 1 + shotDelay = 10.5 + shots.notify("Flak 18", 2) + unitMaxRange = 4000 + shots.fireAAA() +end + + + + +-- This one is really obvious, however I set towards the end of this file the "parameters" of the shots. +function shots.fire() + unit = Unit.getByName(shots.shooterName) + target = Unit.getByName(shots.targetName) + local targetMotionVec = Object.getVelocity(target) --if you don't want to do this i.e. shoot a point send a nil or a vec3 of 0's + --local targetMotionVec = nil + local targetPos = target:getPosition().p + shots.calculateAngle(roundVelocity, unit, targetPos, unitBarrelHeight, shotsToFire,shotDelay, targetMotionVec) +end + +--main bit that does the maths for simulating a "roughly level" fire fight, not to be used when aiming AAA at aircraft +function shots.calculateAngle(v, unit, targetPos, unitBarrelHeight, shotsToFire,shotDelay, targetMotionVector) + --v muzzle velocity + --unit is unit object you want shooting + --targetPos is a position on the ground, doesn't have to be a targets actual location + --unitBarrelHeigh is the height the gun is at when it fires + --shotsToFire is how many rounds to shoot, 5 is a nice number except for large calibre slow guns + --shotDelay how long it on average takes to aim from scratch at something and shoot, mostly used in aiming lead + --targetMotionVector a vec3 of the targets motion if nil just shoots at a spot + + g = 9.81 -- gravity, change if on the moon veltro you comment reading prick + + local unitPos = unit:getPosition().p + local x = mist.utils.get2DDist(unitPos,targetPos) -- horizontal range + local x3d = mist.utils.get3DDist(unitPos,targetPos) -- slant range + + y = targetPos.y - unitPos.y + y = y - unitBarrelHeight + + --works out some stuff for trig later, like x,y and hypoteneueussueee + + if targetMotionVector == nil then + --no moving? nothing to ammend + else --work out where target will be when the bullet arrives + shotDelay = shotDelay + x3d/v --time taken to aim and time for bullet to fly to spot + newPosition = mist.utils.tableShow(targetMotionVector) + targetPos.x = targetPos.x + targetMotionVector.x*shotDelay + targetPos.y = targetPos.y + targetMotionVector.y*shotDelay + targetPos.z = targetPos.z + targetMotionVector.z*shotDelay + end + + x = x - 10 --we actually are aiming 10m in front always so need to remove this + + local inner = v^4 - g * (g * x^2 + 2 * y * v^2) -- this is the inner bit of the quadratic equation for ease of code + + if inner < 0 then + -- No solution exists for these parameters, too far away do nothing we can't hit it, saves us crashing if sqrt of negative + else + local angle2 = math.atan((v^2 - math.sqrt(inner)) / (g * x)) -- do the whole quadratic equation + -- we didn't need to do the +- sqrt b^2..... bits as we care about the flat path not the one shot miles up falling down + + local aimUp = 10 * math.tan(angle2)*math.cos(angle2) -- we have to tell dcs to "aim up" at a point 10m ahead of it, this is distance * tan(angle) , so where the fuck has the cos come from? That is because aim correction for shooting up and down is basically modfied by cos(angle) so lazy correction and dcs can't shoot vertically up + local xPosDifference = (targetPos.x - unitPos.x) + local zPosDifference = (targetPos.z - unitPos.z) + local hyp = math.sqrt((xPosDifference*xPosDifference) + (zPosDifference*zPosDifference)) + xPosDifference = (xPosDifference /hyp) * 10 + zPosDifference = (zPosDifference / hyp) * 10 + + unitPos.x = unitPos.x + xPosDifference + unitPos.z = unitPos.z + zPosDifference + + --that was all basic trig maths + + local controller = unit:getController() + FireAtPoint = { + id = 'FireAtPoint', + params = { + point = {x = unitPos.x, y = unitPos.z}, + radius = 0.0001, + expendQty = shotsToFire, + expendQtyEnabled = true, + altitude = unitPos.y+unitBarrelHeight +aimUp, --this is a realtive to sea level shot, so we can shoot down + alt_type = 0, --0 = sea level, 1 = ground level + } + } + controller:pushTask(FireAtPoint) --FIREEEEEE + end +end + + +function shots.fireAAA() + unit = Unit.getByName(shots.shooterName) + target = Unit.getByName(shots.targetName) + targetMotionVec = Object.getVelocity(target) --if you don't want to do this i.e. shoot a point send a nil or a vec3 of 0's + --local targetMotionVec = nil + targetPos = target:getPosition().p + shots.aaa(roundVelocity, unit, unitMaxRange, targetPos, shotsToFire,shotDelay, targetMotionVec) +end + +--aaa fires almost straight up, no line of sight fakery needed or working out lobbing bullets onto random points +--if in range just needs to be told to shoot where the target will be in a few seconds +--if out of range, we just need to extrapolate back and fire inside max range and randomise the up and down, then let it miss + +function shots.aaa(v, unit, unitMaxRange, targetPos, shotsToFire,shotDelay, targetMotionVector) + local unitPos = unit:getPosition().p + local x = mist.utils.get2DDist(unitPos,targetPos) -- horizontal range + local x3d = mist.utils.get3DDist(unitPos,targetPos) -- slant range + + if x3d > unitMaxRange then + if targetMotionVector == nil then + --no moving? nothing to ammend + else --work out where target will be when the bullet arrives + shotDelay = shotDelay + x3d/(v/2) --time taken to aim and time for bullet to fly to spot long range roughly 50% slowdown + newPosition = mist.utils.tableShow(targetMotionVector) + targetPos.x = targetPos.x + targetMotionVector.x*shotDelay + targetPos.y = targetPos.y + targetMotionVector.y*shotDelay + targetPos.z = targetPos.z + targetMotionVector.z*shotDelay + end + + difference = mist.vec.sub(targetPos,unitPos) + unitVec = mist.vec.getUnitVec(difference) + extendPath = mist.vec.scalar_mult(unitVec ,unitMaxRange) + targetPos = mist.vec.add(extendPath,unitPos) + + + local controller = unit:getController() + FireAtPoint = { + id = 'FireAtPoint', + params = { + point = {x = targetPos.x, y = targetPos.z}, + radius = 0.0001, + expendQty = shotsToFire, + expendQtyEnabled = true, + altitude = targetPos.y+math.random(1,500), --this is a realtive to sea level shot, so we can shoot down + alt_type = 0, --0 = sea level, 1 = ground level + } + } + controller:pushTask(FireAtPoint) --FIREEEEEE + else + if targetMotionVector == nil then + --no moving? nothing to ammend + else --work out where target will be when the bullet arrives + shotDelay = shotDelay + x3d/v --time taken to aim and time for bullet to fly to spot + newPosition = mist.utils.tableShow(targetMotionVector) + targetPos.x = targetPos.x + targetMotionVector.x*shotDelay + targetPos.y = targetPos.y + targetMotionVector.y*shotDelay + targetPos.z = targetPos.z + targetMotionVector.z*shotDelay + end + + local controller = unit:getController() + FireAtPoint = { + id = 'FireAtPoint', + params = { + point = {x = targetPos.x, y = targetPos.z}, + radius = 0.0001, + expendQty = shotsToFire, + expendQtyEnabled = true, + altitude = targetPos.y, --this is a realtive to sea level shot, so we can shoot down + alt_type = 0, --0 = sea level, 1 = ground level + } + } + controller:pushTask(FireAtPoint) --FIREEEEEE + end +end + + +do + longRangeShots = missionCommands.addSubMenu("Firefight") + missionCommands.addCommand ("Fire", longRangeShots, shots.vulcan) + +end + shots.notify("raisedShots.lua ran", 2) \ No newline at end of file diff --git a/scripts/samSimulator.lua b/scripts/examples/samSimulator.lua similarity index 98% rename from scripts/samSimulator.lua rename to scripts/examples/samSimulator.lua index bc17b69a..ac5beedf 100644 --- a/scripts/samSimulator.lua +++ b/scripts/examples/samSimulator.lua @@ -1,540 +1,540 @@ ---Spawn a SAM integrated with IADS ---Spawn a normal SAM ---SAM bubble shields - -samSim = {} -samSim.samSuffix = 1 - -do -- needs to go early on - redIADS = SkynetIADS:create('Red') - redIADS:setUpdateInterval(5) - redIADS:activate() - --redIADS:addRadioMenu() -end - -function samSim.genSAten() --gens an SA 10 as you can imagine, - unit = Unit.getByName("Test") - local pointVec3Gl = unit:getPosition().p -- this is just to find where my aircraft is and whack an SA10 below it, lazy not relevant - local isHiddenCheck = math.random(100) - if isHiddenCheck > 10 then - isHidden = false - else - isHidden = true -- fairly obvious hides from F10 and F7 view - end - mist.dynAdd( - { - country = 'USSR', - category = 'vehicle', - name = "SAM " .. samSim.samSuffix, - groupName = "SAM " .. samSim.samSuffix, - groupId = 10000+samSim.samSuffix, - hidden = isHidden, - units = - { [1] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Random", - ["type"] = "S-300PS 40B6MD sr", --search radar needs to be first always for avoiding a skynet bug - ["y"] = pointVec3Gl.z + 50, - ["x"] = pointVec3Gl.x, - ["heading"] = 0, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [1] - [2] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Random", - ["type"] = "S-300PS 40B6M tr", - ["y"] = pointVec3Gl.z, - ["x"] = pointVec3Gl.x, - ["heading"] = 4.7123889803847, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [2] - - [3] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Random", - ["type"] = "S-300PS 54K6 cp", - ["y"] = pointVec3Gl.z + 100, - ["x"] = pointVec3Gl.x, - ["heading"] = 3.1415926535898, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [3] - [4] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Random", - ["type"] = "S-300PS 64H6E sr", - ["y"] = pointVec3Gl.z - 50, - ["x"] = pointVec3Gl.x, - ["heading"] = 3.1415926535898, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [4] - [5] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Random", - ["type"] = "S-300PS 5P85C ln", - ["y"] = pointVec3Gl.z +200 , - ["x"] = pointVec3Gl.x, - ["heading"] = 3.1415926535898, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [5] - [6] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Random", - ["type"] = "S-300PS 5P85C ln", - ["y"] = pointVec3Gl.z -200, - ["x"] = pointVec3Gl.x, - ["heading"] = 3.3161255787892, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [6] - [7] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Random", - ["type"] = "S-300PS 5P85C ln", - ["y"] = pointVec3Gl.z , - ["x"] = pointVec3Gl.x + 200, - ["heading"] = 2.9670597283904, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [7] - [8] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Excellent", - ["type"] = "S-300PS 5P85C ln", - ["y"] = pointVec3Gl.z, - ["x"] = pointVec3Gl.x -200, - ["heading"] = 0, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [8] - [9] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Random", - ["type"] = "generator_5i57", - ["y"] = pointVec3Gl.z +200, - ["x"] = pointVec3Gl.x + 200, - ["heading"] = 6.1086523819802, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [9] - [10] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Random", - ["type"] = "ATZ-5", - ["y"] = pointVec3Gl.z -200, - ["x"] = pointVec3Gl.x -200, - ["heading"] = 0.17453292519943, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [10] - [11] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Random", - ["type"] = "ATZ-5", - ["y"] = pointVec3Gl.z +550, - ["x"] = pointVec3Gl.x, - ["heading"] = 0, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [11] - [12] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Random", - ["type"] = "GAZ-66", - ["y"] = pointVec3Gl.z +580, - ["x"] = pointVec3Gl.x, - ["heading"] = 0, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [12] - [13] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Random", - ["type"] = "ATZ-60_Maz", - ["y"] = pointVec3Gl.z +600, - ["x"] = pointVec3Gl.x, - ["heading"] = 0, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [13] - [14] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Random", - ["type"] = "KAMAZ Truck", - ["y"] = pointVec3Gl.z +500, - ["x"] = pointVec3Gl.x + 20, - ["heading"] = 0, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [14] - }, -- end of units - } -- end of function - ) - redIADS:addSAMSite("SAM " .. samSim.samSuffix) --skynet bit - local detectChance = math.random(50,90) - local goLiveRange = math.random(50,90) - local harmStop = math.random(2) - if harmStop == 1 then - harmStopping = true - else - harmStopping = false - end - redIADS:getSAMSiteByGroupName("SAM " .. samSim.samSuffix):setHARMDetectionChance(detectChance) -- doesn't bloody work no idea, don't care want to reinvent this myself - redIADS:getSAMSiteByGroupName("SAM " .. samSim.samSuffix):setGoLiveRangeInPercent(goLiveRange) -- doesn't bloody work no idea, don't care want to reinvent this myself - redIADS:getSAMSiteByGroupName("SAM " .. samSim.samSuffix):setCanEngageHARM(harmStopping) -- doesn't bloody work no idea, don't care want to reinvent this myself - - samSim.samSuffix = samSim.samSuffix + 1 -end - -function samSim.genSAtwo() - unit = Unit.getByName("Test") - local pointVec3Gl = unit:getPosition().p -- this is just to find where my aircraft is and whack an SA10 below it, lazy not relevant - - local isHiddenCheck = math.random(100) - if isHiddenCheck > 50 then - isHidden = false - else - isHidden = true - end - - mist.dynAdd( - { - country = 'USSR', - category = 'vehicle', - name = "SAM " .. samSim.samSuffix, - groupName = "SAM " .. samSim.samSuffix, - groupId = 10000+samSim.samSuffix, - hidden = isHidden, - units = - { - [1] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Random", - ["type"] = "SNR_75V", - ["y"] = pointVec3Gl.z, - ["x"] = pointVec3Gl.x, - ["heading"] = 4.7123889803847, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [1] - [2] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Random", - ["type"] = "S_75M_Volhov", - ["y"] = pointVec3Gl.z + 50, - ["x"] = pointVec3Gl.x, - ["heading"] = 0, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [2] - [3] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Random", - ["type"] = "S_75M_Volhov", - ["y"] = pointVec3Gl.z + 100, - ["x"] = pointVec3Gl.x, - ["heading"] = 3.1415926535898, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [3] - [4] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Random", - ["type"] = "S_75M_Volhov", - ["y"] = pointVec3Gl.z - 50, - ["x"] = pointVec3Gl.x, - ["heading"] = 3.1415926535898, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [4] - [5] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Random", - ["type"] = "S_75M_Volhov", - ["y"] = pointVec3Gl.z +200 , - ["x"] = pointVec3Gl.x, - ["heading"] = 3.1415926535898, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [5] - [6] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Random", - ["type"] = "S_75M_Volhov", - ["y"] = pointVec3Gl.z -200, - ["x"] = pointVec3Gl.x, - ["heading"] = 3.3161255787892, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [6] - [7] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Random", - ["type"] = "SKP-11", - ["y"] = pointVec3Gl.z , - ["x"] = pointVec3Gl.x + 200, - ["heading"] = 2.9670597283904, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [7] - [8] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Excellent", - ["type"] = "SKP-11", - ["y"] = pointVec3Gl.z, - ["x"] = pointVec3Gl.x -200, - ["heading"] = 0, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [8] - [9] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Random", - ["type"] = "p-19 s-125 sr", - ["y"] = pointVec3Gl.z +200, - ["x"] = pointVec3Gl.x + 200, - ["heading"] = 6.1086523819802, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [9] - [10] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Random", - ["type"] = "Ural-4320 APA-5D", - ["y"] = pointVec3Gl.z -200, - ["x"] = pointVec3Gl.x -200, - ["heading"] = 0.17453292519943, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [10] - [11] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Random", - ["type"] = "ATMZ-5", - ["y"] = pointVec3Gl.z +550, - ["x"] = pointVec3Gl.x, - ["heading"] = 0, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [11] - [12] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Random", - ["type"] = "Ural-4320T", - ["y"] = pointVec3Gl.z +580, - ["x"] = pointVec3Gl.x, - ["heading"] = 0, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [12] - [13] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Random", - ["type"] = "Ural-4320T", - ["y"] = pointVec3Gl.z +600, - ["x"] = pointVec3Gl.x, - ["heading"] = 0, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [13] - [14] = - { - ["transportable"] = - { - ["randomTransportable"] = false, - }, -- end of ["transportable"] - ["skill"] = "Random", - ["type"] = "ATMZ-5", - ["y"] = pointVec3Gl.z +500, - ["x"] = pointVec3Gl.x + 20, - ["heading"] = 0, - ["playerCanDrive"] = true, - livery_id = "desert", - }, -- end of [14] - }, -- end of units - } -- end of function - ) - redIADS:addSAMSite("SAM " .. samSim.samSuffix) - local detectChance = math.random(75,100) - local goLiveRange = math.random(50,90) - redIADS:getSAMSiteByGroupName("SAM " .. samSim.samSuffix):setHARMDetectionChance(detectChance) - redIADS:getSAMSiteByGroupName("SAM " .. samSim.samSuffix):setGoLiveRangeInPercent(goLiveRange) - - samSim.samSuffix = samSim.samSuffix + 1 -end - -function samSim.genCMD() - unit = Unit.getByName("Test") - local pointVec3Gl = unit:getPosition().p - mist.dynAddStatic( - { - country = 'USSR', - category = 'Fortifications', - name = "CMD " .. samSim.samSuffix, - type = ".Command Center", - x = pointVec3Gl.x, - y = pointVec3Gl.z, - heading = math.pi*3/2, - } -- end of function - ) - nameToAdd = "CMD ".. samSim.samSuffix --.. " " .. "unit1" - local commandCenter = StaticObject.getByName(nameToAdd) - redIADS:addCommandCenter(commandCenter) - redIADS = SkynetIADS:create(nameToAdd) - redIADS:activate() - samSim.samSuffix = samSim.samSuffix + 1 -end - -function samSim.genEWR() - unit = Unit.getByName("Test") - local pointVec3Gl = unit:getPosition().p - mist.dynAdd( - { - country = 'USSR', - category = 'vehicle', - groupName = "EW " .. samSim.samSuffix, - name = "EW " .. samSim.samSuffix, - groupId = 20000+samSim.samSuffix, - units = - { - [1] = - { - ["skill"] = "Random", - ["type"] = "55G6 EWR", - ["y"] = pointVec3Gl.z, - ["x"] = pointVec3Gl.x, - livery_id = "", - ["heading"] = 0, - ["playerCanDrive"] = true, - }, - }, -- end of units - } -- end of function - ) - nameToAdd = "EW ".. samSim.samSuffix .. " " .. "unit1" -- oddly this is the unit name not the group, if you don't use this naming convention change it - redIADS:addEarlyWarningRadar(nameToAdd) - --redIADS:addEarlyWarningRadarsByPrefix("EW") - samSim.samSuffix = samSim.samSuffix + 1 -end - - - - -do - samSims = missionCommands.addSubMenu("Sam stuff") - missionCommands.addCommand ("Spawn SA 10", samSims, samSim.genSAten) - missionCommands.addCommand ("Spawn EWR", samSims, samSim.genEWR) - missionCommands.addCommand ("Spawn SA 2", samSims, samSim.genSAtwo) - missionCommands.addCommand ("Spawn Command Centre and activate", samSims, samSim.genCMD) +--Spawn a SAM integrated with IADS +--Spawn a normal SAM +--SAM bubble shields + +samSim = {} +samSim.samSuffix = 1 + +do -- needs to go early on + redIADS = SkynetIADS:create('Red') + redIADS:setUpdateInterval(5) + redIADS:activate() + --redIADS:addRadioMenu() +end + +function samSim.genSAten() --gens an SA 10 as you can imagine, + unit = Unit.getByName("Test") + local pointVec3Gl = unit:getPosition().p -- this is just to find where my aircraft is and whack an SA10 below it, lazy not relevant + local isHiddenCheck = math.random(100) + if isHiddenCheck > 10 then + isHidden = false + else + isHidden = true -- fairly obvious hides from F10 and F7 view + end + mist.dynAdd( + { + country = 'USSR', + category = 'vehicle', + name = "SAM " .. samSim.samSuffix, + groupName = "SAM " .. samSim.samSuffix, + groupId = 10000+samSim.samSuffix, + hidden = isHidden, + units = + { [1] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Random", + ["type"] = "S-300PS 40B6MD sr", --search radar needs to be first always for avoiding a skynet bug + ["y"] = pointVec3Gl.z + 50, + ["x"] = pointVec3Gl.x, + ["heading"] = 0, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [1] + [2] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Random", + ["type"] = "S-300PS 40B6M tr", + ["y"] = pointVec3Gl.z, + ["x"] = pointVec3Gl.x, + ["heading"] = 4.7123889803847, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [2] + + [3] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Random", + ["type"] = "S-300PS 54K6 cp", + ["y"] = pointVec3Gl.z + 100, + ["x"] = pointVec3Gl.x, + ["heading"] = 3.1415926535898, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [3] + [4] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Random", + ["type"] = "S-300PS 64H6E sr", + ["y"] = pointVec3Gl.z - 50, + ["x"] = pointVec3Gl.x, + ["heading"] = 3.1415926535898, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [4] + [5] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Random", + ["type"] = "S-300PS 5P85C ln", + ["y"] = pointVec3Gl.z +200 , + ["x"] = pointVec3Gl.x, + ["heading"] = 3.1415926535898, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [5] + [6] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Random", + ["type"] = "S-300PS 5P85C ln", + ["y"] = pointVec3Gl.z -200, + ["x"] = pointVec3Gl.x, + ["heading"] = 3.3161255787892, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [6] + [7] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Random", + ["type"] = "S-300PS 5P85C ln", + ["y"] = pointVec3Gl.z , + ["x"] = pointVec3Gl.x + 200, + ["heading"] = 2.9670597283904, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [7] + [8] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Excellent", + ["type"] = "S-300PS 5P85C ln", + ["y"] = pointVec3Gl.z, + ["x"] = pointVec3Gl.x -200, + ["heading"] = 0, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [8] + [9] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Random", + ["type"] = "generator_5i57", + ["y"] = pointVec3Gl.z +200, + ["x"] = pointVec3Gl.x + 200, + ["heading"] = 6.1086523819802, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [9] + [10] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Random", + ["type"] = "ATZ-5", + ["y"] = pointVec3Gl.z -200, + ["x"] = pointVec3Gl.x -200, + ["heading"] = 0.17453292519943, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [10] + [11] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Random", + ["type"] = "ATZ-5", + ["y"] = pointVec3Gl.z +550, + ["x"] = pointVec3Gl.x, + ["heading"] = 0, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [11] + [12] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Random", + ["type"] = "GAZ-66", + ["y"] = pointVec3Gl.z +580, + ["x"] = pointVec3Gl.x, + ["heading"] = 0, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [12] + [13] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Random", + ["type"] = "ATZ-60_Maz", + ["y"] = pointVec3Gl.z +600, + ["x"] = pointVec3Gl.x, + ["heading"] = 0, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [13] + [14] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Random", + ["type"] = "KAMAZ Truck", + ["y"] = pointVec3Gl.z +500, + ["x"] = pointVec3Gl.x + 20, + ["heading"] = 0, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [14] + }, -- end of units + } -- end of function + ) + redIADS:addSAMSite("SAM " .. samSim.samSuffix) --skynet bit + local detectChance = math.random(50,90) + local goLiveRange = math.random(50,90) + local harmStop = math.random(2) + if harmStop == 1 then + harmStopping = true + else + harmStopping = false + end + redIADS:getSAMSiteByGroupName("SAM " .. samSim.samSuffix):setHARMDetectionChance(detectChance) -- doesn't bloody work no idea, don't care want to reinvent this myself + redIADS:getSAMSiteByGroupName("SAM " .. samSim.samSuffix):setGoLiveRangeInPercent(goLiveRange) -- doesn't bloody work no idea, don't care want to reinvent this myself + redIADS:getSAMSiteByGroupName("SAM " .. samSim.samSuffix):setCanEngageHARM(harmStopping) -- doesn't bloody work no idea, don't care want to reinvent this myself + + samSim.samSuffix = samSim.samSuffix + 1 +end + +function samSim.genSAtwo() + unit = Unit.getByName("Test") + local pointVec3Gl = unit:getPosition().p -- this is just to find where my aircraft is and whack an SA10 below it, lazy not relevant + + local isHiddenCheck = math.random(100) + if isHiddenCheck > 50 then + isHidden = false + else + isHidden = true + end + + mist.dynAdd( + { + country = 'USSR', + category = 'vehicle', + name = "SAM " .. samSim.samSuffix, + groupName = "SAM " .. samSim.samSuffix, + groupId = 10000+samSim.samSuffix, + hidden = isHidden, + units = + { + [1] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Random", + ["type"] = "SNR_75V", + ["y"] = pointVec3Gl.z, + ["x"] = pointVec3Gl.x, + ["heading"] = 4.7123889803847, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [1] + [2] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Random", + ["type"] = "S_75M_Volhov", + ["y"] = pointVec3Gl.z + 50, + ["x"] = pointVec3Gl.x, + ["heading"] = 0, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [2] + [3] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Random", + ["type"] = "S_75M_Volhov", + ["y"] = pointVec3Gl.z + 100, + ["x"] = pointVec3Gl.x, + ["heading"] = 3.1415926535898, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [3] + [4] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Random", + ["type"] = "S_75M_Volhov", + ["y"] = pointVec3Gl.z - 50, + ["x"] = pointVec3Gl.x, + ["heading"] = 3.1415926535898, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [4] + [5] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Random", + ["type"] = "S_75M_Volhov", + ["y"] = pointVec3Gl.z +200 , + ["x"] = pointVec3Gl.x, + ["heading"] = 3.1415926535898, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [5] + [6] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Random", + ["type"] = "S_75M_Volhov", + ["y"] = pointVec3Gl.z -200, + ["x"] = pointVec3Gl.x, + ["heading"] = 3.3161255787892, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [6] + [7] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Random", + ["type"] = "SKP-11", + ["y"] = pointVec3Gl.z , + ["x"] = pointVec3Gl.x + 200, + ["heading"] = 2.9670597283904, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [7] + [8] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Excellent", + ["type"] = "SKP-11", + ["y"] = pointVec3Gl.z, + ["x"] = pointVec3Gl.x -200, + ["heading"] = 0, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [8] + [9] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Random", + ["type"] = "p-19 s-125 sr", + ["y"] = pointVec3Gl.z +200, + ["x"] = pointVec3Gl.x + 200, + ["heading"] = 6.1086523819802, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [9] + [10] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Random", + ["type"] = "Ural-4320 APA-5D", + ["y"] = pointVec3Gl.z -200, + ["x"] = pointVec3Gl.x -200, + ["heading"] = 0.17453292519943, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [10] + [11] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Random", + ["type"] = "ATMZ-5", + ["y"] = pointVec3Gl.z +550, + ["x"] = pointVec3Gl.x, + ["heading"] = 0, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [11] + [12] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Random", + ["type"] = "Ural-4320T", + ["y"] = pointVec3Gl.z +580, + ["x"] = pointVec3Gl.x, + ["heading"] = 0, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [12] + [13] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Random", + ["type"] = "Ural-4320T", + ["y"] = pointVec3Gl.z +600, + ["x"] = pointVec3Gl.x, + ["heading"] = 0, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [13] + [14] = + { + ["transportable"] = + { + ["randomTransportable"] = false, + }, -- end of ["transportable"] + ["skill"] = "Random", + ["type"] = "ATMZ-5", + ["y"] = pointVec3Gl.z +500, + ["x"] = pointVec3Gl.x + 20, + ["heading"] = 0, + ["playerCanDrive"] = true, + livery_id = "desert", + }, -- end of [14] + }, -- end of units + } -- end of function + ) + redIADS:addSAMSite("SAM " .. samSim.samSuffix) + local detectChance = math.random(75,100) + local goLiveRange = math.random(50,90) + redIADS:getSAMSiteByGroupName("SAM " .. samSim.samSuffix):setHARMDetectionChance(detectChance) + redIADS:getSAMSiteByGroupName("SAM " .. samSim.samSuffix):setGoLiveRangeInPercent(goLiveRange) + + samSim.samSuffix = samSim.samSuffix + 1 +end + +function samSim.genCMD() + unit = Unit.getByName("Test") + local pointVec3Gl = unit:getPosition().p + mist.dynAddStatic( + { + country = 'USSR', + category = 'Fortifications', + name = "CMD " .. samSim.samSuffix, + type = ".Command Center", + x = pointVec3Gl.x, + y = pointVec3Gl.z, + heading = math.pi*3/2, + } -- end of function + ) + nameToAdd = "CMD ".. samSim.samSuffix --.. " " .. "unit1" + local commandCenter = StaticObject.getByName(nameToAdd) + redIADS:addCommandCenter(commandCenter) + redIADS = SkynetIADS:create(nameToAdd) + redIADS:activate() + samSim.samSuffix = samSim.samSuffix + 1 +end + +function samSim.genEWR() + unit = Unit.getByName("Test") + local pointVec3Gl = unit:getPosition().p + mist.dynAdd( + { + country = 'USSR', + category = 'vehicle', + groupName = "EW " .. samSim.samSuffix, + name = "EW " .. samSim.samSuffix, + groupId = 20000+samSim.samSuffix, + units = + { + [1] = + { + ["skill"] = "Random", + ["type"] = "55G6 EWR", + ["y"] = pointVec3Gl.z, + ["x"] = pointVec3Gl.x, + livery_id = "", + ["heading"] = 0, + ["playerCanDrive"] = true, + }, + }, -- end of units + } -- end of function + ) + nameToAdd = "EW ".. samSim.samSuffix .. " " .. "unit1" -- oddly this is the unit name not the group, if you don't use this naming convention change it + redIADS:addEarlyWarningRadar(nameToAdd) + --redIADS:addEarlyWarningRadarsByPrefix("EW") + samSim.samSuffix = samSim.samSuffix + 1 +end + + + + +do + samSims = missionCommands.addSubMenu("Sam stuff") + missionCommands.addCommand ("Spawn SA 10", samSims, samSim.genSAten) + missionCommands.addCommand ("Spawn EWR", samSims, samSim.genEWR) + missionCommands.addCommand ("Spawn SA 2", samSims, samSim.genSAtwo) + missionCommands.addCommand ("Spawn Command Centre and activate", samSims, samSim.genCMD) end \ No newline at end of file diff --git a/scripts/payloadNames.js b/scripts/payloadNames.js deleted file mode 100644 index 646390f9..00000000 --- a/scripts/payloadNames.js +++ /dev/null @@ -1 +0,0 @@ -payloadNames = {"A-10A": ["MK-84*2 , LAU-68*2 , AGM-65K*2", "LAU-68-MK5*6", "AGM-65K*2,Mk20*6,AIM-9*2,ECM", "Mk-82*6,AIM-9*2,ECM", "Mk20*6,AIM-9*2,ECM", "AGM-65D*4,AIM-9*2,ECM", "AGM-65K, AGM-65D", "ECM", "Mk-82*6, Mk-84*2", "Mk20*8", "AGM-65K*2,Mk-84*2,AIM-9*2,ECM", "AGM-65K*2,Mk-82*6,AIM-9*2,ECM", "Mk-84*2,AIM-9*2,ECM", "AGM-65K*2,Mk84*2,Mk82*4,AIM-9M*2,ECM", "AGM-65H*6,Mk82*10,AIM-9M*2,ECM"], "A-10C": ["LAU-68 42 rkt M156 WP, AIM-9*2, ECM", "AGM-65D*4, CBU-97*2, CBU-87*2, TGP, ECM, AIM-9*2", "LAU-131 98 rkt M156 WP, AIM-9*2,ECM", "SUU-25*9,AIM-9*2,ECM", "AGM-65D*4, CBU-97*4,TGP, ECM, AIM-9*2", "Mk-82AIR*8,AIM-9*2,ECM", "MK-84*2,LAU-68*2,AGM-65K*2", "BDU-33*6, TGM-65H, TGM-65D, TGP, BDU-50LGB*2, CAP-9*1", "Mk-82*6,Mk-84*2,AIM-9*2,ECM", "Mk-84*4,AIM-9*2,ECM", "Mk-82*8,AIM-9*2,ECM", "BDU-33*12, TGP, CAP-9*1", "AGM-65D*4,Mk-82AIR*2,CBU-87*2,AIM-9M*2,ECM,TGP", "AGM-65D*4,GBU-12*2,GBU-38,Mk-82,AIM-9,TGP,ECM", "AGM-65D*2, AGM-65H*2, CBU-97*2, CBU-87*2, TGP, ECM, AIM-9*2", "BDU-50HD*6,Mk1*7,TGP, CAP-9*1", "AGM-65H*4, CBU-97*4,TGP, ECM, AIM-9*2", "AGM-65D*2,AGM-65H*2,Mk-82AIR*2,CBU-87*2,AIM-9M*2,ECM,TGP", "AGM-65K*2,GBU-38*4,AIM-9*2,TGP,ECM", "BDU-33*6, TGP, CAP-9*1", "AGM-65D*2,AGM-65H*2,GBU-12*2,GBU-38*2,AIM-9*2,TGP,ECM,MK151*7", "TGP", "BDU-33*6, TGP, CAP-9*1, BDU-50LD*2", "GBU-12*6,GBU-10*2,TGP, AIM-9*2", "TGP, CBU-87*3, M151*28, AIM-9*2, ECM", "AGM-65D*4,Mk-82*6,CBU-87*2,TGP,AIM-9*2,Mk151*7", "PGM- GBU-10*2,GBU-12*4,AIM-9*2,TGP,ECM", "AGM-65D*4,TGP, ECM, AIM-9*2", "TGP, CAP-9*1, CATM-65K*1, TGM-65G*1", "AGM-65G*2,GBU-31*2,AIM-9*2,TGP,ECM", "TGP, M151*14, Mk-82*2, Mk-82AIR*2, AIM-9*2, ECM", "PGM- GBU-10*4, AGM-65K*2,AIM-9*2,TGP,ECM", "AGM-65D*2,AGM-65H*2,Mk-82AIR*6,CBU-87*2,Mk151*7,AIM-9*2,TGP,ECM", "GBU-31*2,GBU-38*2, AGM-65H*2, AIM-9*2,TGP, ECM", "CBU-103*4, M151*14, AIM-9*2, ECM", "CBU-87*4, M151*42, AIM-9*2, ECM", "AGM-65D*6, CBU-97*4,TGP, ECM, AIM-9*2", "CBU-87*2, M151*14, MK-82AIR*6, AIM-9*2,ECM", "AGM-65D*4, CBU-105*4,TGP, ECM, AIM-9*2", "BDU-50HD*2,BDU-50LGB*2,TGP, CAP-9*1", "CBU-87*4, M151*28, AIM-9*2,ECM", "M151*98, Mk-82*2,AIM-9*2,ECM", "AGM-65D*2,AGM-65H*2,GBU-12,GBU-38,MK82*3,MK82AIR*3,MK5*7,TGP,AM-9*2", "TGP, M151*42, Mk-82*6, Mk-82AIR*6, AIM-9*2, ECM", "TGP, M151*84, Mk-82*2,AIM-9*2, ECM", "BDU-50LD*2, BDU-50HD*2,CATM-65K, TGM-65G, TGP, CAP-9*1", "TGP, M151*49, Mk-82*2, CBU-87*2, AIM-9*2, ECM", "TGP, CAP-9*1, BDU-50LGB*4", "GBU-12*14,TGP, AIM-9*2", "AGM-65D*3, AGM-65H*3, CBU-97*4,TGP, ECM, AIM-9*2", "AGM-65D*2,AGM-65H*2,Mk-82AIR*2,CBU-97*2,AIM-9M*2,TGP,ECM", "AGM-65D*4, CBU-105*2,CBU-97*2, TGP, ECM, AIM-9*2", "AGM-65D*2,Mk-82*6,AIM-9*2,ECM", "AGM-65D*2,AGM-65H*2,TGP, ECM, AIM-9*2", "GBU-38*4,GBU-31*2,TGP, AIM-9*2", "AGM-65D*4,GBU-12*2,GBU-38*2,AIM-9*2,TGP,ECM,MK5*7", "AGM-65G,AGM-65K,GBU-10*2,AIM-9*2,TGP,ECM", "AGM-65G,AGM-65D,Mk-82*7,AIM-9*2,ECM", "GBU-31*2,GBU-38*4,AIM-9*2,TGP,ECM, AIM-9*2", "AGM-65K*2,GBU-12*8,AIM-9M*2.ECM,TGP", "AGM-65D*6,GBU-12*4,AIM-9M*2,ECM,TGP"], "A-10C_2": ["LAU-68 42 rkt M156 WP, AIM-9*2, ECM", "AGM-65D*4, CBU-97*2, CBU-87*2, TGP, ECM, AIM-9*2", "LAU-131 98 rkt M156 WP, AIM-9*2,ECM", "SUU-25*9,AIM-9*2,ECM", "AGM-65D*4, CBU-97*4,TGP, ECM, AIM-9*2", "Mk-82AIR*8,AIM-9*2,ECM", "MK-84*2,LAU-68*2,AGM-65K*2", "BDU-33*6, TGM-65H, TGM-65D, TGP, BDU-50LGB*2, CAP-9*1", "Mk-82*6,Mk-84*2,AIM-9*2,ECM", "Mk-84*4,AIM-9*2,ECM", "Mk-82*8,AIM-9*2,ECM", "BDU-33*12, TGP, CAP-9*1", "AGM-65D*4,Mk-82AIR*2,CBU-87*2,AIM-9M*2,ECM,TGP", "AGM-65D*4,GBU-12*2,GBU-38,Mk-82,AIM-9,TGP,ECM", "AGM-65D*2, AGM-65H*2, CBU-97*2, CBU-87*2, TGP, ECM, AIM-9*2", "BDU-50HD*6,Mk1*7,TGP, CAP-9*1", "AGM-65H*4, CBU-97*4,TGP, ECM, AIM-9*2", "AGM-65D*2,AGM-65H*2,Mk-82AIR*2,CBU-87*2,AIM-9M*2,ECM,TGP", "AGM-65K*2,GBU-38*4,AIM-9*2,TGP,ECM", "BDU-33*6, TGP, CAP-9*1", "AGM-65D*2,AGM-65H*2,GBU-12*2,GBU-38*2,AIM-9*2,TGP,ECM,MK151*7", "TGP", "BDU-33*6, TGP, CAP-9*1, BDU-50LD*2", "GBU-12*6,GBU-10*2,TGP, AIM-9*2", "TGP, CBU-87*3, M151*28, AIM-9*2, ECM", "AGM-65D*4,Mk-82*6,CBU-87*2,TGP,AIM-9*2,Mk151*7", "PGM- GBU-10*2,GBU-12*4,AIM-9*2,TGP,ECM", "AGM-65D*4,TGP, ECM, AIM-9*2", "TGP, CAP-9*1, CATM-65K*1, TGM-65G*1", "AGM-65G*2,GBU-31*2,AIM-9*2,TGP,ECM", "TGP, M151*14, Mk-82*2, Mk-82AIR*2, AIM-9*2, ECM", "PGM- GBU-10*4, AGM-65K*2,AIM-9*2,TGP,ECM", "AGM-65D*2,AGM-65H*2,Mk-82AIR*6,CBU-87*2,Mk151*7,AIM-9*2,TGP,ECM", "GBU-31*2,GBU-38*2, AGM-65H*2, AIM-9*2,TGP, ECM", "CBU-103*4, M151*14, AIM-9*2, ECM", "CBU-87*4, M151*42, AIM-9*2, ECM", "AGM-65D*6, CBU-97*4,TGP, ECM, AIM-9*2", "CBU-87*2, M151*14, MK-82AIR*6, AIM-9*2,ECM", "AGM-65D*4, CBU-105*4,TGP, ECM, AIM-9*2", "BDU-50HD*2,BDU-50LGB*2,TGP, CAP-9*1", "CBU-87*4, M151*28, AIM-9*2,ECM", "M151*98, Mk-82*2,AIM-9*2,ECM", "AGM-65D*2,AGM-65H*2,GBU-12,GBU-38,MK82*3,MK82AIR*3,MK5*7,TGP,AM-9*2", "TGP, M151*42, Mk-82*6, Mk-82AIR*6, AIM-9*2, ECM", "TGP, M151*84, Mk-82*2,AIM-9*2, ECM", "BDU-50LD*2, BDU-50HD*2,CATM-65K, TGM-65G, TGP, CAP-9*1", "TGP, M151*49, Mk-82*2, CBU-87*2, AIM-9*2, ECM", "TGP, CAP-9*1, BDU-50LGB*4", "GBU-12*14,TGP, AIM-9*2", "AGM-65D*3, AGM-65H*3, CBU-97*4,TGP, ECM, AIM-9*2", "AGM-65D*2,AGM-65H*2,Mk-82AIR*2,CBU-97*2,AIM-9M*2,TGP,ECM", "AGM-65D*4, CBU-105*2,CBU-97*2, TGP, ECM, AIM-9*2", "AGM-65D*2,Mk-82*6,AIM-9*2,ECM", "AGM-65D*2,AGM-65H*2,TGP, ECM, AIM-9*2", "GBU-38*4,GBU-31*2,TGP, AIM-9*2", "AGM-65D*4,GBU-12*2,GBU-38*2,AIM-9*2,TGP,ECM,MK5*7", "AGM-65G,AGM-65K,GBU-10*2,AIM-9*2,TGP,ECM", "AGM-65G,AGM-65D,Mk-82*7,AIM-9*2,ECM", "GBU-31*2,GBU-38*4,AIM-9*2,TGP,ECM, AIM-9*2", "AGM-65K*2,GBU-12*8,AIM-9M*2.ECM,TGP", "AGM-65D*6,GBU-12*4,AIM-9M*2,ECM,TGP", "AGM-65E*2,Mk-82AIR*2,CBU-97*2,AIM-9M*2,ECM,TGP", "AGM-65E*2,CBU-97*4,AIM-9M*2,ECM,TGP", "AGM-65E*2,CBU-97*4,AIM-9M*2,ECM,M151 APKWS*7,TGP", "AGM-65E*2,CBU-105*4,AIM-9M*2,ECM,M151 APKWS*7,TGP", "Mk-82*4,Mk-8AIR*4,AIM-9*2,ECM", "Mk-82*20,AIM-9*2,ECM", "Mk-82*6,AIM-9*2,TGP,ECM", "Mk-84*6,AIM-9*2,TGP,ECM", "Mk-82AIR*6,Mk-8AIR*4,M151*1,TGP,AIM-9*2,ECM", "GBU-38*4,M151 APKWS*7,AGM-65D*1,AGM-65H*1,TGP,AIM-9*2,ECM", "GBU-38*4,M151 APKWS*7,AGM-65E*2,TGP,AIM-9*2,ECM", "GBU-12*4,M151 APKWS*7,AGM-65E*2,TGP,AIM-9*2,ECM", "GBU-12*2,GBU-38*2,M151 APKWS*7,AGM-65E*2,TGP,AIM-9*2,ECM", "GBU-10*2,M151 APKWS*7,AGM-65E*2,TGP,AIM-9*2,ECM", "GBU-31*2,M151 APKWS*7,AGM-65E*2,TGP,AIM-9*2,ECM", "GBU-54*4,M151 APKWS*7,AGM-65E*2,TGP,AIM-9*2,ECM", "GBU-54*4,M151 APKWS*7,AGM-65D*4,TGP,AIM-9*2,ECM"], "AH-64D_BLK_II": ["2 * Fuel Tank 230 gal", "2 * M261: M151 (6PD), 2 * Hellfire station: 4*AGM-114K", "4 * Hellfire station: 4*AGM-114K", "4 * M261: M151 (6PD)", "2 * M261: M151 (6PD), 2 * Fuel Tank 230 gal", "2 * Fuel Tank 230 gal, 2 * Hellfire station: 4*AGM-114K", "2 * M261: A/B - M151 (6PD), E - M274 (6SK), 2 * Hellfire station: 4*AGM-114K", "2 * M261: A/B - M151 (6PD), E - M257 (6IL), 2 * Hellfire station: 4*AGM-114K", "2 * M261: C - M257 (6IL), D/E - M151 (6PD), 2 * Hellfire station: 4*AGM-114K", "2 * M261: C - M274 (6SK), D/E - M151 (6PD), 2 * Hellfire station: 4*AGM-114K", "2 * M261: M151 (6PD), 2 * Hellfire station: 4*AGM-114L", "4 * Hellfire station: 4*AGM-114L", "2 * Fuel Tank 230 gal, 2 * Hellfire station: 4*AGM-114L", "2 * M261: A/B - M151 (6PD), E - M274 (6SK), 2 * Hellfire station: 4*AGM-114L", "2 * M261: A/B - M151 (6PD), E - M257 (6IL), 2 * Hellfire station: 4*AGM-114L", "2 * M261: C - M257 (6IL), D/E - M151 (6PD), 2 * Hellfire station: 4*AGM-114L", "2 * M261: C - M274 (6SK), D/E - M151 (6PD), 2 * Hellfire station: 4*AGM-114L"], "AJS37": ["Battlefield Air Interdiction: RB-75*4, RB-24J*2, XT", "Anti-ship: RB-04E*2, RB-74*2, XT", "Anti-ship (Heavy Mav): RB-75T*4, XT", "Hard Target (Countermeasures): RB-05, XT, KB, U22", "Hard Target (MAV): RB-75T*2, RB-74*2, XT", "Ferry Flight: XT", "CAS (75 GUN): RB-75*2, AKAN", "CAP: RB-74*4, XT", "Countermeasures Escort: U/22A, KB", "Strike: BK90 (MJ1)*2, RB-74*2, XT", "CAS: AKAN, RB-05A", "CAP (6 AAM): RB-74*4, RB-24J*2, XT", "Rocket Half Load HE: ARAK HE*2, RB-74*2, XT", "CAP / Intecept: RB-05A*2, RB-74*2, XT", "Bombs Low-drag: SB71LD*16, RB-24J*2, XT", "SEAD: RB-75T*2, U22/A, KB, XT", "Anti-Ship (Modern): RB-15F*2, RB-74*2, XT", "New Payload", "CAP (AJ37): RB-24J*2", "ECM Escort Anti-ship: RB-04E, KB, RB-74*2, XT", "Bombs High-drag: SB71HD*16, XT, RB-24J", "Anti-ship (Light Mav): RB-75*4, XT", "Rocket Full Load HE: ARAK HE*4, RB-24J, XT", "Illumination: LYSB*8, XT", "Anti-ship (RB05): RB-05A*2, RB-74*2, XT", "CAP (Gun): AKAN*2, RB-74*2, XT", "Hard Target: RB-05A*2, RB-74*2, XT", "RB-05*2, XT", "CAS: ARAK M70 HE*4, XT", "Runway Strike: SB71HD*16, RB-24J, XT"], "AV8BNA": ["H-L-H: Mk-82SEx6, GAU-12", "AFAC: AIM-9Mx2, SUU-25x2, LAU-68 (7 WP Tkts)x2, TPOD", "AS: AGM-122, AIM-9M, GBU-12, GBU-16x2, TPOD, Jammer Pod, GAU-12", "H-M-H: AIM-9M, AGM-122, GBU-38x4, Fuel Tankx2", "Interdiction (H-H-H-H): AIM-9Mx2, Mk-83LDx6, Jammer Pod, GAU-12", "Interdiction (H-H-H-H): AIM-9Mx2, Mk-83LDx4, Jammer Pod, GAU-12, Fuel Tankx2", "AFAC: AIM-9m, AGM-122, SUU-25x2, LAU-68 (7 WP Tkts)x2, Jammer Pod", "Interdiction (H-L-L-H): AIM-9Mx2, Mk-82SEx8, Jammer Pod, GAU-12", "H-M-H: Mk-82LDx6, GAU-12", "H-L-H: Mk-82SEx6, GAU-12", "PGM (H-H-H-H): GBU-12x4, TPOD, Fuel Tankx2", "L-L-L: Mk-82SEx10, Jammer Pod, GAU-12", "AFAC: AIM-9Mx2, SUU-25x2, LAU-68 LAU-68 (7 WP Tkts)x2, GAU-12", "H-M-H: Mk-82LDx10, GAU-12", "Area Suppression: Mk-20x10, GAU-12", "Rockets: LAU-10 (4 HE Rkts)x2, LAU-68 (7 HE Rkts)x2", "AS: AIM-9M, AGM-122, AGM-65Fx2, GBU-12, TPOD, Jammer Pod, GAU-12", "Helo Escort: AIM-9Mx4, Jammer Pod, GAU-12", "PGM (H-H-H-H): GBU-12x5, TPOD, Jammer POd, GAU-12", "Helo Escort: AIM-9Mx4, Jammer Pod, GAU-12, Fuel Tankx2", "PGM (H-H-H-H): AIM-9Mx2, GBU-16x4, TPOD, GAU-12", "Anti Armor: AIM-9Mx2, AGM-65Fx4, GAU-12", "RA (H-M-M-H): AIM-9M, AGM-122, Mk-83LDx6, Jammer Pod, GAU-12", "Stand Off: AIM-9M, AGM-122, AGM-65Fx4, Jammer Pod, GAU-12", "Stand Off: AIM-9M, AGM-122x3, AGM-65Fx2, Jammer Pod, GAU-12", "Stand Off: AIM-9Mx2, AGM-122x2, AGM-65Fx2, Jammer Pod, GAU-12", "Iron Hand: AIM-9Mx1, AGM-122x3, LAU-68 (7 HE Rkts)x2, Jammer Pod, GAU-12", "Iron Hand: AIM-9M, AGM-122x3, Mk-20x4, Jammer Pod, GAU-12", "AS: AIM-9M, AGM-122, AGM-65E2x2, GBU-12, TPOD, Jammer Pod, GAU-12", "PGM: AIM-9M, AGM-122, AGM-65E2x4, TPOD", "PGM: AIM-9M, AGM-122, APKWSIIx4, TPOD"], "C-101CC": ["2*AIM-9P, DEFA 553 CANNON (I)", "2*AIM-9M, DEFA 553 CANNON (I)", "2*AIM-9P, DEFA 533 CANNON (II)", "2*AIM-9P, AN-M3 CANNON (IV)", "2*R.550 MAGIC, DEFA 553 CANNON", "2*AIM-9M, AN-M3 CANNON (III)", "2*AIM-9P, DEFA 553 CANNON", "2*R.550 MAGIC, DEFA 553 CANNON (III)", "2*AIM-9P, 2*BELOUGA, DEFA 553 CANNON", "2*AIM9-P, 2*SEA EAGLE, DEFA-553 CANNON", "2*AIM-9M 2*SEA EAGLE, AN-M3 CANNON", "2*AIM-9M, AN-M3 CANNON", "2*BELOUGA,2*BDU-33, DEFA-553 CANNON", "2* SEA EAGLE, DEFA-553 CANNON", "2*AIM-9P, 2*BR-250,2*MK-82, DEFA 553 CANNON", "2*R.550 MAGIC, 2*SEA EAGLE , DEFA-553 CANNON", "2*R.550 MAGIC, DEFA 553 CANNON (IV)", "2*BELOUGA, 2*BR-500, DEFA 553 CANNON", "2*AIM-9M, DEFA 553 CANNON (IV)", "2*R.550 MAGIC, AN-M3 CANNON (II)", "2*R550 Magic, DEFA 553 CANNON (I)", "2*AIM-9M ,2*BELOUGA,2*BIN-200, AN-M3 CANNON", "2*AIM-9M, 2*LAU 68, 2*MK-82, DEFA 553 CANNON", "2*AIM-9P, AN-M3 CANNON (III)", "2*AIM-9M, DEFA 533 CANNON (II)", "2*R.550 MAGIC, 2*BR-250, 2*BDU-33, DEFA 553 CANNON"], "C-101EB": ["Smoke System: White Smoke", "Smoke System: White Smoke+Red Colorant", "Smoke System: White Smoke+Yellow Colorant"], "H-6J": ["YJ-12 x 2", "YJ-12 x 4", "YJ-83K x 6", "250-2 HD Bomb x 12 in Bay", "250-2 HD Bomb x 24 in Bay", "250-3 LD Bomb x 36", "KD-63 x 4", "KD-20 x 6", "KD-20 x 4", "KD-63 x 2, KD-20 x 4", "KD-63 x 2, KD-20 x 2"], "J-11A": ["FAB-100x36,R-73x2,ECM", "FAB-250x8,R-73x2,ECM", "FAB-500x8,R-73x2,ECM", "S-8KOMx80,FAB-250x4,R-73x2,ECM", "S-13x20,FAB-250x4,R-73x2,ECM", "S-25x4,FAB-500x4,R-73x2,ECM", "R-27ERx4,R-27ETx2,R-73x2,ECM", "R-77x6,R-73x2,ECM", "R-27ERx6,R-73x2,ECM", "R-77x4,R-27ETx2,R-73x2,ECM", "R-77x4,R-27ERx2,R-73x2,ECM", "BetAB-500ShPx6,R-73x2,ECM", "R-73x4,ECM", "R-77x2,R-27ETx2,R-73x2,ECM", "R-77x6,R-73x4", "R-77x2,R-27ETx2,R-27ERx2,R-73x2,ECM", "R-27ETx2,R-27ERx4,R-73x2,ECM", "S-8TsMx80,FAB-250x4,R-73x2,ECM", "S-8OFP2x80,FAB-250x4,R-73x2,ECM", "FAB-250x18,R-73x2,ECM", "2*S8-KOMx2, R-73x2, ECM", "2*S8-OFP2x2, R-73x2, ECM", "FAB-250x4, 2*FAB-500x2, R-73x2", "FAB-250x4, 2*FAB-250x2, R-73x2", "RBK-250 HEAT/APx2, RBK-250 HE/Fragx2, R-73x2"], "JF-17": ["PL-5Ex2, C802AKx2, 800L Tank", "PL-5Ex2, C-701 IRx2, 1100L Tank, 800L Tank", "PL-5Ex2, SD-10x2, 1100L Tankx2, WMD7", "PL-5Ex2, LD-10x2, 1100L Tankx2, WMD7", "PL-5Ex2, 800L Tank, WMD7", "PL-5Ex2, GBU-10x2, WMD7", "PL-5Ex2, 2*GBU-12x2, 800L Tank, WMD7", "PL-5Ex2, 2*Mk-82x2, Mk-83x2, 800L Tank", "PL-5Ex2, 1100L Tankx2, 800L Tank", "PL-5Ex2, WMD7, CM802AKGx2, 800L Tank, DL", "PL-5Ex2, C-701 CCDx2, 1100L Tank, 800L Tank", "PL-5Ex2, GBU-12x2, 1100L Tank, WMD7", "PL-5Ex2, 2*GBU-12x2, GBU-16x2, WMD7", "PL-5Ex2, 1100L Tankx2, WMD7", "PL-5Ex2, WMD7, 800L Tankx2, SPJ, 2*LD-10", "PL-5Ex2, LS-6x2, 1100L Tankx2, WMD7", "PL-5Ex2, C-701 IRx2, 1100L Tankx2, WMD7", "PL-5Ex2, GBU-12x2, 1100L Tankx2, WMD7", "PL-5Ex2, 2*LD-10x2, 1100L Tankx2, SPJ", "PL-5Ex2, LD-10x2, 1100L Tankx2, SPJ", "PL-5Ex2, 2*LD-10x2, LS-6x2, SPJ", "PL-5Ex2, 2*LD-10x2, GB-6-HEx2, SPJ", "PL-5Ex2, C-701 IRx2, 800L Tankx2, WMD7", "PL-5Ex2, C-701 CCDx2, 1100L Tankx2, WMD7", "PL-5Ex2, C-701 CCDx2, 800L Tankx2, WMD7", "PL-5Ex2, 2*GBU-12x2, 1100L Tank, WMD7", "PL-5Ex2, C-701 IRx2, 1100L Tank, WMD7", "PL-5Ex2, C-701 IRx2, 800L Tank, WMD7", "PL-5Ex2, C-701 CCDx2, 1100L Tank, WMD7", "PL-5Ex2, C-701 CCDx2, 800L Tank, WMD7", "PL-5Ex2, C-701 IRx2, LS-6x2, 800L Tank", "PL-5Ex2, C-701 IR/CCD, GB-6-HEx2, 800L Tank", "PL-5Ex2, C-701 IR/CCD, GB-6-SFWx2, 800L Tank", "PL-5Ex2, WMD7, GB-6-SFWx2, 800L Tank, BRM1", "PL-5Ex2, WMD7, GB-6-SFWx2, 800L Tank, GBU-12", "PL-5Ex2, 2*Mk-82SEx2, Mk-83x3", "PL-5Ex2, Mk-84x3", "PL-5Ex2, 2*Mk5x2, 800L Tank", "PL-5Ex2, Unguided 90mmx2, 800L Tank", "PL-5Ex2, 2*Mk5x2, Mk-83x3", "PL-5Ex2, BRM1x2, 1100L Tank, WMD7", "PL-5Ex2, 2x1100L Tank", "PL-5Ex2, SD-10x2, 2x1100L Tank", "PL-5Ex2, 2*SD-10x2, 2x1100L Tank", "PL-5Ex2, 800L Tank", "PL-5Ex2, SD-10x2, 800L Tank", "PL-5Ex2, 2*SD-10x2, 800L Tank", "PL-5Ex2, SD-10x2, SPJ", "PL-5Ex2, SPJ", "PL-5Ex2, 2*SD-10x2, SPJ", "PL-5Ex2", "PL-5Ex2, SD-10x2", "PL-5Ex2, 2*SD-10", "PL-5Ex2, SD-10x2, SPJ, 1100L Tankx2", "PL-5Ex2, 2*SD-10x2, 1100L Tankx2, 800L Tank", "PL-5Ex2, SD-10x2, 1100L Tankx2, 800L Tank", "PL-5Ex2, GBU-16x2, BRM1x2, WMD7", "PL-5Ex2, WMD7", "PL-5Ex2, 2*LD-10, GB-6x2, 2*SD-10, SPJ", "PL-5Ex2, C-701 CCDx2, SPJ", "PL-5Ex2, 2*LD-10, CM802AKGx2, 2*SD-10, DL", "PL-5Ex2, 2*MK-82x2, MK-83x2, MK-84", "PL-5Ex2, LS-6x2, GB-6x2, 800L Tank", "PL-5Ex2, 2*GBU-12x2, LS-6x2, WMD7", "PL-5Ex2, 2*GBU-12x2, GB-6x2, WMD7", "PL-5Ex2, 2*Type-200Ax2", "PL-5Ex2, Type-200Ax2", "PL-5Ex2, 2*LS6-250x2, 800L Tankx2, WMD7", "PL-5Ex2, 2*LS6-250x2, 800L Tank, 1100L Tankx2", "PL-5Ex2, 2*LS6-100x2, 1100L Tankx2, WMD7", "PL-5Ex2, 2*LS6-100x2, 800L Tankx2, WMD7"], "WingLoong-I": ["AKD-10 x 2"], "Christen Eagle II": ["Smoke - white"], "F-15ESE": ["AIM-120C x 2, AIM-9M x 2, BLU-107 x 12, TGP, NVP, Fuel Tank", "AIM-120C x 4, AIM-9M x4, TGP, NVP, FUel Tank x 2", "AIM-9M x 4, CBU-87 x 6, TGP, Fuel Tank x 2", "AIM-120Cx4, AIM-9Mx4, Fuel Tanks x 2", "AIM-9M x 4, TGP, NVP, Fuel Tanks x 2", "AIM-9M x 4, Mk-84 x 2, Mk-82 x 6, CBU-87 x 3, TGP, NVP", "CATM-9M x 3, AIM-120B", "AIM-9M x 4, AIM-120B x 4, TGP, NVP, Fuel Tanks x 2", "CATM-9M, CAIM-120", " AIM-120C x 2, CATM-9M, GBU-12 x 4, TGP, NVP", "AIM-120C x 2, AIM-9M x 2, GBU-12 x 9, TGP, NVP, FUel Tank x 2", " AIM-9M x 4, MK-82 x 12, TGP, Fuel Tank x 2", "AIM-9M x 4, AIM-120C x 2, CBU-87 x 6, TGP", "AIM-120C x 2, AIM-9M x 2, GBU-12 x 4, GBU-10 x 2, TGP, NVP, FUel Tank x 2", "Clean", "AIM-9M x 4, Mk-20 x 12, NVP, Fuel Tanks x 2", "AIM-9M x 4, AIM-7M x 2, Mk-20 x 2, NVP, Fuel Tanks x 2", "AIM-120C x2, AIM-9M x 2, Mk-84 x 3, Mk-82AIR x 12"], "F-16C_50": ["AIM-120B*2, AIM-9M*4, FUEL*3", "AIM-120B*4, AIM-9M*2, FUEL*3", "AIM-120B*6, FUEL*3", "AIM-120C*2, AIM-9X*4, FUEL*2", "AIM-120C*4, AIM-9X*2, FUEL*3", "AIM-120C*4, AIM-9X*2, FUEL*3, TGP", "AIM-120C*4, AIM-9X*2, FUEL*2", "AIM-120C*6, FUEL*3", "AIM-120C*4, AIM-9X*2, FUEL*2, ECM", "AIM-120C*4, AIM-9X*2, FUEL*2, ECM, TGP", "AIM-120C*6, FUEL*2, ECM", "AIM-120C*6, FUEL*2, ECM, TGP", "AIM-120C*6, FUEL*2", "AIM-120C*6, FUEL*3, TGP", "AIM-120C*2, AIM-9X*2, AGM-65D*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, AGM-65H*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, AGM-65H*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, AGM-65D*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, CBU-97*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, MK-82*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, CBU-87*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, MK-82HD*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, CBU-103*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, CBU-105*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, MK-82*6, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, MK-82HD*6, FUEL*2, ECM, TGP", "AIM-120*2, AIM-9X*2, MK-82SE*4, FUEL*2, ECM, TGP", "AIM-120*2, AIM-9X*2, MK-82SE*6, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, MK-84*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, MK-82P*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, GBU-12*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, GBU-12*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, GBU-10*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, GBU-24*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, GBU-31-1B*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, GBU-31-3B*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, GBU-38*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, GBU-38*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, AGM-65K*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, AGM-65G*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, AGM-65G, AGM-65K, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, AGM-88C*2, FUEL*3, TGP, HTS", "AIM-120C*2, AIM-9X*2, AGM-88C*2, FUEL*2, ECM, TGP, HTS", "AIM-120C*2, AIM-9X*2, AGM-88C*4, ECM, TGP, HTS", "AIM-120C*4, AGM-88C*2, FUEL*3, TGP, HTS", "AIM-120C*4, AGM-88C*2, FUEL*2, ECM, TGP, HTS", "AIM-120C*4, AGM-88C*4, ECM, TGP, HTS", "AIM-120C*2, AIM-9X*2, MK-61*2, FUEL*2, ECM, TGP"], "F-5E-3": ["Mk-82LD*4,AIM-9P*2,Fuel 275", "AIM-9P*2, Fuel 275*3", "AIM-9P5*2, Fuel 275*3", "AIM-9P*2, Fuel 150*3", "AIM-9P5*2, Fuel 150*3", "Mk-82SE*4,AIM-9P*2,Fuel 275", "CBU-52B*4,AIM-9P*2,Fuel 275", "LAU-3 HE*4,AIM-9P*2,Fuel 275", "LAU-3 HEAT*4,AIM-9P*2,Fuel 275", "LAU-68 HE*4,AIM-9P*2,Fuel 275", "LAU-68 HEAT*4,AIM-9P*2,Fuel 275", "M-117*4,AIM-9P*2,Fuel 275", "GBU-12*4,AIM-9P*2,Fuel 275", "CBU-52B*5,AIM-9*2", "Mk-82LD*5,AIM-9*2", "Mk-82SE*5,AIM-9*2", "Mk-82LD*7,AIM-9P*2, Fuel 275*2", "Mk-82SE*7,AIM-9P*2, Fuel 275*2", "LAU-3 HE*2,Mk-82LD,AIM-9P*2,Fuel 275*2", "LAU-68 HE*2,Mk-82LD,AIM-9P*2,Fuel 275*2", "M-117*5,AIM-9*2", "AIM-9P*2, Fuel 275", "AIM-9P*2, Fuel 150", "AIM-9P5*2, Fuel 275", "AIM-9P5*2, Fuel 150", "AIM-9B*2, Fuel 275", "AIM-9B*2, Fuel 150", "AIM-9B*2, Fuel 275*3", "AIM-9B*2, Fuel 150*3", "AN/ASQ-T50, AIM-9P, Fuel 150", "AIM-9B*2", "AIM-9P*2", "AIM-9P5*2", "Antiship Mk82"], "F-5E": ["Mk-82LD*4,AIM-9P*2,Fuel 275", "AIM-9P*2, Fuel 275*3", "AIM-9P5*2, Fuel 275*3", "AIM-9P*2, Fuel 150*3", "AIM-9P5*2, Fuel 150*3", "Mk-82SE*4,AIM-9P*2,Fuel 275", "CBU-52B*4,AIM-9P*2,Fuel 275", "LAU-3 HE*4,AIM-9P*2,Fuel 275", "LAU-3 HEAT*4,AIM-9P*2,Fuel 275", "LAU-68 HE*4,AIM-9P*2,Fuel 275", "LAU-68 HEAT*4,AIM-9P*2,Fuel 275", "M-117*4,AIM-9P*2,Fuel 275", "GBU-12*4,AIM-9P*2,Fuel 275", "CBU-52B*5,AIM-9*2", "Mk-82LD*5,AIM-9*2", "Mk-82SE*5,AIM-9*2", "Mk-82LD*7,AIM-9P*2, Fuel 275*2", "Mk-82SE*7,AIM-9P*2, Fuel 275*2", "LAU-3 HE*2,Mk-82LD,AIM-9P*2,Fuel 275*2", "LAU-68 HE*2,Mk-82LD,AIM-9P*2,Fuel 275*2", "M-117*5,AIM-9*2", "AIM-9P*2, Fuel 275", "AIM-9P*2, Fuel 150", "AIM-9P5*2, Fuel 275", "AIM-9P5*2, Fuel 150", "AIM-9B*2, Fuel 275", "AIM-9B*2, Fuel 150", "AIM-9B*2, Fuel 275*3", "AIM-9B*2, Fuel 150*3", "AN/ASQ-T50, AIM-9P, Fuel 150", "AIM-9B*2", "AIM-9P*2", "AIM-9P5*2"], "F-86F Sabre": ["120gal Fuel*2", "200gal Fuel*2", "120gal Fuel*2, 200gal Fuel*2", "GAR-8*2", "120gal Fuel*2, GAR-8*2", "HVAR*16", "200gal Fuel*2, HVARx2*4", "AN-M64*2", "200gal Fuel*2, AN-M64*2", "M117*2"], "F-14A-135-GR": ["XT*2", "AIM-54A-MK47*6, AIM-9L*2, XT*2", "AIM-7F*6, AIM-9L*2, XT*2", "AIM-54A-MK47*4, AIM-7F*2, AIM-9L*2, XT*2", "AIM-54A-MK47*2, AIM-7F*1, AIM-9L*4, XT*2", "AIM-54A-MK47*4, AIM-9L*4, XT*2", "AIM-54A-MK47*4, AIM-9M*4, XT*2", "AIM-54A-MK60*4, AIM-9M*4, XT*2", "AIM-7F*4, AIM-9L*4, XT*2", "AIM-7F*4, AIM-9L*4, XT*2", "BDU-33*14", "BDU-33*12", "GBU-10*2", "GBU-12*4", "GBU-16*4", "GBU-24*2", "Mk-84*4", "Mk-83*4", "Mk-82*4", "Mk-82*14", "Mk-81*14", "Mk-20*4", "Mk-82AIR*4", "Zuni*12", "Zuni*28", "LUU-2*24", "AIM-54A-MK60*1, AIM-7F*1, AIM-9L*2, XT*2, Mk-82*2", "AIM-54A-MK60*1, AIM-7F*1, AIM-9L*2, XT*2, Mk-82*1", "AIM-54A-MK60*1, AIM-7F*1, AIM-9L*2, XT*2, Mk-20*2", "AIM-7M*1, AIM-9M*2, XT*2, GBU-12*2, LANTIRN", "AIM-7M*1, AIM-9M*2, XT*2, GBU-24*1, LANTIRN", "AIM-54A-MK60*1, AIM-7M*1, AIM-9M*2, XT*2, Mk-82*2, LANTIRN", "AIM-54A-MK60*1, AIM-7M*1, AIM-9M*2, XT*2, Mk-20*2, LANTIRN"], "F-14A-95-GR": ["AIM-54A-MK47*6, AIM-9L*2", "AIM-54A-MK47*6, AIM-9L*2", "AIM-54A-MK60*6, AIM-9L*2", "AIM-7F*6, AIM-9L*2", "AIM-7F*6, AIM-9L*2", "AIM-54A-MK47*4, AIM-7F*2, AIM-9L*2", "AIM-54A-MK47*4, AIM-7F*2, AIM-9L*2", "AIM-54A-MK60*4, AIM-7F*2, AIM-9L*2", "AIM-54A-MK47*2, AIM-7F*1, AIM-9L*4", "AIM-54A-MK47*2, AIM-7F*1, AIM-9L*4", "AIM-54A-MK60*2, AIM-7F*1, AIM-9L*4", "AIM-54A-MK47*4, AIM-9L*4", "AIM-54A-MK47*4, AIM-9L*4", "AIM-54A-MK60*4, AIM-9L*4", "AIM-7F*4, AIM-9L*4", "AIM-7F*4, AIM-9L*4", "AIM-54A-MK47*2, AIM-7F*3, AIM-9L*2", "AIM-54A-MK47*2, AIM-7F*3, AIM-9L*2", "AIM-54A-MK60*2, AIM-7F*3, AIM-9L*2", "BDU-33*14", "BDU-33*12", "GBU-10*2", "GBU-12*4", "GBU-16*4", "GBU-24*2", "Mk-84*4", "Mk-83*4", "Mk-82*4", "Mk-82*14", "Mk-81*14", "Mk-20*4", "Mk-82AIR*4", "Zuni*12", "Zuni*28", "LUU-2*24", "AIM-54A-MK60*1, AIM-7F*1, AIM-9L*2, Mk-82*2", "AIM-54A-MK60*1, AIM-7F*1, AIM-9L*2, Mk-82*1", "AIM-54A-MK60*1, AIM-7F*1, AIM-9L*2, Mk-20*2"], "F-14B": ["XT*2", "AIM-54A-MK47*6, AIM-9M*2, XT*2", "AIM-54A-MK47*6, AIM-9L*2, XT*2", "AIM-54A-MK60*6, AIM-9M*2, XT*2", "AIM-54C-MK47*6, AIM-9M*2, XT*2", "AIM-7M*6, AIM-9M*2, XT*2", "AIM-7M*6, AIM-9L*2, XT*2", "AIM-54A-MK47*4, AIM-7M*2, AIM-9M*2, XT*2", "AIM-54A-MK47*4, AIM-7M*2, AIM-9L*2, XT*2", "AIM-54A-MK60*4, AIM-7M*2, AIM-9M*2, XT*2", "AIM-54C-MK47*4, AIM-7M*2, AIM-9M*2, XT*2", "AIM-54A-MK47*2, AIM-7M*1, AIM-9M*2, AIM-9L*2, XT*2", "AIM-54A-MK47*2, AIM-7M*1, AIM-9M*4, XT*2", "AIM-54A-MK60*2, AIM-7M*1, AIM-9M*4, XT*2", "AIM-54C-MK47*2, AIM-7M*1, AIM-9M*4, XT*2", "AIM-54A-MK47*4, AIM-9M*2, AIM-9L*2, XT*2", "AIM-54A-MK47*4, AIM-9M*4, XT*2", "AIM-54A-MK60*4, AIM-9M*4, XT*2", "AIM-54C-MK47*4, AIM-9M*4, XT*2", "AIM-7M*4, AIM-9M*2, AIM-9L*2, XT*2", "AIM-7M*4, AIM-9L*4, XT*2", "AIM-54A-MK47*2, AIM-7M*3, AIM-9M*2, XT*2", "AIM-54A-MK47*2, AIM-7M*3, AIM-9M*2, XT*2", "AIM-54A-MK60*2, AIM-7M*3, AIM-9M*2, XT*2", "AIM-54C-MK47*2, AIM-7M*3, AIM-9M*2, XT*2", "BDU-33*14", "BDU-33*12", "GBU-10*2", "GBU-12*4", "GBU-16*4", "GBU-24*2", "Mk-84*4", "Mk-83*4", "Mk-82*4", "Mk-82*14", "Mk-81*14", "Mk-20*4", "Mk-82AIR*4", "Zuni*12", "Zuni*28", "LUU-2*24", "AIM-54A-MK60*1, AIM-7M*1, AIM-9M*2, XT*2, Mk-82*2", "AIM-54A-MK60*1, AIM-7M*1, AIM-9M*2, XT*2, Mk-82*1", "AIM-54A-MK60*1, AIM-7M*1, AIM-9M*2, XT*2, Mk-20*2", "AIM-7M*1, AIM-9M*2, XT*2, GBU-12*2, LANTIRN", "AIM-7M*1, AIM-9M*2, XT*2, GBU-24*1, LANTIRN", "AIM-54A-MK60*1, AIM-7M*1, AIM-9M*2, XT*2, Mk-82*2, LANTIRN", "AIM-54A-MK60*1, AIM-7M*1, AIM-9M*2, XT*2, Mk-20*2, LANTIRN"], "F/A-18A": ["GBU-16*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AIM-9*6,Fuel", "Mk-84*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AGM-65D*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AGM88*4_AIM9*2_AIM7_FLIR Pod_Fuel", "AIM-9*4,Fuel*3", "LAU-10*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AGM-88*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "MK-82*8,AIM-9*2,AIM-7,FLIR Pod,Fuel", "MK-82*4,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AIM-9*4,AIM-7*2,Fuel*3", "AGM-65K*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "Fuel*3", "AGM88*2_AGM65D*2_AIM9*2_AIM7_FLIR Pod_Fuel", "GBU-12*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AIM-9*4,AIM-7*4,Fuel", "Mk20*4,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "GBU-10*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AGM-84A*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3"], "F/A-18C": ["AGM-62*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "GBU-10*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "GBU-12*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "Fuel*3", "Mk-84*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "GBU-16*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AGM-154*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AIM-120*4,AIM-9*2,Fuel*3", "AGM-65D*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AGM88*2_AGM65D*2_AIM9*2_AIM7_FLIR Pod_Fuel", "AGM88*4_AIM9*2_AIM7_FLIR Pod_Fuel", "AIM-9*2,AIM-7*6,Fuel", "Mk20*4,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AIM-120*6,AIM-9*2,Fuel", "LAU-10*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AIM-9*2,AIM-7*4,Fuel*3", "MK-82*8,AIM-9*2,AIM-7,FLIR Pod,Fuel", "AIM-120*2,AIM-9*2,AIM-7*2,Fuel*3", "AGM-88*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AGM-84E*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "MK-82*4,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AGM-84A*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AIM-9M*2,AGM-65D*2,Mk-82*4,FLIR Pod,Fuel", "AIM-120*4,AIM-9*2,AIM-7*2,Fuel", "AGM-65K*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3"], "FA-18C_hornet": ["AIM-9M*6, AIM-7M*2, FUEL*3", "AIM-9M*6, AIM-7M*2, FUEL*2", "AIM-9M*2, MK-84*2, FUEL*2", "AIM-9M*2, MK-83*4, FUEL*2", "Carrier Landing", "AIM-9M*2, AIM-7M*4, FUEL*3", "AIM-9M*2, CBU-99*4, FUEL*2", "AIM-9M*2, MK-82SE*4, FUEL*2", "AIM-9M*2, MK-20*4, FUEL*2", "AIM-9M*2, MK-82*4, FUEL*2", "AIM-9M*2, AIM-7M*2, FUEL*2", "AIM-9M*2, MK-83*2, FUEL*2", "AIM-9M*2, ZUNI*4, FUEL*2", "AIM-9M*2, LAU-61*4, FUEL*2", "AIM-9M*2, LAU-68*4, FUEL*2", "AIM-9M*2, AIM-7M*2, FUEL*1", "AIM-9X*2, AIM-120C-5*1, GBU-31*4, ATFLIR, FUEL", "AIM-9X*2, AIM-120C-5*6, FUEL*3", "AIM-9X*2, AIM-120C-5*1, AGM-65D*4, ATFLIR, FUEL", "AIM-9X*2, AIM-120C-5*2, AGM-88C*2, FUEL", "AIM-9X*2, AIM-120C-5*1, GBU-38*4, GBU-12*4, ATFLIR, FUEL", "AIM-9X*2, AIM-120C-5*1, AGM-84E*2, DATALINK, ATFLIR, FUEL*2", "AIM-9M*2, AIM-120C-5*1, AGM-84D*4, ATFLIR, FUEL", "AIM-9M*2, ATFLIR, FUEL", "AIM-9M*2, ATFLIR, FUEL*2"], "I-16": ["6xRS-82", "2xFAB-100", "6xRS-82, 2xFAB-100", "6xRS-82, 2xDropTank-93L", "2xDropTank-93L"], "Ka-50": ["4xFAB-500", "2xFuel tank, 2xKMGU AP", "80xS-8 TsM", "2xFuel tank, 40xS-8", "80xS-8", "4xKMGU AT", "2xKMGU AP", "2xFuel tank, 12x9A4172", "2xFuel tank, 2xUPK-23", "12x9A4172, 40xS-8", "12x9A4172, 2xKMGU AT", "4xKMGU AP", "2xFAB-250, 2xFuel tank", "12x9A4172, 2xFAB-500", "20xS-13", "40xS-8", "12x9A4172, 2xUPK-23", "2xKMGU AT", "6x9A4172", "2xFuel tank, 2xKMGU AT", "4xFuel tank", "2xKMGU AP, 12x9A4172", "12x9A4172", "2xFuel tank", "40xS-8 TsM, 12x9A4172", "2xFAB-500", "40xS-8 TsM, 2xFuel tank", "4xUPK-23", "10xS-13", "40xS-8 TsM", "12x9A4172, 10xS-13", "2xFuel tank, 2xFAB-500", "2xFAB-250", "4xFAB-250", "2xFuel tank, 10xS-13", "2xFAB-250, 12x9A4172", "2xUPK-23"], "Ka-50_3": ["4xIgla", "2xKh-25ML, 10xS-13, 4xIgla", "12x9A4172, 40xS-8KOM, 4xIgla", "12x9A4172, 40xS-8OFP, 4xIgla", "12x9A4172, 40xS-13, 4xIgla", "80xS-8KOM, 4xIgla", "80xS-8OFP, 4xIgla", "20xS-20, 4xIgla", "4xUPK-23, 4xIgla", "10xS-13, 2xFAB-500, 4xIgla", "10xS-13, 2xFAB-250, 4xIgla", "80xS-8OM, 4xIgla", "80xS-8TsM, 4xIgla", "40xS-8OFP, 2xFuel, 4xIgla", "12x9A4172, 2xFuel, 4xIgla"], "L-39C": ["SAB-100x2", "R-3Sx2", "Smokes", "Central Smoke", "FAB-100x2", "S-5KOx32"], "L-39ZA": ["S-5KOx32", "S-5KOx64", "S-5KOx32, PTB-150x2", "S-5KOx32, PTB-350x2", "S-5KOx32, FAB-100x2", "OFAB-100 Jupiter x4, FAB-100x2", "FAB-100x2", "FAB-100x4", "OFAB-100 Jupiter x8", "FAB-100x2, PTB-150x2", "FAB-100x2, PTB-350x2", "PK-3x4", "PK-3x2, PTB-150x2", "R-60Mx2", "SAB-100x4", "R-3Sx2", "R-3Sx2, PK-3x2", "R-60Mx2, PK-3x2"], "M-2000C": ["Fox", "Fox / Magic (QRA)", "Alpha / S530D", "Fox / S530D / Magic", "Fox / S530D / Magic / Eclair", "Bravo", "Bravo / Magic", "Kilo", "Kilo / Magic", "Bravo / 4xMk-82 / Magic", "Bravo / GBU-12 / Magic", "Bravo / 2xGBU-12 / Magic", "Bravo / GBU-16 / Magic", "Bravo / GBU-24 / Magic", "Bravo / BAP-100 / Magic", "Bravo / 4xSnakeEye / Magic", "Fox / 4xMk-82 / Magic", "Kilo / 4xMk-82 / Magic"], "MB-339A": ["A - 2*320L TipTanks + 2*DEFA-553 GunPods + 2*Mk.83 + 2*Mk.81 ", "A - 2*320L TipTanks [Clean]", "Recon", "Training", "AA - 2*320L TipTanks + 2*DEFA-553 GunPods + 2*LAU-10(Zuni Rockets) [ARMADA]", "AM - 2*320L TipTanks + 2*AN/M3 GunPods + 2*330L Tanks + 2*LAU-3 (Hydra rockets)", "A - 2*500L TipTanks + 2*330L Tanks + Luggage Container [Ferry Long Range]", "A - 2*500L TipTanks + 4*Mk.82HD + 2*LR-25 (API Rockets)", "A - 2*320L TipTanks + 2*330L Tanks [Ferry Medium Range]", "A - 2*500L TipTanks + 2*AN/M3 GunPods + 2*Matra 155 + 2* Belouga", "Runway Interdiction", "A - 2*500L TipTanks + 2*DEFA-553 GunPods + 2*Mk.82LD + 2*LR-25 (API Rockets)", "A - 2*320L TipTanks + 2*DEFA-553 GunPods + 2*Mk.82LD Bombs + 2*LR-25(API Rockets)", "A - 2*320L TipTanks + 2*DEFA-553 GunPods + 2*Mk.82LD + 2*LR-25 (HEI Rockets)", "A - 2*320L TipTanks + 6*Mk.82LD", "Runway Interdiction (36*BAP-100)", "Anti - Light Armoured Vehicle (36*BAT-120 ABL)", "AP - 2*320L TipTanks + 2*DEFA-553 GunPods + 2*330L Tanks + 2*Matra 155 (SNEB rockets)"], "MB-339APAN": ["PAN - Smoke White", "PAN - Smoke White and Color Red", "PAN - Fuel External [RED SMOKE]", "PAN - Full Payload [RED SMOKE] + 2*320L TipTanks", "PAN - Full Payload [GREEN SMOKE] + 2*320L TipTanks", "PAN - Fuel External [GREEN SMOKE]", "PAN - Full Payload [RED SMOKE] + 2*500L TipTanks", "PAN - Smoke White and Color Green", "PAN - Full Payload [GREEN SMOKE] + 2*500L TipTanks"], "Mi-24P": ["2xB8V20 (S-8KOM)+8xATGM 9M114", "2xB8V20 ( S-8KOM)+4xATGM 9M114", "4xB8V20 (S-8KOM)+4xATGM 9M114", "2xB8V20 (S-8KOM)+2xBombs-250+4xATGM 9M114", "2xB8V20 (S-8OFP2)+4xATGM 9M114", "4xUB-32A (S-5KO)+4xATGM 9M114", "4xGUV-1 AP30+4xATGM 9M114", "2xGUV-1 AP30+4xATGM 9M114", "2xGUV-1 (GUN 12.7+2x7.62) +4xATGM 9M114", "2xKMGU (96 AO 2.5RT)+8xATGM 9M114", "2xB-13L+4xATGM 9M114", "2xS-24B+4xATGM 9M114", "4xS-24B+4xATGM 9M114", "2xBombs-500+4xATGM 9M114", "4xBombs-250+4ATGM 9M114", "2xRBK-500 (PTAB-1M)+4xATGM 9M114", "2xRBK-500U (OAB 2.5RT)+4xATGM 9M114", "4xRBK-250 (42 PTAB 2.5M) +4ATGM 9M114", "4xRBK-250-275 (150 AO-1SCh)+4ATGM 9M114", "4xPTB-450 Fuel tank"], "MiG-19P": ["PTB-760 x 2", "K-13A x 2, PTB-760 x 2", "K-13A x 2", "K-13A x 2, ORO-57K x 2, PTB-760 x 2", "ORO-57K x 2, PTB-760 x 2", "ORO-57K x 4", "ORO-57K x 2", "FAB-100M x 2, ORO-57K x 2", "FAB-250 x 2, ORO-57K x 2", "FAB-100M x 2", "FAB-250 x 2"], "MiG-21Bis": ["Patrol, long range", "Patrol, medium range", "Patrol, short range", "Hard targets, BOMBS", "Unknown or mixed targets, BOMBS + ROCKETS", "Soft targets, CLUSTERS + ROCKETS", "Soft targets, CLUSTERS", "Soft targets, scattered", "Few big targets, GROM + BOMBS", "Very hard target, PENETRATION", "Aerial attack, hard targets, CLUSTERS", "Hard targets, ROCKETS, PENETRATION", "Soft targets, ROCKETS, BLAST-FRAGMENTS", "Long range, MIX", "Long range, RADAR GUIDED MISSILES", "Long range, INFRA RED MISSILES", "Escort", "Escort, JAMMER", "Night, ILLUMINATOR", "Long range, JAMMER", "Soft targets, UPK + ROCKETS", "Soft targets, UPK + CLUSTERS", "Patrol, JAMMER", "NUCLEAR A", "NUCLEAR B", "Short range", "AEROBATIC"], "Mirage-F1B": ["2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, 1*R530IR", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1BD": ["2*R550 Magic I, 2*S530F, 1*Fuel Tank", "2*R550 Magic I", "2*R550 Magic I, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*S530F, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1BE": ["2*AIM9-JULI, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*AIM9-JULI, 1*R530IR", "2*R550 Magic I, 1*R530EM", "2*AIM9-JULI, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*AIM9-J, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 LD", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*AIM-9JULI, 8*SAMP 250 HD", "2*AIM-9JULI, 8*SAMP 400 LD", "2*AIM-9JULI, 8*BLU107 Durandal", "2*AIM9-JULI, 2*S530F, 1*Fuel Tank", "2*R550 Magic I, 2*S530F, 1*Fuel Tank"], "Mirage-F1BQ": ["2*R550 Magic I, 2*S530F, 1*Fuel Tank", "2*R550 Magic I", "2*R550 Magic I, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*S530F, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1C-200": ["2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, 1*R530IR", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1C": ["2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, 1*R530IR", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1CE": ["2*AIM9-JULI, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*AIM9-JULI, 1*R530IR", "2*R550 Magic I, 1*R530EM", "2*AIM9-JULI, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*AIM9-J, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 LD", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*AIM-9JULI, 8*SAMP 250 HD", "2*AIM-9JULI, 8*SAMP 400 LD", "2*AIM-9JULI, 8*BLU107 Durandal", "2*AIM9-JULI, 2*S530F, 1*Fuel Tank", "2*R550 Magic I, 2*S530F, 1*Fuel Tank"], "Mirage-F1CG": ["2*AIM-9 JULI, 2*R530IR, 1*Fuel Tank", "4*AIM-9 JULI, 2*R530IR, 1*Fuel Tank", "2*AIM-9 JULI, 2*R530EM, 1*Fuel Tank", "2*AIM-9 JULI, 1*R530IR", "2*AIM-9 JULI, 1*R530IR, 2*Fuel Tank", "2*AIM-9 JULI, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*AIM-9 JULI, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*AIM-9 JULI, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*AIM-9 JULI, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*AIM-9 JULI, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*AIM-9 JULI, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1CH": ["2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, 1*R530IR", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1CJ": ["2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, 1*R530IR", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1CK": ["2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, 1*R530IR", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1CR": ["2*R550 Magic I", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1CT": ["2*R550 Magic I, 2*S530F, 1*Fuel Tank", "2*R550 Magic I", "2*R550 Magic I, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*S530F, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1CZ": ["2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, 1*R530IR", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1DDA": ["2*R550 Magic I, 2*S530F, 1*Fuel Tank", "2*R550 Magic I", "2*R550 Magic I, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*S530F, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1ED": ["2*R550 Magic II, 2*S530F, 1*Fuel Tank", "2*R550 Magic II", "2*R550 Magic II, 2*Fuel Tank", "2*R550 Magic II, 2*MATRA F4 SNEB251 (HE), 2*S530F, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic II, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic II, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic II, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic II, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic II, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1EDA": ["2*R550 Magic I, 2*S530F, 1*Fuel Tank", "2*R550 Magic I", "2*R550 Magic I, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*S530F, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1EE": ["2*AIM9-JULI, 2*R530IR, 1*Fuel Tank", "2*AIM9-JULI, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*AIM9-JULI, 1*R530EM", "2*R550 Magic I, 1*R530IR", "2*AIM9-JULI, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*AIM9-J, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 LD", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*AIM-9JULI, 8*SAMP 250 HD", "2*AIM-9JULI, 8*SAMP 400 LD", "2*AIM-9JULI, 8*BLU107 Durandal", "2*AIM9-JULI, 2*S530F, 1*Fuel Tank", "2*R550 Magic I, 2*S530F, 1*Fuel Tank", "2*R550 Magic I, 2*S530F, 1*Fuel Tank, 1*BARAX ECM Pod"], "Mirage-F1EH": ["2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, 1*R530IR", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1EQ": ["2*R550 Magic I, 2*S530F, 1*Fuel Tank", "2*R550 Magic I", "2*R550 Magic I, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*S530F, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1JA": ["2*R550 Magic I, 2*Python III, 1*Fuel Tank", "2*R550 Magic I, 2*Python III, 2*MATRA F4 SNEB251 (HE)", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*Python III, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1M-CE": ["2*AIM9-JULI, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*AIM9-JULI, 1*R530IR", "2*R550 Magic I, 1*R530IR", "2*AIM9-JULI, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*AIM9-J, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 LD", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*AIM-9JULI, 8*SAMP 250 HD", "2*AIM-9JULI, 8*SAMP 400 LD", "2*AIM-9JULI, 8*BLU107 Durandal", "2*AIM9-JULI, 2*S530F, 1*Fuel Tank", "2*R550 Magic I, 2*S530F, 1*Fuel Tank"], "Mirage-F1M-EE": ["2*AIM9-JULI, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*AIM9-JULI, 1*R530IR", "2*R550 Magic I, 1*R530IR", "2*AIM9-JULI, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*AIM9-J, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 LD", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*AIM-9JULI, 8*SAMP 250 HD", "2*AIM-9JULI, 8*SAMP 400 LD", "2*AIM-9JULI, 8*BLU107 Durandal", "2*AIM9-JULI, 2*S530F, 1*Fuel Tank", "2*R550 Magic I, 2*S530F, 1*Fuel Tank"], "SA342L": ["M621, 8x SNEB68 EAP, IR Deflector, Sand Filter", "2x HMP400, IR Deflector, Sand Filter", "4x HOT3, IR Deflector, Sand Filter", "4x Mistral, IR Deflector, Sand Filter", "2x Mistral, IR Deflector, Sand Filter", "Display Team Smoke, Red & Blue"], "SA342M": ["4x HOT3, IR Deflector, Sand Filter", "2x HOT3, IR Deflector, Sand Filter", "Display Team Smoke, Red & Blue"], "SA342Minigun": ["IR Deflector, Sand Filter", "Display Team Smoke, Red & Blue"], "SA342Mistral": ["Mistral x 4", "Mistral x 4, IR Deflector", "Mistral x 4, IR Deflector, Sand Filter"], "A-20G": ["500 lb GP bomb LD*4"], "Bf-109K-4": ["Fuel Tank", "SC250", "SC500"], "FW-190A8": ["Without pylon", "SC 50 * 4", "AB 250 (w/ SD 10A)", "AB 250 (w/ SD 2)", "AB 500 (w/ SD 10A)", "SC 250 L2", "SC 250 J", "SC 500 J", "SC 500 L2", "SD 250 Stg", "SD 500 A", "Fuel Tank 300 liters", "BR 21"], "FW-190D9": ["SC500", "Fuel Tank", "R4M", "BR 21"], "MosquitoFBMkVI": ["250 lb S.A.P*2; 500 lb S.A.P.*2", "500 lb GP Mk.V*2, 500 lb GP Short tail*2", "100 gal Drop tank*2, 500 lb MC Short tail*2", "RP-3 60lb SAP No2 Mk.I*8, 250 lb A.A.P.*2", "100 gal. Drop tank*2, 250 lb MC Mk.II, RP-3 60lb F No1 Mk.I*4", "500 lb GP Short tail*4"], "P-47D-30": ["AN-M65*2", "Fuel150*2", "AN-M64*2, Fuel110", "AN-M57*3"], "P-47D-30bl1": ["AN-M57*2", "AN-M64*2, Fuel110"], "P-47D-40": ["AN-M65*2", "Fuel150*2", "AN-M57*3", "AN-M64*2, Fuel110", "M8*6, AN-M57*2, Fuel110", "HVAR*10, Fuel110"], "P-51D-30-NA": ["Fuel75*2", "HVAR*6,Fuel75*2", "HVAR*6,M64*2", "HVAR*6", "M64*2", "HVAR*10", "Smokes"], "P-51D": ["Fuel75*2", "HVAR*6,Fuel75*2", "HVAR*6,M64*2", "HVAR*6", "M64*2", "HVAR*10", "Smokes"], "A-50": [], "AH-1W": ["14xHYDRA-70 WP", "38xHYDRA-70 WP", "8xBGM-71, 14xHYDRA-70", "8xBGM-71, 14xHYDRA-70 WP", "8xBGM-71, 38xHYDRA-70 WP", "14xHYDRA-70", "38xHYDRA-70", "8xAGM-114", "28xHYDRA-70", "8xBGM-71, 38xHYDRA-70", "8xAGM-114, 38xHYDRA-70 WP", "8xBGM-71", "8xAGM-114, 14xHYDRA-70 WP", "76xHYDRA-70", "8xAGM-114, 38xHYDRA-70", "8xAGM-114, 14xHYDRA-70"], "AH-64A": ["8xAGM-114", "38xHYDRA-70 WP", "76xHYDRA-70", "8xAGM-114, 38xHYDRA-70 WP", "38xHYDRA-70", "8xAGM-114, 38xHYDRA-70", "AGM-114K*16"], "AH-64D": ["76xHYDRA-70", "38xHYDRA-70", "38xHYDRA-70 WP", "8xAGM-114", "8xAGM-114, 38xHYDRA-70 WP", "8xAGM-114, 38xHYDRA-70", "AGM-114K*16"], "An-26B": [], "An-30M": [], "B-1B": ["Mk-82*84", "AGM-154*12", "GBU-38*48", "CBU-87*30", "CBU-97*30", "GBU-38*16, CBU-97*20", "Mk-84*24", "GBU-31*24", "GBU-31(V)3/B*24", "GBU-31*8, GBU-38*32"], "B-52H": ["Mk-84*18", "Mk 82*51", "Mk20*18", "AGM-86C*20", "AGM-84A*8"], "C-130": [], "C-17A": [], "CH-47D": [], "CH-53E": [], "E-2C": [], "E-3A": [], "F-117A": ["GBU-12*2", "GBU-10*2", "GBU-27*2"], "F-14A": ["AIM-9*2", "AIM-54C*6,AIM-9*2", "AIM-54C*4,AIM-9*2,AIM-7*2"], "F-15C": ["AIM-120B*4, AIM-7M*2, AIM-9M*2, Fuel*3", "AIM-9*2,AIM-120*6,Fuel", "AIM-9*4,AIM-120*4,Fuel*3", "AIM-9*4,AIM-120*4,Fuel", "AIM-9*2,AIM-120*2,AIM-7*4,Fuel*3", "AIM-9*2,AIM-120*6,Fuel*3", "AIM-9*4,AIM-7*4,Fuel", "AIM-120*8,Fuel", "AIM-9*4,AIM-7*4,Fuel*3", "AIM-120*8,Fuel*3", "AIM-9*2,AIM-120*2,AIM-7*4,Fuel"], "F-15E": ["AIM-120B*2,AIM-9M*2,FUEL*3,CBU-87*6,Mk-82AIR*6", "AIM-120B*2,AIM-9M*2,FUEL*3,CBU-97*12", "AIM-120B*2,AIM-9M*2,FUEL*3,Mk-82*12", "AIM-120B*4,AIM-120C*4,FUEL*3", "AIM-120B*2,AIM-9M*2,FUEL,GBU-31*4,AGM-65H,AGM-65D", "AIM-120B*2,AIM-9M*2,FUEL,CBU-103*2,GBU-12,GBU-38,AGM-154C*2", "AIM-120B*4,AIM-9M*4,FUEL*3", "AIM-120B*2,AIM-9M*2,AIM-120C*2,AIM-7M*2,FUEL*3", "AIM-120B*2,AIM-9M*2,FUEL,GBU-12*4,GBU-38*4,AGM-154C*2", "AIM-120B*2,AIM-9M*2,FUEL,GBU-31*4,AGM-154C*2", "AIM-120B*2,AIM-9M*2,AIM-7M*4,FUEL*3", "AIM-120B*2,AIM-9M*2,FUEL*3,Mk-84*8", "AIM-120B*2,AIM-9M*2,FUEL,AGM-154C*2", "AIM-120B*2,AIM-9M*2,FUEL,GBU-12*4,GBU-38*4,AGM-65D*2", "AIM-120B*2,AIM-9M*2,FUEL,GBU-12*4,GBU-38*4,AGM-65K*2", "AIM-120C*2,AIM-9M*4,AIM-7M*2,FUEL*3", "AIM-9M*4,AIM-7M*4,FUEL*3", "AIM-120C*2,AIM-9M*2,FUEL*3", "AIM-120B*2,AIM-9M*2,FUEL,Mk-84*8,AGM-154C*2", "AIM-120B*2,AIM-9M*2,FUEL*3,Mk-82AIR*12", "AIM-120B*2,AIM-9M*2,FUEL,GBU-12*2,GBU-38*2,AGM-154C*2", "AIM-120B*2,AIM-9M*2,FUEL,GBU-12*2,GBU-38*2,AGM-65H,AGM-65D", "AIM-120B*2,AIM-120C*4,AIM-9M*2,FUEL*3", "AIM-120B*2,AIM-9M*2,FUEL*3,Mk-82*6,Mk-82AIR*6", "AIM-120B*2,AIM-9M*2,FUEL,CBU-103*2,GBU-12,GBU-38,AGM-65H*2", "AIM-120B*2,AIM-9M*2,FUEL,AGM-65D*2", "AIM-120B*2,AIM-9M*2,FUEL*2,SUU-25*2,GBU-12,GBU-38", "AIM-120B*6,AIM-9M*2,FUEL*3", "AIM-120B*2,AIM-9M*2,FUEL,Mk-82AIR*12,AGM-154C*2", "AIM-120C*6,AIM-9M*2,FUEL*3", "GBU-31(V)3/B*5, AIM-120C*2, AIM-9M*2"], "F-16A MLU": ["Fuel*3", "AGM-88*2, AGM-65D*2, AIM-120B*2, ECM", "Mk-82*6,AIM-120*2,ECM,Fuel*2", "Mk-82*2,AIM-120*2,AIM-9*2,ECM,Fuel*2", "AGM88*2,AGM-65D*6,AIM-120*2,AIM-9*2,ECM", "AIM-120*2,GBU-10*2,ECM,Lantirn ,Fuel*2", "AIM-9*4,ECM", "Mk20*4,AIM-9*2,ECM,Fuel*2", "AIM-120*6,ECM", "AIM-120*4,AIM-9*2,ECM", "AGM88, AGM-65D, AIM-120*2,Fuel*2,ECM", "AGM-65D*2,AIM-120*2,ECM,Lantirn ,Fuel*2", "AIM-9*4,ECM,Fuel*2", "AIM-120*4,AIM-9*2,ECM,Fuel*2", "AGM-88*2,AIM-120*2,AIM-9*2,ECM,Fuel*2", "Mk-84*2,AIM-9*2,ECM,Fuel*2", "AIM-120*6,ECM,Fuel*2", "AGM-154*2,AIM-120*2,ECM,Lantirn ,Fuel*2", "AGM-88*2,AGM-65D*2,AIM-120B*2,AIM-9M*2,ECM", "Mk20*2,AIM-120*2,ECM,Fuel*2", "AIM-120*2,AIM-9*2,GBU-12*2,ECM,Lantirn ,Fuel*2", "AGM-65K*2,AIM-120*2,ECM,Lantirn ,Fuel*2", "AIM-120B*2_AIM-9M*2_AGM-119*4_ALQ-131"], "F-16A": ["AGM-88*2,AIM-120*2,AIM-9*2,ECM,Fuel*2", "Mk20*4,AIM-9*2,ECM,Fuel*2", "AIM-9*4,ECM,Fuel*2", "AGM-65D*2,AIM-120*2,ECM,Lantirn ,Fuel*2", "AIM-120*4,AIM-9*2,ECM,Fuel*2", "AGM88*2_AGM-65D*6_AIM-120*2_AIM-9*2_ECM", "AGM-65K*2,AIM-120*2,ECM,Lantirn ,Fuel*2", "AIM-120*2,AIM-9*2,GBU-12*2,ECM,Lantirn ,Fuel*2", "AIM-120*2,GBU-10*2,ECM,Lantirn ,Fuel*2", "AIM-120*6,ECM,Fuel*2", "AIM-120*6,ECM", "AIM-9*4,ECM", "Fuel*3", "Mk-84*2,AIM-9*2,ECM,Fuel*2", "AIM-120*4,AIM-9*2,ECM", "Mk-82*6,AIM-120*2,ECM,Fuel*2", "Mk-82*2,AIM-120*2,AIM-9*2,ECM,Fuel*2", "AGM-154*2,AIM-120*2,ECM,Lantirn ,Fuel*2", "Mk20*2,AIM-120*2,ECM,Fuel*2", "AGM-119*2,AIM-120B*2,AIM-9M*2,ALQ-184,Fuel*2"], "F-16C bl.50": ["AIM-120B*4, AIM-9M*2, Fuel", "AIM-120C*4, AIM-9M*2, Fuel", "AGM-65G*2, AIM-120C*2, AIM-9M*2, Fuel, ECM", "AGM-65D*6, AIM-120B*2, AIM-9M*2, ECM, Fuel", "Mk86*6, AIM-9M*4, ECM, Fuel", "CBU-97*4, AIM-9M*4, Fuel", "CBU-87*4, AIM-9M*4, Fuel", "AGM-65D*2, CBU-87*2, AIM-9M*4, Fuel", "AGM-65D*2, CBU-97*2, AIM-9M*4, Fuel", "Mk84*2, AIM-9M*4, ECM, Fuel", "GBU-31v1*2, AIM-9M*4, ECM, Fuel", "GBU-31v3*2, AIM-9M*4, ECM, Fuel", "GBU-31v1*2, Mk82*6, AIM-9M*4, Fuel", "Mk84*4, AIM-9M*4, Fuel", "Mk82*12, AIM-9M*4, Fuel", "AGM-154C*2, AIM-9M*4, ECM, Fuel"], "F-16C bl.52d": ["AGM-88*2, AGM-65D*2, AIM-120B*2, ECM,LIGHTNING", "Mk-82*6,AIM-120*2,ECM,Fuel*2,LIGHTNING", "AGM88*2,AGM-65D*6,AIM-120*2,AIM-9*2,ECM,LIGHTNING", "AGM-65D*4,AIM-120*2,ECM,Fuel*2,LIGHTNING", "AIM-120*2,GBU-31*2,ECM,Fuel*2,LIGHTNING", "AIM-120*2,GBU-31(v)*2,ECM,Fuel*2,LIGHTNING", "AGM-88*2,AIM-120*2,AIM-9*2,ECM,Fuel*2,LIGHTNING", "Copy AIM-120*2,GBU-38*2,ECM,Fuel*2,LIGHTNING", "AIM-120*2,GBU-10*2,ECM,Fuel*2,LIGHTNING", "Mk-84*2,AIM-120*2,ECM,Fuel*2,LIGHTNING", "AGM-154*2,AIM-120*2,ECM,Fuel*2,LIGHTNING", "Mk-82AIR*6,AIM-120*2,ECM,Fuel*2,LITENING", "CBU97*4,AIM120*2,ECM,Fuel*2,LITENING", "AGM-88*2,AGM-65D*2,AIM-120B*2,AIM-9M*2,ECM,LITENING", "CBU87*2,AIM-120*2,ECM,Fuel*2,LITENING", "AGM88, AGM-65D, AIM-120*2,Fuel*2,ECM,LITENING", "AIM-120*2,GBU-12*2,ECM,Fuel*2,LITENING", "AGM-65K*2,AIM-120*2,ECM,Lantirn ,Fuel*2,LITENING", "AGM-65G*4,AIM-120C*2,AIM-9M*2,ECM", "AIM-120C*4,AIM-9M*2,ECM,Fuel*2", "AIM-120B*4,AIM-9M*2,ECM,Fuel*2", "AIM-9M*4,Fuel*2", "AIM-120C*2,AIM-120B*2,AIM-9M*2,Fuel*3", "AIM-9P*4", "AIM-9M*2,ECM"], "F-4E": ["AIM-9*4,AIM-7*4", "AGM45*2_AGM-65D*4_AIM7*2_ECM", "AGM-45*2,AIM-7*2,Fuel*2,ECM", "Mk-82*18,AIM-7*2,ECM", "GBU-12*2,AIM-7*2,Fuel*2,ECM", "Mk20*12,AIM-7*2,ECM", "Mk-82*6,AIM-7*2,Fuel*2,ECM", "GBU-10*2,AIM-7*2,Fuel*2,ECM", "Mk20*6,AIM-7*2,Fuel*2,ECM", "AGM-45*4,AIM-7*2,ECM", "AGM-65K*4,AIM-7*2,Fuel*2,ECM", "Fuel*3", "AIM-9*4,AIM-7*4,Fuel*2", "Mk-84*2,AIM-7*2,ECM", "AGM-65K*4,AIM-7M*4,Fuel*3"], "IL-76MD": [], "IL-78M": [], "Ka-27": [], "Ka-52": ["APU-6 Vikhr-M*2, Kh-25ML*2", "APU-6 Vikhr-M*2", "B-8*4", "KMGU-2 (AO-2.5RT)*4", "B-8*2, APU-6 Vikhr-M*2", "FAB-500*2", "UB-13*2", "FAB-250*4", "Kh-25ML*2, R-73*2"], "KC-10A": [], "KC-135": [], "Mi-24V": ["2xFAB-500", "10xS-13", "2xFAB-250", "4x9M114, 2xFuel tank", "128xS-5", "80xS-8 TsM", "4x9M114, 40xS-8 TsM", "64xS-5", "8x9M114", "4x9M114, 80xS-8", "4x9M114, 128xS-5", "2xKMGU AP", "4xFuel tank", "4xUPK-23", "4x9M114, 10xS-13", "4x9M114, 80xS-8 TsM", "4x9M114", "80xS-8", "40xS-8 TsM", "8x9M114, 40xS-8 TsM", "8x9M114, 10xS-13", "2xFuel tank", "4x9M114, 4xUPK-23", "2xUPK-23", "8x9M114, 64xS-5", "8x9M114, 40xS-8", "20xS-13", "40xS-8", "8x9M114, 2xUPK-23"], "Mi-26": [], "Mi-28N": ["2xFAB-250", "4xFuel tank", "80xS-8", "4xKMGU AP", "4xUPK-23", "16x9M114, 10xS-13", "4xFAB-500", "16x9M114, 2xFAB-500", "40xS-8", "40xS-8 TsM", "2xKMGU AP", "2xUPK-23", "16x9M114, 2xUPK-23", "2xFAB-500", "16x9M114, 40xS-8", "16x9M114", "20xS-13", "16x9M114, 2xKMGU AP", "4xFAB-250", "4xKMGU AT", "16x9M114, 40xS-8 TsM", "80xS-8 TsM", "2xKMGU AT", "9x9M114", "2xFuel tank", "10xS-13", "2xFAB-250, 16x9M114", "16x9M114, 2xKMGU AT"], "Mi-8MT": ["4 x B8", "4 x B8 + 2GUV_AP-30 (GrL 30mm)", "2 x UPK +2 x B8", "2 xB8 + 2GUV_YaKB (MG-12.7+7.62)+ 2GUV_AP-30 (GrL 30mm)", "6 x FAB-100", "2 x B8 + 2 x UPK-23-250", "2 x UPK--23-250"], "MiG-15bis": ["2*FAB-50", "2*FAB-100M", "2*300L", "2*400L", "2*600L", "Fuel tank 300", "Fuel tank 400"], "MiG-23MLD": ["R-60M*4", "B-8*2,R-60M*2,Fuel-800", "UB-32*2,R-60M*2,Fuel-800", "R-24R*2,R-60M*4,Fuel-800", "R-24R,R-24T,R-60M*4,Fuel-800", "R-60M*4,Fuel-800", "FAB-500*2,R-60M*2,Fuel-800", "R-24R*2,R-60M*4", "FAB-250*2,R-60M*2,Fuel-800", "RBK-250*2,R-60M*2,Fuel-800", "RBK-500*2,R-60M*2,Fuel-800", "R-24R,R-24T,R-60M*4"], "MiG-25PD": ["R-40R*2,R-40T*2", "R-40R*4", "R-40R*2,R-60M*2"], "MiG-25RBT": ["FAB-500x2_60x2", "R-60M*2"], "MiG-27K": ["FAB-250*6,R-60M*2,Fuel", "BetAB-500ShP*2,FAB-250*2,R-60*2", "Kh-25MR*2,R-60M*2,Fuel", "Kh-29L*2,R-60M*2,Fuel", "B-8*4", "BetAB-500*2,FAB-500*2,R-60*2", "Kh-25MPU*2,R-60M*2,Fuel", "Kh-29T*2,R-60M*2,Fuel", "FAB-500*2,FAB-250*2,R-60M*2,Fuel", "Kh-25ML*2,R-60M*2,Fuel", "KAB-500*2,R-60M*2,Fuel", "RBK-500AO*2,RBK-250*2,R-60M*2", "UB-32*4", "Kh-29L*2,R-60*2,Fuel"], "MiG-29A": ["Fuel-1150*2,Fuel-1500", "RBK-500AO*4,R-73*2,Fuel", "FAB-250*4,R-73*2,Fuel", "B-8*4,R-73*2,Fuel", "R-60M*4,R-27R*2", "R-73*4,R-27R*2,Fuel-1500", "R-73*6,Fuel-1500", "R-60M*6,Fuel-1500", "S-24*4,R-73*2,Fuel", "FAB-500*4,R-73*2,Fuel", "R-60M*6", "BetAB-500*4,R-73*2,Fuel", "R-73*6", "R-73*2,R-60M*2,R-27R*2,Fuel-1500", "R-60M*4,R-27R*2,Fuel-1500", "RBK-250*4,R-73*2,Fuel", "R-73*4,R-27R*2", "R-73*2,R-60M*2,R-27R*2", "S-24*2,FAB-500*2,R-73*2,Fuel"], "MiG-29G": ["R-73*6,Fuel-1500", "R-73*4,R-27R*2,Fuel-1500", "R-73*2,R-60M*2,R-27R*2", "R-60M*4,R-27R*2,Fuel-1500", "R-73*6", "R-60M*4,R-27R*2", "R-73*4,R-27R*2", "Fuel-1150*2,Fuel-1500", "R-60M*6", "R-60M*6,Fuel-1500", "R-73*2,R-60M*2,R-27R*2,Fuel-1500"], "MiG-29S": ["R-73*2,R-60M*2,R-27R*2", "R-73*4,R-27R*2,Fuel-1500", "R-73*6,Fuel-1500", "R-60M*6,Fuel-1500", "S-24*4,R-73*2,Fuel", "FAB-500*4,R-73*2,Fuel", "BetAB-500*4,R-73*2,Fuel", "RBK-500AO*4,R-73*2,Fuel", "R-73*2,R-60M*2,R-27R*2,Fuel-1500", "R-77*2,R-73*2,Fuel-1500,Fuel-1150*2", "B-8*4,R-73*2,Fuel", "RBK-250*4,R-73*2,Fuel", "R-73*6", "Fuel-1150*2,Fuel-1500", "R-60M*6", "R-60M*4,R-27R*2", "R-73*4,R-27R*2", "R-77*4,R-73*2", "FAB-250*4,R-73*2,Fuel", "R-60M*4,R-27R*2,Fuel-1500", "R-77*4,R-73*2,Fuel-1500", "S-24*2,FAB-500*2,R-73*2,Fuel"], "MiG-31": ["R-40T*2,R-33*4", "R-40T,R-33*4,R-40R", "R-40R*2,R-33*4", "R-60M*4,R-33*4"], "Mirage 2000-5": ["R 550*2,MICA IR*4", "R 550*2,MICA IR*2,MICA AR*2,Fuel*3", "R 550*2,MICA AR*4,Fuel*3", "R 550*2,SUPER 530F*2,Fuel", "Fuel*3", "R 550*2,MICA IR*4,Fuel*3", "R 550*2,MICA AR*4", "R 550*2,SUPER 530F*2"], "MQ-9 Reaper": ["GBU-12*4", "GBU-38*4", "AGM-114K*8,GBU-38*2", "AGM-114K*12"], "OH-58D": ["2xAGM-114, 7xHYDRA-70", "4xAGM-114", "M-3, 7xHYDRA-70", "2xAGM-114, M-3", "14xHYDRA-70", "14xHYDRA-70 WP"], "RQ-1A Predator": ["AGM-114K*2"], "S-3B": ["AGM-84A*2, Mk-82*2", "AGM-84E*2", "AGM-65D, AGM-65K, Mk20*4", "AGM-65D, AGM-65K, Mk82*4", "Mk82*10", "Mk84*2, Mk82*4", "ZUNI Mk71*8, Mk20*4"], "SH-3W": [], "SH-60B": ["AGM-119"], "Su-17M4": ["UB-32*4,R-60M*2,FAB-250*4", "FAB-100*24,R-60M*2", "UB-32*4,R-60M*2,Fuel*2", "B-8*4,R-60M*2,FAB-250*4", "Kh-29L*2,R-60M*2,Fuel*2", "B-8*4,R-60M*2,Fuel*2", "Kh-29T*2,R-60M*2,Fuel*2", "BetAB-500*6,R-60M*2", "Kh-25MR*4,R-60M*2,Fuel*2", "S-24*4,R-60M*2,Fuel*2", "Kh25MPU*2_Kh25ML*2_,R60M*2_Fuel*2", "Kh58*2_Kh25MPU*2_R60M*2_Fuel*2", "FAB-250*16,R-60M*2", "Kh-25ML*4,R-60M*2,Fuel*2", "RBK-500AO*4,SPPU-22*2,R-60M*2", "S-24*4,R-60M*2,FAB-250*4", "Fuel*4", "FAB-500*6,R-60M*2", "Kh-25ML*2,Kh-29L*2,R-60*2"], "Su-24M": ["UB-13*4,FAB-500*2", "Kh-31A*2,R-60M*2,Fuel", "UB-13*4", "KAB-500*4,R-60M*2", "S-25*2,Fuel*3", "Kh31P*2_Kh25ML*2_L-081", "B-8*2,Fuel*3", "FAB-1500*2,R-60M*2", "S-24*4", "BetAB-500*4,R-60M*2", "Kh-25ML*4", "Kh-25MR*4", "FAB-100*24", "Kh-31A*2,R-60M*2", "UB-13*2,Fuel*3", "B-8*2,Fuel*2", "Kh58*2_Kh25ML*2_L-081", "RBK-250*8", "UB-32*4", "Kh-29L*2,R-60M*2", "S-24*2,Fuel*3", "Kh25MPU*2_Kh25ML*2_L-081", "FAB-500*4,R-60M*2", "FAB-250*8", "Fuel*3", "RBK-500AO*4,R-60M*2", "KAB-1500*2,R-60M*2,Fuel", "UB-32*4,FAB-250*4", "Kh-29T*2,R-60M*2", "UB-32*2,Fuel*3", "Kh-59M*2,R-60M*2,Fuel", "S-25*4", "B-8*6"], "Su-24MR": ["SHPIL,ETHER,R-60M*2", "Fuel*2", "TANGAZH,ETHER,R-60M*2,Fuel*2", "TANGAZH,ETHER,R-60M*2", "SHPIL,ETHER,R-60M*2,Fuel*2"], "Su-25": ["RBK-250*2,S-8KOM*80,R-60M*2,Fuel*2", "FAB-250*4,UB-13*2,R-60M*2,SPPU-22*2", "S-25L*6,UB-13*2,R-60M*2", "S-25*6,SPPU-22*2,R-60M*2", "2-25L*2, KH-25ML*2, RBK-500*2, B-8MI*2, R-60M*2", "S-8KOM*120,R-60M*2,Fuel*2", "FAB-250*4,S-25*2,R-60M*2,Fuel*2", "RBK-500AO*4,S-8KOM*40,R-60M*2,Fuel*2", "FAB-250*2,SPPU-22*2,SAB-100*4,R-60M*2", "RBK-500AO*6,R-60M*2,Fuel*2", "RBK-250*8,R-60M*2", "Kh-29L*2,Kh-25ML*4,R-60M*2", "RBK-250*4,S-8KOM*80,R-60M*2", "FAB-250*4,UB-13*2,R-60M*2,Fuel*2", "S-8TsM*160,R-60*2", "Kh-25ML*4,R-60M*2,Fuel*2", "BetAB-500ShP*8,R-60M*2", "SAB-100*8,R-60*2", "Kh-29L*2,Kh-25ML*4,S-25L*2,R-60M*2", "FAB-500*6,R-60M*2,Fuel*2", "Kh-29L*2,Kh-25ML*2,R-60M*2,Fuel*2", "Kh-29L*2,R-60M*2,Fuel*2", "FAB-100*32,R-60M*2", "FAB-100*16,R-60M*2,Fuel*2", "FAB-250*6,R-60M*2,Fuel*2", "BetAB-500*6,R-60M*2,Fuel*2", "S-25*6,R-60M*2,Fuel*2", "UB-13*6,R-60M*2,Fuel*2", "Kh-25*4,Kh-29T*2,R-60*2", "S-25L*6,R-60*2,Fuel*2"], "Su-25T": ["FAB-250*4,SPPU-22*2,SAB-100*2,R-60M*2", "Kh-29L*2,Kh-25ML*4,R-73*2,Mercury LLTV Pod,MPS-410", "KAB-500Kr*2,Kh-25ML*2,R-73*2,MPS-410,Fuel*2", "RBK-500AO*4,UB-32*2,R-60M*2,Fuel*2", "BetAB-500ShP*8,R-60M*2", "UB-13*6,R-60M*2,Fuel*2", "Kh-29T*2,R-73*2,Fuel*2,MPS-410", "Kh58*2_Kh25ML*4_R73*2_L-081_MPS-410", "FAB-250*4,UB-13*2,R-60M*2,Fuel*2", "KH-29T*2, VIKHR*2, ECM", "Kh-29T*2,Kh-25ML*4,R-73*2,MPS-410", "FAB-250*4,UB-13*2,R-60M*2,SPPU-22*2", "FAB-500*6,R-60M*2,Fuel*2", "Fuel*4", "APU-8 Vikhr-M*2,Kh-25ML,R-73*2,SPPU-22*2,Mercury LLTV Pod,MPS-410", "S-8KOM*120,R-60M*2,Fuel*2", "KMGU-2 (PTAB-2.5KO)*8,R-60M*2", "FAB-250*6,R-60M*2,Fuel*2", "Kh-29L*2,R-73*2,Fuel*2,Mercury LLTV Pod,MPS-410", "FAB-100*32,R-60M*2", "RBK-250*8,R-60M*2", "S-25L*6,UB-13*2,R-60M*2", "FAB-250*4,S-25*2,R-60M*2,Fuel*2", "S-25*2,SPPU-22*4,R-60M*2,R-73*2", "KMGU-2 (AO-2.5RT)*8,R-60M*2", "APU-8 Vikhr-M*2,S-25L*2,R-73*2,SPPU-22*2,Mercury LLTV Pod,MPS-410", "S-25*6,R-60M*2,Fuel*2", "RBK-500AO*6,R-60M*2,Fuel*2", "Kh58*2_Kh25MPU*2_Kh25ML*2_R73*2_L-081_MPS-410", "RBK-250*4,UB-32*4,R-60M*2", "Kh25MPU*4_R73*2_Fuel*2_L-081_MPS-410", "BetAB-500*6,R-60M*2,Fuel*2", "RBK-250*2,UB-32*4,R-60M*2,Fuel*2", "FAB-100*16,R-60M*2,Fuel*2", "Kh-29L*2,Kh-25ML*4,R-73*2,ECM"], "Su-25TM": ["BetAB-500ShP*6,R-73*2,ECM", "APU-8 Vikhr-M*2,R-60M*2,R-73*2,SPPU-22*2,Mercury LLTV Pod", "Kh-29T*2,Kh-25ML*2,R-73*2,Fuel*2,ECM", "Kh-58*2,Kh-25MPU*4,R-73*2,ECM", "S-25L*6,UB-13*2,R-60M*2", "Kh-35*2,R-73*2,Fuel*2,RadarPod,ECM", "Kh-31A*2,R-73*2,Fuel*2,RadarPod,ECM", "Fuel*4", "BetAB-500*6,R-60M*2,Fuel*2", "KAB-500Kr*2,Kh-25ML*2,R-73*2,Fuel*2,ECM", "Kh-29L*2,R-73*2,Fuel*2,Mercury LLTV Pod,ECM", "UB-13*6,R-60M*2,Fuel*2", "S-25*2,SPPU-22*4,R-60M*2,R-73*2", "Kh-31P*2,Kh-25ML*4,R-73*2,ECM", "UB-32*6,R-60M*2,Fuel*2", "FAB-100*16,R-60M*2,Fuel*2", "FAB-250*6,R-60M*2,Fuel*2", "FAB-500*6,R-60M*2,Fuel*2", "Kh-25MPU*4,R-73*2,Fuel*2,ECM", "S-25*6,R-60M*2,Fuel*2", "RBK-500AO*4,UB-32*2,R-60M*2,Fuel*2", "FAB-250*4,UB-13*2,R-60M*2,SPPU-22*2", "Kh-31P*2,Kh-25MPU*4,R-73*2,ECM", "RBK-500AO*6,R-60M*2,Fuel*2", "FAB-100*32,R-60M*2", "RBK-250*2,UB-32*4,R-60M*2,Fuel*2", "RBK-250*8,R-60M*2", "APU-8 Vikhr-M*2,R-73*2,SPPU-22*2,Mercury LLTV Pod,ECM", "RBK-250*4,UB-32*4,R-60M*2", "FAB-250*4,SPPU-22*2,SAB-100*2,R-60M*2", "FAB-250*4,S-25*2,R-60M*2,Fuel*2", "FAB-250*4,UB-13*2,R-60M*2,Fuel*2"], "Su-27": ["R-73*4,R-27ER*4,R-27ET*2", "KMGU-2 (AO-2.5RT)*5,R-73*2,ECM", "BetAB-500ShP*6,R-73*2,ECM", "KMGU-2 (PTAB-2.5KO)*5,R-73*2,ECM", "R-73*2,R-27ER*6,ECM", "R-73*6", "S-13*10,RBK-500AO*2,FAB-500*2,R-73*2,ECM", "R-73*4,R-27ER*6", "R-73*2,R-27ER*4,R-27ET*2,ECM", "R-73*4,ECM", "ECM", "FAB-500*6,R-73*2,ECM", "S-25*2,FAB-500*4,R-73*4", "S-25*4, FAB-500*4, R-73*2, ECM", "CAS S-8KOM Rockets + RBK-500 PTAB1", "CAS S-8OFP Rockets + FAB-500 Bombs", "CAS S-8OFP Rockets", "CAS S-8OFP Rockets + FAB-100 Bombs", "CAS S-8KOM Rockets + FAB-100 Bombs", "CAS S-13 Rockets", "CAS S-8KOM Rockets + FAB-250 Bombs", "CAS S-8KOM Rockets + RBK-250 PTAB2.5", "CAS S-8KOM Rockets", "CAS S-8KOM Rockets + FAB-500 Bombs", "CAS S-8KOM Rockets + RBK-500 PTAB10", "CAS S-8KOM Rockets + KMGU PTAB", " CAS S-25 Rockets", "CAS S-25 Rockets + FAB-500 Bombs"], "Su-30": ["R-73*2,R-77*6,ECM", "R-73*2,R-27T*2,R-27R*4", "RBK-500AO*6,R-73*2,ECM", "Kh-31P*2,Kh-31A*2,R-73*2,R-77*2,ECM", "R-73*4,R-27T*2,R-27R*4", "R-73*2,R-77*2,Kh-35*2,ECM", "Kh-35*2,Kh-31P*2,R-73*2,R-77*2,ECM", "FAB-250*4,B-8*2,R-73*2,ECM", "ECM", "KAB-1500*2,R-73*2,R-77*2,ECM", "RBK-250*6,R-73*2,ECM", "R-73*4,R-77*6", "FAB-250*4,S-25*2,R-73*2,ECM", "R-73*2,R-27R*2,R-27ER*4,ECM", "R-73*2,R-27T*2,R-27ER*2,R-77*2,ECM", "FAB-1500*2,R-73*2,R-77*2,ECM", "R-73*4,R-27T*2,R-27ER*2,R-77*2", "Kh-59M*2,R-73*2,R-77*2,ECM", "FAB-500*6,R-73*2,ECM", "R-73*4,R-27R*2,R-27ER*4", "Kh-29L*4,R-73*2,R-77*2,ECM", "BetAB-500*6,R-73*2,ECM", "R-73*4", "FAB-250*4,UB-13*2,R-73*2,ECM", "R-73*2,R-77*4,R-27ER*2,ECM", "KAB-500*4,R-73*2,R-77*2,ECM", "FAB-250*6,R-73*2,ECM", "R-73*4,R-77*4,R-27ER*2", "Kh-29T*4,R-73*2,R-77*2,ECM", "Kh-31P*2,Kh-31A*2,R-73*2,R-77*2,ECM", "Kh-31P*4,R-73*2,R-77*2,ECM"], "Su-33": ["RBK-250*6,R-73*2,R-27R*2,ECM", "R-73*4", "R-73*4,R-27R*2,R-27ER*6", "R-73*2,R-27ET*2,R-27ER*6,ECM", "R-73*4,R-27ET*2,R-27ER*6", "FAB-250*6,R-73*2,R-27R*2,ECM", "R-73*2,R-27R*2,R-27ER*6,ECM", "ECM", "BetAB-500*6,R-73*2,R-27R*2,ECM", "RBK-500AO*6,R-73*2,R-27R*2,ECM", "UB-13*4,FAB-250*4,R-73*2,ECM", "S-25*4,FAB-250*4,R-73*2,ECM", "FAB-500*6,R-73*2,R-27R*2,ECM", "B-8*4,FAB-250*4,R-73*2,ECM", "S-25*4,FAB-500*4,R-73*4", "CAS S-8KOM rockets + FAB500", "CAS S-8OFP rockets + FAB500", "CAS S-13 Rockets + FAB500", "CAS S-13 Rockets + FAB100", "CAS S-8KOM rockets + FAB250", "CAS S-25 Rockets + FAB500", "CAS S-8KOM rockets + RBK500 PTAB10", "CAS S-8KOM rockets + RBK500 PTAB1"], "Su-34": ["UB-13*4,FAB-250*4,R-73*2,ECM", "FAB-100*28,R-73*2,ECM", "BetAB-500*8,R-73*2,ECM", "Kh-29L*4,R-73*2,R-77*2,ECM", "KAB-500*4,R-73*2,R-77*2,ECM", "RBK-250 PTAB-2.5M*8,R-73*2,ECM", "FAB-250*8,R-73*2,ECM", "ECM", "Kh-29T*4,R-73*2,R-77*2,ECM", "RBK-500 PTAB-10-5*8,R-73*2,ECM", "FAB-1500*3,R-73*2,R-77*2,ECM", "Kh-59M*2,R-73*2,R-77*2,ECM", "B-8*6,R-73*2,R-27R*2,ECM", "FAB-500*8,R-73*2,ECM", "KAB-1500*2,R-73*2,R-77*2,ECM", "Kh-29T*4,R-73*2,R-27R*2,ECM", "Kh-31A*4,Kh-31P*2,R-73*2,R-27R*2,ECM", "Kh-31A*6,R-73*2,R-27R*2,ECM", "Kh-31P*4,R-73*2,R-27R*2,ECM", "Kh-29L*4,R-73*2,R-27R*2,ECM"], "Tornado GR4": ["AIM-9M*2, Fuel*2, ECM", "ALARM*4, Fuel*2, ECM", "GBU-16*2, AIM-9M*2, Fuel*2, ECM", "BL755*4, AIM-9M*2, Fuel*2, ECM", "Sea Eagle*2, AIM-9M*2, Fuel*2, ECM"], "Tornado IDS": ["Kormoran*2,AIM-9*2,Fuel*2", "GBU-16*2,AIM-9*2,Fuel*2", "Fuel*2", "AGM-88*4,AIM-9*2,ECM", "AGM-88*2,AIM-9*2,Fuel*2,ECM", "Kormoran*4,AIM-9*2", "Kormoran*2,AIM-9*2,AGM-88*2", "Mk-82*4,AIM-9*2,Fuel*2"], "Tu-142": ["Kh-35*6"], "Tu-160": ["Kh-65*12"], "Tu-22M3": ["Kh-22N", "Kh-22N*2", "FAB-250*69", "FAB-500*33", "FAB-500*33, FAB-250*36", "FAB-250*33"], "Tu-95MS": ["Kh-65*6"], "UH-1H": ["M134 Minigun*2, XM158*2"], "UH-60A": []} \ No newline at end of file diff --git a/scripts/generatePayloadTables.py b/scripts/python/generatePayloadTables.py similarity index 100% rename from scripts/generatePayloadTables.py rename to scripts/python/generatePayloadTables.py diff --git a/scripts/payLoadConverter.py b/scripts/python/payLoadConverter.py similarity index 100% rename from scripts/payLoadConverter.py rename to scripts/python/payLoadConverter.py From 4d954688a9da8a2d650243990f8be44b31d62b12 Mon Sep 17 00:00:00 2001 From: Pax1601 Date: Sat, 26 Aug 2023 10:58:51 +0200 Subject: [PATCH 7/7] v0.4.3 --- client/package-lock.json | 4 ++-- client/package.json | 2 +- client/views/other/dialogs.ejs | 2 +- client/views/toolbars/primary.ejs | 2 +- installer/olympus.iss | 2 +- mod/entry.lua | 2 +- scripts/OlympusCommand.lua | 2 +- scripts/OlympusHook.lua | 2 +- src/shared/include/defines.h | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index 1a968d12..44c2fe56 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1,12 +1,12 @@ { "name": "DCSOlympus", - "version": "v0.4.2-alpha", + "version": "v0.4.3-alpha", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "DCSOlympus", - "version": "v0.4.2-alpha", + "version": "v0.4.3-alpha", "dependencies": { "cookie-parser": "~1.4.4", "debug": "~2.6.9", diff --git a/client/package.json b/client/package.json index a4e583a1..e199321e 100644 --- a/client/package.json +++ b/client/package.json @@ -2,7 +2,7 @@ "name": "DCSOlympus", "node-main": "./bin/www", "main": "http://localhost:3000", - "version": "v0.4.2-alpha", + "version": "v0.4.3-alpha", "private": true, "scripts": { "copy": "copy.bat", diff --git a/client/views/other/dialogs.ejs b/client/views/other/dialogs.ejs index 10cc21d9..2ba6d3cf 100644 --- a/client/views/other/dialogs.ejs +++ b/client/views/other/dialogs.ejs @@ -3,7 +3,7 @@

DCS Olympus

Dynamic Unit Command

-
Version v0.4.2-alpha
+
Version v0.4.3-alpha
diff --git a/client/views/toolbars/primary.ejs b/client/views/toolbars/primary.ejs index 9d421fcd..a66879e3 100644 --- a/client/views/toolbars/primary.ejs +++ b/client/views/toolbars/primary.ejs @@ -6,7 +6,7 @@

DCS Olympus

-
version v0.4.2-alpha
+
version v0.4.3-alpha
Discord diff --git a/installer/olympus.iss b/installer/olympus.iss index 332ea4c0..5b8f8426 100644 --- a/installer/olympus.iss +++ b/installer/olympus.iss @@ -1,5 +1,5 @@ #define nwjsFolder "C:\Users\dpass\Documents\nwjs\" -#define version "v0.4.2-alpha" +#define version "v0.4.3-alpha" [Setup] AppName=DCS Olympus diff --git a/mod/entry.lua b/mod/entry.lua index d3a330cb..cf1d6015 100644 --- a/mod/entry.lua +++ b/mod/entry.lua @@ -15,7 +15,7 @@ declare_plugin(self_ID, shortName = "Olympus", fileMenuName = "Olympus", - version = "v0.4.2-alpha", + version = "v0.4.3-alpha", state = "installed", developerName= "DCS Refugees 767 squadron", info = _("DCS Olympus is a mod for DCS World. It allows users to spawn, control, task, group, and remove units from a DCS World server using a real-time map interface, similarly to Real Time Strategy games. The user interface also provides useful informations units, like loadouts, fuel, tasking, and so on. In the future, more features for DCS World GCI and JTAC will be available."), diff --git a/scripts/OlympusCommand.lua b/scripts/OlympusCommand.lua index c6de3fde..1c1776b9 100644 --- a/scripts/OlympusCommand.lua +++ b/scripts/OlympusCommand.lua @@ -1,4 +1,4 @@ -local version = "v0.4.2-alpha" +local version = "v0.4.3-alpha" local debug = false diff --git a/scripts/OlympusHook.lua b/scripts/OlympusHook.lua index fef4a77f..959fc6a6 100644 --- a/scripts/OlympusHook.lua +++ b/scripts/OlympusHook.lua @@ -1,4 +1,4 @@ -local version = 'v0.4.2-alpha' +local version = 'v0.4.3-alpha' Olympus = {} Olympus.OlympusDLL = nil diff --git a/src/shared/include/defines.h b/src/shared/include/defines.h index f7a81f3f..8b05b5f3 100644 --- a/src/shared/include/defines.h +++ b/src/shared/include/defines.h @@ -1,6 +1,6 @@ #pragma once -#define VERSION "v0.4.2-alpha" +#define VERSION "v0.4.3-alpha" #define LOG_NAME "Olympus_log.txt" #define REST_ADDRESS "http://localhost:30000" #define REST_URI "olympus"