use std::collections::HashMap;
use std::net::SocketAddr;
use std::sync::Arc;
use rapier2d_f64::na::Vector2;
use rapier2d_f64::prelude::{IntegrationParameters, PhysicsPipeline, IslandManager, BroadPhase, NarrowPhase, ImpulseJointSet, MultibodyJointSet, CCDSolver, RigidBodySet, ColliderSet, RigidBodyHandle};
use async_std::sync::RwLock;
use async_std::channel::Sender;
#[derive(Clone)]
pub struct ClientManager {
pub handlers: Arc<RwLock<HashMap<SocketAddr, ClientHandler>>>,
pub usernames: Arc<RwLock<HashMap<SocketAddr, String>>>,
}
#[derive(Clone)]
pub struct Player {
pub handle: RigidBodyHandle,
pub input: PlayerInput,
pub addr: SocketAddr,
}
#[derive(Default, Clone)]
pub struct PlayerInput {
pub up: bool,
pub left: bool,
pub right: bool,
pub down: bool
}
#[derive(Clone)]
pub struct ClientHandler {
pub tx: Sender<ClientHandlerMessage>
}
#[derive(Clone, Default)]
pub struct PhysicsData {
pub gravity: Vector2<f64>,
pub integration_parameters: IntegrationParameters,
pub island_manager: IslandManager, pub broad_phase: BroadPhase,
pub narrow_phase: NarrowPhase,
pub rigid_body_set: RigidBodySet,
pub collider_set: ColliderSet,
pub impulse_joint_set: ImpulseJointSet,
pub multibody_joint_set: MultibodyJointSet,
pub ccd_solver: CCDSolver,
}
impl PhysicsData {
pub fn tick(&mut self, pipeline: &mut PhysicsPipeline) {
pipeline.step(&self.gravity,
&self.integration_parameters,
&mut self.island_manager,
&mut self.broad_phase,
&mut self.narrow_phase,
&mut self.rigid_body_set,
&mut self.collider_set,
&mut self.impulse_joint_set,
&mut self.multibody_joint_set,
&mut self.ccd_solver,
None,
&(),
&()
);
}
}
#[derive(Debug, Clone)]
pub enum ClientHandlerMessage {
Tick,
ChatMessage { from: String, message: String },
PlayersUpdate { players: Vec<starkingdoms_protocol::player::Player> },
PlanetData { planets: Vec<starkingdoms_protocol::planet::Planet> },
}