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;
}
}
}