Add NEI drag&drop support to database GUI

This commit is contained in:
repo_alt 2021-12-09 15:21:13 +03:00
parent 470421b965
commit 9cf102cde4
5 changed files with 64 additions and 4 deletions

View File

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

View File

@ -76,6 +76,7 @@ object PacketType extends Enumeration {
// Client -> Server
ComputerPower,
CopyToAnalyzer,
DatabaseSetSlot,
DriveLock,
DriveMode,
DronePower,

View File

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

View File

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

View File

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