From f9e1f6f1f5f0ad858f459f80673ddda3517edae1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 1 Jun 2014 17:32:07 +0200 Subject: [PATCH 1/3] Requiring a CPU and RAM in robot before allowing it to be assembled. --- .../assets/opencomputers/lang/de_DE.lang | 4 +- .../assets/opencomputers/lang/en_US.lang | 4 +- .../li/cil/oc/client/gui/RobotAssembler.scala | 46 +++++++++++++++---- 3 files changed, 44 insertions(+), 10 deletions(-) diff --git a/src/main/resources/assets/opencomputers/lang/de_DE.lang b/src/main/resources/assets/opencomputers/lang/de_DE.lang index c69f7f0d8..11d5ad921 100644 --- a/src/main/resources/assets/opencomputers/lang/de_DE.lang +++ b/src/main/resources/assets/opencomputers/lang/de_DE.lang @@ -126,6 +126,8 @@ oc:gui.Robot.TurnOn=Einschalten oc:gui.RobotAssembler.CollectRobot=Roboter entnehmen oc:gui.RobotAssembler.Complexity=Komplexität: %s/%s oc:gui.RobotAssembler.InsertCase=Computergehäuse einlegen +oc:gui.RobotAssembler.InsertCPU=CPU benötigt +oc:gui.RobotAssembler.InsertRAM=RAM benötigt oc:gui.RobotAssembler.Progress=Fortschritt: %s%% (%s) oc:gui.RobotAssembler.Run=Zusammenbauen oc:gui.ServerRack.None=Keine @@ -167,7 +169,7 @@ oc:tooltip.CuttingWire=Wird gebraucht, um Tonblöcke in Leiterplattenform zu bek oc:tooltip.Disassembler=Zerlegt Gegenstände in ihre Einzelteile. §lWarnung§7: zurückgewonnene Gegenstände haben eine %s%%-ige Chance beim Extrahieren kaputt zu gehen! oc:tooltip.Disk=Sehr einfaches Speichermedium, das verwendet werden kann, um Disketten und Festplatten bauen. oc:tooltip.DiskDrive.CC=ComputerCraft-Disketten werden §aunterstützt§7. -oc:tooltip.DiskDrive=Erlaubt es, Disketten zu lesen und zu beschreiben. +oc:tooltip.DiskDrive=Erlaubt es, Disketten zu lesen und zu beschreiben. Kann in Robotern installiert werden, um später Disketten einlegen zu können. oc:tooltip.Geolyzer=Erlaubt es die Härte der Blöcke in der Umgebung abzufragen. Hilfreich um Hologramme der Gegend zu erzeugen, oder um Erze zu entdecken. oc:tooltip.GraphicsCard=Erlaubt es, den angezeigten Inhalt von Bildschirmen zu ändern.[nl] Höchstauflösung: §f%sx%s§7.[nl] Maximale Farbtiefe: §f%s§7.[nl] Operationen/Tick: §f%s§7. oc:tooltip.InternetCard=Diese Karte erlaubt es, HTTP-Anfragen zu senden und echte TCP Sockets zu verwenden. diff --git a/src/main/resources/assets/opencomputers/lang/en_US.lang b/src/main/resources/assets/opencomputers/lang/en_US.lang index e9f5ca03b..d47a2ab8f 100644 --- a/src/main/resources/assets/opencomputers/lang/en_US.lang +++ b/src/main/resources/assets/opencomputers/lang/en_US.lang @@ -126,6 +126,8 @@ oc:gui.Robot.TurnOn=Turn on oc:gui.RobotAssembler.CollectRobot=Collect robot oc:gui.RobotAssembler.Complexity=Complexity: %s/%s oc:gui.RobotAssembler.InsertCase=Insert a Computer Case +oc:gui.RobotAssembler.InsertCPU=Insert a CPU +oc:gui.RobotAssembler.InsertRAM=Insert some RAM oc:gui.RobotAssembler.Progress=Progress: %s%% (%s) oc:gui.RobotAssembler.Run=Assemble oc:gui.ServerRack.None=None @@ -167,7 +169,7 @@ oc:tooltip.CuttingWire=Used to cut clay blocks into circuit board shape. Breaks oc:tooltip.Disassembler=Separates items into their original components. §lWarning§7: returned items have a %s%% chance of breaking in the process! oc:tooltip.Disk=Primitive medium that can be used to build persistent storage devices. oc:tooltip.DiskDrive.CC=ComputerCraft floppies are §asupported§7. -oc:tooltip.DiskDrive=Allows reading and writing floppies. +oc:tooltip.DiskDrive=Allows reading and writing floppies. Can be installed in robots to allow inserting floppies later on. oc:tooltip.Geolyzer=Allows scanning the surrounding area's blocks' hardness. This information can be useful for generating holograms of the area or for detecting ores. oc:tooltip.GraphicsCard=Used to change what's displayed on screens.[nl] Maximum resolution: §f%sx%s§7.[nl] Maximum color depth: §f%s§7.[nl] Operations/tick: §f%s§7. oc:tooltip.InternetCard=This card allows making HTTP requests and using real TCP sockets. diff --git a/src/main/scala/li/cil/oc/client/gui/RobotAssembler.scala b/src/main/scala/li/cil/oc/client/gui/RobotAssembler.scala index 793e57c8e..70dc88089 100644 --- a/src/main/scala/li/cil/oc/client/gui/RobotAssembler.scala +++ b/src/main/scala/li/cil/oc/client/gui/RobotAssembler.scala @@ -3,6 +3,7 @@ package li.cil.oc.client.gui import java.util import li.cil.oc.api import li.cil.oc.Settings +import li.cil.oc.api.driver.{Memory, Processor} import li.cil.oc.client.{PacketSender => ClientPacketSender, Textures} import li.cil.oc.common.container import li.cil.oc.common.tileentity @@ -28,14 +29,36 @@ class RobotAssembler(playerInventory: InventoryPlayer, val assembler: tileentity def add[T](list: util.List[T], value: Any) = list.add(value.asInstanceOf[T]) + private def hasCase = assembler.isItemValidForSlot(0, assembler.getStackInSlot(0)) + + private def hasCPU = assembler.items.exists { + case Some(stack) => api.Driver.driverFor(stack) match { + case processor: Processor => true + case _ => false + } + case _ => false + } + + private def hasRAM = assembler.items.exists { + case Some(stack) => api.Driver.driverFor(stack) match { + case processor: Memory => true + case _ => false + } + case _ => false + } + + private def isCapacityValid = assembler.complexity <= assembler.maxComplexity + + private def canBuild = !assemblerContainer.isAssembling && hasCase && hasCPU && hasRAM && isCapacityValid + protected override def actionPerformed(button: GuiButton) { - if (button.id == 0 && !assemblerContainer.isAssembling && assembler.complexity <= assembler.maxComplexity) { + if (button.id == 0 && canBuild) { ClientPacketSender.sendRobotAssemblerStart(assembler) } } override def drawScreen(mouseX: Int, mouseY: Int, dt: Float) { - runButton.enabled = assembler.complexity <= assembler.maxComplexity && !assemblerContainer.isAssembling && assembler.isItemValidForSlot(0, assembler.getStackInSlot(0)) + runButton.enabled = canBuild runButton.toggled = !runButton.enabled super.drawScreen(mouseX, mouseY, dt) } @@ -49,20 +72,27 @@ class RobotAssembler(playerInventory: InventoryPlayer, val assembler: tileentity override def drawGuiContainerForegroundLayer(mouseX: Int, mouseY: Int) = { GL11.glPushAttrib(0xFFFFFFFF) // Me lazy... prevents NEI render glitch. if (!assemblerContainer.isAssembling) { - if (!inventorySlots.getSlot(0).getHasStack) { + def drawMessage(message: String) { fontRenderer.drawString( - StatCollector.translateToLocal(Settings.namespace + "gui.RobotAssembler.InsertCase"), + StatCollector.translateToLocal(Settings.namespace + message), 30, 94, 0x404040) } + if (!inventorySlots.getSlot(0).getHasStack) { + drawMessage("gui.RobotAssembler.InsertCase") + } else if (api.Items.get(inventorySlots.getSlot(0).getStack) == api.Items.get("robot")) { - fontRenderer.drawString( - StatCollector.translateToLocal(Settings.namespace + "gui.RobotAssembler.CollectRobot"), - 30, 94, 0x404040) + drawMessage("gui.RobotAssembler.CollectRobot") + } + else if (!hasCPU) { + drawMessage("gui.RobotAssembler.InsertCPU") + } + else if (!hasRAM) { + drawMessage("gui.RobotAssembler.InsertRAM") } else { fontRenderer.drawString( StatCollector.translateToLocalFormatted(Settings.namespace + "gui.RobotAssembler.Complexity", Int.box(assembler.complexity), Int.box(assembler.maxComplexity)), - 30, 94, if (assembler.complexity <= assembler.maxComplexity) 0x404040 else 0x804040) + 30, 94, if (isCapacityValid) 0x404040 else 0x804040) } if (runButton.func_82252_a) { val tooltip = new java.util.ArrayList[String] From 403f1ffbd252e0360a506f2b21a0c6d38fdf073b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 1 Jun 2014 18:20:11 +0200 Subject: [PATCH 2/3] Showing reduced (screen-less) GUI for robots without screens built into them. --- .../textures/gui/robot_noscreen.png | Bin 0 -> 601 bytes src/main/resources/reference.conf | 4 ++- .../scala/li/cil/oc/client/Textures.scala | 1 + .../scala/li/cil/oc/client/gui/Robot.scala | 31 +++++++++++------- .../li/cil/oc/common/container/Robot.scala | 21 ++++++++---- 5 files changed, 38 insertions(+), 19 deletions(-) create mode 100644 src/main/resources/assets/opencomputers/textures/gui/robot_noscreen.png diff --git a/src/main/resources/assets/opencomputers/textures/gui/robot_noscreen.png b/src/main/resources/assets/opencomputers/textures/gui/robot_noscreen.png new file mode 100644 index 0000000000000000000000000000000000000000..18a0807acba4b97767b6b4e71bace3873cdd5a70 GIT binary patch literal 601 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5FjO4;u=vBoS#-wo>-L1;Fyx1 zl&avFo0y&&l$w}QS$Hzl2B=6Pz$e7DySw|?v19-L|2H=`Pdk$a6b=my1#($_OI!zX zI7)*2f`MERV7S-3Hxg*mVNVywkcwMx?q1|-au8s>a53un|Nj=c9~4^;Y!Q2QXL^d< zA=_JQ-yM}VU-eCM+qN+;t#QSke}x(P4GXiDt<+@zxpUjjuTySV&bKg&+^=cJ_@!j! zv*JBRqmLy|E=^SiO2ff7q1saO{p>Gv85l&^Z@lw7uC|*YeXH(uU%%XzG6uh0d)Lj5 z`6CQh4rOpL&AGZQ#{42jX3HB;;2?trHxK0{f}7Zp#XxMSh5AwpqkyU#!fxDGK$Be{ zs&|#^c-51SzZe*%u+5mqko!|-w%E+IpMDjyt@yicE$f03G#!J4+fdJR#~PGW;Gk|= aJ1_>~za-p$YFG|RD-52lelF{r5}E*E|CR>; literal 0 HcmV?d00001 diff --git a/src/main/resources/reference.conf b/src/main/resources/reference.conf index f77d1375c..f59a1280c 100644 --- a/src/main/resources/reference.conf +++ b/src/main/resources/reference.conf @@ -57,7 +57,9 @@ opencomputers { soundVolume: 1.0 # This is the scaling of the individual chars rendered on screens. This - # is set to slightly overscale per default, to avoid + # is set to slightly overscale per default, to avoid gaps between fully + # filled chars to appear (i.e. the block symbol that is used for cursor + # blinking for example) on less accurate hardware. fontCharScale: 1.01 } diff --git a/src/main/scala/li/cil/oc/client/Textures.scala b/src/main/scala/li/cil/oc/client/Textures.scala index 70c95acc2..146a44c13 100644 --- a/src/main/scala/li/cil/oc/client/Textures.scala +++ b/src/main/scala/li/cil/oc/client/Textures.scala @@ -19,6 +19,7 @@ object Textures extends ResourceManagerReloadListener { val guiDisassembler = new ResourceLocation(Settings.resourceDomain, "textures/gui/disassembler.png") val guiRange = new ResourceLocation(Settings.resourceDomain, "textures/gui/range.png") val guiRobot = new ResourceLocation(Settings.resourceDomain, "textures/gui/robot.png") + val guiRobotNoScreen = new ResourceLocation(Settings.resourceDomain, "textures/gui/robot_noscreen.png") val guiRobotAssembler = new ResourceLocation(Settings.resourceDomain, "textures/gui/robot_assembler.png") val guiRobotSelection = new ResourceLocation(Settings.resourceDomain, "textures/gui/robot_selection.png") val guiServer = new ResourceLocation(Settings.resourceDomain, "textures/gui/server.png") diff --git a/src/main/scala/li/cil/oc/client/gui/Robot.scala b/src/main/scala/li/cil/oc/client/gui/Robot.scala index 9a9a2e2c5..6624c542b 100644 --- a/src/main/scala/li/cil/oc/client/gui/Robot.scala +++ b/src/main/scala/li/cil/oc/client/gui/Robot.scala @@ -21,24 +21,30 @@ import org.lwjgl.input.{Mouse, Keyboard} import org.lwjgl.opengl.GL11 class Robot(playerInventory: InventoryPlayer, val robot: tileentity.Robot) extends CustomGuiContainer(new container.Robot(playerInventory, robot)) with TextBuffer { - xSize = 256 - ySize = 242 - - protected var powerButton: ImageButton = _ - - protected var scrollButton: ImageButton = _ - - protected def buffer = { + protected val buffer = { robot.components.collect { case Some(buffer: api.component.TextBuffer) => buffer }.headOption.orNull } + private val withScreenHeight = 242 + private val noScreenHeight = 108 + + private val deltaY = if (buffer != null) 0 else withScreenHeight - noScreenHeight + + xSize = 256 + ySize = 242 - deltaY + + protected var powerButton: ImageButton = _ + + protected var scrollButton: ImageButton = _ + // Scroll offset for robot inventory. private var inventoryOffset = 0 private var isDragging = false private def canScroll = robot.inventorySize > 16 + private def maxOffset = robot.inventorySize / 4 - 4 private val slotSize = 18 @@ -48,7 +54,7 @@ class Robot(playerInventory: InventoryPlayer, val robot: tileentity.Robot) exten private val bufferMargin = BufferRenderer.innerMargin private val inventoryX = 169 - private val inventoryY = 141 + private val inventoryY = 141 - deltaY private val scrollX = inventoryX + slotSize * 4 + 2 private val scrollY = inventoryY @@ -56,7 +62,7 @@ class Robot(playerInventory: InventoryPlayer, val robot: tileentity.Robot) exten private val scrollHeight = 94 private val powerX = 26 - private val powerY = 142 + private val powerY = 142 - deltaY private val powerWidth = 140 private val powerHeight = 12 @@ -85,7 +91,7 @@ class Robot(playerInventory: InventoryPlayer, val robot: tileentity.Robot) exten override def initGui() { super.initGui() - powerButton = new ImageButton(0, guiLeft + 5, guiTop + 139, 18, 18, Textures.guiButtonPower, canToggle = true) + powerButton = new ImageButton(0, guiLeft + 5, guiTop + 139 - deltaY, 18, 18, Textures.guiButtonPower, canToggle = true) scrollButton = new ImageButton(1, guiLeft + scrollX + 1, guiTop + scrollY + 1, 6, 13, Textures.guiButtonScroll) add(buttonList, powerButton) add(buttonList, scrollButton) @@ -150,7 +156,8 @@ class Robot(playerInventory: InventoryPlayer, val robot: tileentity.Robot) exten override def drawGuiContainerBackgroundLayer(dt: Float, mouseX: Int, mouseY: Int) { GL11.glColor3f(1, 1, 1) // Required under Linux. - mc.renderEngine.bindTexture(Textures.guiRobot) + if (buffer != null) mc.renderEngine.bindTexture(Textures.guiRobot) + else mc.renderEngine.bindTexture(Textures.guiRobotNoScreen) drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize) drawPowerLevel() if (robot.inventorySize > 0) { diff --git a/src/main/scala/li/cil/oc/common/container/Robot.scala b/src/main/scala/li/cil/oc/common/container/Robot.scala index fb3e63d83..7ad419401 100644 --- a/src/main/scala/li/cil/oc/common/container/Robot.scala +++ b/src/main/scala/li/cil/oc/common/container/Robot.scala @@ -10,13 +10,21 @@ import net.minecraft.entity.player.{EntityPlayer, InventoryPlayer} import net.minecraft.inventory.IInventory class Robot(playerInventory: InventoryPlayer, robot: tileentity.Robot) extends Player(playerInventory, robot) { - addSlotToContainer(170 + 0 * slotSize, 218, api.driver.Slot.Tool) - addSlotToContainer(170 + 1 * slotSize, 218, robot.containerSlotType(1), robot.containerSlotTier(1)) - addSlotToContainer(170 + 2 * slotSize, 218, robot.containerSlotType(2), robot.containerSlotTier(2)) - addSlotToContainer(170 + 3 * slotSize, 218, robot.containerSlotType(3), robot.containerSlotTier(3)) + val hasScreen = robot.components.exists { + case Some(buffer: api.component.TextBuffer) => true + case _ => false + } + private val withScreenHeight = 242 + private val noScreenHeight = 108 + val deltaY = if (hasScreen) 0 else withScreenHeight - noScreenHeight + + addSlotToContainer(170 + 0 * slotSize, 218 - deltaY, api.driver.Slot.Tool) + addSlotToContainer(170 + 1 * slotSize, 218 - deltaY, robot.containerSlotType(1), robot.containerSlotTier(1)) + addSlotToContainer(170 + 2 * slotSize, 218 - deltaY, robot.containerSlotType(2), robot.containerSlotTier(2)) + addSlotToContainer(170 + 3 * slotSize, 218 - deltaY, robot.containerSlotType(3), robot.containerSlotTier(3)) for (i <- 0 to 3) { - val y = 142 + i * slotSize + val y = 142 + i * slotSize - deltaY for (j <- 0 to 3) { val x = 170 + j * slotSize addSlotToContainer(new InventorySlot(this, otherInventory, inventorySlots.size, x, y)) @@ -26,7 +34,7 @@ class Robot(playerInventory: InventoryPlayer, robot: tileentity.Robot) extends P addSlotToContainer(new InventorySlot(this, otherInventory, inventorySlots.size, -10000, -10000)) } - addPlayerInventorySlots(6, 160) + addPlayerInventorySlots(6, 160 - deltaY) private var lastSentBuffer = -1 @@ -80,4 +88,5 @@ class Robot(playerInventory: InventoryPlayer, robot: tileentity.Robot) extends P else null } } + } \ No newline at end of file From 83debc3288ac6e3000ad19fd74276d480ae731d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 1 Jun 2014 19:27:13 +0200 Subject: [PATCH 3/3] Added warning icon when trying to type on a screen without a keyboard (mostly for robots). --- .../textures/gui/keyboard_missing.png | Bin 0 -> 199 bytes .../scala/li/cil/oc/client/GuiHandler.scala | 4 +- .../scala/li/cil/oc/client/Textures.scala | 1 + .../scala/li/cil/oc/client/gui/Robot.scala | 15 +++-- .../scala/li/cil/oc/client/gui/Screen.scala | 8 ++- .../li/cil/oc/client/gui/TextBuffer.scala | 62 ++++++++++++++---- 6 files changed, 67 insertions(+), 23 deletions(-) create mode 100644 src/main/resources/assets/opencomputers/textures/gui/keyboard_missing.png diff --git a/src/main/resources/assets/opencomputers/textures/gui/keyboard_missing.png b/src/main/resources/assets/opencomputers/textures/gui/keyboard_missing.png new file mode 100644 index 0000000000000000000000000000000000000000..3dd6499630ba65f9143bfc7b4b5ec00410275123 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!foo&cW^S0Mc#1VH4oqqdPiK1)fEUoc3>L2Km~Am7o`#WAGf zR!+a85Q72-)4_lLpP$+!bok>Yqpl1kk$|I1I4@oKEuz@Rut)6$U$^XQCi8&fvk%!h jepX)QAnP34z{oH$jZrE3>i!cz!x%hW{an^LB{Ts5s}n^U literal 0 HcmV?d00001 diff --git a/src/main/scala/li/cil/oc/client/GuiHandler.scala b/src/main/scala/li/cil/oc/client/GuiHandler.scala index 0f6d6609d..144837d87 100644 --- a/src/main/scala/li/cil/oc/client/GuiHandler.scala +++ b/src/main/scala/li/cil/oc/client/GuiHandler.scala @@ -24,7 +24,7 @@ object GuiHandler extends CommonGuiHandler { case assembler: tileentity.RobotAssembler if id == GuiType.RobotAssembler.id => new gui.RobotAssembler(player.inventory, assembler) case screen: tileentity.Screen if id == GuiType.Screen.id => - new gui.Screen(screen.origin.buffer, screen.tier > 0, () => screen.origin.buffer.isRenderingEnabled) + new gui.Screen(screen.origin.buffer, screen.tier > 0, () => screen.origin.hasKeyboard, () => screen.origin.buffer.isRenderingEnabled) case _ => Items.multi.subItem(player.getCurrentEquippedItem) match { case Some(server: item.Server) if id == GuiType.Server.id => new gui.Server(player.inventory, new ServerInventory { @@ -49,7 +49,7 @@ object GuiHandler extends CommonGuiHandler { case Some(term) => def inRange = player.isEntityAlive && !term.rack.isInvalid && term.rack.getDistanceFrom(player.posX, player.posY, player.posZ) < term.rack.range * term.rack.range if (inRange) { - if (term.keys.contains(key)) return new gui.Screen(term.buffer, true, () => { + if (term.keys.contains(key)) return new gui.Screen(term.buffer, true, () => true, () => { // Check if someone else bound a term to our server. if (stack.getTagCompound.getString(Settings.namespace + "key") != key) { Minecraft.getMinecraft.displayGuiScreen(null) diff --git a/src/main/scala/li/cil/oc/client/Textures.scala b/src/main/scala/li/cil/oc/client/Textures.scala index 146a44c13..1f95b5110 100644 --- a/src/main/scala/li/cil/oc/client/Textures.scala +++ b/src/main/scala/li/cil/oc/client/Textures.scala @@ -17,6 +17,7 @@ object Textures extends ResourceManagerReloadListener { val guiButtonSide = new ResourceLocation(Settings.resourceDomain, "textures/gui/button_side.png") val guiComputer = new ResourceLocation(Settings.resourceDomain, "textures/gui/computer.png") val guiDisassembler = new ResourceLocation(Settings.resourceDomain, "textures/gui/disassembler.png") + val guiKeyboardMissing = new ResourceLocation(Settings.resourceDomain, "textures/gui/keyboard_missing.png") val guiRange = new ResourceLocation(Settings.resourceDomain, "textures/gui/range.png") val guiRobot = new ResourceLocation(Settings.resourceDomain, "textures/gui/robot.png") val guiRobotNoScreen = new ResourceLocation(Settings.resourceDomain, "textures/gui/robot_noscreen.png") diff --git a/src/main/scala/li/cil/oc/client/gui/Robot.scala b/src/main/scala/li/cil/oc/client/gui/Robot.scala index 6624c542b..94f8bf7fd 100644 --- a/src/main/scala/li/cil/oc/client/gui/Robot.scala +++ b/src/main/scala/li/cil/oc/client/gui/Robot.scala @@ -9,6 +9,7 @@ import li.cil.oc.client.{PacketSender => ClientPacketSender, Textures} import li.cil.oc.common.container import li.cil.oc.common.container.StaticComponentSlot import li.cil.oc.common.tileentity +import li.cil.oc.server.driver import li.cil.oc.util.RenderState import net.minecraft.client.Minecraft import net.minecraft.client.gui.GuiButton @@ -21,11 +22,11 @@ import org.lwjgl.input.{Mouse, Keyboard} import org.lwjgl.opengl.GL11 class Robot(playerInventory: InventoryPlayer, val robot: tileentity.Robot) extends CustomGuiContainer(new container.Robot(playerInventory, robot)) with TextBuffer { - protected val buffer = { - robot.components.collect { - case Some(buffer: api.component.TextBuffer) => buffer - }.headOption.orNull - } + override protected val buffer = robot.components.collect { + case Some(buffer: api.component.TextBuffer) => buffer + }.headOption.orNull + + override protected val hasKeyboard = robot.info.components.map(api.Driver.driverFor).exists(_ == driver.item.Keyboard) private val withScreenHeight = 242 private val noScreenHeight = 108 @@ -49,6 +50,8 @@ class Robot(playerInventory: InventoryPlayer, val robot: tileentity.Robot) exten private val slotSize = 18 + override protected val bufferX = 8 + override protected val bufferY = 8 private val bufferWidth = 242.0 private val bufferHeight = 128.0 private val bufferMargin = BufferRenderer.innerMargin @@ -115,7 +118,7 @@ class Robot(playerInventory: InventoryPlayer, val robot: tileentity.Robot) exten override def drawBuffer() { if (buffer != null) { - GL11.glTranslatef(8, 8, 0) + GL11.glTranslatef(bufferX, bufferY, 0) RenderState.disableLighting() RenderState.makeItBlend() val scaleX = 48f / buffer.getWidth diff --git a/src/main/scala/li/cil/oc/client/gui/Screen.scala b/src/main/scala/li/cil/oc/client/gui/Screen.scala index 2942841f5..538d6a6bf 100644 --- a/src/main/scala/li/cil/oc/client/gui/Screen.scala +++ b/src/main/scala/li/cil/oc/client/gui/Screen.scala @@ -7,7 +7,13 @@ import li.cil.oc.util.RenderState import org.lwjgl.input.Mouse import org.lwjgl.opengl.GL11 -class Screen(val buffer: api.component.TextBuffer, val hasMouse: Boolean, val hasPower: () => Boolean) extends TextBuffer { +class Screen(val buffer: api.component.TextBuffer, val hasMouse: Boolean, val hasKeyboardCallback: () => Boolean, val hasPower: () => Boolean) extends TextBuffer { + override protected def hasKeyboard = hasKeyboardCallback() + + override protected def bufferX = 8 + x + + override protected def bufferY = 8 + y + private val bufferMargin = BufferRenderer.margin + BufferRenderer.innerMargin private var didDrag = false diff --git a/src/main/scala/li/cil/oc/client/gui/TextBuffer.scala b/src/main/scala/li/cil/oc/client/gui/TextBuffer.scala index 706007370..6155ed9eb 100644 --- a/src/main/scala/li/cil/oc/client/gui/TextBuffer.scala +++ b/src/main/scala/li/cil/oc/client/gui/TextBuffer.scala @@ -1,6 +1,6 @@ package li.cil.oc.client.gui -import li.cil.oc.client.KeyBindings +import li.cil.oc.client.{Textures, KeyBindings} import li.cil.oc.client.renderer.MonospaceFontRenderer import li.cil.oc.client.renderer.gui.BufferRenderer import li.cil.oc.util.RenderState @@ -11,16 +11,25 @@ import org.lwjgl.input.Keyboard import org.lwjgl.opengl.GL11 import scala.collection.mutable import li.cil.oc.api +import net.minecraft.client.renderer.Tessellator trait TextBuffer extends GuiScreen { protected def buffer: api.component.TextBuffer + protected def hasKeyboard: Boolean + private val pressedKeys = mutable.Map.empty[Int, Char] + protected def bufferX: Int + + protected def bufferY: Int + protected var currentWidth, currentHeight = -1 private var shouldRecompileDisplayLists = true + private var showKeyboardMissing = 0L + protected var scale = 0.0 def adjustToBufferChange() { @@ -62,6 +71,21 @@ trait TextBuffer extends GuiScreen { RenderState.disableLighting() drawBuffer() GL11.glPopMatrix() + + if (System.currentTimeMillis() - showKeyboardMissing < 1000) { + Minecraft.getMinecraft.getTextureManager.bindTexture(Textures.guiKeyboardMissing) + GL11.glDisable(GL11.GL_DEPTH_TEST) + val t = Tessellator.instance + t.startDrawingQuads() + val x = bufferX + buffer.renderWidth - 16 + val y = bufferY + buffer.renderHeight - 16 + t.addVertexWithUV(x, y + 16, 0, 0, 1) + t.addVertexWithUV(x + 16, y + 16, 0, 1, 1) + t.addVertexWithUV(x + 16, y, 0, 1, 0) + t.addVertexWithUV(x, y, 0, 0, 0) + t.draw() + GL11.glEnable(GL11.GL_DEPTH_TEST) + } } protected def drawBuffer() @@ -73,20 +97,25 @@ trait TextBuffer extends GuiScreen { val code = Keyboard.getEventKey if (buffer != null && code != Keyboard.KEY_ESCAPE && code != Keyboard.KEY_F11) { - if (Keyboard.getEventKeyState) { - val char = Keyboard.getEventCharacter - if (!pressedKeys.contains(code) || !ignoreRepeat(char, code)) { - buffer.keyDown(char, code, null) - pressedKeys += code -> char + if (hasKeyboard) { + if (Keyboard.getEventKeyState) { + val char = Keyboard.getEventCharacter + if (!pressedKeys.contains(code) || !ignoreRepeat(char, code)) { + buffer.keyDown(char, code, null) + pressedKeys += code -> char + } + } + else pressedKeys.remove(code) match { + case Some(char) => buffer.keyUp(char, code, null) + case _ => // Wasn't pressed while viewing the screen. + } + + if (Keyboard.isKeyDown(KeyBindings.clipboardPaste.keyCode) && Keyboard.getEventKeyState) { + buffer.clipboard(GuiScreen.getClipboardString, null) } } - else pressedKeys.remove(code) match { - case Some(char) => buffer.keyUp(char, code, null) - case _ => // Wasn't pressed while viewing the screen. - } - - if (Keyboard.isKeyDown(KeyBindings.clipboardPaste.keyCode) && Keyboard.getEventKeyState) { - buffer.clipboard(GuiScreen.getClipboardString, null) + else { + showKeyboardMissing = System.currentTimeMillis() } } } @@ -94,7 +123,12 @@ trait TextBuffer extends GuiScreen { override protected def mouseClicked(x: Int, y: Int, button: Int) { super.mouseClicked(x, y, button) if (buffer != null && button == 2) { - buffer.clipboard(GuiScreen.getClipboardString, null) + if (hasKeyboard) { + buffer.clipboard(GuiScreen.getClipboardString, null) + } + else { + showKeyboardMissing = System.currentTimeMillis() + } } }