use std::{time::Duration, sync::Arc}; use log::{error}; use rapier2d_f64::prelude::{PhysicsPipeline, RigidBodyHandle}; use starkingdoms_protocol::{ProtocolPlanet, PlanetType}; use tokio::{time::sleep, sync::RwLock}; use crate::{manager::{ClientHandlerMessage, ClientManager, PhysicsData}, SCALE, planet::Planets}; pub async fn timer_main(mgr: ClientManager, physics_data: Arc>, world_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_handles = mgr.players.read().await.values().map(|s| {s.handle}).collect::>(); let data = physics_data.read().await; let mut translations = Vec::new(); let mut rotations = Vec::new(); for handle in player_handles { let player_body = data.rigid_body_set.get(handle).unwrap(); translations.push(player_body.translation()); rotations.push(player_body.rotation().angle()); } let usernames_raw = mgr.usernames.read().await; let usernames = usernames_raw.values().collect::>(); match client_thread.tx.send(ClientHandlerMessage::PlayersUpdate { rotation: rotations, usernames: usernames.into_iter().map(|s| s.clone()).collect(), x: translations.clone().into_iter().map(|s| { s.x * SCALE}).collect(), y: translations.into_iter().map(|s| { s.y * SCALE}).collect() }).await { Ok(_) => (), Err(e) => { error!("unable to send position packet: {}", e); } }; let world = world_data.read().await; let planet_data = world.to_protocol(); match client_thread.tx.send(planet_data).await { Ok(_) => (), Err(e) => { error!("unable to send earth packet: {}", e); } }; } Err(e) => { error!("unable to update a client thread: {}", e); } } } } }