Multiple minor fixes

This commit is contained in:
Pax1601 2023-03-14 22:25:00 +01:00
parent 16b5e89a3e
commit 9ed4189c28
20 changed files with 91 additions and 75 deletions

View File

@ -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);
}

View File

@ -1,5 +1,5 @@
@import url("layout.css");
@import url("airbases.css");
@import url("airbase.css");
@import url("contextmenus.css");
@import url("units.css");

View File

@ -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);

View File

@ -24,7 +24,8 @@ export class Airbase extends L.Marker
<div class="airbase-marker"> </div>
</div>`,
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);
}

View File

@ -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"]);

View File

@ -36,8 +36,8 @@ export class MouseInfoPanel extends Panel {
var el = <HTMLElement>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);

View File

@ -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" )

View File

@ -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}`);
}

View File

@ -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, `

View File

@ -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;
}
}

View File

@ -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,

View File

@ -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)

View File

@ -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)

View File

@ -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: {

View File

@ -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);
}

View File

@ -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()

View File

@ -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)

View File

@ -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()

View File

@ -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<milliseconds>(system_clock::now().time_since_epoch());
answer[L"time"] = json::value::string(to_wstring(ms.count()));

View File

@ -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