diff --git a/build.gradle b/build.gradle index 9c366e2..2bf3dad 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ buildscript { apply plugin: 'scala' apply plugin: 'forge' -version = "1.4.4" +version = "1.4.5" if (project.hasProperty('buildnum')) { project.version = project.version + '.' + project.buildnum diff --git a/src/net/bdew/lib/multiblock/network/MsgOutputCfg.scala b/src/net/bdew/lib/multiblock/network/MsgOutputCfg.scala index 745c720..dd84bea 100644 --- a/src/net/bdew/lib/multiblock/network/MsgOutputCfg.scala +++ b/src/net/bdew/lib/multiblock/network/MsgOutputCfg.scala @@ -9,8 +9,8 @@ package net.bdew.lib.multiblock.network -import net.bdew.lib.network.Message +import net.bdew.lib.network.BaseMessage -abstract class MsgOutputCfg extends Message { +abstract class MsgOutputCfg extends BaseMessage[NetHandler.type] { val output: Int } diff --git a/src/net/bdew/lib/network/Message.scala b/src/net/bdew/lib/network/BaseMessage.scala similarity index 82% rename from src/net/bdew/lib/network/Message.scala rename to src/net/bdew/lib/network/BaseMessage.scala index abd2392..ff47b8b 100644 --- a/src/net/bdew/lib/network/Message.scala +++ b/src/net/bdew/lib/network/BaseMessage.scala @@ -9,4 +9,4 @@ package net.bdew.lib.network -abstract class Message extends Serializable +abstract class BaseMessage[CH <: NetChannel] extends Serializable diff --git a/src/net/bdew/lib/network/NetChannel.scala b/src/net/bdew/lib/network/NetChannel.scala index 6207b9c..ad1bdcc 100644 --- a/src/net/bdew/lib/network/NetChannel.scala +++ b/src/net/bdew/lib/network/NetChannel.scala @@ -13,18 +13,49 @@ import java.util import cpw.mods.fml.common.network.{FMLEmbeddedChannel, FMLOutboundHandler, NetworkRegistry} import cpw.mods.fml.relauncher.Side -import io.netty.channel.{ChannelFutureListener, ChannelHandler} +import io.netty.channel.{ChannelFutureListener, ChannelHandler, ChannelHandlerContext, SimpleChannelInboundHandler} import net.bdew.lib.{BdLib, Misc} import net.minecraft.entity.player.EntityPlayerMP +import net.minecraft.network.NetHandlerPlayServer class NetChannel(val name: String) { var channels: util.EnumMap[Side, FMLEmbeddedChannel] = null + type Message = BaseMessage[this.type] + + object ServerHandler extends SimpleChannelInboundHandler[Message] { + def channelRead0(ctx: ChannelHandlerContext, msg: Message) { + try { + val player = ctx.channel().attr(NetworkRegistry.NET_HANDLER).get.asInstanceOf[NetHandlerPlayServer].playerEntity + if (serverChain.isDefinedAt(msg, player)) + serverChain(msg, player) + else + BdLib.logWarn("Unable to handle message from user %s: %s", player.getDisplayName, msg) + } catch { + case e: Throwable => BdLib.logErrorException("Error handling packet", e) + } + } + } + + object ClientHandler extends SimpleChannelInboundHandler[Message] { + def channelRead0(ctx: ChannelHandlerContext, msg: Message) { + try { + if (clientChain.isDefinedAt(msg)) + clientChain(msg) + else + BdLib.logWarn("Unable to handle message from server: %s", msg) + } catch { + case e: Throwable => BdLib.logErrorException("Error handling packet", e) + } + } + } + def init() { + if (channels != null) sys.error("Attempted to initalize a channel twice (%s)".format(name)) channels = NetworkRegistry.INSTANCE.newChannel(name, new SerializedMessageCodec) BdLib.logInfo("Initialized network channel '%s' for mod '%s'", name, Misc.getActiveModId) - addHandler(Side.SERVER, new NetChannelServerHandler(this)) - addHandler(Side.CLIENT, new NetChannelClientHandler(this)) + addHandler(Side.SERVER, ServerHandler) + addHandler(Side.CLIENT, ClientHandler) } var clientChain = PartialFunction.empty[Message, Unit] @@ -38,7 +69,7 @@ class NetChannel(val name: String) { private def addHandler(side: Side, handler: ChannelHandler) { val ch = channels.get(side) - val name = ch.findChannelHandlerNameForType(classOf[SerializedMessageCodec]) + val name = ch.findChannelHandlerNameForType(classOf[SerializedMessageCodec[this.type]]) ch.pipeline().addAfter(name, side + "Handler", handler) } diff --git a/src/net/bdew/lib/network/NetChannelClientHandler.scala b/src/net/bdew/lib/network/NetChannelClientHandler.scala deleted file mode 100644 index e9a829a..0000000 --- a/src/net/bdew/lib/network/NetChannelClientHandler.scala +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) bdew, 2013 - 2014 - * https://github.com/bdew/bdlib - * - * This mod is distributed under the terms of the Minecraft Mod Public - * License 1.0, or MMPL. Please check the contents of the license located in - * https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt - */ - -package net.bdew.lib.network - -import io.netty.channel.{ChannelHandlerContext, SimpleChannelInboundHandler} -import net.bdew.lib.BdLib - -class NetChannelClientHandler(ch: NetChannel) extends SimpleChannelInboundHandler[Message] { - def channelRead0(ctx: ChannelHandlerContext, msg: Message) { - try { - if (ch.clientChain.isDefinedAt(msg)) - ch.clientChain(msg) - else - BdLib.logWarn("Unable to handle message from server: %s", msg) - } catch { - case e: Throwable => BdLib.logErrorException("Error handling packet", e) - } - } -} diff --git a/src/net/bdew/lib/network/NetChannelServerHandler.scala b/src/net/bdew/lib/network/NetChannelServerHandler.scala deleted file mode 100644 index e1915f1..0000000 --- a/src/net/bdew/lib/network/NetChannelServerHandler.scala +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) bdew, 2013 - 2014 - * https://github.com/bdew/bdlib - * - * This mod is distributed under the terms of the Minecraft Mod Public - * License 1.0, or MMPL. Please check the contents of the license located in - * https://raw.github.com/bdew/bdlib/master/MMPL-1.0.txt - */ - -package net.bdew.lib.network - -import cpw.mods.fml.common.network.NetworkRegistry -import io.netty.channel.{ChannelHandlerContext, SimpleChannelInboundHandler} -import net.bdew.lib.BdLib -import net.minecraft.network.NetHandlerPlayServer - -class NetChannelServerHandler(ch: NetChannel) extends SimpleChannelInboundHandler[Message] { - def channelRead0(ctx: ChannelHandlerContext, msg: Message) { - try { - val player = ctx.channel().attr(NetworkRegistry.NET_HANDLER).get.asInstanceOf[NetHandlerPlayServer].playerEntity - if (ch.serverChain.isDefinedAt(msg, player)) - ch.serverChain(msg, player) - else - BdLib.logWarn("Unable to handle message from user %s: %s", player.getDisplayName, msg) - } catch { - case e: Throwable => BdLib.logErrorException("Error handling packet", e) - } - } -} diff --git a/src/net/bdew/lib/network/SerializedMessageCodec.scala b/src/net/bdew/lib/network/SerializedMessageCodec.scala index 8da08e5..20549df 100644 --- a/src/net/bdew/lib/network/SerializedMessageCodec.scala +++ b/src/net/bdew/lib/network/SerializedMessageCodec.scala @@ -21,8 +21,8 @@ import io.netty.handler.codec.MessageToMessageCodec import net.bdew.lib.BdLib @Sharable -class SerializedMessageCodec extends MessageToMessageCodec[FMLProxyPacket, Message] { - def encode(ctx: ChannelHandlerContext, msg: Message, out: util.List[AnyRef]) { +class SerializedMessageCodec[T <: NetChannel] extends MessageToMessageCodec[FMLProxyPacket, BaseMessage[T]] { + def encode(ctx: ChannelHandlerContext, msg: BaseMessage[T], out: util.List[AnyRef]) { val buff = Unpooled.buffer() val writer = new ObjectOutputStream(new ByteBufOutputStream(buff)) writer.writeObject(msg)