package me.desht.scrollingmenusign.commands;
import java.util.List;
import me.desht.dhutils.MiscUtil;
import me.desht.dhutils.PermissionUtils;
import me.desht.scrollingmenusign.SMSException;
import me.desht.scrollingmenusign.SMSValidate;
import me.desht.scrollingmenusign.ScrollingMenuSign;
import me.desht.scrollingmenusign.views.ActiveItem;
import me.desht.scrollingmenusign.views.SMSMapView;
import me.desht.scrollingmenusign.views.SMSView;
import me.desht.scrollingmenusign.views.ViewManager;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.ItemFrame;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.Plugin;
public class RemoveViewCommand extends SMSAbstractCommand {
public RemoveViewCommand() {
super("sms break", 0, 2);
setPermissionNode("scrollingmenusign.commands.break");
setUsage(new String[]{
"/sms break",
"/sms break <view-name>",
"/sms break -loc <x,y,z,world>",
"/sms break -item",
"/sms break -frame",
});
setOptions("loc:s", "view:s", "item", "frame");
}
@Override
public boolean execute(Plugin plugin, CommandSender sender, String[] args) {
SMSView view = null;
ViewManager viewManager = getViewManager(plugin);
if (args.length == 0) {
notFromConsole(sender);
Player player = (Player) sender;
if (hasOption("item")) {
// deactivating an active item
ActiveItem item = new ActiveItem(player.getItemInHand());
item.deactivate();
player.setItemInHand(item.toItemStack());
MiscUtil.statusMessage(sender, "Deactivated held item: " + ChatColor.GOLD + player.getItemInHand().getType());
return true;
} else if (hasOption("frame")) {
ItemFrame frame = viewManager.findMapFrame(player.getTargetBlock(null, ScrollingMenuSign.BLOCK_TARGET_DIST), player.getEyeLocation());
if (frame != null) {
ItemStack stack = frame.getItem();
SMSMapView mv = viewManager.getMapViewForId(stack.getDurability());
frame.getWorld().dropItemNaturally(frame.getLocation(), stack);
frame.setItem(null);
MiscUtil.statusMessage(player, "Removed map for menu &e" + mv.getNativeMenu().getName() + "&- from the item frame.");
return true;
} else {
throw new SMSException("There is no item frame with a map view there.");
}
} else {
// detaching a view that the player is looking at?
view = viewManager.getTargetedView(player, true);
}
} else if (args.length == 1) {
// detaching a view by view name
view = getView(sender, args[0]);
} else if (hasOption("loc")) {
// detaching a view by location
try {
view = viewManager.getViewForLocation(MiscUtil.parseLocation(getStringOption("loc"), sender));
} catch (IllegalArgumentException e) {
throw new SMSException(e.getMessage());
}
}
SMSValidate.notNull(view, "No suitable view found to remove.");
PermissionUtils.requirePerms(sender, "scrollingmenusign.use." + view.getType());
view.ensureAllowedToModify(sender);
if (sender instanceof Player) {
Player player = (Player) sender;
if (view == viewManager.getHeldMapView(player)) {
((SMSMapView) view).removeMapItemName(player.getItemInHand());
}
}
viewManager.deleteView(view, true);
MiscUtil.statusMessage(sender, String.format("Removed &9%s&- view &e%s&- from menu &e%s&-.",
view.getType(), view.getName(), view.getNativeMenu().getName()));
return true;
}
@Override
public List<String> onTabComplete(Plugin plugin, CommandSender sender, String[] args) {
switch (args.length) {
case 1:
return getViewCompletions(sender, args[0]);
default:
return noCompletions(sender);
}
}
}