~starkingdoms/starkingdoms

ref: 69730b33b8aed64f6b26e6cdcb334a7cec4e54f4 starkingdoms/crates/unified/src/server/mod.rs -rw-r--r-- 3.0 KiB
69730b33 — core planets 5 months 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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
mod planets;

use std::net::{SocketAddr, UdpSocket};
use std::time::{SystemTime, UNIX_EPOCH};
use bevy::prelude::*;
use bevy_rapier2d::prelude::{Collider, Restitution, RigidBody, Velocity};
use bevy_replicon::prelude::{FromClient, Replicated, RepliconChannels};
use bevy_replicon_renet2::netcode::{NativeSocket, NetcodeServerTransport, ServerAuthentication, ServerSetupConfig};
use bevy_replicon_renet2::renet2::{ConnectionConfig, RenetServer};
use bevy_replicon_renet2::RenetChannelsExt;
use crate::ecs::{Ball, Ground, SendBallHere};
use crate::server::planets::planets_plugin;

pub struct ServerPlugin {
    pub bind: SocketAddr,
    pub max_clients: usize,
}
impl Plugin for ServerPlugin {
    fn build(&self, app: &mut App) {
        let bind = self.bind.clone();
        let max_clients = self.max_clients.clone();

        app
            .add_systems(FixedPreUpdate, bevy_replicon::server::increment_tick) // !!important!! do not remove or move
            .add_systems(Startup, move |mut commands: Commands, channels: Res<RepliconChannels>| {
                let server = RenetServer::new(ConnectionConfig::from_channels(
                    channels.server_configs(),
                    channels.client_configs()
                ));

                let server_config = ServerSetupConfig {
                    current_time: SystemTime::now().duration_since(UNIX_EPOCH).unwrap(),
                    max_clients: max_clients,
                    protocol_id: 0,
                    authentication: ServerAuthentication::Unsecure,
                    socket_addresses: vec![vec![bind]]
                };
                let socket = UdpSocket::bind(bind).unwrap();

                let transport = NetcodeServerTransport::new(server_config, NativeSocket::new(socket).unwrap()).unwrap();

                commands.insert_resource(server);
                commands.insert_resource(transport);

                info!("websocket server listening");
            })
            .add_systems(Startup, setup_physics)
            .add_systems(PreUpdate, receive_send_ball_here)
            .add_plugins(planets_plugin);
    }
}

fn setup_physics(mut commands: Commands) {
    commands.spawn(Collider::cuboid(500.0, 50.0))
        .insert(Transform::from_xyz(0.0, -100.0, 0.0))
        .insert(Restitution::coefficient(1.0))
        .insert(Ground)
        .insert(Replicated);

    commands.spawn(RigidBody::Dynamic)
        .insert(Collider::ball(50.0))
        .insert(Restitution::coefficient(1.0))
        .insert(Transform::from_xyz(0.0, 400.0, 0.0))
        .insert(Velocity::default())
        .insert(Ball)
        .insert(Replicated);
}

fn receive_send_ball_here(mut events: EventReader<FromClient<SendBallHere>>, mut ball: Query<(&mut Transform, &mut Velocity), With<Ball>>) {
    for FromClient { client_entity, event } in events.read() {
        for (mut position, mut velocity) in &mut ball {
            position.translation.x = event.0.x;
            position.translation.y = event.0.y;
            velocity.linvel = Vec2::ZERO;
            velocity.angvel = 0.0;
        }
    }
}