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