use crate::config::{BedwarsConfig, Loc, TeamConfig, GeneratorConfig}; use crate::team::BedwarsTeam; use crate::game::GameManager; pub enum BedwarsCommand { SetLobby, SetSpawn { team: BedwarsTeam }, SetBed { team: BedwarsTeam }, SetShop { team: BedwarsTeam }, SetUpgrades { team: BedwarsTeam }, SetGenerator { team: BedwarsTeam }, SetEnderchest { team: BedwarsTeam }, AddGenerator { gen_type: String }, Save, Start, Help, } impl BedwarsCommand { pub fn parse(args: &[String]) -> Result { if args.is_empty() { return Ok(Self::Help); } match args[0].to_lowercase().as_str() { "setlobby" => Ok(Self::SetLobby), "setspawn" => { if args.len() < 2 { return Err("Usage: /bw setspawn ".to_string()); } let team = BedwarsTeam::from_str(&args[1]).ok_or("Invalid team name")?; Ok(Self::SetSpawn { team }) } "setbed" => { if args.len() < 2 { return Err("Usage: /bw setbed ".to_string()); } let team = BedwarsTeam::from_str(&args[1]).ok_or("Invalid team name")?; Ok(Self::SetBed { team }) } "setshop" => { if args.len() < 2 { return Err("Usage: /bw setshop ".to_string()); } let team = BedwarsTeam::from_str(&args[1]).ok_or("Invalid team name")?; Ok(Self::SetShop { team }) } "setupgrades" => { if args.len() < 2 { return Err("Usage: /bw setupgrades ".to_string()); } let team = BedwarsTeam::from_str(&args[1]).ok_or("Invalid team name")?; Ok(Self::SetUpgrades { team }) } "setgenerator" => { if args.len() < 2 { return Err("Usage: /bw setgenerator ".to_string()); } let team = BedwarsTeam::from_str(&args[1]).ok_or("Invalid team name")?; Ok(Self::SetGenerator { team }) } "setenderchest" => { if args.len() < 2 { return Err("Usage: /bw setenderchest ".to_string()); } let team = BedwarsTeam::from_str(&args[1]).ok_or("Invalid team name")?; Ok(Self::SetEnderchest { team }) } "addgenerator" => { if args.len() < 2 { return Err("Usage: /bw addgenerator ".to_string()); } let gen_type = args[1].to_lowercase(); if gen_type != "diamond" && gen_type != "emerald" { return Err("Generator type must be 'diamond' or 'emerald'".to_string()); } Ok(Self::AddGenerator { gen_type }) } "save" => Ok(Self::Save), "start" => Ok(Self::Start), "help" => Ok(Self::Help), _ => Err("Unknown command. Type /bw help for options.".to_string()), } } pub fn execute( &self, config: &mut BedwarsConfig, game_manager: &mut GameManager, player_loc: Loc, target_block_loc: Option, ) -> Result { match self { Self::SetLobby => { config.locations.lobby = player_loc; Ok("Lobby location updated in config".to_string()) } Self::SetSpawn { team } => { let team_name = team.get_name().to_lowercase(); let team_conf = config.locations.teams.entry(team_name.clone()).or_insert_with(|| TeamConfig { enabled: true, spawn: player_loc.clone(), bed: player_loc.clone(), generator: player_loc.clone(), shop: player_loc.clone(), upgrades: player_loc.clone(), enderchest: player_loc.clone(), }); team_conf.spawn = player_loc; team_conf.enabled = true; game_manager.enable_team(*team); Ok(format!("Spawn for team {} set and enabled", team.get_name())) } Self::SetBed { team } => { let block_loc = target_block_loc.ok_or("You must look at a bed block")?; let team_name = team.get_name().to_lowercase(); if let Some(t_conf) = config.locations.teams.get_mut(&team_name) { t_conf.bed = block_loc; Ok(format!("Bed for team {} set", team.get_name())) } else { Err("Team not configured yet. Set spawn first.".to_string()) } } Self::SetShop { team } => { let team_name = team.get_name().to_lowercase(); if let Some(t_conf) = config.locations.teams.get_mut(&team_name) { t_conf.shop = player_loc; Ok(format!("Shop for team {} set", team.get_name())) } else { Err("Team not configured yet. Set spawn first.".to_string()) } } Self::SetUpgrades { team } => { let team_name = team.get_name().to_lowercase(); if let Some(t_conf) = config.locations.teams.get_mut(&team_name) { t_conf.upgrades = player_loc; Ok(format!("Upgrades for team {} set", team.get_name())) } else { Err("Team not configured yet. Set spawn first.".to_string()) } } Self::SetGenerator { team } => { let team_name = team.get_name().to_lowercase(); if let Some(t_conf) = config.locations.teams.get_mut(&team_name) { t_conf.generator = player_loc; Ok(format!("Generator for team {} set", team.get_name())) } else { Err("Team not configured yet. Set spawn first.".to_string()) } } Self::SetEnderchest { team } => { let team_name = team.get_name().to_lowercase(); if let Some(t_conf) = config.locations.teams.get_mut(&team_name) { t_conf.enderchest = player_loc; Ok(format!("Ender Chest for team {} set", team.get_name())) } else { Err("Team not configured yet. Set spawn first.".to_string()) } } Self::AddGenerator { gen_type } => { config.locations.generators.push(GeneratorConfig { x: player_loc.x, y: player_loc.y, z: player_loc.z, generator_type: gen_type.to_uppercase(), }); Ok(format!("Added a {} generator at your location", gen_type.to_uppercase())) } Self::Save => { // Return string representation to write to file Ok("Config ready to save".to_string()) } Self::Start => { game_manager.start_game()?; Ok("Match starting now!".to_string()) } Self::Help => { let mut help = String::new(); help.push_str("§d§m================ §b§lBEDWARS SETUP (RUST) §d§m================\n"); help.push_str("§d/bw setlobby §7- Set waiting lobby coordinate\n"); help.push_str("§d/bw setspawn §7- Set team player spawn point\n"); help.push_str("§d/bw setbed §7- Register team bed (look at block)\n"); help.push_str("§d/bw setshop §7- Set shop NPC position\n"); help.push_str("§d/bw setupgrades §7- Set upgrades NPC position\n"); help.push_str("§d/bw setgenerator §7- Set base spawner location\n"); help.push_str("§d/bw setenderchest §7- Set team Ender Chest\n"); help.push_str("§d/bw addgenerator §7- Add generator\n"); help.push_str("§d/bw save §7- Save config file\n"); help.push_str("§d/bw start §7- Force start game immediately\n"); help.push_str("§d§m================================================\n"); Ok(help) } } } }