mirror of
https://github.com/dcs-liberation/dcs_liberation.git
synced 2025-11-10 14:22:26 +00:00
The flight plan used to not include a waypoint for departure, so a few places would create one for the sake of the UI, or were built to assume there was a missing waypoint that was okay to ignore. At some point we added them to the flight plan, but never updated the UI, so the waypoint list in the flight dialog started counting from 1 instead of 0, and the openapi endpoint wrongly reported two departure waypoints to the front- end. Fixes https://github.com/dcs-liberation/dcs_liberation/issues/3037.
69 lines
2.0 KiB
Python
69 lines
2.0 KiB
Python
from uuid import UUID
|
|
|
|
from dcs.mapping import LatLng, Point
|
|
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from starlette.responses import Response
|
|
|
|
from game import Game
|
|
from game.ato import Flight
|
|
from game.server import GameContext
|
|
from game.server.leaflet import LeafletPoint
|
|
from game.server.waypoints.models import FlightWaypointJs
|
|
from game.sim import GameUpdateEvents
|
|
|
|
router: APIRouter = APIRouter(prefix="/waypoints")
|
|
|
|
|
|
def waypoints_for_flight(flight: Flight) -> list[FlightWaypointJs]:
|
|
return [
|
|
FlightWaypointJs.for_waypoint(w, flight, i)
|
|
for i, w in enumerate(flight.flight_plan.waypoints, 1)
|
|
]
|
|
|
|
|
|
@router.get(
|
|
"/{flight_id}",
|
|
operation_id="list_all_waypoints_for_flight",
|
|
response_model=list[FlightWaypointJs],
|
|
)
|
|
def all_waypoints_for_flight(
|
|
flight_id: UUID, game: Game = Depends(GameContext.require)
|
|
) -> list[FlightWaypointJs]:
|
|
return waypoints_for_flight(game.db.flights.get(flight_id))
|
|
|
|
|
|
@router.post(
|
|
"/{flight_id}/{waypoint_idx}/position",
|
|
operation_id="set_waypoint_position",
|
|
status_code=status.HTTP_204_NO_CONTENT,
|
|
response_class=Response,
|
|
)
|
|
def set_position(
|
|
flight_id: UUID,
|
|
waypoint_idx: int,
|
|
position: LeafletPoint,
|
|
game: Game = Depends(GameContext.require),
|
|
) -> None:
|
|
from game.server import EventStream
|
|
|
|
flight = game.db.flights.get(flight_id)
|
|
if waypoint_idx == 0:
|
|
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN)
|
|
|
|
waypoint = flight.flight_plan.waypoints[waypoint_idx - 1]
|
|
waypoint.position = Point.from_latlng(
|
|
LatLng(position.lat, position.lng), game.theater.terrain
|
|
)
|
|
package_model = (
|
|
GameContext.get_model()
|
|
.ato_model_for(flight.blue)
|
|
.find_matching_package_model(flight.package)
|
|
)
|
|
if package_model is None:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_404_NOT_FOUND,
|
|
detail=f"Could not find PackageModel owning {flight}",
|
|
)
|
|
package_model.update_tot()
|
|
EventStream.put_nowait(GameUpdateEvents().update_flight(flight))
|