From cd0f9fa731c929d53d4e01e37f12032b7c04389c Mon Sep 17 00:00:00 2001 From: payonel Date: Sun, 31 May 2020 01:32:59 -0700 Subject: [PATCH] fixed the floppy gui to update its buttons and cleaned up the packet handler to make sure reads are done regardless of outcome --- .../scala/li/cil/oc/client/gui/Drive.scala | 24 ++- .../cil/oc/common/item/data/DriveData.scala | 26 +++ .../opencomputers/DriverFileSystem.scala | 5 +- .../li/cil/oc/server/PacketHandler.scala | 170 ++++++++++-------- .../li/cil/oc/server/fs/FileSystem.scala | 14 +- 5 files changed, 148 insertions(+), 91 deletions(-) diff --git a/src/main/scala/li/cil/oc/client/gui/Drive.scala b/src/main/scala/li/cil/oc/client/gui/Drive.scala index a9f33a51e..009a22cc8 100644 --- a/src/main/scala/li/cil/oc/client/gui/Drive.scala +++ b/src/main/scala/li/cil/oc/client/gui/Drive.scala @@ -20,12 +20,24 @@ class Drive(playerInventory: InventoryPlayer, val driveStack: () => ItemStack) e protected override def actionPerformed(button: GuiButton) { if (button.id == 0) { - ClientPacketSender.sendDriveMode(false) + ClientPacketSender.sendDriveMode(unmanaged = false) + DriveData.setUnmanaged(driveStack(), unmanaged = false) } else if (button.id == 1) { - ClientPacketSender.sendDriveMode(true) + ClientPacketSender.sendDriveMode(unmanaged = true) + DriveData.setUnmanaged(driveStack(), unmanaged = true) } else if (button.id == 2) { ClientPacketSender.sendDriveLock() + DriveData.lock(driveStack(), playerInventory.player) } + updateButtonStates() + } + + def updateButtonStates(): Unit = { + val data = new DriveData(driveStack()) + unmanagedButton.toggled = data.isUnmanaged + managedButton.toggled = !unmanagedButton.toggled + lockedButton.toggled = data.isLocked + lockedButton.enabled = !data.isLocked } override def initGui(): Unit = { @@ -36,14 +48,10 @@ class Drive(playerInventory: InventoryPlayer, val driveStack: () => ItemStack) e add(buttonList, managedButton) add(buttonList, unmanagedButton) add(buttonList, lockedButton) + updateButtonStates() } override def updateScreen(): Unit = { - val data = new DriveData(driveStack()) - unmanagedButton.toggled = data.isUnmanaged - managedButton.toggled = !unmanagedButton.toggled - lockedButton.toggled = data.isLocked - lockedButton.enabled = !data.isLocked super.updateScreen() } @@ -52,4 +60,4 @@ class Drive(playerInventory: InventoryPlayer, val driveStack: () => ItemStack) e fontRendererObj.drawSplitString(Localization.Drive.Warning, guiLeft + 11, guiTop + 37, xSize - 20, 0x404040) fontRendererObj.drawSplitString(Localization.Drive.LockWarning, guiLeft + 61, guiTop + windowHeight - 48, xSize - 68, 0x404040) } -} \ No newline at end of file +} diff --git a/src/main/scala/li/cil/oc/common/item/data/DriveData.scala b/src/main/scala/li/cil/oc/common/item/data/DriveData.scala index 7b96ecdb2..2a0cc6e53 100644 --- a/src/main/scala/li/cil/oc/common/item/data/DriveData.scala +++ b/src/main/scala/li/cil/oc/common/item/data/DriveData.scala @@ -3,6 +3,8 @@ package li.cil.oc.common.item.data import li.cil.oc.Settings import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound +import li.cil.oc.server.fs +import net.minecraft.entity.player.EntityPlayer class DriveData extends ItemData(null) { def this(stack: ItemStack) { @@ -32,3 +34,27 @@ class DriveData extends ItemData(null) { nbt.setString(LockKey, lockInfo) } } + +object DriveData { + def lock(stack: ItemStack, player: EntityPlayer): Unit = { + val key = player.getDisplayName + val data = new DriveData(stack) + if (!data.isLocked) { + data.lockInfo = key match { + case name: String if name != null && !name.isEmpty => name + case _ => "notch" // meaning: "unknown" + } + data.save(stack) + } + } + + def setUnmanaged(stack: ItemStack, unmanaged: Boolean): Unit = { + val data = new DriveData(stack) + if (data.isUnmanaged != unmanaged) { + fs.FileSystem.removeAddress(stack) + data.lockInfo = "" + } + data.isUnmanaged = unmanaged + data.save(stack) + } +} diff --git a/src/main/scala/li/cil/oc/integration/opencomputers/DriverFileSystem.scala b/src/main/scala/li/cil/oc/integration/opencomputers/DriverFileSystem.scala index 6beca98b5..3c2cb532d 100644 --- a/src/main/scala/li/cil/oc/integration/opencomputers/DriverFileSystem.scala +++ b/src/main/scala/li/cil/oc/integration/opencomputers/DriverFileSystem.scala @@ -13,7 +13,7 @@ import li.cil.oc.common.item.FloppyDisk import li.cil.oc.common.item.HardDiskDrive import li.cil.oc.common.item.data.DriveData import li.cil.oc.server.component.Drive -import li.cil.oc.server.fs.FileSystem.ItemLabel +import li.cil.oc.server.fs.FileSystem.{ItemLabel, ReadOnlyLabel} import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound @@ -65,7 +65,7 @@ object DriverFileSystem extends Item { // node's address as the folder name... so we generate the address here, // if necessary. No one will know, right? Right!? val address = addressFromTag(dataTag(stack)) - val label = new ReadWriteItemLabel(stack) + var label: api.fs.Label = new ReadWriteItemLabel(stack) val isFloppy = api.Items.get(stack) == api.Items.get(Constants.ItemName.Floppy) val sound = Settings.resourceDomain + ":" + (if (isFloppy) "floppy_access" else "hdd_access") val drive = new DriveData(stack) @@ -76,6 +76,7 @@ object DriverFileSystem extends Item { var fs = oc.api.FileSystem.fromSaveDirectory(address, capacity max 0, Settings.get.bufferChanges) if (drive.isLocked) { fs = oc.api.FileSystem.asReadOnly(fs) + label = new ReadOnlyLabel(label.getLabel) } oc.api.FileSystem.asManagedEnvironment(fs, label, host, sound, speed) } diff --git a/src/main/scala/li/cil/oc/server/PacketHandler.scala b/src/main/scala/li/cil/oc/server/PacketHandler.scala index 4b08680c2..a54ab678e 100644 --- a/src/main/scala/li/cil/oc/server/PacketHandler.scala +++ b/src/main/scala/li/cil/oc/server/PacketHandler.scala @@ -57,77 +57,74 @@ object PacketHandler extends CommonPacketHandler { } } - def onComputerPower(p: PacketParser) = - p.readTileEntity[Computer]() match { + def onComputerPower(p: PacketParser): Unit = { + val entity = p.readTileEntity[Computer]() + val setPower = p.readBoolean() + entity match { case Some(t) => p.player match { - case player: EntityPlayerMP => trySetComputerPower(t.machine, p.readBoolean(), player) + case player: EntityPlayerMP => trySetComputerPower(t.machine, setPower, player) case _ => } case _ => // Invalid packet. } + } - def onServerPower(p: PacketParser) = - p.readTileEntity[Rack]() match { + def onServerPower(p: PacketParser): Unit = { + val entity = p.readTileEntity[Rack]() + val index = p.readInt() + val setPower = p.readBoolean() + entity match { case Some(t) => - val mountableIndex = p.readInt() + val mountableIndex = index t.getMountable(mountableIndex) match { case server: Server => p.player match { - case player: EntityPlayerMP => trySetComputerPower(server.machine, p.readBoolean(), player) + case player: EntityPlayerMP => trySetComputerPower(server.machine, setPower, player) case _ => // Invalid packet. } case _ => // Invalid packet. } case _ => // Invalid packet. } + } def onCopyToAnalyzer(p: PacketParser) { - ComponentTracker.get(p.player.worldObj, p.readUTF()) match { - case Some(buffer: TextBuffer) => buffer.copyToAnalyzer(p.readInt(), p.player.asInstanceOf[EntityPlayer]) + val text = p.readUTF() + val line = p.readInt() + ComponentTracker.get(p.player.worldObj, text) match { + case Some(buffer: TextBuffer) => buffer.copyToAnalyzer(line, p.player.asInstanceOf[EntityPlayer]) case _ => // Invalid Packet } } - def onDriveLock(p: PacketParser) = p.player match { + def onDriveLock(p: PacketParser): Unit = p.player match { case player: EntityPlayerMP => val heldItem = player.getHeldItem Delegator.subItem(heldItem) match { - case Some(drive: FileSystemLike) => - val data = new DriveData(heldItem) - if (!data.isLocked) { - data.lockInfo = player.getDisplayName match { - case name: String if name != null && !name.isEmpty => name - case _ => "notch" // meaning: "unknown" - } - data.save(heldItem) - } + case Some(drive: FileSystemLike) => DriveData.lock(heldItem, player) case _ => // Invalid packet } case _ => // Invalid Packet } - def onDriveMode(p: PacketParser) = p.player match { - case player: EntityPlayerMP => - val heldItem = player.getHeldItem - Delegator.subItem(heldItem) match { - case Some(drive: FileSystemLike) => - val data = new DriveData(heldItem) - val newIsUnmanaged = p.readBoolean() - if (data.isUnmanaged != newIsUnmanaged) { - fs.FileSystem.removeAddress(heldItem) - data.lockInfo = "" - } - data.isUnmanaged = newIsUnmanaged - data.save(heldItem) - case _ => // Invalid packet. - } - case _ => // Invalid packet. + def onDriveMode(p: PacketParser): Unit = { + val unmanaged = p.readBoolean() + p.player match { + case player: EntityPlayerMP => + val heldItem = player.getHeldItem + Delegator.subItem(heldItem) match { + case Some(drive: FileSystemLike) => DriveData.setUnmanaged(heldItem, unmanaged) + case _ => // Invalid packet. + } + case _ => // Invalid packet. + } } - def onDronePower(p: PacketParser) = - p.readEntity[Drone]() match { + def onDronePower(p: PacketParser): Unit = { + val entity = p.readEntity[Drone]() + val power = p.readBoolean() + entity match { case Some(drone) => p.player match { case player: EntityPlayerMP => - val power = p.readBoolean() if (power) { drone.preparePowerUp() } @@ -136,6 +133,7 @@ object PacketHandler extends CommonPacketHandler { } case _ => // Invalid packet. } + } private def trySetComputerPower(computer: Machine, value: Boolean, player: EntityPlayerMP) { if (computer.canInteract(player.getCommandSenderName)) { @@ -152,34 +150,43 @@ object PacketHandler extends CommonPacketHandler { } } - def onKeyDown(p: PacketParser) { - ComponentTracker.get(p.player.worldObj, p.readUTF()) match { - case Some(buffer: api.internal.TextBuffer) => buffer.keyDown(p.readChar(), p.readInt(), p.player.asInstanceOf[EntityPlayer]) + def onKeyDown(p: PacketParser): Unit = { + val address = p.readUTF() + val key = p.readChar() + val code = p.readInt() + ComponentTracker.get(p.player.worldObj, address) match { + case Some(buffer: api.internal.TextBuffer) => buffer.keyDown(key, code, p.player.asInstanceOf[EntityPlayer]) case _ => // Invalid Packet } } - def onKeyUp(p: PacketParser) { - ComponentTracker.get(p.player.worldObj, p.readUTF()) match { - case Some(buffer: api.internal.TextBuffer) => buffer.keyUp(p.readChar(), p.readInt(), p.player.asInstanceOf[EntityPlayer]) + def onKeyUp(p: PacketParser): Unit = { + val address = p.readUTF() + val key = p.readChar() + val code = p.readInt() + ComponentTracker.get(p.player.worldObj, address) match { + case Some(buffer: api.internal.TextBuffer) => buffer.keyUp(key, code, p.player.asInstanceOf[EntityPlayer]) case _ => // Invalid Packet } } - def onClipboard(p: PacketParser) { - ComponentTracker.get(p.player.worldObj, p.readUTF()) match { - case Some(buffer: api.internal.TextBuffer) => buffer.clipboard(p.readUTF(), p.player.asInstanceOf[EntityPlayer]) + def onClipboard(p: PacketParser): Unit = { + val address = p.readUTF() + val copy = p.readUTF() + ComponentTracker.get(p.player.worldObj, address) match { + case Some(buffer: api.internal.TextBuffer) => buffer.clipboard(copy, p.player.asInstanceOf[EntityPlayer]) case _ => // Invalid Packet } } def onMouseClick(p: PacketParser) { - ComponentTracker.get(p.player.worldObj, p.readUTF()) match { + val address = p.readUTF() + val x = p.readFloat() + val y = p.readFloat() + val dragging = p.readBoolean() + val button = p.readByte() + ComponentTracker.get(p.player.worldObj, address) match { case Some(buffer: api.internal.TextBuffer) => - val x = p.readFloat() - val y = p.readFloat() - val dragging = p.readBoolean() - val button = p.readByte() val player = p.player.asInstanceOf[EntityPlayer] if (dragging) buffer.mouseDrag(x, y, button, player) else buffer.mouseDown(x, y, button, player) @@ -188,11 +195,12 @@ object PacketHandler extends CommonPacketHandler { } def onMouseUp(p: PacketParser) { - ComponentTracker.get(p.player.worldObj, p.readUTF()) match { + val address = p.readUTF() + val x = p.readFloat() + val y = p.readFloat() + val button = p.readByte() + ComponentTracker.get(p.player.worldObj, address) match { case Some(buffer: api.internal.TextBuffer) => - val x = p.readFloat() - val y = p.readFloat() - val button = p.readByte() val player = p.player.asInstanceOf[EntityPlayer] buffer.mouseUp(x, y, button, player) case _ => // Invalid Packet @@ -200,11 +208,12 @@ object PacketHandler extends CommonPacketHandler { } def onMouseScroll(p: PacketParser) { - ComponentTracker.get(p.player.worldObj, p.readUTF()) match { + val address = p.readUTF() + val x = p.readFloat() + val y = p.readFloat() + val button = p.readByte() + ComponentTracker.get(p.player.worldObj, address) match { case Some(buffer: api.internal.TextBuffer) => - val x = p.readFloat() - val y = p.readFloat() - val button = p.readByte() val player = p.player.asInstanceOf[EntityPlayer] buffer.mouseScroll(x, y, button, player) case _ => // Invalid Packet @@ -219,9 +228,10 @@ object PacketHandler extends CommonPacketHandler { } def onPetVisibility(p: PacketParser) { + val value = p.readBoolean() p.player match { case player: EntityPlayerMP => - if (if (p.readBoolean()) { + if (if (value) { PetVisibility.hidden.remove(player.getCommandSenderName) } else { @@ -234,31 +244,37 @@ object PacketHandler extends CommonPacketHandler { } } - def onRackMountableMapping(p: PacketParser) = - p.readTileEntity[Rack]() match { + def onRackMountableMapping(p: PacketParser): Unit = { + val entity = p.readTileEntity[Rack]() + val mountableIndex = p.readInt() + val nodeIndex = p.readInt() + val side = p.readDirection() + entity match { case Some(t) => p.player match { case player: EntityPlayerMP if t.isUseableByPlayer(player) => - val mountableIndex = p.readInt() - val nodeIndex = p.readInt() - val side = p.readDirection() t.connect(mountableIndex, nodeIndex, side) case _ => } case _ => // Invalid packet. } + } - def onRackRelayState(p: PacketParser) = - p.readTileEntity[Rack]() match { + def onRackRelayState(p: PacketParser): Unit = { + val entity = p.readTileEntity[Rack]() + val enabled = p.readBoolean() + entity match { case Some(t) => p.player match { case player: EntityPlayerMP if t.isUseableByPlayer(player) => - t.isRelayEnabled = p.readBoolean() + t.isRelayEnabled = enabled case _ => } case _ => // Invalid packet. } + } - def onRobotAssemblerStart(p: PacketParser) = - p.readTileEntity[Assembler]() match { + def onRobotAssemblerStart(p: PacketParser): Unit = { + val entity = p.readTileEntity[Assembler]() + entity match { case Some(assembler) => if (assembler.start(p.player match { case player: EntityPlayerMP => player.capabilities.isCreativeMode @@ -266,12 +282,14 @@ object PacketHandler extends CommonPacketHandler { })) assembler.output.foreach(stack => Achievement.onAssemble(stack, p.player)) case _ => // Invalid packet. } + } - def onRobotStateRequest(p: PacketParser) = + def onRobotStateRequest(p: PacketParser): Unit = { p.readTileEntity[RobotProxy]() match { case Some(proxy) => proxy.world.markBlockForUpdate(proxy.x, proxy.y, proxy.z) case _ => // Invalid packet. } + } def onTextBufferInit(p: PacketParser) { val address = p.readUTF() @@ -297,11 +315,12 @@ object PacketHandler extends CommonPacketHandler { } } - def onWaypointLabel(p: PacketParser) = - p.readTileEntity[Waypoint]() match { + def onWaypointLabel(p: PacketParser): Unit = { + val entity = p.readTileEntity[Waypoint]() + val label = p.readUTF().take(32) + entity match { case Some(waypoint) => p.player match { case player: EntityPlayerMP if player.getDistanceSq(waypoint.x + 0.5, waypoint.y + 0.5, waypoint.z + 0.5) <= 64 => - val label = p.readUTF().take(32) if (label != waypoint.label) { waypoint.label = label PacketSender.sendWaypointLabel(waypoint) @@ -310,4 +329,5 @@ object PacketHandler extends CommonPacketHandler { } case _ => // Invalid packet. } + } } \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/server/fs/FileSystem.scala b/src/main/scala/li/cil/oc/server/fs/FileSystem.scala index 859d28834..db0ed8a63 100755 --- a/src/main/scala/li/cil/oc/server/fs/FileSystem.scala +++ b/src/main/scala/li/cil/oc/server/fs/FileSystem.scala @@ -23,7 +23,7 @@ import net.minecraftforge.common.DimensionManager import scala.util.Try object FileSystem extends api.detail.FileSystemAPI { - lazy val isCaseInsensitive = Settings.get.forceCaseInsensitive || (try { + lazy val isCaseInsensitive: Boolean = Settings.get.forceCaseInsensitive || (try { val uuid = UUID.randomUUID().toString val lowerCase = new io.File(DimensionManager.getCurrentSaveRootDirectory, uuid + "oc_rox") val upperCase = new io.File(DimensionManager.getCurrentSaveRootDirectory, uuid + "OC_ROX") @@ -50,9 +50,9 @@ object FileSystem extends api.detail.FileSystemAPI { // accordingly before the path is passed to the file system. private val invalidChars = """\:*?"<>|""".toSet - def isValidFilename(name: String) = !name.exists(invalidChars.contains) + def isValidFilename(name: String): Boolean = !name.exists(invalidChars.contains) - def validatePath(path: String) = { + def validatePath(path: String): String = { if (!isValidFilename(path)) { throw new java.io.IOException("path contains invalid characters") } @@ -139,9 +139,11 @@ object FileSystem extends api.detail.FileSystemAPI { } else null - override def asReadOnly(fileSystem: api.fs.FileSystem) = + override def asReadOnly(fileSystem: api.fs.FileSystem): api.fs.FileSystem = if (fileSystem.isReadOnly) fileSystem - else new ReadOnlyWrapper(fileSystem) + else { + new ReadOnlyWrapper(fileSystem) + } def asManagedEnvironment(fileSystem: api.fs.FileSystem, label: Label, host: EnvironmentHost, accessSound: String, speed: Int) = Option(fileSystem).flatMap(fs => Some(new component.FileSystem(fs, label, Option(host), Option(accessSound), (speed - 1) max 0 min 5))).orNull @@ -166,7 +168,7 @@ object FileSystem extends api.detail.FileSystemAPI { abstract class ItemLabel(val stack: ItemStack) extends Label - private class ReadOnlyLabel(val label: String) extends Label { + class ReadOnlyLabel(val label: String) extends Label { def setLabel(value: String) = throw new IllegalArgumentException("label is read only") def getLabel = label