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
This commit is contained in:
@@ -68,8 +68,11 @@ public class ConnectionEventHandler {
|
|||||||
String worldName;
|
String worldName;
|
||||||
if(event.isLocal) {
|
if(event.isLocal) {
|
||||||
worldName = MinecraftServer.getServer().getWorldName();
|
worldName = MinecraftServer.getServer().getWorldName();
|
||||||
} else {
|
} else if (Minecraft.getMinecraft().getCurrentServerData() != null) {
|
||||||
worldName = Minecraft.getMinecraft().getCurrentServerData().serverIP;
|
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();
|
Channel channel = nm.channel();
|
||||||
ChannelPipeline pipeline = channel.pipeline();
|
ChannelPipeline pipeline = channel.pipeline();
|
||||||
|
|||||||
@@ -165,6 +165,7 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
|
|||||||
|
|
||||||
if (packet instanceof FMLProxyPacket) {
|
if (packet instanceof FMLProxyPacket) {
|
||||||
// This packet requires special handling
|
// This packet requires special handling
|
||||||
|
((FMLProxyPacket) packet).toS3FPackets().forEach(this::save);
|
||||||
super.channelRead(ctx, msg);
|
super.channelRead(ctx, msg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import net.minecraft.entity.Entity;
|
|||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.network.EnumPacketDirection;
|
import net.minecraft.network.EnumPacketDirection;
|
||||||
import net.minecraft.network.NetworkManager;
|
import net.minecraft.network.NetworkManager;
|
||||||
|
import net.minecraftforge.fml.client.FMLClientHandler;
|
||||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||||
import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher;
|
import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher;
|
||||||
import org.lwjgl.opengl.Display;
|
import org.lwjgl.opengl.Display;
|
||||||
@@ -135,13 +136,17 @@ public class ReplayHandler {
|
|||||||
t.printStackTrace();
|
t.printStackTrace();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
networkManager.setNetHandler(new NetHandlerPlayClient(
|
NetHandlerPlayClient netHandlerPlayClient =
|
||||||
mc, null, networkManager, new GameProfile(UUID.randomUUID(), "Player")));
|
new NetHandlerPlayClient(mc, null, networkManager, new GameProfile(UUID.randomUUID(), "Player"));
|
||||||
|
networkManager.setNetHandler(netHandlerPlayClient);
|
||||||
|
FMLClientHandler.instance().setPlayClient(netHandlerPlayClient);
|
||||||
|
|
||||||
channel = new EmbeddedChannel(networkManager);
|
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();
|
channel.pipeline().fireChannelActive();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user