From 20fd6cec7ea518a98a4f74f746293eb77c170267 Mon Sep 17 00:00:00 2001 From: Alexander Foremny Date: Thu, 14 Mar 2024 16:10:11 +0100 Subject: feat: shooting --- src/server.rs | 174 ++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 156 insertions(+), 18 deletions(-) (limited to 'src/server.rs') diff --git a/src/server.rs b/src/server.rs index 188aad1..52daf1a 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1,8 +1,11 @@ use crate::protocol::*; use crate::server::network::*; +use crate::shared::cooldown::*; use crate::shared::imperative::*; +use crate::shared::projectile::*; use crate::shared::*; use bevy::prelude::*; +use bevy::utils::Duration; use bevy::utils::HashMap; use lightyear::prelude::*; use rand::Rng; @@ -29,22 +32,43 @@ impl Plugin for ServerPlugin { .add_plugins(NetworkPlugin { transport: self.transport.clone(), }) - .add_systems(Update, connections) - .add_systems(FixedUpdate, player_input) - .add_systems(Update, imperative); + .add_systems(Startup, setup) + .add_systems(Update, (connects, disconnects)) + .add_systems( + Update, + ( + imperative_attack.after(cooldown_decrement), + imperative_walk_to, + ) + .after(player_input), + ) + .add_systems( + Update, + ( + projectile_move.after(imperative_walk_to), + projectile_despawn, + ) + .chain(), + ) + .add_systems(Update, cooldown_decrement) + .add_systems(FixedUpdate, player_input); } } -fn connections( +fn setup(mut commands: Commands, mut entity_map: ResMut) { + let client_id = 1; + let entity = commands.spawn(PlayerBundle::new(1, Vec2::ZERO, Color::GRAY)); + entity_map.0.insert(client_id, entity.id()); +} + +fn connects( mut commands: Commands, mut connects: EventReader, - mut disconnects: EventReader, mut entity_map: ResMut, ) { 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, @@ -53,9 +77,15 @@ fn connections( let entity = commands.spawn(PlayerBundle::new(*client_id, position, color)); entity_map.0.insert(*client_id, entity.id()); } +} + +fn disconnects( + mut commands: Commands, + mut disconnects: EventReader, + mut entity_map: ResMut, +) { 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(); } @@ -86,22 +116,130 @@ fn player_input( const MOVEMENT_SPEED: f32 = 80.; -fn imperative(mut players: Query<(&mut Imperative, &mut PlayerPosition)>, time: Res