mirror of
https://github.com/MightyPirates/OpenComputers.git
synced 2025-09-25 05:55:41 -04:00
Add NEI drag&drop support to database GUI
This commit is contained in:
parent
470421b965
commit
9cf102cde4
@ -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)
|
||||
|
||||
|
@ -76,6 +76,7 @@ object PacketType extends Enumeration {
|
||||
// Client -> Server
|
||||
ComputerPower,
|
||||
CopyToAnalyzer,
|
||||
DatabaseSetSlot,
|
||||
DriveLock,
|
||||
DriveMode,
|
||||
DronePower,
|
||||
|
36
src/main/scala/li/cil/oc/integration/nei/GuiHandler.scala
Normal file
36
src/main/scala/li/cil/oc/integration/nei/GuiHandler.scala
Normal 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)
|
||||
}
|
||||
}
|
||||
}
|
@ -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)
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user