package org.bukkit.craftbukkit.util;
import com.google.common.collect.Lists;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.minecraft.server.Block;
import net.minecraft.server.Blocks;
import net.minecraft.server.Item;
import net.minecraft.server.MinecraftKey;
import net.minecraft.server.MojangsonParseException;
import net.minecraft.server.MojangsonParser;
import net.minecraft.server.StatisticList;
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;
@SuppressWarnings("deprecation")
public final class CraftMagicNumbers implements UnsafeValues {
public static final UnsafeValues INSTANCE = new CraftMagicNumbers();
private CraftMagicNumbers() {}
public static Block getBlock(org.bukkit.block.Block block) {
return getBlock(block.getType());
}
@Deprecated
// A bad method for bad magic.
public static Block getBlock(int id) {
return getBlock(Material.getMaterial(id));
}
@Deprecated
// A bad method for bad magic.
public static int getId(Block block) {
return Block.getId(block);
}
public static Material getMaterial(Block block) {
return Material.getMaterial(Block.getId(block));
}
public static Item getItem(Material material) {
// TODO: Don't use ID
Item item = Item.getById(material.getId());
return item;
}
@Deprecated
// A bad method for bad magic.
public static Item getItem(int id) {
return Item.getById(id);
}
@Deprecated
// A bad method for bad magic.
public static int getId(Item item) {
return Item.getId(item);
}
public static Material getMaterial(Item item) {
// TODO: Don't use ID
Material material = Material.getMaterial(Item.getId(item));
if (material == null) {
return Material.AIR;
}
return material;
}
public static Block getBlock(Material material) {
if (material == null) {
return null;
}
// TODO: Don't use ID
Block block = Block.getById(material.getId());
if (block == null) {
return Blocks.AIR;
}
return block;
}
@Override
public Material getMaterialFromInternalName(String name) {
return getMaterial(Item.REGISTRY.get(new MinecraftKey(name)));
}
@Override
public List<String> tabCompleteInternalMaterialName(String token, List<String> completions) {
ArrayList<String> results = Lists.newArrayList();
for (MinecraftKey key : Item.REGISTRY.keySet()) {
results.add(key.toString());
}
return StringUtil.copyPartialMatches(token, results, completions);
}
@Override
public ItemStack modifyItemStack(ItemStack stack, String arguments) {
net.minecraft.server.ItemStack nmsStack = CraftItemStack.asNMSCopy(stack);
try {
nmsStack.setTag(MojangsonParser.parse(arguments));
} catch (MojangsonParseException ex) {
Logger.getLogger(CraftMagicNumbers.class.getName()).log(Level.SEVERE, null, ex);
}
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 = StatisticList.stats.iterator();
while (iterator.hasNext()) {
String statistic = ((net.minecraft.server.Statistic) iterator.next()).name;
if (statistic.startsWith(token)) {
matches.add(statistic);
}
}
return matches;
}
/**
* This helper class represents the different NBT Tags.
* <p>
* These should match NBTBase#getTypeId
*/
public static class NBT {
public static final int TAG_END = 0;
public static final int TAG_BYTE = 1;
public static final int TAG_SHORT = 2;
public static final int TAG_INT = 3;
public static final int TAG_LONG = 4;
public static final int TAG_FLOAT = 5;
public static final int TAG_DOUBLE = 6;
public static final int TAG_BYTE_ARRAY = 7;
public static final int TAG_STRING = 8;
public static final int TAG_LIST = 9;
public static final int TAG_COMPOUND = 10;
public static final int TAG_INT_ARRAY = 11;
public static final int TAG_ANY_NUMBER = 99;
}
}