From a89691620431eeeb09e456fe97f478a20ff4f681 Mon Sep 17 00:00:00 2001 From: dpassoni Date: Fri, 10 Mar 2023 17:43:54 +0100 Subject: [PATCH] Completed contextmenu, only missing is callback for smoke spawning --- client/demo.js | 303 ++- client/public/stylesheets/contextmenu.css | 62 +- client/src/controls/contextmenu.ts | 73 +- client/src/map/map.ts | 11 +- client/src/server/server.ts | 6 +- client/src/units/aircraftdatabase.ts | 1 - client/src/units/groundunitsdatabase.ts | 2766 +++++++++++++++++++++ client/src/units/unit.ts | 77 +- client/src/units/unitdatabase.ts | 7 + client/src/units/unittypes.ts | 207 -- client/views/contextmenu.ejs | 41 +- 11 files changed, 3221 insertions(+), 333 deletions(-) create mode 100644 client/src/units/groundunitsdatabase.ts delete mode 100644 client/src/units/unittypes.ts diff --git a/client/demo.js b/client/demo.js index ae0cbd04..f35bd7bc 100644 --- a/client/demo.js +++ b/client/demo.js @@ -1,44 +1,251 @@ const DEMO_UNIT_DATA = { - AI: true, - name: "F-5E", - unitName: "Olympus 1-1", - groupName: "Group 1", - alive: true, - category: "Aircraft", - flightData: { - latitude: 37.2, - longitude: -115.8, - altitude: 2000, - heading: 0.5, - speed: 300 + ["1"]:{ + AI: true, + name: "F-5E", + unitName: "Olympus 1-1", + groupName: "Group 1", + alive: true, + category: "Aircraft", + flightData: { + latitude: 37.2, + longitude: -115.8, + altitude: 2000, + heading: 0.5, + speed: 300 + }, + missionData: { + fuel: 0.5, + flags: {human: false}, + ammo: [], + targets: [], + hasTask: true, + coalition: "blue" + }, + formationData: { + formation: "Echelon", + isLeader: false, + isWingman: false, + leaderID: null, + wingmen: [], + wingmenIDs: [] + }, + taskData: { + currentTask: "Example task", + activePath: undefined, + targetSpeed: 400, + targetAltitude: 3000 + }, + optionsData: { + ROE: "None", + reactionToThreat: "None", + } }, - missionData: { - fuel: 0.5, - flags: {human: false}, - ammo: [], - targets: [], - hasTask: true, - coalition: "blue" + ["2"]:{ + AI: true, + name: "F-5E", + unitName: "Olympus 1-2", + groupName: "Group 1", + alive: true, + category: "Aircraft", + flightData: { + latitude: 37.2, + longitude: -115.75, + altitude: 2000, + heading: 0.5, + speed: 300 + }, + missionData: { + fuel: 0.5, + flags: {human: false}, + ammo: [], + targets: [], + hasTask: true, + coalition: "red" + }, + formationData: { + formation: "Echelon", + isLeader: false, + isWingman: false, + leaderID: null, + wingmen: [], + wingmenIDs: [] + }, + taskData: { + currentTask: "Example task", + activePath: undefined, + targetSpeed: 400, + targetAltitude: 3000 + }, + optionsData: { + ROE: "None", + reactionToThreat: "None", + } }, - formationData: { - formation: "Echelon", - isLeader: false, - isWingman: false, - leaderID: null, - wingmen: [], - wingmenIDs: [] + ["3"]:{ + AI: true, + name: "2S6 Tunguska", + unitName: "Olympus 1-3", + groupName: "Group 1", + alive: true, + category: "GroundUnit", + flightData: { + latitude: 37.175, + longitude: -115.8, + altitude: 2000, + heading: 0.5, + speed: 300 + }, + missionData: { + fuel: 0.5, + flags: {human: false}, + ammo: [], + targets: [], + hasTask: true, + coalition: "blue" + }, + formationData: { + formation: "Echelon", + isLeader: false, + isWingman: false, + leaderID: null, + wingmen: [], + wingmenIDs: [] + }, + taskData: { + currentTask: "Example task", + activePath: undefined, + targetSpeed: 400, + targetAltitude: 3000 + }, + optionsData: { + ROE: "None", + reactionToThreat: "None", + } }, - taskData: { - currentTask: "Example task", - activePath: undefined, - targetSpeed: 400, - targetAltitude: 3000 + ["4"]:{ + AI: true, + name: "2S6 Tunguska", + unitName: "Olympus 1-4", + groupName: "Group 1", + alive: true, + category: "GroundUnit", + flightData: { + latitude: 37.175, + longitude: -115.75, + altitude: 2000, + heading: 0.5, + speed: 300 + }, + missionData: { + fuel: 0.5, + flags: {human: false}, + ammo: [], + targets: [], + hasTask: true, + coalition: "red" + }, + formationData: { + formation: "Echelon", + isLeader: false, + isWingman: false, + leaderID: null, + wingmen: [], + wingmenIDs: [] + }, + taskData: { + currentTask: "Example task", + activePath: undefined, + targetSpeed: 400, + targetAltitude: 3000 + }, + optionsData: { + ROE: "None", + reactionToThreat: "None", + } }, - optionsData: { - ROE: "None", - reactionToThreat: "None", - } + ["5"]:{ + AI: true, + name: "M-60", + unitName: "Olympus 1-3", + groupName: "Group 1", + alive: true, + category: "GroundUnit", + flightData: { + latitude: 37.15, + longitude: -115.8, + altitude: 2000, + heading: 0.5, + speed: 300 + }, + missionData: { + fuel: 0.5, + flags: {human: false}, + ammo: [], + targets: [], + hasTask: true, + coalition: "blue" + }, + formationData: { + formation: "Echelon", + isLeader: false, + isWingman: false, + leaderID: null, + wingmen: [], + wingmenIDs: [] + }, + taskData: { + currentTask: "Example task", + activePath: undefined, + targetSpeed: 400, + targetAltitude: 3000 + }, + optionsData: { + ROE: "None", + reactionToThreat: "None", + } + }, + ["6"]:{ + AI: true, + name: "M-60", + unitName: "Olympus 1-4", + groupName: "Group 1", + alive: true, + category: "GroundUnit", + flightData: { + latitude: 37.15, + longitude: -115.75, + altitude: 2000, + heading: 0.5, + speed: 300 + }, + missionData: { + fuel: 0.5, + flags: {human: false}, + ammo: [], + targets: [], + hasTask: true, + coalition: "red" + }, + formationData: { + formation: "Echelon", + isLeader: false, + isWingman: false, + leaderID: null, + wingmen: [], + wingmenIDs: [] + }, + taskData: { + currentTask: "Example task", + activePath: undefined, + targetSpeed: 400, + targetAltitude: 3000 + }, + optionsData: { + ROE: "None", + reactionToThreat: "None", + } + } } class DemoDataGenerator { @@ -53,11 +260,11 @@ class DemoDataGenerator { } unitsUpdate(req, res){ - Object.keys(this.demoUnits.units).forEach((ID) => { - this.demoUnits.units[ID].flightData.heading += 0.05; - this.demoUnits.units[ID].flightData.latitude += 0.001 * Math.cos(this.demoUnits.units[ID].flightData.heading); - this.demoUnits.units[ID].flightData.longitude += 0.001 * Math.sin(this.demoUnits.units[ID].flightData.heading); - }); + //Object.keys(this.demoUnits.units).forEach((ID) => { + // this.demoUnits.units[ID].flightData.heading += 0.05; + // this.demoUnits.units[ID].flightData.latitude += 0.001 * Math.cos(this.demoUnits.units[ID].flightData.heading); + // this.demoUnits.units[ID].flightData.longitude += 0.001 * Math.sin(this.demoUnits.units[ID].flightData.heading); + //}); var ret = this.demoUnits; res.send(JSON.stringify(ret)); }; @@ -79,14 +286,14 @@ class DemoDataGenerator { generateRandomUnitsDemoData(unitsNumber) { - var units = {}; - for (let i = 0; i < unitsNumber; i++) - { - units[String(i)] = JSON.parse(JSON.stringify(DEMO_UNIT_DATA)); - units[String(i)].flightData.latitude += (Math.random() - 0.5) * 0.3; - units[String(i)].flightData.longitude += (Math.random() - 0.5) * 0.3; - } - return {"units": units}; + //var units = {}; + //for (let i = 0; i < unitsNumber; i++) + //{ + // units[String(i)] = JSON.parse(JSON.stringify(DEMO_UNIT_DATA)); + // units[String(i)].flightData.latitude += (Math.random() - 0.5) * 0.3; + // units[String(i)].flightData.longitude += (Math.random() - 0.5) * 0.3; + //} + return {"units": DEMO_UNIT_DATA}; } } diff --git a/client/public/stylesheets/contextmenu.css b/client/public/stylesheets/contextmenu.css index b1cb6af1..674885fa 100644 --- a/client/public/stylesheets/contextmenu.css +++ b/client/public/stylesheets/contextmenu.css @@ -15,6 +15,10 @@ height: fit-content; } +#ground-unit-spawn-menu { + height: fit-content; +} + #active-coalition-label { position: absolute; top: -28px; @@ -57,12 +61,7 @@ margin: 0px; } -#contextmenu>div:nth-child(3)>button { - width: 100%; - text-align: left; -} - -#contextmenu>div:nth-child(3){ +#contextmenu>div:nth-child(n+3){ display: flex; flex-direction: column; @@ -77,22 +76,23 @@ align-self: stretch; } -#contextmenu>div:nth-child(3)>button:last-of-type { +#aircraft-spawn-menu>button, +#ground-unit-spawn-menu>button { width: 100%; text-align: center; } -#unit-spawn-aircraft { +#aircraft-spawn-button { background-image: var( --spawn-aircraft-url ); background-size: 48px; } -#unit-spawn-ground { +#ground-unit-spawn-button { background-image: var( --spawn-ground-url ); background-size: 48px; } -#unit-spawn-smoke { +#smoke-spawn-button { background-image: var( --spawn-smoke-url ); background-size: 48px; } @@ -115,7 +115,7 @@ [data-active-coalition=blue].unit-spawn-button:hover, [data-active-coalition=blue].unit-spawn-button.is-open, [data-active-coalition=blue]#active-coalition-label, -[data-active-coalition=blue]#deploy-unit-button +[data-active-coalition=blue].deploy-unit-button { background-color: var(--primary-blue) } @@ -124,17 +124,17 @@ [data-active-coalition=red].unit-spawn-button:hover, [data-active-coalition=red].unit-spawn-button.is-open, [data-active-coalition=red]#active-coalition-label, -[data-active-coalition=red]#deploy-unit-button +[data-active-coalition=red].deploy-unit-button { background-color: var(--primary-red) } -[data-active-coalition=blue]#deploy-unit-button:disabled { +[data-active-coalition=blue].deploy-unit-button:disabled { background-color: transparent; border: 1px solid var(--primary-blue); cursor: default; } -[data-active-coalition=red]#deploy-unit-button:disabled { +[data-active-coalition=red].deploy-unit-button:disabled { background-color: transparent; border: 1px solid var(--primary-red); cursor: default; @@ -168,4 +168,36 @@ filter: invert(100%); margin-top: 10px; margin-bottom: 10px; -} \ No newline at end of file +} + +#smoke-spawn-menu { + display: flex; + flex-direction: column; + align-items: center; + text-align: center; +} + +#smoke-spawn-menu>button { + width: 100%; + text-align: left; + display: flex; + flex-wrap: wrap; + align-items: center; + column-gap: 10px; +} + +#smoke-spawn-menu>button::before { + display: block; + width: 10px; + height: 10px; + border-radius: 999px; + content: ""; +} + +[data-smoke-color=red]::before{ background-color: red; } +[data-smoke-color=white]::before{ background-color: white; } +[data-smoke-color=blue]::before{ background-color: blue; } +[data-smoke-color=green]::before{ background-color: green; } +[data-smoke-color=orange]::before{ background-color: orange; } + + diff --git a/client/src/controls/contextmenu.ts b/client/src/controls/contextmenu.ts index d95f7373..0eca9462 100644 --- a/client/src/controls/contextmenu.ts +++ b/client/src/controls/contextmenu.ts @@ -2,8 +2,9 @@ import { LatLng } from "leaflet"; import { getActiveCoalition, setActiveCoalition } from ".."; import { ContextMenuOption } from "../@types/dom"; import { ClickEvent } from "../map/map"; -import { spawnAircraft } from "../server/server"; +import { spawnAircraft, spawnGroundUnit } from "../server/server"; import { aircraftDatabase } from "../units/aircraftdatabase"; +import { groundUnitsDatabase } from "../units/groundunitsdatabase"; import { Dropdown } from "./dropdown"; export interface SpawnOptions { @@ -21,24 +22,32 @@ export class ContextMenu { #aircraftRoleDropdown: Dropdown; #aircraftTypeDropdown: Dropdown; #aircraftLoadoutDropdown: Dropdown; - //#unitsNumberDropdown: Dropdown; + #groundUnitRoleDropdown: Dropdown; + #groundUnitTypeDropdown: Dropdown; #spawnOptions: SpawnOptions = {role: "", type: "", latlng: this.#latlng, loadout: null, coalition: "blue", airbaseName: null}; constructor(id: string,) { this.#container = document.getElementById(id); this.#container?.querySelector("#context-menu-switch")?.addEventListener('change', (e) => this.#onSwitch(e)); - this.#aircraftRoleDropdown = new Dropdown("role-options", (role: string) => this.#setAircraftRole(role)); - this.#aircraftTypeDropdown = new Dropdown("aircraft-options", (type: string) => this.#setAircraftType(type)); + this.#aircraftRoleDropdown = new Dropdown("aircraft-role-options", (role: string) => this.#setAircraftRole(role)); + this.#aircraftTypeDropdown = new Dropdown("aircraft-type-options", (type: string) => this.#setAircraftType(type)); this.#aircraftLoadoutDropdown = new Dropdown("loadout-options", (loadout: string) => this.#setAircraftLoadout(loadout)); - //this.#unitsNumberDropdown = new Dropdown("#units-options", this.#setAircraftType, [""]); + this.#groundUnitRoleDropdown = new Dropdown("ground-unit-role-options", (role: string) => this.#setGroundUnitRole(role)); + this.#groundUnitTypeDropdown = new Dropdown("ground-unit-type-options", (type: string) => this.#setGroundUnitType(type)); document.addEventListener("contextMenuShow", (e: any) => { this.#container?.querySelector("#aircraft-spawn-menu")?.classList.toggle("hide", e.detail.type !== "aircraft"); - this.#container?.querySelector("#unit-spawn-aircraft")?.classList.toggle("is-open", e.detail.type === "aircraft"); + this.#container?.querySelector("#aircraft-spawn-button")?.classList.toggle("is-open", e.detail.type === "aircraft"); + this.#container?.querySelector("#ground-unit-spawn-menu")?.classList.toggle("hide", e.detail.type !== "ground-unit"); + this.#container?.querySelector("#ground-unit-spawn-button")?.classList.toggle("is-open", e.detail.type === "ground-unit"); + this.#container?.querySelector("#smoke-spawn-menu")?.classList.toggle("hide", e.detail.type !== "smoke"); + this.#container?.querySelector("#smoke-spawn-button")?.classList.toggle("is-open", e.detail.type === "smoke"); this.#resetAircraftRole(); this.#resetAircraftType(); + this.#resetGroundUnitRole(); + this.#resetGroundUnitType(); }) document.addEventListener("contextMenuDeployAircraft", () => { @@ -48,6 +57,13 @@ export class ContextMenu { spawnAircraft(this.#spawnOptions); }) + document.addEventListener("contextMenuDeployGroundUnit", () => { + this.hide(); + this.#spawnOptions.coalition = getActiveCoalition(); + if (this.#spawnOptions) + spawnGroundUnit(this.#spawnOptions); + }) + this.hide(); } @@ -93,8 +109,9 @@ export class ContextMenu { } #resetAircraftRole() { - (this.#container?.querySelector("#deploy-unit-button")).disabled = true; + (this.#container?.querySelector("#aircraft-spawn-menu")?.querySelector(".deploy-unit-button")).disabled = true; (this.#container?.querySelector("#loadout-list")).replaceChildren(); + this.#aircraftRoleDropdown.reset(); this.#aircraftTypeDropdown.reset(); this.#aircraftRoleDropdown.setOptions(aircraftDatabase.getRoles()); } @@ -118,7 +135,7 @@ export class ContextMenu { } #resetAircraftType() { - (this.#container?.querySelector("#deploy-unit-button")).disabled = true; + (this.#container?.querySelector("#aircraft-spawn-menu")?.querySelector(".deploy-unit-button")).disabled = true; (this.#container?.querySelector("#loadout-list")).replaceChildren(); this.#aircraftLoadoutDropdown.reset(); (this.#container?.querySelector("#unit-image")).classList.toggle("hide", true); @@ -132,7 +149,7 @@ export class ContextMenu { if (loadout) { this.#spawnOptions.loadout = loadout.code; - (this.#container?.querySelector("#deploy-unit-button")).disabled = false; + (this.#container?.querySelector("#aircraft-spawn-menu")?.querySelector(".deploy-unit-button")).disabled = false; var items = loadout.items.map((item: any) => {return `${item.quantity}x ${item.name}`;}); items.length == 0? items.push("Empty loadout"): ""; (this.#container?.querySelector("#loadout-list")).replaceChildren( @@ -145,4 +162,42 @@ export class ContextMenu { } } } + + /********* Ground unit spawn menu *********/ + #setGroundUnitRole(role: string) + { + if (this.#spawnOptions != null) + { + this.#spawnOptions.role = role; + this.#resetGroundUnitRole(); + this.#groundUnitTypeDropdown.setOptions(groundUnitsDatabase.getLabelsByRole(role)); + this.#groundUnitTypeDropdown.selectValue(0); + } + } + + #resetGroundUnitRole() { + (this.#container?.querySelector("#ground-unit-spawn-menu")?.querySelector(".deploy-unit-button")).disabled = true; + (this.#container?.querySelector("#loadout-list")).replaceChildren(); + this.#groundUnitRoleDropdown.reset(); + this.#groundUnitTypeDropdown.reset(); + this.#groundUnitRoleDropdown.setOptions(groundUnitsDatabase.getRoles()); + } + + #setGroundUnitType(label: string) + { + if (this.#spawnOptions != null) + { + this.#resetGroundUnitType(); + var type = groundUnitsDatabase.getNameByLabel(label); + if (type != null) + { + this.#spawnOptions.type = type; + (this.#container?.querySelector("#ground-unit-spawn-menu")?.querySelector(".deploy-unit-button")).disabled = false; + } + } + } + + #resetGroundUnitType() { + (this.#container?.querySelector("#ground-unit-spawn-menu")?.querySelector(".deploy-unit-button")).disabled = true; + } } \ No newline at end of file diff --git a/client/src/map/map.ts b/client/src/map/map.ts index fd0e3b12..c7199ef7 100644 --- a/client/src/map/map.ts +++ b/client/src/map/map.ts @@ -1,10 +1,6 @@ import * as L from "leaflet" -import { getContextMenu, getUnitsManager, getActiveCoalition } from ".."; -import { spawnAircraft, spawnGroundUnit, spawnSmoke } from "../server/server"; -import { aircraftDatabase } from "../units/aircraftdatabase"; -import { unitTypes } from "../units/unittypes"; +import { getContextMenu, getUnitsManager } from ".."; import { BoxSelect } from "./boxselect"; -import { ContextMenuOption } from "../@types/dom"; import { SpawnOptions } from "../controls/contextmenu"; export const IDLE = "IDLE"; @@ -201,11 +197,6 @@ export class Map extends L.Map { #onMouseMove(e: any) { - var selectedUnitPosition = null; - var selectedUnits = getUnitsManager().getSelectedUnits(); - if (selectedUnits && selectedUnits.length == 1) - selectedUnitPosition = new L.LatLng(selectedUnits[0].getFlightData().latitude, selectedUnits[0].getFlightData().longitude); - this.#lastMousePosition.x = e.originalEvent.x; this.#lastMousePosition.y = e.originalEvent.y; } diff --git a/client/src/server/server.ts b/client/src/server/server.ts index 7f66425a..063280c5 100644 --- a/client/src/server/server.ts +++ b/client/src/server/server.ts @@ -3,7 +3,7 @@ import { setConnected } from '..'; import { SpawnOptions } from '../controls/contextmenu'; /* Edit here to change server address */ -const REST_ADDRESS = "http://localhost:30000/olympus"; +const REST_ADDRESS = "http://localhost:3000/demo"; const UNITS_URI = "units"; const REFRESH_URI = "refresh"; const UPDATE_URI = "update"; @@ -64,8 +64,8 @@ export function spawnSmoke(color: string, latlng: L.LatLng) { POST(data, () => { }); } -export function spawnGroundUnit(type: string, latlng: L.LatLng, coalition: string) { - var command = { "type": type, "location": latlng, "coalition": coalition }; +export function spawnGroundUnit(spawnOptions: SpawnOptions) { + var command = { "type": spawnOptions.type, "location": spawnOptions.latlng, "coalition": spawnOptions.coalition }; var data = { "spawnGround": command } POST(data, () => { }); } diff --git a/client/src/units/aircraftdatabase.ts b/client/src/units/aircraftdatabase.ts index 0d7b18e9..1c88d193 100644 --- a/client/src/units/aircraftdatabase.ts +++ b/client/src/units/aircraftdatabase.ts @@ -1,4 +1,3 @@ -import { similarity } from "../other/utils"; import { UnitDatabase } from "./unitdatabase" export class AircraftDatabase extends UnitDatabase { diff --git a/client/src/units/groundunitsdatabase.ts b/client/src/units/groundunitsdatabase.ts new file mode 100644 index 00000000..038e36e1 --- /dev/null +++ b/client/src/units/groundunitsdatabase.ts @@ -0,0 +1,2766 @@ +import { UnitDatabase } from "./unitdatabase" + +export class GroundUnitsDatabase extends UnitDatabase { + constructor() { + super(); + this.units = { + "2B11 mortar": { + "name": "2B11 mortar", + "label": "2B11 mortar", + "shortLabel": "2B11 mortar", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Howitzer" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "SAU Gvozdika": { + "name": "SAU Gvozdika", + "label": "SAU Gvozdika", + "shortLabel": "SAU Gvozdika", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Howitzer" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "SAU Msta": { + "name": "SAU Msta", + "label": "SAU Msta", + "shortLabel": "SAU Msta", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Howitzer" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "SAU Akatsia": { + "name": "SAU Akatsia", + "label": "SAU Akatsia", + "shortLabel": "SAU Akatsia", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Howitzer" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "SAU 2-C9": { + "name": "SAU 2-C9", + "label": "SAU 2-C9", + "shortLabel": "SAU 2-C9", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Howitzer" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "M-109": { + "name": "M-109", + "label": "M-109", + "shortLabel": "M-109", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Howitzer" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "AAV7": { + "name": "AAV7", + "label": "AAV7", + "shortLabel": "AAV7", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "BMD-1": { + "name": "BMD-1", + "label": "BMD-1", + "shortLabel": "BMD-1", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "BMP-1": { + "name": "BMP-1", + "label": "BMP-1", + "shortLabel": "BMP-1", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "BMP-2": { + "name": "BMP-2", + "label": "BMP-2", + "shortLabel": "BMP-2", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "BMP-3": { + "name": "BMP-3", + "label": "BMP-3", + "shortLabel": "BMP-3", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Boman": { + "name": "Boman", + "label": "Boman", + "shortLabel": "Boman", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "BRDM-2": { + "name": "BRDM-2", + "label": "BRDM-2", + "shortLabel": "BRDM-2", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "BTR-80": { + "name": "BTR-80", + "label": "BTR-80", + "shortLabel": "BTR-80", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "BTR_D": { + "name": "BTR_D", + "label": "BTR_D", + "shortLabel": "BTR_D", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Bunker": { + "name": "Bunker", + "label": "Bunker", + "shortLabel": "Bunker", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Cobra": { + "name": "Cobra", + "label": "Cobra", + "shortLabel": "Cobra", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "LAV-25": { + "name": "LAV-25", + "label": "LAV-25", + "shortLabel": "LAV-25", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "M1043 HMMWV Armament": { + "name": "M1043 HMMWV Armament", + "label": "M1043 HMMWV Armament", + "shortLabel": "M1043 HMMWV Armament", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "M1045 HMMWV TOW": { + "name": "M1045 HMMWV TOW", + "label": "M1045 HMMWV TOW", + "shortLabel": "M1045 HMMWV TOW", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "M1126 Stryker ICV": { + "name": "M1126 Stryker ICV", + "label": "M1126 Stryker ICV", + "shortLabel": "M1126 Stryker ICV", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "M-113": { + "name": "M-113", + "label": "M-113", + "shortLabel": "M-113", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "M1134 Stryker ATGM": { + "name": "M1134 Stryker ATGM", + "label": "M1134 Stryker ATGM", + "shortLabel": "M1134 Stryker ATGM", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "M-2 Bradley": { + "name": "M-2 Bradley", + "label": "M-2 Bradley", + "shortLabel": "M-2 Bradley", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Marder": { + "name": "Marder", + "label": "Marder", + "shortLabel": "Marder", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "MCV-80": { + "name": "MCV-80", + "label": "MCV-80", + "shortLabel": "MCV-80", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "MTLB": { + "name": "MTLB", + "label": "MTLB", + "shortLabel": "MTLB", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Paratrooper RPG-16": { + "name": "Paratrooper RPG-16", + "label": "Paratrooper RPG-16", + "shortLabel": "Paratrooper RPG-16", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Paratrooper AKS-74": { + "name": "Paratrooper AKS-74", + "label": "Paratrooper AKS-74", + "shortLabel": "Paratrooper AKS-74", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Sandbox": { + "name": "Sandbox", + "label": "Sandbox", + "shortLabel": "Sandbox", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Soldier AK": { + "name": "Soldier AK", + "label": "Soldier AK", + "shortLabel": "Soldier AK", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Infantry AK": { + "name": "Infantry AK", + "label": "Infantry AK", + "shortLabel": "Infantry AK", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Soldier M249": { + "name": "Soldier M249", + "label": "Soldier M249", + "shortLabel": "Soldier M249", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Soldier M4": { + "name": "Soldier M4", + "label": "Soldier M4", + "shortLabel": "Soldier M4", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Soldier M4 GRG": { + "name": "Soldier M4 GRG", + "label": "Soldier M4 GRG", + "shortLabel": "Soldier M4 GRG", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Soldier RPG": { + "name": "Soldier RPG", + "label": "Soldier RPG", + "shortLabel": "Soldier RPG", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "TPZ": { + "name": "TPZ", + "label": "TPZ", + "shortLabel": "TPZ", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "IFV" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Grad-URAL": { + "name": "Grad-URAL", + "label": "Grad-URAL", + "shortLabel": "Grad-URAL", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "MLRS" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Uragan_BM-27": { + "name": "Uragan_BM-27", + "label": "Uragan_BM-27", + "shortLabel": "Uragan_BM-27", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "MLRS" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Smerch": { + "name": "Smerch", + "label": "Smerch", + "shortLabel": "Smerch", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "MLRS" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "MLRS": { + "name": "MLRS", + "label": "MLRS", + "shortLabel": "MLRS", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "MLRS" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "2S6 Tunguska": { + "name": "2S6 Tunguska", + "label": "2S6 Tunguska", + "shortLabel": "2S6 Tunguska", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Kub 2P25 ln": { + "name": "Kub 2P25 ln", + "label": "Kub 2P25 ln", + "shortLabel": "Kub 2P25 ln", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "5p73 s-125 ln": { + "name": "5p73 s-125 ln", + "label": "5p73 s-125 ln", + "shortLabel": "5p73 s-125 ln", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "S-300PS 5P85C ln": { + "name": "S-300PS 5P85C ln", + "label": "S-300PS 5P85C ln", + "shortLabel": "S-300PS 5P85C ln", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "S-300PS 5P85D ln": { + "name": "S-300PS 5P85D ln", + "label": "S-300PS 5P85D ln", + "shortLabel": "S-300PS 5P85D ln", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "SA-11 Buk LN 9A310M1": { + "name": "SA-11 Buk LN 9A310M1", + "label": "SA-11 Buk LN 9A310M1", + "shortLabel": "SA-11 Buk LN 9A310M1", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Osa 9A33 ln": { + "name": "Osa 9A33 ln", + "label": "Osa 9A33 ln", + "shortLabel": "Osa 9A33 ln", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Tor 9A331": { + "name": "Tor 9A331", + "label": "Tor 9A331", + "shortLabel": "Tor 9A331", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Strela-10M3": { + "name": "Strela-10M3", + "label": "Strela-10M3", + "shortLabel": "Strela-10M3", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Strela-1 9P31": { + "name": "Strela-1 9P31", + "label": "Strela-1 9P31", + "shortLabel": "Strela-1 9P31", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "SA-11 Buk CC 9S470M1": { + "name": "SA-11 Buk CC 9S470M1", + "label": "SA-11 Buk CC 9S470M1", + "shortLabel": "SA-11 Buk CC 9S470M1", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "SA-8 Osa LD 9T217": { + "name": "SA-8 Osa LD 9T217", + "label": "SA-8 Osa LD 9T217", + "shortLabel": "SA-8 Osa LD 9T217", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Patriot AMG": { + "name": "Patriot AMG", + "label": "Patriot AMG", + "shortLabel": "Patriot AMG", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Patriot ECS": { + "name": "Patriot ECS", + "label": "Patriot ECS", + "shortLabel": "Patriot ECS", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Gepard": { + "name": "Gepard", + "label": "Gepard", + "shortLabel": "Gepard", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Hawk pcp": { + "name": "Hawk pcp", + "label": "Hawk pcp", + "shortLabel": "Hawk pcp", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "SA-18 Igla manpad": { + "name": "SA-18 Igla manpad", + "label": "SA-18 Igla manpad", + "shortLabel": "SA-18 Igla manpad", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "SA-18 Igla comm": { + "name": "SA-18 Igla comm", + "label": "SA-18 Igla comm", + "shortLabel": "SA-18 Igla comm", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Igla manpad INS": { + "name": "Igla manpad INS", + "label": "Igla manpad INS", + "shortLabel": "Igla manpad INS", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "SA-18 Igla-S manpad": { + "name": "SA-18 Igla-S manpad", + "label": "SA-18 Igla-S manpad", + "shortLabel": "SA-18 Igla-S manpad", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "SA-18 Igla-S comm": { + "name": "SA-18 Igla-S comm", + "label": "SA-18 Igla-S comm", + "shortLabel": "SA-18 Igla-S comm", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Vulcan": { + "name": "Vulcan", + "label": "Vulcan", + "shortLabel": "Vulcan", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Hawk ln": { + "name": "Hawk ln", + "label": "Hawk ln", + "shortLabel": "Hawk ln", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "M48 Chaparral": { + "name": "M48 Chaparral", + "label": "M48 Chaparral", + "shortLabel": "M48 Chaparral", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "M6 Linebacker": { + "name": "M6 Linebacker", + "label": "M6 Linebacker", + "shortLabel": "M6 Linebacker", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Patriot ln": { + "name": "Patriot ln", + "label": "Patriot ln", + "shortLabel": "Patriot ln", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "M1097 Avenger": { + "name": "M1097 Avenger", + "label": "M1097 Avenger", + "shortLabel": "M1097 Avenger", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Patriot EPP": { + "name": "Patriot EPP", + "label": "Patriot EPP", + "shortLabel": "Patriot EPP", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Patriot cp": { + "name": "Patriot cp", + "label": "Patriot cp", + "shortLabel": "Patriot cp", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Roland ADS": { + "name": "Roland ADS", + "label": "Roland ADS", + "shortLabel": "Roland ADS", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "S-300PS 54K6 cp": { + "name": "S-300PS 54K6 cp", + "label": "S-300PS 54K6 cp", + "shortLabel": "S-300PS 54K6 cp", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Stinger manpad GRG": { + "name": "Stinger manpad GRG", + "label": "Stinger manpad GRG", + "shortLabel": "Stinger manpad GRG", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Stinger manpad dsr": { + "name": "Stinger manpad dsr", + "label": "Stinger manpad dsr", + "shortLabel": "Stinger manpad dsr", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Stinger comm dsr": { + "name": "Stinger comm dsr", + "label": "Stinger comm dsr", + "shortLabel": "Stinger comm dsr", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Stinger manpad": { + "name": "Stinger manpad", + "label": "Stinger manpad", + "shortLabel": "Stinger manpad", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Stinger comm": { + "name": "Stinger comm", + "label": "Stinger comm", + "shortLabel": "Stinger comm", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "ZSU-23-4 Shilka": { + "name": "ZSU-23-4 Shilka", + "label": "ZSU-23-4 Shilka", + "shortLabel": "ZSU-23-4 Shilka", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "ZU-23 Emplacement Closed": { + "name": "ZU-23 Emplacement Closed", + "label": "ZU-23 Emplacement Closed", + "shortLabel": "ZU-23 Emplacement Closed", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "ZU-23 Emplacement": { + "name": "ZU-23 Emplacement", + "label": "ZU-23 Emplacement", + "shortLabel": "ZU-23 Emplacement", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "ZU-23 Closed Insurgent": { + "name": "ZU-23 Closed Insurgent", + "label": "ZU-23 Closed Insurgent", + "shortLabel": "ZU-23 Closed Insurgent", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Ural-375 ZU-23 Insurgent": { + "name": "Ural-375 ZU-23 Insurgent", + "label": "Ural-375 ZU-23 Insurgent", + "shortLabel": "Ural-375 ZU-23 Insurgent", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "ZU-23 Insurgent": { + "name": "ZU-23 Insurgent", + "label": "ZU-23 Insurgent", + "shortLabel": "ZU-23 Insurgent", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Ural-375 ZU-23": { + "name": "Ural-375 ZU-23", + "label": "Ural-375 ZU-23", + "shortLabel": "Ural-375 ZU-23", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "SAM" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "1L13 EWR": { + "name": "1L13 EWR", + "label": "1L13 EWR", + "shortLabel": "1L13 EWR", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Radar" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Kub 1S91 str": { + "name": "Kub 1S91 str", + "label": "Kub 1S91 str", + "shortLabel": "Kub 1S91 str", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Radar" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "S-300PS 40B6M tr": { + "name": "S-300PS 40B6M tr", + "label": "S-300PS 40B6M tr", + "shortLabel": "S-300PS 40B6M tr", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Radar" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "S-300PS 40B6MD sr": { + "name": "S-300PS 40B6MD sr", + "label": "S-300PS 40B6MD sr", + "shortLabel": "S-300PS 40B6MD sr", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Radar" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "55G6 EWR": { + "name": "55G6 EWR", + "label": "55G6 EWR", + "shortLabel": "55G6 EWR", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Radar" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "S-300PS 64H6E sr": { + "name": "S-300PS 64H6E sr", + "label": "S-300PS 64H6E sr", + "shortLabel": "S-300PS 64H6E sr", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Radar" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "SA-11 Buk SR 9S18M1": { + "name": "SA-11 Buk SR 9S18M1", + "label": "SA-11 Buk SR 9S18M1", + "shortLabel": "SA-11 Buk SR 9S18M1", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Radar" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Dog Ear radar": { + "name": "Dog Ear radar", + "label": "Dog Ear radar", + "shortLabel": "Dog Ear radar", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Radar" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Hawk tr": { + "name": "Hawk tr", + "label": "Hawk tr", + "shortLabel": "Hawk tr", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Radar" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Hawk sr": { + "name": "Hawk sr", + "label": "Hawk sr", + "shortLabel": "Hawk sr", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Radar" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Patriot str": { + "name": "Patriot str", + "label": "Patriot str", + "shortLabel": "Patriot str", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Radar" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Hawk cwar": { + "name": "Hawk cwar", + "label": "Hawk cwar", + "shortLabel": "Hawk cwar", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Radar" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "p-19 s-125 sr": { + "name": "p-19 s-125 sr", + "label": "p-19 s-125 sr", + "shortLabel": "p-19 s-125 sr", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Radar" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Roland Radar": { + "name": "Roland Radar", + "label": "Roland Radar", + "shortLabel": "Roland Radar", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Radar" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "snr s-125 tr": { + "name": "snr s-125 tr", + "label": "snr s-125 tr", + "shortLabel": "snr s-125 tr", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Radar" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "house1arm": { + "name": "house1arm", + "label": "house1arm", + "shortLabel": "house1arm", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Structure" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "house2arm": { + "name": "house2arm", + "label": "house2arm", + "shortLabel": "house2arm", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Structure" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "outpost_road": { + "name": "outpost_road", + "label": "outpost_road", + "shortLabel": "outpost_road", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Structure" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "outpost": { + "name": "outpost", + "label": "outpost", + "shortLabel": "outpost", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Structure" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "houseA_arm": { + "name": "houseA_arm", + "label": "houseA_arm", + "shortLabel": "houseA_arm", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Structure" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Challenger2": { + "name": "Challenger2", + "label": "Challenger2", + "shortLabel": "Challenger2", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Tank" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Leclerc": { + "name": "Leclerc", + "label": "Leclerc", + "shortLabel": "Leclerc", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Tank" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Leopard1A3": { + "name": "Leopard1A3", + "label": "Leopard1A3", + "shortLabel": "Leopard1A3", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Tank" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Leopard-2": { + "name": "Leopard-2", + "label": "Leopard-2", + "shortLabel": "Leopard-2", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Tank" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "M-60": { + "name": "M-60", + "label": "M-60", + "shortLabel": "M-60", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Tank" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "M1128 Stryker MGS": { + "name": "M1128 Stryker MGS", + "label": "M1128 Stryker MGS", + "shortLabel": "M1128 Stryker MGS", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Tank" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "M-1 Abrams": { + "name": "M-1 Abrams", + "label": "M-1 Abrams", + "shortLabel": "M-1 Abrams", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Tank" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "T-55": { + "name": "T-55", + "label": "T-55", + "shortLabel": "T-55", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Tank" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "T-72B": { + "name": "T-72B", + "label": "T-72B", + "shortLabel": "T-72B", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Tank" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "T-80UD": { + "name": "T-80UD", + "label": "T-80UD", + "shortLabel": "T-80UD", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Tank" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "T-90": { + "name": "T-90", + "label": "T-90", + "shortLabel": "T-90", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Tank" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Ural-4320 APA-5D": { + "name": "Ural-4320 APA-5D", + "label": "Ural-4320 APA-5D", + "shortLabel": "Ural-4320 APA-5D", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "ATMZ-5": { + "name": "ATMZ-5", + "label": "ATMZ-5", + "shortLabel": "ATMZ-5", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "ATZ-10": { + "name": "ATZ-10", + "label": "ATZ-10", + "shortLabel": "ATZ-10", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "GAZ-3307": { + "name": "GAZ-3307", + "label": "GAZ-3307", + "shortLabel": "GAZ-3307", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "GAZ-3308": { + "name": "GAZ-3308", + "label": "GAZ-3308", + "shortLabel": "GAZ-3308", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "GAZ-66": { + "name": "GAZ-66", + "label": "GAZ-66", + "shortLabel": "GAZ-66", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "M978 HEMTT Tanker": { + "name": "M978 HEMTT Tanker", + "label": "M978 HEMTT Tanker", + "shortLabel": "M978 HEMTT Tanker", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "HEMTT TFFT": { + "name": "HEMTT TFFT", + "label": "HEMTT TFFT", + "shortLabel": "HEMTT TFFT", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "IKARUS Bus": { + "name": "IKARUS Bus", + "label": "IKARUS Bus", + "shortLabel": "IKARUS Bus", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "KAMAZ Truck": { + "name": "KAMAZ Truck", + "label": "KAMAZ Truck", + "shortLabel": "KAMAZ Truck", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "LAZ Bus": { + "name": "LAZ Bus", + "label": "LAZ Bus", + "shortLabel": "LAZ Bus", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Hummer": { + "name": "Hummer", + "label": "Hummer", + "shortLabel": "Hummer", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "M 818": { + "name": "M 818", + "label": "M 818", + "shortLabel": "M 818", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "MAZ-6303": { + "name": "MAZ-6303", + "label": "MAZ-6303", + "shortLabel": "MAZ-6303", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Predator GCS": { + "name": "Predator GCS", + "label": "Predator GCS", + "shortLabel": "Predator GCS", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Predator TrojanSpirit": { + "name": "Predator TrojanSpirit", + "label": "Predator TrojanSpirit", + "shortLabel": "Predator TrojanSpirit", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Suidae": { + "name": "Suidae", + "label": "Suidae", + "shortLabel": "Suidae", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Tigr_233036": { + "name": "Tigr_233036", + "label": "Tigr_233036", + "shortLabel": "Tigr_233036", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Trolley bus": { + "name": "Trolley bus", + "label": "Trolley bus", + "shortLabel": "Trolley bus", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "UAZ-469": { + "name": "UAZ-469", + "label": "UAZ-469", + "shortLabel": "UAZ-469", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Ural ATsP-6": { + "name": "Ural ATsP-6", + "label": "Ural ATsP-6", + "shortLabel": "Ural ATsP-6", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Ural-375 PBU": { + "name": "Ural-375 PBU", + "label": "Ural-375 PBU", + "shortLabel": "Ural-375 PBU", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Ural-375": { + "name": "Ural-375", + "label": "Ural-375", + "shortLabel": "Ural-375", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Ural-4320-31": { + "name": "Ural-4320-31", + "label": "Ural-4320-31", + "shortLabel": "Ural-4320-31", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "Ural-4320T": { + "name": "Ural-4320T", + "label": "Ural-4320T", + "shortLabel": "Ural-4320T", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "VAZ Car": { + "name": "VAZ Car", + "label": "VAZ Car", + "shortLabel": "VAZ Car", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "ZiL-131 APA-80": { + "name": "ZiL-131 APA-80", + "label": "ZiL-131 APA-80", + "shortLabel": "ZiL-131 APA-80", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "SKP-11": { + "name": "SKP-11", + "label": "SKP-11", + "shortLabel": "SKP-11", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "ZIL-131 KUNG": { + "name": "ZIL-131 KUNG", + "label": "ZIL-131 KUNG", + "shortLabel": "ZIL-131 KUNG", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + }, + "ZIL-4331": { + "name": "ZIL-4331", + "label": "ZIL-4331", + "shortLabel": "ZIL-4331", + "loadouts": [ + { + "fuel": 1, + "items": [ + + ], + "roles": [ + "Unarmed" + ], + "code": "", + "name": "Default" + } + ], + "filename": "" + } + } + } +} + +export var groundUnitsDatabase = new GroundUnitsDatabase(); \ No newline at end of file diff --git a/client/src/units/unit.ts b/client/src/units/unit.ts index f7a82c0e..ff02116c 100644 --- a/client/src/units/unit.ts +++ b/client/src/units/unit.ts @@ -3,6 +3,7 @@ import { getMap, getUnitsManager } from '..'; import { rad2deg } from '../other/utils'; import { addDestination, attackUnit, changeAltitude, changeSpeed, createFormation as setLeader, deleteUnit, landAt, setAltitude, setReactionToThreat, setROE, setSpeed } from '../server/server'; import { aircraftDatabase } from './aircraftdatabase'; +import { groundUnitsDatabase } from './groundunitsdatabase'; var pathIcon = new Icon({ iconUrl: 'images/marker-icon.png', @@ -36,7 +37,7 @@ export class Unit extends Marker { if (type === "NavyUnit") return NavyUnit; } - constructor(ID: number, data: UnitData) { + constructor(ID: number, data: UnitData, html: string) { super(new LatLng(0, 0), { riseOnHover: true }); this.ID = ID; @@ -49,33 +50,7 @@ export class Unit extends Marker { this.on('contextmenu', (e) => this.#onContextMenu(e)); var icon = new DivIcon({ - html: ` -
-
-
-
-
-
-
4
-
-
-
${aircraftDatabase.getShortLabelByName(this.getData().name)}
-
-
-
-
-
-
-
-
-
-
-
${this.getData().unitName}
-
-
-
-
- `, + html: html, className: 'ol-unit-marker', iconAnchor: [0, 0] }); @@ -408,19 +383,55 @@ export class AirUnit extends Unit { export class Aircraft extends AirUnit { constructor(ID: number, data: UnitData) { - super(ID, data); + super(ID, data, + `
+
+
+
+
+
+
4
+
+
+
${aircraftDatabase.getShortLabelByName(data.name)}
+
+
+
+
+
+
+
+
+
+
+
${data.unitName}
+
+
+
+
`); } } export class Helicopter extends AirUnit { constructor(ID: number, data: UnitData) { - super(ID, data); + super(ID, data, + ``); } } export class GroundUnit extends Unit { constructor(ID: number, data: UnitData) { - super(ID, data); + var role = groundUnitsDatabase.getByName(data.name)?.loadouts[0].roles[0]; + var roleType = "ground"; + if (role === "SAM") + roleType = "sam" + super(ID, data, ` +
+
+
+
${role?.substring(0, 1).toUpperCase()}
+
+ `); } getHidden() { @@ -430,7 +441,7 @@ export class GroundUnit extends Unit { export class NavyUnit extends Unit { constructor(ID: number, data: UnitData) { - super(ID, data); + super(ID, data, ""); } getHidden() { @@ -440,7 +451,7 @@ export class NavyUnit extends Unit { export class Weapon extends Unit { constructor(ID: number, data: UnitData) { - super(ID, data); + super(ID, data, ""); this.setSelectable(false); } } diff --git a/client/src/units/unitdatabase.ts b/client/src/units/unitdatabase.ts index 75c7d563..b4710a1f 100644 --- a/client/src/units/unitdatabase.ts +++ b/client/src/units/unitdatabase.ts @@ -6,6 +6,13 @@ export class UnitDatabase { } + getByName(name: string) + { + if (name in this.units) + return this.units[name]; + return null; + } + getByLabel(label: string) { for (let unit in this.units) diff --git a/client/src/units/unittypes.ts b/client/src/units/unittypes.ts deleted file mode 100644 index 7b10a96f..00000000 --- a/client/src/units/unittypes.ts +++ /dev/null @@ -1,207 +0,0 @@ - - -export var unitTypes: any = {}; -/* NAVY */ -unitTypes.navy = {}; -unitTypes.navy.blue = [ - "VINSON", - "PERRY", - "TICONDEROG" -] - -unitTypes.navy.red = [ - "ALBATROS", - "KUZNECOW", - "MOLNIYA", - "MOSCOW", - "NEUSTRASH", - "PIOTR", - "REZKY" -] - -unitTypes.navy.civil = [ - "ELNYA", - "Dry-cargo ship-2", - "Dry-cargo ship-1", - "ZWEZDNY" -] - -unitTypes.navy.submarine = [ - "KILO", - "SOM" -] - -unitTypes.navy.speedboat = [ - "speedboat" -] - -/* VEHICLES (GROUND) */ -unitTypes.vehicles = [] -unitTypes.vehicles.Howitzers = [ - "2B11 mortar", - "SAU Gvozdika", - "SAU Msta", - "SAU Akatsia", - "SAU 2-C9", - "M-109" -] - -unitTypes.vehicles.IFV = [ - "AAV7", - "BMD-1", - "BMP-1", - "BMP-2", - "BMP-3", - "Boman", - "BRDM-2", - "BTR-80", - "BTR_D", - "Bunker", - "Cobra", - "LAV-25", - "M1043 HMMWV Armament", - "M1045 HMMWV TOW", - "M1126 Stryker ICV", - "M-113", - "M1134 Stryker ATGM", - "M-2 Bradley", - "Marder", - "MCV-80", - "MTLB", - "Paratrooper RPG-16", - "Paratrooper AKS-74", - "Sandbox", - "Soldier AK", - "Infantry AK", - "Soldier M249", - "Soldier M4", - "Soldier M4 GRG", - "Soldier RPG", - "TPZ" -] - -unitTypes.vehicles.MLRS = [ - "Grad-URAL", - "Uragan_BM-27", - "Smerch", - "MLRS" -] - -unitTypes.vehicles.SAM = [ - "2S6 Tunguska", - "Kub 2P25 ln", - "5p73 s-125 ln", - "S-300PS 5P85C ln", - "S-300PS 5P85D ln", - "SA-11 Buk LN 9A310M1", - "Osa 9A33 ln", - "Tor 9A331", - "Strela-10M3", - "Strela-1 9P31", - "SA-11 Buk CC 9S470M1", - "SA-8 Osa LD 9T217", - "Patriot AMG", - "Patriot ECS", - "Gepard", - "Hawk pcp", - "SA-18 Igla manpad", - "SA-18 Igla comm", - "Igla manpad INS", - "SA-18 Igla-S manpad", - "SA-18 Igla-S comm", - "Vulcan", - "Hawk ln", - "M48 Chaparral", - "M6 Linebacker", - "Patriot ln", - "M1097 Avenger", - "Patriot EPP", - "Patriot cp", - "Roland ADS", - "S-300PS 54K6 cp", - "Stinger manpad GRG", - "Stinger manpad dsr", - "Stinger comm dsr", - "Stinger manpad", - "Stinger comm", - "ZSU-23-4 Shilka", - "ZU-23 Emplacement Closed", - "ZU-23 Emplacement", - "ZU-23 Closed Insurgent", - "Ural-375 ZU-23 Insurgent", - "ZU-23 Insurgent", - "Ural-375 ZU-23" -] - -unitTypes.vehicles.Radar = [ - "1L13 EWR", - "Kub 1S91 str", - "S-300PS 40B6M tr", - "S-300PS 40B6MD sr", - "55G6 EWR", - "S-300PS 64H6E sr", - "SA-11 Buk SR 9S18M1", - "Dog Ear radar", - "Hawk tr", - "Hawk sr", - "Patriot str", - "Hawk cwar", - "p-19 s-125 sr", - "Roland Radar", - "snr s-125 tr" -] - -unitTypes.vehicles.Structures = [ - "house1arm", - "house2arm", - "outpost_road", - "outpost", - "houseA_arm" -] - -unitTypes.vehicles.Tanks = [ - "Challenger2", - "Leclerc", - "Leopard1A3", - "Leopard-2", - "M-60", - "M1128 Stryker MGS", - "M-1 Abrams", - "T-55", - "T-72B", - "T-80UD", - "T-90" -] - -unitTypes.vehicles.Unarmed = [ - "Ural-4320 APA-5D", - "ATMZ-5", - "ATZ-10", - "GAZ-3307", - "GAZ-3308", - "GAZ-66", - "M978 HEMTT Tanker", - "HEMTT TFFT", - "IKARUS Bus", - "KAMAZ Truck", - "LAZ Bus", - "Hummer", - "M 818", - "MAZ-6303", - "Predator GCS", - "Predator TrojanSpirit", - "Suidae", - "Tigr_233036", - "Trolley bus", - "UAZ-469", - "Ural ATsP-6", - "Ural-375 PBU", - "Ural-375", - "Ural-4320-31", - "Ural-4320T", - "VAZ Car", - "ZiL-131 APA-80", - "SKP-11", - "ZIL-131 KUNG", - "ZIL-4331" -] diff --git a/client/views/contextmenu.ejs b/client/views/contextmenu.ejs index f2d0cd5d..09115f68 100644 --- a/client/views/contextmenu.ejs +++ b/client/views/contextmenu.ejs @@ -5,16 +5,16 @@
- - - +
-
+
Aircraft role
@@ -22,7 +22,7 @@
-
+
Aircraft type
Select role first
@@ -44,6 +44,33 @@
- + +
+
+
+
+
Ground unit role
+
+ +
+
+
+
+
+
Ground unit type
+
+
Select role first
+ +
+
+
+ +
+
+ + + + +
\ No newline at end of file