Removed MarkerKeyframe and replaced it with generic type of Keyframe using the new Marker POJO

This commit is contained in:
CrushedPixel
2015-07-13 00:17:29 +02:00
parent bb05e3648d
commit f55f169d01
8 changed files with 82 additions and 75 deletions

View File

@@ -1,7 +1,8 @@
package eu.crushedpixel.replaymod.gui.elements.timelines;
import eu.crushedpixel.replaymod.ReplayMod;
import eu.crushedpixel.replaymod.holders.MarkerKeyframe;
import eu.crushedpixel.replaymod.holders.Keyframe;
import eu.crushedpixel.replaymod.holders.Marker;
import eu.crushedpixel.replaymod.replay.ReplayHandler;
import eu.crushedpixel.replaymod.utils.MouseUtils;
import net.minecraft.client.Minecraft;
@@ -14,7 +15,7 @@ public class GuiMarkerTimeline extends GuiTimeline {
private static final int KEYFRAME_MARKER_X = 109;
private static final int KEYFRAME_MARKER_Y = 20;
private MarkerKeyframe clickedKeyFrame;
private Keyframe<Marker> clickedKeyFrame;
private long clickTime;
private boolean dragging;
@@ -36,7 +37,7 @@ public class GuiMarkerTimeline extends GuiTimeline {
int tolerance = (int) (2 * Math.round(zoom * timelineLength / width));
MarkerKeyframe closest = null;
Keyframe<Marker> closest = null;
if(mouseY >= positionY + BORDER_TOP + 10) {
closest = ReplayHandler.getClosestMarkerForRealTime((int) time, tolerance);
}
@@ -71,14 +72,14 @@ public class GuiMarkerTimeline extends GuiTimeline {
int tolerance = (int) (2 * Math.round(zoom * timelineLength / width));
MarkerKeyframe closest = null;
Keyframe<Marker> closest = null;
if(mouseY >= positionY + BORDER_TOP + 10) {
closest = ReplayHandler.getClosestMarkerForRealTime((int) time, tolerance);
}
if(closest != null) {
//Jump to clicked Marker Keyframe
ReplayHandler.setLastPosition(closest.getPosition());
ReplayHandler.setLastPosition(closest.getValue().getPosition());
ReplayMod.replaySender.jumpToTime(closest.getRealTimestamp());
}
}
@@ -123,7 +124,7 @@ public class GuiMarkerTimeline extends GuiTimeline {
drawTimelineCursor(leftTime, rightTime, bodyWidth);
//Draw Keyframe logos
for (MarkerKeyframe kf : ReplayHandler.getMarkers()) {
for(Keyframe<Marker> kf : ReplayHandler.getMarkers()) {
if (kf != null && !kf.equals(ReplayHandler.getSelectedMarkerKeyframe()))
drawKeyframe(kf, bodyWidth, leftTime, rightTime, segmentLength);
}
@@ -148,12 +149,12 @@ public class GuiMarkerTimeline extends GuiTimeline {
long leftTime = Math.round(timeStart * timelineLength);
double segmentLength = timelineLength * zoom;
for(MarkerKeyframe marker : ReplayHandler.getMarkers()) {
for(Keyframe<Marker> marker : ReplayHandler.getMarkers()) {
int keyframeX = getKeyframeX(marker.getRealTimestamp(), leftTime, bodyWidth, segmentLength);
if(MouseUtils.isMouseWithinBounds(keyframeX - 2, this.positionY + BORDER_TOP + 10 + 1, 5, 5)) {
Point mouse = MouseUtils.getMousePos();
String markerName = marker.getName();
String markerName = marker.getValue().getName();
if(markerName == null) markerName = I18n.format("replaymod.gui.ingame.unnamedmarker");
ReplayMod.tooltipRenderer.drawTooltip(mouse.getX(), mouse.getY(), markerName, null, Color.WHITE);
@@ -166,7 +167,7 @@ public class GuiMarkerTimeline extends GuiTimeline {
}
}
private void drawKeyframe(MarkerKeyframe kf, int bodyWidth, long leftTime, long rightTime, double segmentLength) {
private void drawKeyframe(Keyframe kf, int bodyWidth, long leftTime, long rightTime, double segmentLength) {
if (kf.getRealTimestamp() <= rightTime && kf.getRealTimestamp() >= leftTime) {
int textureX = KEYFRAME_MARKER_X;
int textureY = KEYFRAME_MARKER_Y;

View File

@@ -0,0 +1,20 @@
package eu.crushedpixel.replaymod.holders;
import eu.crushedpixel.replaymod.interpolation.KeyframeValue;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Marker implements KeyframeValue {
private String name;
private AdvancedPosition position;
@Override
public KeyframeValue newInstance() {
return new Marker();
}
}

View File

@@ -1,14 +0,0 @@
package eu.crushedpixel.replaymod.holders;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class MarkerKeyframe {
private int realTimestamp;
private AdvancedPosition position;
private String name;
}

View File

@@ -3,7 +3,8 @@ package eu.crushedpixel.replaymod.recording;
import com.google.common.hash.Hashing;
import com.google.common.io.Files;
import eu.crushedpixel.replaymod.ReplayMod;
import eu.crushedpixel.replaymod.holders.MarkerKeyframe;
import eu.crushedpixel.replaymod.holders.Keyframe;
import eu.crushedpixel.replaymod.holders.Marker;
import eu.crushedpixel.replaymod.holders.PacketData;
import eu.crushedpixel.replaymod.utils.ReplayFile;
import eu.crushedpixel.replaymod.utils.ReplayFileIO;
@@ -35,7 +36,7 @@ public abstract class DataListener extends ChannelInboundHandlerAdapter {
protected boolean alive = true;
protected DataWriter dataWriter;
protected Set<String> players = new HashSet<String>();
protected Set<MarkerKeyframe> markers = new HashSet<MarkerKeyframe>();
protected Set<Keyframe<Marker>> markers = new HashSet<Keyframe<Marker>>();
private boolean singleplayer;
private int saveState = 0; //0: Idle, 1: Saving, 2: Saved
@@ -161,7 +162,7 @@ public abstract class DataListener extends ChannelInboundHandlerAdapter {
queue.add(new PacketData(bytes, timestamp));
}
public void requestFinish(Set<String> players, Set<MarkerKeyframe> markers) {
public void requestFinish(Set<String> players, Set<Keyframe<Marker>> markers) {
active = false;
try {

View File

@@ -7,8 +7,9 @@ import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import eu.crushedpixel.replaymod.ReplayMod;
import eu.crushedpixel.replaymod.chat.ChatMessageHandler;
import eu.crushedpixel.replaymod.holders.MarkerKeyframe;
import eu.crushedpixel.replaymod.holders.AdvancedPosition;
import eu.crushedpixel.replaymod.holders.Keyframe;
import eu.crushedpixel.replaymod.holders.Marker;
import eu.crushedpixel.replaymod.utils.ReplayFileIO;
import io.netty.channel.ChannelHandlerContext;
import net.minecraft.client.Minecraft;
@@ -207,7 +208,7 @@ public class PacketListener extends DataListener {
AdvancedPosition pos = new AdvancedPosition(Minecraft.getMinecraft().getRenderViewEntity(), false);
int timestamp = (int) (System.currentTimeMillis() - startTime);
MarkerKeyframe marker = new MarkerKeyframe(timestamp, pos, null);
Keyframe<Marker> marker = new Keyframe<Marker>(timestamp, new Marker(null, pos));
markers.add(marker);

View File

@@ -47,7 +47,7 @@ public class ReplayHandler {
private static int realTimelinePosition = 0;
private static Keyframe selectedKeyframe;
private static MarkerKeyframe selectedMarkerKeyframe;
private static Keyframe<Marker> selectedMarkerKeyframe;
private static boolean inPath = false;
private static CameraEntity cameraEntity;
@@ -59,8 +59,8 @@ public class ReplayHandler {
private static Entity currentEntity = null;
private static AdvancedPosition lastPosition = null;
private static MarkerKeyframe[] initialMarkers = new MarkerKeyframe[0];
private static List<MarkerKeyframe> markerKeyframes = new ArrayList<MarkerKeyframe>();
private static Keyframe<Marker>[] initialMarkers = new Keyframe[0];
private static List<Keyframe<Marker>> markerKeyframes = new ArrayList<Keyframe<Marker>>();
private static float cameraTilt = 0;
@@ -95,11 +95,11 @@ public class ReplayHandler {
}
}
public static MarkerKeyframe[] getMarkers() {
return markerKeyframes.toArray(new MarkerKeyframe[markerKeyframes.size()]);
public static Keyframe<Marker>[] getMarkers() {
return markerKeyframes.toArray(new Keyframe[markerKeyframes.size()]);
}
public static void setMarkers(MarkerKeyframe[] m, boolean write) {
public static void setMarkers(Keyframe<Marker>[] m, boolean write) {
markerKeyframes.clear();
Collections.addAll(markerKeyframes, m);
@@ -232,7 +232,7 @@ public class ReplayHandler {
else {
AdvancedPosition pos = new AdvancedPosition(mc.getRenderViewEntity(), false);
int timestamp = ReplayMod.replaySender.currentTimeStamp();
markerKeyframes.add(new MarkerKeyframe(timestamp, pos, null));
markerKeyframes.add(new Keyframe<Marker>(timestamp, new Marker(null, pos)));
}
}
@@ -291,17 +291,17 @@ public class ReplayHandler {
fireKeyframesModifyEvent();
}
public static MarkerKeyframe getClosestMarkerForRealTime(int realTime, int tolerance) {
List<MarkerKeyframe> found = new ArrayList<MarkerKeyframe>();
for(MarkerKeyframe kf : markerKeyframes) {
public static Keyframe<Marker> getClosestMarkerForRealTime(int realTime, int tolerance) {
List<Keyframe<Marker>> found = new ArrayList<Keyframe<Marker>>();
for(Keyframe<Marker> kf : markerKeyframes) {
if(Math.abs(kf.getRealTimestamp() - realTime) <= tolerance) {
found.add(kf);
}
}
MarkerKeyframe closest = null;
Keyframe<Marker> closest = null;
for(MarkerKeyframe kf : found) {
for(Keyframe<Marker> kf : found) {
if(closest == null || Math.abs(closest.getRealTimestamp() - realTime) > Math.abs(kf.getRealTimestamp() - realTime)) {
closest = kf;
}
@@ -309,15 +309,15 @@ public class ReplayHandler {
return closest;
}
public static MarkerKeyframe getPreviousMarkerKeyframe(int realTime) {
public static Keyframe<Marker> getPreviousMarkerKeyframe(int realTime) {
if(markerKeyframes.isEmpty()) return null;
MarkerKeyframe backup = null;
List<MarkerKeyframe> found = new ArrayList<MarkerKeyframe>();
for(MarkerKeyframe kf : markerKeyframes) {
Keyframe<Marker> backup = null;
List<Keyframe<Marker>> found = new ArrayList<Keyframe<Marker>>();
for(Keyframe<Marker> kf : markerKeyframes) {
if(kf.getRealTimestamp() < realTime) {
found.add((MarkerKeyframe)kf);
found.add((Keyframe<Marker>)kf);
} else if(kf.getRealTimestamp() == realTime) {
backup = (MarkerKeyframe)kf;
backup = (Keyframe<Marker>)kf;
}
}
@@ -326,10 +326,10 @@ public class ReplayHandler {
else return backup;
}
public static MarkerKeyframe getNextMarkerKeyframe(int realTime) {
public static Keyframe<Marker> getNextMarkerKeyframe(int realTime) {
if(markerKeyframes.isEmpty()) return null;
MarkerKeyframe backup = null;
for(MarkerKeyframe kf : markerKeyframes) {
Keyframe<Marker> backup = null;
for(Keyframe<Marker> kf : markerKeyframes) {
if(kf.getRealTimestamp() > realTime) {
return kf; //first found element is next
} else if(kf.getRealTimestamp() == realTime) {
@@ -384,19 +384,15 @@ public class ReplayHandler {
fireKeyframesModifyEvent();
}
public static boolean isSelected(Keyframe kf) {
return kf == selectedKeyframe;
}
public static void selectKeyframe(Keyframe kf) {
selectedKeyframe = kf;
}
public static boolean isSelected(MarkerKeyframe kf) {
return kf == selectedMarkerKeyframe;
public static boolean isSelected(Keyframe<Marker> kf) {
return kf == selectedMarkerKeyframe || kf == selectedMarkerKeyframe;
}
public static void selectMarkerKeyframe(MarkerKeyframe kf) { selectedMarkerKeyframe = kf; }
public static void selectMarkerKeyframe(Keyframe<Marker> kf) { selectedMarkerKeyframe = kf; }
public static boolean isInReplay() {
return inReplay;
@@ -444,8 +440,10 @@ public class ReplayHandler {
KeyframeSet[] paths = currentReplayFile.paths().get();
ReplayHandler.setKeyframeRepository(paths == null ? new KeyframeSet[0] : paths, false);
MarkerKeyframe[] markers = currentReplayFile.markers().get();
if(markers == null) markers = new MarkerKeyframe[0];
List<Keyframe<Marker>> markerList = currentReplayFile.markers().get();
Keyframe<Marker>[] markers;
if(markerList == null) markers = new Keyframe[0];
else markers = markerList.toArray(new Keyframe[markerList.size()]);
ReplayHandler.setMarkers(markers, false);
ReplayHandler.initialMarkers = markers;
@@ -557,7 +555,7 @@ public class ReplayHandler {
return selectedKeyframe;
}
public static MarkerKeyframe getSelectedMarkerKeyframe() { return selectedMarkerKeyframe; }
public static Keyframe<Marker> getSelectedMarkerKeyframe() { return selectedMarkerKeyframe; }
public static int getRealTimelineCursor() {
return realTimelinePosition;

View File

@@ -1,13 +1,15 @@
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.JsonElement;
import com.google.gson.JsonObject;
import eu.crushedpixel.replaymod.assets.AssetRepository;
import eu.crushedpixel.replaymod.assets.CustomObjectRepository;
import eu.crushedpixel.replaymod.holders.Keyframe;
import eu.crushedpixel.replaymod.holders.KeyframeSet;
import eu.crushedpixel.replaymod.holders.MarkerKeyframe;
import eu.crushedpixel.replaymod.holders.Marker;
import eu.crushedpixel.replaymod.holders.PlayerVisibility;
import eu.crushedpixel.replaymod.recording.ReplayMetaData;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
@@ -16,10 +18,8 @@ import org.apache.commons.compress.archivers.zip.ZipFile;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.lang.reflect.Type;
import java.util.*;
public class ReplayFile extends ZipFile {
@@ -135,17 +135,20 @@ public class ReplayFile extends ZipFile {
return getEntry(ENTRY_MARKERS);
}
public Supplier<MarkerKeyframe[]> markers() {
return new Supplier<MarkerKeyframe[]>() {
public Supplier<List<Keyframe<Marker>>> markers() {
return new Supplier<List<Keyframe<Marker>>>() {
@Override
public MarkerKeyframe[] get() {
public List<Keyframe<Marker>> get() {
try {
ZipArchiveEntry entry = markersEntry();
if (entry == null) {
return null;
}
BufferedReader reader = new BufferedReader(new InputStreamReader(getInputStream(entry)));
return new Gson().fromJson(reader, MarkerKeyframe[].class);
Type keyframeType = new TypeToken<ArrayList<Keyframe<Marker>>>(){}.getType();
return new Gson().fromJson(reader, keyframeType);
} catch (IOException e) {
throw new RuntimeException(e);
}

View File

@@ -3,10 +3,7 @@ package eu.crushedpixel.replaymod.utils;
import com.google.gson.Gson;
import eu.crushedpixel.replaymod.ReplayMod;
import eu.crushedpixel.replaymod.assets.CustomObjectRepository;
import eu.crushedpixel.replaymod.holders.KeyframeSet;
import eu.crushedpixel.replaymod.holders.MarkerKeyframe;
import eu.crushedpixel.replaymod.holders.PacketData;
import eu.crushedpixel.replaymod.holders.PlayerVisibility;
import eu.crushedpixel.replaymod.holders.*;
import eu.crushedpixel.replaymod.recording.PacketSerializer;
import eu.crushedpixel.replaymod.recording.ReplayMetaData;
import io.netty.buffer.ByteBuf;
@@ -53,7 +50,7 @@ public class ReplayFileIO {
return files;
}
public static void writeReplayFile(File replayFile, File tempFile, ReplayMetaData metaData, Set<MarkerKeyframe> markers,
public static void writeReplayFile(File replayFile, File tempFile, ReplayMetaData metaData, Set<Keyframe<Marker>> markers,
Map<String, File> resourcePacks, Map<Integer, String> resourcePackRequests) throws IOException {
byte[] buffer = new byte[1024];
@@ -82,7 +79,7 @@ public class ReplayFileIO {
zos.putNextEntry(new ZipEntry(ReplayFile.ENTRY_MARKERS));
pw = new PrintWriter(zos);
pw.write(new Gson().toJson(markers.toArray(new MarkerKeyframe[markers.size()])));
pw.write(new Gson().toJson(markers.toArray(new Keyframe[markers.size()])));
pw.flush();
zos.closeEntry();
}
@@ -166,7 +163,7 @@ public class ReplayFileIO {
write((Object) metaData, file);
}
public static void write(MarkerKeyframe[] markers, File file) throws IOException {
public static void write(Keyframe<Marker>[] markers, File file) throws IOException {
write((Object) markers, file);
}