mirror of
https://github.com/MightyPirates/OpenComputers.git
synced 2025-09-17 03:05:30 -04:00
network changes
This commit is contained in:
parent
55861d349f
commit
9910456dcc
@ -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)
|
||||
|
||||
|
@ -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.
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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")
|
||||
}
|
||||
|
@ -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])
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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 _ =>
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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",
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user