Added and fixed basic saving of recording player
This commit is contained in:
@@ -24,6 +24,16 @@ public class ReplayMod
|
|||||||
|
|
||||||
//TODO: Set ReplayHandler replaying to false when replay is exited
|
//TODO: Set ReplayHandler replaying to false when replay is exited
|
||||||
|
|
||||||
|
//XXX
|
||||||
|
//Known Bugs
|
||||||
|
//
|
||||||
|
//Keyframe removal doesn't seem to properly work
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
public static final String MODID = "replaymod";
|
public static final String MODID = "replaymod";
|
||||||
public static final String VERSION = "0.0.1";
|
public static final String VERSION = "0.0.1";
|
||||||
|
|
||||||
@@ -32,6 +42,8 @@ public class ReplayMod
|
|||||||
public static ReplaySettings replaySettings = new ReplaySettings(0, true, true, true, false);
|
public static ReplaySettings replaySettings = new ReplaySettings(0, true, true, true, false);
|
||||||
public static Configuration config;
|
public static Configuration config;
|
||||||
|
|
||||||
|
public static RecordingHandler recordingHandler;
|
||||||
|
|
||||||
public static int PLAYER_ID = -1;
|
public static int PLAYER_ID = -1;
|
||||||
|
|
||||||
// The instance of your mod that Forge uses.
|
// The instance of your mod that Forge uses.
|
||||||
@@ -62,9 +74,9 @@ public class ReplayMod
|
|||||||
FMLCommonHandler.instance().bus().register(tickHandler);
|
FMLCommonHandler.instance().bus().register(tickHandler);
|
||||||
MinecraftForge.EVENT_BUS.register(tickHandler);
|
MinecraftForge.EVENT_BUS.register(tickHandler);
|
||||||
|
|
||||||
RecordingHandler rh = new RecordingHandler();
|
recordingHandler = new RecordingHandler();
|
||||||
FMLCommonHandler.instance().bus().register(rh);
|
FMLCommonHandler.instance().bus().register(recordingHandler);
|
||||||
MinecraftForge.EVENT_BUS.register(rh);
|
MinecraftForge.EVENT_BUS.register(recordingHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
|
|||||||
@@ -39,9 +39,13 @@ public class CameraEntity extends Entity {
|
|||||||
mc.thePlayer.rotationYaw = ReplayHandler.getCameraEntity().rotationYaw;
|
mc.thePlayer.rotationYaw = ReplayHandler.getCameraEntity().rotationYaw;
|
||||||
|
|
||||||
//removes water/suffocation/shadow overlays in screen
|
//removes water/suffocation/shadow overlays in screen
|
||||||
mc.thePlayer.posX = 0;
|
//mc.thePlayer.posX = 0;
|
||||||
mc.thePlayer.posY = 500;
|
//mc.thePlayer.posY = 500;
|
||||||
mc.thePlayer.posZ = 0;
|
//mc.thePlayer.posZ = 0;
|
||||||
|
|
||||||
|
mc.thePlayer.posX = ReplayHandler.getCameraEntity().posX;
|
||||||
|
mc.thePlayer.posY = ReplayHandler.getCameraEntity().posY;
|
||||||
|
mc.thePlayer.posZ = ReplayHandler.getCameraEntity().posZ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(direction == null || motion < 0.1) {
|
if(direction == null || motion < 0.1) {
|
||||||
|
|||||||
@@ -15,8 +15,10 @@ import net.minecraft.client.renderer.GlStateManager;
|
|||||||
import net.minecraft.client.settings.KeyBinding;
|
import net.minecraft.client.settings.KeyBinding;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.util.ResourceLocation;
|
||||||
|
import net.minecraftforge.client.GuiIngameForge;
|
||||||
import net.minecraftforge.client.event.MouseEvent;
|
import net.minecraftforge.client.event.MouseEvent;
|
||||||
import net.minecraftforge.client.event.RenderGameOverlayEvent;
|
import net.minecraftforge.client.event.RenderGameOverlayEvent;
|
||||||
|
import net.minecraftforge.client.event.RenderHandEvent;
|
||||||
import net.minecraftforge.client.event.RenderWorldLastEvent;
|
import net.minecraftforge.client.event.RenderWorldLastEvent;
|
||||||
import net.minecraftforge.fml.client.FMLClientHandler;
|
import net.minecraftforge.fml.client.FMLClientHandler;
|
||||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||||
@@ -82,6 +84,13 @@ public class GuiReplayOverlay extends Gui {
|
|||||||
} catch(Exception e) {}
|
} catch(Exception e) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
|
public void renderHand(RenderHandEvent event) {
|
||||||
|
if(ReplayHandler.replayActive()) {
|
||||||
|
event.setCanceled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void tick(TickEvent event) {
|
public void tick(TickEvent event) {
|
||||||
if(!ReplayHandler.replayActive()) return;
|
if(!ReplayHandler.replayActive()) return;
|
||||||
@@ -114,7 +123,12 @@ public class GuiReplayOverlay extends Gui {
|
|||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void onRenderGui(RenderGameOverlayEvent.Post event) throws IllegalArgumentException, IllegalAccessException {
|
public void onRenderGui(RenderGameOverlayEvent.Post event) throws IllegalArgumentException, IllegalAccessException {
|
||||||
if(!ReplayHandler.replayActive()) return;
|
if(!ReplayHandler.replayActive()) {
|
||||||
|
GuiIngameForge.renderExperiance = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
GuiIngameForge.renderExperiance = false;
|
||||||
GL11.glEnable(GL11.GL_BLEND);
|
GL11.glEnable(GL11.GL_BLEND);
|
||||||
drawBlockOutline.set(Minecraft.getMinecraft().entityRenderer, false);
|
drawBlockOutline.set(Minecraft.getMinecraft().entityRenderer, false);
|
||||||
|
|
||||||
@@ -289,7 +303,10 @@ public class GuiReplayOverlay extends Gui {
|
|||||||
Mouse.setCursorPosition(width/2, height/2);
|
Mouse.setCursorPosition(width/2, height/2);
|
||||||
}
|
}
|
||||||
|
|
||||||
speedSlider.drawButton(mc, mouseX, mouseY);
|
try {
|
||||||
|
speedSlider.drawButton(mc, mouseX, mouseY);
|
||||||
|
} catch(Exception e) {}
|
||||||
|
|
||||||
GlStateManager.resetColor();
|
GlStateManager.resetColor();
|
||||||
|
|
||||||
Entity player = ReplayHandler.getCameraEntity();
|
Entity player = ReplayHandler.getCameraEntity();
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ public class RecordingHandler {
|
|||||||
|
|
||||||
private Minecraft mc = Minecraft.getMinecraft();
|
private Minecraft mc = Minecraft.getMinecraft();
|
||||||
|
|
||||||
private int entityID = Integer.MAX_VALUE;
|
private int entityID = Integer.MIN_VALUE+9001;
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void onPlayerJoin(EntityJoinWorldEvent e) throws IOException {
|
public void onPlayerJoin(EntityJoinWorldEvent e) throws IOException {
|
||||||
@@ -55,14 +55,12 @@ public class RecordingHandler {
|
|||||||
ppli.readPacketData(pbuf);
|
ppli.readPacketData(pbuf);
|
||||||
ConnectionEventHandler.insertPacket(ppli);
|
ConnectionEventHandler.insertPacket(ppli);
|
||||||
|
|
||||||
//Packet packet = new S0CPacketSpawnPlayer((EntityPlayer)e.entity);
|
S0CPacketSpawnPlayer packet = new S0CPacketSpawnPlayer();
|
||||||
Packet packet = new S0CPacketSpawnPlayer();
|
|
||||||
|
|
||||||
ByteBuf bb = Unpooled.buffer();
|
ByteBuf bb = Unpooled.buffer();
|
||||||
PacketBuffer pb = new PacketBuffer(bb);
|
PacketBuffer pb = new PacketBuffer(bb);
|
||||||
|
|
||||||
pb.writeVarIntToBuffer(entityID);
|
pb.writeVarIntToBuffer(entityID);
|
||||||
//pb.writeUuid((e.entity).getUniqueID());
|
|
||||||
pb.writeUuid(e.entity.getUniqueID());
|
pb.writeUuid(e.entity.getUniqueID());
|
||||||
|
|
||||||
pb.writeInt(MathHelper.floor_double(e.entity.posX * 32.0D));
|
pb.writeInt(MathHelper.floor_double(e.entity.posX * 32.0D));
|
||||||
@@ -80,18 +78,42 @@ public class RecordingHandler {
|
|||||||
ConnectionEventHandler.insertPacket(packet);
|
ConnectionEventHandler.insertPacket(packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Double lastX = null, lastY = null, lastZ = null;
|
||||||
|
|
||||||
|
public void resetLastPositions() {
|
||||||
|
lastX = lastY = lastZ = null;
|
||||||
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void onPlayerTick(PlayerTickEvent e) {
|
public void onPlayerTick(PlayerTickEvent e) {
|
||||||
if(e.player != mc.thePlayer) return;
|
if(e.player != mc.thePlayer) return;
|
||||||
if(!ConnectionEventHandler.isRecording()) return;
|
if(!ConnectionEventHandler.isRecording()) return;
|
||||||
|
|
||||||
double dx = e.player.prevPosX - e.player.posX;
|
boolean force = false;
|
||||||
double dy = e.player.prevPosY - e.player.posY;
|
if(lastX == null || lastY == null || lastZ == null) {
|
||||||
double dz = e.player.prevPosZ - e.player.posZ;
|
force = true;
|
||||||
|
lastX = e.player.posX;
|
||||||
|
lastY = e.player.posY;
|
||||||
|
lastZ = e.player.posZ;
|
||||||
|
}
|
||||||
|
|
||||||
|
double dx = e.player.posX - lastX;
|
||||||
|
double dy = e.player.posY - lastY;
|
||||||
|
double dz = e.player.posZ - lastZ;
|
||||||
|
|
||||||
|
lastX = e.player.posX;
|
||||||
|
lastY = e.player.posY;
|
||||||
|
lastZ = e.player.posZ;
|
||||||
|
|
||||||
|
Packet packet = null;
|
||||||
|
if(force || Math.abs(dx) > 4.0 || Math.abs(dy) > 4.0 || Math.abs(dz) > 4.0) {
|
||||||
|
int x = MathHelper.floor_double(e.player.posX * 32.0D);
|
||||||
|
int y = MathHelper.floor_double(e.player.posY * 32.0D);
|
||||||
|
int z = MathHelper.floor_double(e.player.posZ * 32.0D);
|
||||||
|
byte yaw = (byte)((int)(e.player.rotationYaw * 256.0F / 360.0F));
|
||||||
|
byte pitch = (byte)((int)(e.player.rotationPitch * 256.0F / 360.0F));
|
||||||
|
packet = new S18PacketEntityTeleport(entityID, x, y, z, yaw, pitch, e.player.onGround);
|
||||||
|
|
||||||
Packet packet;
|
|
||||||
if(Math.abs(dx) > 4.0 || Math.abs(dy) > 4.0 || Math.abs(dz) > 4.0) {
|
|
||||||
packet = new S18PacketEntityTeleport(e.player);
|
|
||||||
} else {
|
} else {
|
||||||
byte oldYaw = (byte)((int)(e.player.prevRotationYaw * 256.0F / 360.0F));
|
byte oldYaw = (byte)((int)(e.player.prevRotationYaw * 256.0F / 360.0F));
|
||||||
byte newYaw = (byte)((int)(e.player.rotationYaw * 256.0F / 360.0F));
|
byte newYaw = (byte)((int)(e.player.rotationYaw * 256.0F / 360.0F));
|
||||||
@@ -105,7 +127,8 @@ public class RecordingHandler {
|
|||||||
(byte)Math.round(dx*32), (byte)Math.round(dy*32), (byte)Math.round(dz*32),
|
(byte)Math.round(dx*32), (byte)Math.round(dy*32), (byte)Math.round(dz*32),
|
||||||
dYaw, dPitch, e.player.onGround);
|
dYaw, dPitch, e.player.onGround);
|
||||||
}
|
}
|
||||||
|
if(packet != null) {
|
||||||
ConnectionEventHandler.insertPacket(packet);
|
ConnectionEventHandler.insertPacket(packet);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ public class ConnectionEventHandler {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
packetListener.channelRead(null, packet);
|
packetListener.saveOnly(packet);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
@@ -62,6 +62,8 @@ public class ConnectionEventHandler {
|
|||||||
|
|
||||||
ChatMessageRequests.initialize();
|
ChatMessageRequests.initialize();
|
||||||
|
|
||||||
|
ReplayMod.recordingHandler.resetLastPositions();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if(event.isLocal) {
|
if(event.isLocal) {
|
||||||
if(!ReplayMod.replaySettings.isEnableRecordingSingleplayer()) {
|
if(!ReplayMod.replaySettings.isEnableRecordingSingleplayer()) {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import io.netty.channel.ChannelHandlerContext;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
import net.minecraft.entity.DataWatcher;
|
import net.minecraft.entity.DataWatcher;
|
||||||
@@ -28,6 +29,17 @@ public class PacketListener extends DataListener {
|
|||||||
|
|
||||||
private static final PacketSerializer packetSerializer = new PacketSerializer(EnumPacketDirection.CLIENTBOUND);
|
private static final PacketSerializer packetSerializer = new PacketSerializer(EnumPacketDirection.CLIENTBOUND);
|
||||||
|
|
||||||
|
public void saveOnly(Packet packet) {
|
||||||
|
try {
|
||||||
|
PacketData pd = getPacketData(context, packet);
|
||||||
|
dataWriter.writeData(pd);
|
||||||
|
lastSentPacket = pd.getTimestamp();
|
||||||
|
} catch(Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
|
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
|
||||||
if(ctx == null) {
|
if(ctx == null) {
|
||||||
@@ -46,51 +58,9 @@ public class PacketListener extends DataListener {
|
|||||||
try {
|
try {
|
||||||
Packet packet = (Packet)msg;
|
Packet packet = (Packet)msg;
|
||||||
|
|
||||||
if(startTime == null) startTime = System.currentTimeMillis();
|
PacketData pd = getPacketData(ctx, packet);
|
||||||
|
dataWriter.writeData(pd);
|
||||||
int timestamp = (int)(System.currentTimeMillis() - startTime);
|
lastSentPacket = pd.getTimestamp();
|
||||||
|
|
||||||
//Converts the packet back to a ByteBuffer for correct saving
|
|
||||||
|
|
||||||
ByteBuf bb = Unpooled.buffer();
|
|
||||||
if(packet instanceof S0FPacketSpawnMob) {
|
|
||||||
Field field_149043_l = S0FPacketSpawnMob.class.getDeclaredField(MCPNames.field("field_149043_l"));
|
|
||||||
field_149043_l.setAccessible(true);
|
|
||||||
DataWatcher l = (DataWatcher)field_149043_l.get(packet);
|
|
||||||
DataWatcher dw = new DataWatcher(null);
|
|
||||||
if(l == null) {
|
|
||||||
field_149043_l.set(packet, dw);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(packet instanceof S0CPacketSpawnPlayer) {
|
|
||||||
Field field_149043_l = S0CPacketSpawnPlayer.class.getDeclaredField(MCPNames.field("field_148960_i"));
|
|
||||||
field_149043_l.setAccessible(true);
|
|
||||||
DataWatcher l = (DataWatcher)field_149043_l.get(packet);
|
|
||||||
DataWatcher dw = new DataWatcher(null);
|
|
||||||
if(l == null) {
|
|
||||||
field_149043_l.set(packet, dw);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
packetSerializer.encode(ctx, packet, bb);
|
|
||||||
|
|
||||||
bb.readerIndex(0);
|
|
||||||
byte[] array = new byte[bb.readableBytes()];
|
|
||||||
bb.readBytes(array);
|
|
||||||
|
|
||||||
totalBytes += (array.length + (2*4)); //two Integer values and the Packet size
|
|
||||||
if(totalBytes >= maxSize && maxSize > 0) {
|
|
||||||
ChatMessageRequests.addChatMessage("Maximum file size exceeded", ChatMessageType.WARNING);
|
|
||||||
ChatMessageRequests.addChatMessage("The Recording has been stopped", ChatMessageType.WARNING);
|
|
||||||
alive = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bb.readerIndex(0);
|
|
||||||
|
|
||||||
dataWriter.writeData(new PacketData(array, timestamp));
|
|
||||||
|
|
||||||
lastSentPacket = timestamp;
|
|
||||||
} catch(Exception e) {
|
} catch(Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
@@ -100,4 +70,51 @@ public class PacketListener extends DataListener {
|
|||||||
super.channelRead(ctx, msg);
|
super.channelRead(ctx, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private PacketData getPacketData(ChannelHandlerContext ctx, Packet packet) throws IOException, IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException {
|
||||||
|
|
||||||
|
if(startTime == null) startTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
int timestamp = (int)(System.currentTimeMillis() - startTime);
|
||||||
|
|
||||||
|
//Converts the packet back to a ByteBuffer for correct saving
|
||||||
|
|
||||||
|
ByteBuf bb = Unpooled.buffer();
|
||||||
|
if(packet instanceof S0FPacketSpawnMob) {
|
||||||
|
Field field_149043_l = S0FPacketSpawnMob.class.getDeclaredField(MCPNames.field("field_149043_l"));
|
||||||
|
field_149043_l.setAccessible(true);
|
||||||
|
DataWatcher l = (DataWatcher)field_149043_l.get(packet);
|
||||||
|
DataWatcher dw = new DataWatcher(null);
|
||||||
|
if(l == null) {
|
||||||
|
field_149043_l.set(packet, dw);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(packet instanceof S0CPacketSpawnPlayer) {
|
||||||
|
Field field_149043_l = S0CPacketSpawnPlayer.class.getDeclaredField(MCPNames.field("field_148960_i"));
|
||||||
|
field_149043_l.setAccessible(true);
|
||||||
|
DataWatcher l = (DataWatcher)field_149043_l.get(packet);
|
||||||
|
DataWatcher dw = new DataWatcher(null);
|
||||||
|
if(l == null) {
|
||||||
|
field_149043_l.set(packet, dw);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
packetSerializer.encode(ctx, packet, bb);
|
||||||
|
|
||||||
|
bb.readerIndex(0);
|
||||||
|
byte[] array = new byte[bb.readableBytes()];
|
||||||
|
bb.readBytes(array);
|
||||||
|
|
||||||
|
totalBytes += (array.length + (2*4)); //two Integer values and the Packet size
|
||||||
|
if(totalBytes >= maxSize && maxSize > 0) {
|
||||||
|
ChatMessageRequests.addChatMessage("Maximum file size exceeded", ChatMessageType.WARNING);
|
||||||
|
ChatMessageRequests.addChatMessage("The Recording has been stopped", ChatMessageType.WARNING);
|
||||||
|
alive = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bb.readerIndex(0);
|
||||||
|
|
||||||
|
return new PacketData(array, timestamp);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -229,18 +229,13 @@ public class ReplayHandler {
|
|||||||
|
|
||||||
public static void resetKeyframes() {
|
public static void resetKeyframes() {
|
||||||
keyframes = new ArrayList<Keyframe>();
|
keyframes = new ArrayList<Keyframe>();
|
||||||
|
|
||||||
selectKeyframe(null);
|
selectKeyframe(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setReplayPos(int pos) {
|
public static void setReplayPos(int pos) {
|
||||||
if(replaySender != null) {
|
if(replaySender != null) {
|
||||||
replaySender.jumpToTime(pos, false);
|
replaySender.jumpToTime(pos);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void forceReplayPos(int pos) {
|
|
||||||
if(replaySender != null) {
|
|
||||||
replaySender.jumpToTime(pos, true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ public class ReplayProcess {
|
|||||||
if(ts < ReplayHandler.getReplayTime()) {
|
if(ts < ReplayHandler.getReplayTime()) {
|
||||||
mc.displayGuiScreen((GuiScreen)null);
|
mc.displayGuiScreen((GuiScreen)null);
|
||||||
}
|
}
|
||||||
ReplayHandler.forceReplayPos(ts);
|
ReplayHandler.setReplayPos(ts);
|
||||||
}
|
}
|
||||||
|
|
||||||
ChatMessageRequests.addChatMessage("Replay started!", ChatMessageType.INFORMATION);
|
ChatMessageRequests.addChatMessage("Replay started!", ChatMessageType.INFORMATION);
|
||||||
@@ -188,28 +188,19 @@ public class ReplayProcess {
|
|||||||
pos = motionLinear.getPoint(Math.max(0, Math.min(1, splinePos)));
|
pos = motionLinear.getPoint(Math.max(0, Math.min(1, splinePos)));
|
||||||
}
|
}
|
||||||
|
|
||||||
int curPos = timeLinear.getPoint(Math.max(0, Math.min(1, timePos)));
|
Integer curPos = null;
|
||||||
|
if(timeLinear != null) {
|
||||||
//set replay speed
|
curPos = timeLinear.getPoint(Math.max(0, Math.min(1, timePos)));
|
||||||
if(pos != null) ReplayHandler.getCameraEntity().movePath(pos);
|
|
||||||
//System.out.println(curSpeed+" | "+curPos);
|
|
||||||
ReplayHandler.setSpeed(curSpeed);
|
|
||||||
//System.out.println("sent "+curPos);
|
|
||||||
ReplayHandler.setReplayPos(curPos);
|
|
||||||
|
|
||||||
|
|
||||||
//calculate replay speed
|
|
||||||
|
|
||||||
/*
|
|
||||||
int ts = timeLinear.getPoint(Math.max(0, Math.min(1, splinePos)));
|
|
||||||
if(ts != lastTimestamp) {
|
|
||||||
lastTimestamp = ts;
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
if(pos != null) ReplayHandler.getCameraEntity().movePath(pos);
|
||||||
|
|
||||||
|
ReplayHandler.setSpeed(curSpeed);
|
||||||
|
|
||||||
|
if(curPos != null) ReplayHandler.setReplayPos(curPos);
|
||||||
|
|
||||||
//splinePos = (index of last entry + add) / total entries
|
//splinePos = (index of last entry + add) / total entries
|
||||||
|
|
||||||
|
|
||||||
lastRealReplayTime = curRealReplayTime;
|
lastRealReplayTime = curRealReplayTime;
|
||||||
lastRealTime = curTime;
|
lastRealTime = curTime;
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import net.minecraft.client.Minecraft;
|
|||||||
import net.minecraft.client.gui.GuiDownloadTerrain;
|
import net.minecraft.client.gui.GuiDownloadTerrain;
|
||||||
import net.minecraft.client.particle.EffectRenderer;
|
import net.minecraft.client.particle.EffectRenderer;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.network.EnumConnectionState;
|
import net.minecraft.network.EnumConnectionState;
|
||||||
import net.minecraft.network.EnumPacketDirection;
|
import net.minecraft.network.EnumPacketDirection;
|
||||||
import net.minecraft.network.NetworkManager;
|
import net.minecraft.network.NetworkManager;
|
||||||
@@ -30,11 +31,10 @@ import net.minecraft.network.play.server.S02PacketChat;
|
|||||||
import net.minecraft.network.play.server.S06PacketUpdateHealth;
|
import net.minecraft.network.play.server.S06PacketUpdateHealth;
|
||||||
import net.minecraft.network.play.server.S08PacketPlayerPosLook;
|
import net.minecraft.network.play.server.S08PacketPlayerPosLook;
|
||||||
import net.minecraft.network.play.server.S0BPacketAnimation;
|
import net.minecraft.network.play.server.S0BPacketAnimation;
|
||||||
import net.minecraft.network.play.server.S0CPacketSpawnPlayer;
|
|
||||||
import net.minecraft.network.play.server.S14PacketEntity;
|
|
||||||
import net.minecraft.network.play.server.S18PacketEntityTeleport;
|
import net.minecraft.network.play.server.S18PacketEntityTeleport;
|
||||||
import net.minecraft.network.play.server.S1CPacketEntityMetadata;
|
import net.minecraft.network.play.server.S1CPacketEntityMetadata;
|
||||||
import net.minecraft.network.play.server.S1DPacketEntityEffect;
|
import net.minecraft.network.play.server.S1DPacketEntityEffect;
|
||||||
|
import net.minecraft.network.play.server.S1FPacketSetExperience;
|
||||||
import net.minecraft.network.play.server.S28PacketEffect;
|
import net.minecraft.network.play.server.S28PacketEffect;
|
||||||
import net.minecraft.network.play.server.S29PacketSoundEffect;
|
import net.minecraft.network.play.server.S29PacketSoundEffect;
|
||||||
import net.minecraft.network.play.server.S2BPacketChangeGameState;
|
import net.minecraft.network.play.server.S2BPacketChangeGameState;
|
||||||
@@ -48,13 +48,11 @@ import net.minecraft.network.play.server.S39PacketPlayerAbilities;
|
|||||||
import net.minecraft.network.play.server.S43PacketCamera;
|
import net.minecraft.network.play.server.S43PacketCamera;
|
||||||
import net.minecraft.network.play.server.S45PacketTitle;
|
import net.minecraft.network.play.server.S45PacketTitle;
|
||||||
import net.minecraft.network.play.server.S48PacketResourcePackSend;
|
import net.minecraft.network.play.server.S48PacketResourcePackSend;
|
||||||
import net.minecraft.network.play.server.S14PacketEntity.S17PacketEntityLookMove;
|
|
||||||
import net.minecraft.util.Timer;
|
import net.minecraft.util.Timer;
|
||||||
import net.minecraft.world.EnumDifficulty;
|
import net.minecraft.world.EnumDifficulty;
|
||||||
import net.minecraft.world.WorldSettings.GameType;
|
import net.minecraft.world.WorldSettings.GameType;
|
||||||
import net.minecraft.world.WorldType;
|
import net.minecraft.world.WorldType;
|
||||||
import net.minecraftforge.fml.client.FMLClientHandler;
|
import net.minecraftforge.fml.client.FMLClientHandler;
|
||||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
|
||||||
|
|
||||||
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
|
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
|
||||||
import org.apache.commons.compress.archivers.zip.ZipFile;
|
import org.apache.commons.compress.archivers.zip.ZipFile;
|
||||||
@@ -75,6 +73,10 @@ public class ReplaySender extends ChannelInboundHandlerAdapter {
|
|||||||
private long desiredTimeStamp;
|
private long desiredTimeStamp;
|
||||||
private long lastTimeStamp, lastPacketSent;
|
private long lastTimeStamp, lastPacketSent;
|
||||||
|
|
||||||
|
private boolean hasRestarted = false;
|
||||||
|
|
||||||
|
private long toleratedTimeStamp = Long.MAX_VALUE;
|
||||||
|
|
||||||
private File replayFile;
|
private File replayFile;
|
||||||
private PacketDeserializer ds = new PacketDeserializer(EnumPacketDirection.SERVERBOUND);
|
private PacketDeserializer ds = new PacketDeserializer(EnumPacketDirection.SERVERBOUND);
|
||||||
private boolean active = true;
|
private boolean active = true;
|
||||||
@@ -87,8 +89,6 @@ public class ReplaySender extends ChannelInboundHandlerAdapter {
|
|||||||
private NetworkManager networkManager;
|
private NetworkManager networkManager;
|
||||||
private boolean terminate = false;
|
private boolean terminate = false;
|
||||||
|
|
||||||
private float defaultReplaySpeed = 0.5f;
|
|
||||||
|
|
||||||
private double replaySpeed = 1f;
|
private double replaySpeed = 1f;
|
||||||
|
|
||||||
private Field joinPacketEntityId, joinPacketWorldType,
|
private Field joinPacketEntityId, joinPacketWorldType,
|
||||||
@@ -135,13 +135,16 @@ public class ReplaySender extends ChannelInboundHandlerAdapter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void jumpToTime(int millis, boolean force) {
|
public void jumpToTime(int millis) {
|
||||||
setReplaySpeed(replaySpeed);
|
setReplaySpeed(replaySpeed);
|
||||||
|
|
||||||
if((millis < currentTimeStamp && !isHurrying())) {
|
if((millis < currentTimeStamp && !isHurrying())) {
|
||||||
if(!(ReplayHandler.isReplaying() && !force)) {
|
if(ReplayHandler.isReplaying()) {
|
||||||
startFromBeginning = true;
|
if(millis < toleratedTimeStamp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
startFromBeginning = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
desiredTimeStamp = millis;
|
desiredTimeStamp = millis;
|
||||||
@@ -244,6 +247,7 @@ public class ReplaySender extends ChannelInboundHandlerAdapter {
|
|||||||
}
|
}
|
||||||
while(!terminate) {
|
while(!terminate) {
|
||||||
if(startFromBeginning) {
|
if(startFromBeginning) {
|
||||||
|
hasRestarted = true;
|
||||||
currentTimeStamp = 0;
|
currentTimeStamp = 0;
|
||||||
dis.close();
|
dis.close();
|
||||||
dis = new DataInputStream(archive.getInputStream(replayEntry));
|
dis = new DataInputStream(archive.getInputStream(replayEntry));
|
||||||
@@ -275,7 +279,7 @@ public class ReplaySender extends ChannelInboundHandlerAdapter {
|
|||||||
currentTimeStamp = timestamp;
|
currentTimeStamp = timestamp;
|
||||||
|
|
||||||
if(!ReplayHandler.isReplaying() && !hurryToTimestamp && !FMLClientHandler.instance().isGUIOpen(GuiDownloadTerrain.class)) {
|
if(!ReplayHandler.isReplaying() && !hurryToTimestamp && !FMLClientHandler.instance().isGUIOpen(GuiDownloadTerrain.class)) {
|
||||||
//if(!hurryToTimestamp && !FMLClientHandler.instance().isGUIOpen(GuiDownloadTerrain.class)) {
|
//if(!hurryToTimestamp && !FMLClientHandler.instance().isGUIOpen(GuiDownloadTerrain.class)) {
|
||||||
int timeWait = (int)Math.round((currentTimeStamp - lastTimeStamp)/replaySpeed);
|
int timeWait = (int)Math.round((currentTimeStamp - lastTimeStamp)/replaySpeed);
|
||||||
long timeDiff = System.currentTimeMillis() - lastPacketSent;
|
long timeDiff = System.currentTimeMillis() - lastPacketSent;
|
||||||
lastPacketSent = System.currentTimeMillis();
|
lastPacketSent = System.currentTimeMillis();
|
||||||
@@ -291,11 +295,23 @@ public class ReplaySender extends ChannelInboundHandlerAdapter {
|
|||||||
|
|
||||||
lastTimeStamp = currentTimeStamp;
|
lastTimeStamp = currentTimeStamp;
|
||||||
|
|
||||||
|
if(ReplayHandler.isReplaying()) {
|
||||||
|
toleratedTimeStamp = lastTimeStamp;
|
||||||
|
} else {
|
||||||
|
toleratedTimeStamp = -1;
|
||||||
|
}
|
||||||
|
|
||||||
if(hurryToTimestamp && currentTimeStamp >= desiredTimeStamp && !startFromBeginning) {
|
if(hurryToTimestamp && currentTimeStamp >= desiredTimeStamp && !startFromBeginning) {
|
||||||
hurryToTimestamp = false;
|
hurryToTimestamp = false;
|
||||||
|
if(!ReplayHandler.isReplaying() || hasRestarted) {
|
||||||
|
((Timer)mcTimer.get(mc)).elapsedPartialTicks = 5;
|
||||||
|
((Timer)mcTimer.get(mc)).elapsedTicks = 5;
|
||||||
|
((Timer)mcTimer.get(mc)).renderPartialTicks = 5;
|
||||||
|
}
|
||||||
if(!ReplayHandler.isReplaying()) {
|
if(!ReplayHandler.isReplaying()) {
|
||||||
setReplaySpeed(0);
|
setReplaySpeed(0);
|
||||||
}
|
}
|
||||||
|
hasRestarted = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch(EOFException eof) {
|
} catch(EOFException eof) {
|
||||||
@@ -321,6 +337,9 @@ public class ReplaySender extends ChannelInboundHandlerAdapter {
|
|||||||
add(S30PacketWindowItems.class);
|
add(S30PacketWindowItems.class);
|
||||||
add(S36PacketSignEditorOpen.class);
|
add(S36PacketSignEditorOpen.class);
|
||||||
add(S37PacketStatistics.class);
|
add(S37PacketStatistics.class);
|
||||||
|
add(S1FPacketSetExperience.class);
|
||||||
|
add(S43PacketCamera.class);
|
||||||
|
add(S39PacketPlayerAbilities.class);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -391,8 +410,13 @@ public class ReplaySender extends ChannelInboundHandlerAdapter {
|
|||||||
difficulty, maxPlayers, worldType, false);
|
difficulty, maxPlayers, worldType, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(p instanceof S39PacketPlayerAbilities) {
|
if(p instanceof S18PacketEntityTeleport) {
|
||||||
return;
|
//System.out.println(((S18PacketEntityTeleport) p).func_149449_d());
|
||||||
|
if(mc.theWorld != null) {
|
||||||
|
for(EntityPlayer ep : (List<EntityPlayer>)mc.theWorld.playerEntities) {
|
||||||
|
System.out.println(ep.posX+" "+ep.posY+" "+ep.posZ);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(p instanceof S08PacketPlayerPosLook) {
|
if(p instanceof S08PacketPlayerPosLook) {
|
||||||
|
|||||||
Reference in New Issue
Block a user