use std::{time::Duration, sync::Arc};
use log::{error};
use rapier2d::prelude::{PhysicsPipeline};
use tokio::{time::sleep, sync::RwLock};
use crate::{manager::{ClientHandlerMessage, ClientManager, PhysicsData}, SCALE, send};
pub async fn timer_main(mgr: ClientManager, physics_data: Arc<RwLock<PhysicsData>>) {
let mut pipeline = PhysicsPipeline::new();
loop {
sleep(Duration::from_millis(5)).await;
physics_data.write().await.tick(&mut pipeline);
for (addr, client_thread) in mgr.handlers.read().await.iter() {
match client_thread.tx.send(ClientHandlerMessage::Tick).await {
Ok(_) => {
let player_handle = mgr.players.read().await.get(addr).unwrap().handle;
let data = physics_data.read().await;
let player_body = data.rigid_body_set.get(player_handle).unwrap();
match client_thread.tx.send(ClientHandlerMessage::Position { x: player_body.translation().x as f64, y: player_body.translation().y as f64 }).await {
Ok(_) => (),
Err(e) => {
error!("unable to send position packet: {}", e);
}
};
}
Err(e) => {
error!("unable to update a client thread: {}", e);
}
}
}
}
}