mirror of
https://github.com/Pax1601/DCSOlympus.git
synced 2025-10-29 16:56:34 +00:00
Added entry to databases
This commit is contained in:
149
client/@types/olympus/index.d.ts
vendored
149
client/@types/olympus/index.d.ts
vendored
@@ -254,6 +254,7 @@ declare module "constants/constants" {
|
|||||||
operateAs = 41,
|
operateAs = 41,
|
||||||
shotsScatter = 42,
|
shotsScatter = 42,
|
||||||
shotsIntensity = 43,
|
shotsIntensity = 43,
|
||||||
|
health = 44,
|
||||||
endOfData = 255
|
endOfData = 255
|
||||||
}
|
}
|
||||||
export const MGRS_PRECISION_10KM = 2;
|
export const MGRS_PRECISION_10KM = 2;
|
||||||
@@ -313,7 +314,7 @@ declare module "controls/dropdown" {
|
|||||||
#private;
|
#private;
|
||||||
constructor(ID: string | null, callback: CallableFunction, options?: string[] | null, defaultText?: string);
|
constructor(ID: string | null, callback: CallableFunction, options?: string[] | null, defaultText?: string);
|
||||||
getContainer(): HTMLElement;
|
getContainer(): HTMLElement;
|
||||||
setOptions(optionsList: string[], sort?: "" | "string" | "number"): void;
|
setOptions(optionsList: string[], sort?: "" | "string" | "number" | "string+number"): void;
|
||||||
setOptionsElements(optionsElements: HTMLElement[]): void;
|
setOptionsElements(optionsElements: HTMLElement[]): void;
|
||||||
getOptionElements(): HTMLCollection;
|
getOptionElements(): HTMLCollection;
|
||||||
addOptionElement(optionElement: HTMLElement): void;
|
addOptionElement(optionElement: HTMLElement): void;
|
||||||
@@ -449,6 +450,7 @@ declare module "interfaces" {
|
|||||||
export interface ObjectIconOptions {
|
export interface ObjectIconOptions {
|
||||||
showState: boolean;
|
showState: boolean;
|
||||||
showVvi: boolean;
|
showVvi: boolean;
|
||||||
|
showHealth: boolean;
|
||||||
showHotgroup: boolean;
|
showHotgroup: boolean;
|
||||||
showUnitIcon: boolean;
|
showUnitIcon: boolean;
|
||||||
showShortLabel: boolean;
|
showShortLabel: boolean;
|
||||||
@@ -537,6 +539,7 @@ declare module "interfaces" {
|
|||||||
operateAs: string;
|
operateAs: string;
|
||||||
shotsScatter: number;
|
shotsScatter: number;
|
||||||
shotsIntensity: number;
|
shotsIntensity: number;
|
||||||
|
health: number;
|
||||||
}
|
}
|
||||||
export interface LoadoutItemBlueprint {
|
export interface LoadoutItemBlueprint {
|
||||||
name: string;
|
name: string;
|
||||||
@@ -576,6 +579,7 @@ declare module "interfaces" {
|
|||||||
shotsBaseScatter?: number;
|
shotsBaseScatter?: number;
|
||||||
description?: string;
|
description?: string;
|
||||||
abilities?: string;
|
abilities?: string;
|
||||||
|
tags?: string;
|
||||||
acquisitionRange?: number;
|
acquisitionRange?: number;
|
||||||
engagementRange?: number;
|
engagementRange?: number;
|
||||||
targetingRange?: number;
|
targetingRange?: number;
|
||||||
@@ -585,6 +589,7 @@ declare module "interfaces" {
|
|||||||
canRearm?: boolean;
|
canRearm?: boolean;
|
||||||
canAAA?: boolean;
|
canAAA?: boolean;
|
||||||
indirectFire?: boolean;
|
indirectFire?: boolean;
|
||||||
|
markerFile?: string;
|
||||||
}
|
}
|
||||||
export interface UnitSpawnOptions {
|
export interface UnitSpawnOptions {
|
||||||
roleType: string;
|
roleType: string;
|
||||||
@@ -1021,6 +1026,7 @@ declare module "weapon/weapon" {
|
|||||||
getIconOptions(): {
|
getIconOptions(): {
|
||||||
showState: boolean;
|
showState: boolean;
|
||||||
showVvi: boolean;
|
showVvi: boolean;
|
||||||
|
showHealth: boolean;
|
||||||
showHotgroup: boolean;
|
showHotgroup: boolean;
|
||||||
showUnitIcon: boolean;
|
showUnitIcon: boolean;
|
||||||
showShortLabel: boolean;
|
showShortLabel: boolean;
|
||||||
@@ -1038,6 +1044,7 @@ declare module "weapon/weapon" {
|
|||||||
getIconOptions(): {
|
getIconOptions(): {
|
||||||
showState: boolean;
|
showState: boolean;
|
||||||
showVvi: boolean;
|
showVvi: boolean;
|
||||||
|
showHealth: boolean;
|
||||||
showHotgroup: boolean;
|
showHotgroup: boolean;
|
||||||
showUnitIcon: boolean;
|
showUnitIcon: boolean;
|
||||||
showShortLabel: boolean;
|
showShortLabel: boolean;
|
||||||
@@ -1049,12 +1056,29 @@ declare module "weapon/weapon" {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
declare module "map/rangecircle" {
|
||||||
|
import { Circle } from 'leaflet';
|
||||||
|
/**
|
||||||
|
* This custom Circle object implements a faster render method for very big circles. When zoomed in, the default ctx.arc method
|
||||||
|
* is very slow since the circle is huge. Also, when zoomed in most of the circle points will be outside the screen and not needed. This
|
||||||
|
* simpler, faster renderer approximates the circle with line segements and only draws those currently visibile.
|
||||||
|
* A more refined version using arcs could be implemented but this works good enough.
|
||||||
|
*/
|
||||||
|
export class RangeCircle extends Circle {
|
||||||
|
_updatePath(): void;
|
||||||
|
}
|
||||||
|
}
|
||||||
declare module "unit/unit" {
|
declare module "unit/unit" {
|
||||||
import { LatLng, Map } from 'leaflet';
|
import { LatLng, Map } from 'leaflet';
|
||||||
import { CustomMarker } from "map/markers/custommarker";
|
import { CustomMarker } from "map/markers/custommarker";
|
||||||
import { UnitDatabase } from "unit/databases/unitdatabase";
|
import { UnitDatabase } from "unit/databases/unitdatabase";
|
||||||
import { DataExtractor } from "server/dataextractor";
|
import { DataExtractor } from "server/dataextractor";
|
||||||
import { Ammo, Contact, GeneralSettings, ObjectIconOptions, Offset, Radio, TACAN, UnitData } from "interfaces";
|
import { Ammo, Contact, GeneralSettings, ObjectIconOptions, Offset, Radio, TACAN, UnitData } from "interfaces";
|
||||||
|
/**
|
||||||
|
* Unit class which controls unit behaviour
|
||||||
|
*
|
||||||
|
* Just about everything is a unit - even missiles!
|
||||||
|
*/
|
||||||
export class Unit extends CustomMarker {
|
export class Unit extends CustomMarker {
|
||||||
#private;
|
#private;
|
||||||
ID: number;
|
ID: number;
|
||||||
@@ -1074,8 +1098,8 @@ declare module "unit/unit" {
|
|||||||
getHorizontalVelocity(): number;
|
getHorizontalVelocity(): number;
|
||||||
getVerticalVelocity(): number;
|
getVerticalVelocity(): number;
|
||||||
getHeading(): number;
|
getHeading(): number;
|
||||||
getIsActiveTanker(): boolean;
|
|
||||||
getIsActiveAWACS(): boolean;
|
getIsActiveAWACS(): boolean;
|
||||||
|
getIsActiveTanker(): boolean;
|
||||||
getOnOff(): boolean;
|
getOnOff(): boolean;
|
||||||
getFollowRoads(): boolean;
|
getFollowRoads(): boolean;
|
||||||
getFuel(): number;
|
getFuel(): number;
|
||||||
@@ -1100,26 +1124,88 @@ declare module "unit/unit" {
|
|||||||
getOperateAs(): string;
|
getOperateAs(): string;
|
||||||
getShotsScatter(): number;
|
getShotsScatter(): number;
|
||||||
getShotsIntensity(): number;
|
getShotsIntensity(): number;
|
||||||
|
getHealth(): number;
|
||||||
static getConstructor(type: string): typeof GroundUnit | undefined;
|
static getConstructor(type: string): typeof GroundUnit | undefined;
|
||||||
constructor(ID: number);
|
constructor(ID: number);
|
||||||
getCategory(): string;
|
getCategory(): string;
|
||||||
/********************** Unit data *************************/
|
/********************** Unit data *************************/
|
||||||
setData(dataExtractor: DataExtractor): void;
|
setData(dataExtractor: DataExtractor): void;
|
||||||
drawLines(): void;
|
drawLines(): void;
|
||||||
|
/** Get unit data collated into an object
|
||||||
|
*
|
||||||
|
* @returns object populated by unit information which can also be retrieved using getters
|
||||||
|
*/
|
||||||
getData(): UnitData;
|
getData(): UnitData;
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @returns string containing the marker category
|
||||||
|
*/
|
||||||
getMarkerCategory(): string;
|
getMarkerCategory(): string;
|
||||||
|
/** Get a database of information also in this unit's category
|
||||||
|
*
|
||||||
|
* @returns UnitDatabase
|
||||||
|
*/
|
||||||
getDatabase(): UnitDatabase | null;
|
getDatabase(): UnitDatabase | null;
|
||||||
|
/** Get the icon options
|
||||||
|
* Used to configure how the marker appears on the map
|
||||||
|
*
|
||||||
|
* @returns ObjectIconOptions
|
||||||
|
*/
|
||||||
getIconOptions(): ObjectIconOptions;
|
getIconOptions(): ObjectIconOptions;
|
||||||
|
/** Set the unit as alive or dead
|
||||||
|
*
|
||||||
|
* @param newAlive (boolean) true = alive, false = dead
|
||||||
|
*/
|
||||||
setAlive(newAlive: boolean): void;
|
setAlive(newAlive: boolean): void;
|
||||||
|
/** Set the unit as user-selected
|
||||||
|
*
|
||||||
|
* @param selected (boolean)
|
||||||
|
*/
|
||||||
setSelected(selected: boolean): void;
|
setSelected(selected: boolean): void;
|
||||||
|
/** Is this unit selected?
|
||||||
|
*
|
||||||
|
* @returns boolean
|
||||||
|
*/
|
||||||
getSelected(): boolean;
|
getSelected(): boolean;
|
||||||
|
/** Set whether this unit is selectable
|
||||||
|
*
|
||||||
|
* @param selectable (boolean)
|
||||||
|
*/
|
||||||
setSelectable(selectable: boolean): void;
|
setSelectable(selectable: boolean): void;
|
||||||
|
/** Get whether this unit is selectable
|
||||||
|
*
|
||||||
|
* @returns boolean
|
||||||
|
*/
|
||||||
getSelectable(): boolean;
|
getSelectable(): boolean;
|
||||||
|
/** Set the number of the hotgroup to which the unit belongs
|
||||||
|
*
|
||||||
|
* @param hotgroup (number)
|
||||||
|
*/
|
||||||
setHotgroup(hotgroup: number | null): void;
|
setHotgroup(hotgroup: number | null): void;
|
||||||
|
/** Get the unit's hotgroup number
|
||||||
|
*
|
||||||
|
* @returns number
|
||||||
|
*/
|
||||||
getHotgroup(): number | null;
|
getHotgroup(): number | null;
|
||||||
|
/** Set the unit as highlighted
|
||||||
|
*
|
||||||
|
* @param highlighted (boolean)
|
||||||
|
*/
|
||||||
setHighlighted(highlighted: boolean): void;
|
setHighlighted(highlighted: boolean): void;
|
||||||
|
/** Get whether the unit is highlighted or not
|
||||||
|
*
|
||||||
|
* @returns boolean
|
||||||
|
*/
|
||||||
getHighlighted(): boolean;
|
getHighlighted(): boolean;
|
||||||
|
/** Get the other members of the group which this unit is in
|
||||||
|
*
|
||||||
|
* @returns Unit[]
|
||||||
|
*/
|
||||||
getGroupMembers(): Unit[];
|
getGroupMembers(): Unit[];
|
||||||
|
/** Returns whether the user is allowed to command this unit, based on coalition
|
||||||
|
*
|
||||||
|
* @returns boolean
|
||||||
|
*/
|
||||||
belongsToCommandedCoalition(): boolean;
|
belongsToCommandedCoalition(): boolean;
|
||||||
getType(): string;
|
getType(): string;
|
||||||
getSpawnPoints(): number | undefined;
|
getSpawnPoints(): number | undefined;
|
||||||
@@ -1163,7 +1249,7 @@ declare module "unit/unit" {
|
|||||||
setOnOff(onOff: boolean): void;
|
setOnOff(onOff: boolean): void;
|
||||||
setFollowRoads(followRoads: boolean): void;
|
setFollowRoads(followRoads: boolean): void;
|
||||||
setOperateAs(operateAs: string): void;
|
setOperateAs(operateAs: string): void;
|
||||||
delete(explosion: boolean, immediate: boolean): void;
|
delete(explosion: boolean, explosionType: string, immediate: boolean): void;
|
||||||
refuel(): void;
|
refuel(): void;
|
||||||
setAdvancedOptions(isActiveTanker: boolean, isActiveAWACS: boolean, TACAN: TACAN, radio: Radio, generalSettings: GeneralSettings): void;
|
setAdvancedOptions(isActiveTanker: boolean, isActiveAWACS: boolean, TACAN: TACAN, radio: Radio, generalSettings: GeneralSettings): void;
|
||||||
bombPoint(latlng: LatLng): void;
|
bombPoint(latlng: LatLng): void;
|
||||||
@@ -1193,6 +1279,7 @@ declare module "unit/unit" {
|
|||||||
getIconOptions(): {
|
getIconOptions(): {
|
||||||
showState: boolean;
|
showState: boolean;
|
||||||
showVvi: boolean;
|
showVvi: boolean;
|
||||||
|
showHealth: boolean;
|
||||||
showHotgroup: boolean;
|
showHotgroup: boolean;
|
||||||
showUnitIcon: boolean;
|
showUnitIcon: boolean;
|
||||||
showShortLabel: boolean;
|
showShortLabel: boolean;
|
||||||
@@ -1223,6 +1310,7 @@ declare module "unit/unit" {
|
|||||||
getIconOptions(): {
|
getIconOptions(): {
|
||||||
showState: boolean;
|
showState: boolean;
|
||||||
showVvi: boolean;
|
showVvi: boolean;
|
||||||
|
showHealth: boolean;
|
||||||
showHotgroup: boolean;
|
showHotgroup: boolean;
|
||||||
showUnitIcon: boolean;
|
showUnitIcon: boolean;
|
||||||
showShortLabel: boolean;
|
showShortLabel: boolean;
|
||||||
@@ -1247,6 +1335,7 @@ declare module "unit/unit" {
|
|||||||
getIconOptions(): {
|
getIconOptions(): {
|
||||||
showState: boolean;
|
showState: boolean;
|
||||||
showVvi: boolean;
|
showVvi: boolean;
|
||||||
|
showHealth: boolean;
|
||||||
showHotgroup: boolean;
|
showHotgroup: boolean;
|
||||||
showUnitIcon: boolean;
|
showUnitIcon: boolean;
|
||||||
showShortLabel: boolean;
|
showShortLabel: boolean;
|
||||||
@@ -1618,6 +1707,30 @@ declare module "panels/serverstatuspanel" {
|
|||||||
update(frameRate: number, load: number): void;
|
update(frameRate: number, load: number): void;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
declare module "toolbars/toolbar" {
|
||||||
|
export class Toolbar {
|
||||||
|
#private;
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param ID - the ID of the HTML element which will contain the context menu
|
||||||
|
*/
|
||||||
|
constructor(ID: string);
|
||||||
|
show(): void;
|
||||||
|
hide(): void;
|
||||||
|
toggle(): void;
|
||||||
|
getElement(): HTMLElement;
|
||||||
|
getVisible(): boolean;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
declare module "toolbars/primarytoolbar" {
|
||||||
|
import { Dropdown } from "controls/dropdown";
|
||||||
|
import { Toolbar } from "toolbars/toolbar";
|
||||||
|
export class PrimaryToolbar extends Toolbar {
|
||||||
|
#private;
|
||||||
|
constructor(ID: string);
|
||||||
|
getMainDropdown(): Dropdown;
|
||||||
|
}
|
||||||
|
}
|
||||||
declare module "panels/unitcontrolpanel" {
|
declare module "panels/unitcontrolpanel" {
|
||||||
import { Panel } from "panels/panel";
|
import { Panel } from "panels/panel";
|
||||||
export class UnitControlPanel extends Panel {
|
export class UnitControlPanel extends Panel {
|
||||||
@@ -1680,35 +1793,11 @@ declare module "shortcut/shortcutmanager" {
|
|||||||
onKeyUp(callback: CallableFunction): void;
|
onKeyUp(callback: CallableFunction): void;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
declare module "toolbars/toolbar" {
|
|
||||||
export class Toolbar {
|
|
||||||
#private;
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param ID - the ID of the HTML element which will contain the context menu
|
|
||||||
*/
|
|
||||||
constructor(ID: string);
|
|
||||||
show(): void;
|
|
||||||
hide(): void;
|
|
||||||
toggle(): void;
|
|
||||||
getElement(): HTMLElement;
|
|
||||||
getVisible(): boolean;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module "toolbars/commandmodetoolbar" {
|
declare module "toolbars/commandmodetoolbar" {
|
||||||
import { Toolbar } from "toolbars/toolbar";
|
import { Toolbar } from "toolbars/toolbar";
|
||||||
export class CommandModeToolbar extends Toolbar {
|
export class CommandModeToolbar extends Toolbar {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
declare module "toolbars/primarytoolbar" {
|
|
||||||
import { Dropdown } from "controls/dropdown";
|
|
||||||
import { Toolbar } from "toolbars/toolbar";
|
|
||||||
export class PrimaryToolbar extends Toolbar {
|
|
||||||
#private;
|
|
||||||
constructor(ID: string);
|
|
||||||
getMainDropdown(): Dropdown;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
declare module "unit/citiesDatabase" {
|
declare module "unit/citiesDatabase" {
|
||||||
export var citiesDatabase: {
|
export var citiesDatabase: {
|
||||||
lat: number;
|
lat: number;
|
||||||
@@ -1996,7 +2085,7 @@ declare module "unit/unitsmanager" {
|
|||||||
* @param explosion If true, the unit will be deleted using an explosion
|
* @param explosion If true, the unit will be deleted using an explosion
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
selectedUnitsDelete(explosion?: boolean): void;
|
selectedUnitsDelete(explosion?: boolean, explosionType?: string): void;
|
||||||
/** Compute the destinations of every unit in the selected units. This function preserves the relative positions of the units, and rotates the whole formation by rotation.
|
/** Compute the destinations of every unit in the selected units. This function preserves the relative positions of the units, and rotates the whole formation by rotation.
|
||||||
*
|
*
|
||||||
* @param latlng Center of the group after the translation
|
* @param latlng Center of the group after the translation
|
||||||
@@ -2116,7 +2205,7 @@ declare module "server/servermanager" {
|
|||||||
isCommandExecuted(callback: CallableFunction, commandHash: string): void;
|
isCommandExecuted(callback: CallableFunction, commandHash: string): void;
|
||||||
addDestination(ID: number, path: any, callback?: CallableFunction): void;
|
addDestination(ID: number, path: any, callback?: CallableFunction): void;
|
||||||
spawnSmoke(color: string, latlng: LatLng, callback?: CallableFunction): void;
|
spawnSmoke(color: string, latlng: LatLng, callback?: CallableFunction): void;
|
||||||
spawnExplosion(intensity: number, latlng: LatLng, callback?: CallableFunction): void;
|
spawnExplosion(intensity: number, explosionType: string, latlng: LatLng, callback?: CallableFunction): void;
|
||||||
spawnAircrafts(units: any, coalition: string, airbaseName: string, country: string, immediate: boolean, spawnPoints: number, callback?: CallableFunction): void;
|
spawnAircrafts(units: any, coalition: string, airbaseName: string, country: string, immediate: boolean, spawnPoints: number, callback?: CallableFunction): void;
|
||||||
spawnHelicopters(units: any, coalition: string, airbaseName: string, country: string, immediate: boolean, spawnPoints: number, callback?: CallableFunction): void;
|
spawnHelicopters(units: any, coalition: string, airbaseName: string, country: string, immediate: boolean, spawnPoints: number, callback?: CallableFunction): void;
|
||||||
spawnGroundUnits(units: any, coalition: string, country: string, immediate: boolean, spawnPoints: number, callback?: CallableFunction): void;
|
spawnGroundUnits(units: any, coalition: string, country: string, immediate: boolean, spawnPoints: number, callback?: CallableFunction): void;
|
||||||
@@ -2131,7 +2220,7 @@ declare module "server/servermanager" {
|
|||||||
ID: number;
|
ID: number;
|
||||||
location: LatLng;
|
location: LatLng;
|
||||||
}[], deleteOriginal: boolean, spawnPoints: number, callback?: CallableFunction): void;
|
}[], deleteOriginal: boolean, spawnPoints: number, callback?: CallableFunction): void;
|
||||||
deleteUnit(ID: number, explosion: boolean, immediate: boolean, callback?: CallableFunction): void;
|
deleteUnit(ID: number, explosion: boolean, explosionType: string, immediate: boolean, callback?: CallableFunction): void;
|
||||||
landAt(ID: number, latlng: LatLng, callback?: CallableFunction): void;
|
landAt(ID: number, latlng: LatLng, callback?: CallableFunction): void;
|
||||||
changeSpeed(ID: number, speedChange: string, callback?: CallableFunction): void;
|
changeSpeed(ID: number, speedChange: string, callback?: CallableFunction): void;
|
||||||
setSpeed(ID: number, speed: number, callback?: CallableFunction): void;
|
setSpeed(ID: number, speed: number, callback?: CallableFunction): void;
|
||||||
|
|||||||
261
client/demo.js
261
client/demo.js
@@ -2,121 +2,12 @@ const { random } = require('@turf/turf');
|
|||||||
var basicAuth = require('express-basic-auth')
|
var basicAuth = require('express-basic-auth')
|
||||||
var enc = new TextEncoder();
|
var enc = new TextEncoder();
|
||||||
|
|
||||||
const DEMO_UNIT_DATA = {
|
const aircraftDatabase = require('./public/databases/units/aircraftDatabase.json');
|
||||||
["1"]:{ category: "Aircraft", alive: true, human: false, controlled: true, coalition: 2, country: 0, name: "KC-135", unitName: "Cool guy 1-1 who also has a very long name", groupName: "Cool group 1", state: 1, task: "Being cool!",
|
const helicopterDatabase = require('./public/databases/units/helicopterDatabase.json');
|
||||||
hasTask: true, position: { lat: 37, lng: -116, alt: 1000 }, speed: 200, horizontalVelocity: 200, verticalVelicity: 0, heading: 45, isActiveTanker: true, isActiveAWACS: false, onOff: true, followRoads: false, fuel: 50,
|
const groundUnitDatabase = require('./public/databases/units/groundUnitDatabase.json');
|
||||||
desiredSpeed: 300, desiredSpeedType: 1, desiredAltitude: 1000, desiredAltitudeType: 1, leaderID: 0,
|
const navyUnitDatabase = require('./public/databases/units/navyUnitDatabase.json');
|
||||||
formationOffset: { x: 0, y: 0, z: 0 },
|
|
||||||
targetID: 0,
|
const DEMO_UNIT_DATA = {}
|
||||||
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\0Ciao", guidance: 0, category: 0, missileCategory: 0 }, { quantity: 2, name: "A cool missile with a longer name\0Ciao", guidance: 0, category: 0, missileCategory: 0 }, { quantity: 2, name: "A cool missile\0Ciao", guidance: 0, category: 0, missileCategory: 0 } , { quantity: 2, name: "A cool missile\0Ciao", guidance: 0, category: 0, missileCategory: 0 } , { quantity: 2, name: "A cool missile\0Ciao", guidance: 0, category: 0, missileCategory: 0 } , { quantity: 2, name: "A cool missile\0Ciao", guidance: 0, category: 0, missileCategory: 0 } , { quantity: 2, name: "A cool missile\0Ciao", guidance: 0, category: 0, missileCategory: 0 } , { quantity: 2, name: "A cool missile\0Ciao", guidance: 0, category: 0, missileCategory: 0 } , { quantity: 2, name: "A cool missile\0Ciao", guidance: 0, category: 0, missileCategory: 0 } ],
|
|
||||||
contacts: [{ID: 2, detectionMethod: 1}, {ID: 3, detectionMethod: 4}, {ID: 4, detectionMethod: 1}],
|
|
||||||
activePath: [{lat: 38, lng: -115, alt: 0}, {lat: 38, lng: -114, alt: 0}]
|
|
||||||
},
|
|
||||||
["2"]:{ category: "Aircraft", alive: true, human: false, controlled: true, coalition: 1, country: 0, name: "E-3A", unitName: "Cool guy 1-2", groupName: "Cool group 2", state: 1, task: "Being cool",
|
|
||||||
hasTask: true, position: { lat: 36.9, lng: -116, alt: 1000 }, speed: 200, horizontalVelocity: 200, verticalVelicity: 0, heading: 315 * Math.PI / 180, isActiveTanker: false, isActiveAWACS: true, 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: 4, detectionMethod: 1}],
|
|
||||||
activePath: [ ]
|
|
||||||
}, ["3"]:{ category: "Helicopter", alive: true, human: false, controlled: false, coalition: 1, country: 0, name: "AH-64D_BLK_II", unitName: "Cool guy 1-4", groupName: "Cool group 3", state: 1, task: "Being cool",
|
|
||||||
hasTask: false, position: { lat: 37.1, lng: -116.1, alt: 1000 }, speed: 200, horizontalVelocity: 200, verticalVelicity: 0, heading: 315 * Math.PI / 180, isActiveTanker: false, isActiveAWACS: 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: [ ]
|
|
||||||
}, ["4"]:{ category: "GroundUnit", alive: true, human: false, controlled: true, coalition: 2, country: 0, name: "Tor 9A331", unitName: "Cool guy 2-1", groupName: "Cool group 4", state: 1, task: "Being cool",
|
|
||||||
hasTask: false, position: { lat: 37.2, lng: -116.1, alt: 1000 }, speed: 200, horizontalVelocity: 200, verticalVelicity: 0, heading: 315 * Math.PI / 180, isActiveTanker: false, isActiveAWACS: false, onOff: false, 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\0Ciao", guidance: 0, category: 0, missileCategory: 0 } ],
|
|
||||||
contacts: [{ID: 1001, detectionMethod: 16}],
|
|
||||||
activePath: [ ],
|
|
||||||
isLeader: true,
|
|
||||||
operateAs: 2
|
|
||||||
}, ["5"]:{ category: "GroundUnit", alive: true, human: false, controlled: true, coalition: 2, country: 0, name: "Gepard", unitName: "Cool guy 2-2", groupName: "Cool group 4", state: 1, task: "Being cool",
|
|
||||||
hasTask: false, position: { lat: 37.21, lng: -116.1, alt: 1000 }, speed: 200, horizontalVelocity: 200, verticalVelicity: 0, heading: 315 * Math.PI / 180, isActiveTanker: false, isActiveAWACS: false, onOff: false, 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: [],
|
|
||||||
activePath: [ ],
|
|
||||||
isLeader: false,
|
|
||||||
operateAs: 2
|
|
||||||
},
|
|
||||||
["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, horizontalVelocity: 200, verticalVelicity: 0, heading: 315 * Math.PI / 180, isActiveTanker: false, isActiveAWACS: 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: [ ]
|
|
||||||
}, ["7"]:{ category: "GroundUnit", alive: true, human: false, controlled: true, coalition: 1, country: 0, name: "Tor 9A331", unitName: "Cool guy 2-1", groupName: "Cool group 10", state: 1, task: "Being cool",
|
|
||||||
hasTask: false, position: { lat: 37.2, lng: -116.2, alt: 1000 }, speed: 200, horizontalVelocity: 200, verticalVelicity: 0, heading: 315 * Math.PI / 180, isActiveTanker: false, isActiveAWACS: 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\0Ciao", guidance: 0, category: 0, missileCategory: 0 } ],
|
|
||||||
contacts: [{ID: 1001, detectionMethod: 16}],
|
|
||||||
activePath: [ ],
|
|
||||||
isLeader: true
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
const DEMO_WEAPONS_DATA = {
|
const DEMO_WEAPONS_DATA = {
|
||||||
["1001"]:{ category: "Missile", alive: true, coalition: 2, name: "", position: { lat: 37.1, lng: -116, alt: 1000 }, speed: 200, heading: 45 * Math.PI / 180 },
|
["1001"]:{ category: "Missile", alive: true, coalition: 2, name: "", position: { lat: 37.1, lng: -116, alt: 1000 }, speed: 200, heading: 45 * Math.PI / 180 },
|
||||||
@@ -142,7 +33,55 @@ class DemoDataGenerator {
|
|||||||
},
|
},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
|
||||||
|
let baseData = { alive: true, human: false, controlled: true, coalition: 2, country: 0, unitName: "Cool guy", groupName: "Cool group 1", state: 1, task: "Being cool!",
|
||||||
|
hasTask: true, position: { lat: 37, lng: -116, alt: 1000 }, speed: 200, horizontalVelocity: 200, verticalVelicity: 0, heading: 45, isActiveTanker: false, isActiveAWACS: 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: [],
|
||||||
|
contacts: [],
|
||||||
|
activePath: [],
|
||||||
|
isLeader: true
|
||||||
|
}
|
||||||
|
|
||||||
|
var databases = Object.assign({}, aircraftDatabase, helicopterDatabase, groundUnitDatabase, navyUnitDatabase);
|
||||||
|
var t = Object.keys(databases).length;
|
||||||
|
var l = Math.floor(Math.sqrt(t));
|
||||||
|
let latIdx = 0;
|
||||||
|
let lngIdx = 0;
|
||||||
|
let idx = 1;
|
||||||
|
console.log(l)
|
||||||
|
for (let name in databases) {
|
||||||
|
DEMO_UNIT_DATA[idx] = JSON.parse(JSON.stringify(baseData));
|
||||||
|
DEMO_UNIT_DATA[idx].name = name;
|
||||||
|
DEMO_UNIT_DATA[idx].groupName = `Group-${idx}`;
|
||||||
|
DEMO_UNIT_DATA[idx].position.lat += latIdx / 5;
|
||||||
|
DEMO_UNIT_DATA[idx].position.lng += lngIdx / 5;
|
||||||
|
|
||||||
|
latIdx += 1;
|
||||||
|
if (latIdx === l) {
|
||||||
|
latIdx = 0;
|
||||||
|
lngIdx += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name in aircraftDatabase)
|
||||||
|
DEMO_UNIT_DATA[idx].category = "Aircraft";
|
||||||
|
else if (name in helicopterDatabase)
|
||||||
|
DEMO_UNIT_DATA[idx].category = "Helicopter";
|
||||||
|
else if (name in groundUnitDatabase)
|
||||||
|
DEMO_UNIT_DATA[idx].category = "GroundUnit";
|
||||||
|
else if (name in navyUnitDatabase)
|
||||||
|
DEMO_UNIT_DATA[idx].category = "NavyUnit";
|
||||||
|
idx += 1;
|
||||||
|
}
|
||||||
this.startTime = Date.now();
|
this.startTime = Date.now();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -150,51 +89,53 @@ class DemoDataGenerator {
|
|||||||
var array = new Uint8Array();
|
var array = new Uint8Array();
|
||||||
var time = Date.now();
|
var time = Date.now();
|
||||||
array = this.concat(array, this.uint64ToByteArray(BigInt(time)));
|
array = this.concat(array, this.uint64ToByteArray(BigInt(time)));
|
||||||
for (let idx in DEMO_UNIT_DATA) {
|
if (req.query["time"] == 0){
|
||||||
const unit = DEMO_UNIT_DATA[idx];
|
for (let idx in DEMO_UNIT_DATA) {
|
||||||
array = this.concat(array, this.uint32ToByteArray(idx));
|
const unit = DEMO_UNIT_DATA[idx];
|
||||||
array = this.appendString(array, unit.category, 1);
|
array = this.concat(array, this.uint32ToByteArray(idx));
|
||||||
array = this.appendUint8(array, unit.alive, 2);
|
array = this.appendString(array, unit.category, 1);
|
||||||
array = this.appendUint8(array, unit.human, 3);
|
array = this.appendUint8(array, unit.alive, 2);
|
||||||
array = this.appendUint8(array, unit.controlled, 4);
|
array = this.appendUint8(array, unit.human, 3);
|
||||||
array = this.appendUint16(array, unit.coalition, 5);
|
array = this.appendUint8(array, unit.controlled, 4);
|
||||||
array = this.appendUint8(array, unit.country, 6);
|
array = this.appendUint16(array, unit.coalition, 5);
|
||||||
array = this.appendString(array, unit.name, 7);
|
array = this.appendUint8(array, unit.country, 6);
|
||||||
array = this.appendString(array, unit.unitName, 8);
|
array = this.appendString(array, unit.name, 7);
|
||||||
array = this.appendString(array, unit.groupName, 9);
|
array = this.appendString(array, unit.unitName, 8);
|
||||||
array = this.appendUint8(array, unit.state, 10);
|
array = this.appendString(array, unit.groupName, 9);
|
||||||
array = this.appendString(array, unit.task, 11);
|
array = this.appendUint8(array, unit.state, 10);
|
||||||
array = this.appendUint8(array, unit.hasTask, 12);
|
array = this.appendString(array, unit.task, 11);
|
||||||
array = this.appendCoordinates(array, unit.position, 13);
|
array = this.appendUint8(array, unit.hasTask, 12);
|
||||||
array = this.appendDouble(array, unit.speed, 14);
|
array = this.appendCoordinates(array, unit.position, 13);
|
||||||
array = this.appendDouble(array, unit.horizontalVelocity, 15);
|
array = this.appendDouble(array, unit.speed, 14);
|
||||||
array = this.appendDouble(array, unit.verticalVelicity, 16);
|
array = this.appendDouble(array, unit.horizontalVelocity, 15);
|
||||||
array = this.appendDouble(array, unit.heading, 17);
|
array = this.appendDouble(array, unit.verticalVelicity, 16);
|
||||||
array = this.appendUint8(array, unit.isActiveTanker, 18);
|
array = this.appendDouble(array, unit.heading, 17);
|
||||||
array = this.appendUint8(array, unit.isActiveAWACS, 19);
|
array = this.appendUint8(array, unit.isActiveTanker, 18);
|
||||||
array = this.appendUint8(array, unit.onOff, 20);
|
array = this.appendUint8(array, unit.isActiveAWACS, 19);
|
||||||
array = this.appendUint8(array, unit.followRoads, 21);
|
array = this.appendUint8(array, unit.onOff, 20);
|
||||||
array = this.appendUint16(array, unit.fuel, 22);
|
array = this.appendUint8(array, unit.followRoads, 21);
|
||||||
array = this.appendDouble(array, unit.desiredSpeed, 23);
|
array = this.appendUint16(array, unit.fuel, 22);
|
||||||
array = this.appendUint8(array, unit.desiredSpeedType, 24);
|
array = this.appendDouble(array, unit.desiredSpeed, 23);
|
||||||
array = this.appendDouble(array, unit.desiredAltitude, 25);
|
array = this.appendUint8(array, unit.desiredSpeedType, 24);
|
||||||
array = this.appendUint8(array, unit.desiredAltitudeType, 26);
|
array = this.appendDouble(array, unit.desiredAltitude, 25);
|
||||||
array = this.appendUint32(array, unit.leaderID, 27);
|
array = this.appendUint8(array, unit.desiredAltitudeType, 26);
|
||||||
array = this.appendOffset(array, unit.formationOffset, 28);
|
array = this.appendUint32(array, unit.leaderID, 27);
|
||||||
array = this.appendUint32(array, unit.targetID, 29);
|
array = this.appendOffset(array, unit.formationOffset, 28);
|
||||||
array = this.appendCoordinates(array, unit.targetPosition, 30);
|
array = this.appendUint32(array, unit.targetID, 29);
|
||||||
array = this.appendUint8(array, unit.ROE, 31);
|
array = this.appendCoordinates(array, unit.targetPosition, 30);
|
||||||
array = this.appendUint8(array, unit.reactionToThreat, 32);
|
array = this.appendUint8(array, unit.ROE, 31);
|
||||||
array = this.appendUint8(array, unit.emissionsCountermeasures, 33);
|
array = this.appendUint8(array, unit.reactionToThreat, 32);
|
||||||
array = this.appendTACAN(array, unit.TACAN, 34);
|
array = this.appendUint8(array, unit.emissionsCountermeasures, 33);
|
||||||
array = this.appendRadio(array, unit.radio, 35);
|
array = this.appendTACAN(array, unit.TACAN, 34);
|
||||||
array = this.appendRadio(array, unit.generalSettings, 36);
|
array = this.appendRadio(array, unit.radio, 35);
|
||||||
array = this.appendAmmo(array, unit.ammo, 37);
|
array = this.appendRadio(array, unit.generalSettings, 36);
|
||||||
array = this.appendContacts(array, unit.contacts, 38);
|
array = this.appendAmmo(array, unit.ammo, 37);
|
||||||
array = this.appendActivePath(array, unit.activePath, 39);
|
array = this.appendContacts(array, unit.contacts, 38);
|
||||||
array = this.appendUint8(array, unit.isLeader, 40);
|
array = this.appendActivePath(array, unit.activePath, 39);
|
||||||
array = this.appendUint8(array, unit.operateAs, 41);
|
array = this.appendUint8(array, unit.isLeader, 40);
|
||||||
array = this.concat(array, this.uint8ToByteArray(255));
|
array = this.appendUint8(array, unit.operateAs, 41);
|
||||||
|
array = this.concat(array, this.uint8ToByteArray(255));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
res.end(Buffer.from(array, 'binary'));
|
res.end(Buffer.from(array, 'binary'));
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ class AirUnitEditor extends uniteditor_1.UnitEditor {
|
|||||||
(0, utils_1.addStringInput)(this.contentDiv2, "Cost", (_b = String(blueprint.cost)) !== null && _b !== void 0 ? _b : "", "number", (value) => { blueprint.cost = parseFloat(value); });
|
(0, utils_1.addStringInput)(this.contentDiv2, "Cost", (_b = String(blueprint.cost)) !== null && _b !== void 0 ? _b : "", "number", (value) => { blueprint.cost = parseFloat(value); });
|
||||||
(0, utils_1.addCheckboxInput)(this.contentDiv2, "Can target point", (_c = blueprint.canTargetPoint) !== null && _c !== void 0 ? _c : false, (value) => { blueprint.canTargetPoint = value; });
|
(0, utils_1.addCheckboxInput)(this.contentDiv2, "Can target point", (_c = blueprint.canTargetPoint) !== null && _c !== void 0 ? _c : false, (value) => { blueprint.canTargetPoint = value; });
|
||||||
(0, utils_1.addStringInput)(this.contentDiv2, "Description", (_d = blueprint.description) !== null && _d !== void 0 ? _d : "", "text", (value) => { blueprint.description = value; });
|
(0, utils_1.addStringInput)(this.contentDiv2, "Description", (_d = blueprint.description) !== null && _d !== void 0 ? _d : "", "text", (value) => { blueprint.description = value; });
|
||||||
(0, utils_1.addStringInput)(this.contentDiv2, "Abilities", (_e = blueprint.abilities) !== null && _e !== void 0 ? _e : "", "text", (value) => { blueprint.abilities = value; });
|
(0, utils_1.addStringInput)(this.contentDiv2, "Tags", (_e = blueprint.tags) !== null && _e !== void 0 ? _e : "", "text", (value) => { blueprint.tags = value; });
|
||||||
/* Add a scrollable list of loadouts that the user can edit */
|
/* Add a scrollable list of loadouts that the user can edit */
|
||||||
var title = document.createElement("label");
|
var title = document.createElement("label");
|
||||||
title.innerText = "Loadouts";
|
title.innerText = "Loadouts";
|
||||||
@@ -508,7 +508,7 @@ class GroundUnitEditor extends uniteditor_1.UnitEditor {
|
|||||||
* @param blueprint The blueprint to edit
|
* @param blueprint The blueprint to edit
|
||||||
*/
|
*/
|
||||||
setBlueprint(blueprint) {
|
setBlueprint(blueprint) {
|
||||||
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u;
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;
|
||||||
__classPrivateFieldSet(this, _GroundUnitEditor_blueprint, blueprint, "f");
|
__classPrivateFieldSet(this, _GroundUnitEditor_blueprint, blueprint, "f");
|
||||||
if (__classPrivateFieldGet(this, _GroundUnitEditor_blueprint, "f") !== null) {
|
if (__classPrivateFieldGet(this, _GroundUnitEditor_blueprint, "f") !== null) {
|
||||||
this.contentDiv2.replaceChildren();
|
this.contentDiv2.replaceChildren();
|
||||||
@@ -539,7 +539,8 @@ class GroundUnitEditor extends uniteditor_1.UnitEditor {
|
|||||||
(0, utils_1.addCheckboxInput)(this.contentDiv2, "Can operate as AAA", (_r = blueprint.canAAA) !== null && _r !== void 0 ? _r : false, (value) => { blueprint.canAAA = value; });
|
(0, utils_1.addCheckboxInput)(this.contentDiv2, "Can operate as AAA", (_r = blueprint.canAAA) !== null && _r !== void 0 ? _r : false, (value) => { blueprint.canAAA = value; });
|
||||||
(0, utils_1.addCheckboxInput)(this.contentDiv2, "Indirect fire (e.g. mortar)", (_s = blueprint.indirectFire) !== null && _s !== void 0 ? _s : false, (value) => { blueprint.indirectFire = value; });
|
(0, utils_1.addCheckboxInput)(this.contentDiv2, "Indirect fire (e.g. mortar)", (_s = blueprint.indirectFire) !== null && _s !== void 0 ? _s : false, (value) => { blueprint.indirectFire = value; });
|
||||||
(0, utils_1.addStringInput)(this.contentDiv2, "Description", (_t = blueprint.description) !== null && _t !== void 0 ? _t : "", "text", (value) => { blueprint.description = value; });
|
(0, utils_1.addStringInput)(this.contentDiv2, "Description", (_t = blueprint.description) !== null && _t !== void 0 ? _t : "", "text", (value) => { blueprint.description = value; });
|
||||||
(0, utils_1.addStringInput)(this.contentDiv2, "Abilities", (_u = blueprint.abilities) !== null && _u !== void 0 ? _u : "", "text", (value) => { blueprint.abilities = value; });
|
(0, utils_1.addStringInput)(this.contentDiv2, "Tags", (_u = blueprint.tags) !== null && _u !== void 0 ? _u : "", "text", (value) => { blueprint.tags = value; });
|
||||||
|
(0, utils_1.addStringInput)(this.contentDiv2, "Marker file", (_v = blueprint.markerFile) !== null && _v !== void 0 ? _v : "", "text", (value) => { blueprint.markerFile = value; });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/** Add a new empty blueprint
|
/** Add a new empty blueprint
|
||||||
@@ -1079,6 +1080,11 @@ function arrayToString(array) {
|
|||||||
return "[" + array.join(", ") + "]";
|
return "[" + array.join(", ") + "]";
|
||||||
}
|
}
|
||||||
exports.arrayToString = arrayToString;
|
exports.arrayToString = arrayToString;
|
||||||
|
/** Converts an a single string like [val1, val2, val3] into an array
|
||||||
|
*
|
||||||
|
* @param input The input string
|
||||||
|
* @returns The array
|
||||||
|
*/
|
||||||
function stringToArray(input) {
|
function stringToArray(input) {
|
||||||
var _a;
|
var _a;
|
||||||
return (_a = input.match(/(\w)+/g)) !== null && _a !== void 0 ? _a : [];
|
return (_a = input.match(/(\w)+/g)) !== null && _a !== void 0 ? _a : [];
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ export class AirUnitEditor extends UnitEditor {
|
|||||||
addStringInput(this.contentDiv2, "Cost", String(blueprint.cost) ?? "", "number", (value: string) => { blueprint.cost = parseFloat(value); });
|
addStringInput(this.contentDiv2, "Cost", String(blueprint.cost) ?? "", "number", (value: string) => { blueprint.cost = parseFloat(value); });
|
||||||
addCheckboxInput(this.contentDiv2, "Can target point", blueprint.canTargetPoint ?? false, (value: boolean) => {blueprint.canTargetPoint = value;})
|
addCheckboxInput(this.contentDiv2, "Can target point", blueprint.canTargetPoint ?? false, (value: boolean) => {blueprint.canTargetPoint = value;})
|
||||||
addStringInput(this.contentDiv2, "Description", blueprint.description ?? "", "text", (value: string) => {blueprint.description = value; });
|
addStringInput(this.contentDiv2, "Description", blueprint.description ?? "", "text", (value: string) => {blueprint.description = value; });
|
||||||
addStringInput(this.contentDiv2, "Abilities", blueprint.abilities ?? "", "text", (value: string) => {blueprint.abilities = value; });
|
addStringInput(this.contentDiv2, "Tags", blueprint.tags ?? "", "text", (value: string) => {blueprint.tags = value; });
|
||||||
|
|
||||||
/* Add a scrollable list of loadouts that the user can edit */
|
/* Add a scrollable list of loadouts that the user can edit */
|
||||||
var title = document.createElement("label");
|
var title = document.createElement("label");
|
||||||
|
|||||||
@@ -50,7 +50,8 @@ export class GroundUnitEditor extends UnitEditor {
|
|||||||
addCheckboxInput(this.contentDiv2, "Can operate as AAA", blueprint.canAAA ?? false, (value: boolean) => {blueprint.canAAA = value;})
|
addCheckboxInput(this.contentDiv2, "Can operate as AAA", blueprint.canAAA ?? false, (value: boolean) => {blueprint.canAAA = value;})
|
||||||
addCheckboxInput(this.contentDiv2, "Indirect fire (e.g. mortar)", blueprint.indirectFire ?? false, (value: boolean) => {blueprint.indirectFire = value;})
|
addCheckboxInput(this.contentDiv2, "Indirect fire (e.g. mortar)", blueprint.indirectFire ?? false, (value: boolean) => {blueprint.indirectFire = value;})
|
||||||
addStringInput(this.contentDiv2, "Description", blueprint.description ?? "", "text", (value: string) => {blueprint.description = value; });
|
addStringInput(this.contentDiv2, "Description", blueprint.description ?? "", "text", (value: string) => {blueprint.description = value; });
|
||||||
addStringInput(this.contentDiv2, "Abilities", blueprint.abilities ?? "", "text", (value: string) => {blueprint.abilities = value; });
|
addStringInput(this.contentDiv2, "Tags", blueprint.tags ?? "", "text", (value: string) => {blueprint.tags = value; });
|
||||||
|
addStringInput(this.contentDiv2, "Marker file", blueprint.markerFile ?? "", "text", (value: string) => {blueprint.markerFile = value; });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="50" height="50" version="1.1" viewBox="0 0 50 50" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="m45.773 41.342-19.825-33.703c-0.4253-0.72303-1.4709-0.72305-1.8962 0l-19.825 33.703c-0.43135 0.7333 0.09738 1.6577 0.94813 1.6577h39.65c0.8507 0 1.3794-0.9244 0.9481-1.6577z" fill="#3BB9FF" stroke-width="2"/>
|
||||||
|
<path d="M6.74842 41L25 9.97231L43.2516 41H6.74842Z" fill="none" stroke="#082E44" stroke-width="2"/>
|
||||||
|
<text x="16.718756" y="38.373253" fill="#082e44" font-family="sans-serif" font-size="21.333px" style="line-height:1.25" xml:space="preserve"><tspan x="16.718756" y="38.373253" font-family="sans-serif" font-size="21.333px" font-weight="bold">A</tspan></text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 724 B |
@@ -230,6 +230,7 @@ export interface UnitBlueprint {
|
|||||||
canRearm?: boolean;
|
canRearm?: boolean;
|
||||||
canAAA?: boolean;
|
canAAA?: boolean;
|
||||||
indirectFire?: boolean;
|
indirectFire?: boolean;
|
||||||
|
markerFile?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface UnitSpawnOptions {
|
export interface UnitSpawnOptions {
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ export class TemporaryUnitMarker extends CustomMarker {
|
|||||||
|
|
||||||
createIcon() {
|
createIcon() {
|
||||||
const category = getMarkerCategoryByName(this.#name);
|
const category = getMarkerCategoryByName(this.#name);
|
||||||
|
const databaseEntry = getUnitDatabaseByCategory(category)?.getByName(this.#name);
|
||||||
|
|
||||||
/* Set the icon */
|
/* Set the icon */
|
||||||
var icon = new DivIcon({
|
var icon = new DivIcon({
|
||||||
@@ -54,7 +55,8 @@ export class TemporaryUnitMarker extends CustomMarker {
|
|||||||
var unitIcon = document.createElement("div");
|
var unitIcon = document.createElement("div");
|
||||||
unitIcon.classList.add("unit-icon");
|
unitIcon.classList.add("unit-icon");
|
||||||
var img = document.createElement("img");
|
var img = document.createElement("img");
|
||||||
img.src = `/resources/theme/images/units/${category}.svg`;
|
|
||||||
|
img.src = `/resources/theme/images/units/${databaseEntry?.markerFile ?? category}.svg`;
|
||||||
img.onload = () => SVGInjector(img);
|
img.onload = () => SVGInjector(img);
|
||||||
unitIcon.appendChild(img);
|
unitIcon.appendChild(img);
|
||||||
unitIcon.toggleAttribute("data-rotate-to-heading", false);
|
unitIcon.toggleAttribute("data-rotate-to-heading", false);
|
||||||
@@ -64,7 +66,7 @@ export class TemporaryUnitMarker extends CustomMarker {
|
|||||||
if (category == "aircraft" || category == "helicopter") {
|
if (category == "aircraft" || category == "helicopter") {
|
||||||
var shortLabel = document.createElement("div");
|
var shortLabel = document.createElement("div");
|
||||||
shortLabel.classList.add("unit-short-label");
|
shortLabel.classList.add("unit-short-label");
|
||||||
shortLabel.innerText = getUnitDatabaseByCategory(category)?.getByName(this.#name)?.shortLabel || "";
|
shortLabel.innerText = databaseEntry?.shortLabel || "";
|
||||||
el.append(shortLabel);
|
el.append(shortLabel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -339,18 +339,14 @@ export function getMarkerCategoryByName(name: string) {
|
|||||||
else if (helicopterDatabase.getByName(name) != null)
|
else if (helicopterDatabase.getByName(name) != null)
|
||||||
return "helicopter";
|
return "helicopter";
|
||||||
else if (groundUnitDatabase.getByName(name) != null){
|
else if (groundUnitDatabase.getByName(name) != null){
|
||||||
var type = groundUnitDatabase.getByName(name)?.type;
|
var type = groundUnitDatabase.getByName(name)?.type ?? "";
|
||||||
if (type === "SAM")
|
if (/\bAAA|SAM\b/.test(type) || /\bmanpad|stinger\b/i.test(type))
|
||||||
return "groundunit-sam";
|
return "groundunit-sam";
|
||||||
else if (type === "SAM Search radar" || type === "SAM Track radar" || type === "SAM Search/Track radar")
|
|
||||||
return "groundunit-sam-radar";
|
|
||||||
else if (type === "SAM Launcher")
|
|
||||||
return "groundunit-sam-launcher";
|
|
||||||
else if (type === "Radar")
|
|
||||||
return "groundunit-ewr";
|
|
||||||
else
|
else
|
||||||
return "groundunit-other";
|
return "groundunit-other";
|
||||||
}
|
}
|
||||||
|
else if (navyUnitDatabase.getByName(name) != null)
|
||||||
|
return "navyunit";
|
||||||
else
|
else
|
||||||
return "groundunit-other"; // TODO add other unit types
|
return "groundunit-other"; // TODO add other unit types
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -519,6 +519,8 @@ export class Unit extends CustomMarker {
|
|||||||
|
|
||||||
/********************** Icon *************************/
|
/********************** Icon *************************/
|
||||||
createIcon(): void {
|
createIcon(): void {
|
||||||
|
const databaseEntry = this.getDatabase()?.getByName(this.#name);
|
||||||
|
|
||||||
/* Set the icon */
|
/* Set the icon */
|
||||||
var icon = new DivIcon({
|
var icon = new DivIcon({
|
||||||
className: 'leaflet-unit-icon',
|
className: 'leaflet-unit-icon',
|
||||||
@@ -558,15 +560,15 @@ export class Unit extends CustomMarker {
|
|||||||
var unitIcon = document.createElement("div");
|
var unitIcon = document.createElement("div");
|
||||||
unitIcon.classList.add("unit-icon");
|
unitIcon.classList.add("unit-icon");
|
||||||
var img = document.createElement("img");
|
var img = document.createElement("img");
|
||||||
var imgSrc;
|
|
||||||
|
|
||||||
|
var marker;
|
||||||
/* If a unit does not belong to the commanded coalition or it is not visually detected, show it with the generic aircraft square */
|
/* If a unit does not belong to the commanded coalition or it is not visually detected, show it with the generic aircraft square */
|
||||||
if (this.belongsToCommandedCoalition() || this.getDetectionMethods().some(value => [VISUAL, OPTIC].includes(value)))
|
if (this.belongsToCommandedCoalition() || this.getDetectionMethods().some(value => [VISUAL, OPTIC].includes(value)))
|
||||||
imgSrc = this.getMarkerCategory();
|
marker = databaseEntry?.markerFile ?? this.getMarkerCategory();
|
||||||
else
|
else
|
||||||
imgSrc = "aircraft";
|
marker = "aircraft";
|
||||||
|
|
||||||
img.src = `/resources/theme/images/units/${imgSrc}.svg`;
|
img.src = `/resources/theme/images/units/${marker}.svg`;
|
||||||
img.onload = () => SVGInjector(img);
|
img.onload = () => SVGInjector(img);
|
||||||
unitIcon.appendChild(img);
|
unitIcon.appendChild(img);
|
||||||
unitIcon.toggleAttribute("data-rotate-to-heading", iconOptions.rotateToHeading);
|
unitIcon.toggleAttribute("data-rotate-to-heading", iconOptions.rotateToHeading);
|
||||||
@@ -584,7 +586,7 @@ export class Unit extends CustomMarker {
|
|||||||
if (iconOptions.showShortLabel) {
|
if (iconOptions.showShortLabel) {
|
||||||
var shortLabel = document.createElement("div");
|
var shortLabel = document.createElement("div");
|
||||||
shortLabel.classList.add("unit-short-label");
|
shortLabel.classList.add("unit-short-label");
|
||||||
shortLabel.innerText = getUnitDatabaseByCategory(this.getMarkerCategory())?.getByName(this.#name)?.shortLabel || "";
|
shortLabel.innerText = databaseEntry?.shortLabel || "";
|
||||||
el.append(shortLabel);
|
el.append(shortLabel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user