-
-
@@ -29,6 +58,7 @@
import CommonInfoBlock from '~/components/common/blocks/CommonInfoBlock.vue';
import type { VatsimShortenedAircraft } from '~/types/data/vatsim';
import AircraftIcon from '@/assets/icons/kit/aircraft.svg?component';
+import DivertedIcon from '@/assets/icons/kit/diverted.svg?component';
import { useMapStore } from '~/store/map';
const props = defineProps({
@@ -41,10 +71,12 @@ const props = defineProps({
const dataStore = useDataStore();
const mapStore = useMapStore();
-const airports = computed(() => dataStore.vatspy.value?.data.airports.filter(x => x.icao === props.pilot.departure || x.icao === props.pilot.arrival) ?? []);
+const airports = computed(() => dataStore.vatspy.value?.data.airports.filter(x => x.icao === props.pilot.departure || x.icao === props.pilot.arrival || x.icao === props.pilot.diverted_arrival || x.icao === props.pilot.diverted_origin) ?? []);
const depAirport = computed(() => airports.value.find(x => x.icao === props.pilot.departure));
const arrAirport = computed(() => airports.value.find(x => x.icao === props.pilot.arrival));
+const divArrAirport = computed(() => airports.value.find(x => x.icao === props.pilot.diverted_arrival));
+const divOrgAirport = computed(() => airports.value.find(x => x.icao === props.pilot.diverted_origin));
diff --git a/src/components/map/popups/MapPopupFlightPlan.vue b/src/components/map/popups/MapPopupFlightPlan.vue
index 4eec61c6..55ba5ab9 100644
--- a/src/components/map/popups/MapPopupFlightPlan.vue
+++ b/src/components/map/popups/MapPopupFlightPlan.vue
@@ -5,6 +5,9 @@
:pilot="{
departure: flightPlan.departure,
arrival: flightPlan.arrival,
+ diverted: flightPlan.diverted,
+ diverted_arrival: flightPlan.diverted_arrival,
+ diverted_origin: flightPlan.diverted_origin,
}"
/>
;
export interface VatsimController {
@@ -141,7 +144,7 @@ export type VatsimShortenedData = {
general: VatsimGeneral;
pilots: Array<
Omit
&
- Partial, 'aircraft_faa' | 'aircraft_short' | 'departure' | 'arrival'>> &
+ Partial, 'aircraft_faa' | 'aircraft_short' | 'departure' | 'arrival' | 'diverted' | 'diverted_arrival' | 'diverted_origin'>> &
Partial> & {
filteredColor?: UserMapSettingsColor;
filteredOpacity?: number;
diff --git a/src/utils/backend/storage.ts b/src/utils/backend/storage.ts
index 1e80ed08..415d06e1 100644
--- a/src/utils/backend/storage.ts
+++ b/src/utils/backend/storage.ts
@@ -183,6 +183,7 @@ export interface RadarStorage {
navigraph: typeof cycles | null;
patreonInfo: PatreonInfo | null;
airlines: RadarDataAirlinesAllList;
+ extendedPilotsMap: { [key: string]: VatsimExtendedPilot };
}
export const radarStorage: RadarStorage = {
@@ -232,6 +233,7 @@ export const radarStorage: RadarStorage = {
virtual: {},
all: {},
},
+ extendedPilotsMap: {},
};
export function getRadarStorage() {
diff --git a/src/utils/backend/styles.ts b/src/utils/backend/styles.ts
index 8390b218..c277493a 100644
--- a/src/utils/backend/styles.ts
+++ b/src/utils/backend/styles.ts
@@ -2,6 +2,8 @@ import type { PartialRecord } from '~/types';
export const colorsList = {
mapSectorBorder: '#2d2d30',
+ divertedBackground: '#de5656',
+ divertedTextColor: '#97979d',
lightgray0: '#F7F7FA',
lightgray50: '#F2F2F7',
diff --git a/src/utils/backend/vatsim/update.ts b/src/utils/backend/vatsim/update.ts
index 0bfcd91d..8bf8526e 100644
--- a/src/utils/backend/vatsim/update.ts
+++ b/src/utils/backend/vatsim/update.ts
@@ -106,6 +106,7 @@ export async function updateVatsimExtendedPilots() {
})).filter(x => x.controllers.length);
radarStorage.vatsim.extendedPilots = [];
+ const updatePilots: { [key: string]: VatsimExtendedPilot } = {};
const pilotsToProcess: {
pilot: VatsimExtendedPilot;
@@ -244,11 +245,62 @@ export async function updateVatsimExtendedPilots() {
extendedPilot.status = 'enroute';
}
+ // Diversion Detection
+ if (extendedPilot.status === 'departed' || extendedPilot.status === 'climbing' ||
+ extendedPilot.status === 'cruising' || extendedPilot.status === 'enroute' ||
+ extendedPilot.status === 'descending' || extendedPilot.status === 'arriving') {
+ const oldPilot = radarStorage.extendedPilotsMap[extendedPilot.cid];
+ const arrival = extendedPilot.flight_plan?.arrival;
+ const oldFlightPlan = oldPilot?.flight_plan;
+
+ if (arrival && oldFlightPlan) {
+ if (oldFlightPlan.diverted) {
+ extendedPilot.flight_plan ??= {};
+
+ if (oldFlightPlan.diverted_arrival !== arrival) {
+ if (oldFlightPlan.diverted_origin === arrival || arrival === 'ZZZZ') {
+ extendedPilot.flight_plan.diverted = false;
+ }
+ else {
+ extendedPilot.flight_plan.diverted_arrival = arrival;
+ extendedPilot.flight_plan.diverted_origin = oldFlightPlan.diverted_origin;
+ extendedPilot.flight_plan.diverted = true;
+ }
+ }
+ else {
+ extendedPilot.flight_plan = {
+ ...extendedPilot.flight_plan,
+ diverted_arrival: oldFlightPlan.diverted_arrival,
+ diverted_origin: oldFlightPlan.diverted_origin,
+ diverted: true,
+ };
+ }
+ }
+ else if (arrival !== 'ZZZZ' && oldFlightPlan.arrival !== 'ZZZZ' &&
+ oldFlightPlan.arrival && oldFlightPlan.arrival !== arrival && extendedPilot.flight_plan?.flight_rules !== 'V') {
+ extendedPilot.flight_plan = {
+ ...extendedPilot.flight_plan,
+ diverted: true,
+ diverted_arrival: arrival,
+ diverted_origin: oldFlightPlan.arrival,
+ };
+ }
+ }
+ }
+
origPilot.status = extendedPilot.status;
origPilot.toGoDist = extendedPilot.toGoDist;
origPilot.depDist = extendedPilot.depDist;
+ origPilot.arrival = extendedPilot.flight_plan?.arrival;
+ origPilot.diverted = extendedPilot.flight_plan?.diverted;
+ origPilot.diverted_arrival = extendedPilot.flight_plan?.diverted_arrival;
+ origPilot.diverted_origin = extendedPilot.flight_plan?.diverted_origin;
+
+ updatePilots[extendedPilot.cid] = extendedPilot;
radarStorage.vatsim.extendedPilots.push(extendedPilot);
}
+
+ radarStorage.extendedPilotsMap = updatePilots;
}
const xmlParser = new XMLParser({
diff --git a/src/utils/backend/worker/data-worker.ts b/src/utils/backend/worker/data-worker.ts
index 23ee1e63..36d3e9ea 100644
--- a/src/utils/backend/worker/data-worker.ts
+++ b/src/utils/backend/worker/data-worker.ts
@@ -164,6 +164,50 @@ defineCronJob('* * * * * *', async () => {
console.error(e);
}
+ /* data?.pilots.push({
+ cid: 10000,
+ name: "Dummy",
+ callsign: "DELTA",
+ server: "Nah ah",
+ pilot_rating: 1,
+ military_rating: 0,
+ latitude: 48.137154,
+ longitude: 11.576124,
+ altitude: 10000,
+ groundspeed: 100,
+ transponder: "7700",
+ heading: 360,
+ qnh_i_hg: 100,
+ qnh_mb: 100,
+ flight_plan: {
+ flight_rules: 'I',
+ aircraft: "C170",
+ aircraft_faa: "",
+ aircraft_short: "",
+ departure: "EDDM",
+ cruise_tas: "",
+ altitude: "10000",
+ arrival: "EDDH",
+ alternate: "EDDK",
+ deptime: "",
+ enroute_time: "",
+ fuel_time: "",
+ remarks: "DUMMY",
+ route: "",
+ revision_id: 1,
+ assigned_transponder: "7700",
+ locked: false,
+ diverted: true,
+ diverted_arrival: "EDDV",
+ diverted_origin: "EDDH",
+ },
+ logon_time: "",
+ last_updated: "",
+ frequencies: ["122.800"],
+ sim: "MSFS",
+ icon: "c17"
+ });*/
+
dataInProgress = false;
dataLatestFinished = Date.now();
});