From 9cf102cde4b533b661a7e0ccf3eb53480a733e82 Mon Sep 17 00:00:00 2001 From: repo_alt Date: Thu, 9 Dec 2021 15:21:13 +0300 Subject: [PATCH] Add NEI drag&drop support to database GUI --- .../scala/li/cil/oc/client/PacketSender.scala | 10 ++++++ .../scala/li/cil/oc/common/PacketType.scala | 1 + .../cil/oc/integration/nei/GuiHandler.scala | 36 +++++++++++++++++++ .../nei/NEIOpenComputersConfig.scala | 5 +-- .../li/cil/oc/server/PacketHandler.scala | 16 +++++++-- 5 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 src/main/scala/li/cil/oc/integration/nei/GuiHandler.scala diff --git a/src/main/scala/li/cil/oc/client/PacketSender.scala b/src/main/scala/li/cil/oc/client/PacketSender.scala index 3b0cddc83..1b4b7f0eb 100644 --- a/src/main/scala/li/cil/oc/client/PacketSender.scala +++ b/src/main/scala/li/cil/oc/client/PacketSender.scala @@ -9,6 +9,7 @@ import li.cil.oc.common.tileentity._ import li.cil.oc.common.tileentity.traits.Computer import net.minecraft.client.Minecraft import net.minecraft.client.audio.PositionedSoundRecord +import net.minecraft.item.ItemStack import net.minecraft.util.ResourceLocation import net.minecraftforge.common.util.ForgeDirection @@ -166,6 +167,15 @@ object PacketSender { pb.sendToServer() } + def sendDatabaseSetSlot(slot :Int, stack: ItemStack) { + val pb = new SimplePacketBuilder(PacketType.DatabaseSetSlot) + + pb.writeByte(slot) + pb.writeItemStack(stack) + + pb.sendToServer() + } + def sendRobotAssemblerStart(t: Assembler) { val pb = new SimplePacketBuilder(PacketType.RobotAssemblerStart) diff --git a/src/main/scala/li/cil/oc/common/PacketType.scala b/src/main/scala/li/cil/oc/common/PacketType.scala index c665fe5f9..8e05f946d 100644 --- a/src/main/scala/li/cil/oc/common/PacketType.scala +++ b/src/main/scala/li/cil/oc/common/PacketType.scala @@ -76,6 +76,7 @@ object PacketType extends Enumeration { // Client -> Server ComputerPower, CopyToAnalyzer, + DatabaseSetSlot, DriveLock, DriveMode, DronePower, diff --git a/src/main/scala/li/cil/oc/integration/nei/GuiHandler.scala b/src/main/scala/li/cil/oc/integration/nei/GuiHandler.scala new file mode 100644 index 000000000..090cb8d45 --- /dev/null +++ b/src/main/scala/li/cil/oc/integration/nei/GuiHandler.scala @@ -0,0 +1,36 @@ +package li.cil.oc.integration.nei + +import codechicken.nei.api.INEIGuiAdapter +import li.cil.oc.client.PacketSender +import li.cil.oc.client.gui.Database +import net.minecraft.client.gui.inventory.GuiContainer +import net.minecraft.item.ItemStack + +class GuiHandler extends INEIGuiAdapter { + private def getSlot(db: Database, mousex: Int, mousey: Int): Option[Int] = { + val slotSize = 18 + val offset = 8 + Array(3, 2, 0)(db.databaseInventory.tier) * slotSize + val row = (mousey - offset - db.guiTop)/slotSize + val column = (mousex - offset - db.guiLeft)/slotSize + val size = math.sqrt(db.databaseInventory.getSizeInventory).ceil.toInt + val validSlots = 0 until size + if ((validSlots contains row) && (validSlots contains column)) + Option(row * size + column) + else + None + } + override def handleDragNDrop(gui: GuiContainer, mousex: Int, mousey: Int, draggedStack: ItemStack, button: Int):Boolean = { + gui match { + case db: Database => + getSlot(db, mousex, mousey) match { + case Some(slot) => + val stack = draggedStack.copy() + stack.stackSize = 1 // packet writing will "optimize" out empty stack + PacketSender.sendDatabaseSetSlot(slot, stack) + true + case _ => false + } + case _ => super.handleDragNDrop(gui, mousex, mousey, draggedStack, button) + } + } +} diff --git a/src/main/scala/li/cil/oc/integration/nei/NEIOpenComputersConfig.scala b/src/main/scala/li/cil/oc/integration/nei/NEIOpenComputersConfig.scala index 84544c782..1994e9242 100644 --- a/src/main/scala/li/cil/oc/integration/nei/NEIOpenComputersConfig.scala +++ b/src/main/scala/li/cil/oc/integration/nei/NEIOpenComputersConfig.scala @@ -12,15 +12,16 @@ import li.cil.oc.integration.util.NEI @SideOnly(Side.CLIENT) class NEIOpenComputersConfig extends IConfigureNEI { - override def getName = OpenComputers.Name + override def getName: String = OpenComputers.Name - override def getVersion = OpenComputers.Version + override def getVersion: String = OpenComputers.Version override def loadConfig() { // Non-alphabetic order haunts my OCD, but I want the "Manual" to show up // before the API doc. API.registerUsageHandler(new ManualUsageHandler()) API.registerUsageHandler(new CallbackDocHandler()) + API.registerNEIGuiHandler(new GuiHandler()) // Add option to show items' ore dictionary name in tooltips. NEIClientConfig.global.config.getTag("inventory.oredict").getBooleanValue(false) diff --git a/src/main/scala/li/cil/oc/server/PacketHandler.scala b/src/main/scala/li/cil/oc/server/PacketHandler.scala index a54ab678e..48204c53b 100644 --- a/src/main/scala/li/cil/oc/server/PacketHandler.scala +++ b/src/main/scala/li/cil/oc/server/PacketHandler.scala @@ -9,6 +9,7 @@ import li.cil.oc.api.machine.Machine import li.cil.oc.common.Achievement import li.cil.oc.common.PacketType import li.cil.oc.common.component.TextBuffer +import li.cil.oc.common.container.Database import li.cil.oc.common.entity.Drone import li.cil.oc.common.item.Delegator import li.cil.oc.common.item.data.DriveData @@ -21,14 +22,15 @@ import net.minecraft.entity.player.EntityPlayer import net.minecraft.entity.player.EntityPlayerMP import net.minecraft.nbt.NBTTagCompound import net.minecraft.network.NetHandlerPlayServer +import net.minecraft.world.WorldServer import net.minecraftforge.common.DimensionManager object PacketHandler extends CommonPacketHandler { @SubscribeEvent - def onPacket(e: ServerCustomPacketEvent) = + def onPacket(e: ServerCustomPacketEvent): Unit = onPacketData(e.packet.payload, e.handler.asInstanceOf[NetHandlerPlayServer].playerEntity) - override protected def world(player: EntityPlayer, dimension: Int) = + override protected def world(player: EntityPlayer, dimension: Int): Option[WorldServer] = Option(DimensionManager.getWorld(dimension)) override def dispatch(p: PacketParser) { @@ -43,6 +45,7 @@ object PacketHandler extends CommonPacketHandler { case PacketType.Clipboard => onClipboard(p) case PacketType.MouseClickOrDrag => onMouseClick(p) case PacketType.MouseScroll => onMouseScroll(p) + case PacketType.DatabaseSetSlot => onDatabaseSetSlot(p) case PacketType.MouseUp => onMouseUp(p) case PacketType.MultiPartPlace => onMultiPartPlace(p) case PacketType.PetVisibility => onPetVisibility(p) @@ -220,6 +223,15 @@ object PacketHandler extends CommonPacketHandler { } } + def onDatabaseSetSlot(p: PacketParser) { + val slot = p.readByte() + val stack = p.readItemStack() + p.player.openContainer match { + case db: Database => db.putStackInSlot(slot, stack) + case _ => // Invalid packet. + } + } + def onMultiPartPlace(p: PacketParser) { p.player match { case player: EntityPlayerMP => EventHandler.place(player)