mirror of
https://github.com/MightyPirates/OpenComputers.git
synced 2025-09-17 19:25:20 -04:00
Merge branch 'master' of github.com:MightyPirates/OpenComputers into master-MC1.7.10
Conflicts: src/main/scala/li/cil/oc/client/PacketHandler.scala src/main/scala/li/cil/oc/common/PacketBuilder.scala
This commit is contained in:
commit
dbc7ad14bc
@ -1,9 +1,12 @@
|
||||
package li.cil.oc.client
|
||||
|
||||
import java.io.EOFException
|
||||
|
||||
import cpw.mods.fml.common.eventhandler.SubscribeEvent
|
||||
import cpw.mods.fml.common.network.FMLNetworkEvent.ClientCustomPacketEvent
|
||||
import li.cil.oc.Localization
|
||||
import li.cil.oc.api.component
|
||||
import li.cil.oc.api.network.ManagedEnvironment
|
||||
import li.cil.oc.client.renderer.PetRenderer
|
||||
import li.cil.oc.common.tileentity._
|
||||
import li.cil.oc.common.tileentity.traits._
|
||||
@ -59,6 +62,7 @@ object PacketHandler extends CommonPacketHandler {
|
||||
case PacketType.TextBufferInit => onTextBufferInit(p)
|
||||
case PacketType.TextBufferPaletteChange => onTextBufferPaletteChange(p)
|
||||
case PacketType.TextBufferPowerChange => onTextBufferPowerChange(p)
|
||||
case PacketType.TextBufferMulti => onTextBufferMulti(p)
|
||||
case PacketType.TextBufferResolutionChange => onTextBufferResolutionChange(p)
|
||||
case PacketType.TextBufferSet => onTextBufferSet(p)
|
||||
case PacketType.ScreenTouchMode => onScreenTouchMode(p)
|
||||
@ -286,8 +290,8 @@ object PacketHandler extends CommonPacketHandler {
|
||||
case _ => // Invalid packet.
|
||||
}
|
||||
|
||||
def onTextBufferColorChange(p: PacketParser) {
|
||||
ComponentTracker.get(p.readUTF()) match {
|
||||
def onTextBufferColorChange(p: PacketParser, env: Option[ManagedEnvironment] = None) {
|
||||
env.orElse(ComponentTracker.get(p.readUTF())) match {
|
||||
case Some(buffer: component.TextBuffer) =>
|
||||
val foreground = p.readInt()
|
||||
val foregroundIsPalette = p.readBoolean()
|
||||
@ -299,8 +303,8 @@ object PacketHandler extends CommonPacketHandler {
|
||||
}
|
||||
}
|
||||
|
||||
def onTextBufferCopy(p: PacketParser) {
|
||||
ComponentTracker.get(p.readUTF()) match {
|
||||
def onTextBufferCopy(p: PacketParser, env: Option[ManagedEnvironment] = None) {
|
||||
env.orElse(ComponentTracker.get(p.readUTF())) match {
|
||||
case Some(buffer: component.TextBuffer) =>
|
||||
val col = p.readInt()
|
||||
val row = p.readInt()
|
||||
@ -313,16 +317,16 @@ object PacketHandler extends CommonPacketHandler {
|
||||
}
|
||||
}
|
||||
|
||||
def onTextBufferDepthChange(p: PacketParser) {
|
||||
ComponentTracker.get(p.readUTF()) match {
|
||||
def onTextBufferDepthChange(p: PacketParser, env: Option[ManagedEnvironment] = None) {
|
||||
env.orElse(ComponentTracker.get(p.readUTF())) match {
|
||||
case Some(buffer: component.TextBuffer) =>
|
||||
buffer.setColorDepth(component.TextBuffer.ColorDepth.values.apply(p.readInt()))
|
||||
case _ => // Invalid packet.
|
||||
}
|
||||
}
|
||||
|
||||
def onTextBufferFill(p: PacketParser) {
|
||||
ComponentTracker.get(p.readUTF()) match {
|
||||
def onTextBufferFill(p: PacketParser, env: Option[ManagedEnvironment] = None) {
|
||||
env.orElse(ComponentTracker.get(p.readUTF())) match {
|
||||
case Some(buffer: component.TextBuffer) =>
|
||||
val col = p.readInt()
|
||||
val row = p.readInt()
|
||||
@ -341,8 +345,8 @@ object PacketHandler extends CommonPacketHandler {
|
||||
}
|
||||
}
|
||||
|
||||
def onTextBufferPaletteChange(p: PacketParser) {
|
||||
ComponentTracker.get(p.readUTF()) match {
|
||||
def onTextBufferPaletteChange(p: PacketParser, env: Option[ManagedEnvironment] = None) {
|
||||
env.orElse(ComponentTracker.get(p.readUTF())) match {
|
||||
case Some(buffer: component.TextBuffer) =>
|
||||
val index = p.readInt()
|
||||
val color = p.readInt()
|
||||
@ -358,8 +362,29 @@ object PacketHandler extends CommonPacketHandler {
|
||||
case _ => // Invalid packet.
|
||||
}
|
||||
|
||||
def onTextBufferResolutionChange(p: PacketParser) {
|
||||
def onTextBufferMulti(p: PacketParser) =
|
||||
ComponentTracker.get(p.readUTF()) match {
|
||||
case Some(buffer: component.TextBuffer) =>
|
||||
try while (true) {
|
||||
p.readPacketType() match {
|
||||
case PacketType.TextBufferColorChange => onTextBufferColorChange(p, Some(buffer))
|
||||
case PacketType.TextBufferCopy => onTextBufferCopy(p, Some(buffer))
|
||||
case PacketType.TextBufferDepthChange => onTextBufferDepthChange(p, Some(buffer))
|
||||
case PacketType.TextBufferFill => onTextBufferFill(p, Some(buffer))
|
||||
case PacketType.TextBufferPaletteChange => onTextBufferPaletteChange(p, Some(buffer))
|
||||
case PacketType.TextBufferResolutionChange => onTextBufferResolutionChange(p, Some(buffer))
|
||||
case PacketType.TextBufferSet => onTextBufferSet(p, Some(buffer))
|
||||
case _ => // Invalid packet.
|
||||
}
|
||||
}
|
||||
catch {
|
||||
case ignored: EOFException => // No more commands.
|
||||
}
|
||||
case _ => // Invalid packet.
|
||||
}
|
||||
|
||||
def onTextBufferResolutionChange(p: PacketParser, env: Option[ManagedEnvironment] = None) {
|
||||
env.orElse(ComponentTracker.get(p.readUTF())) match {
|
||||
case Some(buffer: component.TextBuffer) =>
|
||||
val w = p.readInt()
|
||||
val h = p.readInt()
|
||||
@ -368,8 +393,8 @@ object PacketHandler extends CommonPacketHandler {
|
||||
}
|
||||
}
|
||||
|
||||
def onTextBufferSet(p: PacketParser) {
|
||||
ComponentTracker.get(p.readUTF()) match {
|
||||
def onTextBufferSet(p: PacketParser, env: Option[ManagedEnvironment] = None) {
|
||||
env.orElse(ComponentTracker.get(p.readUTF())) match {
|
||||
case Some(buffer: component.TextBuffer) =>
|
||||
val col = p.readInt()
|
||||
val row = p.readInt()
|
||||
|
@ -3,7 +3,7 @@ package li.cil.oc.client
|
||||
import li.cil.oc.Settings
|
||||
import li.cil.oc.common.tileentity._
|
||||
import li.cil.oc.common.tileentity.traits.Computer
|
||||
import li.cil.oc.common.{CompressedPacketBuilder, PacketBuilder, PacketType}
|
||||
import li.cil.oc.common.{CompressedPacketBuilder, PacketType, SimplePacketBuilder}
|
||||
import net.minecraft.client.Minecraft
|
||||
import net.minecraft.client.audio.PositionedSoundRecord
|
||||
import net.minecraft.util.ResourceLocation
|
||||
@ -15,7 +15,7 @@ object PacketSender {
|
||||
protected var clipboardCooldown = 0L
|
||||
|
||||
def sendComputerPower(t: Computer, power: Boolean) {
|
||||
val pb = new PacketBuilder(PacketType.ComputerPower)
|
||||
val pb = new SimplePacketBuilder(PacketType.ComputerPower)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
pb.writeBoolean(power)
|
||||
@ -24,7 +24,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendKeyDown(address: String, char: Char, code: Int) {
|
||||
val pb = new PacketBuilder(PacketType.KeyDown)
|
||||
val pb = new SimplePacketBuilder(PacketType.KeyDown)
|
||||
|
||||
pb.writeUTF(address)
|
||||
pb.writeChar(char)
|
||||
@ -34,7 +34,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendKeyUp(address: String, char: Char, code: Int) {
|
||||
val pb = new PacketBuilder(PacketType.KeyUp)
|
||||
val pb = new SimplePacketBuilder(PacketType.KeyUp)
|
||||
|
||||
pb.writeUTF(address)
|
||||
pb.writeChar(char)
|
||||
@ -65,7 +65,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendMouseClick(address: String, x: Int, y: Int, drag: Boolean, button: Int) {
|
||||
val pb = new PacketBuilder(PacketType.MouseClickOrDrag)
|
||||
val pb = new SimplePacketBuilder(PacketType.MouseClickOrDrag)
|
||||
|
||||
pb.writeUTF(address)
|
||||
pb.writeShort(x)
|
||||
@ -77,7 +77,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendMouseScroll(address: String, x: Int, y: Int, scroll: Int) {
|
||||
val pb = new PacketBuilder(PacketType.MouseScroll)
|
||||
val pb = new SimplePacketBuilder(PacketType.MouseScroll)
|
||||
|
||||
pb.writeUTF(address)
|
||||
pb.writeShort(x)
|
||||
@ -88,7 +88,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendMouseUp(address: String, x: Int, y: Int, button: Int) {
|
||||
val pb = new PacketBuilder(PacketType.MouseUp)
|
||||
val pb = new SimplePacketBuilder(PacketType.MouseUp)
|
||||
|
||||
pb.writeUTF(address)
|
||||
pb.writeShort(x)
|
||||
@ -99,12 +99,12 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendMultiPlace() {
|
||||
val pb = new PacketBuilder(PacketType.MultiPartPlace)
|
||||
val pb = new SimplePacketBuilder(PacketType.MultiPartPlace)
|
||||
pb.sendToServer()
|
||||
}
|
||||
|
||||
def sendPetVisibility() {
|
||||
val pb = new PacketBuilder(PacketType.PetVisibility)
|
||||
val pb = new SimplePacketBuilder(PacketType.PetVisibility)
|
||||
|
||||
pb.writeBoolean(!Settings.get.hideOwnPet)
|
||||
|
||||
@ -112,7 +112,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendRobotAssemblerStart(t: RobotAssembler) {
|
||||
val pb = new PacketBuilder(PacketType.RobotAssemblerStart)
|
||||
val pb = new SimplePacketBuilder(PacketType.RobotAssemblerStart)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
|
||||
@ -120,7 +120,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendRobotStateRequest(dimension: Int, x: Int, y: Int, z: Int) {
|
||||
val pb = new PacketBuilder(PacketType.RobotStateRequest)
|
||||
val pb = new SimplePacketBuilder(PacketType.RobotStateRequest)
|
||||
|
||||
pb.writeInt(dimension)
|
||||
pb.writeInt(x)
|
||||
@ -131,7 +131,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendServerPower(t: ServerRack, number: Int, power: Boolean) {
|
||||
val pb = new PacketBuilder(PacketType.ComputerPower)
|
||||
val pb = new SimplePacketBuilder(PacketType.ComputerPower)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
pb.writeInt(number)
|
||||
@ -141,7 +141,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendServerRange(t: ServerRack, range: Int) {
|
||||
val pb = new PacketBuilder(PacketType.ServerRange)
|
||||
val pb = new SimplePacketBuilder(PacketType.ServerRange)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
pb.writeInt(range)
|
||||
@ -150,7 +150,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendServerSide(t: ServerRack, number: Int, side: ForgeDirection) {
|
||||
val pb = new PacketBuilder(PacketType.ServerSide)
|
||||
val pb = new SimplePacketBuilder(PacketType.ServerSide)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
pb.writeInt(number)
|
||||
@ -160,7 +160,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendServerSwitchMode(t: ServerRack, internal: Boolean) {
|
||||
val pb = new PacketBuilder(PacketType.ServerSwitchMode)
|
||||
val pb = new SimplePacketBuilder(PacketType.ServerSwitchMode)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
pb.writeBoolean(internal)
|
||||
@ -169,7 +169,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendTextBufferInit(address: String) {
|
||||
val pb = new PacketBuilder(PacketType.TextBufferInit)
|
||||
val pb = new SimplePacketBuilder(PacketType.TextBufferInit)
|
||||
|
||||
pb.writeUTF(address)
|
||||
|
||||
|
@ -17,8 +17,7 @@ import net.minecraftforge.common.util.ForgeDirection
|
||||
|
||||
import scala.collection.convert.WrapAsScala._
|
||||
|
||||
// Necessary to keep track of the GZIP stream.
|
||||
abstract class PacketBuilderBase[T <: OutputStream](protected val stream: T) extends DataOutputStream(stream) {
|
||||
abstract class PacketBuilder(stream: OutputStream) extends DataOutputStream(stream) {
|
||||
def writeTileEntity(t: TileEntity) = {
|
||||
writeInt(t.getWorldObj.provider.dimensionId)
|
||||
writeInt(t.xCoord)
|
||||
@ -38,6 +37,8 @@ abstract class PacketBuilderBase[T <: OutputStream](protected val stream: T) ext
|
||||
|
||||
def writeNBT(nbt: NBTTagCompound) = CompressedStreamTools.writeCompressed(nbt, this)
|
||||
|
||||
def writePacketType(pt: PacketType.Value) = writeByte(pt.id)
|
||||
|
||||
def sendToAllPlayers() = OpenComputers.channel.sendToAll(packet)
|
||||
|
||||
def sendToNearbyPlayers(t: TileEntity, range: Double = 1024): Unit = sendToNearbyPlayers(t.getWorldObj, t.xCoord + 0.5, t.yCoord + 0.5, t.zCoord + 0.5, range)
|
||||
@ -64,7 +65,10 @@ abstract class PacketBuilderBase[T <: OutputStream](protected val stream: T) ext
|
||||
protected def packet: FMLProxyPacket
|
||||
}
|
||||
|
||||
class PacketBuilder(packetType: PacketType.Value) extends PacketBuilderBase(PacketBuilder.newData(compressed = false)) {
|
||||
// Necessary to keep track of the GZIP stream.
|
||||
abstract class PacketBuilderBase[T <: OutputStream](protected val stream: T) extends PacketBuilder(stream)
|
||||
|
||||
class SimplePacketBuilder(packetType: PacketType.Value) extends PacketBuilderBase(PacketBuilder.newData(compressed = false)) {
|
||||
writeByte(packetType.id)
|
||||
|
||||
override protected def packet = {
|
||||
|
@ -82,6 +82,8 @@ abstract class PacketHandler {
|
||||
}
|
||||
|
||||
def readNBT() = CompressedStreamTools.readCompressed(this)
|
||||
|
||||
def readPacketType() = PacketType(readByte())
|
||||
}
|
||||
|
||||
}
|
@ -32,6 +32,7 @@ object PacketType extends Enumeration {
|
||||
TextBufferDepthChange,
|
||||
TextBufferFill,
|
||||
TextBufferInit, // Goes both ways.
|
||||
TextBufferMulti,
|
||||
TextBufferPaletteChange,
|
||||
TextBufferPowerChange,
|
||||
TextBufferResolutionChange,
|
||||
|
@ -30,13 +30,12 @@ object SaveHandler {
|
||||
scheduleSave(owner.world, owner.x, owner.z, nbt, name, data)
|
||||
}
|
||||
|
||||
def scheduleSave(owner: Owner, nbt: NBTTagCompound, name: String, save: NBTTagCompound => Unit) {
|
||||
scheduleSave(owner, nbt, name, writeNBT(save))
|
||||
}
|
||||
|
||||
def scheduleSave(container: Container, nbt: NBTTagCompound, name: String, save: NBTTagCompound => Unit) {
|
||||
val tmpNbt = new NBTTagCompound()
|
||||
save(tmpNbt)
|
||||
val baos = new ByteArrayOutputStream()
|
||||
val dos = new DataOutputStream(baos)
|
||||
CompressedStreamTools.write(tmpNbt, dos)
|
||||
scheduleSave(container.world, math.round(container.xPosition - 0.5).toInt, math.round(container.zPosition - 0.5).toInt, nbt, name, baos.toByteArray)
|
||||
scheduleSave(container.world, math.round(container.xPosition - 0.5).toInt, math.round(container.zPosition - 0.5).toInt, nbt, name, writeNBT(save))
|
||||
}
|
||||
|
||||
def scheduleSave(world: World, x: Int, z: Int, nbt: NBTTagCompound, name: String, data: Array[Byte]) {
|
||||
@ -52,6 +51,19 @@ object SaveHandler {
|
||||
scheduleSave(dimension, chunk, name, data)
|
||||
}
|
||||
|
||||
def scheduleSave(world: World, x: Int, z: Int, nbt: NBTTagCompound, name: String, save: NBTTagCompound => Unit) {
|
||||
scheduleSave(world, x, z, nbt, name, writeNBT(save))
|
||||
}
|
||||
|
||||
private def writeNBT(save: NBTTagCompound => Unit) = {
|
||||
val tmpNbt = new NBTTagCompound()
|
||||
save(tmpNbt)
|
||||
val baos = new ByteArrayOutputStream()
|
||||
val dos = new DataOutputStream(baos)
|
||||
CompressedStreamTools.write(tmpNbt, dos)
|
||||
baos.toByteArray
|
||||
}
|
||||
|
||||
def loadNBT(nbt: NBTTagCompound, name: String): NBTTagCompound = {
|
||||
val data = load(nbt, name)
|
||||
val bais = new ByteArrayInputStream(data)
|
||||
|
@ -8,7 +8,7 @@ import li.cil.oc.api.driver.Container
|
||||
import li.cil.oc.api.network._
|
||||
import li.cil.oc.client.renderer.TextBufferRenderCache
|
||||
import li.cil.oc.client.{ComponentTracker => ClientComponentTracker, PacketSender => ClientPacketSender}
|
||||
import li.cil.oc.common.{SaveHandler, tileentity}
|
||||
import li.cil.oc.common._
|
||||
import li.cil.oc.server.component.Keyboard
|
||||
import li.cil.oc.server.{ComponentTracker => ServerComponentTracker, PacketSender => ServerPacketSender}
|
||||
import li.cil.oc.util.{PackedColor, SideTracker}
|
||||
@ -43,6 +43,15 @@ class TextBuffer(val owner: Container) extends ManagedComponent with api.compone
|
||||
|
||||
private var relativeLitArea = -1.0
|
||||
|
||||
private var _pendingCommands: Option[PacketBuilder] = None
|
||||
|
||||
private def pendingCommands = _pendingCommands.getOrElse {
|
||||
val pb = new CompressedPacketBuilder(PacketType.TextBufferMulti)
|
||||
pb.writeUTF(node.address)
|
||||
_pendingCommands = Some(pb)
|
||||
pb
|
||||
}
|
||||
|
||||
var fullyLitCost = computeFullyLitCost()
|
||||
|
||||
// This computes the energy cost (per tick) to keep the screen running if
|
||||
@ -96,6 +105,11 @@ class TextBuffer(val owner: Container) extends ManagedComponent with api.compone
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.synchronized {
|
||||
_pendingCommands.foreach(_.sendToNearbyPlayers(owner))
|
||||
_pendingCommands = None
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------- //
|
||||
@ -550,41 +564,41 @@ object TextBuffer {
|
||||
class ServerProxy(val owner: TextBuffer) extends Proxy {
|
||||
override def onScreenColorChange() {
|
||||
owner.owner.markChanged()
|
||||
ServerPacketSender.sendTextBufferColorChange(owner.node.address, owner.data.foreground, owner.data.background, owner.owner)
|
||||
owner.synchronized(ServerPacketSender.appendTextBufferColorChange(owner.pendingCommands, owner.data.foreground, owner.data.background))
|
||||
}
|
||||
|
||||
override def onScreenCopy(col: Int, row: Int, w: Int, h: Int, tx: Int, ty: Int) {
|
||||
super.onScreenCopy(col, row, w, h, tx, ty)
|
||||
owner.owner.markChanged()
|
||||
ServerPacketSender.sendTextBufferCopy(owner.node.address, col, row, w, h, tx, ty, owner.owner)
|
||||
owner.synchronized(ServerPacketSender.appendTextBufferCopy(owner.pendingCommands, col, row, w, h, tx, ty))
|
||||
}
|
||||
|
||||
override def onScreenDepthChange(depth: ColorDepth) {
|
||||
owner.owner.markChanged()
|
||||
ServerPacketSender.sendTextBufferDepthChange(owner.node.address, depth, owner.owner)
|
||||
owner.synchronized(ServerPacketSender.appendTextBufferDepthChange(owner.pendingCommands, depth))
|
||||
}
|
||||
|
||||
override def onScreenFill(col: Int, row: Int, w: Int, h: Int, c: Char) {
|
||||
super.onScreenFill(col, row, w, h, c)
|
||||
owner.owner.markChanged()
|
||||
ServerPacketSender.sendTextBufferFill(owner.node.address, col, row, w, h, c, owner.owner)
|
||||
owner.synchronized(ServerPacketSender.appendTextBufferFill(owner.pendingCommands, col, row, w, h, c))
|
||||
}
|
||||
|
||||
override def onScreenPaletteChange(index: Int) {
|
||||
owner.owner.markChanged()
|
||||
ServerPacketSender.sendTextBufferPaletteChange(owner.node.address, index, owner.getPaletteColor(index), owner.owner)
|
||||
owner.synchronized(ServerPacketSender.appendTextBufferPaletteChange(owner.pendingCommands, index, owner.getPaletteColor(index)))
|
||||
}
|
||||
|
||||
override def onScreenResolutionChange(w: Int, h: Int) {
|
||||
super.onScreenResolutionChange(w, h)
|
||||
owner.owner.markChanged()
|
||||
ServerPacketSender.sendTextBufferResolutionChange(owner.node.address, w, h, owner.owner)
|
||||
owner.synchronized(ServerPacketSender.appendTextBufferResolutionChange(owner.pendingCommands, w, h))
|
||||
}
|
||||
|
||||
override def onScreenSet(col: Int, row: Int, s: String, vertical: Boolean) {
|
||||
super.onScreenSet(col, row, s, vertical)
|
||||
owner.owner.markChanged()
|
||||
ServerPacketSender.sendTextBufferSet(owner.node.address, col, row, s, vertical, owner.owner)
|
||||
owner.synchronized(ServerPacketSender.appendTextBufferSet(owner.pendingCommands, col, row, s, vertical))
|
||||
}
|
||||
|
||||
override def keyDown(character: Char, code: Int, player: EntityPlayer) {
|
||||
|
@ -2,6 +2,7 @@ package li.cil.oc.common.tileentity
|
||||
|
||||
import cpw.mods.fml.relauncher.{Side, SideOnly}
|
||||
import li.cil.oc.api.network._
|
||||
import li.cil.oc.common.SaveHandler
|
||||
import li.cil.oc.server.{PacketSender => ServerPacketSender}
|
||||
import li.cil.oc.{Settings, api}
|
||||
import net.minecraft.entity.player.EntityPlayer
|
||||
@ -308,16 +309,25 @@ class Hologram(var tier: Int) extends traits.Environment with SidedEnvironment w
|
||||
override def readFromNBT(nbt: NBTTagCompound) {
|
||||
tier = nbt.getByte(Settings.namespace + "tier") max 0 min 1
|
||||
super.readFromNBT(nbt)
|
||||
nbt.getIntArray(Settings.namespace + "volume").copyToArray(volume)
|
||||
nbt.getIntArray(Settings.namespace + "colors").map(convertColor).copyToArray(colors)
|
||||
if (nbt.hasKey(Settings.namespace + "volume") && nbt.hasKey(Settings.namespace + "colors")) {
|
||||
nbt.getIntArray(Settings.namespace + "volume").copyToArray(volume)
|
||||
nbt.getIntArray(Settings.namespace + "colors").map(convertColor).copyToArray(colors)
|
||||
}
|
||||
else {
|
||||
val tag = SaveHandler.loadNBT(nbt, node.address + "_data")
|
||||
tag.getIntArray("volume").copyToArray(volume)
|
||||
tag.getIntArray("colors").map(convertColor).copyToArray(colors)
|
||||
}
|
||||
scale = nbt.getDouble(Settings.namespace + "scale")
|
||||
}
|
||||
|
||||
override def writeToNBT(nbt: NBTTagCompound) = this.synchronized {
|
||||
nbt.setByte(Settings.namespace + "tier", tier.toByte)
|
||||
super.writeToNBT(nbt)
|
||||
nbt.setIntArray(Settings.namespace + "volume", volume)
|
||||
nbt.setIntArray(Settings.namespace + "colors", colors.map(convertColor))
|
||||
SaveHandler.scheduleSave(world, x, z, nbt, node.address + "_data", tag => {
|
||||
tag.setIntArray("volume", volume)
|
||||
tag.setIntArray("colors", colors.map(convertColor))
|
||||
})
|
||||
nbt.setDouble(Settings.namespace + "scale", scale)
|
||||
}
|
||||
|
||||
|
@ -2,8 +2,8 @@ package li.cil.oc.server
|
||||
|
||||
import li.cil.oc.api.component.TextBuffer.ColorDepth
|
||||
import li.cil.oc.api.driver.Container
|
||||
import li.cil.oc.common._
|
||||
import li.cil.oc.common.tileentity.traits._
|
||||
import li.cil.oc.common.{CompressedPacketBuilder, PacketBuilder, PacketType, tileentity}
|
||||
import li.cil.oc.util.PackedColor
|
||||
import net.minecraft.entity.player.EntityPlayerMP
|
||||
import net.minecraft.item.ItemStack
|
||||
@ -13,7 +13,7 @@ import net.minecraftforge.common.util.ForgeDirection
|
||||
|
||||
object PacketSender {
|
||||
def sendAbstractBusState(t: AbstractBusAware) {
|
||||
val pb = new PacketBuilder(PacketType.AbstractBusState)
|
||||
val pb = new SimplePacketBuilder(PacketType.AbstractBusState)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
pb.writeBoolean(t.isAbstractBusAvailable)
|
||||
@ -22,7 +22,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendAnalyze(address: String, player: EntityPlayerMP) {
|
||||
val pb = new PacketBuilder(PacketType.Analyze)
|
||||
val pb = new SimplePacketBuilder(PacketType.Analyze)
|
||||
|
||||
pb.writeUTF(address)
|
||||
|
||||
@ -30,7 +30,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendChargerState(t: tileentity.Charger) {
|
||||
val pb = new PacketBuilder(PacketType.ChargerState)
|
||||
val pb = new SimplePacketBuilder(PacketType.ChargerState)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
pb.writeDouble(t.chargeSpeed)
|
||||
@ -40,7 +40,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendColorChange(t: Colored) {
|
||||
val pb = new PacketBuilder(PacketType.ColorChange)
|
||||
val pb = new SimplePacketBuilder(PacketType.ColorChange)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
pb.writeInt(t.color)
|
||||
@ -49,7 +49,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendComputerState(t: Computer) {
|
||||
val pb = new PacketBuilder(PacketType.ComputerState)
|
||||
val pb = new SimplePacketBuilder(PacketType.ComputerState)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
pb.writeBoolean(t.isRunning)
|
||||
@ -58,7 +58,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendComputerUserList(t: Computer, list: Array[String]) {
|
||||
val pb = new PacketBuilder(PacketType.ComputerUserList)
|
||||
val pb = new SimplePacketBuilder(PacketType.ComputerUserList)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
pb.writeInt(list.length)
|
||||
@ -68,7 +68,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendDisassemblerActive(t: tileentity.Disassembler, active: Boolean) {
|
||||
val pb = new PacketBuilder(PacketType.DisassemblerActiveChange)
|
||||
val pb = new SimplePacketBuilder(PacketType.DisassemblerActiveChange)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
pb.writeBoolean(active)
|
||||
@ -77,7 +77,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendFloppyChange(t: tileentity.DiskDrive, stack: ItemStack = null) {
|
||||
val pb = new PacketBuilder(PacketType.FloppyChange)
|
||||
val pb = new SimplePacketBuilder(PacketType.FloppyChange)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
pb.writeItemStack(stack)
|
||||
@ -86,7 +86,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendHologramClear(t: tileentity.Hologram) {
|
||||
val pb = new PacketBuilder(PacketType.HologramClear)
|
||||
val pb = new SimplePacketBuilder(PacketType.HologramClear)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
|
||||
@ -94,7 +94,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendHologramColor(t: tileentity.Hologram, index: Int, value: Int) {
|
||||
val pb = new PacketBuilder(PacketType.HologramColor)
|
||||
val pb = new SimplePacketBuilder(PacketType.HologramColor)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
pb.writeInt(index)
|
||||
@ -104,7 +104,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendHologramPowerChange(t: tileentity.Hologram) {
|
||||
val pb = new PacketBuilder(PacketType.HologramPowerChange)
|
||||
val pb = new SimplePacketBuilder(PacketType.HologramPowerChange)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
pb.writeBoolean(t.hasPower)
|
||||
@ -113,7 +113,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendHologramScale(t: tileentity.Hologram) {
|
||||
val pb = new PacketBuilder(PacketType.HologramScale)
|
||||
val pb = new SimplePacketBuilder(PacketType.HologramScale)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
pb.writeDouble(t.scale)
|
||||
@ -140,7 +140,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendPetVisibility(name: Option[String] = None, player: Option[EntityPlayerMP] = None) {
|
||||
val pb = new PacketBuilder(PacketType.PetVisibility)
|
||||
val pb = new SimplePacketBuilder(PacketType.PetVisibility)
|
||||
|
||||
name match {
|
||||
case Some(n) =>
|
||||
@ -162,7 +162,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendPowerState(t: PowerInformation) {
|
||||
val pb = new PacketBuilder(PacketType.PowerState)
|
||||
val pb = new SimplePacketBuilder(PacketType.PowerState)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
pb.writeDouble(t.globalBuffer)
|
||||
@ -172,7 +172,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendRedstoneState(t: RedstoneAware) {
|
||||
val pb = new PacketBuilder(PacketType.RedstoneState)
|
||||
val pb = new SimplePacketBuilder(PacketType.RedstoneState)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
pb.writeBoolean(t.isOutputEnabled)
|
||||
@ -184,7 +184,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendRobotAssembling(t: tileentity.RobotAssembler, assembling: Boolean) {
|
||||
val pb = new PacketBuilder(PacketType.RobotAssemblingState)
|
||||
val pb = new SimplePacketBuilder(PacketType.RobotAssemblingState)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
pb.writeBoolean(assembling)
|
||||
@ -193,7 +193,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendRobotMove(t: tileentity.Robot, ox: Int, oy: Int, oz: Int, direction: ForgeDirection) {
|
||||
val pb = new PacketBuilder(PacketType.RobotMove)
|
||||
val pb = new SimplePacketBuilder(PacketType.RobotMove)
|
||||
|
||||
// Custom pb.writeTileEntity() with fake coordinates (valid for the client).
|
||||
pb.writeInt(t.proxy.world.provider.dimensionId)
|
||||
@ -206,7 +206,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendRobotAnimateSwing(t: tileentity.Robot) {
|
||||
val pb = new PacketBuilder(PacketType.RobotAnimateSwing)
|
||||
val pb = new SimplePacketBuilder(PacketType.RobotAnimateSwing)
|
||||
|
||||
pb.writeTileEntity(t.proxy)
|
||||
pb.writeInt(t.animationTicksTotal)
|
||||
@ -215,7 +215,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendRobotAnimateTurn(t: tileentity.Robot) {
|
||||
val pb = new PacketBuilder(PacketType.RobotAnimateTurn)
|
||||
val pb = new SimplePacketBuilder(PacketType.RobotAnimateTurn)
|
||||
|
||||
pb.writeTileEntity(t.proxy)
|
||||
pb.writeByte(t.turnAxis)
|
||||
@ -225,7 +225,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendRobotInventory(t: tileentity.Robot, slot: Int, stack: ItemStack) {
|
||||
val pb = new PacketBuilder(PacketType.RobotInventoryChange)
|
||||
val pb = new SimplePacketBuilder(PacketType.RobotInventoryChange)
|
||||
|
||||
pb.writeTileEntity(t.proxy)
|
||||
pb.writeInt(slot)
|
||||
@ -235,7 +235,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendRobotSelectedSlotChange(t: tileentity.Robot) {
|
||||
val pb = new PacketBuilder(PacketType.RobotSelectedSlotChange)
|
||||
val pb = new SimplePacketBuilder(PacketType.RobotSelectedSlotChange)
|
||||
|
||||
pb.writeTileEntity(t.proxy)
|
||||
pb.writeInt(t.selectedSlot)
|
||||
@ -244,7 +244,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendRotatableState(t: Rotatable) {
|
||||
val pb = new PacketBuilder(PacketType.RotatableState)
|
||||
val pb = new SimplePacketBuilder(PacketType.RotatableState)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
pb.writeDirection(t.pitch)
|
||||
@ -254,59 +254,70 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendSwitchActivity(t: tileentity.Switch) {
|
||||
val pb = new PacketBuilder(PacketType.SwitchActivity)
|
||||
val pb = new SimplePacketBuilder(PacketType.SwitchActivity)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
|
||||
pb.sendToNearbyPlayers(t, 64)
|
||||
}
|
||||
|
||||
def sendTextBufferColorChange(address: String, foreground: PackedColor.Color, background: PackedColor.Color, container: Container) {
|
||||
val pb = new PacketBuilder(PacketType.TextBufferColorChange)
|
||||
def appendTextBufferColorChange(pb: PacketBuilder, foreground: PackedColor.Color, background: PackedColor.Color) {
|
||||
pb.writePacketType(PacketType.TextBufferColorChange)
|
||||
|
||||
pb.writeUTF(address)
|
||||
pb.writeInt(foreground.value)
|
||||
pb.writeBoolean(foreground.isPalette)
|
||||
pb.writeInt(background.value)
|
||||
pb.writeBoolean(background.isPalette)
|
||||
|
||||
pb.sendToNearbyPlayers(container)
|
||||
}
|
||||
|
||||
def sendTextBufferCopy(address: String, col: Int, row: Int, w: Int, h: Int, tx: Int, ty: Int, container: Container) {
|
||||
val pb = new PacketBuilder(PacketType.TextBufferCopy)
|
||||
def appendTextBufferCopy(pb: PacketBuilder, col: Int, row: Int, w: Int, h: Int, tx: Int, ty: Int) {
|
||||
pb.writePacketType(PacketType.TextBufferCopy)
|
||||
|
||||
pb.writeUTF(address)
|
||||
pb.writeInt(col)
|
||||
pb.writeInt(row)
|
||||
pb.writeInt(w)
|
||||
pb.writeInt(h)
|
||||
pb.writeInt(tx)
|
||||
pb.writeInt(ty)
|
||||
|
||||
pb.sendToNearbyPlayers(container)
|
||||
}
|
||||
|
||||
def sendTextBufferDepthChange(address: String, value: ColorDepth, container: Container) {
|
||||
val pb = new PacketBuilder(PacketType.TextBufferDepthChange)
|
||||
def appendTextBufferDepthChange(pb: PacketBuilder, value: ColorDepth) {
|
||||
pb.writePacketType(PacketType.TextBufferDepthChange)
|
||||
|
||||
pb.writeUTF(address)
|
||||
pb.writeInt(value.ordinal)
|
||||
|
||||
pb.sendToNearbyPlayers(container)
|
||||
}
|
||||
|
||||
def sendTextBufferFill(address: String, col: Int, row: Int, w: Int, h: Int, c: Char, container: Container) {
|
||||
val pb = new PacketBuilder(PacketType.TextBufferFill)
|
||||
def appendTextBufferFill(pb: PacketBuilder, col: Int, row: Int, w: Int, h: Int, c: Char) {
|
||||
pb.writePacketType(PacketType.TextBufferFill)
|
||||
|
||||
pb.writeUTF(address)
|
||||
pb.writeInt(col)
|
||||
pb.writeInt(row)
|
||||
pb.writeInt(w)
|
||||
pb.writeInt(h)
|
||||
pb.writeChar(c)
|
||||
}
|
||||
|
||||
pb.sendToNearbyPlayers(container)
|
||||
def appendTextBufferPaletteChange(pb: PacketBuilder, index: Int, color: Int) {
|
||||
pb.writePacketType(PacketType.TextBufferPaletteChange)
|
||||
|
||||
pb.writeInt(index)
|
||||
pb.writeInt(color)
|
||||
}
|
||||
|
||||
def appendTextBufferResolutionChange(pb: PacketBuilder, w: Int, h: Int) {
|
||||
pb.writePacketType(PacketType.TextBufferResolutionChange)
|
||||
|
||||
pb.writeInt(w)
|
||||
pb.writeInt(h)
|
||||
}
|
||||
|
||||
def appendTextBufferSet(pb: PacketBuilder, col: Int, row: Int, s: String, vertical: Boolean) {
|
||||
pb.writePacketType(PacketType.TextBufferSet)
|
||||
|
||||
pb.writeInt(col)
|
||||
pb.writeInt(row)
|
||||
pb.writeUTF(s)
|
||||
pb.writeBoolean(vertical)
|
||||
}
|
||||
|
||||
def sendTextBufferInit(address: String, value: NBTTagCompound, player: EntityPlayerMP) {
|
||||
@ -318,18 +329,8 @@ object PacketSender {
|
||||
pb.sendToPlayer(player)
|
||||
}
|
||||
|
||||
def sendTextBufferPaletteChange(address: String, index: Int, color: Int, container: Container) {
|
||||
val pb = new PacketBuilder(PacketType.TextBufferPaletteChange)
|
||||
|
||||
pb.writeUTF(address)
|
||||
pb.writeInt(index)
|
||||
pb.writeInt(color)
|
||||
|
||||
pb.sendToNearbyPlayers(container)
|
||||
}
|
||||
|
||||
def sendTextBufferPowerChange(address: String, hasPower: Boolean, container: Container) {
|
||||
val pb = new PacketBuilder(PacketType.TextBufferPowerChange)
|
||||
val pb = new SimplePacketBuilder(PacketType.TextBufferPowerChange)
|
||||
|
||||
pb.writeUTF(address)
|
||||
pb.writeBoolean(hasPower)
|
||||
@ -337,30 +338,8 @@ object PacketSender {
|
||||
pb.sendToNearbyPlayers(container)
|
||||
}
|
||||
|
||||
def sendTextBufferResolutionChange(address: String, w: Int, h: Int, container: Container) {
|
||||
val pb = new PacketBuilder(PacketType.TextBufferResolutionChange)
|
||||
|
||||
pb.writeUTF(address)
|
||||
pb.writeInt(w)
|
||||
pb.writeInt(h)
|
||||
|
||||
pb.sendToNearbyPlayers(container)
|
||||
}
|
||||
|
||||
def sendTextBufferSet(address: String, col: Int, row: Int, s: String, vertical: Boolean, container: Container) {
|
||||
val pb = new PacketBuilder(PacketType.TextBufferSet)
|
||||
|
||||
pb.writeUTF(address)
|
||||
pb.writeInt(col)
|
||||
pb.writeInt(row)
|
||||
pb.writeUTF(s)
|
||||
pb.writeBoolean(vertical)
|
||||
|
||||
pb.sendToNearbyPlayers(container)
|
||||
}
|
||||
|
||||
def sendScreenTouchMode(t: tileentity.Screen, value: Boolean) {
|
||||
val pb = new PacketBuilder(PacketType.ScreenTouchMode)
|
||||
val pb = new SimplePacketBuilder(PacketType.ScreenTouchMode)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
pb.writeBoolean(value)
|
||||
@ -369,7 +348,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendServerPresence(t: tileentity.ServerRack) {
|
||||
val pb = new PacketBuilder(PacketType.ServerPresence)
|
||||
val pb = new SimplePacketBuilder(PacketType.ServerPresence)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
t.servers.foreach {
|
||||
@ -384,7 +363,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendServerState(t: tileentity.ServerRack) {
|
||||
val pb = new PacketBuilder(PacketType.ComputerState)
|
||||
val pb = new SimplePacketBuilder(PacketType.ComputerState)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
pb.writeInt(-1)
|
||||
@ -394,7 +373,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendServerState(t: tileentity.ServerRack, number: Int, player: Option[EntityPlayerMP] = None) {
|
||||
val pb = new PacketBuilder(PacketType.ComputerState)
|
||||
val pb = new SimplePacketBuilder(PacketType.ComputerState)
|
||||
|
||||
pb.writeTileEntity(t)
|
||||
pb.writeInt(number)
|
||||
@ -413,7 +392,7 @@ object PacketSender {
|
||||
}
|
||||
|
||||
def sendSound(world: World, x: Int, y: Int, z: Int, frequency: Int, duration: Int) {
|
||||
val pb = new PacketBuilder(PacketType.Sound)
|
||||
val pb = new SimplePacketBuilder(PacketType.Sound)
|
||||
|
||||
pb.writeInt(world.provider.dimensionId)
|
||||
pb.writeInt(x)
|
||||
|
@ -8,7 +8,7 @@ import li.cil.oc.api.machine._
|
||||
import li.cil.oc.api.network._
|
||||
import li.cil.oc.api.{FileSystem, Network, machine}
|
||||
import li.cil.oc.common.component.ManagedComponent
|
||||
import li.cil.oc.common.tileentity
|
||||
import li.cil.oc.common.{SaveHandler, tileentity}
|
||||
import li.cil.oc.server.PacketSender
|
||||
import li.cil.oc.server.driver.Registry
|
||||
import li.cil.oc.server.network.{ArgumentsImpl, Callbacks}
|
||||
@ -584,7 +584,10 @@ class Machine(val owner: Owner, constructor: Constructor[_ <: Architecture]) ext
|
||||
c.getString("address") -> c.getString("name")
|
||||
})
|
||||
|
||||
tmp.foreach(fs => fs.load(nbt.getCompoundTag("tmp")))
|
||||
tmp.foreach(fs => {
|
||||
if (nbt.hasKey("tmp")) fs.load(nbt.getCompoundTag("tmp"))
|
||||
else fs.load(SaveHandler.loadNBT(nbt, node.address + "_tmp"))
|
||||
})
|
||||
|
||||
if (state.size > 0 && state.top != Machine.State.Stopped && init()) try {
|
||||
architecture.load(nbt)
|
||||
@ -653,7 +656,7 @@ class Machine(val owner: Owner, constructor: Constructor[_ <: Architecture]) ext
|
||||
}
|
||||
nbt.setTag("components", componentsNbt)
|
||||
|
||||
tmp.foreach(fs => nbt.setNewCompoundTag("tmp", fs.save))
|
||||
tmp.foreach(fs => SaveHandler.scheduleSave(owner, nbt, node.address + "_tmp", fs.save _))
|
||||
|
||||
if (state.top != Machine.State.Stopped) try {
|
||||
architecture.save(nbt)
|
||||
|
Loading…
x
Reference in New Issue
Block a user