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