package de.tobiyas.racesandclasses.commands.bind; import static de.tobiyas.racesandclasses.translation.languages.Keys.held_item_not_air; import static de.tobiyas.racesandclasses.translation.languages.Keys.no_find_trait; import static de.tobiyas.racesandclasses.translation.languages.Keys.wrong_command_use; import java.util.LinkedList; import java.util.List; import org.apache.commons.lang.StringUtils; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.Listener; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import de.tobiyas.racesandclasses.RacesAndClasses; import de.tobiyas.racesandclasses.APIs.LanguageAPI; import de.tobiyas.racesandclasses.commands.AbstractCommand; import de.tobiyas.racesandclasses.hotkeys.HotKeyView; import de.tobiyas.racesandclasses.playermanagement.player.RaCPlayer; import de.tobiyas.racesandclasses.playermanagement.player.RaCPlayerManager; import de.tobiyas.racesandclasses.traitcontainer.interfaces.markerinterfaces.Trait; import de.tobiyas.util.player.PlayerUtils; public class CommandExecutor_BindTrait extends AbstractCommand implements Listener{ private static final String BIND_KEY = ChatColor.AQUA + "Trait: "; /** * The Material to bind. */ private static final Material BindMat = Material.SHEARS; public CommandExecutor_BindTrait() { super("bindtrait", new String[]{"bt", "bind", "obt"}); RacesAndClasses.getPlugin().registerEvents(this); } @SuppressWarnings("deprecation") @Override public boolean onInternalCommand(CommandSender sender, Command command, String label, String[] args) { if(args.length == 1 && sender.isOp() && args[0].equals("reset")){ for(Player player : PlayerUtils.getOnlinePlayers()){ RaCPlayer racPlayer = RaCPlayerManager.get().getPlayer(player); racPlayer.getHotkeyInventory().changeToBuildInv(); } return true; } if(!(sender instanceof Player)) return false; if(!plugin.getConfigManager().getGeneralConfig().isConfig_hotkeysEnabled()){ sender.sendMessage(ChatColor.RED + "Hotkeys are Disabled."); return true; } boolean useNewBindSystem = plugin.getConfigManager().getGeneralConfig().getConfig_useNewTraitBindSystem(); RaCPlayer player = RaCPlayerManager.get().getPlayer((Player)sender); if(!player.hasPermission("RaC.bind")){ sender.sendMessage(ChatColor.RED + "You do not have Permission for this command."); return true; } if(sender.isOp() && args.length == 1 && args[0].equals("resync")){ player.getPlayer().updateInventory(); return true; } if(useNewBindSystem){ boolean isBindingMode = player.getHotkeyInventory().isInSkillMode(); boolean openView = label.equalsIgnoreCase("obt") || (args.length == 1 && args[0].equalsIgnoreCase("open")); if(openView){ //opening view player.getPlayer().openInventory(new HotKeyView(player)); return true; } if(isBindingMode){ player.getHotkeyInventory().changeToBuildInv(); player.sendMessage("Change to Build Mode."); }else{ player.getHotkeyInventory().changeToSkillInv(); player.sendMessage("Change to Battle Skill."); } return true; } if(args.length < 1) { LanguageAPI.sendTranslatedMessage(player, wrong_command_use, "command", "&c " + getCommandNames().iterator().next() + " <skill name> or /" + getCommandNames().iterator().next() + " list to list all available Traits."); return true; } String spellName = StringUtils.join(args, " "); if("list".equalsIgnoreCase(args[0])){ String traits = ChatColor.GREEN + "Bindable Traits: "; for(Trait trait : player.getTraits()){ if(trait.isBindable()){ traits += " " + ChatColor.AQUA + trait.getDisplayName() + ChatColor.GREEN + ","; } } sender.sendMessage(traits); return true; } Trait selected = null; for(Trait trait : player.getTraits()){ if(trait.getName().equalsIgnoreCase(spellName) || trait.getDisplayName().equalsIgnoreCase(spellName)){ if(trait.isBindable()) { selected = trait; break; } } } if(selected == null){ LanguageAPI.sendTranslatedMessage(sender, no_find_trait); return true; } int slotNumber = player.getPlayer().getInventory().getHeldItemSlot(); ItemStack heldItem = player.getPlayer().getItemInHand(); if(heldItem != null && heldItem.getType() != Material.AIR){ player.sendTranslatedMessage(held_item_not_air); return true; } ItemStack item = generate(selected); player.getPlayer().getInventory().setItem(slotNumber, item); player.sendMessage(ChatColor.GREEN + selected.getDisplayName() + " Slot: " + slotNumber); return true; } @Override public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) { List<String> values = new LinkedList<String>(); if(!(sender instanceof Player)) return values; if(args.length == 1){ for(Trait trait : RaCPlayerManager.get().getPlayer((Player) sender).getTraits()){ if(!trait.isBindable()) continue; if(trait.getDisplayName().toLowerCase().startsWith(args[0].toLowerCase())){ values.add(trait.getDisplayName()); } } } return values; } public static ItemStack generate(Trait trait){ ItemStack item = new ItemStack(BindMat); ItemMeta itemMeta = item.getItemMeta(); itemMeta.setDisplayName(BIND_KEY + trait.getDisplayName()); List<String> lore = new LinkedList<String>(); lore.add("Switch the item to this slot to cast the Spell,"); lore.add("or simply right-click with it."); lore.add(""); lore.add(ChatColor.YELLOW + trait.getPrettyConfiguration()); itemMeta.setLore(lore); item.setItemMeta(itemMeta); return item; } }