fixed the floppy gui to update its buttons

and cleaned up the packet handler to make sure reads are done regardless of outcome
This commit is contained in:
payonel 2020-05-31 01:32:59 -07:00
parent 91847a44e5
commit cd0f9fa731
5 changed files with 148 additions and 91 deletions

View File

@ -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)
}
}
}

View File

@ -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)
}
}

View File

@ -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)
}

View File

@ -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.
}
}
}

View File

@ -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