diff --git a/src/main/java/eu/crushedpixel/replaymod/studio/StudioImplementation.java b/src/main/java/eu/crushedpixel/replaymod/studio/StudioImplementation.java index c57c20ac..b14c78e6 100755 --- a/src/main/java/eu/crushedpixel/replaymod/studio/StudioImplementation.java +++ b/src/main/java/eu/crushedpixel/replaymod/studio/StudioImplementation.java @@ -1,5 +1,8 @@ package eu.crushedpixel.replaymod.studio; +import com.google.common.base.Optional; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import de.johni0702.replaystudio.PacketData; import de.johni0702.replaystudio.filter.ChangeTimestampFilter; @@ -13,11 +16,15 @@ import de.johni0702.replaystudio.replay.ZipReplayFile; import de.johni0702.replaystudio.stream.PacketStream; import de.johni0702.replaystudio.studio.ReplayStudio; import eu.crushedpixel.replaymod.gui.elements.listeners.ProgressUpdateListener; +import eu.crushedpixel.replaymod.holders.Keyframe; +import eu.crushedpixel.replaymod.holders.KeyframeSet; +import eu.crushedpixel.replaymod.holders.TimestampValue; +import eu.crushedpixel.replaymod.utils.LegacyKeyframeSetAdapter; import net.minecraft.client.resources.I18n; +import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.Validate; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.util.ArrayList; import java.util.List; @@ -64,6 +71,8 @@ public class StudioImplementation { metaData.setDuration(ending - beginning); replayFile.writeMetaData(metaData); + shiftPaths(replayFile, beginning, ending); + updateListener.onProgressChanged(9/10f, I18n.format("replaymod.gui.editor.progress.status.writing.final")); replayFile.saveTo(outputFile); @@ -71,6 +80,49 @@ public class StudioImplementation { updateListener.onProgressChanged(1f, I18n.format("replaymod.gui.editor.progress.status.finished")); } + private static void shiftPaths(ReplayFile replayFile, int beginning, int ending) throws IOException { + Optional in = replayFile.get(eu.crushedpixel.replaymod.utils.ReplayFile.ENTRY_PATHS); + if (!in.isPresent()) { + in = replayFile.get(eu.crushedpixel.replaymod.utils.ReplayFile.ENTRY_PATHS_OLD); + if (!in.isPresent()) { + return; + } + } + + KeyframeSet[] keyframeSets = new GsonBuilder() + .registerTypeAdapter(KeyframeSet[].class, new LegacyKeyframeSetAdapter()) + .create().fromJson(new InputStreamReader(in.get()), KeyframeSet[].class); + IOUtils.closeQuietly(in.get()); + List resultSets = new ArrayList(); + for (KeyframeSet set : keyframeSets) { + List> resultKeyframes = new ArrayList>(); + int timeKeyframes = 0; + for (Keyframe keyframe : set.getKeyframes()) { + Object value = keyframe.getValue(); + if (value instanceof TimestampValue) { + int time = ((TimestampValue) value).asInt(); + if (time > beginning && time < ending) { + Keyframe copy = keyframe.copy(); + ((TimestampValue) copy.getValue()).value = time - beginning; + resultKeyframes.add(copy); + timeKeyframes++; + } + } else { + resultKeyframes.add(keyframe); + } + } + if (timeKeyframes >= 2) { + Keyframe[] keyframes = resultKeyframes.toArray(new Keyframe[resultKeyframes.size()]); + resultSets.add(new KeyframeSet(set.getName(), keyframes)); + } + } + + Writer out = new OutputStreamWriter(replayFile.write(eu.crushedpixel.replaymod.utils.ReplayFile.ENTRY_PATHS)); + new Gson().toJson(resultSets.toArray(new KeyframeSet[resultSets.size()]), out); + out.flush(); + out.close(); + } + public static void connectReplayFiles(List filesToConnect, File outputFile, ProgressUpdateListener updateListener) throws IOException { updateListener.onProgressChanged(0f, I18n.format("replaymod.gui.editor.progress.status.initializing"));