From 888faadfabe1dfec4cb76a448c9dd307300087e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Korg=C3=B3l?= Date: Fri, 28 Jun 2019 16:22:25 +0200 Subject: [PATCH] Prevent text clients from gaining position --- chat-cli/src/main.rs | 2 +- server/src/cmd.rs | 60 ++++++++++++++++++++++++++++---------------- 2 files changed, 39 insertions(+), 23 deletions(-) diff --git a/chat-cli/src/main.rs b/chat-cli/src/main.rs index 41ca03a63e..796082db34 100644 --- a/chat-cli/src/main.rs +++ b/chat-cli/src/main.rs @@ -15,7 +15,7 @@ fn read_input() -> String { .read_line(&mut buffer) .expect("Failed to read input"); - buffer + buffer.trim().to_string() } fn main() { diff --git a/server/src/cmd.rs b/server/src/cmd.rs index 262c6a3bba..5d09567c94 100644 --- a/server/src/cmd.rs +++ b/server/src/cmd.rs @@ -128,16 +128,24 @@ fn handle_jump(server: &mut Server, entity: EcsEntity, args: String, action: &Ch fn handle_goto(server: &mut Server, entity: EcsEntity, args: String, action: &ChatCommand) { let (opt_x, opt_y, opt_z) = scan_fmt!(&args, action.arg_fmt, f32, f32, f32); - match (opt_x, opt_y, opt_z) { - (Some(x), Some(y), Some(z)) => { - server - .state - .write_component(entity, comp::Pos(Vec3::new(x, y, z))); - server.state.write_component(entity, comp::ForceUpdate); + match server.state.read_component_cloned::(entity) { + Some(mut pos) => match (opt_x, opt_y, opt_z) { + (Some(x), Some(y), Some(z)) => { + server + .state + .write_component(entity, comp::Pos(Vec3::new(x, y, z))); + server.state.write_component(entity, comp::ForceUpdate); + } + _ => server + .clients + .notify(entity, ServerMsg::Chat(String::from(action.help_string))), + }, + None => { + server.clients.notify( + entity, + ServerMsg::Chat(String::from("You don't have any position!")), + ); } - _ => server - .clients - .notify(entity, ServerMsg::Chat(String::from(action.help_string))), } } @@ -203,25 +211,33 @@ fn handle_tp(server: &mut Server, entity: EcsEntity, args: String, action: &Chat .join() .find(|(_, player)| player.alias == alias) .map(|(entity, _)| entity); - match opt_player { - Some(player) => match server.state.read_component_cloned::(player) { - Some(pos) => { - server.state.write_component(entity, pos); - server.state.write_component(entity, comp::ForceUpdate); + match server.state.read_component_cloned::(entity) { + Some(mut pos) => match opt_player { + Some(player) => match server.state.read_component_cloned::(player) { + Some(pos) => { + server.state.write_component(entity, pos); + server.state.write_component(entity, comp::ForceUpdate); + } + None => server.clients.notify( + entity, + ServerMsg::Chat(format!("Unable to teleport to player '{}'!", alias)), + ), + }, + None => { + server.clients.notify( + entity, + ServerMsg::Chat(format!("Player '{}' not found!", alias)), + ); + server + .clients + .notify(entity, ServerMsg::Chat(String::from(action.help_string))); } - None => server.clients.notify( - entity, - ServerMsg::Chat(format!("Unable to teleport to player '{}'!", alias)), - ), }, None => { server.clients.notify( entity, - ServerMsg::Chat(format!("Player '{}' not found!", alias)), + ServerMsg::Chat(format!("You don't have any position!")), ); - server - .clients - .notify(entity, ServerMsg::Chat(String::from(action.help_string))); } } }