84 lines
2.2 KiB
Kotlin
84 lines
2.2 KiB
Kotlin
package net.shadowfacts.phycon.block.inserter
|
|
|
|
import net.minecraft.entity.player.PlayerEntity
|
|
import net.minecraft.entity.player.PlayerInventory
|
|
import net.minecraft.item.ItemStack
|
|
import net.minecraft.network.PacketByteBuf
|
|
import net.minecraft.screen.ScreenHandler
|
|
import net.minecraft.screen.slot.Slot
|
|
import net.minecraft.screen.slot.SlotActionType
|
|
import net.minecraft.util.Identifier
|
|
import net.shadowfacts.phycon.PhysicalConnectivity
|
|
import net.shadowfacts.phycon.init.PhyBlocks
|
|
import net.shadowfacts.phycon.init.PhyScreens
|
|
import net.shadowfacts.phycon.util.GhostSlot
|
|
import net.shadowfacts.phycon.util.copyWithCount
|
|
import kotlin.math.min
|
|
|
|
/**
|
|
* @author shadowfacts
|
|
*/
|
|
class InserterScreenHandler(
|
|
syncId: Int,
|
|
playerInv: PlayerInventory,
|
|
val inserter: InserterBlockEntity,
|
|
): ScreenHandler(PhyScreens.INSERTER, syncId) {
|
|
|
|
companion object {
|
|
val ID = Identifier(PhysicalConnectivity.MODID, "inserter")
|
|
}
|
|
|
|
constructor(syncId: Int, playerInv: PlayerInventory, buf: PacketByteBuf):
|
|
this(
|
|
syncId,
|
|
playerInv,
|
|
PhyBlocks.INSERTER.getBlockEntity(playerInv.player.world, buf.readBlockPos())!!
|
|
)
|
|
|
|
init {
|
|
// fake slot
|
|
addSlot(GhostSlot(inserter, 31, 20))
|
|
|
|
// player inv
|
|
for (y in 0 until 3) {
|
|
for (x in 0 until 9) {
|
|
addSlot(Slot(playerInv, x + y * 9 + 9, 8 + x * 18, 51 + y * 18))
|
|
}
|
|
}
|
|
|
|
// hotbar
|
|
for (x in 0 until 9) {
|
|
addSlot(Slot(playerInv, x, 8 + x * 18, 109))
|
|
}
|
|
}
|
|
|
|
private fun stackToExtractChanged() {
|
|
inserter.amountToExtract = min(inserter.stackToExtract.maxCount, inserter.amountToExtract)
|
|
}
|
|
|
|
override fun canUse(player: PlayerEntity): Boolean {
|
|
return true
|
|
}
|
|
|
|
override fun onSlotClick(slotId: Int, clickData: Int, actionType: SlotActionType, player: PlayerEntity): ItemStack {
|
|
// fake slot
|
|
if (slotId == 0) {
|
|
if (player.inventory.cursorStack.isEmpty) {
|
|
inserter.stackToExtract = ItemStack.EMPTY
|
|
} else {
|
|
inserter.stackToExtract = player.inventory.cursorStack.copyWithCount(1)
|
|
}
|
|
stackToExtractChanged()
|
|
}
|
|
return super.onSlotClick(slotId, clickData, actionType, player)
|
|
}
|
|
|
|
override fun transferSlot(player: PlayerEntity, slotId: Int): ItemStack {
|
|
val slot = slots[slotId]
|
|
inserter.stackToExtract = slot.stack.copyWithCount(1)
|
|
stackToExtractChanged()
|
|
return ItemStack.EMPTY
|
|
}
|
|
|
|
}
|