aboutsummaryrefslogtreecommitdiffstats
path: root/src/server.rs
diff options
context:
space:
mode:
authorLibravatar Alexander Foremny <aforemny@posteo.de>2024-03-14 06:43:53 +0100
committerLibravatar Alexander Foremny <aforemny@posteo.de>2024-03-15 02:50:57 +0100
commit69584a302d132dc2bcc3837437e7347a3e0a5114 (patch)
treefae29ea706451e91a0dee99200fa661b78de3517 /src/server.rs
parent9671dd79163e654f61896ec4f61142a71c2f82c0 (diff)
feat: players can teleport
Diffstat (limited to 'src/server.rs')
-rw-r--r--src/server.rs83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/server.rs b/src/server.rs
new file mode 100644
index 0000000..3a7dd40
--- /dev/null
+++ b/src/server.rs
@@ -0,0 +1,83 @@
+use crate::protocol::*;
+use crate::server::network::*;
+use crate::shared::*;
+use bevy::prelude::*;
+use bevy::utils::HashMap;
+use lightyear::prelude::*;
+use rand::Rng;
+
+mod network;
+
+#[derive(Resource, Default)]
+struct EntityMap(HashMap<ClientId, Entity>);
+
+pub fn main(transport: TransportConfig) {
+ App::new()
+ .add_plugins(MinimalPlugins)
+ .add_plugins(ServerPlugin { transport })
+ .run();
+}
+
+struct ServerPlugin {
+ pub transport: TransportConfig,
+}
+
+impl Plugin for ServerPlugin {
+ fn build(&self, app: &mut App) {
+ app.insert_resource(EntityMap::default())
+ .add_plugins(NetworkPlugin {
+ transport: self.transport.clone(),
+ })
+ .add_systems(Update, connections)
+ .add_systems(FixedUpdate, player_input);
+ }
+}
+
+fn connections(
+ mut commands: Commands,
+ mut connects: EventReader<server::ConnectEvent>,
+ mut disconnects: EventReader<server::DisconnectEvent>,
+ mut entity_map: ResMut<EntityMap>,
+) {
+ let mut rng = rand::thread_rng();
+ for connection in connects.read() {
+ let client_id = connection.context();
+ info!("connected: {:?}", client_id);
+ let position = Vec2::new(
+ 50. * rng.gen_range(-2..=2) as f32,
+ 50. * rng.gen_range(-2..=2) as f32,
+ );
+ let color = Color::hsl(360. * rng.gen_range(0..=15) as f32 / 16., 0.95, 0.7);
+ let entity = commands.spawn(PlayerBundle::new(*client_id, position, color));
+ entity_map.0.insert(*client_id, entity.id());
+ }
+ for connection in disconnects.read() {
+ let client_id = connection.context();
+ info!("disconnected: {:?}", client_id);
+ if let Some(entity_id) = entity_map.0.remove(client_id) {
+ commands.entity(entity_id).despawn();
+ }
+ }
+}
+
+fn player_input(
+ entity_map: Res<EntityMap>,
+ mut input_reader: EventReader<server::InputEvent<Inputs>>,
+ mut positions: Query<&mut PlayerPosition>,
+) {
+ for input in input_reader.read() {
+ let client_id = input.context();
+ if let Some(input) = input.input() {
+ if let Some(entity_id) = entity_map.0.get(client_id) {
+ match input {
+ Inputs::Teleport(new_position) => {
+ if let Ok(mut position) = positions.get_mut(*entity_id) {
+ position.0 = *new_position;
+ }
+ }
+ _ => {}
+ }
+ }
+ }
+ }
+}