From bf9eae1be98f2de258fb66c9a0756a512cc1e236 Mon Sep 17 00:00:00 2001 From: payonel Date: Tue, 25 Sep 2018 17:57:16 -0700 Subject: [PATCH 1/4] provide inventory gui for mountable disk drives rack click accessible as well as "from the hip" with your held item closes #2704 --- .../scala/li/cil/oc/client/GuiHandler.scala | 23 +++++++++++------- .../li/cil/oc/client/gui/DiskDrive.scala | 4 ++-- .../scala/li/cil/oc/common/GuiHandler.scala | 16 ++++++++++--- src/main/scala/li/cil/oc/common/GuiType.scala | 2 ++ .../cil/oc/common/container/DiskDrive.scala | 4 ++-- .../DiskDriveMountableInventory.scala | 21 ++++++++++++++++ .../oc/common/item/DiskDriveMountable.scala | 24 ++++++++++++++++++- .../server/component/DiskDriveMountable.scala | 12 ++++++---- 8 files changed, 85 insertions(+), 21 deletions(-) create mode 100644 src/main/scala/li/cil/oc/common/inventory/DiskDriveMountableInventory.scala diff --git a/src/main/scala/li/cil/oc/client/GuiHandler.scala b/src/main/scala/li/cil/oc/client/GuiHandler.scala index d4aef3295..de218cf51 100644 --- a/src/main/scala/li/cil/oc/client/GuiHandler.scala +++ b/src/main/scala/li/cil/oc/client/GuiHandler.scala @@ -4,17 +4,12 @@ import com.google.common.base.Strings import li.cil.oc.Localization import li.cil.oc.Settings import li.cil.oc.api -import li.cil.oc.common.GuiType -import li.cil.oc.common.component -import li.cil.oc.common.entity -import li.cil.oc.common.inventory.DatabaseInventory -import li.cil.oc.common.inventory.ServerInventory -import li.cil.oc.common.item +import li.cil.oc.common.{GuiType, component, entity, item, tileentity, GuiHandler => CommonGuiHandler} +import li.cil.oc.common.inventory.{DatabaseInventory, DiskDriveMountableInventory, ServerInventory} import li.cil.oc.common.item.Delegator -import li.cil.oc.common.tileentity -import li.cil.oc.common.{GuiHandler => CommonGuiHandler} import net.minecraft.client.Minecraft import net.minecraft.entity.player.EntityPlayer +import net.minecraft.item.ItemStack import net.minecraft.tileentity.TileEntity import net.minecraft.world.World @@ -54,6 +49,13 @@ object GuiHandler extends CommonGuiHandler { override def isUseableByPlayer(player: EntityPlayer) = t.isUseableByPlayer(player) }, Option(t), slot) + case t: tileentity.Rack if id == GuiType.DiskDriveMountableInRack.id => + val slot = GuiType.extractSlot(y) + new gui.DiskDrive(player.inventory, new DiskDriveMountableInventory { + override def container: ItemStack = t.getStackInSlot(slot) + + override def isUseableByPlayer(player: EntityPlayer): Boolean = t.isUseableByPlayer(player) + }) case t: tileentity.Switch if id == GuiType.Switch.id => new gui.Switch(player.inventory, t) case t: tileentity.Waypoint if id == GuiType.Waypoint.id => @@ -99,6 +101,11 @@ object GuiHandler extends CommonGuiHandler { new gui.Tablet(player.inventory, item.Tablet.get(stack, player)) } else null + case Some(_: item.DiskDriveMountable) if id == GuiType.DiskDriveMountable.id => + new gui.DiskDrive(player.inventory, new DiskDriveMountableInventory { + override def container = player.getHeldItem + override def isUseableByPlayer(activePlayer : EntityPlayer): Boolean = activePlayer == player + }) case Some(terminal: item.Terminal) if id == GuiType.Terminal.id => val stack = player.getHeldItem if (stack.hasTagCompound) { diff --git a/src/main/scala/li/cil/oc/client/gui/DiskDrive.scala b/src/main/scala/li/cil/oc/client/gui/DiskDrive.scala index 29ab40a21..468751814 100644 --- a/src/main/scala/li/cil/oc/client/gui/DiskDrive.scala +++ b/src/main/scala/li/cil/oc/client/gui/DiskDrive.scala @@ -2,10 +2,10 @@ package li.cil.oc.client.gui import li.cil.oc.Localization import li.cil.oc.common.container -import li.cil.oc.common.tileentity import net.minecraft.entity.player.InventoryPlayer +import net.minecraft.inventory.IInventory -class DiskDrive(playerInventory: InventoryPlayer, val drive: tileentity.DiskDrive) extends DynamicGuiContainer(new container.DiskDrive(playerInventory, drive)) { +class DiskDrive(playerInventory: InventoryPlayer, val drive: IInventory) extends DynamicGuiContainer(new container.DiskDrive(playerInventory, drive)) { override def drawSecondaryForegroundLayer(mouseX: Int, mouseY: Int) = { super.drawSecondaryForegroundLayer(mouseX, mouseY) fontRendererObj.drawString( diff --git a/src/main/scala/li/cil/oc/common/GuiHandler.scala b/src/main/scala/li/cil/oc/common/GuiHandler.scala index 8fda2b1e7..b8dd46849 100644 --- a/src/main/scala/li/cil/oc/common/GuiHandler.scala +++ b/src/main/scala/li/cil/oc/common/GuiHandler.scala @@ -1,11 +1,11 @@ package li.cil.oc.common import cpw.mods.fml.common.network.IGuiHandler -import li.cil.oc.common.inventory.DatabaseInventory -import li.cil.oc.common.inventory.ServerInventory +import li.cil.oc.common.inventory.{DatabaseInventory, DiskDriveMountableInventory, ServerInventory} import li.cil.oc.common.item.Delegator -import li.cil.oc.server.component.Server +import li.cil.oc.server.component.{DiskDriveMountable, Server} import net.minecraft.entity.player.EntityPlayer +import net.minecraft.item.ItemStack import net.minecraft.world.World abstract class GuiHandler extends IGuiHandler { @@ -39,6 +39,10 @@ abstract class GuiHandler extends IGuiHandler { val slot = GuiType.extractSlot(y) val server = t.getMountable(slot).asInstanceOf[Server] new container.Server(player.inventory, server, Option(server)) + case t: tileentity.Rack if id == GuiType.DiskDriveMountableInRack.id => + val slot = GuiType.extractSlot(y) + val drive = t.getMountable(slot).asInstanceOf[DiskDriveMountable] + new container.DiskDrive(player.inventory, drive) case t: tileentity.Switch if id == GuiType.Switch.id => new container.Switch(player.inventory, t) case _ => null @@ -69,6 +73,12 @@ abstract class GuiHandler extends IGuiHandler { new container.Tablet(player.inventory, item.Tablet.get(stack, player)) else null + case Some(drive: item.DiskDriveMountable) if id == GuiType.DiskDriveMountable.id => + new container.DiskDrive(player.inventory, new DiskDriveMountableInventory { + override def container: ItemStack = player.getHeldItem + + override def isUseableByPlayer(player: EntityPlayer) = player == player + }) case _ => null } case _ => null diff --git a/src/main/scala/li/cil/oc/common/GuiType.scala b/src/main/scala/li/cil/oc/common/GuiType.scala index a1fae72ae..ee001fc5b 100644 --- a/src/main/scala/li/cil/oc/common/GuiType.scala +++ b/src/main/scala/li/cil/oc/common/GuiType.scala @@ -20,6 +20,8 @@ object GuiType extends ScalaEnum { val Database = new EnumVal { def name = "Database"; def subType = GuiType.Category.Item } val Disassembler = new EnumVal { def name = "Disassembler"; def subType = GuiType.Category.Block } val DiskDrive = new EnumVal { def name = "DiskDrive"; def subType = GuiType.Category.Block } + val DiskDriveMountable = new EnumVal { def name = "DiskDriveMountable"; def subType = GuiType.Category.Item } + val DiskDriveMountableInRack = new EnumVal { def name = "DiskDriveMountableInRack"; def subType = GuiType.Category.Block } val Drive = new EnumVal { def name = "Drive"; def subType = GuiType.Category.Item } val Drone = new EnumVal { def name = "Drone"; def subType = GuiType.Category.Entity } val Manual = new EnumVal { def name = "Manual"; def subType = GuiType.Category.None } diff --git a/src/main/scala/li/cil/oc/common/container/DiskDrive.scala b/src/main/scala/li/cil/oc/common/container/DiskDrive.scala index 90855ae0b..8a2c4b3fb 100644 --- a/src/main/scala/li/cil/oc/common/container/DiskDrive.scala +++ b/src/main/scala/li/cil/oc/common/container/DiskDrive.scala @@ -1,10 +1,10 @@ package li.cil.oc.common.container import li.cil.oc.common.Slot -import li.cil.oc.common.tileentity import net.minecraft.entity.player.InventoryPlayer +import net.minecraft.inventory.IInventory -class DiskDrive(playerInventory: InventoryPlayer, drive: tileentity.DiskDrive) extends Player(playerInventory, drive) { +class DiskDrive(playerInventory: InventoryPlayer, drive: IInventory) extends Player(playerInventory, drive) { addSlotToContainer(80, 35, Slot.Floppy) addPlayerInventorySlots(8, 84) } diff --git a/src/main/scala/li/cil/oc/common/inventory/DiskDriveMountableInventory.scala b/src/main/scala/li/cil/oc/common/inventory/DiskDriveMountableInventory.scala new file mode 100644 index 000000000..055fc341f --- /dev/null +++ b/src/main/scala/li/cil/oc/common/inventory/DiskDriveMountableInventory.scala @@ -0,0 +1,21 @@ +package li.cil.oc.common.inventory + +import li.cil.oc.api.Driver +import li.cil.oc.common.tileentity +import li.cil.oc.common.Slot +import net.minecraft.item.ItemStack + +trait DiskDriveMountableInventory extends ItemStackInventory { + def tier: Int = 1 + + override def getSizeInventory = 1 + + override protected def inventoryName = "DiskDrive" + + override def getInventoryStackLimit = 1 + + override def isItemValidForSlot(slot: Int, stack: ItemStack): Boolean = (slot, Option(Driver.driverFor(stack, classOf[tileentity.DiskDrive]))) match { + case (0, Some(driver)) => driver.slot(stack) == Slot.Floppy + case _ => false + } +} diff --git a/src/main/scala/li/cil/oc/common/item/DiskDriveMountable.scala b/src/main/scala/li/cil/oc/common/item/DiskDriveMountable.scala index 9debd5678..5b5ce78fc 100644 --- a/src/main/scala/li/cil/oc/common/item/DiskDriveMountable.scala +++ b/src/main/scala/li/cil/oc/common/item/DiskDriveMountable.scala @@ -1,3 +1,25 @@ package li.cil.oc.common.item -class DiskDriveMountable(val parent: Delegator) extends traits.Delegate +import java.util + +import li.cil.oc.client.KeyBindings +import li.cil.oc.{OpenComputers, Settings} +import li.cil.oc.common.GuiType +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.item.ItemStack +import net.minecraft.world.World + +import scala.collection.mutable + +class DiskDriveMountable(val parent: Delegator) extends traits.Delegate { + override def maxStackSize = 1 + + override def onItemRightClick(stack: ItemStack, world: World, player: EntityPlayer) = { + // Open the GUI immediately on the client, too, to avoid the player + // changing the current slot before it actually opens, which can lead to + // desynchronization of the player inventory. + player.openGui(OpenComputers, GuiType.DiskDriveMountable.id, world, 0, 0, 0) + player.swingItem() + stack + } +} diff --git a/src/main/scala/li/cil/oc/server/component/DiskDriveMountable.scala b/src/main/scala/li/cil/oc/server/component/DiskDriveMountable.scala index 270a1287e..e4c59ede3 100644 --- a/src/main/scala/li/cil/oc/server/component/DiskDriveMountable.scala +++ b/src/main/scala/li/cil/oc/server/component/DiskDriveMountable.scala @@ -2,10 +2,9 @@ package li.cil.oc.server.component import java.util -import li.cil.oc.Constants +import li.cil.oc.{Constants, OpenComputers, api} import li.cil.oc.api.driver.DeviceInfo.DeviceAttribute import li.cil.oc.api.driver.DeviceInfo.DeviceClass -import li.cil.oc.api import li.cil.oc.api.Driver import li.cil.oc.api.component.RackBusConnectable import li.cil.oc.api.component.RackMountable @@ -19,8 +18,7 @@ import li.cil.oc.api.network.EnvironmentHost import li.cil.oc.api.network.Node import li.cil.oc.api.network.Visibility import li.cil.oc.api.prefab -import li.cil.oc.common.Slot -import li.cil.oc.common.Sound +import li.cil.oc.common.{GuiType, Slot, Sound} import li.cil.oc.common.inventory.ComponentInventory import li.cil.oc.common.inventory.ItemStackInventory import li.cil.oc.util.BlockPosition @@ -179,7 +177,11 @@ class DiskDriveMountable(val rack: api.internal.Rack, val slot: Int) extends pre } isDiskInDrive || isHoldingDisk } - else false + else { + val position = BlockPosition(rack) + player.openGui(OpenComputers, GuiType.DiskDriveMountableInRack.id, rack.world, position.x, GuiType.embedSlot(position.y, slot), position.z) + true + } } // ----------------------------------------------------------------------- // From ea252ff475396eac14f9d92041fbf7b977b9151f Mon Sep 17 00:00:00 2001 From: payonel Date: Wed, 26 Sep 2018 22:05:58 -0700 Subject: [PATCH 2/4] compare BlockPos to BlockPos move fix --- src/main/scala/li/cil/oc/common/tileentity/Robot.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/li/cil/oc/common/tileentity/Robot.scala b/src/main/scala/li/cil/oc/common/tileentity/Robot.scala index c7b253e24..7391f4876 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Robot.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Robot.scala @@ -259,7 +259,7 @@ class Robot extends traits.Computer with traits.PowerInformation with traits.Rot else { world.setBlockToAir(newPosition) } - created && this.position == newPosition + created && this.pos == newPosition } finally { blockRobotProxy.moving.set(None) From 70554be9a8ef36c94b9b4903b644aecaf4ddfb11 Mon Sep 17 00:00:00 2001 From: payonel Date: Wed, 26 Sep 2018 22:10:44 -0700 Subject: [PATCH 3/4] remove unused import --- src/main/scala/li/cil/oc/Settings.scala | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/scala/li/cil/oc/Settings.scala b/src/main/scala/li/cil/oc/Settings.scala index 1f70c1a04..c8ef19d48 100644 --- a/src/main/scala/li/cil/oc/Settings.scala +++ b/src/main/scala/li/cil/oc/Settings.scala @@ -12,7 +12,6 @@ import com.mojang.authlib.GameProfile import com.typesafe.config._ import li.cil.oc.Settings.DebugCardAccess import li.cil.oc.common.Tier -import li.cil.oc.integration.Mods import li.cil.oc.server.component.DebugCard import li.cil.oc.server.component.DebugCard.AccessContext import org.apache.commons.codec.binary.Hex From 9aef16b2a3df56e542945fa1134d2af7042b5d87 Mon Sep 17 00:00:00 2001 From: payonel Date: Thu, 27 Sep 2018 01:41:23 -0700 Subject: [PATCH 4/4] use sided inventory for accessors to agent inv inventory calls such as `suck` and `suckFromSlot` were creating a sideless inventory handler on the agents (drones and robots). The sideless access was allowing the api calls to access slot indexes beyond the intended main inventory size, and creep into their component inventory (e.g. starting with slot index 69 on creatix), thus creating a copy of the agent's first component (e.g. a Screen block) This fix creates a sided inventory handler from the inventoryAt call, fixing these cases. closes #2935 --- src/main/scala/li/cil/oc/util/InventoryUtils.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/li/cil/oc/util/InventoryUtils.scala b/src/main/scala/li/cil/oc/util/InventoryUtils.scala index 5d9faeb7b..4a407bf50 100644 --- a/src/main/scala/li/cil/oc/util/InventoryUtils.scala +++ b/src/main/scala/li/cil/oc/util/InventoryUtils.scala @@ -47,7 +47,7 @@ object InventoryUtils { def inventoryAt(position: BlockPosition, side: EnumFacing): Option[IItemHandler] = position.world match { case Some(world) if world.blockExists(position) => world.getTileEntity(position) match { case tile: TileEntity if tile.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side) => Option(tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side)) - case tile: IInventory => Option(asItemHandler(tile)) + case tile: IInventory => Option(asItemHandler(tile, side)) case _ => world.getEntitiesWithinAABB(classOf[Entity], position.bounds) .filter(e => !e.isDead && e.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side)) .map(_.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side))