network changes

This commit is contained in:
Florian Nücke 2014-02-07 14:19:54 +01:00
parent 55861d349f
commit 9910456dcc
11 changed files with 69 additions and 109 deletions

View File

@ -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)

View File

@ -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.
}

View File

@ -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)
}

View File

@ -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")
}

View File

@ -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])
}

View File

@ -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)
}

View File

@ -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)
}
}

View File

@ -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 _ =>
}
}

View File

@ -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)
}
}

View File

@ -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",

View File

@ -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