package net.minecraft.nbt; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Optional; import com.google.common.collect.UnmodifiableIterator; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; import java.util.UUID; import java.util.Map.Entry; import javax.annotation.Nullable; import net.minecraft.block.Block; import net.minecraft.block.properties.IProperty; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; import net.minecraft.util.ResourceLocation; import net.minecraft.util.StringUtils; import net.minecraft.util.math.BlockPos; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public final class NBTUtil { private static final Logger LOGGER = LogManager.getLogger(); /** * Reads and returns a GameProfile that has been saved to the passed in NBTTagCompound */ @Nullable public static GameProfile readGameProfileFromNBT(NBTTagCompound compound) { String s = null; String s1 = null; if (compound.hasKey("Name", 8)) { s = compound.getString("Name"); } if (compound.hasKey("Id", 8)) { s1 = compound.getString("Id"); } try { UUID uuid; try { uuid = UUID.fromString(s1); } catch (Throwable var12) { uuid = null; } GameProfile gameprofile = new GameProfile(uuid, s); if (compound.hasKey("Properties", 10)) { NBTTagCompound nbttagcompound = compound.getCompoundTag("Properties"); for (String s2 : nbttagcompound.getKeySet()) { NBTTagList nbttaglist = nbttagcompound.getTagList(s2, 10); for (int i = 0; i < nbttaglist.tagCount(); ++i) { NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(i); String s3 = nbttagcompound1.getString("Value"); if (nbttagcompound1.hasKey("Signature", 8)) { gameprofile.getProperties().put(s2, new Property(s2, s3, nbttagcompound1.getString("Signature"))); } else { gameprofile.getProperties().put(s2, new Property(s2, s3)); } } } } return gameprofile; } catch (Throwable var13) { return null; } } /** * Writes a GameProfile to an NBTTagCompound. */ public static NBTTagCompound writeGameProfile(NBTTagCompound tagCompound, GameProfile profile) { if (!StringUtils.isNullOrEmpty(profile.getName())) { tagCompound.setString("Name", profile.getName()); } if (profile.getId() != null) { tagCompound.setString("Id", profile.getId().toString()); } if (!profile.getProperties().isEmpty()) { NBTTagCompound nbttagcompound = new NBTTagCompound(); for (String s : profile.getProperties().keySet()) { NBTTagList nbttaglist = new NBTTagList(); for (Property property : profile.getProperties().get(s)) { NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setString("Value", property.getValue()); if (property.hasSignature()) { nbttagcompound1.setString("Signature", property.getSignature()); } nbttaglist.appendTag(nbttagcompound1); } nbttagcompound.setTag(s, nbttaglist); } tagCompound.setTag("Properties", nbttagcompound); } return tagCompound; } @VisibleForTesting public static boolean areNBTEquals(NBTBase nbt1, NBTBase nbt2, boolean compareTagList) { if (nbt1 == nbt2) { return true; } else if (nbt1 == null) { return true; } else if (nbt2 == null) { return false; } else if (!nbt1.getClass().equals(nbt2.getClass())) { return false; } else if (nbt1 instanceof NBTTagCompound) { NBTTagCompound nbttagcompound = (NBTTagCompound)nbt1; NBTTagCompound nbttagcompound1 = (NBTTagCompound)nbt2; for (String s : nbttagcompound.getKeySet()) { NBTBase nbtbase1 = nbttagcompound.getTag(s); if (!areNBTEquals(nbtbase1, nbttagcompound1.getTag(s), compareTagList)) { return false; } } return true; } else if (nbt1 instanceof NBTTagList && compareTagList) { NBTTagList nbttaglist = (NBTTagList)nbt1; NBTTagList nbttaglist1 = (NBTTagList)nbt2; if (nbttaglist.hasNoTags()) { return nbttaglist1.hasNoTags(); } else { for (int i = 0; i < nbttaglist.tagCount(); ++i) { NBTBase nbtbase = nbttaglist.get(i); boolean flag = false; for (int j = 0; j < nbttaglist1.tagCount(); ++j) { if (areNBTEquals(nbtbase, nbttaglist1.get(j), compareTagList)) { flag = true; break; } } if (!flag) { return false; } } return true; } } else { return nbt1.equals(nbt2); } } /** * Creates a new NBTTagCompound which stores a UUID. */ public static NBTTagCompound createUUIDTag(UUID uuid) { NBTTagCompound nbttagcompound = new NBTTagCompound(); nbttagcompound.setLong("M", uuid.getMostSignificantBits()); nbttagcompound.setLong("L", uuid.getLeastSignificantBits()); return nbttagcompound; } /** * Reads a UUID from the passed NBTTagCompound. */ public static UUID getUUIDFromTag(NBTTagCompound tag) { return new UUID(tag.getLong("M"), tag.getLong("L")); } /** * Creates a BlockPos object from the data stored in the passed NBTTagCompound. */ public static BlockPos getPosFromTag(NBTTagCompound tag) { return new BlockPos(tag.getInteger("X"), tag.getInteger("Y"), tag.getInteger("Z")); } /** * Creates a new NBTTagCompound from a BlockPos. */ public static NBTTagCompound createPosTag(BlockPos pos) { NBTTagCompound nbttagcompound = new NBTTagCompound(); nbttagcompound.setInteger("X", pos.getX()); nbttagcompound.setInteger("Y", pos.getY()); nbttagcompound.setInteger("Z", pos.getZ()); return nbttagcompound; } /** * Reads a blockstate from the given tag. */ public static IBlockState readBlockState(NBTTagCompound tag) { if (!tag.hasKey("Name", 8)) { return Blocks.AIR.getDefaultState(); } else { Block block = Block.REGISTRY.getObject(new ResourceLocation(tag.getString("Name"))); IBlockState iblockstate = block.getDefaultState(); if (tag.hasKey("Properties", 10)) { NBTTagCompound nbttagcompound = tag.getCompoundTag("Properties"); BlockStateContainer blockstatecontainer = block.getBlockState(); for (String s : nbttagcompound.getKeySet()) { IProperty iproperty = blockstatecontainer.getProperty(s); if (iproperty != null) { iblockstate = setValueHelper(iblockstate, iproperty, s, nbttagcompound, tag); } } } return iblockstate; } } private static > IBlockState setValueHelper(IBlockState p_193590_0_, IProperty p_193590_1_, String p_193590_2_, NBTTagCompound p_193590_3_, NBTTagCompound p_193590_4_) { Optional optional = p_193590_1_.parseValue(p_193590_3_.getString(p_193590_2_)); if (optional.isPresent()) { return p_193590_0_.withProperty(p_193590_1_, optional.get()); } else { LOGGER.warn("Unable to read property: {} with value: {} for blockstate: {}", p_193590_2_, p_193590_3_.getString(p_193590_2_), p_193590_4_.toString()); return p_193590_0_; } } /** * Writes the given blockstate to the given tag. */ public static NBTTagCompound writeBlockState(NBTTagCompound tag, IBlockState state) { tag.setString("Name", ((ResourceLocation)Block.REGISTRY.getNameForObject(state.getBlock())).toString()); if (!state.getProperties().isEmpty()) { NBTTagCompound nbttagcompound = new NBTTagCompound(); UnmodifiableIterator unmodifiableiterator = state.getProperties().entrySet().iterator(); while (unmodifiableiterator.hasNext()) { Entry < IProperty, Comparable> entry = (Entry)unmodifiableiterator.next(); IProperty iproperty = (IProperty)entry.getKey(); nbttagcompound.setString(iproperty.getName(), getName(iproperty, entry.getValue())); } tag.setTag("Properties", nbttagcompound); } return tag; } @SuppressWarnings("unchecked") private static > String getName(IProperty p_190010_0_, Comparable p_190010_1_) { return p_190010_0_.getName((T)p_190010_1_); } }