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>) { 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); } } } } }