diff --git a/src/main/java/appeng/client/ClientHelper.java b/src/main/java/appeng/client/ClientHelper.java index 2731555fb..e78fe1bae 100644 --- a/src/main/java/appeng/client/ClientHelper.java +++ b/src/main/java/appeng/client/ClientHelper.java @@ -25,6 +25,7 @@ import java.util.EnumMap; import java.util.List; import java.util.Random; +import appeng.helpers.HighlighterHandler; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.settings.KeyBinding; @@ -37,6 +38,7 @@ 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.model.ModelLoaderRegistry; import net.minecraftforge.common.ForgeModContainer; @@ -106,6 +108,11 @@ public class ClientHelper extends ServerHelper } } + @SubscribeEvent + public void renderWorldLastEvent( RenderWorldLastEvent event) { + HighlighterHandler.tick(event); + } + @Override public World getWorld() { diff --git a/src/main/java/appeng/client/gui/AEBaseGui.java b/src/main/java/appeng/client/gui/AEBaseGui.java index 1a4a7b115..a5fd26e88 100644 --- a/src/main/java/appeng/client/gui/AEBaseGui.java +++ b/src/main/java/appeng/client/gui/AEBaseGui.java @@ -476,7 +476,10 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain switch( clickType ) { case PICKUP: // pickup / set-down. - action = ( mouseButton == 1 ) ? InventoryAction.SPLIT_OR_PLACE_SINGLE : InventoryAction.PICKUP_OR_SET_DOWN; + if (slot.getStack().isEmpty() && !player.inventory.getItemStack().isEmpty()) + action = InventoryAction.SPLIT_OR_PLACE_SINGLE; + if (!slot.getStack().isEmpty() && player.inventory.getItemStack().isEmpty()) + action = InventoryAction.PICKUP_OR_SET_DOWN; break; case QUICK_MOVE: action = ( mouseButton == 1 ) ? InventoryAction.PICKUP_SINGLE : InventoryAction.SHIFT_CLICK; diff --git a/src/main/java/appeng/client/gui/implementations/GuiInterfaceTerminal.java b/src/main/java/appeng/client/gui/implementations/GuiInterfaceTerminal.java index ab4fda86b..39ac125df 100644 --- a/src/main/java/appeng/client/gui/implementations/GuiInterfaceTerminal.java +++ b/src/main/java/appeng/client/gui/implementations/GuiInterfaceTerminal.java @@ -22,8 +22,10 @@ package appeng.client.gui.implementations; import java.io.IOException; import java.util.*; +import appeng.util.BlockPosUtils; import com.google.common.collect.HashMultimap; +import net.minecraft.client.gui.GuiButton; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Slot; @@ -44,6 +46,10 @@ import appeng.parts.reporting.PartInterfaceTerminal; import appeng.util.Platform; import net.minecraft.nbt.NBTUtil; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.TextComponentString; + + +import static appeng.client.render.BlockPosHighlighter.hilightBlock; public class GuiInterfaceTerminal extends AEBaseGui @@ -57,6 +63,7 @@ public class GuiInterfaceTerminal extends AEBaseGui private final HashMap byId = new HashMap<>(); private final HashMultimap byName = HashMultimap.create(); private final HashMap blockPosHashMap = new HashMap<>(); + private final HashMap guiButtonHashMap = new HashMap<>(); private final ArrayList names = new ArrayList<>(); private final ArrayList lines = new ArrayList<>(); @@ -65,12 +72,14 @@ public class GuiInterfaceTerminal extends AEBaseGui private boolean refreshList = false; private MEGuiTextField searchFieldOutputs; private MEGuiTextField searchFieldInputs; - + private PartInterfaceTerminal partInterfaceTerminal; + GuiButton guiButtonHide; public GuiInterfaceTerminal( final InventoryPlayer inventoryPlayer, final PartInterfaceTerminal te ) { super( new ContainerInterfaceTerminal( inventoryPlayer, te ) ); + this.partInterfaceTerminal = te; final GuiScrollbar scrollbar = new GuiScrollbar(); this.setScrollBar( scrollbar ); this.xSize = 195; @@ -100,16 +109,31 @@ public class GuiInterfaceTerminal extends AEBaseGui this.searchFieldOutputs.setTextColor( 0xFFFFFF ); this.searchFieldOutputs.setVisible( true ); this.searchFieldOutputs.setFocused( true ); + + this.searchFieldInputs.setText( partInterfaceTerminal.in ); + this.searchFieldOutputs.setText( partInterfaceTerminal.out ); + } + + @Override + public void onGuiClosed() + { + partInterfaceTerminal.saveSearchStrings( this.searchFieldInputs.getText().toLowerCase(), this.searchFieldOutputs.getText().toLowerCase() ); + super.onGuiClosed(); } @Override public void drawFG( final int offsetX, final int offsetY, final int mouseX, final int mouseY ) { + this.buttonList.clear(); + this.fontRenderer.drawString( this.getGuiDisplayName( GuiText.InterfaceTerminal.getLocal() ), 8, 6, 4210752 ); this.fontRenderer.drawString( GuiText.inventory.getLocal(), 8, this.ySize - 96 + 3, 4210752 ); final int ex = this.getScrollBar().getCurrentScroll(); + this.guiButtonHide = new GuiButton( -1, guiLeft + 112, guiTop + 4, 70, 12, "Toggle full" ); + this.buttonList.add( guiButtonHide ); + final Iterator o = this.inventorySlots.inventorySlots.iterator(); while( o.hasNext() ) { @@ -130,6 +154,10 @@ public class GuiInterfaceTerminal extends AEBaseGui { this.inventorySlots.inventorySlots.add( new SlotDisconnected( inv, z, z * 18 + 8, 1 + offset ) ); } + GuiButton guiButton = new GuiButton( x, guiLeft + 1, guiTop + offset + 3, 8, 10, "?" ); + guiButtonHashMap.put( guiButton , inv); + this.buttonList.add( guiButton ); + } else if( lineObj instanceof String ) { @@ -173,10 +201,30 @@ public class GuiInterfaceTerminal extends AEBaseGui super.mouseClicked( xCoord, yCoord, btn ); } + @Override + protected void actionPerformed( final GuiButton btn ) throws IOException + { + if( guiButtonHashMap.containsKey( btn ) ) + { + BlockPos blockPos = blockPosHashMap.get( guiButtonHashMap.get( this.selectedButton ) ); + BlockPos blockPos2 = mc.player.getPosition(); + hilightBlock( blockPos, System.currentTimeMillis() + 500 * BlockPosUtils.getDistance(blockPos, blockPos2) ); + mc.player.sendStatusMessage( new TextComponentString( "The interface is now highlighted at " + "X: " + blockPos.getX() + "Y: " + blockPos.getY() + "Z: " + blockPos.getZ() ), false ); + mc.player.closeScreen(); + } + + if (btn == guiButtonHide) + { + partInterfaceTerminal.onlyInterfacesWithFreeSlots = !partInterfaceTerminal.onlyInterfacesWithFreeSlots; + this.refreshList(); + } + + } + @Override public void drawBG( final int offsetX, final int offsetY, final int mouseX, final int mouseY ) { - this.bindTexture( "guis/interfaceterminal.png" ); + this.bindTexture( "guis/newinterfaceterminal.png" ); this.drawTexturedModalRect( offsetX, offsetY, 0, 0, this.xSize, this.ySize ); int offset = 32; @@ -286,6 +334,7 @@ public class GuiInterfaceTerminal extends AEBaseGui private void refreshList() { this.byName.clear(); + this.buttonList.clear(); final String searchFieldInputs = this.searchFieldInputs.getText().toLowerCase(); final String searchFieldOutputs = this.searchFieldOutputs.getText().toLowerCase(); @@ -303,6 +352,7 @@ public class GuiInterfaceTerminal extends AEBaseGui // Shortcut to skip any filter if search term is ""/empty boolean found = (searchFieldInputs.isEmpty() && searchFieldOutputs.isEmpty()); + boolean interfaceHasFreeSlots = false; // Search if the current inventory holds a pattern containing the search term. if( !found ) @@ -315,6 +365,9 @@ public class GuiInterfaceTerminal extends AEBaseGui found = ( this.itemStackMatchesSearchTerm( itemStack, searchFieldInputs, 0 ) ); else if( !searchFieldOutputs.isEmpty() ) found = ( this.itemStackMatchesSearchTerm( itemStack, searchFieldOutputs, 1 ) ); + if (partInterfaceTerminal.onlyInterfacesWithFreeSlots && itemStack.isEmpty()) { + interfaceHasFreeSlots = true; + } if( found ) { break; @@ -325,8 +378,15 @@ public class GuiInterfaceTerminal extends AEBaseGui // if found, filter skipped or machine name matching the search term, add it if( found || (entry.getName().toLowerCase().contains( searchFieldInputs ) && entry.getName().toLowerCase().contains( searchFieldOutputs ))) { - this.byName.put( entry.getName(), entry ); - cachedSearch.add( entry ); + if (!partInterfaceTerminal.onlyInterfacesWithFreeSlots) + { + this.byName.put( entry.getName(), entry ); + cachedSearch.add( entry ); + } + else if ( interfaceHasFreeSlots ){ + this.byName.put( entry.getName(), entry ); + cachedSearch.add( entry ); + } } else { diff --git a/src/main/java/appeng/client/render/BlockPosHighlighter.java b/src/main/java/appeng/client/render/BlockPosHighlighter.java new file mode 100644 index 000000000..728430ab3 --- /dev/null +++ b/src/main/java/appeng/client/render/BlockPosHighlighter.java @@ -0,0 +1,25 @@ +package appeng.client.render; + +import net.minecraft.util.math.BlockPos; + +// taken from McJty's McJtyLib +public class BlockPosHighlighter +{ + private static BlockPos hilightedBlock; + private static long expireHilight; + + public static void hilightBlock( BlockPos c, long expireHilight ) { + hilightedBlock = c; + BlockPosHighlighter.expireHilight = expireHilight; + } + + public static BlockPos getHilightedBlock() { + return hilightedBlock; + } + + public static long getExpireHilight() { + return expireHilight; + } + + +} diff --git a/src/main/java/appeng/container/implementations/ContainerInterfaceTerminal.java b/src/main/java/appeng/container/implementations/ContainerInterfaceTerminal.java index 05f5564e8..d7d52a89a 100644 --- a/src/main/java/appeng/container/implementations/ContainerInterfaceTerminal.java +++ b/src/main/java/appeng/container/implementations/ContainerInterfaceTerminal.java @@ -419,7 +419,7 @@ public final class ContainerInterfaceTerminal extends AEBaseContainer this.client = new AppEngInternalInventory( null, this.server.getSlots() ); this.unlocalizedName = unlocalizedName; this.sortBy = dual.getSortValue(); - this.pos = dual.getTile().getPos(); + this.pos = dual.getLocation().getPos(); } } diff --git a/src/main/java/appeng/helpers/HighlighterHandler.java b/src/main/java/appeng/helpers/HighlighterHandler.java new file mode 100644 index 000000000..abd1e3b6d --- /dev/null +++ b/src/main/java/appeng/helpers/HighlighterHandler.java @@ -0,0 +1,96 @@ +package appeng.helpers; + +import appeng.client.render.BlockPosHighlighter; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.client.event.RenderWorldLastEvent; +import org.lwjgl.opengl.GL11; + +// taken from McJty's McJtyLib + +public class HighlighterHandler +{ + + public static void tick( RenderWorldLastEvent event ) { + renderHilightedBlock(event); + } + + private static void renderHilightedBlock( RenderWorldLastEvent event ) { + BlockPos c = BlockPosHighlighter.getHilightedBlock(); + if (c == null) { + return; + } + Minecraft mc = Minecraft.getMinecraft(); + long time = System.currentTimeMillis(); + + if (time > BlockPosHighlighter.getExpireHilight()) { + BlockPosHighlighter.hilightBlock(null, -1); + return; + } + + if (((time / 500) & 1) == 0) { + return; + } + + EntityPlayerSP p = mc.player; + double doubleX = p.lastTickPosX + (p.posX - p.lastTickPosX) * event.getPartialTicks(); + double doubleY = p.lastTickPosY + (p.posY - p.lastTickPosY) * event.getPartialTicks(); + double doubleZ = p.lastTickPosZ + (p.posZ - p.lastTickPosZ) * event.getPartialTicks(); + + GlStateManager.pushMatrix(); + GlStateManager.color(1.0f, 0, 0); + GlStateManager.glLineWidth(3); + GlStateManager.translate(-doubleX, -doubleY, -doubleZ); + + GlStateManager.disableDepth(); + GlStateManager.disableTexture2D(); + + Tessellator tessellator = Tessellator.getInstance(); + BufferBuilder buffer = tessellator.getBuffer(); + float mx = c.getX(); + float my = c.getY(); + float mz = c.getZ(); + buffer.begin( GL11.GL_LINES, DefaultVertexFormats.POSITION_COLOR); + renderHighLightedBlocksOutline(buffer, mx, my, mz, 1.0f, 0.0f, 0.0f, 1.0f); + + tessellator.draw(); + + GlStateManager.enableTexture2D(); + GlStateManager.popMatrix(); + } + + public static void renderHighLightedBlocksOutline(BufferBuilder buffer, float mx, float my, float mz, float r, float g, float b, float a) { + buffer.pos(mx, my, mz).color(r, g, b, a).endVertex(); + buffer.pos(mx + 1, my, mz).color(r, g, b, a).endVertex(); + buffer.pos(mx, my, mz).color(r, g, b, a).endVertex(); + buffer.pos(mx, my + 1, mz).color(r, g, b, a).endVertex(); + buffer.pos(mx, my, mz).color(r, g, b, a).endVertex(); + buffer.pos(mx, my, mz + 1).color(r, g, b, a).endVertex(); + buffer.pos(mx + 1, my + 1, mz + 1).color(r, g, b, a).endVertex(); + buffer.pos(mx, my + 1, mz + 1).color(r, g, b, a).endVertex(); + buffer.pos(mx + 1, my + 1, mz + 1).color(r, g, b, a).endVertex(); + buffer.pos(mx + 1, my, mz + 1).color(r, g, b, a).endVertex(); + buffer.pos(mx + 1, my + 1, mz + 1).color(r, g, b, a).endVertex(); + buffer.pos(mx + 1, my + 1, mz).color(r, g, b, a).endVertex(); + + buffer.pos(mx, my + 1, mz).color(r, g, b, a).endVertex(); + buffer.pos(mx, my + 1, mz + 1).color(r, g, b, a).endVertex(); + buffer.pos(mx, my + 1, mz).color(r, g, b, a).endVertex(); + buffer.pos(mx + 1, my + 1, mz).color(r, g, b, a).endVertex(); + + buffer.pos(mx + 1, my, mz).color(r, g, b, a).endVertex(); + buffer.pos(mx + 1, my, mz + 1).color(r, g, b, a).endVertex(); + buffer.pos(mx + 1, my, mz).color(r, g, b, a).endVertex(); + buffer.pos(mx + 1, my + 1, mz).color(r, g, b, a).endVertex(); + + buffer.pos(mx, my, mz + 1).color(r, g, b, a).endVertex(); + buffer.pos(mx + 1, my, mz + 1).color(r, g, b, a).endVertex(); + buffer.pos(mx, my, mz + 1).color(r, g, b, a).endVertex(); + buffer.pos(mx, my + 1, mz + 1).color(r, g, b, a).endVertex(); + } +} diff --git a/src/main/java/appeng/parts/reporting/PartInterfaceTerminal.java b/src/main/java/appeng/parts/reporting/PartInterfaceTerminal.java index e5ef4911f..075d03050 100644 --- a/src/main/java/appeng/parts/reporting/PartInterfaceTerminal.java +++ b/src/main/java/appeng/parts/reporting/PartInterfaceTerminal.java @@ -44,6 +44,9 @@ public class PartInterfaceTerminal extends AbstractPartDisplay public static final IPartModel MODELS_OFF = new PartModel( MODEL_BASE, MODEL_OFF, MODEL_STATUS_OFF ); public static final IPartModel MODELS_ON = new PartModel( MODEL_BASE, MODEL_ON, MODEL_STATUS_ON ); public static final IPartModel MODELS_HAS_CHANNEL = new PartModel( MODEL_BASE, MODEL_ON, MODEL_STATUS_HAS_CHANNEL ); + public String in = ""; + public String out = ""; + public boolean onlyInterfacesWithFreeSlots = false; public PartInterfaceTerminal( final ItemStack is ) { @@ -69,4 +72,8 @@ public class PartInterfaceTerminal extends AbstractPartDisplay return this.selectModel( MODELS_OFF, MODELS_ON, MODELS_HAS_CHANNEL ); } + public void saveSearchStrings(String in, String out){ + this.in = in; + this.out = out; + } } diff --git a/src/main/java/appeng/util/BlockPosUtils.java b/src/main/java/appeng/util/BlockPosUtils.java new file mode 100644 index 000000000..37479ab3e --- /dev/null +++ b/src/main/java/appeng/util/BlockPosUtils.java @@ -0,0 +1,41 @@ +package appeng.util; + +import net.minecraft.util.math.BlockPos; + + +public class BlockPosUtils +{ + public static long getDistance( BlockPos blockPos, BlockPos blockPos2 ) + { + int x; + if( (blockPos.getX() > 0 && blockPos2.getX() > 0) || (blockPos.getX() < 0 && blockPos2.getX() < 0)) + { + x = blockPos.getX() - blockPos2.getX(); + } + else + { + x = blockPos.getX() + blockPos2.getX(); + } + + int y; + if( (blockPos.getY() > 0 && blockPos2.getY() > 0) || (blockPos.getY() < 0 && blockPos2.getY() < 0) ) + { + y = blockPos.getY() - blockPos2.getY(); + } + else + { + y = blockPos.getY() + blockPos2.getY(); + } + + int z; + if( (blockPos.getZ() > 0 && blockPos2.getZ() > 0) || (blockPos.getZ() < 0 && blockPos2.getZ() < 0) ) + { + z = blockPos.getZ() - blockPos2.getZ(); + } + else + { + z = blockPos.getZ() + blockPos2.getZ(); + } + return Math.abs( x ) + Math.abs( y ) + Math.abs( z ); + } +} diff --git a/src/main/resources/assets/appliedenergistics2/textures/guis/interfaceterminal.png b/src/main/resources/assets/appliedenergistics2/textures/guis/interfaceterminal.png deleted file mode 100644 index aa2996581..000000000 Binary files a/src/main/resources/assets/appliedenergistics2/textures/guis/interfaceterminal.png and /dev/null differ diff --git a/src/main/resources/assets/appliedenergistics2/textures/guis/newinterfaceterminal.png b/src/main/resources/assets/appliedenergistics2/textures/guis/newinterfaceterminal.png new file mode 100644 index 000000000..aed3dec25 Binary files /dev/null and b/src/main/resources/assets/appliedenergistics2/textures/guis/newinterfaceterminal.png differ