Skip to content

Commit 26be150

Browse files
committed
Implement /gamemode
1 parent 18199bc commit 26be150

File tree

24 files changed

+152
-25
lines changed

24 files changed

+152
-25
lines changed

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

core/inventory/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ edition = "2018"
77
[dependencies]
88
feather-items = { path = "../items" }
99

10-
fecs = { git = "https://github.com/feather-rs/fecs", rev = "fed8bcb516941b12cb980e354e77b699be075a89" }
10+
fecs = { git = "https://github.com/feather-rs/fecs", rev = "0c4838d65b41ca059012b6e9147eabf0c275a731" }
1111
legion = { git = "https://github.com/TomGillen/legion", rev = "bd441f4811e7a9e877a0f479a674bbdbf4e4cda3" }
1212
thiserror = "1.0"
1313
parking_lot = "0.10"

server/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ feather-server-util = { path = "util" }
3030
feather-server-weather = { path = "weather" }
3131
feather-server-worldgen = { path = "worldgen" }
3232

33-
fecs = { git = "https://github.com/feather-rs/fecs", rev = "fed8bcb516941b12cb980e354e77b699be075a89" }
33+
fecs = { git = "https://github.com/feather-rs/fecs", rev = "0c4838d65b41ca059012b6e9147eabf0c275a731" }
3434
tokio = { version = "0.2", features = ["full"] }
3535
simple_logger = "1.6"
3636
log = "0.4"

server/chunk/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ feather-server-types = { path = "../types" }
1010
feather-server-util = { path = "../util" }
1111
feather-server-worldgen = { path = "../worldgen" }
1212

13-
fecs = { git = "https://github.com/feather-rs/fecs", rev = "fed8bcb516941b12cb980e354e77b699be075a89" }
13+
fecs = { git = "https://github.com/feather-rs/fecs", rev = "0c4838d65b41ca059012b6e9147eabf0c275a731" }
1414
parking_lot = "0.10"
1515
ahash = "0.3"
1616
rayon = "1.3"

server/commands/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ feather-core = { path = "../../core" }
99
feather-server-types = { path = "../types" }
1010
feather-server-util = { path = "../util" }
1111

12-
fecs = { git = "https://github.com/feather-rs/fecs", rev = "fed8bcb516941b12cb980e354e77b699be075a89" }
12+
fecs = { git = "https://github.com/feather-rs/fecs", rev = "0c4838d65b41ca059012b6e9147eabf0c275a731" }
1313
lieutenant = { git = "https://github.com/feather-rs/lieutenant", branch = "cleanup" }
1414
smallvec = "1.4"
1515
anyhow = "1.0"

server/commands/src/arguments.rs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::CommandCtx;
22
use feather_core::position;
3-
use feather_core::util::Position;
3+
use feather_core::util::{Gamemode, Position};
44
use feather_server_types::{Game, Name, NetworkId, Player};
55
use fecs::{component, Entity, IntoQuery, Read, World};
66
use lieutenant::{ArgumentKind, Input};
@@ -240,3 +240,35 @@ impl ArgumentKind<CommandCtx> for Coordinates {
240240
Ok(Coordinates { x, y, z })
241241
}
242242
}
243+
244+
#[derive(Debug, Error)]
245+
pub enum GamemodeParseError {
246+
#[error("invalid gamemode string {0}")]
247+
InvalidGamemode(String),
248+
}
249+
250+
/// A parsed gamemode string ("survival", "creative", ...)
251+
#[derive(Copy, Clone, Debug)]
252+
pub struct ParsedGamemode(pub Gamemode);
253+
254+
impl ArgumentKind<CommandCtx> for ParsedGamemode {
255+
type ParseError = GamemodeParseError;
256+
257+
fn satisfies<'a>(_ctx: &CommandCtx, input: &mut Input<'a>) -> bool {
258+
!input.advance_until(" ").is_empty()
259+
}
260+
261+
fn parse<'a>(_ctx: &CommandCtx, input: &mut Input<'a>) -> Result<Self, Self::ParseError> {
262+
let s = input.advance_until(" ");
263+
264+
let gamemode = match s {
265+
"survival" => Gamemode::Survival,
266+
"creative" => Gamemode::Creative,
267+
"spectator" => Gamemode::Spectator,
268+
"adventure" => Gamemode::Adventure,
269+
s => return Err(GamemodeParseError::InvalidGamemode(s.to_owned())),
270+
};
271+
272+
Ok(ParsedGamemode(gamemode))
273+
}
274+
}

server/commands/src/impls.rs

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
//! The implementations of various commands.
22
33
use crate::arguments::Coordinates;
4-
use crate::{arguments::EntitySelector, CommandCtx};
5-
use feather_core::util::Position;
6-
use feather_server_types::Teleported;
4+
use crate::{
5+
arguments::{EntitySelector, ParsedGamemode},
6+
CommandCtx,
7+
};
8+
use feather_core::util::{Gamemode, Position};
9+
use feather_server_types::{GamemodeUpdateEvent, Teleported};
710
use fecs::{Entity, World};
811
use lieutenant::command;
912
use thiserror::Error;
@@ -84,3 +87,42 @@ fn teleport_entity_to_pos(world: &mut World, entity: Entity, pos: Position) {
8487
}
8588
let _ = world.add(entity, Teleported);
8689
}
90+
91+
#[command(usage = "gamemode <gamemode>")]
92+
pub fn gamemode_1(ctx: &mut CommandCtx, gamemode: ParsedGamemode) -> anyhow::Result<()> {
93+
update_gamemode(ctx, gamemode.0, ctx.sender);
94+
Ok(())
95+
}
96+
97+
#[command(usage = "gamemode <gamemode> <target>")]
98+
pub fn gamemode_2(
99+
ctx: &mut CommandCtx,
100+
gamemode: ParsedGamemode,
101+
target: EntitySelector,
102+
) -> anyhow::Result<()> {
103+
for entity in target.entities {
104+
update_gamemode(ctx, gamemode.0, entity)
105+
}
106+
107+
Ok(())
108+
}
109+
110+
fn update_gamemode(ctx: &mut CommandCtx, gamemode: Gamemode, entity: Entity) {
111+
let event = if let Some(mut old) = ctx.world.try_get_mut::<Gamemode>(ctx.sender) {
112+
let old_val = *old;
113+
*old = gamemode;
114+
115+
let event = GamemodeUpdateEvent {
116+
player: entity,
117+
old: old_val,
118+
new: gamemode,
119+
};
120+
Some(event)
121+
} else {
122+
None
123+
};
124+
125+
if let Some(event) = event {
126+
ctx.game.handle(&mut *ctx.world, event);
127+
}
128+
}

server/commands/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,9 @@ impl CommandState {
101101
tp_2,
102102
tp_3,
103103
tp_4,
104+
105+
gamemode_1,
106+
gamemode_2,
104107
}
105108

106109
Self {

server/entity/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ feather-core = { path = "../../core" }
99
feather-server-types = { path = "../types" }
1010
feather-server-util = { path = "../util" }
1111

12-
fecs = { git = "https://github.com/feather-rs/fecs", rev = "fed8bcb516941b12cb980e354e77b699be075a89" }
12+
fecs = { git = "https://github.com/feather-rs/fecs", rev = "0c4838d65b41ca059012b6e9147eabf0c275a731" }
1313
nalgebra-glm = "0.6"
1414
inventory = "0.1"
1515
parking_lot = "0.10"

server/lighting/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ feather-server-physics = { path = "../physics" }
1010
feather-server-types = { path = "../types" }
1111
feather-server-util = { path = "../util" }
1212

13-
fecs = { git = "https://github.com/feather-rs/fecs", rev = "fed8bcb516941b12cb980e354e77b699be075a89" }
13+
fecs = { git = "https://github.com/feather-rs/fecs", rev = "0c4838d65b41ca059012b6e9147eabf0c275a731" }
1414
arrayvec = "0.5"
1515
smallvec = "1.4"
1616
ahash = "0.3"

0 commit comments

Comments
 (0)