mirror of
https://github.com/dcs-liberation/dcs_liberation.git
synced 2025-11-10 14:22:26 +00:00
The fix for https://github.com/dcs-liberation/dcs_liberation/issues/3037 wasn't complete. It seems this `- 1` was here to work around the UI wrongly having two takeoff points... Now that we fixed that, this also needs to go. Fixes https://github.com/dcs-liberation/dcs_liberation/issues/3059.
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]
|
|
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))
|