From bc2e4c84b975f8b84df18d7a89200af57153df53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Salom=C3=A3o?= Date: Sun, 28 Feb 2021 05:12:08 -0300 Subject: [PATCH] highlight interfaces from interface terminal. --- src/main/java/appeng/client/ClientHelper.java | 7 ++ .../implementations/GuiInterfaceTerminal.java | 36 ++++++- .../client/render/BlockPosHighlighter.java | 25 +++++ .../appeng/helpers/HighlighterHandler.java | 96 ++++++++++++++++++ src/main/java/appeng/util/BlockPosUtils.java | 41 ++++++++ .../textures/guis/interfaceterminal.png | Bin 11018 -> 0 bytes .../textures/guis/newinterfaceterminal.png | Bin 0 -> 11339 bytes 7 files changed, 204 insertions(+), 1 deletion(-) create mode 100644 src/main/java/appeng/client/render/BlockPosHighlighter.java create mode 100644 src/main/java/appeng/helpers/HighlighterHandler.java create mode 100644 src/main/java/appeng/util/BlockPosUtils.java delete mode 100644 src/main/resources/assets/appliedenergistics2/textures/guis/interfaceterminal.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/guis/newinterfaceterminal.png diff --git a/src/main/java/appeng/client/ClientHelper.java b/src/main/java/appeng/client/ClientHelper.java index 2731555fb97..e78fe1bae4b 100644 --- a/src/main/java/appeng/client/ClientHelper.java +++ b/src/main/java/appeng/client/ClientHelper.java @@ -25,6 +25,7 @@ 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.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 void init() } } + @SubscribeEvent + public void renderWorldLastEvent( RenderWorldLastEvent event) { + HighlighterHandler.tick(event); + } + @Override public World getWorld() { diff --git a/src/main/java/appeng/client/gui/implementations/GuiInterfaceTerminal.java b/src/main/java/appeng/client/gui/implementations/GuiInterfaceTerminal.java index ab4fda86bee..96465d9a588 100644 --- a/src/main/java/appeng/client/gui/implementations/GuiInterfaceTerminal.java +++ b/src/main/java/appeng/client/gui/implementations/GuiInterfaceTerminal.java @@ -22,9 +22,15 @@ import java.io.IOException; import java.util.*; +import akka.event.Logging; +import appeng.client.render.BlockPosHighlighter; +import appeng.util.BlockPosUtils; import com.google.common.collect.HashMultimap; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; @@ -44,6 +50,12 @@ import appeng.util.Platform; import net.minecraft.nbt.NBTUtil; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TextComponentString; +import org.lwjgl.util.Color; +import org.lwjgl.util.ReadableColor; + +import static appeng.client.render.BlockPosHighlighter.hilightBlock; public class GuiInterfaceTerminal extends AEBaseGui @@ -57,6 +69,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<>(); @@ -100,11 +113,14 @@ public void initGui() this.searchFieldOutputs.setTextColor( 0xFFFFFF ); this.searchFieldOutputs.setVisible( true ); this.searchFieldOutputs.setFocused( true ); + } @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 ); @@ -130,6 +146,10 @@ public void drawFG( final int offsetX, final int offsetY, final int mouseX, fina { 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 +193,23 @@ protected void mouseClicked( final int xCoord, final int yCoord, final int btn ) 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(); + } + } + @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 +319,7 @@ public void postUpdate( final NBTTagCompound in ) private void refreshList() { this.byName.clear(); + this.buttonList.clear(); final String searchFieldInputs = this.searchFieldInputs.getText().toLowerCase(); final String searchFieldOutputs = this.searchFieldOutputs.getText().toLowerCase(); 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 00000000000..728430ab32c --- /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/helpers/HighlighterHandler.java b/src/main/java/appeng/helpers/HighlighterHandler.java new file mode 100644 index 00000000000..abd1e3b6ddc --- /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/util/BlockPosUtils.java b/src/main/java/appeng/util/BlockPosUtils.java new file mode 100644 index 00000000000..37479ab3e62 --- /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 aa2996581120bc1f902f8b0735ee416a0afff18f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11018 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 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 0000000000000000000000000000000000000000..aed3dec25c2254d149ed9a5e91b095353ab125a5 GIT binary patch literal 11339 zcmeHtc{r5q+yBTeluBgDm?&Y)VjcT7m>6UiV$8zWhB2~bNlLPmwJe3~B(kqbwopi9 zmo-IFO0vXnsONcl-uHRG@9#N&zwi6Udp!3sbI*01*XR74=XGA^dENJM9TRS-ug%87 z!vX*R*ibr}MgRZ}wMheDqNV;g-?uOU0FJcynOIPaFy26SGKoNR!2>D2?sy>Hhe!Yb zd`5~=EH8*5A~knvuAkpGk3sPDyyO3}vKgW`94mgK_E0L+QN8cKyhfR4@K%N2GXAq;oo%ZT5YQ-2<8h%fx8m+)d$f-}CLR8S7gj z>j|A+qpMT%J8R6#QNjEUOO!TZpp`=pUFsJ1+`@L|N?gs0>c_9gI+rKil$!*Lx3ZQA z*?~L>Jt5Q6zP6v*G9_n57rWNbK1&xXY%V$sugZ2EST@IQd?vf8I7i)omF(a(pl!`l zjBN1L-kxl`+BLpyF{|+D@Hd5}PdG!`#yqpxIUqu z;!{z1Si~1nhl^O!7X!`Cjf$sOdo<&x2bqg!Y&K=M%9avcAEZQ1VX9x2+P&XLFWk5t zv24J2PWPg7WH;%N{dqIhr&2=Xm6STBYnHNnSC%G6*FN8B8Q^Ft8Beve8(3m}5mHkk zEJs%8jpn5-J~gPvGYF_=8okuPtxZRv+d9c}=RUe^vR&_@C@p@m-Zk`bs2yWj`9zJ5 z`%`Y0&q=ti4KhQYWm1vAkO&Em< zutPXa{rc(b)H4Oc_%w}Z#N2&yN5#-Iu-(ueC49@ssnrob+nFmS+dtys`Mj#vUKd=| z=ftQyzSfI1P%1p{$A6)k#voFz?`dYF{Byc9FMFUfdXhcx#eGg);KnD{#fs`X3rJ@r z7eZH?*LpGuZfDCBjL2BO2p$3SJDE@pdFDfsAVP!SGztVrFKW?qm}xLQBp;q6k$9ge z(UO6=8+r%^dYk(YlTd5wUz7o4

ft?8C|_p#Bsw!5~(TJd2{ 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