~starkingdoms/starkingdoms

ref: 74985008325607550cf7d30d9c19c6c287c5771a starkingdoms/server/src/timer.rs -rw-r--r-- 1.5 KiB
74985008 — ghostlyzsh adding player is pain 2 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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 = 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);
                }
            }
        }
    }
}