Merge pull request #569 from Pax1601/533-allow-users-to-edit-the-config-json-during-the-installation-process

533 allow users to edit the config json during the installation process
This commit is contained in:
Pax1601
2023-11-22 11:35:06 +01:00
committed by GitHub
25 changed files with 8461 additions and 4871 deletions

View File

@@ -13,11 +13,11 @@ declare module "contextmenus/contextmenu" {
constructor(ID: string);
/** Show the contextmenu on top of the map, usually at the location where the user has clicked on it.
*
* @param x X screen coordinate of the top left corner of the context menu
* @param y Y screen coordinate of the top left corner of the context menu
* @param latlng Leaflet latlng object of the mouse click
* @param x X screen coordinate of the top left corner of the context menu. If undefined, use the old value
* @param y Y screen coordinate of the top left corner of the context menu. If undefined, use the old value
* @param latlng Leaflet latlng object of the mouse click. If undefined, use the old value
*/
show(x: number, y: number, latlng: LatLng): void;
show(x?: number | undefined, y?: number | undefined, latlng?: LatLng | undefined): void;
/** Hide the contextmenu
*
*/
@@ -264,6 +264,7 @@ declare module "constants/constants" {
export const MGRS_PRECISION_1M = 6;
export const DELETE_CYCLE_TIME = 0.05;
export const DELETE_SLOW_THRESHOLD = 50;
export const GROUPING_ZOOM_TRANSITION = 13;
}
declare module "map/markers/custommarker" {
import { Map, Marker } from "leaflet";
@@ -651,14 +652,14 @@ declare module "interfaces" {
declare module "unit/databases/unitdatabase" {
import { LatLng } from "leaflet";
import { UnitBlueprint } from "interfaces";
export class UnitDatabase {
export abstract class UnitDatabase {
#private;
blueprints: {
[key: string]: UnitBlueprint;
};
constructor(url?: string);
load(callback: CallableFunction): void;
getCategory(): string;
abstract getCategory(): string;
getByName(name: string): UnitBlueprint | null;
getByLabel(label: string): UnitBlueprint | null;
getBlueprints(includeDisabled?: boolean): {
@@ -679,6 +680,7 @@ declare module "unit/databases/unitdatabase" {
generateTestGrid(initialPosition: LatLng): void;
getSpawnPointsByLabel(label: string): number;
getSpawnPointsByName(name: string): number;
getUnkownUnit(name: string): UnitBlueprint;
}
}
declare module "unit/databases/aircraftdatabase" {
@@ -774,7 +776,7 @@ declare module "other/utils" {
ranges?: string[];
eras?: string[];
}): UnitBlueprint | null;
export function getMarkerCategoryByName(name: string): "aircraft" | "helicopter" | "groundunit-other" | "navyunit" | "groundunit";
export function getMarkerCategoryByName(name: string): "aircraft" | "helicopter" | "groundunit-sam" | "groundunit-other" | "navyunit";
export function getUnitDatabaseByCategory(category: string): import("unit/databases/aircraftdatabase").AircraftDatabase | import("unit/databases/helicopterdatabase").HelicopterDatabase | import("unit/databases/groundunitdatabase").GroundUnitDatabase | import("unit/databases/navyunitdatabase").NavyUnitDatabase | null;
export function base64ToBytes(base64: string): ArrayBufferLike;
export function enumToState(state: number): string;
@@ -918,28 +920,6 @@ declare module "contextmenus/mapcontextmenu" {
setCoalitionArea(coalitionArea: CoalitionArea): void;
}
}
declare module "contextmenus/unitcontextmenu" {
import { ContextMenu } from "contextmenus/contextmenu";
/** The UnitContextMenu is shown when the user rightclicks on a unit. It dynamically presents the user with possible actions to perform on the unit. */
export class UnitContextMenu extends ContextMenu {
/**
*
* @param ID - the ID of the HTML element which will contain the context menu
*/
constructor(ID: string);
/** Set the options that will be presented to the user in the contextmenu
*
* @param options Dictionary element containing the text and tooltip of the options shown in the menu
* @param callback Callback that will be called when the user clicks on one of the options
*/
setOptions(options: {
[key: string]: {
text: string;
tooltip: string;
};
}, callback: CallableFunction): void;
}
}
declare module "map/markers/targetmarker" {
import { LatLngExpression, MarkerOptions } from "leaflet";
import { CustomMarker } from "map/markers/custommarker";
@@ -1069,18 +1049,30 @@ declare module "map/rangecircle" {
_updatePath(): void;
}
}
declare module "unit/group" {
import { Unit } from "unit/unit";
export class Group {
#private;
constructor(name: string);
getName(): string;
addMember(member: Unit): void;
removeMember(member: Unit): void;
getMembers(): Unit[];
getLeader(): Unit | undefined;
}
}
declare module "unit/unit" {
import { LatLng, Map } from 'leaflet';
import { CustomMarker } from "map/markers/custommarker";
import { UnitDatabase } from "unit/databases/unitdatabase";
import { DataExtractor } from "server/dataextractor";
import { Ammo, Contact, GeneralSettings, ObjectIconOptions, Offset, Radio, TACAN, UnitData } from "interfaces";
import { Group } from "unit/group";
import { ContextActionSet } from "unit/contextactionset";
/**
* Unit class which controls unit behaviour
*
* Just about everything is a unit - even missiles!
*/
export class Unit extends CustomMarker {
export abstract class Unit extends CustomMarker {
#private;
ID: number;
getAlive(): boolean;
@@ -1126,33 +1118,50 @@ declare module "unit/unit" {
getShotsScatter(): number;
getShotsIntensity(): number;
getHealth(): number;
static getConstructor(type: string): typeof GroundUnit | undefined;
static getConstructor(type: string): typeof Aircraft | undefined;
constructor(ID: number);
getCategory(): string;
/********************** Unit data *************************/
setData(dataExtractor: DataExtractor): void;
drawLines(): void;
/** Get unit data collated into an object
/********************** Abstract methods *************************/
/** Get the unit category string
*
* @returns object populated by unit information which can also be retrieved using getters
* @returns string The unit category
*/
getData(): UnitData;
/**
*
* @returns string containing the marker category
*/
getMarkerCategory(): string;
/** Get a database of information also in this unit's category
*
* @returns UnitDatabase
*/
getDatabase(): UnitDatabase | null;
abstract getCategory(): string;
/** Get the icon options
* Used to configure how the marker appears on the map
*
* @returns ObjectIconOptions
*/
getIconOptions(): ObjectIconOptions;
abstract getIconOptions(): ObjectIconOptions;
/** Get the actions that this unit can perform
*
*/
abstract appendContextActions(contextActionSet: ContextActionSet, targetUnit: Unit | null, targetPosition: LatLng | null): void;
/**
*
* @returns string containing the marker category
*/
abstract getMarkerCategory(): string;
/**
*
* @returns string containing the default marker
*/
abstract getDefaultMarker(): string;
/********************** Unit data *************************/
/** This function is called by the units manager to update all the data coming from the backend. It reads the binary raw data using a DataExtractor
*
* @param dataExtractor The DataExtractor object pointing to the binary buffer which contains the raw data coming from the backend
*/
setData(dataExtractor: DataExtractor): void;
/** Get unit data collated into an object
*
* @returns object populated by unit information which can also be retrieved using getters
*/
getData(): UnitData;
/** Get a database of information also in this unit's category
*
* @returns UnitDatabase
*/
getDatabase(): UnitDatabase | null;
/** Set the unit as alive or dead
*
* @param newAlive (boolean) true = alive, false = dead
@@ -1168,17 +1177,7 @@ declare module "unit/unit" {
* @returns boolean
*/
getSelected(): boolean;
/** Set whether this unit is selectable
*
* @param selectable (boolean)
*/
setSelectable(selectable: boolean): void;
/** Get whether this unit is selectable
*
* @returns boolean
*/
getSelectable(): boolean;
/** Set the number of the hotgroup to which the unit belongs
/** Set the number of the hotgroup to which the unit belongss
*
* @param hotgroup (number)
*/
@@ -1203,6 +1202,11 @@ declare module "unit/unit" {
* @returns Unit[]
*/
getGroupMembers(): Unit[];
/** Return the leader of the group
*
* @returns Unit The leader of the group
*/
getGroupLeader(): Unit | null | undefined;
/** Returns whether the user is allowed to command this unit, based on coalition
*
* @returns boolean
@@ -1210,6 +1214,11 @@ declare module "unit/unit" {
belongsToCommandedCoalition(): boolean;
getType(): string;
getSpawnPoints(): number | undefined;
getDatabaseEntry(): import("interfaces").UnitBlueprint | undefined;
getGroup(): Group | null;
setGroup(group: Group | null): void;
drawLines(): void;
checkZoomRedraw(): boolean;
/********************** Icon *************************/
createIcon(): void;
/********************** Visibility *************************/
@@ -1223,7 +1232,6 @@ declare module "unit/unit" {
isInViewport(): boolean;
canTargetPoint(): boolean;
canRearm(): boolean;
canLandAtPoint(): boolean;
canAAA(): boolean;
indirectFire(): boolean;
isTanker(): boolean;
@@ -1264,19 +1272,12 @@ declare module "unit/unit" {
setShotsScatter(shotsScatter: number): void;
setShotsIntensity(shotsIntensity: number): void;
/***********************************************/
getActions(): {
[key: string]: {
text: string;
tooltip: string;
type: string;
};
};
executeAction(e: any, action: string): void;
/***********************************************/
onAdd(map: Map): this;
getActionOptions(): {};
onGroupChanged(member: Unit): void;
showFollowOptions(units: Unit[]): void;
applyFollowOptions(formation: string, units: Unit[]): void;
}
export class AirUnit extends Unit {
export abstract class AirUnit extends Unit {
getIconOptions(): {
showState: boolean;
showVvi: boolean;
@@ -1290,21 +1291,21 @@ declare module "unit/unit" {
showCallsign: boolean;
rotateToHeading: boolean;
};
getActions(): {
[key: string]: {
text: string;
tooltip: string;
type: string;
};
};
appendContextActions(contextActionSet: ContextActionSet, targetUnit: Unit | null, targetPosition: LatLng | null): void;
}
export class Aircraft extends AirUnit {
constructor(ID: number);
getCategory(): string;
appendContextActions(contextActionSet: ContextActionSet, targetUnit: Unit | null, targetPosition: LatLng | null): void;
getMarkerCategory(): string;
getDefaultMarker(): string;
}
export class Helicopter extends AirUnit {
constructor(ID: number);
getCategory(): string;
appendContextActions(contextActionSet: ContextActionSet, targetUnit: Unit | null, targetPosition: LatLng | null): void;
getMarkerCategory(): string;
getDefaultMarker(): string;
}
export class GroundUnit extends Unit {
constructor(ID: number);
@@ -1321,15 +1322,13 @@ declare module "unit/unit" {
showCallsign: boolean;
rotateToHeading: boolean;
};
getActions(): {
[key: string]: {
text: string;
tooltip: string;
type: string;
};
};
appendContextActions(contextActionSet: ContextActionSet, targetUnit: Unit | null, targetPosition: LatLng | null): void;
getCategory(): string;
getType(): string;
getDatabaseEntry(): import("interfaces").UnitBlueprint | undefined;
checkZoomRedraw(): boolean;
getMarkerCategory(): "groundunit-sam" | "groundunit";
getDefaultMarker(): string;
}
export class NavyUnit extends Unit {
constructor(ID: number);
@@ -1346,16 +1345,59 @@ declare module "unit/unit" {
showCallsign: boolean;
rotateToHeading: boolean;
};
getActions(): {
[key: string]: {
text: string;
tooltip: string;
type: string;
};
};
getMarkerCategory(): string;
appendContextActions(contextActionSet: ContextActionSet, targetUnit: Unit | null, targetPosition: LatLng | null): void;
getCategory(): string;
getType(): string;
getMarkerCategory(): string;
getDefaultMarker(): string;
}
}
declare module "unit/contextaction" {
import { Unit } from "unit/unit";
export interface ContextActionOptions {
isScenic?: boolean;
}
export class ContextAction {
#private;
constructor(id: string, label: string, description: string, callback: CallableFunction, hideContextAfterExecution: boolean | undefined, options: ContextActionOptions);
addUnit(unit: Unit): void;
getId(): string;
getLabel(): string;
getOptions(): ContextActionOptions;
getDescription(): string;
getCallback(): CallableFunction | null;
executeCallback(): void;
getHideContextAfterExecution(): boolean;
}
}
declare module "unit/contextactionset" {
import { ContextAction, ContextActionOptions } from "unit/contextaction";
import { Unit } from "unit/unit";
export class ContextActionSet {
#private;
constructor();
addContextAction(unit: Unit, id: string, label: string, description: string, callback: CallableFunction, hideContextAfterExecution?: boolean, options?: ContextActionOptions): void;
getContextActions(): {
[key: string]: ContextAction;
};
}
}
declare module "contextmenus/unitcontextmenu" {
import { ContextActionSet } from "unit/contextactionset";
import { ContextMenu } from "contextmenus/contextmenu";
/** The UnitContextMenu is shown when the user rightclicks on a unit. It dynamically presents the user with possible actions to perform on the unit. */
export class UnitContextMenu extends ContextMenu {
/**
*
* @param ID - the ID of the HTML element which will contain the context menu
*/
constructor(ID: string);
/** Set the options that will be presented to the user in the contextmenu
*
* @param options Dictionary element containing the text and tooltip of the options shown in the menu
* @param callback Callback that will be called when the user clicks on one of the options
*/
setContextActions(contextActionSet: ContextActionSet): void;
}
}
declare module "contextmenus/airbasecontextmenu" {
@@ -1457,7 +1499,7 @@ declare module "contextmenus/airbasespawnmenu" {
* @param x X screen coordinate of the top left corner of the context menu
* @param y Y screen coordinate of the top left corner of the context menu
*/
show(x: number, y: number): void;
show(x: number | undefined, y: number | undefined): void;
/** Sets the airbase at which the new unit will be spawned
*
* @param airbase The airbase at which the new unit will be spawned. Note: if the airbase has no suitable parking spots, the airplane may be spawned on the runway, or spawning may fail.
@@ -1465,6 +1507,97 @@ declare module "contextmenus/airbasespawnmenu" {
setAirbase(airbase: Airbase): void;
}
}
declare module "map/touchboxselect" {
export var TouchBoxSelect: (new (...args: any[]) => any) & typeof import("leaflet").Class;
}
declare module "map/markers/destinationpreviewHandle" {
import { LatLng } from "leaflet";
import { CustomMarker } from "map/markers/custommarker";
export class DestinationPreviewHandle extends CustomMarker {
constructor(latlng: LatLng);
createIcon(): void;
}
}
declare module "map/map" {
import * as L from "leaflet";
import { MapContextMenu } from "contextmenus/mapcontextmenu";
import { UnitContextMenu } from "contextmenus/unitcontextmenu";
import { AirbaseContextMenu } from "contextmenus/airbasecontextmenu";
import { Airbase } from "mission/airbase";
import { Unit } from "unit/unit";
import { TemporaryUnitMarker } from "map/markers/temporaryunitmarker";
import { CoalitionArea } from "map/coalitionarea/coalitionarea";
import { CoalitionAreaContextMenu } from "contextmenus/coalitionareacontextmenu";
import { AirbaseSpawnContextMenu } from "contextmenus/airbasespawnmenu";
export type MapMarkerControl = {
"image": string;
"isProtected"?: boolean;
"name": string;
"protectable"?: boolean;
"toggles": string[];
"tooltip": string;
};
export class Map extends L.Map {
#private;
/**
*
* @param ID - the ID of the HTML element which will contain the context menu
*/
constructor(ID: string);
addVisibilityOption(option: string, defaultValue: boolean): void;
setLayer(layerName: string): void;
getLayers(): string[];
setState(state: string): void;
getState(): string;
deselectAllCoalitionAreas(): void;
deleteCoalitionArea(coalitionArea: CoalitionArea): void;
setHiddenType(key: string, value: boolean): void;
getHiddenTypes(): string[];
hideAllContextMenus(): void;
showMapContextMenu(x: number, y: number, latlng: L.LatLng): void;
hideMapContextMenu(): void;
getMapContextMenu(): MapContextMenu;
showUnitContextMenu(x?: number | undefined, y?: number | undefined, latlng?: L.LatLng | undefined): void;
getUnitContextMenu(): UnitContextMenu;
hideUnitContextMenu(): void;
showAirbaseContextMenu(airbase: Airbase, x?: number | undefined, y?: number | undefined, latlng?: L.LatLng | undefined): void;
getAirbaseContextMenu(): AirbaseContextMenu;
hideAirbaseContextMenu(): void;
showAirbaseSpawnMenu(airbase: Airbase, x?: number | undefined, y?: number | undefined, latlng?: L.LatLng | undefined): void;
getAirbaseSpawnMenu(): AirbaseSpawnContextMenu;
hideAirbaseSpawnMenu(): void;
showCoalitionAreaContextMenu(x: number, y: number, latlng: L.LatLng, coalitionArea: CoalitionArea): void;
getCoalitionAreaContextMenu(): CoalitionAreaContextMenu;
hideCoalitionAreaContextMenu(): void;
isZooming(): boolean;
getMousePosition(): L.Point;
getMouseCoordinates(): L.LatLng;
spawnFromAirbase(e: any): void;
centerOnUnit(ID: number | null): void;
getCenterUnit(): Unit | null;
setTheatre(theatre: string): void;
getMiniMapLayerGroup(): L.LayerGroup<any>;
handleMapPanning(e: any): void;
addTemporaryMarker(latlng: L.LatLng, name: string, coalition: string, commandHash?: string): TemporaryUnitMarker;
getSelectedCoalitionArea(): CoalitionArea | undefined;
bringCoalitionAreaToBack(coalitionArea: CoalitionArea): void;
getVisibilityOptions(): {
[key: string]: boolean;
};
getPreviousZoom(): number;
unitIsProtected(unit: Unit): boolean;
getMapMarkerControls(): MapMarkerControl[];
}
}
declare module "mission/bullseye" {
import { CustomMarker } from "map/markers/custommarker";
export class Bullseye extends CustomMarker {
#private;
createIcon(): void;
setCoalition(coalition: string): void;
getCoalition(): string;
}
}
declare module "context/context" {
export interface ContextInterface {
useSpawnMenu?: boolean;
@@ -1532,96 +1665,6 @@ declare module "popups/popup" {
setText(text: string): void;
}
}
declare module "map/touchboxselect" {
export var TouchBoxSelect: (new (...args: any[]) => any) & typeof import("leaflet").Class;
}
declare module "map/markers/destinationpreviewHandle" {
import { LatLng } from "leaflet";
import { CustomMarker } from "map/markers/custommarker";
export class DestinationPreviewHandle extends CustomMarker {
constructor(latlng: LatLng);
createIcon(): void;
}
}
declare module "map/map" {
import * as L from "leaflet";
import { MapContextMenu } from "contextmenus/mapcontextmenu";
import { UnitContextMenu } from "contextmenus/unitcontextmenu";
import { AirbaseContextMenu } from "contextmenus/airbasecontextmenu";
import { Airbase } from "mission/airbase";
import { Unit } from "unit/unit";
import { TemporaryUnitMarker } from "map/markers/temporaryunitmarker";
import { CoalitionArea } from "map/coalitionarea/coalitionarea";
import { CoalitionAreaContextMenu } from "contextmenus/coalitionareacontextmenu";
import { AirbaseSpawnContextMenu } from "contextmenus/airbasespawnmenu";
export type MapMarkerControl = {
"image": string;
"isProtected"?: boolean;
"name": string;
"protectable"?: boolean;
"toggles": string[];
"tooltip": string;
};
export class Map extends L.Map {
#private;
/**
*
* @param ID - the ID of the HTML element which will contain the context menu
*/
constructor(ID: string);
addVisibilityOption(option: string, defaultValue: boolean): void;
setLayer(layerName: string): void;
getLayers(): string[];
setState(state: string): void;
getState(): string;
deselectAllCoalitionAreas(): void;
deleteCoalitionArea(coalitionArea: CoalitionArea): void;
setHiddenType(key: string, value: boolean): void;
getHiddenTypes(): string[];
hideAllContextMenus(): void;
showMapContextMenu(x: number, y: number, latlng: L.LatLng): void;
hideMapContextMenu(): void;
getMapContextMenu(): MapContextMenu;
showUnitContextMenu(x: number, y: number, latlng: L.LatLng): void;
getUnitContextMenu(): UnitContextMenu;
hideUnitContextMenu(): void;
showAirbaseContextMenu(x: number, y: number, latlng: L.LatLng, airbase: Airbase): void;
getAirbaseContextMenu(): AirbaseContextMenu;
hideAirbaseContextMenu(): void;
showAirbaseSpawnMenu(x: number, y: number, latlng: L.LatLng, airbase: Airbase): void;
getAirbaseSpawnMenu(): AirbaseSpawnContextMenu;
hideAirbaseSpawnMenu(): void;
showCoalitionAreaContextMenu(x: number, y: number, latlng: L.LatLng, coalitionArea: CoalitionArea): void;
getCoalitionAreaContextMenu(): CoalitionAreaContextMenu;
hideCoalitionAreaContextMenu(): void;
isZooming(): boolean;
getMousePosition(): L.Point;
getMouseCoordinates(): L.LatLng;
spawnFromAirbase(e: any): void;
centerOnUnit(ID: number | null): void;
getCenterUnit(): Unit | null;
setTheatre(theatre: string): void;
getMiniMapLayerGroup(): L.LayerGroup<any>;
handleMapPanning(e: any): void;
addTemporaryMarker(latlng: L.LatLng, name: string, coalition: string, commandHash?: string): TemporaryUnitMarker;
getSelectedCoalitionArea(): CoalitionArea | undefined;
bringCoalitionAreaToBack(coalitionArea: CoalitionArea): void;
getVisibilityOptions(): {
[key: string]: boolean;
};
unitIsProtected(unit: Unit): boolean;
getMapMarkerControls(): MapMarkerControl[];
}
}
declare module "mission/bullseye" {
import { CustomMarker } from "map/markers/custommarker";
export class Bullseye extends CustomMarker {
#private;
createIcon(): void;
setCoalition(coalition: string): void;
getCoalition(): string;
}
}
declare module "mission/missionmanager" {
import { Airbase } from "mission/airbase";
import { Bullseye } from "mission/bullseye";
@@ -1922,139 +1965,139 @@ declare module "unit/unitsmanager" {
* @param mantainRelativePosition If true, the selected units will mantain their relative positions when reaching the target. This is useful to maintain a formation for groun/navy units
* @param rotation Rotation in radians by which the formation will be rigidly rotated. E.g. a ( V ) formation will look like this ( < ) if rotated pi/4 radians (90 degrees)
*/
selectedUnitsAddDestination(latlng: L.LatLng, mantainRelativePosition: boolean, rotation: number): void;
addDestination(latlng: L.LatLng, mantainRelativePosition: boolean, rotation: number, units?: Unit[] | null): void;
/** Clear the destinations of all the selected units
*
*/
selectedUnitsClearDestinations(): void;
clearDestinations(units?: Unit[] | null): void;
/** Instruct all the selected units to land at a specific location
*
* @param latlng Location where to land at
*/
selectedUnitsLandAt(latlng: LatLng): void;
landAt(latlng: LatLng, units?: Unit[] | null): void;
/** Instruct all the selected units to change their speed
*
* @param speedChange Speed change, either "stop", "slow", or "fast". The specific value depends on the unit category
*/
selectedUnitsChangeSpeed(speedChange: string): void;
changeSpeed(speedChange: string, units?: Unit[] | null): void;
/** Instruct all the selected units to change their altitude
*
* @param altitudeChange Altitude change, either "climb" or "descend". The specific value depends on the unit category
*/
selectedUnitsChangeAltitude(altitudeChange: string): void;
changeAltitude(altitudeChange: string, units?: Unit[] | null): void;
/** Set a specific speed to all the selected units
*
* @param speed Value to set, in m/s
*/
selectedUnitsSetSpeed(speed: number): void;
setSpeed(speed: number, units?: Unit[] | null): void;
/** Set a specific speed type to all the selected units
*
* @param speedType Value to set, either "CAS" or "GS". If "CAS" is selected, the unit will try to maintain the selected Calibrated Air Speed, but DCS will still only maintain a Ground Speed value so errors may arise depending on wind.
*/
selectedUnitsSetSpeedType(speedType: string): void;
setSpeedType(speedType: string, units?: Unit[] | null): void;
/** Set a specific altitude to all the selected units
*
* @param altitude Value to set, in m
*/
selectedUnitsSetAltitude(altitude: number): void;
setAltitude(altitude: number, units?: Unit[] | null): void;
/** Set a specific altitude type to all the selected units
*
* @param altitudeType Value to set, either "ASL" or "AGL". If "AGL" is selected, the unit will try to maintain the selected Above Ground Level altitude. Due to a DCS bug, this will only be true at the final position.
*/
selectedUnitsSetAltitudeType(altitudeType: string): void;
setAltitudeType(altitudeType: string, units?: Unit[] | null): void;
/** Set a specific ROE to all the selected units
*
* @param ROE Value to set, see constants for acceptable values
*/
selectedUnitsSetROE(ROE: string): void;
setROE(ROE: string, units?: Unit[] | null): void;
/** Set a specific reaction to threat to all the selected units
*
* @param reactionToThreat Value to set, see constants for acceptable values
*/
selectedUnitsSetReactionToThreat(reactionToThreat: string): void;
setReactionToThreat(reactionToThreat: string, units?: Unit[] | null): void;
/** Set a specific emissions & countermeasures to all the selected units
*
* @param emissionCountermeasure Value to set, see constants for acceptable values
*/
selectedUnitsSetEmissionsCountermeasures(emissionCountermeasure: string): void;
setEmissionsCountermeasures(emissionCountermeasure: string, units?: Unit[] | null): void;
/** Turn selected units on or off, only works on ground and navy units
*
* @param onOff If true, the unit will be turned on
*/
selectedUnitsSetOnOff(onOff: boolean): void;
setOnOff(onOff: boolean, units?: Unit[] | null): void;
/** Instruct the selected units to follow roads, only works on ground units
*
* @param followRoads If true, units will follow roads
*/
selectedUnitsSetFollowRoads(followRoads: boolean): void;
setFollowRoads(followRoads: boolean, units?: Unit[] | null): void;
/** Instruct selected units to operate as a certain coalition
*
* @param operateAsBool If true, units will operate as blue
*/
selectedUnitsSetOperateAs(operateAsBool: boolean): void;
setOperateAs(operateAsBool: boolean, units?: Unit[] | null): void;
/** Instruct units to attack a specific unit
*
* @param ID ID of the unit to attack
*/
selectedUnitsAttackUnit(ID: number): void;
attackUnit(ID: number, units?: Unit[] | null): void;
/** Instruct units to refuel at the nearest tanker, if possible. Else units will RTB
*
*/
selectedUnitsRefuel(): void;
refuel(units?: Unit[] | null): void;
/** Instruct the selected units to follow another unit in a formation. Only works for aircrafts and helicopters.
*
* @param ID ID of the unit to follow
* @param offset Optional parameter, defines a static offset. X: front-rear, positive front, Y: top-bottom, positive top, Z: left-right, positive right
* @param formation Optional parameter, defines a predefined formation type. Values are: "trail", "echelon-lh", "echelon-rh", "line-abreast-lh", "line-abreast-rh", "front", "diamond"
*/
selectedUnitsFollowUnit(ID: number, offset?: {
followUnit(ID: number, offset?: {
"x": number;
"y": number;
"z": number;
}, formation?: string): void;
}, formation?: string, units?: Unit[] | null): void;
/** Instruct the selected units to perform precision bombing of specific coordinates
*
* @param latlng Location to bomb
*/
selectedUnitsBombPoint(latlng: LatLng): void;
bombPoint(latlng: LatLng, units?: Unit[] | null): void;
/** Instruct the selected units to perform carpet bombing of specific coordinates
*
* @param latlng Location to bomb
*/
selectedUnitsCarpetBomb(latlng: LatLng): void;
carpetBomb(latlng: LatLng, units?: Unit[] | null): void;
/** Instruct the selected units to fire at specific coordinates
*
* @param latlng Location to fire at
*/
selectedUnitsFireAtArea(latlng: LatLng): void;
fireAtArea(latlng: LatLng, units?: Unit[] | null): void;
/** Instruct the selected units to simulate a fire fight at specific coordinates
*
* @param latlng Location to fire at
*/
selectedUnitsSimulateFireFight(latlng: LatLng): void;
simulateFireFight(latlng: LatLng, units?: Unit[] | null): void;
/** Instruct units to enter into scenic AAA mode. Units will shoot in the air without aiming
*
*/
selectedUnitsScenicAAA(): void;
scenicAAA(units?: Unit[] | null): void;
/** Instruct units to enter into miss on purpose mode. Units will aim to the nearest enemy unit but not precisely.
*
*/
selectedUnitsMissOnPurpose(): void;
missOnPurpose(units?: Unit[] | null): void;
/** Instruct units to land at specific point
*
* @param latlng Point where to land
*/
selectedUnitsLandAtPoint(latlng: LatLng): void;
landAtPoint(latlng: LatLng, units?: Unit[] | null): void;
/** Set a specific shots scatter to all the selected units
*
* @param shotsScatter Value to set
*/
selectedUnitsSetShotsScatter(shotsScatter: number): void;
setShotsScatter(shotsScatter: number, units?: Unit[] | null): void;
/** Set a specific shots intensity to all the selected units
*
* @param shotsScatter Value to set
*/
selectedUnitsSetShotsIntensity(shotsIntensity: number): void;
setShotsIntensity(shotsIntensity: number, units?: Unit[] | null): void;
/*********************** Control operations on selected units ************************/
/** See getUnitsCategories for more info
*
@@ -2070,42 +2113,42 @@ declare module "unit/unitsmanager" {
/** Groups the selected units in a single (DCS) group, if all the units have the same category
*
*/
selectedUnitsCreateGroup(): void;
createGroup(units?: Unit[] | null): void;
/** Set the hotgroup for the selected units. It will be the only hotgroup of the unit
*
* @param hotgroup Hotgroup number
*/
selectedUnitsSetHotgroup(hotgroup: number): void;
setHotgroup(hotgroup: number, units?: Unit[] | null): void;
/** Add the selected units to a hotgroup. Units can be in multiple hotgroups at the same type
*
* @param hotgroup Hotgroup number
*/
selectedUnitsAddToHotgroup(hotgroup: number): void;
addToHotgroup(hotgroup: number, units?: Unit[] | null): void;
/** Delete the selected units
*
* @param explosion If true, the unit will be deleted using an explosion
* @returns
*/
selectedUnitsDelete(explosion?: boolean, explosionType?: string): void;
delete(explosion?: boolean, explosionType?: string, units?: Unit[] | null): 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.
*
* @param latlng Center of the group after the translation
* @param rotation Rotation of the group, in radians
* @returns Array of positions for each unit, in order
*/
selectedUnitsComputeGroupDestination(latlng: LatLng, rotation: number): {
computeGroupDestination(latlng: LatLng, rotation: number, units?: Unit[] | null): {
[key: number]: LatLng;
};
/** Copy the selected units and store their properties in memory
*
*/
selectedUnitsCopy(): void;
copy(units?: Unit[] | null): void;
/*********************** Unit manipulation functions ************************/
/** Paste the copied units
*
* @returns True if units were pasted successfully
*/
pasteUnits(): false | undefined;
paste(): false | undefined;
/** Automatically create an Integrated Air Defence System from a CoalitionArea object. The units will be mostly focused around big cities. The bigger the city, the larger the amount of units created next to it.
* If the CoalitionArea does not contain any city, no units will be created
*

View File

@@ -43,7 +43,7 @@ if (config["server"] != undefined)
module.exports = app;
const DemoDataGenerator = require('./demo.js');
var demoDataGenerator = new DemoDataGenerator(app);
var demoDataGenerator = new DemoDataGenerator(app, config);

View File

@@ -1,5 +1,18 @@
#!/usr/bin/env node
console.log('\x1b[36m%s\x1b[0m', "*********************************************************************");
console.log('\x1b[36m%s\x1b[0m', "* _____ _____ _____ ____ _ *");
console.log('\x1b[36m%s\x1b[0m', "* | __ \\ / ____|/ ____| / __ \\| | *");
console.log('\x1b[36m%s\x1b[0m', "* | | | | | | (___ | | | | |_ _ _ __ ___ _ __ _ _ ___ *");
console.log('\x1b[36m%s\x1b[0m', "* | | | | | \\___ \\ | | | | | | | | '_ ` _ \\| '_ \\| | | / __| *");
console.log('\x1b[36m%s\x1b[0m', "* | |__| | |____ ____) | | |__| | | |_| | | | | | | |_) | |_| \\__ \\ *");
console.log('\x1b[36m%s\x1b[0m', "* |_____/ \\_____|_____/ \\____/|_|\\__, |_| |_| |_| .__/ \\__,_|___/ *");
console.log('\x1b[36m%s\x1b[0m', "* __/ | | | *");
console.log('\x1b[36m%s\x1b[0m', "* |___/ |_| *");
console.log('\x1b[36m%s\x1b[0m', "*********************************************************************");
console.log('\x1b[36m%s\x1b[0m', "");
console.log("Please wait while DCS Olympus Server starts up...");
var fs = require('fs');
let rawdata = fs.readFileSync('../olympus.json');
let config = JSON.parse(rawdata);
@@ -98,3 +111,6 @@ function onListening() {
: 'port ' + addr.port;
debug('Listening on ' + bind);
}
console.log("DCS Olympus server v0.4.7 started correctly!")
console.log("Waiting for connections...")

View File

@@ -14,7 +14,7 @@ const DEMO_WEAPONS_DATA = {
}
class DemoDataGenerator {
constructor(app)
constructor(app, config)
{
app.get('/demo/units', (req, res) => this.units(req, res));
app.get('/demo/weapons', (req, res) => this.weapons(req, res));
@@ -25,11 +25,13 @@ class DemoDataGenerator {
app.get('/demo/commands', (req, res) => this.command(req, res));
app.put('/demo', (req, res) => this.put(req, res));
console.log(config["authentication"]["gameMasterPassword"])
app.use('/demo', basicAuth({
users: {
'admin': 'password',
'blue': 'bluepassword',
'red': 'redpassword'
'admin': config["authentication"]["gameMasterPassword"],
'blue': config["authentication"]["blueCommanderPassword"],
'red': config["authentication"]["redCommanderPassword"]
},
}))

6357
client/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -5,7 +5,8 @@
"version": "v0.4.7-alpha",
"private": true,
"scripts": {
"build": "browserify .\\src\\index.ts --debug -o .\\public\\javascripts\\bundle.js -t [ babelify --global true --presets [ @babel/preset-env ] --extensions '.js'] -p [ tsify --noImplicitAny ] && copy.bat",
"build": "browserify .\\src\\index.ts --debug -o .\\public\\javascripts\\bundle.js -t [ babelify --global true --presets [ @babel/preset-env ] --extensions '.js'] -p [ tsify --noImplicitAny ] && copy.bat",
"build-release": "browserify .\\src\\index.ts -o .\\public\\javascripts\\bundle.js -t [ babelify --global true --presets [ @babel/preset-env ] --extensions '.js'] -p [ tsify --noImplicitAny ] -p [ tinyify ] && copy.bat",
"emit-declarations": "tsc --project tsconfig.json --declaration --emitDeclarationOnly --outfile ./@types/olympus/index.d.ts",
"copy": "copy.bat",
"start": "node ./bin/www",
@@ -20,6 +21,7 @@
"ejs": "^3.1.8",
"express": "~4.16.1",
"express-basic-auth": "^1.2.1",
"js-sha256": "^0.10.1",
"leaflet-gesture-handling": "^1.2.2",
"morgan": "~1.9.1",
"save": "^2.9.0",
@@ -48,10 +50,9 @@
"nodemon": "^2.0.20",
"requirejs": "^2.3.6",
"sortablejs": "^1.15.0",
"tinyify": "^4.0.0",
"tsify": "^5.0.4",
"tslib": "latest",
"typedoc": "^0.24.8",
"typedoc-umlclass": "^0.7.1",
"typescript": "^4.9.4",
"usng.js": "^0.4.5",
"watchify": "^4.0.0"

View File

@@ -1,384 +0,0 @@
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
"use strict";
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
if (kind === "m") throw new TypeError("Private method is not writable");
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
};
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var _ControlTipsPlugin_instances, _ControlTipsPlugin_element, _ControlTipsPlugin_app, _ControlTipsPlugin_shortcutManager, _ControlTipsPlugin_cursorIsHoveringOverUnit, _ControlTipsPlugin_cursorIsHoveringOverAirbase, _ControlTipsPlugin_mouseoverElement, _ControlTipsPlugin_updateTips;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ControlTipsPlugin = void 0;
const SHOW_CONTROL_TIPS = "Show control tips";
class ControlTipsPlugin {
constructor() {
_ControlTipsPlugin_instances.add(this);
_ControlTipsPlugin_element.set(this, void 0);
_ControlTipsPlugin_app.set(this, void 0);
_ControlTipsPlugin_shortcutManager.set(this, void 0);
_ControlTipsPlugin_cursorIsHoveringOverUnit.set(this, false);
_ControlTipsPlugin_cursorIsHoveringOverAirbase.set(this, false);
_ControlTipsPlugin_mouseoverElement.set(this, void 0);
__classPrivateFieldSet(this, _ControlTipsPlugin_element, document.createElement("div"), "f");
__classPrivateFieldGet(this, _ControlTipsPlugin_element, "f").id = "control-tips-panel";
document.body.appendChild(__classPrivateFieldGet(this, _ControlTipsPlugin_element, "f"));
}
getName() {
return "Control Tips Plugin";
}
initialize(app) {
__classPrivateFieldSet(this, _ControlTipsPlugin_app, app, "f");
__classPrivateFieldSet(this, _ControlTipsPlugin_shortcutManager, __classPrivateFieldGet(this, _ControlTipsPlugin_app, "f").getShortcutManager(), "f");
__classPrivateFieldGet(this, _ControlTipsPlugin_shortcutManager, "f").onKeyDown(() => {
__classPrivateFieldGet(this, _ControlTipsPlugin_instances, "m", _ControlTipsPlugin_updateTips).call(this);
});
__classPrivateFieldGet(this, _ControlTipsPlugin_shortcutManager, "f").onKeyUp(() => {
__classPrivateFieldGet(this, _ControlTipsPlugin_instances, "m", _ControlTipsPlugin_updateTips).call(this);
});
document.addEventListener("airbaseMouseover", (ev) => {
__classPrivateFieldSet(this, _ControlTipsPlugin_cursorIsHoveringOverAirbase, true, "f");
__classPrivateFieldGet(this, _ControlTipsPlugin_instances, "m", _ControlTipsPlugin_updateTips).call(this);
});
document.addEventListener("airbaseMouseout", (ev) => {
__classPrivateFieldSet(this, _ControlTipsPlugin_cursorIsHoveringOverAirbase, false, "f");
__classPrivateFieldGet(this, _ControlTipsPlugin_instances, "m", _ControlTipsPlugin_updateTips).call(this);
});
document.addEventListener("unitDeselection", (ev) => {
__classPrivateFieldGet(this, _ControlTipsPlugin_instances, "m", _ControlTipsPlugin_updateTips).call(this);
});
document.addEventListener("unitMouseover", (ev) => {
__classPrivateFieldSet(this, _ControlTipsPlugin_cursorIsHoveringOverUnit, true, "f");
__classPrivateFieldGet(this, _ControlTipsPlugin_instances, "m", _ControlTipsPlugin_updateTips).call(this);
});
document.addEventListener("unitMouseout", (ev) => {
__classPrivateFieldSet(this, _ControlTipsPlugin_cursorIsHoveringOverUnit, false, "f");
__classPrivateFieldGet(this, _ControlTipsPlugin_instances, "m", _ControlTipsPlugin_updateTips).call(this);
});
document.addEventListener("unitsSelection", (ev) => {
__classPrivateFieldGet(this, _ControlTipsPlugin_instances, "m", _ControlTipsPlugin_updateTips).call(this);
});
document.addEventListener("mapVisibilityOptionsChanged", () => {
this.toggle(!__classPrivateFieldGet(this, _ControlTipsPlugin_app, "f").getMap().getVisibilityOptions()[SHOW_CONTROL_TIPS]);
});
document.addEventListener("mouseover", (ev) => {
if (ev.target instanceof HTMLElement) {
__classPrivateFieldSet(this, _ControlTipsPlugin_mouseoverElement, ev.target, "f");
}
__classPrivateFieldGet(this, _ControlTipsPlugin_instances, "m", _ControlTipsPlugin_updateTips).call(this);
});
document.addEventListener("mouseup", (ev) => {
__classPrivateFieldGet(this, _ControlTipsPlugin_instances, "m", _ControlTipsPlugin_updateTips).call(this);
});
__classPrivateFieldGet(this, _ControlTipsPlugin_instances, "m", _ControlTipsPlugin_updateTips).call(this);
__classPrivateFieldGet(this, _ControlTipsPlugin_app, "f").getMap().addVisibilityOption(SHOW_CONTROL_TIPS, true);
return true;
}
getElement() {
return __classPrivateFieldGet(this, _ControlTipsPlugin_element, "f");
}
toggle(bool) {
this.getElement().classList.toggle("hide", bool);
}
}
exports.ControlTipsPlugin = ControlTipsPlugin;
_ControlTipsPlugin_element = new WeakMap(), _ControlTipsPlugin_app = new WeakMap(), _ControlTipsPlugin_shortcutManager = new WeakMap(), _ControlTipsPlugin_cursorIsHoveringOverUnit = new WeakMap(), _ControlTipsPlugin_cursorIsHoveringOverAirbase = new WeakMap(), _ControlTipsPlugin_mouseoverElement = new WeakMap(), _ControlTipsPlugin_instances = new WeakSet(), _ControlTipsPlugin_updateTips = function _ControlTipsPlugin_updateTips() {
const combos = [
{
"keys": [],
"tips": [
{
"key": `SHIFT`,
"action": `Box select`,
"showIfHoveringOverAirbase": false,
"showIfHoveringOverUnit": false,
"showIfUnitSelected": false
},
{
"key": `Mouse1`,
"action": `Deselect`,
"showIfUnitSelected": true
},
{
"key": `Mouse1+drag`,
"action": `Move map`,
"showIfHoveringOverAirbase": false,
"showIfHoveringOverUnit": false,
"showIfUnitSelected": false
},
{
"key": `Mouse2`,
"action": `Spawn menu`,
"showIfUnitSelected": false,
"showIfHoveringOverAirbase": false,
"showIfHoveringOverUnit": false
},
{
"key": `Mouse2`,
"action": `Quick options`,
"showIfUnitSelected": false,
"showIfHoveringOverAirbase": false,
"showIfHoveringOverUnit": true
},
{
"key": `Mouse2`,
"action": `Airbase menu`,
"showIfUnitSelected": false,
"showIfHoveringOverAirbase": true,
"showIfHoveringOverUnit": false
},
{
"key": `Mouse2`,
"action": `Set first waypoint`,
"showIfHoveringOverAirbase": false,
"showIfUnitSelected": true,
"unitsMustBeControlled": true
},
{
"key": `Mouse2 (hold)`,
"action": `Interact (ground)`,
"showIfUnitSelected": true,
"showIfHoveringOverAirbase": false,
"showIfHoveringOverUnit": false,
"unitsMustBeControlled": true
},
{
"key": `Shift`,
"action": "<em> in formation...</em>",
"showIfUnitSelected": true,
"minSelectedUnits": 2
},
{
"key": "CTRL",
"action": "<em> ... more</em>",
"showIfUnitSelected": true,
"showIfHoveringOverAirbase": false,
"unitsMustBeControlled": true
},
{
"key": "CTRL",
"action": " Pin tool",
"showIfUnitSelected": false,
"showIfHoveringOverAirbase": false,
"showIfHoveringOverUnit": false,
"unitsMustBeControlled": true
},
{
"key": "CTRL+Mouse2",
"action": " Airbase menu",
"showIfUnitSelected": true,
"showIfHoveringOverAirbase": true,
"unitsMustBeControlled": true
},
{
"key": `Mouse1`,
"action": "Toggle Blue/Red",
"mouseoverSelector": "#coalition-switch .ol-switch-fill"
},
{
"key": `Mouse2`,
"action": "Set Neutral",
"mouseoverSelector": "#coalition-switch .ol-switch-fill"
},
{
"key": `Mouse1`,
"action": "Toggle time display",
"mouseoverSelector": "#connection-status-panel[data-is-connected] #connection-status-message abbr"
},
{
"key": `Mouse1 or Z`,
"action": "Change location system",
"mouseoverSelector": "#coordinates-tool, #coordinates-tool *"
},
{
"key": `Comma`,
"action": "Decrease precision",
"mouseoverSelector": `#coordinates-tool[data-location-system="MGRS"], #coordinates-tool[data-location-system="MGRS"] *`
},
{
"key": `Period`,
"action": "Increase precision",
"mouseoverSelector": `#coordinates-tool[data-location-system="MGRS"], #coordinates-tool[data-location-system="MGRS"] *`
}
]
},
{
"keys": ["ControlLeft"],
"tips": [
{
"key": `Mouse1`,
"action": "Toggle pin",
"showIfUnitSelected": false,
"showIfHoveringOverAirbase": false,
"showIfHoveringOverUnit": false
},
{
"key": `Mouse1`,
"action": "Toggle selection",
"showIfUnitSelected": true,
"showIfHoveringOverAirbase": false,
"showIfHoveringOverUnit": true
},
{
"key": `Mouse2`,
"action": `Add waypoint`,
"showIfHoveringOverAirbase": false,
"showIfHoveringOverUnit": false,
"showIfUnitSelected": true,
"unitsMustBeControlled": true
},
{
"key": `Mouse2`,
"action": `Interact (airbase)`,
"showIfHoveringOverAirbase": true,
"showIfUnitSelected": true,
"unitsMustBeControlled": true
},
{
"key": `Mouse2`,
"action": `Interact (unit)`,
"showIfHoveringOverAirbase": false,
"showIfHoveringOverUnit": true,
"showIfUnitSelected": true,
"unitsMustBeControlled": true
},
{
"key": `Shift`,
"action": "<em> in formation...</em>",
"showIfUnitSelected": true,
"minSelectedUnits": 2
},
{
"key": `[Num 1-9]`,
"action": "Set hotgroup",
"showIfUnitSelected": true
}
]
},
{
"keys": ["ShiftLeft"],
"tips": [
{
"key": `Mouse1+drag`,
"action": "Box select",
"showIfUnitSelected": false
},
{
"key": `Mouse2`,
"action": "Set first formation waypoint",
"showIfUnitSelected": true,
"minSelectedUnits": 2
},
{
"key": `[Num 1-9]`,
"action": "Add to hotgroup",
"showIfUnitSelected": true
},
{
"key": "CTRL",
"action": "<em> ... more</em>",
"minSelectedUnits": 2,
"showIfUnitSelected": true,
"showIfHoveringOverAirbase": false,
"unitsMustBeControlled": true
}
]
},
{
"keys": ["ControlLeft", "ShiftLeft"],
"tips": [
{
"key": `Mouse2`,
"action": "Add formation waypoint",
"showIfUnitSelected": true,
"minSelectedUnits": 2,
"unitsMustBeControlled": true
}, {
"key": `[Num 1-9]`,
"action": "Add hotgroup to selection",
"callback": (tip) => {
return (Object.values(__classPrivateFieldGet(this, _ControlTipsPlugin_app, "f").getUnitsManager().getUnits()).some((unit) => {
return unit.getHotgroup();
}));
},
"showIfUnitSelected": true,
"minSelectedUnits": 1
}
]
}
];
const currentCombo = combos.find((combo) => __classPrivateFieldGet(this, _ControlTipsPlugin_shortcutManager, "f").keyComboMatches(combo.keys)) || combos[0];
const element = this.getElement();
element.innerHTML = "";
let numSelectedUnits = 0;
let numSelectedControlledUnits = 0;
let unitSelectionContainsControlled = false;
if (__classPrivateFieldGet(this, _ControlTipsPlugin_app, "f").getUnitsManager()) {
let selectedUnits = Object.values(__classPrivateFieldGet(this, _ControlTipsPlugin_app, "f").getUnitsManager().getSelectedUnits());
numSelectedUnits = selectedUnits.length;
numSelectedControlledUnits = selectedUnits.filter((unit) => unit.getControlled()).length;
unitSelectionContainsControlled = numSelectedControlledUnits > 0;
}
const tipsIncludesActiveMouseover = (currentCombo.tips.some((tip) => {
if (!tip.mouseoverSelector) {
return false;
}
if (__classPrivateFieldGet(this, _ControlTipsPlugin_mouseoverElement, "f") instanceof HTMLElement === false) {
return false;
}
if (!__classPrivateFieldGet(this, _ControlTipsPlugin_mouseoverElement, "f").matches(tip.mouseoverSelector)) {
return false;
}
return true;
}));
currentCombo.tips.filter((tip) => {
if (numSelectedUnits > 0) {
if (tip.showIfUnitSelected === false) {
return false;
}
if (tip.unitsMustBeControlled === true && unitSelectionContainsControlled === false) {
return false;
}
if (typeof tip.minSelectedUnits === "number" && numSelectedControlledUnits < tip.minSelectedUnits) {
return false;
}
}
if (numSelectedUnits === 0 && tip.showIfUnitSelected === true) {
return false;
}
if (typeof tip.showIfHoveringOverAirbase === "boolean") {
if (tip.showIfHoveringOverAirbase !== __classPrivateFieldGet(this, _ControlTipsPlugin_cursorIsHoveringOverAirbase, "f")) {
return false;
}
}
if (typeof tip.showIfHoveringOverUnit === "boolean") {
if (tip.showIfHoveringOverUnit !== __classPrivateFieldGet(this, _ControlTipsPlugin_cursorIsHoveringOverUnit, "f")) {
return false;
}
}
if (tipsIncludesActiveMouseover && (typeof tip.mouseoverSelector !== "string" || !__classPrivateFieldGet(this, _ControlTipsPlugin_mouseoverElement, "f").matches(tip.mouseoverSelector))) {
return false;
}
if (!tipsIncludesActiveMouseover && typeof tip.mouseoverSelector === "string") {
return false;
}
if (typeof tip.callback === "function" && !tip.callback(tip)) {
return false;
}
element.innerHTML += `<div><span class="key">${tip.key}</span><span class="action">${tip.action}</span></div>`;
});
};
},{}],2:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const controltipsplugin_1 = require("./controltipsplugin");
globalThis.getOlympusPlugin = () => {
return new controltipsplugin_1.ControlTipsPlugin();
};
},{"./controltipsplugin":1}]},{},[2]);

File diff suppressed because it is too large Load Diff

View File

@@ -3,8 +3,27 @@
"version": "v0.0.1",
"private": true,
"scripts": {
"build": "browserify ./src/index.ts -p [ tsify --noImplicitAny] > index.js && copy.bat"
"build": "browserify ./src/index.ts -p [ tsify --noImplicitAny] > index.js && copy.bat",
"build-release": "browserify ./src/index.ts -p [ tsify --noImplicitAny] -p [ tinyify ] > index.js && copy.bat"
},
"dependencies": {},
"devDependencies": {}
"devDependencies": {
"@babel/preset-env": "^7.21.4",
"@types/node": "^18.16.1",
"@types/sortablejs": "^1.15.0",
"babelify": "^10.0.0",
"browserify": "^17.0.0",
"concurrently": "^7.6.0",
"cp": "^0.2.0",
"esmify": "^2.1.1",
"nodemon": "^2.0.20",
"requirejs": "^2.3.6",
"sortablejs": "^1.15.0",
"tinyify": "^4.0.0",
"tsify": "^5.0.4",
"tslib": "latest",
"typescript": "^4.9.4",
"usng.js": "^0.4.5",
"watchify": "^4.0.0"
}
}

View File

@@ -4,10 +4,29 @@
"private": true,
"scripts": {
"build": "browserify ./src/index.ts -p [ tsify --noImplicitAny] > index.js && copy.bat",
"build-release": "browserify ./src/index.ts -p [ tsify --noImplicitAny] -p [ tinyify ] > index.js && copy.bat",
"start": "npm run copy & concurrently --kill-others \"npm run watch\"",
"copy": "copy.bat",
"watch": "watchify ./src/index.ts --debug -o ../../public/plugins/databasemanager/index.js -t [ babelify --global true --presets [ @babel/preset-env ] --extensions '.js'] -p [ tsify --noImplicitAny ]"
},
"dependencies": {},
"devDependencies": {}
"devDependencies": {
"@babel/preset-env": "^7.21.4",
"@types/node": "^18.16.1",
"@types/sortablejs": "^1.15.0",
"babelify": "^10.0.0",
"browserify": "^17.0.0",
"concurrently": "^7.6.0",
"cp": "^0.2.0",
"esmify": "^2.1.1",
"nodemon": "^2.0.20",
"requirejs": "^2.3.6",
"sortablejs": "^1.15.0",
"tinyify": "^4.0.0",
"tsify": "^5.0.4",
"tslib": "latest",
"typescript": "^4.9.4",
"usng.js": "^0.4.5",
"watchify": "^4.0.0"
}
}

View File

@@ -17,6 +17,7 @@ import { WeaponsManager } from "./weapon/weaponsmanager";
import { Manager } from "./other/manager";
import { SVGInjector } from "@tanem/svg-injector";
import { ServerManager } from "./server/servermanager";
import { sha256 } from 'js-sha256';
import { BLUE_COMMANDER, FILL_SELECTED_RING, GAME_MASTER, HIDE_UNITS_SHORT_RANGE_RINGS, RED_COMMANDER, SHOW_UNITS_ACQUISITION_RINGS, SHOW_UNITS_ENGAGEMENT_RINGS, SHOW_UNIT_LABELS } from "./constants/constants";
import { aircraftDatabase } from "./unit/databases/aircraftdatabase";
@@ -408,8 +409,9 @@ export class OlympusApp {
loginForm.addEventListener("submit", (ev:SubmitEvent) => {
ev.preventDefault();
ev.stopPropagation();
var hash = sha256.create();
const username = (loginForm.querySelector("#username") as HTMLInputElement).value;
const password = (loginForm.querySelector("#password") as HTMLInputElement).value;
const password = hash.update((loginForm.querySelector("#password") as HTMLInputElement).value).hex();
// Update the user credentials
this.getServerManager().setCredentials(username, password);

View File

@@ -7,8 +7,8 @@
</div>
<form id="authentication-form">
<div><h5>Name</h5> <input type="text" id="username" name="username" required autocomplete="username" placeholder="Enter username..."></div>
<div><h5>Server password</h5> <input type="password" id="password" name="password" minlength="8" required autocomplete="current-password" placeholder="Enter password..."></div>
<div><h5>Name</h5> <input type="text" id="username" name="username" required autocomplete="username" placeholder="Enter name..."></div>
<div><h5>Server password</h5> <input type="password" id="password" name="password" minlength="1" required autocomplete="current-password" placeholder="Enter server password..."></div>
<button type="submit" id="connection-button" class="ol-button-apply">Connect</button>
</form>