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();
}