From 22cf913708f1a92213be8fd47ec718db3790cdcf 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 ++ .../java/appeng/client/gui/AEBaseGui.java | 5 +- .../implementations/GuiInterfaceTerminal.java | 68 ++++++++++++- .../client/render/BlockPosHighlighter.java | 25 +++++ .../ContainerInterfaceTerminal.java | 2 +- .../appeng/helpers/HighlighterHandler.java | 96 ++++++++++++++++++ .../reporting/PartInterfaceTerminal.java | 7 ++ src/main/java/appeng/util/BlockPosUtils.java | 41 ++++++++ .../textures/guis/interfaceterminal.png | Bin 11018 -> 0 bytes .../textures/guis/newinterfaceterminal.png | Bin 0 -> 11339 bytes 10 files changed, 245 insertions(+), 6 deletions(-) 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 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 aa2996581120bc1f902f8b0735ee416a0afff18f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11018 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�O;vK5jn!+v5G))3whToi?8e*_!c;m5?+n@;D?@#f>+lYZjFvd2dhlQv#CS|q-C(?X&1 z0`4NAi~l*DOKtrumcBJA{jKFs?q=3p)x)K$0#!D&s02-!*kh%&;*isnvR)D4OsoFN zAMP^sT`@*GwGy60IPhwz9OwVXzJIf6_vPTc^H&ocby+vx<-`bqpYlRQ| z=ZVRbtzXM|rgqZ37a0?k6AGkv?0A>)Nv>cgbIbgalM`f4`m2g`ANVa<8!RWWi}ly_ zJ9ln9x2R>fHw_pajK-~Fuj%O@%nEl4`~k(+^me@%!KNrB%__*n4QfPDN}8=wMoCG5mA-y? zdAVM>v0i>ry1t>MrKP@sk-m|UZc$2_ZgFK^Nn(X=Ua>OB2#6Ujsl~}fnFS@8`FRQ; zGZT~YOG|8(l(-ZW6rhG@7L+8rR+PXk0P(@b7nh{ydlr-=n^fc$xK@Ti>#xWy@b!i3&MSt7Vsd`2ennz|zM-Cher_&`j^Yy6GK76tbrgqG7NqJ2r55Lx z7A2>;mZj#EC?i{1kW*TWY-ee4Do6LnWDMhzLUQ4@d?a1jxo$ndS0=d^JB|kYc#R|+!HBK~1OG-7?O-(T~)HO*pP1Ch7Ff!6L zw6L&9G)_rLOi8jtGRiZrxFj(zITd77MQ(v!W@d_&iMhE^ieZwGZlZyKxvq(+nSpLn zl3|LjX_8TzWs+%Xno)`Yk`ewzndzB%i8;uw0vVN(nPO#`lAMxgZeXcvk!F;pYm#J{ zqMK-9XsT;woMf3|oRpkmXkZ353KS1kjsc#wN=AAR!@(i}If*4{`9-<5O5vG#Df#8a z2*n|pxv9Y=iJ)LJG&3|YG&ZrcFfubVFfc^YAC_8FoSB~oGS$#P&&UX@Jtf)7Ex#x? zvBXv>GdD3kRlguF9V`Kg7%Tsx%+$P+L{RRqRWbyNSL7C0ITxiSmgE0w370~qEyH9)VvZ~ zCHKtS0&qMlXh74SCaU`Kj8stKGB7d(7lOtiM#feqmR2T4N|4xAu+ayVu)$E@+JMR+ zUtcTa@UQ`uQC6Oygcw{}P>_?ES_BChaJmUjErgh4qmM%!l74Wq%O|KESs6sPbACZ( zQD%BZiGO(>UhAJEI>6A zEip9p(b5V9g;7gL3g6M-8VxRzLVzU2qp52&xJU{Ck`#}oE~*6=7oy9ZnwMg$RIX%i zmw!KCDgy&ELx4|+E2vk_z+i4}9vT|j-Q9ic*s%u>9{m6RA0j?Vj)uVS4gn8w>m#65 zjwL~U!3+-1Zlr-YN#5=*3>~bp9t;c&oCO|{#S9F5yFi#xbidgp1_lQ95>H=O_NPn| zOom$3L1Ntu42;`7T^vIyZoR#Gkgr)mz`;>q&Hw+$a~}!j?chDJN10t%ee25GVL@J% zFE17RjM}y5=g;``I)(=^JAytL9NMRhtIvgR<^UuIS}gT$7;CF%=5lWEH3@C+3dB93>$16Zt^VH?)ck} zf${l%DTh3-*^En;gO-mnFfiPjyZm*I_CX}|o fQSqDvLYXV{%fBQ(zA{H*I!L>xtDnm{r-UW|-3-~L 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 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 literal 0 HcmV?d00001