package openmods.utils;
import com.google.common.base.Throwables;
import cpw.mods.fml.common.registry.GameData;
import java.io.DataOutput;
import java.io.DataOutputStream;
import java.io.OutputStream;
import java.security.DigestOutputStream;
import java.security.MessageDigest;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompressedStreamTools;
import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagInt;
import net.minecraft.world.World;
import net.minecraftforge.common.util.Constants;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.io.output.NullOutputStream;
public class ItemUtils {
public static ItemStack consumeItem(ItemStack stack) {
if (stack.stackSize == 1) {
final Item item = stack.getItem();
if (item.hasContainerItem(stack)) return item.getContainerItem(stack);
return null;
}
stack.splitStack(1);
return stack;
}
public static NBTTagCompound getItemTag(ItemStack stack) {
if (stack.stackTagCompound == null) stack.stackTagCompound = new NBTTagCompound();
return stack.stackTagCompound;
}
public static Integer getInt(ItemStack stack, String tagName) {
NBTTagCompound tag = getItemTag(stack);
NBTBase data = tag.getTag(tagName);
return (data != null)? ((NBTTagInt)data).func_150287_d() : null;
}
public static EntityItem createDrop(Entity dropper, ItemStack is) {
return createEntityItem(dropper.worldObj, dropper.posX, dropper.posY, dropper.posZ, is);
}
public static EntityItem createEntityItem(World world, double x, double y, double z, ItemStack is) {
return new EntityItem(world, x, y, z, is.copy());
}
/**
* This function returns fingerprint of NBTTag. It can be used to compare two tags
*/
public static String getNBTHash(NBTTagCompound tag) {
try {
MessageDigest digest = MessageDigest.getInstance("MD5");
OutputStream dump = new NullOutputStream();
DigestOutputStream hasher = new DigestOutputStream(dump, digest);
DataOutput output = new DataOutputStream(hasher);
CompressedStreamTools.write(tag, output);
byte[] hash = digest.digest();
return new String(Hex.encodeHex(hash));
} catch (Exception e) {
throw Throwables.propagate(e);
}
}
// backports from MC1.8
public static Item getByNameOrId(String id) {
final Item item = GameData.getItemRegistry().getObject(id);
if (item != null) return item;
try {
final int numericId = Integer.parseInt(id);
return GameData.getItemRegistry().getObjectById(numericId);
} catch (NumberFormatException numberformatexception) {}
return null;
}
public static ItemStack readStack(NBTTagCompound nbt) {
final Item item;
if (nbt.hasKey("id", Constants.NBT.TAG_STRING)) {
item = getByNameOrId(nbt.getString("id"));
} else {
item = Item.getItemById(nbt.getShort("id"));
}
if (item == null) return null;
final int stackSize = nbt.getByte("Count");
final int itemDamage = nbt.getShort("Damage");
final ItemStack result = new ItemStack(item, stackSize, itemDamage);
if (nbt.hasKey("tag", Constants.NBT.TAG_COMPOUND)) {
result.stackTagCompound = nbt.getCompoundTag("tag");
}
return result;
}
public static NBTTagCompound writeStack(ItemStack stack) {
NBTTagCompound result = new NBTTagCompound();
stack.writeToNBT(result);
// if possible, replace with string representation
final Item item = stack.getItem();
if (item != null) {
final String id = GameData.getItemRegistry().getNameForObject(item);
if (id != null) {
result.setString("id", id);
}
}
return result;
}
}