package org.bukkit.craftbukkit.util; import org.bukkit.Achievement; import org.bukkit.Material; import org.bukkit.Statistic; import org.bukkit.UnsafeValues; import org.bukkit.craftbukkit.CraftStatistic; import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.inventory.ItemStack; import org.bukkit.util.StringUtil; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @SuppressWarnings("deprecation") public final class CraftMagicNumbers implements UnsafeValues { public static final UnsafeValues INSTANCE = new CraftMagicNumbers(); private CraftMagicNumbers() { } public static net.minecraft.block.Block getBlock(org.bukkit.block.Block block) { return getBlock(block.getType()); } @Deprecated // A bad method for bad magic. public static net.minecraft.block.Block getBlock(int id) { return getBlock(Material.getMaterial(id)); } @Deprecated // A bad method for bad magic. public static int getId(net.minecraft.block.Block block) { return net.minecraft.block.Block.getIdFromBlock(block); } public static Material getMaterial(net.minecraft.block.Block block) { return Material.getMaterial(net.minecraft.block.Block.getIdFromBlock(block)); } public static net.minecraft.item.Item getItem(Material material) { // TODO: Don't use ID net.minecraft.item.Item item = net.minecraft.item.Item.getItemById(material.getId()); return item; } @Deprecated // A bad method for bad magic. public static net.minecraft.item.Item getItem(int id) { return net.minecraft.item.Item.getItemById(id); } @Deprecated // A bad method for bad magic. public static int getId(net.minecraft.item.Item item) { return net.minecraft.item.Item.getIdFromItem(item); } public static Material getMaterial(net.minecraft.item.Item item) { // TODO: Don't use ID Material material = Material.getMaterial(net.minecraft.item.Item.getIdFromItem(item)); if(material == null) { return Material.AIR; } return material; } public static net.minecraft.block.Block getBlock(Material material) { material = material == null ? Material.AIR : material; // Cauldron - this should not happen but just in case it does // TODO: Don't use ID net.minecraft.block.Block block = net.minecraft.block.Block.getBlockById(material.getId()); if(block == null) { return net.minecraft.init.Blocks.air; } return block; } @Override public Material getMaterialFromInternalName(String name) { return getMaterial((net.minecraft.item.Item) net.minecraft.item.Item.itemRegistry.getObject(name)); } @Override public List<String> tabCompleteInternalMaterialName(String token, List<String> completions) { return StringUtil.copyPartialMatches(token, net.minecraft.item.Item.itemRegistry.getKeys(), completions); } @Override public ItemStack modifyItemStack(ItemStack stack, String arguments) { net.minecraft.item.ItemStack nmsStack = CraftItemStack.asNMSCopy(stack); try { nmsStack.setTagCompound((net.minecraft.nbt.NBTTagCompound) net.minecraft.nbt.JsonToNBT.func_150315_a(arguments)); } catch(net.minecraft.nbt.NBTException e) { e.printStackTrace(); } stack.setItemMeta(CraftItemStack.getItemMeta(nmsStack)); return stack; } @Override public Statistic getStatisticFromInternalName(String name) { return CraftStatistic.getBukkitStatisticByName(name); } @Override public Achievement getAchievementFromInternalName(String name) { return CraftStatistic.getBukkitAchievementByName(name); } @Override public List<String> tabCompleteInternalStatisticOrAchievementName(String token, List<String> completions) { List<String> matches = new ArrayList<String>(); Iterator iterator = net.minecraft.stats.StatList.allStats.iterator(); while(iterator.hasNext()) { String statistic = ((net.minecraft.stats.StatBase) iterator.next()).statId; if(statistic.startsWith(token)) { matches.add(statistic); } } return matches; } }