diff --git a/common/src/cmd.rs b/common/src/cmd.rs index 7c1a2d6ebf..fc3352c6af 100644 --- a/common/src/cmd.rs +++ b/common/src/cmd.rs @@ -47,6 +47,8 @@ pub enum ChatCommand { Alias, ApplyBuff, Ban, + BattleMode, + BattleModeForce, Build, BuildAreaAdd, BuildAreaList, @@ -321,6 +323,25 @@ impl ChatCommand { true for overwrite to alter an existing ban..", Some(Moderator), ), + ChatCommand::BattleMode => cmd( + vec![Enum( + "battle mode", + vec!["pvp".to_owned(), "pve".to_owned()], + Optional, + )], + "Set your battle mode to pvp/pve.\n\ + If called without arguments will show current battle mode.", + None, + ), + ChatCommand::BattleModeForce => cmd( + vec![Enum( + "battle mode", + vec!["pvp".to_owned(), "pve".to_owned()], + Required, + )], + "Change your battle mode flag without any checks", + Some(Admin), + ), ChatCommand::Build => cmd(vec![], "Toggles build mode on and off", None), ChatCommand::BuildAreaAdd => cmd( vec![ @@ -623,6 +644,8 @@ impl ChatCommand { ChatCommand::Alias => "alias", ChatCommand::ApplyBuff => "buff", ChatCommand::Ban => "ban", + ChatCommand::BattleMode => "battlemode", + ChatCommand::BattleModeForce => "battlemode_force", ChatCommand::Build => "build", ChatCommand::BuildAreaAdd => "build_area_add", ChatCommand::BuildAreaList => "build_area_list", diff --git a/server/src/cmd.rs b/server/src/cmd.rs index 960044b230..6e71021f01 100644 --- a/server/src/cmd.rs +++ b/server/src/cmd.rs @@ -31,7 +31,7 @@ use common::{ event::{EventBus, ServerEvent}, generation::EntityInfo, npc::{self, get_npc_name}, - resources::{PlayerPhysicsSettings, TimeOfDay}, + resources::{PlayerPhysicsSettings, TimeOfDay, BattleMode}, terrain::{Block, BlockKind, SpriteKind, TerrainChunkSize}, uid::Uid, vol::RectVolSize, @@ -113,6 +113,8 @@ fn do_command( ChatCommand::Alias => handle_alias, ChatCommand::ApplyBuff => handle_apply_buff, ChatCommand::Ban => handle_ban, + ChatCommand::BattleMode => handle_battlemode, + ChatCommand::BattleModeForce => handle_battlemode_force, ChatCommand::Build => handle_build, ChatCommand::BuildAreaAdd => handle_build_area_add, ChatCommand::BuildAreaList => handle_build_area_list, @@ -3094,6 +3096,62 @@ fn handle_ban( } } +fn handle_battlemode( + server: &mut Server, + client: EcsEntity, + target: EcsEntity, + args: Vec, + _action: &ChatCommand, +) -> CmdResult<()> { + let ecs = &server.state.ecs(); + if let Some(mode) = parse_args!(args, String) { + Err("Seting mode isn't implemented".to_owned()) + } else { + let players = ecs.read_storage::(); + let player = players + .get(target) + .ok_or_else(|| "Cannot get player component for target".to_string())?; + server.notify_client( + client, + ServerGeneral::server_msg( + ChatType::CommandInfo, + format!("Battle mode is {:?}", player.battle_mode), + ), + ); + Ok(()) + } +} + +fn handle_battlemode_force( + server: &mut Server, + client: EcsEntity, + target: EcsEntity, + args: Vec, + action: &ChatCommand, +) -> CmdResult<()> { + let ecs = &server.state.ecs(); + let mut players = ecs.write_storage::(); + let mode = parse_args!(args, String).ok_or_else(|| action.help_string())?; + let mode = match mode.as_str() { + "pvp" => BattleMode::PvP, + "pve" => BattleMode::PvE, + _ => return Err("Available modes: pvp, pve".to_owned()), + }; + if let Some(ref mut player) = players.get_mut(target) { + player.battle_mode = mode; + server.notify_client( + client, + ServerGeneral::server_msg( + ChatType::CommandInfo, + format!("Set battle_mode to {:?}", player.battle_mode), + ), + ); + Ok(()) + } else { + Err("Cannot get player component for target".to_owned()) + } +} + fn handle_unban( server: &mut Server, client: EcsEntity,