From 9910456dcc6529b0bad42a5529f8e5aca457060e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Fri, 7 Feb 2014 14:19:54 +0100 Subject: [PATCH] network changes --- src/main/java/li/cil/oc/OpenComputers.scala | 12 ++----- .../java/li/cil/oc/client/PacketHandler.scala | 23 +++++++----- src/main/java/li/cil/oc/client/Proxy.scala | 18 +++------- .../java/li/cil/oc/common/PacketBuilder.scala | 22 +++++------- .../java/li/cil/oc/common/PacketHandler.scala | 35 +++++-------------- src/main/java/li/cil/oc/common/Proxy.scala | 11 +++--- .../cil/oc/common/tileentity/TileEntity.scala | 10 +++--- .../java/li/cil/oc/server/PacketHandler.scala | 24 ++++++++----- src/main/java/li/cil/oc/server/Proxy.scala | 2 +- src/main/resources/mcmod.info | 6 ++-- src/main/resources/reference.conf | 15 -------- 11 files changed, 69 insertions(+), 109 deletions(-) diff --git a/src/main/java/li/cil/oc/OpenComputers.scala b/src/main/java/li/cil/oc/OpenComputers.scala index cf8426273..58a7a8850 100644 --- a/src/main/java/li/cil/oc/OpenComputers.scala +++ b/src/main/java/li/cil/oc/OpenComputers.scala @@ -6,25 +6,19 @@ import cpw.mods.fml.common.SidedProxy import cpw.mods.fml.common.event.FMLInitializationEvent import cpw.mods.fml.common.event.FMLPostInitializationEvent import cpw.mods.fml.common.event.FMLPreInitializationEvent -import cpw.mods.fml.common.network.NetworkMod -import cpw.mods.fml.common.network.NetworkMod._ +import cpw.mods.fml.common.network.FMLEventChannel import java.util.logging.Logger -import li.cil.oc.client.{PacketHandler => ClientPacketHandler} import li.cil.oc.common.Proxy -import li.cil.oc.server.{PacketHandler => ServerPacketHandler} @Mod(modid = "OpenComputers", modLanguage = "scala", useMetadata = true) -@NetworkMod(clientSideRequired = true, serverSideRequired = false, - clientPacketHandlerSpec = new SidedPacketHandler( - channels = Array("OpenComp"), packetHandler = classOf[ClientPacketHandler]), - serverPacketHandlerSpec = new SidedPacketHandler( - channels = Array("OpenComp"), packetHandler = classOf[ServerPacketHandler])) object OpenComputers { val log = Logger.getLogger("OpenComputers") @SidedProxy(clientSide = "li.cil.oc.client.Proxy", serverSide = "li.cil.oc.server.Proxy") var proxy: Proxy = null + var channel: FMLEventChannel = _ + @EventHandler def preInit(e: FMLPreInitializationEvent) = proxy.preInit(e) diff --git a/src/main/java/li/cil/oc/client/PacketHandler.scala b/src/main/java/li/cil/oc/client/PacketHandler.scala index 6a3b79ad8..db823eeb1 100644 --- a/src/main/java/li/cil/oc/client/PacketHandler.scala +++ b/src/main/java/li/cil/oc/client/PacketHandler.scala @@ -1,23 +1,28 @@ package li.cil.oc.client -import cpw.mods.fml.common.network.Player +import cpw.mods.fml.common.eventhandler.SubscribeEvent +import cpw.mods.fml.common.network.FMLNetworkEvent.ClientCustomPacketEvent import li.cil.oc.common.PacketType import li.cil.oc.common.tileentity._ import li.cil.oc.common.{PacketHandler => CommonPacketHandler} import li.cil.oc.util.PackedColor import net.minecraft.client.gui.GuiScreen +import net.minecraft.client.Minecraft import net.minecraft.entity.player.EntityPlayer -import net.minecraftforge.common.ForgeDirection +import net.minecraft.util.ChatComponentText +import net.minecraftforge.common.util.ForgeDirection import org.lwjgl.input.Keyboard -class PacketHandler extends CommonPacketHandler { - protected override def world(player: Player, dimension: Int) = { - val world = player.asInstanceOf[EntityPlayer].worldObj +object PacketHandler extends CommonPacketHandler { + protected override def world(player: EntityPlayer, dimension: Int) = { + val world = player.worldObj if (world.provider.dimensionId == dimension) Some(world) else None } - override def dispatch(p: PacketParser) = + @SubscribeEvent + def onPacket(e: ClientCustomPacketEvent) { + val p = new PacketParser(e.packet.payload, Minecraft.getMinecraft.thePlayer) p.packetType match { case PacketType.AbstractBusState => onAbstractBusState(p) case PacketType.Analyze => onAnalyze(p) @@ -44,6 +49,7 @@ class PacketHandler extends CommonPacketHandler { case PacketType.ServerPresence => onServerPresence(p) case _ => // Invalid packet. } + } def onAbstractBusState(p: PacketParser) = p.readTileEntity[AbstractBusAware]() match { @@ -52,11 +58,10 @@ class PacketHandler extends CommonPacketHandler { } def onAnalyze(p: PacketParser) { - val player = p.player.asInstanceOf[EntityPlayer] val address = p.readUTF() if (Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_LCONTROL)) { GuiScreen.setClipboardString(address) - player.addChatMessage("Address copied to clipboard.") + p.player.addChatMessage(new ChatComponentText("Address copied to clipboard.")) } } @@ -64,7 +69,7 @@ class PacketHandler extends CommonPacketHandler { p.readTileEntity[Charger]() match { case Some(t) => t.chargeSpeed = p.readDouble() - t.world.markBlockForRenderUpdate(t.x, t.y, t.z) + t.world.markBlockForUpdate(t.x, t.y, t.z) case _ => // Invalid packet. } diff --git a/src/main/java/li/cil/oc/client/Proxy.scala b/src/main/java/li/cil/oc/client/Proxy.scala index 6e1862247..cbf31761e 100644 --- a/src/main/java/li/cil/oc/client/Proxy.scala +++ b/src/main/java/li/cil/oc/client/Proxy.scala @@ -3,8 +3,7 @@ package li.cil.oc.client import cpw.mods.fml.client.registry.{RenderingRegistry, ClientRegistry} import cpw.mods.fml.common.event.{FMLPostInitializationEvent, FMLInitializationEvent} import cpw.mods.fml.common.network.NetworkRegistry -import cpw.mods.fml.common.registry.TickRegistry -import cpw.mods.fml.relauncher.Side +import li.cil.oc.client import li.cil.oc.client.renderer.WirelessNetworkDebugRenderer import li.cil.oc.client.renderer.block.BlockRenderer import li.cil.oc.client.renderer.item.UpgradeRenderer @@ -12,8 +11,6 @@ import li.cil.oc.client.renderer.tileentity._ import li.cil.oc.common.tileentity import li.cil.oc.common.{Proxy => CommonProxy} import li.cil.oc.{Items, Settings, OpenComputers} -import net.minecraft.client.Minecraft -import net.minecraft.client.resources.ReloadableResourceManager import net.minecraftforge.client.MinecraftForgeClient import net.minecraftforge.common.MinecraftForge @@ -21,7 +18,7 @@ private[oc] class Proxy extends CommonProxy { override def init(e: FMLInitializationEvent) = { super.init(e) - NetworkRegistry.instance.registerGuiHandler(OpenComputers, GuiHandler) + NetworkRegistry.INSTANCE.registerGuiHandler(OpenComputers, GuiHandler) BlockRenderer.getRenderId = RenderingRegistry.getNextAvailableRenderId RenderingRegistry.registerBlockHandler(BlockRenderer) @@ -33,21 +30,16 @@ private[oc] class Proxy extends CommonProxy { ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.RobotProxy], RobotRenderer) ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.Screen], ScreenRenderer) - MinecraftForgeClient.registerItemRenderer(Items.multi.itemID, UpgradeRenderer) + MinecraftForgeClient.registerItemRenderer(Items.multi, UpgradeRenderer) MinecraftForge.EVENT_BUS.register(gui.Icons) - - Minecraft.getMinecraft.getResourceManager match { - case manager: ReloadableResourceManager => - manager.registerReloadListener(TexturePreloader) - case _ => - } + OpenComputers.channel.register(client.PacketHandler) } override def postInit(e: FMLPostInitializationEvent) { super.postInit(e) - TickRegistry.registerTickHandler(ScreenRenderer, Side.CLIENT) + MinecraftForge.EVENT_BUS.register(ScreenRenderer) if (Settings.get.rTreeDebugRenderer) { MinecraftForge.EVENT_BUS.register(WirelessNetworkDebugRenderer) } diff --git a/src/main/java/li/cil/oc/common/PacketBuilder.scala b/src/main/java/li/cil/oc/common/PacketBuilder.scala index 6c0f0f86f..b0fe4dc26 100644 --- a/src/main/java/li/cil/oc/common/PacketBuilder.scala +++ b/src/main/java/li/cil/oc/common/PacketBuilder.scala @@ -1,17 +1,17 @@ package li.cil.oc.common import cpw.mods.fml.common.FMLCommonHandler -import cpw.mods.fml.common.network.PacketDispatcher -import cpw.mods.fml.common.network.Player +import cpw.mods.fml.common.network.internal.FMLProxyPacket +import io.netty.buffer.Unpooled import java.io.ByteArrayOutputStream import java.io.DataOutputStream import li.cil.oc.common.tileentity.TileEntity +import li.cil.oc.OpenComputers import net.minecraft.entity.player.EntityPlayerMP import net.minecraft.item.ItemStack import net.minecraft.nbt.{CompressedStreamTools, NBTTagCompound} -import net.minecraft.network.packet.Packet250CustomPayload import net.minecraft.world.World -import net.minecraftforge.common.ForgeDirection +import net.minecraftforge.common.util.ForgeDirection import scala.collection.convert.WrapAsScala._ class PacketBuilder(packetType: PacketType.Value, private val stream: ByteArrayOutputStream = new ByteArrayOutputStream) extends DataOutputStream(stream) { @@ -36,7 +36,7 @@ class PacketBuilder(packetType: PacketType.Value, private val stream: ByteArrayO def writeNBT(nbt: NBTTagCompound) = CompressedStreamTools.writeCompressed(nbt, this) - def sendToAllPlayers() = PacketDispatcher.sendPacketToAllPlayers(packet) + def sendToAllPlayers() = OpenComputers.channel.sendToAll(packet) def sendToNearbyPlayers(t: TileEntity, range: Double = 1024): Unit = sendToNearbyPlayers(t.world, t.x + 0.5, t.y + 0.5, t.z + 0.5, range) @@ -53,15 +53,9 @@ class PacketBuilder(packetType: PacketType.Value, private val stream: ByteArrayO } } - def sendToPlayer(player: EntityPlayerMP) = PacketDispatcher.sendPacketToPlayer(packet, player.asInstanceOf[Player]) + def sendToPlayer(player: EntityPlayerMP) = OpenComputers.channel.sendTo(packet, player) - def sendToServer() = PacketDispatcher.sendPacketToServer(packet) + def sendToServer() = OpenComputers.channel.sendToServer(packet) - private def packet = { - val p = new Packet250CustomPayload - p.channel = "OpenComp" - p.data = stream.toByteArray - p.length = stream.size - p - } + private def packet = new FMLProxyPacket(Unpooled.wrappedBuffer(stream.toByteArray), "OpenComputers") } diff --git a/src/main/java/li/cil/oc/common/PacketHandler.scala b/src/main/java/li/cil/oc/common/PacketHandler.scala index 2c103bef6..04180ebf9 100644 --- a/src/main/java/li/cil/oc/common/PacketHandler.scala +++ b/src/main/java/li/cil/oc/common/PacketHandler.scala @@ -1,34 +1,17 @@ package li.cil.oc.common -import cpw.mods.fml.common.network.IPacketHandler -import cpw.mods.fml.common.network.Player -import java.io.ByteArrayInputStream +import io.netty.buffer.{ByteBufInputStream, ByteBuf} import java.io.DataInputStream -import java.util.logging.Level -import li.cil.oc.{Blocks, OpenComputers} +import li.cil.oc.Blocks +import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.ItemStack import net.minecraft.nbt.CompressedStreamTools -import net.minecraft.network.INetworkManager -import net.minecraft.network.packet.Packet250CustomPayload import net.minecraft.world.World -import net.minecraftforge.common.ForgeDirection +import net.minecraftforge.common.util.ForgeDirection import scala.reflect.ClassTag import scala.reflect.classTag -abstract class PacketHandler extends IPacketHandler { - /** Top level dispatcher based on packet type. */ - def onPacketData(manager: INetworkManager, packet: Packet250CustomPayload, player: Player) { - // Don't crash on badly formatted packets (may have been altered by a - // malicious client, in which case we don't want to allow it to kill the - // server like this). Just spam the log a bit... ;) - try { - dispatch(new PacketParser(packet, player)) - } catch { - case e: Throwable => - OpenComputers.log.log(Level.WARNING, "Received a badly formatted packet.", e) - } - } - +abstract class PacketHandler { /** * Gets the world for the specified dimension. * @@ -36,18 +19,16 @@ abstract class PacketHandler extends IPacketHandler { * dimension; None otherwise. For the server it returns the world for the * specified dimension, if such a dimension exists; None otherwise. */ - protected def world(player: Player, dimension: Int): Option[World] + protected def world(player: EntityPlayer, dimension: Int): Option[World] - protected def dispatch(p: PacketParser) - - protected class PacketParser(packet: Packet250CustomPayload, val player: Player) extends DataInputStream(new ByteArrayInputStream(packet.data)) { + protected class PacketParser(data: ByteBuf, val player: EntityPlayer) extends DataInputStream(new ByteBufInputStream(data)) { val packetType = PacketType(readByte()) def getTileEntity[T: ClassTag](dimension: Int, x: Int, y: Int, z: Int): Option[T] = { world(player, dimension) match { case None => // Invalid dimension. case Some(world) => - val t = world.getBlockTileEntity(x, y, z) + val t = world.getTileEntity(x, y, z) if (t != null && classTag[T].runtimeClass.isAssignableFrom(t.getClass)) { return Some(t.asInstanceOf[T]) } diff --git a/src/main/java/li/cil/oc/common/Proxy.scala b/src/main/java/li/cil/oc/common/Proxy.scala index 4cd8daeb9..adc5a220e 100644 --- a/src/main/java/li/cil/oc/common/Proxy.scala +++ b/src/main/java/li/cil/oc/common/Proxy.scala @@ -2,8 +2,8 @@ package li.cil.oc.common import cpw.mods.fml.common.event._ import cpw.mods.fml.common.network.NetworkRegistry -import cpw.mods.fml.common.registry.GameRegistry import li.cil.oc._ +import li.cil.oc.server import li.cil.oc.server.component.Keyboard import li.cil.oc.server.driver import li.cil.oc.server.fs @@ -41,15 +41,18 @@ class Proxy { api.Driver.add(driver.item.WirelessNetworkCard) Recipes.init() - GameRegistry.registerCraftingHandler(CraftingHandler) + + MinecraftForge.EVENT_BUS.register(CraftingHandler) + OpenComputers.channel = NetworkRegistry.INSTANCE.newEventDrivenChannel("OpenComputers") + OpenComputers.channel.register(server.PacketHandler) } def postInit(e: FMLPostInitializationEvent): Unit = { // Don't allow driver registration after this point, to avoid issues. driver.Registry.locked = true - GameRegistry.registerPlayerTracker(Keyboard) - NetworkRegistry.instance.registerConnectionHandler(ConnectionHandler) + MinecraftForge.EVENT_BUS.register(Keyboard) + MinecraftForge.EVENT_BUS.register(ConnectionHandler) MinecraftForge.EVENT_BUS.register(Network) MinecraftForge.EVENT_BUS.register(WirelessNetwork) } diff --git a/src/main/java/li/cil/oc/common/tileentity/TileEntity.scala b/src/main/java/li/cil/oc/common/tileentity/TileEntity.scala index 3ad553309..33052abd7 100644 --- a/src/main/java/li/cil/oc/common/tileentity/TileEntity.scala +++ b/src/main/java/li/cil/oc/common/tileentity/TileEntity.scala @@ -4,8 +4,8 @@ import cpw.mods.fml.relauncher.{Side, SideOnly} import java.util.logging.Level import li.cil.oc.OpenComputers import net.minecraft.nbt.NBTTagCompound -import net.minecraft.network.INetworkManager -import net.minecraft.network.packet.Packet132TileEntityData +import net.minecraft.network.NetworkManager +import net.minecraft.network.play.server.S35PacketUpdateTileEntity import net.minecraft.tileentity.{TileEntity => MCTileEntity} trait TileEntity extends MCTileEntity { @@ -28,11 +28,11 @@ trait TileEntity extends MCTileEntity { override def getDescriptionPacket = { val nbt = new NBTTagCompound() writeToNBTForClient(nbt) - if (nbt.hasNoTags) null else new Packet132TileEntityData(x, y, z, -1, nbt) + if (nbt.hasNoTags) null else new S35PacketUpdateTileEntity(x, y, z, -1, nbt) } - override def onDataPacket(manager: INetworkManager, packet: Packet132TileEntityData) { - try readFromNBTForClient(packet.data) catch { + override def onDataPacket(manager: NetworkManager, packet: S35PacketUpdateTileEntity) { + try readFromNBTForClient(packet.func_148857_g()) catch { case e: Throwable => OpenComputers.log.log(Level.WARNING, "There was a problem handling a TileEntity description packet. Please report this if you see it!", e) } } diff --git a/src/main/java/li/cil/oc/server/PacketHandler.scala b/src/main/java/li/cil/oc/server/PacketHandler.scala index 84b3b80c0..0f0ee0437 100644 --- a/src/main/java/li/cil/oc/server/PacketHandler.scala +++ b/src/main/java/li/cil/oc/server/PacketHandler.scala @@ -1,20 +1,25 @@ package li.cil.oc.server -import cpw.mods.fml.common.network.Player -import li.cil.oc.Settings +import cpw.mods.fml.common.eventhandler.SubscribeEvent +import cpw.mods.fml.common.network.FMLNetworkEvent.ServerCustomPacketEvent import li.cil.oc.common.PacketType import li.cil.oc.common.tileentity._ import li.cil.oc.common.{PacketHandler => CommonPacketHandler} import li.cil.oc.server.component.machine.Machine -import net.minecraft.entity.player.EntityPlayerMP -import net.minecraft.util.ChatMessageComponent -import net.minecraftforge.common.{ForgeDirection, DimensionManager} +import li.cil.oc.Settings +import net.minecraft.entity.player.{EntityPlayer, EntityPlayerMP} +import net.minecraft.network.NetHandlerPlayServer +import net.minecraft.util.ChatComponentTranslation +import net.minecraftforge.common.DimensionManager +import net.minecraftforge.common.util.ForgeDirection -class PacketHandler extends CommonPacketHandler { - override protected def world(player: Player, dimension: Int) = +object PacketHandler extends CommonPacketHandler { + override protected def world(player: EntityPlayer, dimension: Int) = Option(DimensionManager.getWorld(dimension)) - override def dispatch(p: PacketParser) = + @SubscribeEvent + def onPacket(e: ServerCustomPacketEvent) { + val p = new PacketParser(e.packet.payload, e.handler.asInstanceOf[NetHandlerPlayServer].playerEntity) p.packetType match { case PacketType.ComputerPower => onComputerPower(p) case PacketType.KeyDown => onKeyDown(p) @@ -27,6 +32,7 @@ class PacketHandler extends CommonPacketHandler { case PacketType.ServerSide => onServerSide(p) case _ => // Invalid packet. } + } def onComputerPower(p: PacketParser) = p.readTileEntity[TileEntity]() match { @@ -50,7 +56,7 @@ class PacketHandler extends CommonPacketHandler { if (!computer.isPaused) { computer.start() computer.lastError match { - case Some(message) => player.sendChatToPlayer(ChatMessageComponent.createFromTranslationKey(message)) + case Some(message) => player.addChatMessage(new ChatComponentTranslation(message)) case _ => } } diff --git a/src/main/java/li/cil/oc/server/Proxy.scala b/src/main/java/li/cil/oc/server/Proxy.scala index 2b9e54bd7..de3812833 100644 --- a/src/main/java/li/cil/oc/server/Proxy.scala +++ b/src/main/java/li/cil/oc/server/Proxy.scala @@ -9,6 +9,6 @@ private[oc] class Proxy extends CommonProxy { override def init(e: FMLInitializationEvent) = { super.init(e) - NetworkRegistry.instance.registerGuiHandler(OpenComputers, GuiHandler) + NetworkRegistry.INSTANCE.registerGuiHandler(OpenComputers, GuiHandler) } } diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index 7e81db182..49c14db23 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -4,13 +4,13 @@ "modid": "OpenComputers", "name": "OpenComputers", "description": "This mod adds modular computers and robots that can be programmed in Lua.", - "version": "1.2.0", - "mcversion": "1.6.4", + "version": "2.0.0", + "mcversion": "1.7.2", "url": "https://github.com/MightyPirates/OpenComputers/wiki", "authors": ["Florian 'Sangar' Nücke", "Johannes 'Lord Joda' Lohrer", "Everyone who contributed to the mod on Github - thank you!"], "credits" : "Inspired by a couple of other mods, most notably ComputerCraft.", "logoFile" : "assets/opencomputers/textures/gui/logo.png", - "requiredMods": [ "Forge@[9.11.1.940,)" ], + "requiredMods": [ "Forge@[10.12.0.1024,)" ], "dependencies": [ "BuildCraft|Energy", "ComputerCraft", diff --git a/src/main/resources/reference.conf b/src/main/resources/reference.conf index 32b56f7c6..07165432f 100644 --- a/src/main/resources/reference.conf +++ b/src/main/resources/reference.conf @@ -5,21 +5,6 @@ # Note that all mentions of 'KB' or 'kilobyte' mean 1024 bytes. opencomputers { - # IDs used by the mod, adjust these if you get conflicts. - ids { - # The item ID used for all non-damageable items. - item: 4600 - - # List of block IDs the mod uses for different types of blocks. This list - # must contain exactly four entries, or it will be ignored. - block: [ - 3650 - 3651 - 3652 - 3653 - ] - } - # Client side settings, presentation and performance related stuff. client { # The distance at which to start fading out the text on screens. This is