diff --git a/client/public/stylesheets/airbases.css b/client/public/stylesheets/airbases.css deleted file mode 100644 index 5ded6a48..00000000 --- a/client/public/stylesheets/airbases.css +++ /dev/null @@ -1,44 +0,0 @@ -:root { - --airbase-marker-height: 63px; - --airbase-marker-width: 63px; -} - -[data-object|="airbase"] { - align-items: center; - cursor: pointer; - display: flex; - justify-content: center; - position: relative; -} - -[data-hide-airbase] #map-container [data-object|="airbase"] { - display: none; -} - -/****************************** -Marker -******************************/ - -[data-object|="airbase"] .airbase { - background-color: transparent; - background-repeat: no-repeat; - background-size: cover; - position: absolute; - transform-origin: center; - z-index: 3; -} - -/* Airbase */ -[data-object|="airbase"] .airbase-marker { - background-image: var(--airbase-marker-neutral-url); - height: var(--airbase-marker-height); - width: var(--airbase-marker-width); -} - -[data-object|="airbase"][data-coalition="red"] .airbase-marker { - background-image: var(--airbase-marker-red-url); -} - -[data-object|="airbase"][data-coalition="blue"] .airbase-marker { - background-image: var(--airbase-marker-blue-url); -} \ No newline at end of file diff --git a/client/public/stylesheets/olympus.css b/client/public/stylesheets/olympus.css index 7b76a621..45bb8864 100644 --- a/client/public/stylesheets/olympus.css +++ b/client/public/stylesheets/olympus.css @@ -1,5 +1,5 @@ @import url("layout.css"); -@import url("airbases.css"); +@import url("airbase.css"); @import url("contextmenus.css"); @import url("units.css"); diff --git a/client/src/index.ts b/client/src/index.ts index 90a7c853..f74f7476 100644 --- a/client/src/index.ts +++ b/client/src/index.ts @@ -9,7 +9,7 @@ import { AIC } from "./aic/aic"; import { ATC } from "./atc/ATC"; import { FeatureSwitches } from "./FeatureSwitches"; import { LogPanel } from "./panels/logpanel"; -import { getAirbases, getBulllseye as getBulllseyes, getUnits, toggleDemoEnabled } from "./server/server"; +import { getAirbases, getBulllseye as getBulllseyes, getMission, getUnits, toggleDemoEnabled } from "./server/server"; var map: Map; @@ -68,6 +68,7 @@ function setup() { /* On the first connection, force request of full data */ getAirbases((data: AirbasesData) => getMissionData()?.update(data)); getBulllseyes((data: BullseyesData) => getMissionData()?.update(data)); + getMission((data: any) => {getMissionData()?.update(data)}); getUnits((data: UnitsData) => getUnitsManager()?.update(data), true /* Does a full refresh */); /* Start periodically requesting updates */ @@ -95,6 +96,7 @@ function requestRefresh() { getUnits((data: UnitsData) => { getAirbases((data: AirbasesData) => getMissionData()?.update(data)); getBulllseyes((data: BullseyesData) => getMissionData()?.update(data)); + getMission((data: any) => {getMissionData()?.update(data)}); checkSessionHash(data.sessionHash); }, true); setTimeout(() => requestRefresh(), 5000); diff --git a/client/src/missionhandler/airbase.ts b/client/src/missionhandler/airbase.ts index 6fbfd411..a3ca42dc 100644 --- a/client/src/missionhandler/airbase.ts +++ b/client/src/missionhandler/airbase.ts @@ -24,7 +24,8 @@ export class Airbase extends L.Marker
`, className: 'leaflet-airbase-marker', - iconSize: [63, 63] + iconSize: [40, 40], + iconAnchor: [20, 20] }); // Set the marker, className must be set to avoid white square this.setIcon(icon); } diff --git a/client/src/missionhandler/missionhandler.ts b/client/src/missionhandler/missionhandler.ts index ef939ffb..543613d1 100644 --- a/client/src/missionhandler/missionhandler.ts +++ b/client/src/missionhandler/missionhandler.ts @@ -14,6 +14,7 @@ export class MissionHandler #bullseyeMarkers: any; #airbases : any; //TODO declare interface #airbasesMarkers: {[name: string]: Airbase}; + #theatre : string = ""; constructor() { @@ -26,7 +27,7 @@ export class MissionHandler this.#airbasesMarkers = {}; } - update(data: BullseyesData | AirbasesData) + update(data: BullseyesData | AirbasesData | any) { if ("bullseyes" in data) { @@ -39,6 +40,17 @@ export class MissionHandler this.#airbases = data.airbases; this.#drawAirbases(); } + + if ("mission" in data) + { + var foo = 1; + if (data.mission.theatre != this.#theatre) + { + this.#theatre = data.mission.theatre + if (this.#theatre == "Syria") + getMap().setView(new LatLng(34.5, 36.0), 8); + } + } } getBullseyes() @@ -51,7 +63,7 @@ export class MissionHandler for (let idx in this.#bullseyes) { var bullseye = this.#bullseyes[idx]; - this.#bullseyeMarkers[idx].setLatLng(new LatLng(bullseye.lat, bullseye.lng)); + this.#bullseyeMarkers[idx].setLatLng(new LatLng(bullseye.latitude, bullseye.longitude)); } } @@ -63,14 +75,14 @@ export class MissionHandler if (this.#airbasesMarkers[idx] === undefined) { this.#airbasesMarkers[idx] = new Airbase({ - position: new LatLng(airbase.lat, airbase.lng), + position: new LatLng(airbase.latitude, airbase.longitude), name: airbase.callsign, src: "images/airbase.png"}).addTo(getMap()); this.#airbasesMarkers[idx].on('contextmenu', (e) => this.#onAirbaseClick(e)); } else { - this.#airbasesMarkers[idx].setLatLng(new LatLng(airbase.lat, airbase.lng)); + this.#airbasesMarkers[idx].setLatLng(new LatLng(airbase.latitude, airbase.longitude)); this.#airbasesMarkers[idx].setCoalition(airbase.coalition); this.#airbasesMarkers[idx].setProperties(["test1", "test2"]); this.#airbasesMarkers[idx].setParkings(["2x big", "5x small"]); diff --git a/client/src/panels/mouseinfopanel.ts b/client/src/panels/mouseinfopanel.ts index 22eb5fb1..cd76e7d9 100644 --- a/client/src/panels/mouseinfopanel.ts +++ b/client/src/panels/mouseinfopanel.ts @@ -36,8 +36,8 @@ export class MouseInfoPanel extends Panel { var el = this.getElement().querySelector(`#bullseye-${idx}`); if ( el != null ) { - var dist = distance(bullseyes[idx].lat, bullseyes[idx].lng, mousePosition.lat, mousePosition.lng); - var bear = bearing(bullseyes[idx].lat, bullseyes[idx].lng, mousePosition.lat, mousePosition.lng); + var dist = distance(bullseyes[idx].latitude, bullseyes[idx].longitude, mousePosition.lat, mousePosition.lng); + var bear = bearing(bullseyes[idx].latitude, bullseyes[idx].longitude, mousePosition.lat, mousePosition.lng); el.dataset.bearing = zeroAppend(Math.floor(bear), 3); el.dataset.distance = zeroAppend(Math.floor(dist*0.000539957), 3); diff --git a/client/src/panels/unitcontrolpanel.ts b/client/src/panels/unitcontrolpanel.ts index d1865c26..daa87e01 100644 --- a/client/src/panels/unitcontrolpanel.ts +++ b/client/src/panels/unitcontrolpanel.ts @@ -1,6 +1,8 @@ import { getUnitsManager } from ".."; import { Slider } from "../controls/slider"; -import { Unit } from "../units/unit"; +import { aircraftDatabase } from "../units/aircraftdatabase"; +import { groundUnitsDatabase } from "../units/groundunitsdatabase"; +import { Aircraft, GroundUnit, Unit } from "../units/unit"; import { Panel } from "./panel"; const ROEs: string[] = ["Free", "Designated free", "Designated", "Return", "Hold"]; @@ -69,7 +71,14 @@ export class UnitControlPanel extends Panel { { var button = document.createElement("button"); button.innerText = unit.getBaseData().unitName; - button.setAttribute( "data-short-label", unit.getBaseData().name ); + + if (unit instanceof Aircraft) + button.setAttribute( "data-short-label", aircraftDatabase.getShortLabelByName(unit.getBaseData().name)); + else if (unit instanceof GroundUnit) + button.setAttribute( "data-short-label", groundUnitsDatabase.getShortLabelByName(unit.getBaseData().name)); + else + button.setAttribute( "data-short-label", ""); + button.setAttribute( "data-coalition", unit.getMissionData().coalition ); button.classList.add( "pill", "highlight-coalition" ) diff --git a/client/src/server/server.ts b/client/src/server/server.ts index e591ea72..97ee38ec 100644 --- a/client/src/server/server.ts +++ b/client/src/server/server.ts @@ -9,6 +9,7 @@ const UNITS_URI = "units"; const LOGS_URI = "logs"; const AIRBASES_URI = "airbases"; const BULLSEYE_URI = "bullseyes"; +const MISSION_URI = "mission"; var lastUpdateTime = 0; var demoEnabled = false; @@ -56,6 +57,10 @@ export function getLogs(callback: CallableFunction) { GET(callback, LOGS_URI); } +export function getMission(callback: CallableFunction) { + GET(callback, MISSION_URI); +} + export function getUnits(callback: CallableFunction, refresh: boolean = false) { GET(callback, `${UNITS_URI}?time=${refresh? 0: lastUpdateTime}`); } diff --git a/client/src/units/unit.ts b/client/src/units/unit.ts index 7ec28d2e..88f10943 100644 --- a/client/src/units/unit.ts +++ b/client/src/units/unit.ts @@ -383,7 +383,7 @@ export class Unit extends Marker { unitAltitudeDiv.innerHTML = String(Math.floor(this.getFlightData().altitude / 0.3048 / 1000)); } var pos = getMap().latLngToLayerPoint(this.getLatLng()).round(); - this.setZIndexOffset(Math.floor(this.getFlightData().altitude) - pos.y); + this.setZIndexOffset(1000 + Math.floor(this.getFlightData().altitude) - pos.y); } this.#forceUpdate = false; @@ -503,7 +503,10 @@ export class Helicopter extends AirUnit { export class GroundUnit extends Unit { constructor(ID: number, data: UnitData) { + // TODO this is very messy var role = groundUnitsDatabase.getByName(data.baseData.name)?.loadouts[0].roles[0]; + if (role == undefined) + role = "U"; var roleType = (role === "SAM") ? "sam" : "mi"; super(ID, data, ` diff --git a/client/src/units/unitdatabase.ts b/client/src/units/unitdatabase.ts index b4710a1f..564ab8f5 100644 --- a/client/src/units/unitdatabase.ts +++ b/client/src/units/unitdatabase.ts @@ -101,6 +101,6 @@ export class UnitDatabase { getShortLabelByName(name: string) { - return this.units[name] === undefined? name: this.units[name].shortLabel; + return this.units[name] === undefined? "U": this.units[name].shortLabel; } } \ No newline at end of file diff --git a/scripts/OlympusCommand.lua b/scripts/OlympusCommand.lua index 65a58eed..1b24d4a5 100644 --- a/scripts/OlympusCommand.lua +++ b/scripts/OlympusCommand.lua @@ -218,6 +218,8 @@ function Olympus.spawnAircraft(coalition, unitType, lat, lng, spawnOptions) ["type"] = unitType, ["x"] = spawnLocation.x, ["y"] = spawnLocation.z, + ["alt"] = 20000 * 0.3048, + ["alt_type"] = "BARO", ["skill"] = "Excellent", ["payload"] = { @@ -262,6 +264,7 @@ function Olympus.spawnAircraft(coalition, unitType, lat, lng, spawnOptions) ["ETA_locked"] = true, ["x"] = spawnLocation.x, ["y"] = spawnLocation.z, + ["alt_type"] = "BARO", ["formation_template"] = "", ["airdromeId"] = airbaseID, ["speed_locked"] = true, diff --git a/scripts/OlympusMission.lua b/scripts/OlympusMission.lua index 9e423bc4..55c58abe 100644 --- a/scripts/OlympusMission.lua +++ b/scripts/OlympusMission.lua @@ -16,8 +16,8 @@ function Olympus.setMissionData(arg, time) local bullseyeVec3 = coalition.getMainRefPoint(i) local bullseyeLatitude, bullseyeLongitude, bullseyeAltitude = coord.LOtoLL(bullseyeVec3) bullseyes[i] = {} - bullseyes[i]["lat"] = bullseyeLatitude - bullseyes[i]["lng"] = bullseyeLongitude + bullseyes[i]["latitude"] = bullseyeLatitude + bullseyes[i]["longitude"] = bullseyeLongitude end -- Units tactical data @@ -63,24 +63,35 @@ function Olympus.setMissionData(arg, time) -- Airbases data local base = world.getAirbases() - local basesData = {} + local airbases = {} for i = 1, #base do local info = {} local latitude, longitude, altitude = coord.LOtoLL(Airbase.getPoint(base[i])) info["callsign"] = Airbase.getCallsign(base[i]) - info["coalition"] = Airbase.getCoalition(base[i]) - info["lat"] = latitude - info["lng"] = longitude + local coalitionID = Airbase.getCoalition(base[i]) + if coalitionID == 0 then + info["coalition"] = "neutral" + elseif coalitionID == 1 then + info["coalition"] = "red" + else + info["coalition"] = "blue" + end + info["latitude"] = latitude + info["longitude"] = longitude if Airbase.getUnit(base[i]) then info["unitId"] = Airbase.getUnit(base[i]):getID() end - basesData[i] = info + airbases[i] = info end + local mission = {} + mission.theatre = env.mission.theatre + -- Assemble missionData table missionData["bullseyes"] = bullseyes missionData["unitsData"] = unitsData - missionData["airbases"] = basesData + missionData["airbases"] = airbases + missionData["mission"] = mission local command = "Olympus.missionData = " .. Olympus.serializeTable(missionData) .. "\n" .. "Olympus.OlympusDLL.setMissionData()" net.dostring_in("export", command) diff --git a/src/core/src/aircraft.cpp b/src/core/src/aircraft.cpp index 9d6921e3..8b90ee4d 100644 --- a/src/core/src/aircraft.cpp +++ b/src/core/src/aircraft.cpp @@ -17,6 +17,8 @@ Aircraft::Aircraft(json::value json, int ID) : AirUnit(json, ID) { log("New Aircraft created with ID: " + to_string(ID)); addMeasure(L"category", json::value(getCategory())); + setTargetSpeed(targetSpeed); + setTargetAltitude(targetAltitude); }; void Aircraft::changeSpeed(wstring change) diff --git a/src/core/src/airunit.cpp b/src/core/src/airunit.cpp index 1d209646..cd32c094 100644 --- a/src/core/src/airunit.cpp +++ b/src/core/src/airunit.cpp @@ -15,7 +15,7 @@ extern UnitsManager* unitsManager; /* Air unit */ AirUnit::AirUnit(json::value json, int ID) : Unit(json, ID) { - + }; void AirUnit::setState(int newState) @@ -203,7 +203,6 @@ void AirUnit::taskWingmen() void AirUnit::AIloop() { - log(L"AILoop"); /* State machine */ switch (state) { case State::IDLE: { diff --git a/src/core/src/core.cpp b/src/core/src/core.cpp index 2158af77..5eef82e2 100644 --- a/src/core/src/core.cpp +++ b/src/core/src/core.cpp @@ -11,8 +11,9 @@ auto before = std::chrono::system_clock::now(); UnitsManager* unitsManager = nullptr; Server* server = nullptr; Scheduler* scheduler = nullptr; -json::value airbasesData; -json::value bullseyesData; +json::value airbases; +json::value bullseyes; +json::value mission; mutex mutexLock; bool initialized = false; string sessionHash; @@ -93,9 +94,11 @@ extern "C" DllExport int coreMissionData(lua_State * L) if (missionData.has_object_field(L"unitsData")) unitsManager->updateMissionData(missionData[L"unitsData"]); if (missionData.has_object_field(L"airbases")) - airbasesData = missionData[L"airbases"]; + airbases = missionData[L"airbases"]; if (missionData.has_object_field(L"bullseyes")) - bullseyesData = missionData[L"bullseyes"]; + bullseyes = missionData[L"bullseyes"]; + if (missionData.has_object_field(L"mission")) + mission = missionData[L"mission"]; return(0); } diff --git a/src/core/src/groundunit.cpp b/src/core/src/groundunit.cpp index 81f38f89..f9525015 100644 --- a/src/core/src/groundunit.cpp +++ b/src/core/src/groundunit.cpp @@ -17,6 +17,8 @@ GroundUnit::GroundUnit(json::value json, int ID) : Unit(json, ID) { log("New Ground Unit created with ID: " + to_string(ID)); addMeasure(L"category", json::value(getCategory())); + setTargetSpeed(targetSpeed); + setTargetAltitude(targetAltitude); }; void GroundUnit::AIloop() diff --git a/src/core/src/helicopter.cpp b/src/core/src/helicopter.cpp index 3cdd43ba..facfd3f5 100644 --- a/src/core/src/helicopter.cpp +++ b/src/core/src/helicopter.cpp @@ -17,6 +17,8 @@ Helicopter::Helicopter(json::value json, int ID) : AirUnit(json, ID) { log("New Helicopter created with ID: " + to_string(ID)); addMeasure(L"category", json::value(getCategory())); + setTargetSpeed(targetSpeed); + setTargetAltitude(targetAltitude); }; void Helicopter::changeSpeed(wstring change) diff --git a/src/core/src/navyunit.cpp b/src/core/src/navyunit.cpp index 3c72c702..25f835a6 100644 --- a/src/core/src/navyunit.cpp +++ b/src/core/src/navyunit.cpp @@ -17,6 +17,8 @@ NavyUnit::NavyUnit(json::value json, int ID) : Unit(json, ID) { log("New Navy Unit created with ID: " + to_string(ID)); addMeasure(L"category", json::value(getCategory())); + setTargetSpeed(targetSpeed); + setTargetAltitude(targetAltitude); }; void NavyUnit::AIloop() diff --git a/src/core/src/server.cpp b/src/core/src/server.cpp index c19400b8..3286cbaa 100644 --- a/src/core/src/server.cpp +++ b/src/core/src/server.cpp @@ -12,8 +12,9 @@ using namespace std::chrono; extern UnitsManager* unitsManager; extern Scheduler* scheduler; -extern json::value airbasesData; -extern json::value bullseyesData; +extern json::value airbases; +extern json::value bullseyes; +extern json::value mission; extern mutex mutexLock; extern string sessionHash; @@ -101,9 +102,11 @@ void Server::handle_get(http_request request) answer[L"logs"] = logs; } else if (path[0] == AIRBASES_URI) - answer[L"airbases"] = airbasesData; + answer[L"airbases"] = airbases; else if (path[0] == BULLSEYE_URI) - answer[L"bullseyes"] = bullseyesData; + answer[L"bullseyes"] = bullseyes; + else if (path[0] == MISSION_URI) + answer[L"mission"] = mission; milliseconds ms = duration_cast(system_clock::now().time_since_epoch()); answer[L"time"] = json::value::string(to_wstring(ms.count())); diff --git a/src/shared/include/defines.h b/src/shared/include/defines.h index 215a5d8b..6a75f828 100644 --- a/src/shared/include/defines.h +++ b/src/shared/include/defines.h @@ -10,5 +10,6 @@ #define LOGS_URI L"logs" #define AIRBASES_URI L"airbases" #define BULLSEYE_URI L"bullseyes" +#define MISSION_URI L"mission" #define UPDATE_TIME_INTERVAL 0.25 \ No newline at end of file