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