From 9f4b2d902638c7735294df1b3b81b5331d7a2ca5 Mon Sep 17 00:00:00 2001 From: johni0702 Date: Tue, 7 Jul 2015 13:09:38 +0200 Subject: [PATCH] Pause the recording when the integrated server is paused --- .../events/handlers/RecordingHandler.java | 14 ++++++++++++++ .../recording/ConnectionEventHandler.java | 6 ++++++ .../replaymod/recording/DataListener.java | 12 ++++++++++-- src/main/resources/META-INF/replaymod_at.cfg | 3 +++ 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/main/java/eu/crushedpixel/replaymod/events/handlers/RecordingHandler.java b/src/main/java/eu/crushedpixel/replaymod/events/handlers/RecordingHandler.java index fca13eb6..ff648e01 100755 --- a/src/main/java/eu/crushedpixel/replaymod/events/handlers/RecordingHandler.java +++ b/src/main/java/eu/crushedpixel/replaymod/events/handlers/RecordingHandler.java @@ -12,6 +12,7 @@ import net.minecraft.network.PacketBuffer; import net.minecraft.network.play.server.*; import net.minecraft.network.play.server.S14PacketEntity.S17PacketEntityLookMove; import net.minecraft.network.play.server.S38PacketPlayerListItem.Action; +import net.minecraft.server.integrated.IntegratedServer; import net.minecraft.util.MathHelper; import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.event.entity.living.LivingDeathEvent; @@ -22,6 +23,7 @@ import net.minecraftforge.event.entity.player.PlayerUseItemEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.PlayerEvent.ItemPickupEvent; import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerRespawnEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; import net.minecraftforge.fml.common.gameevent.TickEvent.PlayerTickEvent; import java.util.Objects; @@ -447,4 +449,16 @@ public class RecordingHandler { e.printStackTrace(); } } + + @SubscribeEvent + public void checkForGamePaused(TickEvent.RenderTickEvent event) { + if (event.phase != TickEvent.Phase.START) return; + if (!ConnectionEventHandler.isRecording()) return; + if (mc.isIntegratedServerRunning()) { + IntegratedServer server = mc.getIntegratedServer(); + if (server != null && server.isGamePaused) { + ConnectionEventHandler.notifyServerPaused(); + } + } + } } diff --git a/src/main/java/eu/crushedpixel/replaymod/recording/ConnectionEventHandler.java b/src/main/java/eu/crushedpixel/replaymod/recording/ConnectionEventHandler.java index 4d5db3f1..75d0348c 100755 --- a/src/main/java/eu/crushedpixel/replaymod/recording/ConnectionEventHandler.java +++ b/src/main/java/eu/crushedpixel/replaymod/recording/ConnectionEventHandler.java @@ -39,6 +39,12 @@ public class ConnectionEventHandler { return isRecording; } + public static void notifyServerPaused() { + if (packetListener != null) { + packetListener.serverWasPaused = true; + } + } + public static void insertPacket(Packet packet) { if(!isRecording || packetListener == null) { String reason = isRecording ? " (recording)" : " (null)"; diff --git a/src/main/java/eu/crushedpixel/replaymod/recording/DataListener.java b/src/main/java/eu/crushedpixel/replaymod/recording/DataListener.java index 62a49bb5..dde65a8d 100755 --- a/src/main/java/eu/crushedpixel/replaymod/recording/DataListener.java +++ b/src/main/java/eu/crushedpixel/replaymod/recording/DataListener.java @@ -30,6 +30,7 @@ public abstract class DataListener extends ChannelInboundHandlerAdapter { protected Long startTime = null; protected String name; protected String worldName; + protected boolean serverWasPaused; protected long lastSentPacket = 0; protected boolean alive = true; protected DataWriter dataWriter; @@ -94,6 +95,7 @@ public abstract class DataListener extends ChannelInboundHandlerAdapter { public class DataWriter { private boolean active = true; + private long paused; private ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue(); private DataOutputStream stream; @@ -145,10 +147,16 @@ public abstract class DataListener extends ChannelInboundHandlerAdapter { } public synchronized void writePacket(byte[] bytes) { + long now = System.currentTimeMillis(); if(startTime == null) { - startTime = System.currentTimeMillis(); + startTime = now; } - int timestamp = (int) (System.currentTimeMillis() - startTime); + + if (serverWasPaused) { + paused = now - startTime - lastSentPacket; + serverWasPaused = false; + } + int timestamp = (int) (now - startTime - paused); lastSentPacket = timestamp; queue.add(new PacketData(bytes, timestamp)); } diff --git a/src/main/resources/META-INF/replaymod_at.cfg b/src/main/resources/META-INF/replaymod_at.cfg index 0103ff0e..0161e3d0 100644 --- a/src/main/resources/META-INF/replaymod_at.cfg +++ b/src/main/resources/META-INF/replaymod_at.cfg @@ -91,5 +91,8 @@ public net.minecraft.client.entity.EntityOtherPlayerMP * public net.minecraft.client.particle.EffectRenderer field_110737_b # particleTextures public net.minecraft.client.particle.EffectRenderer field_78876_b # fxLayers +# IntegratedServer +public net.minecraft.server.integrated.IntegratedServer field_71348_o # isGamePaused + # Example # public net.minecraft.package.ClassName func_some_id(Ljava/lang/Class;IZS)V # methodName