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 li.cil.oc.common.tileentity.traits.Computer
import net.minecraft.client.Minecraft import net.minecraft.client.Minecraft
import net.minecraft.client.audio.PositionedSoundRecord import net.minecraft.client.audio.PositionedSoundRecord
import net.minecraft.item.ItemStack
import net.minecraft.util.ResourceLocation import net.minecraft.util.ResourceLocation
import net.minecraftforge.common.util.ForgeDirection import net.minecraftforge.common.util.ForgeDirection
@ -166,6 +167,15 @@ object PacketSender {
pb.sendToServer() 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) { def sendRobotAssemblerStart(t: Assembler) {
val pb = new SimplePacketBuilder(PacketType.RobotAssemblerStart) val pb = new SimplePacketBuilder(PacketType.RobotAssemblerStart)

View File

@ -76,6 +76,7 @@ object PacketType extends Enumeration {
// Client -> Server // Client -> Server
ComputerPower, ComputerPower,
CopyToAnalyzer, CopyToAnalyzer,
DatabaseSetSlot,
DriveLock, DriveLock,
DriveMode, DriveMode,
DronePower, 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) @SideOnly(Side.CLIENT)
class NEIOpenComputersConfig extends IConfigureNEI { 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() { override def loadConfig() {
// Non-alphabetic order haunts my OCD, but I want the "Manual" to show up // Non-alphabetic order haunts my OCD, but I want the "Manual" to show up
// before the API doc. // before the API doc.
API.registerUsageHandler(new ManualUsageHandler()) API.registerUsageHandler(new ManualUsageHandler())
API.registerUsageHandler(new CallbackDocHandler()) API.registerUsageHandler(new CallbackDocHandler())
API.registerNEIGuiHandler(new GuiHandler())
// Add option to show items' ore dictionary name in tooltips. // Add option to show items' ore dictionary name in tooltips.
NEIClientConfig.global.config.getTag("inventory.oredict").getBooleanValue(false) 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.Achievement
import li.cil.oc.common.PacketType import li.cil.oc.common.PacketType
import li.cil.oc.common.component.TextBuffer 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.entity.Drone
import li.cil.oc.common.item.Delegator import li.cil.oc.common.item.Delegator
import li.cil.oc.common.item.data.DriveData 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.entity.player.EntityPlayerMP
import net.minecraft.nbt.NBTTagCompound import net.minecraft.nbt.NBTTagCompound
import net.minecraft.network.NetHandlerPlayServer import net.minecraft.network.NetHandlerPlayServer
import net.minecraft.world.WorldServer
import net.minecraftforge.common.DimensionManager import net.minecraftforge.common.DimensionManager
object PacketHandler extends CommonPacketHandler { object PacketHandler extends CommonPacketHandler {
@SubscribeEvent @SubscribeEvent
def onPacket(e: ServerCustomPacketEvent) = def onPacket(e: ServerCustomPacketEvent): Unit =
onPacketData(e.packet.payload, e.handler.asInstanceOf[NetHandlerPlayServer].playerEntity) 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)) Option(DimensionManager.getWorld(dimension))
override def dispatch(p: PacketParser) { override def dispatch(p: PacketParser) {
@ -43,6 +45,7 @@ object PacketHandler extends CommonPacketHandler {
case PacketType.Clipboard => onClipboard(p) case PacketType.Clipboard => onClipboard(p)
case PacketType.MouseClickOrDrag => onMouseClick(p) case PacketType.MouseClickOrDrag => onMouseClick(p)
case PacketType.MouseScroll => onMouseScroll(p) case PacketType.MouseScroll => onMouseScroll(p)
case PacketType.DatabaseSetSlot => onDatabaseSetSlot(p)
case PacketType.MouseUp => onMouseUp(p) case PacketType.MouseUp => onMouseUp(p)
case PacketType.MultiPartPlace => onMultiPartPlace(p) case PacketType.MultiPartPlace => onMultiPartPlace(p)
case PacketType.PetVisibility => onPetVisibility(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) { def onMultiPartPlace(p: PacketParser) {
p.player match { p.player match {
case player: EntityPlayerMP => EventHandler.place(player) case player: EntityPlayerMP => EventHandler.place(player)