blob: 0241dfcb0853a2ec6aeccf6ac5c3c80eb21f20d6 [file] [log] [blame] [raw]
package li.cil.oc.server
import cpw.mods.fml.common.network.Player
import li.cil.oc.api.network.Node
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.Redstone
import net.minecraft.tileentity.TileEntity
import net.minecraftforge.common.DimensionManager
class PacketHandler extends CommonPacketHandler {
protected def world(player: Player, dimension: Int) =
Option(DimensionManager.getWorld(dimension))
def dispatch(p: PacketParser) =
p.packetType match {
case PacketType.ScreenBufferRequest => onScreenBufferRequest(p)
case PacketType.ComputerStateRequest => onComputerStateRequest(p)
case PacketType.RotatableStateRequest => onRotatableStateRequest(p)
case PacketType.RedstoneStateRequest => onRedstoneStateRequest(p)
case PacketType.KeyDown => onKeyDown(p)
case PacketType.KeyUp => onKeyUp(p)
case PacketType.Clipboard => onClipboard(p)
case _ => // Invalid packet.
}
def onScreenBufferRequest(p: PacketParser) =
p.readTileEntity[tileentity.Screen]() match {
case Some(t) =>
val (w, h) = t.instance.resolution
PacketSender.sendScreenBufferState(t, w, h, t.instance.text, Option(p.player))
case _ => // Invalid packet.
}
def onComputerStateRequest(p: PacketParser) =
p.readTileEntity[tileentity.Computer]() match {
case Some(t) => PacketSender.sendComputerState(t, t.isOn, Option(p.player))
case _ => // Invalid packet.
}
def onRotatableStateRequest(p: PacketParser) =
p.readTileEntity[tileentity.Rotatable]() match {
case Some(t) => PacketSender.sendRotatableState(t, Option(p.player))
case _ => // Invalid packet.
}
def onRedstoneStateRequest(p: PacketParser) =
p.readTileEntity[TileEntity with Redstone]() match {
case Some(t) => PacketSender.sendRedstoneState(t, Option(p.player))
case _ => // Invalid packet.
}
def onKeyDown(p: PacketParser) =
p.readTileEntity[Node]() match {
case Some(s: tileentity.Screen) =>
val char = Char.box(p.readChar())
val code = Int.box(p.readInt())
val network = s.origin.network
s.screens.foreach(n => network.foreach(_.sendToNeighbors(n, "keyboard.keyDown", p.player, char, code)))
case Some(n) => n.network.foreach(_.sendToNeighbors(n, "keyboard.keyDown", p.player, Char.box(p.readChar()), Int.box(p.readInt())))
case _ => // Invalid packet.
}
def onKeyUp(p: PacketParser) =
p.readTileEntity[Node]() match {
case Some(s: tileentity.Screen) =>
val char = Char.box(p.readChar())
val code = Int.box(p.readInt())
val network = s.origin.network
s.screens.foreach(n => network.foreach(_.sendToNeighbors(n, "keyboard.keyUp", p.player, char, code)))
case Some(n) => n.network.foreach(_.sendToNeighbors(n, "keyboard.keyUp", p.player, Char.box(p.readChar()), Int.box(p.readInt())))
case _ => // Invalid packet.
}
def onClipboard(p: PacketParser) =
p.readTileEntity[Node]() match {
case Some(s: tileentity.Screen) =>
val value = p.readUTF()
val network = s.origin.network
s.screens.foreach(n => network.foreach(_.sendToNeighbors(n, "keyboard.clipboard", p.player, value)))
case Some(n) => n.network.foreach(_.sendToNeighbors(n, "keyboard.clipboard", p.player, p.readUTF()))
case _ => // Invalid packet.
}
}