From 79bc6a8a7b86ddf1ae7e9a7069130543845e9323 Mon Sep 17 00:00:00 2001 From: CrushedPixel Date: Sun, 4 Sep 2016 14:25:33 +0200 Subject: [PATCH] Properly save and replay FMLProxyPackets During recording FMLProxyPackets are converted to S3FPacketCustomPayload During playback the normal Forge network stack is used to handle these packets --- .../recording/handler/ConnectionEventHandler.java | 5 ++++- .../replaymod/recording/packet/PacketListener.java | 1 + .../java/com/replaymod/replay/ReplayHandler.java | 13 +++++++++---- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java b/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java index 9735d6c0..b25f480c 100755 --- a/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java +++ b/src/main/java/com/replaymod/recording/handler/ConnectionEventHandler.java @@ -68,8 +68,11 @@ public class ConnectionEventHandler { String worldName; if(event.isLocal) { worldName = MinecraftServer.getServer().getWorldName(); - } else { + } else if (Minecraft.getMinecraft().getCurrentServerData() != null) { worldName = Minecraft.getMinecraft().getCurrentServerData().serverIP; + } else { + logger.info("Recording not started as the world is neither local nor remote (probably a replay)."); + return; } Channel channel = nm.channel(); ChannelPipeline pipeline = channel.pipeline(); diff --git a/src/main/java/com/replaymod/recording/packet/PacketListener.java b/src/main/java/com/replaymod/recording/packet/PacketListener.java index c3ff4129..89c75c90 100755 --- a/src/main/java/com/replaymod/recording/packet/PacketListener.java +++ b/src/main/java/com/replaymod/recording/packet/PacketListener.java @@ -165,6 +165,7 @@ public class PacketListener extends ChannelInboundHandlerAdapter { if (packet instanceof FMLProxyPacket) { // This packet requires special handling + ((FMLProxyPacket) packet).toS3FPackets().forEach(this::save); super.channelRead(ctx, msg); return; } diff --git a/src/main/java/com/replaymod/replay/ReplayHandler.java b/src/main/java/com/replaymod/replay/ReplayHandler.java index 0a0de908..b01fdc66 100755 --- a/src/main/java/com/replaymod/replay/ReplayHandler.java +++ b/src/main/java/com/replaymod/replay/ReplayHandler.java @@ -23,6 +23,7 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.network.EnumPacketDirection; import net.minecraft.network.NetworkManager; +import net.minecraftforge.fml.client.FMLClientHandler; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher; import org.lwjgl.opengl.Display; @@ -135,13 +136,17 @@ public class ReplayHandler { t.printStackTrace(); } }; - networkManager.setNetHandler(new NetHandlerPlayClient( - mc, null, networkManager, new GameProfile(UUID.randomUUID(), "Player"))); + NetHandlerPlayClient netHandlerPlayClient = + new NetHandlerPlayClient(mc, null, networkManager, new GameProfile(UUID.randomUUID(), "Player")); + networkManager.setNetHandler(netHandlerPlayClient); + FMLClientHandler.instance().setPlayClient(netHandlerPlayClient); channel = new EmbeddedChannel(networkManager); - channel.attr(NetworkDispatcher.FML_DISPATCHER).set(new NetworkDispatcher(networkManager)); + NetworkDispatcher networkDispatcher = new NetworkDispatcher(networkManager); + channel.attr(NetworkDispatcher.FML_DISPATCHER).set(networkDispatcher); - channel.pipeline().addFirst(replaySender); + channel.pipeline().addFirst("ReplayModReplay_replaySender", replaySender); + channel.pipeline().addAfter("ReplayModReplay_replaySender", "fml:packet_handler", networkDispatcher); channel.pipeline().fireChannelActive(); }