90 lines
2.6 KiB
Kotlin
90 lines
2.6 KiB
Kotlin
package net.shadowfacts.phycon.network.block.terminal
|
|
|
|
import net.minecraft.screen.slot.Slot
|
|
import net.minecraft.screen.slot.SlotActionType
|
|
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.util.Identifier
|
|
import net.shadowfacts.phycon.PhysicalConnectivity
|
|
import net.shadowfacts.phycon.init.PhyBlocks
|
|
import net.shadowfacts.phycon.init.PhyScreens
|
|
import kotlin.math.ceil
|
|
import kotlin.math.min
|
|
|
|
/**
|
|
* @author shadowfacts
|
|
*/
|
|
class TerminalScreenHandler(syncId: Int, playerInv: PlayerInventory, val terminal: TerminalBlockEntity): ScreenHandler(PhyScreens.TERMINAL_SCREEN_HANDLER, syncId) {
|
|
|
|
companion object {
|
|
val ID = Identifier(PhysicalConnectivity.MODID, "terminal")
|
|
}
|
|
|
|
constructor(syncId: Int, playerInv: PlayerInventory, buf: PacketByteBuf):
|
|
this(syncId, playerInv, PhyBlocks.TERMINAL.getBlockEntity(playerInv.player.world, buf.readBlockPos())!!)
|
|
|
|
init {
|
|
// network
|
|
for (y in 0 until 6) {
|
|
for (x in 0 until 9) {
|
|
addSlot(TerminalFakeSlot(terminal, y * 9 + x, 66 + x * 18, 18 + y * 18))
|
|
}
|
|
}
|
|
|
|
// internal buffer
|
|
for (y in 0 until 6) {
|
|
for (x in 0 until 3) {
|
|
addSlot(Slot(terminal.internalBuffer, y * 3 + x, 8 + x * 18, 18 + y * 18))
|
|
}
|
|
}
|
|
|
|
// player inv
|
|
for (y in 0 until 3) {
|
|
for (x in 0 until 9) {
|
|
addSlot(Slot(playerInv, x + y * 9 + 9, 66 + x * 18, 140 + y * 18))
|
|
}
|
|
}
|
|
// hotbar
|
|
for (x in 0 until 9) {
|
|
addSlot(Slot(playerInv, x, 66 + x * 18, 198))
|
|
}
|
|
}
|
|
|
|
override fun canUse(player: PlayerEntity): Boolean {
|
|
return true
|
|
}
|
|
|
|
override fun close(player: PlayerEntity) {
|
|
super.close(player)
|
|
|
|
terminal.removeObserver()
|
|
}
|
|
|
|
override fun onSlotClick(slotId: Int, clickData: Int, actionType: SlotActionType, player: PlayerEntity): ItemStack {
|
|
if (slotId in 0 until 54) {
|
|
// the slot clicked was one of the network stacks
|
|
if (actionType == SlotActionType.QUICK_MOVE) {
|
|
val stack = slots[slotId].stack
|
|
if (!stack.isEmpty && !player.world.isClient) {
|
|
terminal.requestItem(stack, min(stack.count, stack.maxCount))
|
|
}
|
|
} else if (actionType == SlotActionType.PICKUP && clickData == 1) {
|
|
if (clickData == 1) {
|
|
// right click, request half stack
|
|
val stack = slots[slotId].stack
|
|
if (!stack.isEmpty && !player.world.isClient) {
|
|
terminal.requestItem(stack, ceil(min(stack.count, stack.maxCount) / 2f).toInt())
|
|
}
|
|
} else {
|
|
// todo: left click, show amount dialog
|
|
}
|
|
}
|
|
return ItemStack.EMPTY
|
|
}
|
|
return super.onSlotClick(slotId, clickData, actionType, player)
|
|
}
|
|
}
|