From 36ca8b9f0a6f89d764bca6d373cf22b578cdc7c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salom=C3=A3o?= Date: Thu, 15 Apr 2021 20:51:43 -0300 Subject: [PATCH] JEI Bookmark dragnDrop --- src/main/java/appeng/client/ClientHelper.java | 49 +++++- .../java/appeng/client/gui/AEBaseGui.java | 144 ++++++++++++------ .../java/appeng/client/gui/AEGuiHandler.java | 3 +- .../sync/packets/PacketInventoryAction.java | 14 ++ 4 files changed, 160 insertions(+), 50 deletions(-) diff --git a/src/main/java/appeng/client/ClientHelper.java b/src/main/java/appeng/client/ClientHelper.java index e78fe1bae..18620fd21 100644 --- a/src/main/java/appeng/client/ClientHelper.java +++ b/src/main/java/appeng/client/ClientHelper.java @@ -25,24 +25,28 @@ import java.util.EnumMap; import java.util.List; import java.util.Random; +import appeng.api.storage.data.IAEFluidStack; +import appeng.client.gui.AEBaseGui; +import appeng.fluids.util.AEFluidStack; import appeng.helpers.HighlighterHandler; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.settings.KeyBinding; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumHand; import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; -import net.minecraftforge.client.event.MouseEvent; -import net.minecraftforge.client.event.RenderLivingEvent; -import net.minecraftforge.client.event.RenderWorldLastEvent; -import net.minecraftforge.client.event.TextureStitchEvent; +import net.minecraftforge.client.event.*; import net.minecraftforge.client.model.ModelLoaderRegistry; import net.minecraftforge.common.ForgeModContainer; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fml.client.FMLClientHandler; import net.minecraftforge.fml.client.registry.ClientRegistry; import net.minecraftforge.fml.client.registry.RenderingRegistry; @@ -75,6 +79,7 @@ import appeng.hooks.TickHandler; import appeng.hooks.TickHandler.PlayerColor; import appeng.server.ServerHelper; import appeng.util.Platform; +import org.lwjgl.input.Mouse; public class ClientHelper extends ServerHelper @@ -315,6 +320,42 @@ public class ClientHelper extends ServerHelper Minecraft.getMinecraft().effectRenderer.addEffect( fx ); } + @SubscribeEvent + public void MouseClickEvent( final GuiScreenEvent.MouseInputEvent.Pre me ) + { + final Minecraft mc = Minecraft.getMinecraft(); + final EntityPlayer player = mc.player; + if( mc.currentScreen instanceof AEBaseGui ) + { + AEBaseGui gui = ( (AEBaseGui) mc.currentScreen ); + + ItemStack dragItem = ItemStack.EMPTY; + Object ingredient = gui.getBookmarkedIngredient(); + + if( ingredient != null ) + { + if( ingredient instanceof ItemStack ) + { + dragItem = ( (ItemStack) ingredient ); + } + else if( ingredient instanceof FluidStack ) + { + dragItem = FluidUtil.getFilledBucket( ( (FluidStack) ingredient ) ); + } + if( GuiScreen.isShiftKeyDown() ) + { + me.setCanceled( true ); + } + else if( Mouse.isButtonDown( 0 ) ) + { + me.setCanceled( true ); + player.inventory.setItemStack( dragItem.copy() ); + gui.setJeiGhostItem( true ); + } + } + } + } + @SubscribeEvent public void wheelEvent( final MouseEvent me ) { diff --git a/src/main/java/appeng/client/gui/AEBaseGui.java b/src/main/java/appeng/client/gui/AEBaseGui.java index 213c08166..b424c443b 100644 --- a/src/main/java/appeng/client/gui/AEBaseGui.java +++ b/src/main/java/appeng/client/gui/AEBaseGui.java @@ -32,6 +32,8 @@ import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; +import appeng.container.slot.*; +import appeng.util.item.AEItemStack; import com.google.common.base.Joiner; import com.google.common.base.Stopwatch; import com.google.common.collect.Lists; @@ -72,17 +74,7 @@ import appeng.client.me.SlotDisconnected; import appeng.client.me.SlotME; import appeng.client.render.StackSizeRenderer; import appeng.container.AEBaseContainer; -import appeng.container.slot.AppEngCraftingSlot; -import appeng.container.slot.AppEngSlot; import appeng.container.slot.AppEngSlot.hasCalculatedValidness; -import appeng.container.slot.IOptionalSlot; -import appeng.container.slot.SlotCraftingTerm; -import appeng.container.slot.SlotDisabled; -import appeng.container.slot.SlotFake; -import appeng.container.slot.SlotInaccessible; -import appeng.container.slot.SlotOutput; -import appeng.container.slot.SlotPatternTerm; -import appeng.container.slot.SlotRestrictedInput; import appeng.core.AELog; import appeng.core.AppEng; import appeng.core.sync.network.NetworkHandler; @@ -110,6 +102,21 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain private Stopwatch dbl_clickTimer = Stopwatch.createStarted(); private ItemStack dbl_whichItem = ItemStack.EMPTY; private Slot bl_clicked; + private Stopwatch lastClicked = Stopwatch.createStarted(); + private boolean isJeiGhostItem; + private List> hoveredIngredientTargets = new ArrayList<>(); + private boolean isDraggingJeiGhostItem; + private Object bookmarkedIngredient; + + public boolean hasIngredientTargets() + { + return (hoveredIngredientTargets.size() > 0); + } + + public Object getBookmarkedIngredient() + { + return bookmarkedIngredient; + } public List getGuiSlots() { @@ -198,35 +205,51 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain this.drawTooltip( (ITooltip) c, mouseX, mouseY ); } } - /* - if ( isPointInRegion( -guiLeft,-guiTop, mc.displayWidth, mc.displayHeight, mouseX,mouseY)){ - Object o = runtime.getBookmarkOverlay().getIngredientUnderMouse(); - if (o != null) { - List> hoveredIngredientTargets = aeGuiHandler.getTargets( this, o, false ); - if (hoveredIngredientTargets.size() > 0 ) + if( !isJeiGhostItem ) + { + bookmarkedIngredient = runtime.getBookmarkOverlay().getIngredientUnderMouse(); + } + if( isJeiGhostItem ) + { + if( hoveredIngredientTargets.size() > 0 ) + { + drawTargets( mouseX, mouseY ); + } + } + else if( bookmarkedIngredient != null ) + { + hoveredIngredientTargets = aeGuiHandler.getTargets( this, bookmarkedIngredient, false ); + if( hoveredIngredientTargets.size() > 0 ) + { + drawTargets( mouseX, mouseY ); + if( isShiftKeyDown() && Mouse.isButtonDown( 0 ) && this.lastClicked.elapsed( TimeUnit.MILLISECONDS ) > 200 ) { - GlStateManager.disableLighting(); - GlStateManager.disableDepth(); - for( IGhostIngredientHandler.Target target : hoveredIngredientTargets ) - { - Rectangle area = target.getArea(); - Color color; - if( area.contains( mouseX, mouseY ) ) - { - color = new Color( 76, 201, 25, 128 ); - } - else - { - color = new Color( 19, 201, 10, 64 ); - } - Gui.drawRect( area.x, area.y, area.x + area.width, area.y + area.height, color.getRGB() ); - } - GlStateManager.color( 1f, 1f, 1f, 1f ); - aeGuiHandler.getTargets( this, o, true ); + this.lastClicked = Stopwatch.createStarted(); + aeGuiHandler.getTargets( this, bookmarkedIngredient, true ); } } } - */ + } + + private void drawTargets(int mouseX, int mouseY) { + GlStateManager.disableLighting(); + GlStateManager.disableDepth(); + for( IGhostIngredientHandler.Target target : hoveredIngredientTargets ) + { + Rectangle area = target.getArea(); + Color color; + if( area.contains( mouseX, mouseY ) ) + { + color = new Color( 76, 201, 25, 128 ); + } + else + { + color = new Color( 19, 201, 10, 64 ); + } + Gui.drawRect( area.x, area.y, area.x + area.width, area.y + area.height, color.getRGB() ); + } + GlStateManager.color( 1f, 1f, 1f, 1f ); + GlStateManager.enableDepth(); } protected void drawGuiSlot( GuiCustomSlot slot, int mouseX, int mouseY, float partialTicks ) @@ -462,24 +485,43 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain } } + public boolean isJeiGhostItem() + { + return isJeiGhostItem; + } + // TODO 1.9.4 aftermath - Whole ClickType thing, to be checked. @Override protected void handleMouseClick( final Slot slot, final int slotIdx, final int mouseButton, final ClickType clickType ) { final EntityPlayer player = Minecraft.getMinecraft().player; - if( slot instanceof SlotFake ) + if( isJeiGhostItem && slot instanceof IJEITargetSlot) { - final InventoryAction action = mouseButton == 1 ? InventoryAction.SPLIT_OR_PLACE_SINGLE : InventoryAction.PICKUP_OR_SET_DOWN; + try + { + PacketInventoryAction p = new PacketInventoryAction( InventoryAction.PLACE_JEI_GHOST_ITEM, (IJEITargetSlot) slot, AEItemStack.fromItemStack( player.inventory.getItemStack() ) ); + NetworkHandler.instance().sendToServer( p ); + } + catch( IOException e ) + { + e.printStackTrace(); + } + isJeiGhostItem = false; + } + + else if( slot instanceof SlotFake ) + { + final InventoryAction action; + action = mouseButton == 1 ? InventoryAction.SPLIT_OR_PLACE_SINGLE : InventoryAction.PICKUP_OR_SET_DOWN; if( this.drag_click.size() > 1 ) { return; } - final PacketInventoryAction p = new PacketInventoryAction( action, slotIdx, 0 ); + PacketInventoryAction p = new PacketInventoryAction( action, slotIdx, 0 ); NetworkHandler.instance().sendToServer( p ); - return; } @@ -599,14 +641,13 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain InventoryAction action = null; IAEItemStack stack = null; - switch( clickType ) + switch ( clickType ) { case PICKUP: // pickup / set-down. action = ( mouseButton == 1 ) ? InventoryAction.SPLIT_OR_PLACE_SINGLE : InventoryAction.PICKUP_OR_SET_DOWN; stack = ( (SlotME) slot ).getAEStack(); - if( stack != null && action == InventoryAction.PICKUP_OR_SET_DOWN && stack.getStackSize() == 0 && player.inventory.getItemStack() - .isEmpty() ) + if( stack != null && action == InventoryAction.PICKUP_OR_SET_DOWN && stack.getStackSize() == 0 && player.inventory.getItemStack().isEmpty() ) { action = InventoryAction.AUTO_CRAFT; } @@ -673,9 +714,7 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain final List slots = this.getInventorySlots(); for( final Slot inventorySlot : slots ) { - if( inventorySlot != null && inventorySlot.canTakeStack( - this.mc.player ) && inventorySlot.getHasStack() && inventorySlot.isSameInventory( slot ) && Container.canAddItemToSlot( - inventorySlot, this.dbl_whichItem, true ) ) + if( inventorySlot != null && inventorySlot.canTakeStack( this.mc.player ) && inventorySlot.getHasStack() && inventorySlot.isSameInventory( slot ) && Container.canAddItemToSlot( inventorySlot, this.dbl_whichItem, true ) ) { this.handleMouseClick( inventorySlot, inventorySlot.slotNumber, 0, ClickType.QUICK_MOVE ); } @@ -686,6 +725,16 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain this.disableShiftClick = false; } + if (clickType == ClickType.PICKUP && isJeiGhostItem && !isDraggingJeiGhostItem) { + this.isDraggingJeiGhostItem = true; + return; + } else if ( clickType == ClickType.PICKUP && isJeiGhostItem ) + { + this.isDraggingJeiGhostItem = false; + player.inventory.setItemStack( ItemStack.EMPTY ); + this.isJeiGhostItem = false; + } + super.handleMouseClick( slot, slotIdx, mouseButton, clickType ); } @@ -1113,4 +1162,9 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain { return false; } + + public void setJeiGhostItem( boolean b ) + { + this.isJeiGhostItem = b; + } } diff --git a/src/main/java/appeng/client/gui/AEGuiHandler.java b/src/main/java/appeng/client/gui/AEGuiHandler.java index 431211abb..e525c3986 100644 --- a/src/main/java/appeng/client/gui/AEGuiHandler.java +++ b/src/main/java/appeng/client/gui/AEGuiHandler.java @@ -9,6 +9,7 @@ import appeng.fluids.client.gui.widgets.GuiFluidSlot; import mezz.jei.api.gui.IAdvancedGuiHandler; import mezz.jei.api.gui.IGhostIngredientHandler; import net.minecraft.client.gui.GuiScreen; +import org.lwjgl.input.Mouse; import java.awt.*; import java.util.ArrayList; @@ -101,7 +102,7 @@ public class AEGuiHandler implements IAdvancedGuiHandler, IGhostIngre List> phantomTargets = g.getPhantomTargets( ingredient ); targets.addAll( (List>) (Object) phantomTargets ); } - if( doStart && GuiScreen.isShiftKeyDown() ) + if( doStart && GuiScreen.isShiftKeyDown() && Mouse.isButtonDown( 0 ) ) { if( gui instanceof GuiUpgradeable || gui instanceof GuiPatternTerm ) { diff --git a/src/main/java/appeng/core/sync/packets/PacketInventoryAction.java b/src/main/java/appeng/core/sync/packets/PacketInventoryAction.java index 4c9a73dd5..e50aeed1b 100644 --- a/src/main/java/appeng/core/sync/packets/PacketInventoryAction.java +++ b/src/main/java/appeng/core/sync/packets/PacketInventoryAction.java @@ -26,6 +26,8 @@ import appeng.client.gui.implementations.GuiUpgradeable; import appeng.client.gui.widgets.GuiCustomSlot; import appeng.container.slot.IJEITargetSlot; import appeng.container.slot.SlotFake; +import appeng.core.AELog; +import appeng.core.sync.network.NetworkHandler; import appeng.fluids.client.gui.widgets.GuiFluidSlot; import appeng.fluids.util.AEFluidStack; import io.netty.buffer.ByteBuf; @@ -203,8 +205,20 @@ public class PacketInventoryAction extends AppEngPacket sender.openContainer.inventorySlots.get( this.slot ).putStack( AEFluidStack.fromFluidStack( fluid ).asItemStackRepresentation() ); } } + } else sender.openContainer.inventorySlots.get( this.slot ).putStack( ItemStack.EMPTY ); + try + { + NetworkHandler.instance() + .sendTo( + new PacketInventoryAction( InventoryAction.UPDATE_HAND, 0, AEItemStack.fromItemStack( ItemStack.EMPTY ) ), + sender ); + } + catch( final IOException e ) + { + AELog.debug( e ); + } } if( Minecraft.getMinecraft().currentScreen instanceof GuiUpgradeable ) {