Files
Mohammad-Ali Minaie b86dedad2f base mod created
2018-10-08 09:07:47 -04:00

332 lines
10 KiB
Java

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 <T extends Comparable<T>> IBlockState setValueHelper(IBlockState p_193590_0_, IProperty<T> p_193590_1_, String p_193590_2_, NBTTagCompound p_193590_3_, NBTTagCompound p_193590_4_)
{
Optional<T> 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 <T extends Comparable<T>> String getName(IProperty<T> p_190010_0_, Comparable<?> p_190010_1_)
{
return p_190010_0_.getName((T)p_190010_1_);
}
}