package de.oppermann.bastian.spleef.commands; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import com.google.common.collect.Sets; import de.oppermann.bastian.spleef.SpleefMain; import de.oppermann.bastian.spleef.arena.SpleefArena; import de.oppermann.bastian.spleef.arena.SpleefBlock; import de.oppermann.bastian.spleef.hooks.WorldEditHook; import de.oppermann.bastian.spleef.storage.ConfigAccessor; import de.oppermann.bastian.spleef.util.Language; import de.oppermann.bastian.spleef.util.PluginChecker; import de.oppermann.bastian.spleef.util.algorithm.FloodfillAlgorithm; import de.oppermann.bastian.spleef.util.command.AbstractArgument; import de.oppermann.bastian.spleef.util.command.SpleefCommand.CommandHelp; import de.oppermann.bastian.spleef.util.command.SpleefCommand.CommandResult; public class AddBlocksArgument extends AbstractArgument { /** * Class constructor. */ public AddBlocksArgument() { super(new String[]{Language.COMMAND_ADD_BLOCKS.toString()}, -1, "spleef.addblocks", null, Language.COMMAND_ADD_BLOCKS_DESCRIPTION.toString()); } /* * (non-Javadoc) * @see de.oppermann.bastian.spleef.util.command.AbstractArgument#executeForPlayer(org.bukkit.entity.Player, org.bukkit.command.Command, java.lang.String[]) */ @SuppressWarnings("deprecation") @Override public CommandResult executeForPlayer(Player player, Command cmd, String[] args) { if (args.length == 3 || args.length == 4) { if (!player.hasPermission(getPermission())) { return CommandResult.NO_PERMISSION; } SpleefArena arena = null; for (SpleefArena sArena : SpleefArena.getSpleefArenas()) { if (sArena.getName().equals(args[1])) { arena = sArena; break; } } if (arena == null) { player.sendMessage(Language.NO_ARENA_WITH_NAME.toString().replace("%arena%", args[1])); return CommandResult.SUCCESS; } boolean rememberMaterialFlag = false; if (args.length == 4) { if (args[3].equals(Language.COMMAND_ADD_BLOCKS_REMEMBER_MATERIAL_FLAG.toString())) { rememberMaterialFlag = true; } else { player.sendMessage(Language.COMMAND_ADD_BLOCKS_UNKNOWN_FLAG.toString()); } } if (args[2].equalsIgnoreCase("worldedit")) { if (!PluginChecker.worldeditIsLoaded()) { player.sendMessage(Language.WORLDEDIT_NOT_LOADED.toString()); return CommandResult.SUCCESS; } if (WorldEditHook.getWorldEditPlugin().getSelection(player) == null) { player.sendMessage(Language.WORLDEDIT_NO_SELECTION.toString()); return CommandResult.SUCCESS; } Location min = WorldEditHook.getWorldEditPlugin().getSelection(player).getMinimumPoint(); Location max = WorldEditHook.getWorldEditPlugin().getSelection(player).getMaximumPoint(); if (min.getWorld() != arena.getWorld() || max.getWorld() != arena.getWorld()) { player.sendMessage(Language.WORLDEDIT_SELECTION_IN_OTHER_WORLD.toString()); return CommandResult.SUCCESS; } ConfigAccessor accessor = SpleefMain.getInstance().getArenaAccessor(arena.getName()); ArrayList<SpleefBlock> blocks = arena.getBlocks(); int counter = blocks.size(); for (int x = min.getBlockX(); x <= max.getBlockX(); x++) { for (int y = min.getBlockY(); y <= max.getBlockY(); y++) { for (int z = min.getBlockZ(); z <= max.getBlockZ(); z++) { SpleefBlock block; if (rememberMaterialFlag) { block = new SpleefBlock(x, y, z, min.getWorld().getBlockAt(x, y, z).getType(), min.getWorld().getBlockAt(x, y, z).getData()); } else { block = new SpleefBlock(x, y, z, Material.SNOW_BLOCK, (byte) 0); } if (blocks.contains(block)) { continue; } counter++; accessor.getConfig().set("blocks." + counter + ".x", x); accessor.getConfig().set("blocks." + counter + ".y", y); accessor.getConfig().set("blocks." + counter + ".z", z); accessor.getConfig().set("blocks." + counter + ".type", block.getType().name()); accessor.getConfig().set("blocks." + counter + ".data", block.getData()); if (rememberMaterialFlag) { arena.addSpleefBlock(new SpleefBlock(x, y, z, min.getWorld().getBlockAt(x, y, z).getType(), min.getWorld().getBlockAt(x, y, z).getData())); } else { arena.addSpleefBlock(new SpleefBlock(x, y, z, Material.SNOW_BLOCK, (byte) 0)); } } } } accessor.saveConfig(); player.sendMessage(Language.SUCCESSFULLY_ADDED_BLOCKS.toString().replace("%amount%", String.valueOf((counter - blocks.size())))); return CommandResult.SUCCESS; } // TODO check if player is in arena world for lookingAt and standingOn if (player.getWorld() != arena.getWorld()) { player.sendMessage(Language.MUST_BE_IN_WORLD_OF_ARENA.toString().replace("%arena%", arena.getName())); } // looking at if (args[2].equalsIgnoreCase("lookingAt")) { try { Block block = player.getTargetBlock((HashSet<Byte>) null, 400); if (block == null) { player.sendMessage(Language.SUCCESSFULLY_ADDED_BLOCKS.toString().replace("%amount%", "0")); } else if (block.getType() == Material.AIR) { player.sendMessage(Language.SUCCESSFULLY_ADDED_BLOCKS.toString().replace("%amount%", "0")); } else { ArrayList<SpleefBlock> blocks = FloodfillAlgorithm.fill4(block.getWorld(), block.getX(), block.getY(), block.getZ(), arena, rememberMaterialFlag); ConfigAccessor accessor = SpleefMain.getInstance().getArenaAccessor(arena.getName()); ArrayList<SpleefBlock> arenaBlocks = arena.getBlocks(); for (int i = 0; i < arenaBlocks.size(); i++) { accessor.getConfig().set("blocks." + (i + 1) + ".x", arenaBlocks.get(i).getX()); accessor.getConfig().set("blocks." + (i + 1) + ".y", arenaBlocks.get(i).getY()); accessor.getConfig().set("blocks." + (i + 1) + ".z", arenaBlocks.get(i).getZ()); accessor.getConfig().set("blocks." + (i + 1) + ".type",arenaBlocks.get(i).getType().name()); accessor.getConfig().set("blocks." + (i + 1) + ".data", arenaBlocks.get(i).getData()); } accessor.saveConfig(); player.sendMessage(Language.SUCCESSFULLY_ADDED_BLOCKS.toString().replace("%amount%", String.valueOf(blocks.size()))); } } catch (IllegalStateException e) { player.sendMessage(Language.SUCCESSFULLY_ADDED_BLOCKS.toString().replace("%amount%", "0")); } return CommandResult.SUCCESS; } // standing on if (args[2].equalsIgnoreCase("standingOn")) { Block block = player.getLocation().getBlock().getRelative(0, -1, 0); if (block.getType() != Material.AIR) { ArrayList<SpleefBlock> blocks = FloodfillAlgorithm.fill4(block.getWorld(), block.getX(), block.getY(), block.getZ(), arena, rememberMaterialFlag); ConfigAccessor accessor = SpleefMain.getInstance().getArenaAccessor(arena.getName()); ArrayList<SpleefBlock> arenaBlocks = arena.getBlocks(); for (int i = 0; i < arenaBlocks.size(); i++) { accessor.getConfig().set("blocks." + (i + 1) + ".x", arenaBlocks.get(i).getX()); accessor.getConfig().set("blocks." + (i + 1) + ".y", arenaBlocks.get(i).getY()); accessor.getConfig().set("blocks." + (i + 1) + ".z", arenaBlocks.get(i).getZ()); accessor.getConfig().set("blocks." + (i + 1) + ".type",arenaBlocks.get(i).getType().name()); accessor.getConfig().set("blocks." + (i + 1) + ".data", arenaBlocks.get(i).getData()); } accessor.saveConfig(); player.sendMessage(Language.SUCCESSFULLY_ADDED_BLOCKS.toString().replace("%amount%", String.valueOf(blocks.size()))); } else { player.sendMessage(Language.SUCCESSFULLY_ADDED_BLOCKS.toString().replace("%amount%", "0")); } return CommandResult.SUCCESS; } return CommandResult.ERROR; } return CommandResult.ERROR; } /* * (non-Javadoc) * @see de.oppermann.bastian.spleef.util.command.AbstractArgument#executeForServer(org.bukkit.command.CommandSender, org.bukkit.command.Command, java.lang.String[]) */ @Override public CommandResult executeForServer(CommandSender sender, Command cmd, String[] args) { return CommandResult.ONLY_PLAYER; // the console can't join an arena } /* * (non-Javadoc) * @see de.oppermann.bastian.spleef.util.command.AbstractArgument#onTabComplete(org.bukkit.entity.Player, java.lang.String[]) */ @Override public List<String> onTabComplete(Player sender, String[] args) { ArrayList<String> list = new ArrayList<>(); if (args.length == 1) { list.add(Language.COMMAND_ADD_BLOCKS.toString()); } if (args.length == 2) { list.addAll(Sets.newHashSet(SpleefArena.getArenaNames())); } if (args.length == 3) { list.add("worldedit"); list.add("lookingAt"); list.add("standingOn"); } if (args.length == 4) { list.add(Language.COMMAND_ADD_BLOCKS_REMEMBER_MATERIAL_FLAG.toString()); } return list; } /* * (non-Javadoc) * @see de.oppermann.bastian.spleef.util.command.AbstractArgument#getCommandHelp() */ @Override public CommandHelp getCommandHelp() { return new CommandHelp("/%cmd% " + Language.COMMAND_ADD_BLOCKS + " " + Language.ARGUMENT_ARENA + " <worldedit/lookingAt/standingOn> [" + Language.COMMAND_ADD_BLOCKS_REMEMBER_MATERIAL_FLAG.toString() + "]", getDescription()); } }