From eb2b16eec7dd8f101152985d4c1d500e14f7657a Mon Sep 17 00:00:00 2001 From: pahimar Date: Sat, 2 May 2015 21:14:44 -0400 Subject: [PATCH] Hopefully fixes Gson related crashes with FluidStacks --- build.properties | 2 +- .../pahimar/ee3/exchange/JsonFluidStack.java | 111 ++++++++++++++++++ .../pahimar/ee3/exchange/WrappedStack.java | 6 +- 3 files changed, 116 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/pahimar/ee3/exchange/JsonFluidStack.java diff --git a/build.properties b/build.properties index b7afeb85..edf74e03 100644 --- a/build.properties +++ b/build.properties @@ -1,6 +1,6 @@ # #Sat Dec 28 00:14:08 EST 2013 minecraft_version = 1.7.10 -forge_version = 10.13.2.1291 +forge_version = 10.13.3.1395-1710ls mod_version = 0.3 release_type = beta diff --git a/src/main/java/com/pahimar/ee3/exchange/JsonFluidStack.java b/src/main/java/com/pahimar/ee3/exchange/JsonFluidStack.java new file mode 100644 index 00000000..83a67e25 --- /dev/null +++ b/src/main/java/com/pahimar/ee3/exchange/JsonFluidStack.java @@ -0,0 +1,111 @@ +package com.pahimar.ee3.exchange; + +import com.google.gson.*; +import net.minecraft.nbt.JsonToNBT; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTException; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fluids.FluidStack; + +import java.lang.reflect.Type; + +public class JsonFluidStack implements JsonSerializer, JsonDeserializer +{ + public static final Gson jsonSerializer = (new GsonBuilder()).registerTypeAdapter(JsonFluidStack.class, new JsonFluidStack()).create(); + + public int fluidID; + public int amount; + public NBTTagCompound tag; + + public JsonFluidStack() + { + this.fluidID = Integer.MIN_VALUE; + this.amount = 0; + this.tag = null; + } + + public JsonFluidStack(FluidStack fluidStack) + { + this.fluidID = fluidStack.fluidID; + this.amount = fluidStack.amount; + this.tag = fluidStack.tag; + } + + public JsonFluidStack(int fluidID, int amount, NBTTagCompound tag) + { + this.fluidID = fluidID; + this.amount = amount; + this.tag = tag; + } + + @Override + public JsonFluidStack deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException + { + if (json.isJsonObject()) + { + JsonObject jsonObject = (JsonObject) json; + JsonFluidStack jsonFluidStack = new JsonFluidStack(); + + if (jsonObject.has("fluidID")) + { + jsonFluidStack.fluidID = jsonObject.get("fluidID").getAsInt(); + } + else + { + throw new JsonParseException(""); // TODO Exception message + } + + if (jsonObject.has("amount")) + { + jsonFluidStack.amount = jsonObject.get("amount").getAsInt(); + } + else + { + throw new JsonParseException(""); // TODO Exception message + } + + if (jsonObject.has("tag")) + { + try + { + NBTBase nbtBase = JsonToNBT.func_150315_a(jsonObject.get("tag").getAsString()); + + if (nbtBase instanceof NBTTagCompound) + { + jsonFluidStack.tag = (NBTTagCompound) nbtBase; + } + } + catch (NBTException e) + { + throw new JsonParseException(e.getMessage(), e.getCause()); + } + } + + return jsonFluidStack; + } + + return null; + } + + @Override + public JsonElement serialize(JsonFluidStack src, Type typeOfSrc, JsonSerializationContext context) + { + JsonObject jsonObject = new JsonObject(); + + jsonObject.addProperty("fluidID", src.fluidID); + jsonObject.addProperty("amount", src.amount); + + if (src.tag != null) + { + jsonObject.addProperty("tag", src.tag.toString()); + } + + return jsonObject; + } + + @Override + public String toString() + { + return String.format("fluidID: %s, amount: %s, tag: %s", fluidID, amount, tag); + } +} diff --git a/src/main/java/com/pahimar/ee3/exchange/WrappedStack.java b/src/main/java/com/pahimar/ee3/exchange/WrappedStack.java index 88a25cdc..6bc1463d 100644 --- a/src/main/java/com/pahimar/ee3/exchange/WrappedStack.java +++ b/src/main/java/com/pahimar/ee3/exchange/WrappedStack.java @@ -442,7 +442,8 @@ public class WrappedStack implements Comparable, JsonDeserializer< } else if (objectType.equalsIgnoreCase("FluidStack")) { - FluidStack fluidStack = jsonSerializer.fromJson(jsonWrappedStack.get("objectData"), FluidStack.class); + JsonFluidStack jsonFluidStack = JsonFluidStack.jsonSerializer.fromJson(jsonWrappedStack.get("objectData"), JsonFluidStack.class); + FluidStack fluidStack = new FluidStack(jsonFluidStack.fluidID, jsonFluidStack.amount, jsonFluidStack.tag); if (stackSize > 0) { @@ -510,7 +511,8 @@ public class WrappedStack implements Comparable, JsonDeserializer< } else if (wrappedStack.wrappedStack instanceof FluidStack) { - jsonWrappedStack.add("objectData", gson.toJsonTree(wrappedStack.wrappedStack, FluidStack.class)); + JsonFluidStack jsonFluidStack = new JsonFluidStack((FluidStack) wrappedStack.wrappedStack); + jsonWrappedStack.add("objectData", JsonFluidStack.jsonSerializer.toJsonTree(jsonFluidStack, JsonFluidStack.class)); } return jsonWrappedStack;