package openmods.sync; import cpw.mods.fml.common.network.internal.FMLProxyPacket; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufInputStream; import io.netty.channel.ChannelHandler.Sharable; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import java.io.DataInputStream; import net.minecraft.world.World; import openmods.OpenMods; @Sharable public class InboundSyncHandler extends SimpleChannelInboundHandler<FMLProxyPacket> { public static class SyncException extends RuntimeException { private static final long serialVersionUID = 2585053869917082095L; public SyncException(Throwable cause, ISyncMapProvider provider) { super(String.format("Failed to sync %s (%s)", provider, provider.getClass()), cause); } } @Override protected void channelRead0(ChannelHandlerContext ctx, FMLProxyPacket msg) throws Exception { World world = OpenMods.proxy.getClientWorld(); ByteBuf payload = msg.payload(); DataInputStream input = new DataInputStream(new ByteBufInputStream(payload)); ISyncMapProvider provider = SyncMap.findSyncMap(world, input); try { if (provider != null) provider.getSyncMap().readFromStream(input); } catch (Throwable e) { throw new SyncException(e, provider); } } }