equivalent-exchange-3/src/main/java/com/pahimar/ee3/util/NBTHelper.java
Pahimar 6d2e1337b1 Refactor NBTHelper. When NBTHelper is used to retrieve data from an ItemStacks NBTTagCompound it will also verify that the key it finds is of the expected data type (returns null otherwise). Sets in NBTHelper now also verify inputs.
Changed ItemAlchemicalBag to check the players inventory for other alchemical bags that have the same UUID as the one being opened. If a duplicate is found the duplicates UUID is changed to a new random one. Closes #800.
2016-05-27 11:10:38 -04:00

275 lines
8.6 KiB
Java

package com.pahimar.ee3.util;
import com.pahimar.ee3.reference.Names;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.*;
import java.util.UUID;
public class NBTHelper {
public static void clearStatefulNBTTags(ItemStack itemStack) {
if (NBTHelper.hasKey(itemStack, Names.NBT.CRAFTING_GUI_OPEN)) {
NBTHelper.removeTag(itemStack, Names.NBT.CRAFTING_GUI_OPEN);
}
else if (NBTHelper.hasKey(itemStack, Names.NBT.TRANSMUTATION_GUI_OPEN)) {
NBTHelper.removeTag(itemStack, Names.NBT.TRANSMUTATION_GUI_OPEN);
}
else if (NBTHelper.hasKey(itemStack, Names.NBT.ALCHEMICAL_BAG_GUI_OPEN)) {
NBTHelper.removeTag(itemStack, Names.NBT.ALCHEMICAL_BAG_GUI_OPEN);
}
}
public static boolean hasKey(ItemStack itemStack, String keyName) {
return itemStack != null && itemStack.stackTagCompound != null && itemStack.stackTagCompound.hasKey(keyName);
}
public static void removeTag(ItemStack itemStack, String keyName) {
if (itemStack != null && itemStack.stackTagCompound != null && keyName != null && !keyName.isEmpty()) {
itemStack.stackTagCompound.removeTag(keyName);
}
}
public static boolean hasUUID(ItemStack itemStack) {
return getLong(itemStack, Names.NBT.UUID_MOST_SIG) != null && getLong(itemStack, Names.NBT.UUID_LEAST_SIG) != null;
}
public static UUID getUUID(ItemStack itemStack) {
if (hasUUID(itemStack)) {
return new UUID(getLong(itemStack, Names.NBT.UUID_MOST_SIG), getLong(itemStack, Names.NBT.UUID_LEAST_SIG));
}
return null;
}
public static void setUUID(ItemStack itemStack, UUID uuid) {
if (itemStack != null) {
initNBTTagCompound(itemStack);
if (uuid == null) {
uuid = UUID.randomUUID();
}
setLong(itemStack, Names.NBT.UUID_MOST_SIG, uuid.getMostSignificantBits());
setLong(itemStack, Names.NBT.UUID_LEAST_SIG, uuid.getLeastSignificantBits());
}
}
/**
* Initializes the NBT Tag Compound for the given ItemStack
*
* @param itemStack The ItemStack for which its NBT Tag Compound is being checked for initialization
*/
private static void initNBTTagCompound(ItemStack itemStack) {
if (itemStack != null && itemStack.stackTagCompound == null) {
itemStack.setTagCompound(new NBTTagCompound());
}
}
// String
public static String getString(ItemStack itemStack, String keyName) {
if (hasKey(itemStack, keyName)) {
if (itemStack.getTagCompound().getTag(keyName) instanceof NBTTagString) {
return itemStack.stackTagCompound.getString(keyName);
}
}
return null;
}
public static void setString(ItemStack itemStack, String keyName, String keyValue) {
if (itemStack != null && keyName != null && !keyName.isEmpty()) {
initNBTTagCompound(itemStack);
itemStack.stackTagCompound.setString(keyName, keyValue);
}
}
// boolean
public static Boolean getBoolean(ItemStack itemStack, String keyName) {
if (hasKey(itemStack, keyName)) {
if (itemStack.getTagCompound().getTag(keyName) instanceof NBTTagByte) {
itemStack.stackTagCompound.getBoolean(keyName);
}
}
return null;
}
public static void setBoolean(ItemStack itemStack, String keyName, boolean keyValue) {
if (itemStack != null && keyName != null && !keyName.isEmpty()) {
initNBTTagCompound(itemStack);
itemStack.stackTagCompound.setBoolean(keyName, keyValue);
}
}
// byte
public static Byte getByte(ItemStack itemStack, String keyName) {
if (hasKey(itemStack, keyName)) {
if (itemStack.getTagCompound().getTag(keyName) instanceof NBTTagByte) {
return itemStack.stackTagCompound.getByte(keyName);
}
}
return null;
}
public static void setByte(ItemStack itemStack, String keyName, byte keyValue) {
if (itemStack != null && keyName != null && !keyName.isEmpty()) {
initNBTTagCompound(itemStack);
itemStack.stackTagCompound.setByte(keyName, keyValue);
}
}
// short
public static Short getShort(ItemStack itemStack, String keyName) {
if (hasKey(itemStack, keyName)) {
if (itemStack.getTagCompound().getTag(keyName) instanceof NBTTagShort) {
return itemStack.stackTagCompound.getShort(keyName);
}
}
return null;
}
public static void setShort(ItemStack itemStack, String keyName, short keyValue) {
if (itemStack != null && keyName != null && !keyName.isEmpty()) {
initNBTTagCompound(itemStack);
itemStack.stackTagCompound.setShort(keyName, keyValue);
}
}
// int
public static Integer getInteger(ItemStack itemStack, String keyName) {
if (hasKey(itemStack, keyName)) {
if (itemStack.getTagCompound().getTag(keyName) instanceof NBTTagInt) {
return itemStack.stackTagCompound.getInteger(keyName);
}
}
return null;
}
public static void setInteger(ItemStack itemStack, String keyName, int keyValue) {
if (itemStack != null && keyName != null && !keyName.isEmpty()) {
initNBTTagCompound(itemStack);
itemStack.stackTagCompound.setInteger(keyName, keyValue);
}
}
// long
public static Long getLong(ItemStack itemStack, String keyName) {
if (hasKey(itemStack, keyName)) {
if (itemStack.getTagCompound().getTag(keyName) instanceof NBTTagLong) {
return itemStack.stackTagCompound.getLong(keyName);
}
}
return null;
}
public static void setLong(ItemStack itemStack, String keyName, long keyValue) {
if (itemStack != null && keyName != null && !keyName.isEmpty()) {
initNBTTagCompound(itemStack);
itemStack.stackTagCompound.setLong(keyName, keyValue);
}
}
// float
public static Float getFloat(ItemStack itemStack, String keyName) {
if (hasKey(itemStack, keyName)) {
if (itemStack.getTagCompound().getTag(keyName) instanceof NBTTagFloat) {
return itemStack.stackTagCompound.getFloat(keyName);
}
}
return null;
}
public static void setFloat(ItemStack itemStack, String keyName, float keyValue) {
if (itemStack != null && keyName != null && !keyName.isEmpty()) {
initNBTTagCompound(itemStack);
itemStack.stackTagCompound.setFloat(keyName, keyValue);
}
}
// double
public static Double getDouble(ItemStack itemStack, String keyName) {
if (hasKey(itemStack, keyName)) {
if (itemStack.getTagCompound().getTag(keyName) instanceof NBTTagDouble) {
return itemStack.stackTagCompound.getDouble(keyName);
}
}
return null;
}
public static void setDouble(ItemStack itemStack, String keyName, double keyValue) {
if (itemStack != null && keyName != null && !keyName.isEmpty()) {
initNBTTagCompound(itemStack);
itemStack.stackTagCompound.setDouble(keyName, keyValue);
}
}
// tag list
public static NBTTagList getTagList(ItemStack itemStack, String keyName, int nbtBaseType) {
if (hasKey(itemStack, keyName)) {
if (itemStack.getTagCompound().getTag(keyName) instanceof NBTTagList) {
return itemStack.stackTagCompound.getTagList(keyName, nbtBaseType);
}
}
return null;
}
public static void setTagList(ItemStack itemStack, String keyName, NBTTagList nbtTagList) {
if (itemStack != null && keyName != null && !keyName.isEmpty()) {
initNBTTagCompound(itemStack);
itemStack.stackTagCompound.setTag(keyName, nbtTagList);
}
}
// tag compound
public static NBTTagCompound getTagCompound(ItemStack itemStack, String keyName) {
if (hasKey(itemStack, keyName)) {
if (itemStack.getTagCompound().getTag(keyName) instanceof NBTTagCompound) {
return itemStack.stackTagCompound.getCompoundTag(keyName);
}
}
return null;
}
public static void setTagCompound(ItemStack itemStack, String keyName, NBTTagCompound nbtTagCompound) {
if (itemStack != null && keyName != null && !keyName.isEmpty()) {
initNBTTagCompound(itemStack);
itemStack.stackTagCompound.setTag(keyName, nbtTagCompound);
}
}
}