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}; 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_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); } }; let world = world_data.read().await; let earth_handle = world.get(0).unwrap(); let earth_body = data.rigid_body_set.get(*earth_handle).unwrap(); //let earth_collider = data.collider_set.get(earth_body.colliders()[0]).unwrap(); let protocol_earth = ProtocolPlanet { planet_type: PlanetType::Earth, x: earth_body.translation().x * SCALE, y: earth_body.translation().y * SCALE, radius: 1000.0, }; match client_thread.tx.send(ClientHandlerMessage::PlanetData { planets: vec![protocol_earth] }).await { Ok(_) => (), Err(e) => { error!("unable to send earth packet: {}", e); } }; } Err(e) => { error!("unable to update a client thread: {}", e); } } } } }