001package fr.aumgn.dac2.commands;
002
003import org.bukkit.command.CommandSender;
004import org.bukkit.entity.Player;
005
006import fr.aumgn.bukkitutils.command.Command;
007import fr.aumgn.bukkitutils.command.NestedCommands;
008import fr.aumgn.bukkitutils.command.args.CommandArgs;
009import fr.aumgn.bukkitutils.command.exception.CommandError;
010import fr.aumgn.dac2.DAC;
011import fr.aumgn.dac2.arena.Arena;
012import fr.aumgn.dac2.config.Color;
013import fr.aumgn.dac2.game.Game;
014import fr.aumgn.dac2.game.GameFactory;
015import fr.aumgn.dac2.game.start.GameQuickStart;
016import fr.aumgn.dac2.stage.Stage;
017import fr.aumgn.dac2.stage.join.JoinStage;
018
019@NestedCommands("dac2")
020public class StageCommands extends DACCommands {
021
022    public StageCommands(DAC dac) {
023        super(dac);
024    }
025
026    @Command(name = "initialize",
027            min = 0, max = 1, flags = "j", argsFlags = "j")
028    public void init(CommandSender sender, CommandArgs args) {
029        Arena arena = args.get(0, Arena)
030                .valueWithPermOr("dac.stages.init.arena", sender);
031
032        JoinStage joinStage = new JoinStage(dac, arena);
033        dac.getStages().start(joinStage);
034
035        if (sender instanceof Player) {
036            if (args.hasFlag('j')) {
037                joinStage.addPlayer((Player) sender, (Color) null);
038            } else if (args.hasArgFlag('j')) {
039                Color color = args.get('j', Color).value();
040                joinStage.addPlayer((Player) sender, color);
041            }
042        } else {
043            sender.sendMessage(msg("init.success", arena.getName()));
044        }
045    }
046
047    @Command(name = "stop", min = 0, max = 1, argsFlags = "a")
048    public void stop(CommandSender sender, CommandArgs args) {
049        Stage stage = args.get(0, Stage)
050                .valueWithPermOr("dac2.stage.stop.others", sender);
051
052        dac.getStages().forceStop(stage);
053        sender.sendMessage(msg("stop.success", stage.getArena().getName()));
054    }
055
056    @Command(name = "start", min = 0, max = 1, argsFlags = "a")
057    public void start(CommandSender sender, CommandArgs args) {
058        Stage stage = args.get('a', Stage)
059                .valueWithPermOr("dac2.stage.start.others", sender);
060        String gameMode = args.get(0, "classic");
061
062        if (stage == null) {
063            throw new CommandError(msg("start.notajoinstage"));
064        } else if (!(stage instanceof JoinStage)) {
065            throw new CommandError(msg("start.alreadystarted"));
066        }
067
068        JoinStage joinStage = (JoinStage) stage;
069        GameFactory factory = GameFactory.getByAlias(dac, gameMode);
070        if (joinStage.size() < factory.getMinimumPlayers()) {
071            throw new CommandError(msg("start.notenoughplayers"));
072        }
073        Game game = factory.createGame(dac, joinStage);
074        dac.getStages().switchTo(game);
075    }
076
077    @Command(name = "quickstart", min = 0, max = 1, argsFlags = "a")
078    public void quickstart(CommandSender sender, CommandArgs args) {
079        Arena arena = args.get('a', Arena)
080                .valueWithPermOr("dac.stages.quickstart.arena", sender);
081
082        String gameMode = args.get(0, "classic");
083        GameQuickStart quickStart = new GameQuickStart(dac, arena);
084        GameFactory factory = GameFactory.getByAlias(dac, gameMode);
085        if (quickStart.size() < factory.getMinimumPlayers()) {
086            throw new CommandError(msg("quickstart.notenoughplayers"));
087        }
088        Game game = factory.createGame(dac, quickStart);
089        dac.getStages().start(game);
090    }
091
092    @Command(name = "kick", min = 1, max = 1)
093    public void kick(CommandSender sender, CommandArgs args) {
094        Player player = args.getPlayer(0).value();
095        Stage stage = dac.getStages().get(player);
096        if (stage == null) {
097            throw new CommandError(msg("quit.notingame"));
098        }
099
100        stage.onQuit(player);
101        sender.sendMessage(msg("kick.success", player.getDisplayName(),
102                stage.getArena().getName()));
103    }
104}