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.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.OfflinePlayer; 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_OwnOther extends CommandExecutor { private static final String PARAM_SELECTION = "selection"; private final WorldEditPlugin worldEdit; public CE_OwnOther(Setting setting, Database database, Protection protection) { super(setting, database, protection); worldEdit = (WorldEditPlugin) Bukkit.getServer().getPluginManager().getPlugin("WorldEdit"); } @Override public boolean onCommand(CommandSender sender, Command command, String label, 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; } if (args.length < 1) { return false; } @SuppressWarnings("deprecation") OfflinePlayer targetPlayer = Bukkit.getOfflinePlayer(args[0]); if (!isValid(targetPlayer)) { player.sendMessage(Message.COMMAND_INVALID_PLAYER.getMessage(args[0])); return false; } User targetUser = User.getInstance(targetPlayer.getUniqueId(), targetPlayer); User user = User.getInstance(player.getUniqueId(), player); if (args.length == 2) { if (args[1].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(targetUser, player); } } else { return false; } } else if (args.length == 1) { 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, targetUser); 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())); 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_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_OWNOTHER_SELECTION_SUCCESS), "OwnselectionThread"); thread.start(); return true; } else { player.sendMessage(Message.COMMAND_OWN_SELECTION_NOWORLDEDIT.getMessage()); return true; } } }