diff --git a/src/main/java/eu/crushedpixel/replaymod/holders/Keyframe.java b/src/main/java/eu/crushedpixel/replaymod/holders/Keyframe.java index 2f0f265f..a81d1268 100755 --- a/src/main/java/eu/crushedpixel/replaymod/holders/Keyframe.java +++ b/src/main/java/eu/crushedpixel/replaymod/holders/Keyframe.java @@ -4,10 +4,12 @@ import eu.crushedpixel.replaymod.interpolation.KeyframeValue; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; @Data @EqualsAndHashCode @AllArgsConstructor +@NoArgsConstructor public class Keyframe { private int realTimestamp; diff --git a/src/main/java/eu/crushedpixel/replaymod/holders/KeyframeSet.java b/src/main/java/eu/crushedpixel/replaymod/holders/KeyframeSet.java index 5377c50f..82b14011 100644 --- a/src/main/java/eu/crushedpixel/replaymod/holders/KeyframeSet.java +++ b/src/main/java/eu/crushedpixel/replaymod/holders/KeyframeSet.java @@ -1,11 +1,13 @@ package eu.crushedpixel.replaymod.holders; +import lombok.NoArgsConstructor; import org.apache.commons.lang3.builder.HashCodeBuilder; import java.util.ArrayList; import java.util.Collections; import java.util.List; +@NoArgsConstructor public class KeyframeSet implements GuiEntryListEntry { private String name; private Keyframe[] positionKeyframes; diff --git a/src/main/java/eu/crushedpixel/replaymod/utils/LegacyKeyframeSetAdapter.java b/src/main/java/eu/crushedpixel/replaymod/utils/LegacyKeyframeSetAdapter.java new file mode 100644 index 00000000..a1e8a2f9 --- /dev/null +++ b/src/main/java/eu/crushedpixel/replaymod/utils/LegacyKeyframeSetAdapter.java @@ -0,0 +1,97 @@ +package eu.crushedpixel.replaymod.utils; + +import com.google.gson.Gson; +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import eu.crushedpixel.replaymod.holders.AdvancedPosition; +import eu.crushedpixel.replaymod.holders.Keyframe; +import eu.crushedpixel.replaymod.holders.KeyframeSet; +import eu.crushedpixel.replaymod.holders.TimestampValue; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class LegacyKeyframeSetAdapter extends TypeAdapter { + + public LegacyKeyframeSetAdapter() { + super(); + } + + @Override + public KeyframeSet[] read(JsonReader in) throws IOException { + List sets = new ArrayList(); + + in.beginArray(); + while(in.hasNext()) { //iterate over all array entries + + KeyframeSet set = new KeyframeSet(); + List keyframes = new ArrayList(); + + in.beginObject(); + while(in.hasNext()) { //iterate over all object entries + String jsonTag = in.nextName(); + + if("name".equals(jsonTag)) { + set.setName(in.nextString()); + + } else if("positionKeyframes".equals(jsonTag)) { + in.beginArray(); + while(in.hasNext()) { + Keyframe newKeyframe = new Keyframe(); + + in.beginObject(); + while(in.hasNext()) { + String jsonKeyframeTag = in.nextName(); + if("value".equals(jsonKeyframeTag) || "position".equals(jsonKeyframeTag)) { + AdvancedPosition position = new Gson().fromJson(in, AdvancedPosition.class); + newKeyframe.setValue(position); + } else if("realTimestamp".equals(jsonKeyframeTag)) { + newKeyframe.setRealTimestamp(in.nextInt()); + } + } + in.endObject(); + + keyframes.add(newKeyframe); + } + in.endArray(); + + } else if("timeKeyframes".equals(jsonTag)) { + in.beginArray(); + while(in.hasNext()) { + Keyframe newKeyframe = new Keyframe(); + + in.beginObject(); + while(in.hasNext()) { + String jsonKeyframeTag = in.nextName(); + if("timestamp".equals(jsonKeyframeTag)) { + TimestampValue timestampValue = new TimestampValue(in.nextInt()); + newKeyframe.setValue(timestampValue); + } else if("value".equals(jsonKeyframeTag)) { + TimestampValue timestampValue = new Gson().fromJson(in, TimestampValue.class); + newKeyframe.setValue(timestampValue); + } else if("realTimestamp".equals(jsonKeyframeTag)) { + newKeyframe.setRealTimestamp(in.nextInt()); + } + } + in.endObject(); + + keyframes.add(newKeyframe); + } + in.endArray(); + } + } + in.endObject(); + + set.setKeyframes(keyframes.toArray(new Keyframe[keyframes.size()])); + sets.add(set); + } + in.endArray(); + + return sets.toArray(new KeyframeSet[sets.size()]); + } + + @Override + public void write(JsonWriter out, KeyframeSet[] value) throws IOException {} +} diff --git a/src/main/java/eu/crushedpixel/replaymod/utils/ReplayFile.java b/src/main/java/eu/crushedpixel/replaymod/utils/ReplayFile.java index ba01ca88..04cc9923 100644 --- a/src/main/java/eu/crushedpixel/replaymod/utils/ReplayFile.java +++ b/src/main/java/eu/crushedpixel/replaymod/utils/ReplayFile.java @@ -3,6 +3,7 @@ package eu.crushedpixel.replaymod.utils; import com.google.common.base.Supplier; import com.google.common.reflect.TypeToken; import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import eu.crushedpixel.replaymod.assets.AssetRepository; @@ -100,7 +101,11 @@ public class ReplayFile extends ZipFile { return null; } BufferedReader reader = new BufferedReader(new InputStreamReader(getInputStream(entry))); - return new Gson().fromJson(reader, KeyframeSet[].class); + + GsonBuilder gsonBuilder = new GsonBuilder().registerTypeAdapter(KeyframeSet[].class, new LegacyKeyframeSetAdapter()); + Gson gson = gsonBuilder.create(); + + return gson.fromJson(reader, KeyframeSet[].class); } catch (IOException e) { throw new RuntimeException(e); }