blob: 572fae1ed9aef0931b686931567875158a09e27e [file] [log] [blame] [raw]
package li.cil.oc.server
import cpw.mods.fml.common.network.Player
import li.cil.oc.api.INetworkNode
import li.cil.oc.common.PacketBuilder
import li.cil.oc.common.PacketType
import li.cil.oc.common.tileentity.TileEntityComputer
import li.cil.oc.common.tileentity.TileEntityRotatable
import li.cil.oc.common.tileentity.TileEntityScreen
import li.cil.oc.common.{PacketHandler => CommonPacketHandler}
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.KeyDown => onKeyDown(p)
case PacketType.KeyUp => onKeyUp(p)
case PacketType.Clipboard => onClipboard(p)
case _ => // Invalid packet.
}
def onScreenBufferRequest(p: PacketParser) =
p.readTileEntity[TileEntityScreen]() match {
case None => // Invalid packet.
case Some(t) => {
val pb = new PacketBuilder(PacketType.ScreenBufferResponse)
pb.writeTileEntity(t)
pb.writeUTF(t.screen.text)
pb.sendToPlayer(p.player)
}
}
def onComputerStateRequest(p: PacketParser) =
p.readTileEntity[TileEntityComputer]() match {
case None => // Invalid packet.
case Some(t) => {
val pb = new PacketBuilder(PacketType.ComputerStateResponse)
pb.writeTileEntity(t)
pb.writeBoolean(t.isOn)
pb.sendToPlayer(p.player)
}
}
def onRotatableStateRequest(p: PacketParser) =
p.readTileEntity[TileEntityRotatable]() match {
case None => // Invalid packet.
case Some(t) => {
val pb = new PacketBuilder(PacketType.RotatableStateResponse)
pb.writeTileEntity(t)
pb.writeDirection(t.pitch)
pb.writeDirection(t.yaw)
pb.sendToPlayer(p.player)
}
}
def onKeyDown(p: PacketParser) =
p.readTileEntity[INetworkNode]() match {
case None => // Invalid packet.
case Some(n) => n.network.sendToAll(n, "keyboard.keyDown", p.player, p.readChar(), p.readInt())
}
def onKeyUp(p: PacketParser) =
p.readTileEntity[INetworkNode]() match {
case None => // Invalid packet.
case Some(n) => n.network.sendToAll(n, "keyboard.keyUp", p.player, p.readChar(), p.readInt())
}
def onClipboard(p: PacketParser) =
p.readTileEntity[INetworkNode]() match {
case None => // Invalid packet.
case Some(n) => n.network.sendToAll(n, "keyboard.clipboard", p.player, p.readUTF())
}
}