You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
560 lines
18 KiB
Java
560 lines
18 KiB
Java
package net.minecraft.nbt;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.Iterator;
|
|
import java.util.Stack;
|
|
import org.apache.logging.log4j.LogManager;
|
|
import org.apache.logging.log4j.Logger;
|
|
|
|
public class JsonToNBT
|
|
{
|
|
private static final Logger logger = LogManager.getLogger();
|
|
private static final String __OBFID = "CL_00001232";
|
|
|
|
public static NBTBase func_150315_a(String p_150315_0_) throws NBTException
|
|
{
|
|
p_150315_0_ = p_150315_0_.trim();
|
|
int i = func_150310_b(p_150315_0_);
|
|
|
|
if (i != 1)
|
|
{
|
|
throw new NBTException("Encountered multiple top tags, only one expected");
|
|
}
|
|
else
|
|
{
|
|
JsonToNBT.Any any = null;
|
|
|
|
if (p_150315_0_.startsWith("{"))
|
|
{
|
|
any = func_150316_a("tag", p_150315_0_);
|
|
}
|
|
else
|
|
{
|
|
any = func_150316_a(func_150313_b(p_150315_0_, false), func_150311_c(p_150315_0_, false));
|
|
}
|
|
|
|
return any.func_150489_a();
|
|
}
|
|
}
|
|
|
|
static int func_150310_b(String p_150310_0_) throws NBTException
|
|
{
|
|
int i = 0;
|
|
boolean flag = false;
|
|
Stack stack = new Stack();
|
|
|
|
for (int j = 0; j < p_150310_0_.length(); ++j)
|
|
{
|
|
char c0 = p_150310_0_.charAt(j);
|
|
|
|
if (c0 == 34)
|
|
{
|
|
if (j > 0 && p_150310_0_.charAt(j - 1) == 92)
|
|
{
|
|
if (!flag)
|
|
{
|
|
throw new NBTException("Illegal use of \\\": " + p_150310_0_);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
flag = !flag;
|
|
}
|
|
}
|
|
else if (!flag)
|
|
{
|
|
if (c0 != 123 && c0 != 91)
|
|
{
|
|
if (c0 == 125 && (stack.isEmpty() || ((Character)stack.pop()).charValue() != 123))
|
|
{
|
|
throw new NBTException("Unbalanced curly brackets {}: " + p_150310_0_);
|
|
}
|
|
|
|
if (c0 == 93 && (stack.isEmpty() || ((Character)stack.pop()).charValue() != 91))
|
|
{
|
|
throw new NBTException("Unbalanced square brackets []: " + p_150310_0_);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (stack.isEmpty())
|
|
{
|
|
++i;
|
|
}
|
|
|
|
stack.push(Character.valueOf(c0));
|
|
}
|
|
}
|
|
}
|
|
|
|
if (flag)
|
|
{
|
|
throw new NBTException("Unbalanced quotation: " + p_150310_0_);
|
|
}
|
|
else if (!stack.isEmpty())
|
|
{
|
|
throw new NBTException("Unbalanced brackets: " + p_150310_0_);
|
|
}
|
|
else if (i == 0 && !p_150310_0_.isEmpty())
|
|
{
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
return i;
|
|
}
|
|
}
|
|
|
|
static JsonToNBT.Any func_150316_a(String p_150316_0_, String p_150316_1_) throws NBTException
|
|
{
|
|
p_150316_1_ = p_150316_1_.trim();
|
|
func_150310_b(p_150316_1_);
|
|
String s2;
|
|
String s3;
|
|
String s4;
|
|
char c0;
|
|
|
|
if (p_150316_1_.startsWith("{"))
|
|
{
|
|
if (!p_150316_1_.endsWith("}"))
|
|
{
|
|
throw new NBTException("Unable to locate ending bracket for: " + p_150316_1_);
|
|
}
|
|
else
|
|
{
|
|
p_150316_1_ = p_150316_1_.substring(1, p_150316_1_.length() - 1);
|
|
JsonToNBT.Compound compound = new JsonToNBT.Compound(p_150316_0_);
|
|
|
|
while (p_150316_1_.length() > 0)
|
|
{
|
|
s2 = func_150314_a(p_150316_1_, false);
|
|
|
|
if (s2.length() > 0)
|
|
{
|
|
s3 = func_150313_b(s2, false);
|
|
s4 = func_150311_c(s2, false);
|
|
compound.field_150491_b.add(func_150316_a(s3, s4));
|
|
|
|
if (p_150316_1_.length() < s2.length() + 1)
|
|
{
|
|
break;
|
|
}
|
|
|
|
c0 = p_150316_1_.charAt(s2.length());
|
|
|
|
if (c0 != 44 && c0 != 123 && c0 != 125 && c0 != 91 && c0 != 93)
|
|
{
|
|
throw new NBTException("Unexpected token \'" + c0 + "\' at: " + p_150316_1_.substring(s2.length()));
|
|
}
|
|
|
|
p_150316_1_ = p_150316_1_.substring(s2.length() + 1);
|
|
}
|
|
}
|
|
|
|
return compound;
|
|
}
|
|
}
|
|
else if (p_150316_1_.startsWith("[") && !p_150316_1_.matches("\\[[-\\d|,\\s]+\\]"))
|
|
{
|
|
if (!p_150316_1_.endsWith("]"))
|
|
{
|
|
throw new NBTException("Unable to locate ending bracket for: " + p_150316_1_);
|
|
}
|
|
else
|
|
{
|
|
p_150316_1_ = p_150316_1_.substring(1, p_150316_1_.length() - 1);
|
|
JsonToNBT.List list = new JsonToNBT.List(p_150316_0_);
|
|
|
|
while (p_150316_1_.length() > 0)
|
|
{
|
|
s2 = func_150314_a(p_150316_1_, true);
|
|
|
|
if (s2.length() > 0)
|
|
{
|
|
s3 = func_150313_b(s2, true);
|
|
s4 = func_150311_c(s2, true);
|
|
list.field_150492_b.add(func_150316_a(s3, s4));
|
|
|
|
if (p_150316_1_.length() < s2.length() + 1)
|
|
{
|
|
break;
|
|
}
|
|
|
|
c0 = p_150316_1_.charAt(s2.length());
|
|
|
|
if (c0 != 44 && c0 != 123 && c0 != 125 && c0 != 91 && c0 != 93)
|
|
{
|
|
throw new NBTException("Unexpected token \'" + c0 + "\' at: " + p_150316_1_.substring(s2.length()));
|
|
}
|
|
|
|
p_150316_1_ = p_150316_1_.substring(s2.length() + 1);
|
|
}
|
|
else
|
|
{
|
|
logger.debug(p_150316_1_);
|
|
}
|
|
}
|
|
|
|
return list;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return new JsonToNBT.Primitive(p_150316_0_, p_150316_1_);
|
|
}
|
|
}
|
|
|
|
private static String func_150314_a(String p_150314_0_, boolean p_150314_1_) throws NBTException
|
|
{
|
|
int i = func_150312_a(p_150314_0_, ':');
|
|
|
|
if (i < 0 && !p_150314_1_)
|
|
{
|
|
throw new NBTException("Unable to locate name/value separator for string: " + p_150314_0_);
|
|
}
|
|
else
|
|
{
|
|
int j = func_150312_a(p_150314_0_, ',');
|
|
|
|
if (j >= 0 && j < i && !p_150314_1_)
|
|
{
|
|
throw new NBTException("Name error at: " + p_150314_0_);
|
|
}
|
|
else
|
|
{
|
|
if (p_150314_1_ && (i < 0 || i > j))
|
|
{
|
|
i = -1;
|
|
}
|
|
|
|
Stack stack = new Stack();
|
|
int k = i + 1;
|
|
boolean flag1 = false;
|
|
boolean flag2 = false;
|
|
boolean flag3 = false;
|
|
|
|
for (int l = 0; k < p_150314_0_.length(); ++k)
|
|
{
|
|
char c0 = p_150314_0_.charAt(k);
|
|
|
|
if (c0 == 34)
|
|
{
|
|
if (k > 0 && p_150314_0_.charAt(k - 1) == 92)
|
|
{
|
|
if (!flag1)
|
|
{
|
|
throw new NBTException("Illegal use of \\\": " + p_150314_0_);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
flag1 = !flag1;
|
|
|
|
if (flag1 && !flag3)
|
|
{
|
|
flag2 = true;
|
|
}
|
|
|
|
if (!flag1)
|
|
{
|
|
l = k;
|
|
}
|
|
}
|
|
}
|
|
else if (!flag1)
|
|
{
|
|
if (c0 != 123 && c0 != 91)
|
|
{
|
|
if (c0 == 125 && (stack.isEmpty() || ((Character)stack.pop()).charValue() != 123))
|
|
{
|
|
throw new NBTException("Unbalanced curly brackets {}: " + p_150314_0_);
|
|
}
|
|
|
|
if (c0 == 93 && (stack.isEmpty() || ((Character)stack.pop()).charValue() != 91))
|
|
{
|
|
throw new NBTException("Unbalanced square brackets []: " + p_150314_0_);
|
|
}
|
|
|
|
if (c0 == 44 && stack.isEmpty())
|
|
{
|
|
return p_150314_0_.substring(0, k);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
stack.push(Character.valueOf(c0));
|
|
}
|
|
}
|
|
|
|
if (!Character.isWhitespace(c0))
|
|
{
|
|
if (!flag1 && flag2 && l != k)
|
|
{
|
|
return p_150314_0_.substring(0, l + 1);
|
|
}
|
|
|
|
flag3 = true;
|
|
}
|
|
}
|
|
|
|
return p_150314_0_.substring(0, k);
|
|
}
|
|
}
|
|
}
|
|
|
|
private static String func_150313_b(String p_150313_0_, boolean p_150313_1_) throws NBTException
|
|
{
|
|
if (p_150313_1_)
|
|
{
|
|
p_150313_0_ = p_150313_0_.trim();
|
|
|
|
if (p_150313_0_.startsWith("{") || p_150313_0_.startsWith("["))
|
|
{
|
|
return "";
|
|
}
|
|
}
|
|
|
|
int i = p_150313_0_.indexOf(58);
|
|
|
|
if (i < 0)
|
|
{
|
|
if (p_150313_1_)
|
|
{
|
|
return "";
|
|
}
|
|
else
|
|
{
|
|
throw new NBTException("Unable to locate name/value separator for string: " + p_150313_0_);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return p_150313_0_.substring(0, i).trim();
|
|
}
|
|
}
|
|
|
|
private static String func_150311_c(String p_150311_0_, boolean p_150311_1_) throws NBTException
|
|
{
|
|
if (p_150311_1_)
|
|
{
|
|
p_150311_0_ = p_150311_0_.trim();
|
|
|
|
if (p_150311_0_.startsWith("{") || p_150311_0_.startsWith("["))
|
|
{
|
|
return p_150311_0_;
|
|
}
|
|
}
|
|
|
|
int i = p_150311_0_.indexOf(58);
|
|
|
|
if (i < 0)
|
|
{
|
|
if (p_150311_1_)
|
|
{
|
|
return p_150311_0_;
|
|
}
|
|
else
|
|
{
|
|
throw new NBTException("Unable to locate name/value separator for string: " + p_150311_0_);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return p_150311_0_.substring(i + 1).trim();
|
|
}
|
|
}
|
|
|
|
private static int func_150312_a(String p_150312_0_, char p_150312_1_)
|
|
{
|
|
int i = 0;
|
|
|
|
for (boolean flag = false; i < p_150312_0_.length(); ++i)
|
|
{
|
|
char c1 = p_150312_0_.charAt(i);
|
|
|
|
if (c1 == 34)
|
|
{
|
|
if (i <= 0 || p_150312_0_.charAt(i - 1) != 92)
|
|
{
|
|
flag = !flag;
|
|
}
|
|
}
|
|
else if (!flag)
|
|
{
|
|
if (c1 == p_150312_1_)
|
|
{
|
|
return i;
|
|
}
|
|
|
|
if (c1 == 123 || c1 == 91)
|
|
{
|
|
return -1;
|
|
}
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
abstract static class Any
|
|
{
|
|
protected String field_150490_a;
|
|
private static final String __OBFID = "CL_00001233";
|
|
|
|
public abstract NBTBase func_150489_a();
|
|
}
|
|
|
|
static class Compound extends JsonToNBT.Any
|
|
{
|
|
protected ArrayList field_150491_b = new ArrayList();
|
|
private static final String __OBFID = "CL_00001234";
|
|
|
|
public Compound(String p_i45137_1_)
|
|
{
|
|
this.field_150490_a = p_i45137_1_;
|
|
}
|
|
|
|
public NBTBase func_150489_a()
|
|
{
|
|
NBTTagCompound nbttagcompound = new NBTTagCompound();
|
|
Iterator iterator = this.field_150491_b.iterator();
|
|
|
|
while (iterator.hasNext())
|
|
{
|
|
JsonToNBT.Any any = (JsonToNBT.Any)iterator.next();
|
|
nbttagcompound.setTag(any.field_150490_a, any.func_150489_a());
|
|
}
|
|
|
|
return nbttagcompound;
|
|
}
|
|
}
|
|
|
|
static class List extends JsonToNBT.Any
|
|
{
|
|
protected ArrayList field_150492_b = new ArrayList();
|
|
private static final String __OBFID = "CL_00001235";
|
|
|
|
public List(String p_i45138_1_)
|
|
{
|
|
this.field_150490_a = p_i45138_1_;
|
|
}
|
|
|
|
public NBTBase func_150489_a()
|
|
{
|
|
NBTTagList nbttaglist = new NBTTagList();
|
|
Iterator iterator = this.field_150492_b.iterator();
|
|
|
|
while (iterator.hasNext())
|
|
{
|
|
JsonToNBT.Any any = (JsonToNBT.Any)iterator.next();
|
|
nbttaglist.appendTag(any.func_150489_a());
|
|
}
|
|
|
|
return nbttaglist;
|
|
}
|
|
}
|
|
|
|
static class Primitive extends JsonToNBT.Any
|
|
{
|
|
protected String field_150493_b;
|
|
private static final String __OBFID = "CL_00001236";
|
|
|
|
public Primitive(String p_i45139_1_, String p_i45139_2_)
|
|
{
|
|
this.field_150490_a = p_i45139_1_;
|
|
this.field_150493_b = p_i45139_2_;
|
|
}
|
|
|
|
public NBTBase func_150489_a()
|
|
{
|
|
try
|
|
{
|
|
if (this.field_150493_b.matches("[-+]?[0-9]*\\.?[0-9]+[d|D]"))
|
|
{
|
|
return new NBTTagDouble(Double.parseDouble(this.field_150493_b.substring(0, this.field_150493_b.length() - 1)));
|
|
}
|
|
else if (this.field_150493_b.matches("[-+]?[0-9]*\\.?[0-9]+[f|F]"))
|
|
{
|
|
return new NBTTagFloat(Float.parseFloat(this.field_150493_b.substring(0, this.field_150493_b.length() - 1)));
|
|
}
|
|
else if (this.field_150493_b.matches("[-+]?[0-9]+[b|B]"))
|
|
{
|
|
return new NBTTagByte(Byte.parseByte(this.field_150493_b.substring(0, this.field_150493_b.length() - 1)));
|
|
}
|
|
else if (this.field_150493_b.matches("[-+]?[0-9]+[l|L]"))
|
|
{
|
|
return new NBTTagLong(Long.parseLong(this.field_150493_b.substring(0, this.field_150493_b.length() - 1)));
|
|
}
|
|
else if (this.field_150493_b.matches("[-+]?[0-9]+[s|S]"))
|
|
{
|
|
return new NBTTagShort(Short.parseShort(this.field_150493_b.substring(0, this.field_150493_b.length() - 1)));
|
|
}
|
|
else if (this.field_150493_b.matches("[-+]?[0-9]+"))
|
|
{
|
|
return new NBTTagInt(Integer.parseInt(this.field_150493_b.substring(0, this.field_150493_b.length())));
|
|
}
|
|
else if (this.field_150493_b.matches("[-+]?[0-9]*\\.?[0-9]+"))
|
|
{
|
|
return new NBTTagDouble(Double.parseDouble(this.field_150493_b.substring(0, this.field_150493_b.length())));
|
|
}
|
|
else if (!this.field_150493_b.equalsIgnoreCase("true") && !this.field_150493_b.equalsIgnoreCase("false"))
|
|
{
|
|
if (this.field_150493_b.startsWith("[") && this.field_150493_b.endsWith("]"))
|
|
{
|
|
if (this.field_150493_b.length() > 2)
|
|
{
|
|
String s = this.field_150493_b.substring(1, this.field_150493_b.length() - 1);
|
|
String[] astring = s.split(",");
|
|
|
|
try
|
|
{
|
|
if (astring.length <= 1)
|
|
{
|
|
return new NBTTagIntArray(new int[] {Integer.parseInt(s.trim())});
|
|
}
|
|
else
|
|
{
|
|
int[] aint = new int[astring.length];
|
|
|
|
for (int i = 0; i < astring.length; ++i)
|
|
{
|
|
aint[i] = Integer.parseInt(astring[i].trim());
|
|
}
|
|
|
|
return new NBTTagIntArray(aint);
|
|
}
|
|
}
|
|
catch (NumberFormatException numberformatexception)
|
|
{
|
|
return new NBTTagString(this.field_150493_b);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return new NBTTagIntArray();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (this.field_150493_b.startsWith("\"") && this.field_150493_b.endsWith("\"") && this.field_150493_b.length() > 2)
|
|
{
|
|
this.field_150493_b = this.field_150493_b.substring(1, this.field_150493_b.length() - 1);
|
|
}
|
|
|
|
this.field_150493_b = this.field_150493_b.replaceAll("\\\\\"", "\"");
|
|
return new NBTTagString(this.field_150493_b);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return new NBTTagByte((byte)(Boolean.parseBoolean(this.field_150493_b) ? 1 : 0));
|
|
}
|
|
}
|
|
catch (NumberFormatException numberformatexception1)
|
|
{
|
|
this.field_150493_b = this.field_150493_b.replaceAll("\\\\\"", "\"");
|
|
return new NBTTagString(this.field_150493_b);
|
|
}
|
|
}
|
|
}
|
|
} |