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