mirror of
https://github.com/Pax1601/DCSOlympus.git
synced 2025-10-29 16:56:34 +00:00
Merge branch 'main' into 351-double-click-on-a-unit-should-select-all-units-of-that-time-on-the-screen
This commit is contained in:
commit
70783dc828
@ -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 = {
|
||||
@ -344,7 +360,7 @@ class DemoDataGenerator {
|
||||
airbases(req, res){
|
||||
var ret = {airbases: {
|
||||
["0"]: {
|
||||
callsign: "Neutral",
|
||||
callsign: "Nellis",
|
||||
latitude: 37.3,
|
||||
longitude: -115.8,
|
||||
coalition: "neutral"
|
||||
|
||||
4
client/package-lock.json
generated
4
client/package-lock.json
generated
@ -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",
|
||||
|
||||
@ -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",
|
||||
|
||||
466
client/public/databases/airbases/caucasus.json
Normal file
466
client/public/databases/airbases/caucasus.json
Normal file
@ -0,0 +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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
466
client/public/databases/airbases/marianas.json
Normal file
466
client/public/databases/airbases/marianas.json
Normal file
@ -0,0 +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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
558
client/public/databases/airbases/nevada.json
Normal file
558
client/public/databases/airbases/nevada.json
Normal file
@ -0,0 +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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
747
client/public/databases/airbases/persiangulf.json
Normal file
747
client/public/databases/airbases/persiangulf.json
Normal file
@ -0,0 +1,747 @@
|
||||
{
|
||||
"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": [
|
||||
{
|
||||
"headings": [
|
||||
{
|
||||
"19": {
|
||||
"magHeading": "186",
|
||||
"ILS": ""
|
||||
},
|
||||
"01": {
|
||||
"magHeading": "006",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
],
|
||||
"length": "12800"
|
||||
}
|
||||
]
|
||||
},
|
||||
"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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
1366
client/public/databases/airbases/syria.json
Normal file
1366
client/public/databases/airbases/syria.json
Normal file
File diff suppressed because it is too large
Load Diff
@ -1074,10 +1074,6 @@ dl.ol-data-grid {
|
||||
row-gap: 4px;
|
||||
}
|
||||
|
||||
dl.ol-data-grid dd {
|
||||
width: fit-content;
|
||||
}
|
||||
|
||||
dl.ol-data-grid dt.icon {
|
||||
text-indent: 10px;
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
@ -264,6 +264,9 @@
|
||||
width: 16px;
|
||||
}
|
||||
|
||||
|
||||
/* Buttons */
|
||||
|
||||
#center-map::before {
|
||||
content: url("/resources/theme/images/icons/arrows-to-eye-solid.svg");
|
||||
}
|
||||
@ -443,4 +446,44 @@
|
||||
margin-top: 5px;
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/* Airbase context menu */
|
||||
#airbase-chart-data dd {
|
||||
width: 60%;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#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-runways>.runway abbr {
|
||||
cursor: help;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
#airbase-runways>.runway>.heading {
|
||||
align-items: center;
|
||||
column-gap: 4px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
#airbase-runways>.runway>.heading>abbr {
|
||||
font-weight: var(--font-weight-bolder);
|
||||
padding: 4px;
|
||||
}
|
||||
|
||||
#airbase-runways>.runway>.heading:last-of-type {
|
||||
flex-direction: row-reverse;
|
||||
}
|
||||
@ -15,69 +15,48 @@ 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 airbases = getAirbasesData( req.params.theatreName );
|
||||
const theatreName = req.params.theatreName.toLowerCase().replace( /\s*/g, "" );
|
||||
const airbases = getAirbasesData( theatreName );
|
||||
|
||||
if ( !airbases ) {
|
||||
sendInvalidTheatre( res );
|
||||
@ -85,9 +64,6 @@ app.get( "/:theatreName", ( req, res ) => {
|
||||
}
|
||||
|
||||
res.status( 200 ).json( airbases );
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
module.exports = app;
|
||||
6
client/src/@types/unit.d.ts
vendored
6
client/src/@types/unit.d.ts
vendored
@ -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
|
||||
}
|
||||
@ -1,361 +0,0 @@
|
||||
{
|
||||
"airfields": {
|
||||
"Anapa-Vityazevo": {
|
||||
"ICAO": "URKA",
|
||||
"Elevation": "141",
|
||||
"TACAN": "",
|
||||
"Runways:": {
|
||||
"04": {
|
||||
"Mag Hdg": "034",
|
||||
"Length": "9000",
|
||||
"ILS": ""
|
||||
},
|
||||
"22": {
|
||||
"Mag Hdg": "214",
|
||||
"Length": "9000",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Batumi": {
|
||||
"ICAO": "UGSB",
|
||||
"Elevation": "33",
|
||||
"TACAN": "16X",
|
||||
"Runways": {
|
||||
"13": {
|
||||
"Mag Hdg": "119",
|
||||
"Length": "7500",
|
||||
"ILS": ""
|
||||
},
|
||||
"31": {
|
||||
"Mag Hdg": "299",
|
||||
"Length": "7500",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Beslan": {
|
||||
"ICAO": "URMO",
|
||||
"Elevation": "1722",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"10": {
|
||||
"Mag Hdg": "086",
|
||||
"Length": "9600",
|
||||
"ILS": "110.50"
|
||||
},
|
||||
"28": {
|
||||
"Mag Hdg": "266",
|
||||
"Length": "9600",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Gelendzhik": {
|
||||
"ICAO": "URKG",
|
||||
"Elevation": "72",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"01": {
|
||||
"Mag Hdg": "032",
|
||||
"Length": "5400",
|
||||
"ILS": ""
|
||||
},
|
||||
"19": {
|
||||
"Mag Hdg": "212",
|
||||
"Length": "5400",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Gudauta": {
|
||||
"ICAO": "UG23",
|
||||
"Elevation": "69",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"15": {
|
||||
"Mag Hdg": "144",
|
||||
"Length": "7700",
|
||||
"ILS": ""
|
||||
},
|
||||
"33": {
|
||||
"Mag Hdg": "324",
|
||||
"Length": "7700",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Kobuleti": {
|
||||
"ICAO": "UG5X",
|
||||
"Elevation": "69",
|
||||
"TACAN": "67X",
|
||||
"Runways": {
|
||||
"07": {
|
||||
"Mag Hdg": "063",
|
||||
"Length": "7400",
|
||||
"ILS": "111.50"
|
||||
},
|
||||
"25": {
|
||||
"Mag Hdg": "243",
|
||||
"Length": "7400",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Krasnodar-Center": {
|
||||
"ICAO": "URKL",
|
||||
"Elevation": "98",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"09": {
|
||||
"Mag Hdg": "079",
|
||||
"Length": "7700",
|
||||
"ILS": ""
|
||||
},
|
||||
"27": {
|
||||
"Mag Hdg": "259",
|
||||
"Length": "7700",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Krasnodar-Pashkovsky": {
|
||||
"ICAO": "URKK",
|
||||
"Elevation": "112",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"05": {
|
||||
"Mag Hdg": "039",
|
||||
"Length": "9600",
|
||||
"ILS": ""
|
||||
},
|
||||
"23": {
|
||||
"Mag Hdg": "219",
|
||||
"Length": "9600",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Krymsk": {
|
||||
"ICAO": "URKW",
|
||||
"Elevation": "66",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"04": {
|
||||
"Mag Hdg": "032",
|
||||
"Length": "8000",
|
||||
"ILS": ""
|
||||
},
|
||||
"22": {
|
||||
"Mag Hdg": "212",
|
||||
"Length": "8000",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Kutaisi": {
|
||||
"ICAO": "UGKO",
|
||||
"Elevation": "148",
|
||||
"TACAN": "44X",
|
||||
"Runways": {
|
||||
"07": {
|
||||
"Mag Hdg": "067'",
|
||||
"Length": "7700",
|
||||
"ILS": "109.75"
|
||||
},
|
||||
"25": {
|
||||
"Mag Hdg": "247",
|
||||
"Length": "7700",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Maykop-Khanskaya": {
|
||||
"ICAO": "URKH",
|
||||
"Elevation": "591",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"04": {
|
||||
"Mag Hdg": "031",
|
||||
"Length": "10100",
|
||||
"ILS": ""
|
||||
},
|
||||
"22": {
|
||||
"Mag Hdg": "211",
|
||||
"Length": "10100",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Mineralnye Vody": {
|
||||
"ICAO": "URMM",
|
||||
"Elevation": "1050",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"12": {
|
||||
"Mag Hdg": "108",
|
||||
"Length": "12700",
|
||||
"ILS": "111.70"
|
||||
},
|
||||
"30": {
|
||||
"Mag Hdg": "288",
|
||||
"Length": "12700",
|
||||
"ILS": "109.30"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Mozdok": {
|
||||
"ICAO": "XRMF",
|
||||
"Elevation": "507",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"08": {
|
||||
"Mag Hdg": "075",
|
||||
"Length": "9400",
|
||||
"ILS": ""
|
||||
},
|
||||
"26": {
|
||||
"Mag Hdg": "255",
|
||||
"Length": "9400",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Nalchick": {
|
||||
"ICAO": "URMN",
|
||||
"Elevation": "1411",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"06": {
|
||||
"Mag Hdg": "048'",
|
||||
"Length": "7000",
|
||||
"ILS": ""
|
||||
},
|
||||
"24": {
|
||||
"Mag Hdg": "228",
|
||||
"Length": "7000",
|
||||
"ILS": "110.50"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Novorossiysk": {
|
||||
"ICAO": "URKN",
|
||||
"Elevation": "131",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"04": {
|
||||
"Mag Hdg": "034",
|
||||
"Length": "5400",
|
||||
"ILS": ""
|
||||
},
|
||||
"22": {
|
||||
"Mag Hdg": "214",
|
||||
"Length": "5400",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Senaki-Kolkhi": {
|
||||
"ICAO": "UGKS",
|
||||
"Elevation": "43",
|
||||
"TACAN": "31X",
|
||||
"Runways": {
|
||||
"09": {
|
||||
"Mag Hdg": "088'",
|
||||
"Length": "7400",
|
||||
"ILS": "108.90"
|
||||
},
|
||||
"27": {
|
||||
"Mag Hdg": "268",
|
||||
"Length": "7400",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Sochi-Adler": {
|
||||
"ICAO": "URSS",
|
||||
"Elevation": "98",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"06": {
|
||||
"Mag Hdg": "055",
|
||||
"Length": "9700",
|
||||
"ILS": "111.10"
|
||||
},
|
||||
"27": {
|
||||
"Mag Hdg": "235",
|
||||
"Length": "9700",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Tbilisi-Lochini": {
|
||||
"ICAO": "UGTB",
|
||||
"Elevation": "1574",
|
||||
"TACAN": "25X",
|
||||
"Runways": {
|
||||
"13": {
|
||||
"Mag Hdg": "121",
|
||||
"Length": "9300",
|
||||
"ILS": "110.30"
|
||||
},
|
||||
"31": {
|
||||
"Mag Hdg": "301",
|
||||
"Length": "9300",
|
||||
"ILS": "108.90"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Soganlug": {
|
||||
"ICAO": "UG24",
|
||||
"Elevation": "1500",
|
||||
"TACAN": "25X",
|
||||
"Runways": {
|
||||
"14": {
|
||||
"Mag Hdg": "125",
|
||||
"Length": "6500",
|
||||
"ILS": ""
|
||||
},
|
||||
"32": {
|
||||
"Mag Hdg": "305",
|
||||
"Length": "6500",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Sukhumi-Babushara": {
|
||||
"ICAO": "UGSS",
|
||||
"Elevation": "43",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"12": {
|
||||
"Mag Hdg": "109",
|
||||
"Length": "11400",
|
||||
"ILS": ""
|
||||
},
|
||||
"30": {
|
||||
"Mag Hdg": "289",
|
||||
"Length": "11400",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Vaziani": {
|
||||
"ICAO": "UG27",
|
||||
"Elevation": "1524",
|
||||
"TACAN": "22X",
|
||||
"Runways": {
|
||||
"13": {
|
||||
"Mag Hdg": "129",
|
||||
"Length": "7700",
|
||||
"ILS": "108.75"
|
||||
},
|
||||
"31": {
|
||||
"Mag Hdg": "309",
|
||||
"Length": "7700",
|
||||
"ILS": "108.75"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,170 +0,0 @@
|
||||
{
|
||||
"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": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,413 +0,0 @@
|
||||
{
|
||||
"airfields": {
|
||||
"BeattyAirport": {
|
||||
"ICAO": "KBTY",
|
||||
"Elevation": "3173",
|
||||
"TACAN": "94X",
|
||||
"Runways:": {
|
||||
"16": {
|
||||
"Mag Hdg": "168",
|
||||
"Length": "5500",
|
||||
"ILS": ""
|
||||
},
|
||||
"34": {
|
||||
"Mag Hdg": "348",
|
||||
"Length": "5500",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"BoulderCityAirport": {
|
||||
"ICAO": "KBVU",
|
||||
"Elevation": "2205",
|
||||
"TACAN": "114X",
|
||||
"Runways:": {
|
||||
"09": {
|
||||
"Mag Hdg": "087",
|
||||
"Length": "4400",
|
||||
"ILS": ""
|
||||
},
|
||||
"27": {
|
||||
"Mag Hdg": "267",
|
||||
"Length": "4400",
|
||||
"ILS": ""
|
||||
},
|
||||
"15": {
|
||||
"Mag Hdg": "153",
|
||||
"Length": "3700",
|
||||
"ILS": ""
|
||||
},
|
||||
"33": {
|
||||
"Mag Hdg": "333",
|
||||
"Length": "3700",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Creech": {
|
||||
"ICAO": "KINS",
|
||||
"Elevation": "3126",
|
||||
"TACAN": "87X",
|
||||
"Runways:": {
|
||||
"08": {
|
||||
"Mag Hdg": "080",
|
||||
"Length": "8700",
|
||||
"ILS": "108.70"
|
||||
},
|
||||
"26": {
|
||||
"Mag Hdg": "260",
|
||||
"Length": "8700",
|
||||
"ILS": ""
|
||||
},
|
||||
"13": {
|
||||
"Mag Hdg": "134",
|
||||
"Length": "4700",
|
||||
"ILS": ""
|
||||
},
|
||||
"31": {
|
||||
"Mag Hdg": "314",
|
||||
"Length": "4700",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"EchoBayAirport": {
|
||||
"ICAO": "0L9",
|
||||
"Elevation": "1549",
|
||||
"TACAN": "",
|
||||
"Runways:": {
|
||||
"06": {
|
||||
"Mag Hdg": "066",
|
||||
"Length": "3300",
|
||||
"ILS": ""
|
||||
},
|
||||
"24": {
|
||||
"Mag Hdg": "246",
|
||||
"Length": "3300",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"groom": {
|
||||
"ICAO": "KXTA",
|
||||
"Elevation": "4495",
|
||||
"TACAN": "18X",
|
||||
"Runways:": {
|
||||
"14L": {
|
||||
"Mag Hdg": "145",
|
||||
"Length": "11700",
|
||||
"ILS": ""
|
||||
},
|
||||
"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": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"HendersonExecutiveAirport": {
|
||||
"ICAO": "KHND",
|
||||
"Elevation": "2493",
|
||||
"TACAN": "",
|
||||
"Runways:": {
|
||||
"17L": {
|
||||
"Mag Hdg": "168",
|
||||
"Length": "4600",
|
||||
"ILS": ""
|
||||
},
|
||||
"35R": {
|
||||
"Mag Hdg": "348",
|
||||
"Length": "4600",
|
||||
"ILS": ""
|
||||
},
|
||||
"17R": {
|
||||
"Mag Hdg": "168",
|
||||
"Length": "6100",
|
||||
"ILS": ""
|
||||
},
|
||||
"35L": {
|
||||
"Mag Hdg": "348",
|
||||
"Length": "6100",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"JeanAirport": {
|
||||
"ICAO": "",
|
||||
"Elevation": "2825",
|
||||
"TACAN": "",
|
||||
"Runways:": {
|
||||
"02L": {
|
||||
"Mag Hdg": "020",
|
||||
"Length": "4500",
|
||||
"ILS": ""
|
||||
},
|
||||
"20R": {
|
||||
"Mag Hdg": "200",
|
||||
"Length": "4500",
|
||||
"ILS": ""
|
||||
},
|
||||
"02R": {
|
||||
"Mag Hdg": "020",
|
||||
"Length": "3600",
|
||||
"ILS": ""
|
||||
},
|
||||
"20L": {
|
||||
"Mag Hdg": "200",
|
||||
"Length": "3600",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"LasVegas": {
|
||||
"ICAO": "KLAS",
|
||||
"Elevation": "2178",
|
||||
"TACAN": "116X",
|
||||
"Runways:": {
|
||||
"01L": {
|
||||
"Mag Hdg": "013",
|
||||
"Length": "8000",
|
||||
"ILS": ""
|
||||
},
|
||||
"19R": {
|
||||
"Mag Hdg": "193",
|
||||
"Length": "8000",
|
||||
"ILS": ""
|
||||
},
|
||||
"01R": {
|
||||
"Mag Hdg": "013",
|
||||
"Length": "8000",
|
||||
"ILS": ""
|
||||
},
|
||||
"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": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"LaughlinAirport": {
|
||||
"ICAO": "KIFP",
|
||||
"Elevation": "673",
|
||||
"TACAN": "",
|
||||
"Runways:": {
|
||||
"16": {
|
||||
"Mag Hdg": "164",
|
||||
"Length": "7100",
|
||||
"ILS": ""
|
||||
},
|
||||
"34": {
|
||||
"Mag Hdg": "344",
|
||||
"Length": "7100",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"LincolnCountyAirport": {
|
||||
"ICAO": "",
|
||||
"Elevation": "4816",
|
||||
"TACAN": "",
|
||||
"Runways:": {
|
||||
"17": {
|
||||
"Mag Hdg": "170",
|
||||
"Length": "4500",
|
||||
"ILS": ""
|
||||
},
|
||||
"35": {
|
||||
"Mag Hdg": "350",
|
||||
"Length": "4500",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"MesquiteAirport": {
|
||||
"ICAO": "67L",
|
||||
"Elevation": "1859",
|
||||
"TACAN": "",
|
||||
"Runways:": {
|
||||
"01": {
|
||||
"Mag Hdg": "017",
|
||||
"Length": "5000",
|
||||
"ILS": ""
|
||||
},
|
||||
"19": {
|
||||
"Mag Hdg": "197",
|
||||
"Length": "5000",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"MinahAirport_3Q0": {
|
||||
"ICAO": "",
|
||||
"Elevation": "4560",
|
||||
"TACAN": "",
|
||||
"Runways:": {
|
||||
"13": {
|
||||
"Mag Hdg": "140",
|
||||
"Length": "4100",
|
||||
"ILS": ""
|
||||
},
|
||||
"31": {
|
||||
"Mag Hdg": "320",
|
||||
"Length": "4100",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"nellis": {
|
||||
"ICAO": "KLSV",
|
||||
"Elevation": "1849",
|
||||
"TACAN": "12X",
|
||||
"Runways:": {
|
||||
"03L": {
|
||||
"Mag Hdg": "029",
|
||||
"Length": "9800",
|
||||
"ILS": ""
|
||||
},
|
||||
"21R": {
|
||||
"Mag Hdg": "209",
|
||||
"Length": "9800",
|
||||
"ILS": ""
|
||||
},
|
||||
"03R": {
|
||||
"Mag Hdg": "029",
|
||||
"Length": "9800",
|
||||
"ILS": ""
|
||||
},
|
||||
"21L": {
|
||||
"Mag Hdg": "209",
|
||||
"Length": "9800",
|
||||
"ILS": "109.10"
|
||||
}
|
||||
}
|
||||
},
|
||||
"NorthLasVegasAirport": {
|
||||
"ICAO": "KVGT",
|
||||
"Elevation": "2228",
|
||||
"TACAN": "",
|
||||
"Runways:": {
|
||||
"07": {
|
||||
"Mag Hdg": "076",
|
||||
"Length": "4900",
|
||||
"ILS": ""
|
||||
},
|
||||
"25": {
|
||||
"Mag Hdg": "256",
|
||||
"Length": "4900",
|
||||
"ILS": ""
|
||||
},
|
||||
"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": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"PahuteMesaAirstrip": {
|
||||
"ICAO": "",
|
||||
"Elevation": "5059",
|
||||
"TACAN": "",
|
||||
"Runways:": {
|
||||
"18": {
|
||||
"Mag Hdg": "182",
|
||||
"Length": "5500",
|
||||
"ILS": ""
|
||||
},
|
||||
"36": {
|
||||
"Mag Hdg": "002",
|
||||
"Length": "5500",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"TonopahAirport": {
|
||||
"ICAO": "KTPH",
|
||||
"Elevation": "5390",
|
||||
"TACAN": "119X",
|
||||
"Runways:": {
|
||||
"11": {
|
||||
"Mag Hdg": "113",
|
||||
"Length": "5600",
|
||||
"ILS": ""
|
||||
},
|
||||
"29": {
|
||||
"Mag Hdg": "293",
|
||||
"Length": "5600",
|
||||
"ILS": ""
|
||||
},
|
||||
"15": {
|
||||
"Mag Hdg": "153",
|
||||
"Length": "6800",
|
||||
"ILS": ""
|
||||
},
|
||||
"33": {
|
||||
"Mag Hdg": "333",
|
||||
"Length": "6800",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"TonopathAFB": {
|
||||
"ICAO": "KTNX",
|
||||
"Elevation": "5535",
|
||||
"TACAN": "77X",
|
||||
"Runways:": {
|
||||
"14": {
|
||||
"Mag Hdg": "145",
|
||||
"Length": "11700",
|
||||
"ILS": "108.30"
|
||||
},
|
||||
"32": {
|
||||
"Mag Hdg": "325",
|
||||
"Length": "11700",
|
||||
"ILS": "111.70"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,567 +0,0 @@
|
||||
{
|
||||
"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": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Ai_Ain_International_Airport": {
|
||||
"ICAO": "OMAL",
|
||||
"Elevation": "814",
|
||||
"TACAN": "",
|
||||
"Runways:": {
|
||||
"01": {
|
||||
"Mag Hdg": "006",
|
||||
"Length": "12800",
|
||||
"ILS": ""
|
||||
},
|
||||
"19": {
|
||||
"Mag Hdg": "186",
|
||||
"Length": "12800",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"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": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,995 +0,0 @@
|
||||
{
|
||||
"airfields": {
|
||||
"Abu_al-Duhur": {
|
||||
"ICAO": "OS57",
|
||||
"Elevation": "820",
|
||||
"TACAN": "",
|
||||
"Runways:": {
|
||||
"09": {
|
||||
"Mag Hdg": "088",
|
||||
"Length": "9200",
|
||||
"ILS": ""
|
||||
},
|
||||
"27": {
|
||||
"Mag Hdg": "268",
|
||||
"Length": "9200",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Adana": {
|
||||
"ICAO": "LTAF",
|
||||
"Elevation": "56",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"05": {
|
||||
"Mag Hdg": "050",
|
||||
"Length": "8800",
|
||||
"ILS": "108.70"
|
||||
},
|
||||
"23": {
|
||||
"Mag Hdg": "230",
|
||||
"Length": "8800",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Akrotiri": {
|
||||
"ICAO": "LCRA",
|
||||
"Elevation": "69",
|
||||
"TACAN": "107X",
|
||||
"Runways": {
|
||||
"10": {
|
||||
"Mag Hdg": "106",
|
||||
"Length": "8800",
|
||||
"ILS": ""
|
||||
},
|
||||
"28": {
|
||||
"Mag Hdg": "286",
|
||||
"Length": "8800",
|
||||
"ILS": "109.70"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Al_Qusayr": {
|
||||
"ICAO": "OS70",
|
||||
"Elevation": "1729",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"10": {
|
||||
"Mag Hdg": "096",
|
||||
"Length": "9500",
|
||||
"ILS": ""
|
||||
},
|
||||
"28": {
|
||||
"Mag Hdg": "276",
|
||||
"Length": "9500",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Dumayr": {
|
||||
"ICAO": "OS61",
|
||||
"Elevation": "2067",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"06": {
|
||||
"Mag Hdg": "060",
|
||||
"Length": "9500",
|
||||
"ILS": ""
|
||||
},
|
||||
"24": {
|
||||
"Mag Hdg": "240",
|
||||
"Length": "9500",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Aleppo": {
|
||||
"ICAO": "OSAP",
|
||||
"Elevation": "1254",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"09": {
|
||||
"Mag Hdg": "092",
|
||||
"Length": "9200",
|
||||
"ILS": ""
|
||||
},
|
||||
"27": {
|
||||
"Mag Hdg": "272",
|
||||
"Length": "9200",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"An_Nasiriyah": {
|
||||
"ICAO": "OSAP",
|
||||
"Elevation": "1254",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"09": {
|
||||
"Mag Hdg": "092",
|
||||
"Length": "9200",
|
||||
"ILS": ""
|
||||
},
|
||||
"27": {
|
||||
"Mag Hdg": "272",
|
||||
"Length": "9200",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"At_Tanf": {
|
||||
"ICAO": "",
|
||||
"Elevation": "2329",
|
||||
"TACAN": "",
|
||||
"Runways": ""
|
||||
},
|
||||
"Bassel_Al-Assad": {
|
||||
"ICAO": "OSLK",
|
||||
"Elevation": "92",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"17L": {
|
||||
"Mag Hdg": "173",
|
||||
"Length": "7900",
|
||||
"ILS": ""
|
||||
},
|
||||
"35R": {
|
||||
"Mag Hdg": "353",
|
||||
"Length": "7900",
|
||||
"ILS": ""
|
||||
},
|
||||
"17R": {
|
||||
"Mag Hdg": "173",
|
||||
"Length": "8900",
|
||||
"ILS": "109.10"
|
||||
},
|
||||
"35L": {
|
||||
"Mag Hdg": "353",
|
||||
"Length": "8900",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Beirut": {
|
||||
"ICAO": "OLBA",
|
||||
"Elevation": "39",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"03": {
|
||||
"Mag Hdg": "030",
|
||||
"Length": "7000",
|
||||
"ILS": "110.70"
|
||||
},
|
||||
"21": {
|
||||
"Mag Hdg": "210",
|
||||
"Length": "7000",
|
||||
"ILS": ""
|
||||
},
|
||||
"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": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Damascus": {
|
||||
"ICAO": "OSDI",
|
||||
"Elevation": "2008",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"05L": {
|
||||
"Mag Hdg": "045",
|
||||
"Length": "11600",
|
||||
"ILS": ""
|
||||
},
|
||||
"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": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Deir_ez_Zor": {
|
||||
"ICAO": "OSDZ",
|
||||
"Elevation": "713",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"10": {
|
||||
"Mag Hdg": "104",
|
||||
"Length": "9500",
|
||||
"ILS": ""
|
||||
},
|
||||
"28": {
|
||||
"Mag Hdg": "284",
|
||||
"Length": "9500",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Ercan": {
|
||||
"ICAO": "LCEN",
|
||||
"Elevation": "312",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"11": {
|
||||
"Mag Hdg": "110",
|
||||
"Length": "8700",
|
||||
"ILS": ""
|
||||
},
|
||||
"29": {
|
||||
"Mag Hdg": "290",
|
||||
"Length": "8700",
|
||||
"ILS": "108.30"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Eyn_Shemer": {
|
||||
"ICAO": "LLES",
|
||||
"Elevation": "110",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"09": {
|
||||
"Mag Hdg": "095",
|
||||
"Length": "4000",
|
||||
"ILS": ""
|
||||
},
|
||||
"27": {
|
||||
"Mag Hdg": "2750",
|
||||
"Length": "4000",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Gaziantep": {
|
||||
"ICAO": "LTAJ",
|
||||
"Elevation": "2290",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"10": {
|
||||
"Mag Hdg": "100",
|
||||
"Length": "9100",
|
||||
"ILS": ""
|
||||
},
|
||||
"28": {
|
||||
"Mag Hdg": "280",
|
||||
"Length": "9100",
|
||||
"ILS": "109.10"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Gazipasa": {
|
||||
"ICAO": "LTFG",
|
||||
"Elevation": "130",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"08": {
|
||||
"Mag Hdg": "080",
|
||||
"Length": "7500",
|
||||
"ILS": "108.50"
|
||||
},
|
||||
"26": {
|
||||
"Mag Hdg": "260",
|
||||
"Length": "7500",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Gecitkale": {
|
||||
"ICAO": "LCGK",
|
||||
"Elevation": "148",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"09": {
|
||||
"Mag Hdg": "088",
|
||||
"Length": "9100",
|
||||
"ILS": "108.50"
|
||||
},
|
||||
"27": {
|
||||
"Mag Hdg": "268",
|
||||
"Length": "9100",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"H3": {
|
||||
"ICAO": "",
|
||||
"Elevation": "2583",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"06": {
|
||||
"Mag Hdg": "059",
|
||||
"Length": "9800",
|
||||
"ILS": ""
|
||||
},
|
||||
"24": {
|
||||
"Mag Hdg": "239",
|
||||
"Length": "9800",
|
||||
"ILS": ""
|
||||
},
|
||||
"11": {
|
||||
"Mag Hdg": "107",
|
||||
"Length": "9500",
|
||||
"ILS": ""
|
||||
},
|
||||
"29": {
|
||||
"Mag Hdg": "287",
|
||||
"Length": "9500",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"H3_Northwest": {
|
||||
"ICAO": "",
|
||||
"Elevation": "2582",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"12": {
|
||||
"Mag Hdg": "117",
|
||||
"Length": "8000",
|
||||
"ILS": ""
|
||||
},
|
||||
"30": {
|
||||
"Mag Hdg": "297",
|
||||
"Length": "8000",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"H3_Southwest": {
|
||||
"ICAO": "",
|
||||
"Elevation": "2671",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"12": {
|
||||
"Mag Hdg": "116",
|
||||
"Length": "8000",
|
||||
"ILS": ""
|
||||
},
|
||||
"30": {
|
||||
"Mag Hdg": "296",
|
||||
"Length": "8000",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"H4": {
|
||||
"ICAO": "OJHR",
|
||||
"Elevation": "2257",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"10": {
|
||||
"Mag Hdg": "098",
|
||||
"Length": "8000",
|
||||
"ILS": ""
|
||||
},
|
||||
"28": {
|
||||
"Mag Hdg": "278",
|
||||
"Length": "8000",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Haifa": {
|
||||
"ICAO": "LLHA",
|
||||
"Elevation": "20",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"16": {
|
||||
"Mag Hdg": "157",
|
||||
"Length": "3300",
|
||||
"ILS": ""
|
||||
},
|
||||
"34": {
|
||||
"Mag Hdg": "337",
|
||||
"Length": "3300",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Hama": {
|
||||
"ICAO": "OS58",
|
||||
"Elevation": "984",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"09": {
|
||||
"Mag Hdg": "095",
|
||||
"Length": "8600",
|
||||
"ILS": ""
|
||||
},
|
||||
"27": {
|
||||
"Mag Hdg": "275",
|
||||
"Length": "8600",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Hatay": {
|
||||
"ICAO": "LTDA",
|
||||
"Elevation": "253",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"04": {
|
||||
"Mag Hdg": "039",
|
||||
"Length": "9600",
|
||||
"ILS": "108.90"
|
||||
},
|
||||
"22": {
|
||||
"Mag Hdg": "219",
|
||||
"Length": "9600",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Incirlik": {
|
||||
"ICAO": "LTAG",
|
||||
"Elevation": "230",
|
||||
"TACAN": "21X",
|
||||
"Runways": {
|
||||
"05": {
|
||||
"Mag Hdg": "049",
|
||||
"Length": "9600",
|
||||
"ILS": "109.30"
|
||||
},
|
||||
"23": {
|
||||
"Mag Hdg": "229",
|
||||
"Length": "9500",
|
||||
"ILS": "111.70"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Jirah": {
|
||||
"ICAO": "OS62",
|
||||
"Elevation": "1173",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"10": {
|
||||
"Mag Hdg": "095",
|
||||
"Length": "9600",
|
||||
"ILS": ""
|
||||
},
|
||||
"28": {
|
||||
"Mag Hdg": "275",
|
||||
"Length": "9600",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Khalkhalah": {
|
||||
"ICAO": "OS69",
|
||||
"Elevation": "2418",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"07": {
|
||||
"Mag Hdg": "071",
|
||||
"Length": "9500",
|
||||
"ILS": ""
|
||||
},
|
||||
"25": {
|
||||
"Mag Hdg": "251",
|
||||
"Length": "9500",
|
||||
"ILS": ""
|
||||
},
|
||||
"15": {
|
||||
"Mag Hdg": "146",
|
||||
"Length": "8300",
|
||||
"ILS": ""
|
||||
},
|
||||
"33": {
|
||||
"Mag Hdg": "326",
|
||||
"Length": "8300",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Kharab_Ishk": {
|
||||
"ICAO": "",
|
||||
"Elevation": "1416",
|
||||
"TACAN": "",
|
||||
"Runways": ""
|
||||
},
|
||||
"King_Hussein": {
|
||||
"ICAO": "OJMF",
|
||||
"Elevation": "2205",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"13": {
|
||||
"Mag Hdg": "127",
|
||||
"Length": "9500",
|
||||
"ILS": ""
|
||||
},
|
||||
"31": {
|
||||
"Mag Hdg": "307",
|
||||
"Length": "9500",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Kingsfield": {
|
||||
"ICAO": "LCRE",
|
||||
"Elevation": "276",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"06": {
|
||||
"Mag Hdg": "058",
|
||||
"Length": "3300",
|
||||
"ILS": ""
|
||||
},
|
||||
"24": {
|
||||
"Mag Hdg": "238",
|
||||
"Length": "3300",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Kiryat_Shmona": {
|
||||
"ICAO": "LLKS",
|
||||
"Elevation": "360",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"03": {
|
||||
"Mag Hdg": "033",
|
||||
"Length": "3500",
|
||||
"ILS": ""
|
||||
},
|
||||
"21": {
|
||||
"Mag Hdg": "213",
|
||||
"Length": "3500",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Kuweires": {
|
||||
"ICAO": "OS66",
|
||||
"Elevation": "1201",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"10": {
|
||||
"Mag Hdg": "095",
|
||||
"Length": "7700",
|
||||
"ILS": ""
|
||||
},
|
||||
"28": {
|
||||
"Mag Hdg": "275",
|
||||
"Length": "7700",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Lakatamia": {
|
||||
"ICAO": "",
|
||||
"Elevation": "758",
|
||||
"TACAN": "",
|
||||
"Runways": ""
|
||||
},
|
||||
"Larnaca": {
|
||||
"ICAO": "LCRE",
|
||||
"Elevation": "16",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"04": {
|
||||
"Mag Hdg": "043",
|
||||
"Length": "8800",
|
||||
"ILS": ""
|
||||
},
|
||||
"22": {
|
||||
"Mag Hdg": "223",
|
||||
"Length": "8800",
|
||||
"ILS": "110.30"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Marj_Al_Sultan": {
|
||||
"ICAO": "",
|
||||
"Elevation": "2008",
|
||||
"TACAN": "",
|
||||
"Runways": ""
|
||||
},
|
||||
"Marj_Ruhayyil": {
|
||||
"ICAO": "OS63",
|
||||
"Elevation": "2161",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"06L": {
|
||||
"Mag Hdg": "059",
|
||||
"Length": "9400",
|
||||
"ILS": ""
|
||||
},
|
||||
"24R": {
|
||||
"Mag Hdg": "239",
|
||||
"Length": "9400",
|
||||
"ILS": ""
|
||||
},
|
||||
"06R": {
|
||||
"Mag Hdg": "059",
|
||||
"Length": "8400",
|
||||
"ILS": ""
|
||||
},
|
||||
"24L": {
|
||||
"Mag Hdg": "239",
|
||||
"Length": "8400",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Megiddo": {
|
||||
"ICAO": "LLMG",
|
||||
"Elevation": "180",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"09": {
|
||||
"Mag Hdg": "088",
|
||||
"Length": "6200",
|
||||
"ILS": ""
|
||||
},
|
||||
"27": {
|
||||
"Mag Hdg": "268",
|
||||
"Length": "6200",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Mezzeh": {
|
||||
"ICAO": "OS67",
|
||||
"Elevation": "2387",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"06": {
|
||||
"Mag Hdg": "056",
|
||||
"Length": "8800",
|
||||
"ILS": ""
|
||||
},
|
||||
"24": {
|
||||
"Mag Hdg": "236",
|
||||
"Length": "8800",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Minakh": {
|
||||
"ICAO": "OS71",
|
||||
"Elevation": "1614",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"10": {
|
||||
"Mag Hdg": "096",
|
||||
"Length": "4500",
|
||||
"ILS": ""
|
||||
},
|
||||
"28": {
|
||||
"Mag Hdg": "276",
|
||||
"Length": "4500",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Naqoura": {
|
||||
"ICAO": "",
|
||||
"Elevation": "381",
|
||||
"TACAN": "",
|
||||
"Runways": ""
|
||||
},
|
||||
"Palmyra": {
|
||||
"ICAO": "OSPR",
|
||||
"Elevation": "1325",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"08": {
|
||||
"Mag Hdg": "079",
|
||||
"Length": "9200",
|
||||
"ILS": ""
|
||||
},
|
||||
"26": {
|
||||
"Mag Hdg": "259",
|
||||
"Length": "9200",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Paphos": {
|
||||
"ICAO": "LCPH",
|
||||
"Elevation": "40",
|
||||
"TACAN": "79X",
|
||||
"Runways": {
|
||||
"11": {
|
||||
"Mag Hdg": "109",
|
||||
"Length": "8600",
|
||||
"ILS": ""
|
||||
},
|
||||
"29": {
|
||||
"Mag Hdg": "289",
|
||||
"Length": "8600",
|
||||
"ILS": "108.90"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Qabr_al_Sitt": {
|
||||
"ICAO": "",
|
||||
"Elevation": "2135",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Rayak": {
|
||||
"ICAO": "OLRA",
|
||||
"Elevation": "3035",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"04": {
|
||||
"Mag Hdg": "042",
|
||||
"Length": "9400",
|
||||
"ILS": ""
|
||||
},
|
||||
"22": {
|
||||
"Mag Hdg": "222",
|
||||
"Length": "9400",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Rene_Mouawad": {
|
||||
"ICAO": "OLKA",
|
||||
"Elevation": "23",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"06": {
|
||||
"Mag Hdg": "058",
|
||||
"Length": "9000",
|
||||
"ILS": ""
|
||||
},
|
||||
"24": {
|
||||
"Mag Hdg": "238",
|
||||
"Length": "9000",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Rosh_Pina": {
|
||||
"ICAO": "LLIB",
|
||||
"Elevation": "914",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"05": {
|
||||
"Mag Hdg": "049",
|
||||
"Length": "3200",
|
||||
"ILS": ""
|
||||
},
|
||||
"23": {
|
||||
"Mag Hdg": "229",
|
||||
"Length": "3200",
|
||||
"ILS": ""
|
||||
},
|
||||
"15": {
|
||||
"Mag Hdg": "147",
|
||||
"Length": "2900",
|
||||
"ILS": ""
|
||||
},
|
||||
"33": {
|
||||
"Mag Hdg": "327",
|
||||
"Length": "2900",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Ruwayshid": {
|
||||
"ICAO": "",
|
||||
"Elevation": "2980",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"09": {
|
||||
"Mag Hdg": "091",
|
||||
"Length": "7000",
|
||||
"ILS": ""
|
||||
},
|
||||
"27": {
|
||||
"Mag Hdg": "271",
|
||||
"Length": "7000",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Sanliurfa": {
|
||||
"ICAO": "LTCS",
|
||||
"Elevation": "2703",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"04": {
|
||||
"Mag Hdg": "036",
|
||||
"Length": "12900",
|
||||
"ILS": ""
|
||||
},
|
||||
"22": {
|
||||
"Mag Hdg": "216",
|
||||
"Length": "12900",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Sayqal": {
|
||||
"ICAO": "OS68",
|
||||
"Elevation": "2274",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"05": {
|
||||
"Mag Hdg": "055",
|
||||
"Length": "7600",
|
||||
"ILS": ""
|
||||
},
|
||||
"23": {
|
||||
"Mag Hdg": "235",
|
||||
"Length": "7600",
|
||||
"ILS": ""
|
||||
},
|
||||
"08": {
|
||||
"Mag Hdg": "085",
|
||||
"Length": "9500",
|
||||
"ILS": ""
|
||||
},
|
||||
"26": {
|
||||
"Mag Hdg": "265",
|
||||
"Length": "9500",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Shayrat": {
|
||||
"ICAO": "OS65",
|
||||
"Elevation": "2638",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"11": {
|
||||
"Mag Hdg": "107",
|
||||
"Length": "9300",
|
||||
"ILS": ""
|
||||
},
|
||||
"29": {
|
||||
"Mag Hdg": "287",
|
||||
"Length": "9300",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Tabqa": {
|
||||
"ICAO": "OS59",
|
||||
"Elevation": "1099",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"09": {
|
||||
"Mag Hdg": "088",
|
||||
"Length": "9300",
|
||||
"ILS": ""
|
||||
},
|
||||
"27": {
|
||||
"Mag Hdg": "268",
|
||||
"Length": "9300",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Taftanaz": {
|
||||
"ICAO": "",
|
||||
"Elevation": "",
|
||||
"TACAN": "",
|
||||
"Runways": ""
|
||||
},
|
||||
"Tal_Siman": {
|
||||
"ICAO": "",
|
||||
"Elevation": "",
|
||||
"TACAN": "",
|
||||
"Runways": ""
|
||||
},
|
||||
"thalah": {
|
||||
"ICAO": "OS60",
|
||||
"Elevation": "2414",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"05": {
|
||||
"Mag Hdg": "053",
|
||||
"Length": "9500",
|
||||
"ILS": ""
|
||||
},
|
||||
"23": {
|
||||
"Mag Hdg": "233",
|
||||
"Length": "9500",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Tiyas": {
|
||||
"ICAO": "OS72",
|
||||
"Elevation": "1798",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"09": {
|
||||
"Mag Hdg": "085",
|
||||
"Length": "9500",
|
||||
"ILS": ""
|
||||
},
|
||||
"27": {
|
||||
"Mag Hdg": "265",
|
||||
"Length": "9500",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"Wujah_Al_Hajar": {
|
||||
"ICAO": "Z190",
|
||||
"Elevation": "641",
|
||||
"TACAN": "",
|
||||
"Runways": {
|
||||
"02": {
|
||||
"Mag Hdg": "024",
|
||||
"Length": "4800",
|
||||
"ILS": ""
|
||||
},
|
||||
"20": {
|
||||
"Mag Hdg": "204",
|
||||
"Length": "4800",
|
||||
"ILS": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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 {
|
||||
@ -21,12 +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());
|
||||
|
||||
this.#setAirbaseData();
|
||||
|
||||
this.clip();
|
||||
}
|
||||
|
||||
setName(airbaseName: string) {
|
||||
@ -75,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 );
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2,33 +2,61 @@ 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
|
||||
}
|
||||
|
||||
export class Airbase extends CustomMarker
|
||||
{
|
||||
|
||||
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[] = [];
|
||||
|
||||
constructor(options: AirbaseOptions)
|
||||
{
|
||||
constructor(options: AirbaseOptions) {
|
||||
super(options.position, { riseOnHover: true });
|
||||
|
||||
this.#name = options.name;
|
||||
}
|
||||
|
||||
chartDataHasBeenSet() {
|
||||
return this.#hasChartDataBeenSet;
|
||||
}
|
||||
|
||||
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");
|
||||
@ -41,44 +69,45 @@ export class Airbase extends CustomMarker
|
||||
el.dataset.coalition = this.#coalition;
|
||||
}
|
||||
|
||||
setCoalition(coalition: string)
|
||||
{
|
||||
setCoalition(coalition: string) {
|
||||
this.#coalition = coalition;
|
||||
(<HTMLElement> this.getElement()?.querySelector(".airbase-icon")).dataset.coalition = this.#coalition;
|
||||
(<HTMLElement>this.getElement()?.querySelector(".airbase-icon")).dataset.coalition = this.#coalition;
|
||||
}
|
||||
|
||||
getCoalition()
|
||||
{
|
||||
getChartData() {
|
||||
return this.#chartData;
|
||||
}
|
||||
|
||||
getCoalition() {
|
||||
return this.#coalition;
|
||||
}
|
||||
|
||||
setName(name: string)
|
||||
{
|
||||
setName(name: string) {
|
||||
this.#name = name;
|
||||
}
|
||||
|
||||
getName()
|
||||
{
|
||||
getName() {
|
||||
return this.#name;
|
||||
}
|
||||
|
||||
setProperties(properties: string[])
|
||||
{
|
||||
setChartData(chartData: AirbaseChartData) {
|
||||
this.#hasChartDataBeenSet = true;
|
||||
this.#chartData = chartData;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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";
|
||||
@ -49,23 +49,25 @@ 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
updateMission(data: MissionData) {
|
||||
if (data.mission) {
|
||||
|
||||
/* Set the mission theatre */
|
||||
if (data.mission.theatre != this.#theatre) {
|
||||
this.#theatre = data.mission.theatre;
|
||||
@ -231,4 +233,24 @@ export class MissionHandler {
|
||||
#onAirbaseClick(e: any) {
|
||||
getMap().showAirbaseContextMenu(e.originalEvent.x, e.originalEvent.y, e.latlng, e.sourceTarget);
|
||||
}
|
||||
|
||||
#loadAirbaseChartData(callsign: string) {
|
||||
if ( !this.#theatre ) {
|
||||
return;
|
||||
}
|
||||
|
||||
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`)
|
||||
}
|
||||
};
|
||||
xhr.send();
|
||||
}
|
||||
}
|
||||
@ -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();
|
||||
});
|
||||
|
||||
}
|
||||
@ -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);
|
||||
}));
|
||||
|
||||
@ -4,7 +4,7 @@ import { UnitDatabase } from "./unitdatabase"
|
||||
|
||||
export class AircraftDatabase extends UnitDatabase {
|
||||
constructor() {
|
||||
super('databases/aircraftdatabase.json');
|
||||
super('databases/units/aircraftdatabase.json');
|
||||
}
|
||||
|
||||
getCategory() {
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -721,8 +721,7 @@ export class Unit extends CustomMarker {
|
||||
if (!this.#preventClick) {
|
||||
console.log( getMap().getState() );
|
||||
if (getMap().getState() === IDLE || getMap().getState() === MOVE_UNIT || e.originalEvent.ctrlKey) {
|
||||
|
||||
if (!e.originalEvent.ctrlKey) {
|
||||
if (!e.originalEvent.ctrlKey)
|
||||
getUnitsManager().deselectAllUnits();
|
||||
}
|
||||
|
||||
@ -742,9 +741,8 @@ export class Unit extends CustomMarker {
|
||||
if ( unitIsSelected ) {
|
||||
document.dispatchEvent( new CustomEvent( "unitSelected", detail ) );
|
||||
} else {
|
||||
document.dispatchEvent( new CustomEvent( "unitDeselected", detail ) );
|
||||
document.dispatchEvent( new CustomEvent( "unitDeselection", { "detail": this }));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -211,12 +211,23 @@
|
||||
|
||||
<div id="airbase-contextmenu" class="ol-panel" oncontextmenu="return false;">
|
||||
<h3 id="airbase-name"></h3>
|
||||
<div id="airbase-properties"></div>
|
||||
|
||||
<hr />
|
||||
|
||||
<h4>Parking available:</h4>
|
||||
<div id="airbase-parking"></div>
|
||||
<dl id="airbase-chart-data" class="ol-data-grid">
|
||||
<dt>ICAO</dt>
|
||||
<dd data-point="ICAO"></dd>
|
||||
<dt>Coalition</dt>
|
||||
<dd data-point="coalition"></dd>
|
||||
<dt>Elevation</dt>
|
||||
<dd><span data-point="elevation"></span>ft</dd>
|
||||
<dt>TACAN</dt>
|
||||
<dd data-point="TACAN"></dd>
|
||||
</dl>
|
||||
|
||||
<h4>Runways</h4>
|
||||
<div id="airbase-runways">
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<button id="spawn-airbase-aircraft-button" data-coalition="blue" title="Spawn aircraft" data-on-click="contextMenuSpawnAirbase" class="deploy-unit-button">Spawn</button>
|
||||
<button id="land-here-button" title="Land here" data-on-click="contextMenuLandAirbase" class="hide">Land here</button>
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
<div id="app-summary">
|
||||
<h2>DCS Olympus</h2>
|
||||
<h4>Dynamic Unit Command</h4>
|
||||
<div class="app-version">Version <span class="app-version-number">v0.4.2-alpha</span></div>
|
||||
<div class="app-version">Version <span class="app-version-number">v0.4.3-alpha</span></div>
|
||||
</div>
|
||||
|
||||
<div id="authentication-form">
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
<div class="ol-select-options">
|
||||
<div id="toolbar-summary">
|
||||
<h3>DCS Olympus</h3>
|
||||
<div class="accent-green app-version-number">version v0.4.2-alpha</div>
|
||||
<div class="accent-green app-version-number">version v0.4.3-alpha</div>
|
||||
</div>
|
||||
<div>
|
||||
<a href="https://www.discord.com" target="_blank">Discord</a>
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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."),
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
local version = "v0.4.2-alpha"
|
||||
local version = "v0.4.3-alpha"
|
||||
|
||||
local debug = false
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
local version = 'v0.4.2-alpha'
|
||||
local version = 'v0.4.3-alpha'
|
||||
|
||||
Olympus = {}
|
||||
Olympus.OlympusDLL = nil
|
||||
|
||||
@ -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)
|
||||
@ -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)
|
||||
File diff suppressed because it is too large
Load Diff
@ -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)
|
||||
@ -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 ()
|
||||
@ -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)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -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)
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@ -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"
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user