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_Own 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_Own(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 ownSelection(user, player); } } else if (args[0].equalsIgnoreCase(PARAM_ENTITY)) { if (setting.isWaiting(user, WaitType.OWN_ENTITY)) { setting.removeWaiting(user); player.sendMessage(Message.COMMAND_NO_MORE_CLICK_WAITING.getMessage()); } else { setting.addWaiting(user, WaitType.OWN_ENTITY); player.sendMessage(Message.COMMAND_OWN_CLICK_ENTITY.getMessage()); } return true; } else if (args[0].equalsIgnoreCase(PARAM_BLOCK)) { if (setting.isWaiting(user, WaitType.OWN_BLOCK)) { setting.removeWaiting(user); player.sendMessage(Message.COMMAND_NO_MORE_CLICK_WAITING.getMessage()); } else { setting.addWaiting(user, WaitType.OWN_BLOCK); player.sendMessage(Message.COMMAND_OWN_CLICK_BLOCK.getMessage()); } return true; } else { 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); try { if (setting.isOwnEnabled(block.getMaterial())) { Optional<User> owner = database.getOwner(block); if (!owner.isPresent() || setting.isIgnoring(user)) { DatabaseAction databaseAction = DatabaseAction.newOwnInstance(block, user); database.enqueue(databaseAction); player.sendMessage( Message.COMMAND_OWN_BLOCKSUCCESS.getMessage(block.getMaterial().getName())); return true; } else { player.sendMessage( Message.COMMAND_OWN_NOPERMISSIONFOROTHERS.getMessage(owner.get().getName())); } } } catch (InvalidWorldNameException e) { // can't happen, since targetBlock is not null and it's world is used getOutput().printError("This should never happen! CE_OWN", e); return false; } return false; } else { player.sendMessage(Message.COMMAND_NOTARGET.getMessage()); return false; } } else { return false; } } private boolean ownSelection(User user, Player player) { if (worldEdit != null) { Selection selection = worldEdit.getSelection(player); if (selection == null) { player.sendMessage(Message.COMMAND_OWN_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_OWN_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 OwnRunner(setting, database, region, user, player, Message.COMMAND_OWN_SELECTION_SUCCESS), "OwnselectionThread"); thread.start(); return true; } else { player.sendMessage(Message.COMMAND_OWN_SELECTION_NOWORLDEDIT.getMessage()); return true; } } }