001package fr.aumgn.dac2.commands;
002
003import org.bukkit.Location;
004import org.bukkit.command.CommandSender;
005import org.bukkit.entity.Player;
006
007import fr.aumgn.bukkitutils.command.Command;
008import fr.aumgn.bukkitutils.command.NestedCommands;
009import fr.aumgn.bukkitutils.command.args.CommandArgs;
010import fr.aumgn.bukkitutils.geom.Vector;
011import fr.aumgn.dac2.DAC;
012import fr.aumgn.dac2.arena.Arena;
013import fr.aumgn.dac2.arena.Diving;
014import fr.aumgn.dac2.arena.regions.Pool;
015import fr.aumgn.dac2.arena.regions.StartRegion;
016import fr.aumgn.dac2.arena.regions.SurroundingRegion;
017import fr.aumgn.dac2.exceptions.PoolShapeNotFlat;
018import fr.aumgn.dac2.shape.FlatShape;
019import fr.aumgn.dac2.shape.Shape;
020import fr.aumgn.dac2.shape.ShapeFactory;
021
022@NestedCommands({"dac2", "set"})
023public class SetCommands extends DACCommands {
024
025    private static final int DEFAULT_RADIUS = 5;
026    private static final int DEFAULT_HEIGHT = 3;
027
028    public SetCommands(DAC dac) {
029        super(dac);
030    }
031
032    @Command(name = "diving", min = 1, max = 1, argsFlags = "p")
033    public void diving(CommandSender sender, CommandArgs args) {
034        Arena arena = args.get(0, Arena).value();
035        Player player = args.getPlayer('p').valueOr(sender);
036
037        arena.setDiving(new Diving(player.getLocation()));
038        dac.getArenas().saveArena(dac, arena);
039        sender.sendMessage(msg("set.diving.success"));
040    }
041
042    @Command(name = "pool", min = 1, max = 3, argsFlags = "sp")
043    public void pool(CommandSender sender, CommandArgs args) {
044        Arena arena = args.get(0, Arena).value();
045        int radius = args.getInteger(1).valueOr(DEFAULT_RADIUS);
046        int height = args.getInteger(2).valueOr(DEFAULT_HEIGHT);
047        Player player = args.getPlayer('p').valueOr(sender);
048        ShapeFactory factory = args.get('s', ShapeFactory.class)
049                .valueOr(ShapeFactory.Arbitrary);
050
051        Shape shape = factory.create(dac, player.getWorld(),
052                centerFrom(player), radius, height);
053        if (!(shape instanceof FlatShape)) {
054            throw new PoolShapeNotFlat(dac, shape);
055        }
056
057        arena.setPool(new Pool((FlatShape) shape));
058        dac.getArenas().saveArena(dac, arena);
059        sender.sendMessage(msg("set.pool.success"));
060    }
061
062    @Command(name = "start", min = 1, max = 3, argsFlags = "sp")
063    public void start(CommandSender sender, CommandArgs args) {
064        Arena arena = args.get(0, Arena).value();
065        int radius = args.getInteger(1).valueOr(DEFAULT_RADIUS);
066        int height = args.getInteger(2).valueOr(DEFAULT_HEIGHT);
067        Player player = args.getPlayer('p').valueOr(sender);
068        ShapeFactory factory = args.get('s', ShapeFactory.class)
069                .valueOr(ShapeFactory.Cuboid);
070
071        Shape shape = factory.create(dac, player.getWorld(),
072                centerFrom(player), radius, height);
073        arena.setStartRegion(new StartRegion(shape));
074        dac.getArenas().saveArena(dac, arena);
075        sender.sendMessage(msg("set.diving.success"));
076    }
077
078    @Command(name = "surrounding", min = 1, max = 3, argsFlags = "sp")
079    public void surrounding(CommandSender sender, CommandArgs args) {
080        Arena arena = args.get(0, Arena).value();
081        Player player = args.getPlayer('p').valueOr(sender);
082        int radius = args.getInteger(1).valueOr(DEFAULT_RADIUS);
083        int height = args.getInteger(2).valueOr(DEFAULT_HEIGHT);
084        ShapeFactory factory = args.get('s', ShapeFactory.class)
085                .valueOr(ShapeFactory.Cuboid);
086
087        Shape shape = factory.create(dac, player.getWorld(),
088                centerFrom(player), radius, height);
089        arena.setSurroundingRegion(new SurroundingRegion(shape));
090        dac.getArenas().saveArena(dac, arena);
091        sender.sendMessage(msg("set.diving.success"));
092    }
093
094    private Vector centerFrom(Player player) {
095        Location loc = player.getLocation();
096        return new Vector(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
097    }
098}