highlight interfaces from interface terminal.
This commit is contained in:
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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<Long, ClientDCInternalInv> byId = new HashMap<>();
|
||||
private final HashMultimap<String, ClientDCInternalInv> byName = HashMultimap.create();
|
||||
private final HashMap<ClientDCInternalInv,BlockPos> blockPosHashMap = new HashMap<>();
|
||||
private final HashMap<GuiButton,ClientDCInternalInv> guiButtonHashMap = new HashMap<>();
|
||||
private final ArrayList<String> names = new ArrayList<>();
|
||||
private final ArrayList<Object> 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<Slot> 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
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user