- 1,218
- 27
- 174
То бишь почти тоде самое, что и у меня, только а не протупил и не начал изобретать велосипед(ибо есть 1 - FMLIndexedMessageToMessageCodec, который сам за тебя делает большую часть ихнего MessageToMessageCodec-а, и 2 - есть SimpleChannelInboundHandler от самой Netty, делающий вторую часть).
А зайти в BuildCraft и узреть, чего там SpaceToad вытворяет с аннотациями(особенно после того. как я открыл его глаза на .setAccessible(true)) - вообще забавно получится(хотя и кода побольше там будет).
Код:
trait Packet{
def write(buf: ByteBuf)
def read(buf: ByteBuf)
def execute(side: Side)
}
Код:
object PacketCodec extends FMLIndexedMessageToMessageCodec[Packet]{
override def encodeInto(ctx: ChannelHandlerContext, packet: Packet, buf: ByteBuf) =
packet.write(buf)
override def decodeInto(ctx: ChannelHandlerContext, buf: ByteBuf, packet: Packet) =
packet.read(buf)
}
Код:
class PacketHandler(side: Side) extends SimpleChannelInboundHandler[Packet]{
override def channelRead0(ctx: ChannelHandlerContext, packet: Packet) =
packet.execute(side)
}
Код:
import cpw.mods.fml.common.network.FMLOutboundHandler.OutboundTarget._
import net.minecraft.network.{Packet => MCPacket}
object PacketManager{
{
registerPacket(classOf[PacketUpdateTile], 0)
registerPacket(classOf[PacketUpdateInventory], 1)
}
private val target = FMLOutboundHandler.FML_MESSAGETARGET
private val args = FMLOutboundHandler.FML_MESSAGETARGETARGS
private val fireExc = ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE
var client: FMLEmbeddedChannel = null
var server: FMLEmbeddedChannel = null
def registerPacket(cls: Class[_ <: Packet], id: Int) =
PacketCodec.addDiscriminator(id, cls)
def init() = {
val channels = NetworkRegistry.INSTANCE.newChannel("rcircuits_channel", PacketCodec)
client = channels.get(Side.CLIENT)
server = channels.get(Side.SERVER)
val tpe = classOf[FMLIndexedMessageToMessageCodec[Packet]]
client.pipeline().addAfter(client.findChannelHandlerNameForType(tpe), "executor", new PacketHandler(Side.CLIENT))
server.pipeline().addAfter(server.findChannelHandlerNameForType(tpe), "executor", new PacketHandler(Side.SERVER))
}
def getPacketFrom(packet: Packet): MCPacket =
server.generatePacketFrom(packet)
def sendToServer(packet: Packet) = {
client.attr(target).set(TOSERVER)
client.writeAndFlush(packet).addListener(fireExc)
}
def sendToAll(packet: Packet) = {
server.attr(target).set(ALL)
server.writeAndFlush(packet).addListener(fireExc)
}
def sendTo(packet: Packet, player: EntityPlayerMP) = {
server.attr(target).set(PLAYER)
server.attr(args).set(player)
server.writeAndFlush(packet).addListener(fireExc)
}
def sendToAllAround(packet: Packet, x: Double, y: Double, z: Double, range: Double, dim: Int) = {
server.attr(target).set(ALLAROUNDPOINT)
server.attr(args).set(new NetworkRegistry.TargetPoint(dim, x, y, z, range))
server.writeAndFlush(packet).addListener(fireExc)
}
def sendToDimension(packet: Packet, dimensionId: Int) = {
server.attr(target).set(DIMENSION)
server.attr(args).set(Int.box(dimensionId))
server.writeAndFlush(packet).addListener(fireExc)
}
}
А зайти в BuildCraft и узреть, чего там SpaceToad вытворяет с аннотациями(особенно после того. как я открыл его глаза на .setAccessible(true)) - вообще забавно получится(хотя и кода побольше там будет).