diff --git a/src/main/java/de/ellpeck/prettypipes/terminal/containers/CraftingTerminalGui.java b/src/main/java/de/ellpeck/prettypipes/terminal/containers/CraftingTerminalGui.java index 01ead27..c7861b4 100644 --- a/src/main/java/de/ellpeck/prettypipes/terminal/containers/CraftingTerminalGui.java +++ b/src/main/java/de/ellpeck/prettypipes/terminal/containers/CraftingTerminalGui.java @@ -2,7 +2,10 @@ import com.mojang.blaze3d.platform.InputConstants; import de.ellpeck.prettypipes.PrettyPipes; +import de.ellpeck.prettypipes.misc.ItemTerminalWidget; import de.ellpeck.prettypipes.packets.PacketButton; +import de.ellpeck.prettypipes.packets.PacketGhostSlot; +import de.ellpeck.prettypipes.terminal.CraftingTerminalBlockEntity; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.Tooltip; @@ -10,10 +13,13 @@ import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.Slot; import net.neoforged.neoforge.network.PacketDistributor; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Optional; public class CraftingTerminalGui extends ItemTerminalGui { @@ -21,6 +27,9 @@ public class CraftingTerminalGui extends ItemTerminalGui { private Button requestButton; private Button sendBackButton; + private ItemTerminalWidget draggedItem; + private boolean dragging; + public CraftingTerminalGui(ItemTerminalContainer screenContainer, Inventory inv, Component titleIn) { super(screenContainer, inv, titleIn); this.imageWidth = 256; @@ -59,24 +68,23 @@ public void containerTick() { @Override protected void renderLabels(GuiGraphics graphics, int mouseX, int mouseY) { - super.renderLabels(graphics, mouseX, mouseY); - - var container = this.getCraftingContainer(); - var tile = container.getTile(); - for (var i = 0; i < tile.ghostItems.getSlots(); i++) { - if (!tile.craftItems.getStackInSlot(i).isEmpty()) - continue; - var ghost = tile.ghostItems.getStackInSlot(i); - if (ghost.isEmpty()) - continue; - var finalI = i; - var slot = container.slots.stream().filter(s -> s.container == container.craftInventory && s.getSlotIndex() == finalI).findFirst().orElse(null); - if (slot == null) - continue; - graphics.renderItem(ghost, slot.x, slot.y); - graphics.renderItemDecorations(this.font, ghost, slot.x, slot.y, "0"); + super.renderLabels(graphics, mouseX, mouseY); + var container = this.getCraftingContainer(); + var tile = container.getTile(); + for (var i = 0; i < tile.ghostItems.getSlots(); i++) { + if (!tile.craftItems.getStackInSlot(i).isEmpty()) + continue; + var ghost = tile.ghostItems.getStackInSlot(i); + if (ghost.isEmpty()) + continue; + var finalI = i; + var slot = container.slots.stream().filter(s -> s.container == container.craftInventory && s.getSlotIndex() == finalI).findFirst().orElse(null); + if (slot == null) + continue; + graphics.renderItem(ghost, slot.x, slot.y); + graphics.renderItemDecorations(this.font, ghost, slot.x, slot.y, "0"); + } } - } @Override protected ResourceLocation getTexture() { @@ -92,4 +100,57 @@ protected CraftingTerminalContainer getCraftingContainer() { return (CraftingTerminalContainer) this.menu; } + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if(button == 0 && this.draggedItem == null) { + this.getChildAt(mouseX,mouseY).ifPresent(widget -> this.draggedItem = widget instanceof ItemTerminalWidget terminalWidget && !terminalWidget.stack.isEmpty()? terminalWidget : null); + } + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + public boolean mouseReleased(double mouseX, double mouseY, int button) { + + Slot curSlot= getSlotUnderMouse(); + if(draggedItem!=null && !draggedItem.stack.isEmpty() && curSlot!=null && curSlot.index>=0 && curSlot.index <9) { + List stacks = new ArrayList<>(); + if( menu.tile instanceof CraftingTerminalBlockEntity craftingTerminalBlockEntity) { + for (int i = 0; i < craftingTerminalBlockEntity.ghostItems.getSlots(); i++) { + if (i != curSlot.index-1) + stacks.add(i, new PacketGhostSlot.Entry(Optional.of(List.of(craftingTerminalBlockEntity.ghostItems.getStackInSlot(i))), Optional.empty())); + else { + stacks.add(i, new PacketGhostSlot.Entry(Optional.of(List.of(draggedItem.stack)), Optional.empty())); + } + + } + PacketDistributor.sendToServer(new PacketGhostSlot(craftingTerminalBlockEntity.getBlockPos(), stacks)); + } + } + dragging=false; + draggedItem=null; + return super.mouseReleased(mouseX, mouseY, button); + + } + + @Override + public boolean mouseDragged(double mouseX, double mouseY, int i, double j, double k) { + if(this.draggedItem != null) { + double distance = j*j+k*k; + if(distance>2) + dragging=true; + } + return super.mouseDragged(mouseX, mouseY, i, j, k); + } + + @Override + public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.render(graphics, mouseX, mouseY, partialTicks); + if(draggedItem!=null && dragging) { + graphics.pose().pushPose(); + graphics.pose().translate(0, 0, 200); + graphics.renderItem(draggedItem.stack, mouseX-9, mouseY - 9); + graphics.pose().popPose(); + } + } + }