diff --git a/client/client.lua b/client/client.lua index 8017fe1..04d0691 100644 --- a/client/client.lua +++ b/client/client.lua @@ -123,7 +123,7 @@ repeat } local rsp = http.post( - endpoint .. "/turtle/update/" .. id, + endpoint .. "/turtle/" .. id .. "/update" , textutils.serializeJSON(info), { ["Content-Type"] = "application/json" } ) diff --git a/server/src/main.rs b/server/src/main.rs index 077e0d4..33206b8 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -63,7 +63,7 @@ impl Direction { } } -#[derive(Serialize, Deserialize, Clone)] +#[derive(Serialize, Deserialize)] struct Turtle { name: Name, fuel: usize, @@ -72,11 +72,12 @@ struct Turtle { position: Position, goal: Option, pending_update: bool, + moves: VecDeque, } impl Turtle { fn new(id: u32, position: Vec3, facing: Direction, fuel: usize) -> Self { - Self { name: Name::from_num(id), fuel, queued_movement: Vec3::new(0, 0, 0), position: (position, facing), goal: None, pending_update: true } + Self { name: Name::from_num(id), fuel, queued_movement: Vec3::new(0, 0, 0), position: (position, facing), goal: None, pending_update: true, moves: VecDeque::new() } } } @@ -109,10 +110,10 @@ async fn main() -> Result<(), Error> { let serv = Router::new() .route("/turtle/new", post(create_turtle)) - .route("/turtle/update/:id", post(command)) + .route("/turtle/:id/update", post(command)) .route("/turtle/client.lua", get(client)) - .route("/turtle/setGoal/:id", post(set_goal)) - .route("/turtle/info/:id", get(turtle_info)) + .route("/turtle/:id/setGoal", post(set_goal)) + .route("/turtle/:id/info", get(turtle_info)) .route("/turtle/updateAll", get(update_turtles)) .route("/flush", get(flush)) .with_state(state.clone()); @@ -227,8 +228,22 @@ async fn turtle_info( State(state): State, ) -> Json { let state = &mut state.read().await; + let turtle = &state.turtles[id as usize]; - Json(state.turtles[id as usize].clone()) + let mut pseudomoves: VecDeque = VecDeque::new(); + turtle.moves.front().map(|m| pseudomoves.push_front(m.clone())); + + let cloned = Turtle { + name: turtle.name.clone(), + fuel: turtle.fuel, + queued_movement: turtle.queued_movement.clone(), + position: turtle.position.clone(), + goal: turtle.goal.clone(), + pending_update: turtle.pending_update, + moves: pseudomoves, + }; + + Json(cloned) } async fn command( @@ -266,6 +281,7 @@ fn process_turtle_update( turtle.fuel = update.fuel; turtle.position.0 += turtle.queued_movement; + turtle.queued_movement = Vec3::zeros(); } let above = Block { @@ -289,8 +305,6 @@ fn process_turtle_update( world.remove_at_point(&below.pos.into()); world.insert(below); - turtle.queued_movement = turtle.position.1.clone().unit(); - if turtle.goal.is_some_and(|g| g == turtle.position) { turtle.goal = None; } @@ -373,7 +387,7 @@ enum TurtleMineMethod { Strip, } -#[derive(Serialize, Deserialize)] +#[derive(Serialize, Deserialize, Clone)] enum TurtleCommand { Wait, Forward,