From 787e5a6e4975da8499317f8dc68155b91b8d8eb7 Mon Sep 17 00:00:00 2001 From: Marvin Altemeier Date: Mon, 10 Feb 2020 10:38:45 +0100 Subject: [PATCH 1/3] fix #460 - /give_exp targeting wrong player --- CHANGELOG.md | 2 ++ server/src/cmd.rs | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26d7c26394..9148aa2723 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,8 +16,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Allow spawning individual pet species, not just generic body kinds. ### Changed + - Brighter / higher contrast main-map - Removed highlighting of non-collectible sprites +- Fixed /give_exp ignoring player argument ### Removed diff --git a/server/src/cmd.rs b/server/src/cmd.rs index eaa3d5e39c..8251e401b9 100644 --- a/server/src/cmd.rs +++ b/server/src/cmd.rs @@ -1027,8 +1027,8 @@ fn handle_exp(server: &mut Server, entity: EcsEntity, args: String, action: &Cha let mut error_msg = None; match opt_player { - Some(_alias) => { - if let Some(stats) = ecs.write_storage::().get_mut(entity) { + Some(player) => { + if let Some(stats) = ecs.write_storage::().get_mut(player) { stats.exp.change_by(exp); } else { error_msg = Some(ServerMsg::private(String::from("Player has no stats!"))); From bfdfd87d89496086be50568235bfcb8421e2b82f Mon Sep 17 00:00:00 2001 From: Marvin Altemeier Date: Thu, 13 Feb 2020 21:32:24 +0100 Subject: [PATCH 2/3] change order of /give_exp arguments --- server/src/cmd.rs | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/server/src/cmd.rs b/server/src/cmd.rs index 8251e401b9..4b878c806c 100644 --- a/server/src/cmd.rs +++ b/server/src/cmd.rs @@ -234,8 +234,8 @@ lazy_static! { ), ChatCommand::new( "give_exp", - "{} {}", - "/give_exp : Give experience to specified player", + "{d} {}", + "/give_exp : Give experience to yourself or specify a target player", true, handle_exp, ), @@ -1015,27 +1015,41 @@ spawn_rate {:?} "#, } } -fn handle_exp(server: &mut Server, entity: EcsEntity, args: String, action: &ChatCommand) { - let (a_alias, a_exp) = scan_fmt_some!(&args, action.arg_fmt, String, i64); - if let (Some(alias), Some(exp)) = (a_alias, a_exp) { - let ecs = server.state.ecs_mut(); - let opt_player = (&ecs.entities(), &ecs.read_storage::()) +fn find_target( + ecs: &specs::World, + opt_alias: Option, + fallback: EcsEntity, +) -> Result { + if let Some(alias) = opt_alias { + (&ecs.entities(), &ecs.read_storage::()) .join() .find(|(_, player)| player.alias == alias) - .map(|(entity, _)| entity); + .map(|(entity, _)| entity) + .ok_or(ServerMsg::private(format!("Player '{}' not found!", alias))) + } else { + Ok(fallback) + } +} + +fn handle_exp(server: &mut Server, entity: EcsEntity, args: String, action: &ChatCommand) { + let (a_exp, a_alias) = scan_fmt_some!(&args, action.arg_fmt, i64, String); + + if let Some(exp) = a_exp { + let ecs = server.state.ecs_mut(); + let target = find_target(&ecs, a_alias, entity); let mut error_msg = None; - match opt_player { - Some(player) => { + match target { + Ok(player) => { if let Some(stats) = ecs.write_storage::().get_mut(player) { stats.exp.change_by(exp); } else { error_msg = Some(ServerMsg::private(String::from("Player has no stats!"))); } }, - _ => { - error_msg = Some(ServerMsg::private(format!("Player '{}' not found!", alias))); + Err(e) => { + error_msg = Some(e); }, } From a89003cbfa702b893174fdfe4013d75f81238aa4 Mon Sep 17 00:00:00 2001 From: Marvin Altemeier Date: Thu, 13 Feb 2020 22:15:54 +0100 Subject: [PATCH 3/3] resolve #481 - add /set_level command --- server/src/cmd.rs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/server/src/cmd.rs b/server/src/cmd.rs index 4b878c806c..872f6bec35 100644 --- a/server/src/cmd.rs +++ b/server/src/cmd.rs @@ -239,6 +239,13 @@ lazy_static! { true, handle_exp, ), + ChatCommand::new( + "set_level", + "{d} {}", + "/set_level : Set own Level or specify a target player", + true, + handle_level + ), ChatCommand::new( "removelights", "{}", @@ -1059,6 +1066,34 @@ fn handle_exp(server: &mut Server, entity: EcsEntity, args: String, action: &Cha } } +fn handle_level(server: &mut Server, entity: EcsEntity, args: String, action: &ChatCommand) { + let (a_lvl, a_alias) = scan_fmt_some!(&args, action.arg_fmt, u32, String); + + if let Some(lvl) = a_lvl { + let ecs = server.state.ecs_mut(); + let target = find_target(&ecs, a_alias, entity); + + let mut error_msg = None; + + match target { + Ok(player) => { + if let Some(stats) = ecs.write_storage::().get_mut(player) { + stats.level.set_level(lvl); + } else { + error_msg = Some(ServerMsg::private(String::from("Player has no stats!"))); + } + }, + Err(e) => { + error_msg = Some(e); + }, + } + + if let Some(msg) = error_msg { + server.notify_client(entity, msg); + } + } +} + use common::comp::Item; fn handle_debug(server: &mut Server, entity: EcsEntity, _args: String, _action: &ChatCommand) { if let Ok(items) = assets::load_glob::("common.items.debug.*") {