From a9f1c3a821e945eaea851e706bc98c44fe207ecc Mon Sep 17 00:00:00 2001 From: steamroller-airmash <38710707+steamroller-airmash@users.noreply.github.com> Date: Mon, 23 May 2022 12:21:18 +0200 Subject: [PATCH 1/4] Add the fixed-position powerups to FFA --- ffa/src/main.rs | 17 +++++++++++++++ ffa/src/upgrades.rs | 52 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 ffa/src/upgrades.rs diff --git a/ffa/src/main.rs b/ffa/src/main.rs index 8cb1b33d..425098a3 100644 --- a/ffa/src/main.rs +++ b/ffa/src/main.rs @@ -1,8 +1,10 @@ use std::env; use std::fs::File; +use std::time::Duration; use clap::arg; use serde_deserialize_over::DeserializeOver; +use upgrades::PeriodicPowerupSpawner; use server::*; use server::{ @@ -11,6 +13,7 @@ use server::{ }; mod systems; +mod upgrades; fn set_default_var(name: &str, value: &str) { if None == env::var_os(name) { @@ -48,6 +51,20 @@ fn main() { // Use the provided FFA scoreboard systems. server::system::ffa::register_all(&mut game); + // Inferno in Europe + game.register(PeriodicPowerupSpawner::inferno( + Vector2::new(920.0, -2800.0), + Duration::from_secs(105), + )); + game.register(PeriodicPowerupSpawner::inferno( + Vector2::new(-7440.0, -1360.0), + Duration::from_secs(105), + )); + game.register(PeriodicPowerupSpawner::inferno( + Vector2::new(6565.0, -935.0), + Duration::from_secs(105), + )); + if let Some(path) = matches.value_of("config") { let file = match File::open(path) { Ok(x) => x, diff --git a/ffa/src/upgrades.rs b/ffa/src/upgrades.rs new file mode 100644 index 00000000..147c1999 --- /dev/null +++ b/ffa/src/upgrades.rs @@ -0,0 +1,52 @@ +use std::time::{Duration, Instant}; + +use server::protocol::{MobType, Position}; +use server::{event::Frame, Entity, EventHandler}; + +#[derive(Copy, Clone)] +enum SpawnerState { + Spawned(Entity), + Unspawned(Instant), +} + +pub struct PeriodicPowerupSpawner { + state: SpawnerState, + interval: Duration, + mob: MobType, + pos: Position, +} + +impl PeriodicPowerupSpawner { + pub fn new(mob: MobType, pos: Position, interval: Duration) -> Self { + Self { + mob, + pos, + interval, + state: SpawnerState::Unspawned(Instant::now()), + } + } + + pub fn inferno(pos: Position, interval: Duration) -> Self { + Self::new(MobType::Inferno, pos, interval) + } +} + +impl EventHandler for PeriodicPowerupSpawner { + fn on_event(&mut self, _: &Frame, game: &mut server::AirmashGame) { + let frame = game.this_frame(); + + match self.state { + SpawnerState::Spawned(entity) => { + if !game.world.contains(entity) { + self.state = SpawnerState::Unspawned(frame + self.interval); + } + } + SpawnerState::Unspawned(next) => { + if frame > next { + let entity = game.spawn_mob(self.mob, self.pos, Duration::from_secs(60)); + self.state = SpawnerState::Spawned(entity); + } + } + } + } +} From d9aa74d4d955e50ccf7645da18ac9cf571481a59 Mon Sep 17 00:00:00 2001 From: steamroller-airmash <38710707+steamroller-airmash@users.noreply.github.com> Date: Tue, 24 May 2022 00:56:24 +0200 Subject: [PATCH 2/4] Add PeriodicPowerupSpawner to the server crate --- server-next/src/util/mod.rs | 3 ++ server-next/src/util/powerup_spawner.rs | 56 +++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 server-next/src/util/powerup_spawner.rs diff --git a/server-next/src/util/mod.rs b/server-next/src/util/mod.rs index 5596aeba..dd58d872 100644 --- a/server-next/src/util/mod.rs +++ b/server-next/src/util/mod.rs @@ -9,8 +9,11 @@ use nalgebra::vector; use std::time::{Duration, Instant}; pub(crate) mod escapes; +mod powerup_spawner; pub mod spectate; +pub use self::powerup_spawner::PeriodicPowerupSpawner; + pub fn convert_time(dur: Duration) -> Time { dur.as_secs_f32() * 60.0 } diff --git a/server-next/src/util/powerup_spawner.rs b/server-next/src/util/powerup_spawner.rs new file mode 100644 index 00000000..2725b1c9 --- /dev/null +++ b/server-next/src/util/powerup_spawner.rs @@ -0,0 +1,56 @@ +use std::time::{Duration, Instant}; + +use crate::protocol::{MobType, Position}; +use crate::{event::Frame, Entity, EventHandler}; + +#[derive(Copy, Clone)] +enum SpawnerState { + Spawned(Entity), + Unspawned(Instant), +} + +pub struct PeriodicPowerupSpawner { + state: SpawnerState, + interval: Duration, + mob: MobType, + pos: Position, +} + +impl PeriodicPowerupSpawner { + pub fn new(mob: MobType, pos: Position, interval: Duration) -> Self { + Self { + mob, + pos, + interval, + state: SpawnerState::Unspawned(Instant::now()), + } + } + + pub fn inferno(pos: Position, interval: Duration) -> Self { + Self::new(MobType::Inferno, pos, interval) + } + + pub fn shield(pos: Position, interval: Duration) -> Self { + Self::new(MobType::Shield, pos, interval) + } +} + +impl EventHandler for PeriodicPowerupSpawner { + fn on_event(&mut self, _: &Frame, game: &mut crate::AirmashGame) { + let frame = game.this_frame(); + + match self.state { + SpawnerState::Spawned(entity) => { + if !game.world.contains(entity) { + self.state = SpawnerState::Unspawned(frame + self.interval); + } + } + SpawnerState::Unspawned(next) => { + if frame > next { + let entity = game.spawn_mob(self.mob, self.pos, Duration::from_secs(60)); + self.state = SpawnerState::Spawned(entity); + } + } + } + } +} From ae513f11ffd8bd6484d3121b3107659d6d92b40c Mon Sep 17 00:00:00 2001 From: steamroller-airmash <38710707+steamroller-airmash@users.noreply.github.com> Date: Tue, 24 May 2022 00:58:57 +0200 Subject: [PATCH 3/4] Switch the FFA server to use the struct from the server crate --- ffa/src/main.rs | 3 +-- ffa/src/upgrades.rs | 52 --------------------------------------------- 2 files changed, 1 insertion(+), 54 deletions(-) delete mode 100644 ffa/src/upgrades.rs diff --git a/ffa/src/main.rs b/ffa/src/main.rs index 425098a3..eae85126 100644 --- a/ffa/src/main.rs +++ b/ffa/src/main.rs @@ -4,16 +4,15 @@ use std::time::Duration; use clap::arg; use serde_deserialize_over::DeserializeOver; -use upgrades::PeriodicPowerupSpawner; use server::*; use server::{ protocol::GameType, resource::{Config, RegionName}, + util::PeriodicPowerupSpawner, }; mod systems; -mod upgrades; fn set_default_var(name: &str, value: &str) { if None == env::var_os(name) { diff --git a/ffa/src/upgrades.rs b/ffa/src/upgrades.rs deleted file mode 100644 index 147c1999..00000000 --- a/ffa/src/upgrades.rs +++ /dev/null @@ -1,52 +0,0 @@ -use std::time::{Duration, Instant}; - -use server::protocol::{MobType, Position}; -use server::{event::Frame, Entity, EventHandler}; - -#[derive(Copy, Clone)] -enum SpawnerState { - Spawned(Entity), - Unspawned(Instant), -} - -pub struct PeriodicPowerupSpawner { - state: SpawnerState, - interval: Duration, - mob: MobType, - pos: Position, -} - -impl PeriodicPowerupSpawner { - pub fn new(mob: MobType, pos: Position, interval: Duration) -> Self { - Self { - mob, - pos, - interval, - state: SpawnerState::Unspawned(Instant::now()), - } - } - - pub fn inferno(pos: Position, interval: Duration) -> Self { - Self::new(MobType::Inferno, pos, interval) - } -} - -impl EventHandler for PeriodicPowerupSpawner { - fn on_event(&mut self, _: &Frame, game: &mut server::AirmashGame) { - let frame = game.this_frame(); - - match self.state { - SpawnerState::Spawned(entity) => { - if !game.world.contains(entity) { - self.state = SpawnerState::Unspawned(frame + self.interval); - } - } - SpawnerState::Unspawned(next) => { - if frame > next { - let entity = game.spawn_mob(self.mob, self.pos, Duration::from_secs(60)); - self.state = SpawnerState::Spawned(entity); - } - } - } - } -} From 1046b82fcb4ffd437660a1b1a0b4f331bab73a94 Mon Sep 17 00:00:00 2001 From: steamroller-airmash <38710707+steamroller-airmash@users.noreply.github.com> Date: Tue, 24 May 2022 01:21:11 +0200 Subject: [PATCH 4/4] Add periodic powerup spawns for CTF --- ctf/src/main.rs | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/ctf/src/main.rs b/ctf/src/main.rs index 5c62d7c3..02713c16 100644 --- a/ctf/src/main.rs +++ b/ctf/src/main.rs @@ -1,4 +1,6 @@ -use airmash::AirmashGame; +use std::time::Duration; + +use airmash::{util::PeriodicPowerupSpawner, AirmashGame, Vector2}; use serde_deserialize_over::DeserializeOver; fn set_default_var(name: &str, value: &str) { @@ -61,5 +63,30 @@ fn main() { airmash_server_ctf::setup_ctf_server(&mut game); + // Inferno in Europe + game.register(PeriodicPowerupSpawner::inferno( + Vector2::new(920.0, -2800.0), + Duration::from_secs(105), + )); + game.register(PeriodicPowerupSpawner::inferno( + Vector2::new(-7440.0, -1360.0), + Duration::from_secs(105), + )); + game.register(PeriodicPowerupSpawner::inferno( + Vector2::new(6565.0, -935.0), + Duration::from_secs(105), + )); + + // Blue base shield + game.register(PeriodicPowerupSpawner::shield( + Vector2::new(-9300.0, -1480.0), + Duration::from_secs(90), + )); + // Red base shield + game.register(PeriodicPowerupSpawner::shield( + Vector2::new(8350.0, -935.0), + Duration::from_secs(90), + )); + game.run_until_shutdown(); }