package com.bergerkiller.bukkit.common.reflection.classes;
import java.io.DataInput;
import java.io.DataOutput;
import java.util.Collection;
import net.minecraft.server.NBTReadLimiter;
import com.bergerkiller.bukkit.common.reflection.ClassTemplate;
import com.bergerkiller.bukkit.common.reflection.FieldAccessor;
import com.bergerkiller.bukkit.common.reflection.MethodAccessor;
import com.bergerkiller.bukkit.common.reflection.NMSClassTemplate;
import com.bergerkiller.bukkit.common.reflection.SafeMethod;
import com.bergerkiller.bukkit.common.wrappers.NBTReadLimiterUnlimited;
public class NBTRef {
public static final ClassTemplate<?> NBTBase = NMSClassTemplate.create("NBTBase");
public static final ClassTemplate<?> NBTTagList = NMSClassTemplate.create("NBTTagList");
public static final ClassTemplate<?> NBTTagCompound = NMSClassTemplate.create("NBTTagCompound");
public static final SafeMethod<Byte> getTypeId = NBTBase.getMethod("getTypeId");
public static final FieldAccessor<Byte> nbtListType = NBTTagList.getField("type");
public static final MethodAccessor<Object> clone = NBTBase.getMethod("clone");
public static final MethodAccessor<Void> nbtListAdd = NBTTagList.getMethod("add", NBTBase.getType());
public static final MethodAccessor<Integer> nbtListSize = NBTTagList.getMethod("size");
public static final MethodAccessor<Object> nbtListGet = NBTTagList.getMethod("get", int.class);
public static final MethodAccessor<Collection<Object>> nbtCompoundGetValues = NBTTagCompound.getMethod("c");
public static final MethodAccessor<Void> nbtCompoundRemove = NBTTagCompound.getMethod("remove", String.class);
public static final MethodAccessor<Void> nbtCompoundSet = NBTTagCompound.getMethod("set", String.class, NBTBase.getType());
public static final MethodAccessor<Object> nbtCompoundGet = NBTTagCompound.getMethod("get", String.class);
public static final MethodAccessor<Boolean> nbtCompoundContains = NBTTagCompound.getMethod("hasKey", String.class);
public static final MethodAccessor<Boolean> nbtCompoundIsEmpty = NBTTagCompound.getMethod("isEmpty");
/* External */
private static final ClassTemplate<?> COMPR_TEMP = new NMSClassTemplate("NBTCompressedStreamTools");
private static final MethodAccessor<Void> writeTag = COMPR_TEMP.getMethod("a", NBTBase.getType(), DataOutput.class);
private static final MethodAccessor<Object> readTag = COMPR_TEMP.getMethod("a", DataInput.class, int.class, NBTReadLimiter.class);
public static void writeTag(Object nbtBaseInstance, DataOutput outputStream) {
writeTag.invoke(null, nbtBaseInstance, outputStream);
}
public static Object readTag(DataInput inputStream) {
return readTag.invoke(inputStream, 0, new NBTReadLimiterUnlimited(0L));
}
public static Object readTag(DataInput inputStream, int param) {
return readTag.invoke(null, inputStream, param, new NBTReadLimiterUnlimited(0L));
}
public static Object readTag(DataInput inputStream, int param, long maxLength) {
return readTag.invoke(null, inputStream, param, new NBTReadLimiter(maxLength));
}
}