package com.nicewuerfel.blockown.command; import com.google.common.base.Optional; import com.nicewuerfel.blockown.InvalidWorldNameException; import com.nicewuerfel.blockown.Message; import com.nicewuerfel.blockown.OwnedBlock; import com.nicewuerfel.blockown.Permission; import com.nicewuerfel.blockown.Setting; import com.nicewuerfel.blockown.User; import com.nicewuerfel.blockown.WaitType; import com.nicewuerfel.blockown.database.Database; import com.nicewuerfel.blockown.database.DatabaseAction; import com.nicewuerfel.blockown.protection.Protection; import com.sk89q.worldedit.bukkit.WorldEditPlugin; import com.sk89q.worldedit.bukkit.selections.Selection; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import java.util.Iterator; import java.util.Set; public class CE_Unown extends CommandExecutor { private static final String PARAM_SELECTION = "selection"; private static final String PARAM_ENTITY = "e"; private static final String PARAM_BLOCK = "b"; private final WorldEditPlugin worldEdit; public CE_Unown(Setting setting, Database database, Protection protection) { super(setting, database, protection); worldEdit = (WorldEditPlugin) Bukkit.getServer().getPluginManager().getPlugin("WorldEdit"); } @Override public boolean onCommand(CommandSender sender, Command cmd, String cmdName, String[] args) { if (!isPlayer(sender)) { return true; } Player player = (Player) sender; if (!setting.isEnabledIn(player.getWorld())) { player.sendMessage(Message.COMMAND_DISABLED_IN_WORLD.getMessage()); return true; } User user = User.getInstance(player.getUniqueId()); if (args.length == 1) { if (args[0].equalsIgnoreCase(PARAM_SELECTION)) { if (!player.hasPermission(Permission.OWN_OWNSELECTION.toString())) { player.sendMessage( Message.COMMAND_NO_PERMISSION.getMessage(Permission.OWN_OWNSELECTION.toString())); return true; } else { return unownSelection(user, player); } } if (args[0].equalsIgnoreCase(PARAM_ENTITY)) { if (setting.isWaiting(user, WaitType.UNOWN_ENTITY)) { setting.removeWaiting(user); player.sendMessage(Message.COMMAND_NO_MORE_CLICK_WAITING.getMessage()); } else { setting.addWaiting(user, WaitType.UNOWN_ENTITY); player.sendMessage(Message.COMMAND_UNOWN_CLICK_ENTITY.getMessage()); } return true; } if (args[0].equalsIgnoreCase(PARAM_BLOCK)) { if (setting.isWaiting(user, WaitType.UNOWN_BLOCK)) { setting.removeWaiting(user); player.sendMessage(Message.COMMAND_NO_MORE_CLICK_WAITING.getMessage()); } else { setting.addWaiting(user, WaitType.UNOWN_BLOCK); player.sendMessage(Message.COMMAND_UNOWN_CLICK_BLOCK.getMessage()); } return true; } return false; } else if (args.length == 0) { Block targetBlock = player.getTargetBlock((Set<org.bukkit.Material>) null, 20); if (targetBlock != null) { OwnedBlock block = OwnedBlock.newInstance(targetBlock); Optional<User> owner = database.getOwner(block); if (!owner.isPresent() || owner.get().equals(user) || player.hasPermission(Permission.ADMIN_UNOWN.toString())) { try { DatabaseAction databaseAction = DatabaseAction.newUnownInstance(block); database.enqueue(databaseAction); player.sendMessage( Message.COMMAND_UNOWN_BLOCKSUCCESS.getMessage(block.getMaterial().getName())); return true; } catch (InvalidWorldNameException e) { // can't happen, since targetBlock is not null and it's world is used getOutput().printError("This should never happen! CE_UNOWN", e); return false; } } else { player.sendMessage(Message.COMMAND_UNOWN_FOROTHERS_NOTALLOWED.getMessage()); return false; } } else { player.sendMessage(Message.COMMAND_NOTARGET.getMessage()); return false; } } else { return false; } } private boolean unownSelection(User user, Player player) { if (worldEdit != null) { Selection selection = worldEdit.getSelection(player); if (selection == null) { player.sendMessage(Message.COMMAND_UNOWN_SELECTION_NOSELECTION.getMessage()); return true; } int maxSelection = setting.DATABASE.MAX_SELECTION; if (maxSelection > 0) { int areaSize = selection.getArea(); if (areaSize > maxSelection) { player.sendMessage(Message.COMMAND_UNOWN_SELECTION_TOO_BIG.getMessage(maxSelection)); return true; } } Location min = selection.getMinimumPoint(); Location max = selection.getMaximumPoint(); Iterator<Block> region = new RegionIterator(min, max); Thread thread = new Thread(new UnownRunner(setting, database, region, user, player), "UnownselectionThread"); thread.start(); return true; } else { player.sendMessage(Message.COMMAND_UNOWN_SELECTION_NOWORLDEDIT.getMessage()); return true; } } }