package me.desht.scrollingmenusign.commands;
import java.util.List;
import me.desht.dhutils.MiscUtil;
import me.desht.dhutils.PermissionUtils;
import me.desht.scrollingmenusign.*;
import me.desht.scrollingmenusign.expector.ExpectViewCreation;
import me.desht.scrollingmenusign.views.ActiveItem;
import me.desht.scrollingmenusign.views.SMSMapView;
import me.desht.scrollingmenusign.views.SMSView;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.Plugin;
public class AddViewCommand extends SMSAbstractCommand {
public AddViewCommand() {
super("sms sync", 1);
setPermissionNode("scrollingmenusign.commands.sync");
setUsage(new String[]{
"/sms sync <menu-name>",
"/sms sync <menu-name> -sign [-loc <x,y,z,world>]",
"/sms sync <menu-name> -multi [-loc <x,y,z,world>]",
"/sms sync <menu-name> -redstone [-loc <x,y,z,world>]",
"/sms sync <menu-name> -map <map-id>",
"/sms sync <menu-name> -spout",
"/sms sync <menu-name> -inv",
"/sms sync <menu-name> -item",
"/sms sync <menu-name> -holopub",
"/sms sync <menu-name> -holopri",
" [-viewname <name>] Choose a non-default view name"
});
setOptions(
"map:i", "sign", "spout", "redstone", "multi",
"inventory", "inv", "item", "force", "viewname:s",
"loc:s", "holopub", "holopri"
);
}
@Override
public boolean execute(Plugin plugin, CommandSender sender, String[] args) throws SMSException {
ScrollingMenuSign smsPlugin = (ScrollingMenuSign) plugin;
SMSView view = null;
if (args.length == 0) {
showUsage(sender);
return true;
}
SMSMenu menu = smsPlugin.getMenuManager().getMenu(args[0]);
String viewName = getStringOption("viewname");
Location loc = hasOption("loc") ? MiscUtil.parseLocation(getStringOption("loc")) : null;
if (hasOption("spout")) { // spout view
SMSValidate.isTrue(smsPlugin.isSpoutEnabled(), "Server is not Spout-enabled");
view = getViewManager(plugin).addSpoutViewToMenu(viewName, menu, sender);
} else if (hasOption("sign")) { // sign view
if (loc == null) {
interactiveCreation(sender, viewName, menu, "sign");
return true;
} else {
view = getViewManager(plugin).addSignToMenu(viewName, menu, loc, sender);
}
} else if (hasOption("redstone")) {
if (loc == null) {
interactiveCreation(sender, viewName, menu, "redstone");
return true;
} else {
view = getViewManager(plugin).addRedstoneViewToMenu(viewName, menu, loc, sender);
}
} else if (hasOption("holopub")) {
if (loc == null) {
interactiveCreation(sender, viewName, menu, "holopub");
return true;
} else {
view = getViewManager(plugin).addPublicHoloViewToMenu(viewName, menu, loc, sender);
}
} else if (hasOption("inventory") || hasOption("inv")) {
view = getViewManager(plugin).addInventoryViewToMenu(viewName, menu, sender);
} else if (hasOption("holopri")) {
view = getViewManager(plugin).addPrivateHoloToView(viewName, menu, sender);
} else if (hasOption("item")) {
notFromConsole(sender);
Player p = (Player) sender;
ItemStack stack = p.getItemInHand();
ItemMeta meta = stack.getItemMeta();
if (!hasOption("force") && meta != null && (meta.getDisplayName() != null || meta.getLore() != null)) {
throw new SMSException("This item already has custom metadata. If you really want to override it, run this command again with the -force option");
}
ActiveItem item = new ActiveItem(p.getItemInHand(), menu);
p.setItemInHand(item.toItemStack());
MiscUtil.statusMessage(sender, "Your &6" + p.getItemInHand().getType() + "&- is now an active item for &e" + menu.getName());
return true;
} else if (hasOption("multi") && loc != null) { // multi-sign view
view = getViewManager(plugin).addMultiSignToMenu(viewName, menu, loc, sender);
} else if (hasOption("map")) { // map view
try {
short mapId = (short) getIntOption("map");
view = getViewManager(plugin).addMapToMenu(viewName, menu, mapId, sender);
} catch (NumberFormatException e) {
throw new SMSException(e.getMessage());
}
} else if (args.length > 1) {
throw new SMSException("Unknown view type: " + args[1]);
}
if (view == null) {
// see if we can get a view from what the player is looking at or holding
notFromConsole(sender);
Player player = (Player) sender;
if (player.getItemInHand().getType() == Material.MAP) { // map view?
PermissionUtils.requirePerms(sender, "scrollingmenusign.use.map");
short mapId = player.getItemInHand().getDurability();
view = getViewManager(plugin).addMapToMenu(viewName, menu, mapId, sender);
((SMSMapView) view).setMapItemName(player.getItemInHand());
} else {
try {
Block b = player.getTargetBlock(null, ScrollingMenuSign.BLOCK_TARGET_DIST); // sign view ?
if (hasOption("multi") && b.getType() == Material.WALL_SIGN) {
view = getViewManager(plugin).addMultiSignToMenu(viewName, menu, b.getLocation(), sender);
} else if (b.getType() == Material.WALL_SIGN || b.getType() == Material.SIGN_POST) {
view = getViewManager(plugin).addSignToMenu(viewName, menu, b.getLocation(), sender);
}
} catch (IllegalStateException e) {
// ignore
}
}
}
SMSValidate.notNull(view, "Found nothing suitable to add as a menu view");
MiscUtil.statusMessage(sender, String.format("Added &9%s&- view &e%s&- to menu &e%s&-.",
view.getType(), view.getName(), menu.getName()));
return true;
}
@Override
public List<String> onTabComplete(Plugin plugin, CommandSender sender, String[] args) {
if (args.length == 1) {
return getMenuCompletions(plugin, sender, args[0]);
} else {
showUsage(sender);
return noCompletions(sender);
}
}
private void interactiveCreation(CommandSender sender, String viewName, SMSMenu menu, String viewType) {
notFromConsole(sender);
MiscUtil.statusMessage(sender, "Left-click a block to add it as a &9" + viewType + "&- view on menu &e" + menu.getName() + "&-.");
MiscUtil.statusMessage(sender, "Right-click anywhere to cancel.");
ScrollingMenuSign.getInstance().responseHandler.expect((Player) sender, new ExpectViewCreation(viewName, menu, viewType));
}
}