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}; pub async fn timer_main(mgr: ClientManager, physics_data: Arc>) { 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 = match mgr.players.read().await.get(addr) { Some(s) => s.handle, None => { continue; } }; 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 * SCALE) as f64, y: (player_body.translation().y * SCALE) as f64 }).await { Ok(_) => (), Err(e) => { error!("unable to send position packet: {}", e); } }; } Err(e) => { error!("unable to update a client thread: {}", e); } } } } }