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 diff --git a/src/main/scala/li/cil/oc/client/GuiHandler.scala b/src/main/scala/li/cil/oc/client/GuiHandler.scala index f003525f0..180e2cfad 100644 --- a/src/main/scala/li/cil/oc/client/GuiHandler.scala +++ b/src/main/scala/li/cil/oc/client/GuiHandler.scala @@ -7,8 +7,7 @@ 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.inventory.{DatabaseInventory, DiskDriveMountableInventory, ServerInventory} import li.cil.oc.common.item import li.cil.oc.common.item.Delegator import li.cil.oc.common.tileentity @@ -57,6 +56,13 @@ object GuiHandler extends CommonGuiHandler { override def isUsableByPlayer(player: EntityPlayer) = t.isUsableByPlayer(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 isUsableByPlayer(player: EntityPlayer): Boolean = t.isUsableByPlayer(player) + }) case t: tileentity.Waypoint if id == GuiType.Waypoint.id => new gui.Waypoint(t) case _ => null @@ -101,6 +107,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 = itemStackInUse + override def isUsableByPlayer(activePlayer : EntityPlayer): Boolean = activePlayer == player + }) case Some(terminal: item.Terminal) if id == GuiType.Terminal.id => val stack = itemStackInUse 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 6d12a042d..14ab5bd7e 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) fontRenderer.drawString( diff --git a/src/main/scala/li/cil/oc/common/GuiHandler.scala b/src/main/scala/li/cil/oc/common/GuiHandler.scala index c4c6a2c1b..90c6fe3ab 100644 --- a/src/main/scala/li/cil/oc/common/GuiHandler.scala +++ b/src/main/scala/li/cil/oc/common/GuiHandler.scala @@ -1,11 +1,10 @@ package li.cil.oc.common -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.util.BlockPosition import li.cil.oc.util.ExtendedWorld._ +import li.cil.oc.server.component.{DiskDriveMountable, Server} import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.ItemStack import net.minecraft.world.World @@ -42,6 +41,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 _ => null } case Some(GuiType.Category.Entity) => @@ -71,6 +74,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 = itemStackInUse + + override def isUsableByPlayer(player: EntityPlayer) = player == player + }) 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..5f275155a 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,21 @@ package li.cil.oc.common.item -class DiskDriveMountable(val parent: Delegator) extends traits.Delegate +import li.cil.oc.OpenComputers +import li.cil.oc.common.GuiType +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.item.ItemStack +import net.minecraft.util.{ActionResult, EnumActionResult, EnumHand} +import net.minecraft.world.World + +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.swingArm(EnumHand.MAIN_HAND) + ActionResult.newResult(EnumActionResult.SUCCESS, stack) + } +} 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 2414408cd..5ab733c9b 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Robot.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Robot.scala @@ -275,7 +275,7 @@ class Robot extends traits.Computer with traits.PowerInformation with traits.Rot else { getWorld.setBlockToAir(newPosition) } - created && this.position == newPosition + created && this.pos == newPosition } finally { blockRobotProxy.moving.set(None) 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 b312b410d..1ce4946a1 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 @@ -20,8 +19,7 @@ import li.cil.oc.api.network.Node import li.cil.oc.api.network.Visibility import li.cil.oc.api.prefab import li.cil.oc.api.prefab.AbstractManagedEnvironment -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 @@ -182,7 +180,11 @@ class DiskDriveMountable(val rack: api.internal.Rack, val slot: Int) extends Abs } 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 + } } // ----------------------------------------------------------------------- // diff --git a/src/main/scala/li/cil/oc/util/InventoryUtils.scala b/src/main/scala/li/cil/oc/util/InventoryUtils.scala index 9d7b7e6a1..326c923dc 100644 --- a/src/main/scala/li/cil/oc/util/InventoryUtils.scala +++ b/src/main/scala/li/cil/oc/util/InventoryUtils.scala @@ -48,7 +48,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))