From 3a9a51818855cbe1b380dbe4dbff7fb2066a4f1e Mon Sep 17 00:00:00 2001 From: "Aidan C. Brady" Date: Sat, 26 Oct 2013 13:25:51 -0400 Subject: [PATCH] Major GUI work! --- common/mekanism/client/ClientProxy.java | 6 + .../client/gui/GuiItemStackFilter.java | 182 +++++++++++++++- .../client/gui/GuiLogisticalSorter.java | 11 +- .../mekanism/client/gui/GuiOreDictFilter.java | 205 +++++++++++++++++- .../client/render/MekanismRenderer.java | 19 ++ .../tileentity/RenderConfigurableMachine.java | 31 +-- common/mekanism/common/HashList.java | 56 +++++ common/mekanism/common/Mekanism.java | 2 + .../common/network/PacketFilterUpdate.java | 66 ++++++ .../network/PacketLogisticalSorterGui.java | 16 +- .../tileentity/TileEntityBasicBlock.java | 4 +- .../TileEntityLogisticalSorter.java | 16 +- .../common/transporter/OreDictFilter.java | 35 ++- .../mekanism/common/util/MekanismUtils.java | 36 ++- .../common/util/TransporterUtils.java | 10 + .../mekanism/gui/GuiItemStackFilter.png | Bin 4941 -> 3942 bytes .../assets/mekanism/gui/GuiOreDictFilter.png | Bin 4941 -> 4295 bytes .../assets/mekanism/gui/GuiRobitRepair.png | Bin 9571 -> 9443 bytes 18 files changed, 636 insertions(+), 59 deletions(-) create mode 100644 common/mekanism/common/HashList.java create mode 100644 common/mekanism/common/network/PacketFilterUpdate.java diff --git a/common/mekanism/client/ClientProxy.java b/common/mekanism/client/ClientProxy.java index 7ae76e5fb..c98191d08 100644 --- a/common/mekanism/client/ClientProxy.java +++ b/common/mekanism/client/ClientProxy.java @@ -17,8 +17,10 @@ import mekanism.client.gui.GuiEnergyCube; import mekanism.client.gui.GuiEnrichmentChamber; import mekanism.client.gui.GuiFactory; import mekanism.client.gui.GuiGasTank; +import mekanism.client.gui.GuiItemStackFilter; import mekanism.client.gui.GuiLogisticalSorter; import mekanism.client.gui.GuiMetallurgicInfuser; +import mekanism.client.gui.GuiOreDictFilter; import mekanism.client.gui.GuiOsmiumCompressor; import mekanism.client.gui.GuiPasswordEnter; import mekanism.client.gui.GuiPasswordModify; @@ -352,6 +354,10 @@ public class ClientProxy extends CommonProxy return new GuiRobitRepair(player.inventory, world, x); case 26: return new GuiLogisticalSorter(player, (TileEntityLogisticalSorter)tileEntity); + case 27: + return new GuiItemStackFilter(player, (TileEntityLogisticalSorter)tileEntity); + case 28: + return new GuiOreDictFilter(player, (TileEntityLogisticalSorter)tileEntity); } return null; diff --git a/common/mekanism/client/gui/GuiItemStackFilter.java b/common/mekanism/client/gui/GuiItemStackFilter.java index e5607d6fd..31b1310fd 100644 --- a/common/mekanism/client/gui/GuiItemStackFilter.java +++ b/common/mekanism/client/gui/GuiItemStackFilter.java @@ -1,5 +1,185 @@ package mekanism.client.gui; -public class GuiItemStackFilter { +import mekanism.api.EnumColor; +import mekanism.api.Object3D; +import mekanism.client.render.MekanismRenderer; +import mekanism.common.Mekanism; +import mekanism.common.PacketHandler; +import mekanism.common.PacketHandler.Transmission; +import mekanism.common.inventory.container.ContainerFilter; +import mekanism.common.network.PacketLogisticalSorterGui; +import mekanism.common.network.PacketRobit; +import mekanism.common.network.PacketRobit.RobitPacketType; +import mekanism.common.tileentity.TileEntityLogisticalSorter; +import mekanism.common.transporter.ItemStackFilter; +import mekanism.common.util.MekanismUtils; +import mekanism.common.util.MekanismUtils.ResourceType; +import mekanism.common.util.TransporterUtils; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +public class GuiItemStackFilter extends GuiMekanism +{ + public TileEntityLogisticalSorter tileEntity; + + public ItemStackFilter filter = new ItemStackFilter(); + + public String status = EnumColor.DARK_GREEN + "All OK"; + + public GuiItemStackFilter(EntityPlayer player, TileEntityLogisticalSorter tentity) + { + super(new ContainerFilter(player.inventory)); + tileEntity = tentity; + + filter.color = TransporterUtils.colors.get(0); + } + + @Override + public boolean doesGuiPauseGame() + { + return false; + } + + @Override + public void initGui() + { + super.initGui(); + + int guiWidth = (width - xSize) / 2; + int guiHeight = (height - ySize) / 2; + + buttonList.clear(); + buttonList.add(new GuiButton(0, guiWidth + 58, guiHeight + 63, 60, 18, "Save")); + } + + @Override + protected void actionPerformed(GuiButton guibutton) + { + super.actionPerformed(guibutton); + + if(guibutton.id == 0) + { + //PacketFilterUpdate TODO + } + } + + @Override + protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) + { + int xAxis = (mouseX - (width - xSize) / 2); + int yAxis = (mouseY - (height - ySize) / 2); + + fontRenderer.drawString("Edit ItemStack Filter", 43, 6, 0x404040); + fontRenderer.drawString("Status: " + status, 35, 20, 0x00CD00); + fontRenderer.drawString("ItemStack Details:", 35, 32, 0x00CD00); + + if(filter.itemType != null) + { + fontRenderer.drawString("ID: " + filter.itemType.itemID + ", meta: " + filter.itemType.getItemDamage(), 35, 41, 0x00CD00); + } + + if(filter.itemType != null) + { + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_LIGHTING); + itemRenderer.renderItemIntoGUI(fontRenderer, mc.getTextureManager(), filter.itemType, 12, 19); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glPopMatrix(); + } + + GL11.glPushMatrix(); + GL11.glColor4f(1, 1, 1, 1); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + + mc.getTextureManager().bindTexture(MekanismRenderer.getColorResource(filter.color)); + itemRenderer.renderIcon(12, 45, MekanismRenderer.getColorIcon(filter.color), 16, 16); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glPopMatrix(); + + if(xAxis >= 12 && xAxis <= 28 && yAxis >= 45 && yAxis <= 61) + { + drawCreativeTabHoveringText(filter.color.getName(), xAxis, yAxis); + } + + super.drawGuiContainerForegroundLayer(mouseX, mouseY); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float partialTick, int mouseX, int mouseY) + { + super.drawGuiContainerBackgroundLayer(partialTick, mouseX, mouseY); + + mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.GUI, "GuiItemStackFilter.png")); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + int guiWidth = (width - xSize) / 2; + int guiHeight = (height - ySize) / 2; + drawTexturedModalRect(guiWidth, guiHeight, 0, 0, xSize, ySize); + + int xAxis = (mouseX - (width - xSize) / 2); + int yAxis = (mouseY - (height - ySize) / 2); + + if(xAxis >= 5 && xAxis <= 16 && yAxis >= 5 && yAxis <= 16) + { + drawTexturedModalRect(guiWidth + 5, guiHeight + 5, 176, 0, 11, 11); + } + else { + drawTexturedModalRect(guiWidth + 5, guiHeight + 5, 176, 11, 11, 11); + } + + if(xAxis >= 12 && xAxis <= 28 && yAxis >= 19 && yAxis <= 35) + { + GL11.glPushMatrix(); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_DEPTH_TEST); + + int x = guiWidth + 12; + int y = guiHeight + 19; + drawGradientRect(x, y, x + 16, y + 16, -2130706433, -2130706433); + + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_DEPTH_TEST); + GL11.glPopMatrix(); + } + } + + @Override + protected void mouseClicked(int mouseX, int mouseY, int button) + { + super.mouseClicked(mouseX, mouseY, button); + + if(button == 0) + { + int xAxis = (mouseX - (width - xSize) / 2); + int yAxis = (mouseY - (height - ySize) / 2); + + if(xAxis >= 5 && xAxis <= 16 && yAxis >= 5 && yAxis <= 16) + { + mc.sndManager.playSoundFX("random.click", 1.0F, 1.0F); + PacketHandler.sendPacket(Transmission.SERVER, new PacketLogisticalSorterGui().setParams(Object3D.get(tileEntity), 0)); + mc.thePlayer.openGui(Mekanism.instance, 26, mc.theWorld, tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord); + } + + if(xAxis >= 12 && xAxis <= 28 && yAxis >= 19 && yAxis <= 35) + { + ItemStack stack = mc.thePlayer.inventory.getItemStack(); + + if(stack != null) + { + filter.itemType = stack.copy(); + filter.itemType.stackSize = 1; + } + } + + if(xAxis >= 12 && xAxis <= 28 && yAxis >= 45 && yAxis <= 61) + { + filter.color = TransporterUtils.increment(filter.color); + } + } + } } diff --git a/common/mekanism/client/gui/GuiLogisticalSorter.java b/common/mekanism/client/gui/GuiLogisticalSorter.java index 467285568..02c0aa490 100644 --- a/common/mekanism/client/gui/GuiLogisticalSorter.java +++ b/common/mekanism/client/gui/GuiLogisticalSorter.java @@ -1,6 +1,11 @@ package mekanism.client.gui; +import mekanism.api.Object3D; +import mekanism.common.Mekanism; +import mekanism.common.PacketHandler; +import mekanism.common.PacketHandler.Transmission; import mekanism.common.inventory.container.ContainerNull; +import mekanism.common.network.PacketLogisticalSorterGui; import mekanism.common.tileentity.TileEntityLogisticalSorter; import mekanism.common.util.MekanismUtils; import mekanism.common.util.MekanismUtils.ResourceType; @@ -50,11 +55,13 @@ public class GuiLogisticalSorter extends GuiMekanism if(guibutton.id == 0) { - + PacketHandler.sendPacket(Transmission.SERVER, new PacketLogisticalSorterGui().setParams(Object3D.get(tileEntity), 1)); + mc.thePlayer.openGui(Mekanism.instance, 27, mc.theWorld, tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord); } else if(guibutton.id == 1) { - + PacketHandler.sendPacket(Transmission.SERVER, new PacketLogisticalSorterGui().setParams(Object3D.get(tileEntity), 2)); + mc.thePlayer.openGui(Mekanism.instance, 28, mc.theWorld, tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord); } } diff --git a/common/mekanism/client/gui/GuiOreDictFilter.java b/common/mekanism/client/gui/GuiOreDictFilter.java index f1e887039..9e44242e8 100644 --- a/common/mekanism/client/gui/GuiOreDictFilter.java +++ b/common/mekanism/client/gui/GuiOreDictFilter.java @@ -1,9 +1,206 @@ package mekanism.client.gui; -import mekanism.common.tileentity.TileEntityLogisticalTransporter; -import net.minecraft.client.gui.GuiScreen; +import java.util.List; -public class GuiOreDictFilter extends GuiScreen +import mekanism.api.EnumColor; +import mekanism.api.Object3D; +import mekanism.client.render.MekanismRenderer; +import mekanism.common.Mekanism; +import mekanism.common.PacketHandler; +import mekanism.common.PacketHandler.Transmission; +import mekanism.common.inventory.container.ContainerFilter; +import mekanism.common.network.PacketLogisticalSorterGui; +import mekanism.common.tileentity.TileEntityLogisticalSorter; +import mekanism.common.transporter.OreDictFilter; +import mekanism.common.util.MekanismUtils; +import mekanism.common.util.MekanismUtils.ResourceType; +import mekanism.common.util.TransporterUtils; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiTextField; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +public class GuiOreDictFilter extends GuiMekanism { - public TileEntityLogisticalTransporter tileEntity; + public TileEntityLogisticalSorter tileEntity; + + public OreDictFilter filter = new OreDictFilter(); + + private GuiTextField oreDictText; + + public int stackSwitch = 0; + + public int stackIndex = 0; + + public List iterStacks; + + public String status = EnumColor.DARK_GREEN + "All OK"; + + public GuiOreDictFilter(EntityPlayer player, TileEntityLogisticalSorter tentity) + { + super(new ContainerFilter(player.inventory)); + tileEntity = tentity; + + filter.color = TransporterUtils.colors.get(0); + } + + @Override + public boolean doesGuiPauseGame() + { + return false; + } + + @Override + public void initGui() + { + super.initGui(); + + int guiWidth = (width - xSize) / 2; + int guiHeight = (height - ySize) / 2; + + buttonList.clear(); + buttonList.add(new GuiButton(0, guiWidth + 58, guiHeight + 63, 60, 18, "Save")); + + oreDictText = new GuiTextField(fontRenderer, guiWidth + 35, guiHeight + 48, 95, 12); + oreDictText.setMaxStringLength(12); + oreDictText.setFocused(true); + } + + @Override + public void keyTyped(char c, int i) + { + if(i == mc.gameSettings.keyBindInventory.keyCode) + { + return; + } + + super.keyTyped(c, i); + + if(Character.isLetter(c) || Character.isDigit(c) || c == '*') + { + oreDictText.textboxKeyTyped(c, i); + } + } + + @Override + protected void actionPerformed(GuiButton guibutton) + { + super.actionPerformed(guibutton); + + if(guibutton.id == 0) + { + //PacketFilterUpdate TODO + } + } + + @Override + protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) + { + int xAxis = (mouseX - (width - xSize) / 2); + int yAxis = (mouseY - (height - ySize) / 2); + + fontRenderer.drawString("Edit OreDict Filter", 43, 6, 0x404040); + fontRenderer.drawString("Status: " + status, 35, 20, 0x00CD00); + fontRenderer.drawString("Key: " + filter.oreDictName, 35, 32, 0x00CD00); + + /*if(filter.itemType != null) + { + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_LIGHTING); + itemRenderer.renderItemIntoGUI(fontRenderer, mc.getTextureManager(), filter.itemType, 12, 19); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glPopMatrix(); + }*/ + + GL11.glPushMatrix(); + GL11.glColor4f(1, 1, 1, 1); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + + mc.getTextureManager().bindTexture(MekanismRenderer.getColorResource(filter.color)); + itemRenderer.renderIcon(12, 45, MekanismRenderer.getColorIcon(filter.color), 16, 16); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glPopMatrix(); + + if(xAxis >= 12 && xAxis <= 28 && yAxis >= 45 && yAxis <= 61) + { + drawCreativeTabHoveringText(filter.color.getName(), xAxis, yAxis); + } + + super.drawGuiContainerForegroundLayer(mouseX, mouseY); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float partialTick, int mouseX, int mouseY) + { + super.drawGuiContainerBackgroundLayer(partialTick, mouseX, mouseY); + + mc.renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.GUI, "GuiOreDictFilter.png")); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + int guiWidth = (width - xSize) / 2; + int guiHeight = (height - ySize) / 2; + drawTexturedModalRect(guiWidth, guiHeight, 0, 0, xSize, ySize); + + int xAxis = (mouseX - (width - xSize) / 2); + int yAxis = (mouseY - (height - ySize) / 2); + + if(xAxis >= 5 && xAxis <= 16 && yAxis >= 5 && yAxis <= 16) + { + drawTexturedModalRect(guiWidth + 5, guiHeight + 5, 176, 0, 11, 11); + } + else { + drawTexturedModalRect(guiWidth + 5, guiHeight + 5, 176, 11, 11, 11); + } + + if(xAxis >= 131 && xAxis <= 143 && yAxis >= 48 && yAxis <= 60) + { + drawTexturedModalRect(guiWidth + 131, guiHeight + 48, 176 + 11, 0, 12, 12); + } + else { + drawTexturedModalRect(guiWidth + 131, guiHeight + 48, 176 + 11, 12, 12, 12); + } + + oreDictText.drawTextBox(); + } + + @Override + public void updateScreen() + { + super.updateScreen(); + + + } + + @Override + protected void mouseClicked(int mouseX, int mouseY, int button) + { + super.mouseClicked(mouseX, mouseY, button); + + if(button == 0) + { + int xAxis = (mouseX - (width - xSize) / 2); + int yAxis = (mouseY - (height - ySize) / 2); + + if(xAxis >= 5 && xAxis <= 16 && yAxis >= 5 && yAxis <= 16) + { + mc.sndManager.playSoundFX("random.click", 1.0F, 1.0F); + PacketHandler.sendPacket(Transmission.SERVER, new PacketLogisticalSorterGui().setParams(Object3D.get(tileEntity), 0)); + mc.thePlayer.openGui(Mekanism.instance, 26, mc.theWorld, tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord); + } + + if(xAxis >= 12 && xAxis <= 28 && yAxis >= 45 && yAxis <= 61) + { + filter.color = TransporterUtils.increment(filter.color); + } + } + } + + private void setOreDictKey() + { + + } } diff --git a/common/mekanism/client/render/MekanismRenderer.java b/common/mekanism/client/render/MekanismRenderer.java index c37e932a9..0aa291ae8 100644 --- a/common/mekanism/client/render/MekanismRenderer.java +++ b/common/mekanism/client/render/MekanismRenderer.java @@ -3,9 +3,11 @@ package mekanism.client.render; import java.util.Arrays; import java.util.List; +import mekanism.api.EnumColor; import mekanism.common.ISpecialBounds; import mekanism.common.ObfuscatedNames; import mekanism.common.util.MekanismUtils; +import mekanism.common.util.MekanismUtils.ResourceType; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GLAllocation; @@ -34,6 +36,8 @@ public class MekanismRenderer { private static RenderBlocks renderBlocks = new RenderBlocks(); + public static Icon[] colors = new Icon[256]; + private static float lightmapLastX; private static float lightmapLastY; private static boolean optifineBreak = false; @@ -148,6 +152,21 @@ public class MekanismRenderer } } + public static ResourceLocation getColorResource(EnumColor color) + { + return MekanismUtils.getResource(ResourceType.TEXTURE_BLOCKS, "Overlay" + color.friendlyName.replace(" ", "") + ".png"); + } + + public static Icon getColorIcon(EnumColor color) + { + if(colors[color.ordinal()] == null) + { + colors[color.ordinal()] = getTextureMap(0).registerIcon("mekanism:Overlay" + color.getName()); + } + + return colors[color.ordinal()]; + } + public static void glowOn() { GL11.glPushAttrib(GL11.GL_LIGHTING_BIT); diff --git a/common/mekanism/client/render/tileentity/RenderConfigurableMachine.java b/common/mekanism/client/render/tileentity/RenderConfigurableMachine.java index 86cad1609..d6a1d3bc9 100644 --- a/common/mekanism/client/render/tileentity/RenderConfigurableMachine.java +++ b/common/mekanism/client/render/tileentity/RenderConfigurableMachine.java @@ -34,39 +34,10 @@ import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public class RenderConfigurableMachine extends TileEntitySpecialRenderer { - private static Icon[] coloredOverlays; - private Minecraft mc = FMLClientHandler.instance().getClient(); private HashMap> cachedOverlays = new HashMap>(); - public RenderConfigurableMachine() - { - if(coloredOverlays == null) - { - coloredOverlays = new Icon[16]; - - TextureMap registrar = MekanismRenderer.getTextureMap(0); - - coloredOverlays[0] = registrar.registerIcon("mekanism:OverlayBlack"); - coloredOverlays[1] = registrar.registerIcon("mekanism:OverlayDarkBlue"); - coloredOverlays[2] = registrar.registerIcon("mekanism:OverlayDarkGreen"); - coloredOverlays[3] = registrar.registerIcon("mekanism:OverlayDarkAqua"); - coloredOverlays[4] = registrar.registerIcon("mekanism:OverlayDarkRed"); - coloredOverlays[5] = registrar.registerIcon("mekanism:OverlayPurple"); - coloredOverlays[6] = registrar.registerIcon("mekanism:OverlayOrange"); - coloredOverlays[7] = registrar.registerIcon("mekanism:OverlayGrey"); - coloredOverlays[8] = registrar.registerIcon("mekanism:OverlayDarkGrey"); - coloredOverlays[9] = registrar.registerIcon("mekanism:OverlayIndigo"); - coloredOverlays[10] = registrar.registerIcon("mekanism:OverlayBrightGreen"); - coloredOverlays[11] = registrar.registerIcon("mekanism:OverlayAqua"); - coloredOverlays[12] = registrar.registerIcon("mekanism:OverlayRed"); - coloredOverlays[13] = registrar.registerIcon("mekanism:OverlayPink"); - coloredOverlays[14] = registrar.registerIcon("mekanism:OverlayYellow"); - coloredOverlays[15] = registrar.registerIcon("mekanism:OverlayWhite"); - } - } - @Override public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float partialTick) { @@ -133,7 +104,7 @@ public class RenderConfigurableMachine extends TileEntitySpecialRenderer Model3D toReturn = new Model3D(); toReturn.baseBlock = Block.stone; - toReturn.setTexture(coloredOverlays[color.ordinal()]); + toReturn.setTexture(MekanismRenderer.getColorIcon(color)); DisplayInteger display = new DisplayInteger(); diff --git a/common/mekanism/common/HashList.java b/common/mekanism/common/HashList.java new file mode 100644 index 000000000..dbb4e3e65 --- /dev/null +++ b/common/mekanism/common/HashList.java @@ -0,0 +1,56 @@ +package mekanism.common; + +import java.util.ArrayList; +import java.util.Iterator; + +public class HashList implements Iterable +{ + private ArrayList list = new ArrayList(); + + public boolean contains(T obj) + { + return list.contains(obj); + } + + public void clear() + { + list.clear(); + } + + public T get(int index) + { + return list.get(index); + } + + public void add(T obj) + { + if(!list.contains(obj)) + { + list.add(obj); + } + } + + public void add(int index, T obj) + { + if(!list.contains(obj)) + { + list.add(index, obj); + } + } + + public int indexOf(T obj) + { + return list.indexOf(obj); + } + + public int size() + { + return list.size(); + } + + @Override + public Iterator iterator() + { + return list.iterator(); + } +} diff --git a/common/mekanism/common/Mekanism.java b/common/mekanism/common/Mekanism.java index 272a0c3e7..8773e0a47 100644 --- a/common/mekanism/common/Mekanism.java +++ b/common/mekanism/common/Mekanism.java @@ -59,6 +59,7 @@ import mekanism.common.network.PacketDataRequest; import mekanism.common.network.PacketDigitUpdate; import mekanism.common.network.PacketElectricBowState; import mekanism.common.network.PacketElectricChest; +import mekanism.common.network.PacketFilterUpdate; import mekanism.common.network.PacketLogisticalSorterGui; import mekanism.common.network.PacketPortableTeleport; import mekanism.common.network.PacketPortalFX; @@ -1138,6 +1139,7 @@ public class Mekanism PacketHandler.registerPacket(PacketRedstoneControl.class); PacketHandler.registerPacket(PacketWalkieTalkieState.class); PacketHandler.registerPacket(PacketLogisticalSorterGui.class); + PacketHandler.registerPacket(PacketFilterUpdate.class); //Donators donators.add("mrgreaper"); diff --git a/common/mekanism/common/network/PacketFilterUpdate.java b/common/mekanism/common/network/PacketFilterUpdate.java new file mode 100644 index 000000000..8f42dfee4 --- /dev/null +++ b/common/mekanism/common/network/PacketFilterUpdate.java @@ -0,0 +1,66 @@ +package mekanism.common.network; + +import java.io.DataOutputStream; + +import mekanism.api.Object3D; +import mekanism.common.Mekanism; +import mekanism.common.tileentity.TileEntityLogisticalSorter; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; + +import com.google.common.io.ByteArrayDataInput; + +import cpw.mods.fml.common.FMLCommonHandler; + +public class PacketFilterUpdate implements IMekanismPacket +{ + public Object3D object3D; + + public int type; + + @Override + public String getName() + { + return "FilterUpdate"; + } + + @Override + public IMekanismPacket setParams(Object... data) + { + object3D = (Object3D)data[0]; + type = (Integer)data[1]; + + return this; + } + + @Override + public void read(ByteArrayDataInput dataStream, EntityPlayer player, World world) throws Exception + { + int x = dataStream.readInt(); + int y = dataStream.readInt(); + int z = dataStream.readInt(); + + int id = dataStream.readInt(); + + int type = dataStream.readInt(); + + World worldServer = FMLCommonHandler.instance().getMinecraftServerInstance().worldServerForDimension(id); + + if(worldServer != null && worldServer.getBlockTileEntity(x, y, z) instanceof TileEntityLogisticalSorter) + { + player.openGui(Mekanism.instance, 26+type, worldServer, x, y, z); + } + } + + @Override + public void write(DataOutputStream dataStream) throws Exception + { + dataStream.writeInt(object3D.xCoord); + dataStream.writeInt(object3D.yCoord); + dataStream.writeInt(object3D.zCoord); + + dataStream.writeInt(object3D.dimensionId); + + dataStream.writeInt(type); + } +} diff --git a/common/mekanism/common/network/PacketLogisticalSorterGui.java b/common/mekanism/common/network/PacketLogisticalSorterGui.java index 304117adc..2e5ae7eb8 100644 --- a/common/mekanism/common/network/PacketLogisticalSorterGui.java +++ b/common/mekanism/common/network/PacketLogisticalSorterGui.java @@ -3,10 +3,9 @@ package mekanism.common.network; import java.io.DataOutputStream; import mekanism.api.Object3D; -import mekanism.common.ITileNetwork; import mekanism.common.Mekanism; +import mekanism.common.tileentity.TileEntityLogisticalSorter; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import com.google.common.io.ByteArrayDataInput; @@ -47,18 +46,9 @@ public class PacketLogisticalSorterGui implements IMekanismPacket World worldServer = FMLCommonHandler.instance().getMinecraftServerInstance().worldServerForDimension(id); - if(worldServer != null && worldServer.getBlockTileEntity(x, y, z) instanceof ITileNetwork) + if(worldServer != null && worldServer.getBlockTileEntity(x, y, z) instanceof TileEntityLogisticalSorter) { - TileEntity tileEntity = worldServer.getBlockTileEntity(x, y, z); - - if(type == 0) - { - player.openGui(Mekanism.instance, 27, worldServer, x, y, z); - } - else if(type == 1) - { - player.openGui(Mekanism.instance, 28, worldServer, x, y, z); - } + player.openGui(Mekanism.instance, 26+type, worldServer, x, y, z); } } diff --git a/common/mekanism/common/tileentity/TileEntityBasicBlock.java b/common/mekanism/common/tileentity/TileEntityBasicBlock.java index 0d40b6252..3be9cbb63 100644 --- a/common/mekanism/common/tileentity/TileEntityBasicBlock.java +++ b/common/mekanism/common/tileentity/TileEntityBasicBlock.java @@ -31,6 +31,8 @@ public abstract class TileEntityBasicBlock extends TileEntity implements IWrench /** A timer used to send packets to clients. */ public int packetTick; + public boolean doAutoSync = true; + public Set components = new HashSet(); @Override @@ -45,7 +47,7 @@ public abstract class TileEntityBasicBlock extends TileEntity implements IWrench if(!worldObj.isRemote) { - if(playersUsing.size() > 0) + if(doAutoSync && playersUsing.size() > 0) { PacketHandler.sendPacket(Transmission.CLIENTS_RANGE, new PacketTileEntity().setParams(Object3D.get(this), getNetworkedData(new ArrayList())), Object3D.get(this), 50D); } diff --git a/common/mekanism/common/tileentity/TileEntityLogisticalSorter.java b/common/mekanism/common/tileentity/TileEntityLogisticalSorter.java index 77bbb37ab..922e8d3c9 100644 --- a/common/mekanism/common/tileentity/TileEntityLogisticalSorter.java +++ b/common/mekanism/common/tileentity/TileEntityLogisticalSorter.java @@ -1,11 +1,10 @@ package mekanism.common.tileentity; import java.util.ArrayList; -import java.util.HashSet; -import java.util.Set; import mekanism.api.EnumColor; import mekanism.api.Object3D; +import mekanism.common.HashList; import mekanism.common.IActiveState; import mekanism.common.IRedstoneControl; import mekanism.common.PacketHandler; @@ -27,7 +26,7 @@ import com.google.common.io.ByteArrayDataInput; public class TileEntityLogisticalSorter extends TileEntityElectricBlock implements IRedstoneControl, IActiveState { - public Set filters = new HashSet(); + public HashList filters = new HashList(); public RedstoneControl controlType = RedstoneControl.DISABLED; @@ -43,6 +42,7 @@ public class TileEntityLogisticalSorter extends TileEntityElectricBlock implemen { super("LogisticalSorter", MachineType.LOGISTICAL_SORTER.baseEnergy); inventory = new ItemStack[1]; + doAutoSync = false; } @Override @@ -201,7 +201,15 @@ public class TileEntityLogisticalSorter extends TileEntityElectricBlock implemen return new int[] {0}; } - + @Override + public void openChest() + { + if(!worldObj.isRemote) + { + PacketHandler.sendPacket(Transmission.CLIENTS_RANGE, new PacketTileEntity().setParams(Object3D.get(this), getNetworkedData(new ArrayList())), Object3D.get(this), 50D); + } + } + @Override public RedstoneControl getControlType() { diff --git a/common/mekanism/common/transporter/OreDictFilter.java b/common/mekanism/common/transporter/OreDictFilter.java index 4b4058a22..8c56be936 100644 --- a/common/mekanism/common/transporter/OreDictFilter.java +++ b/common/mekanism/common/transporter/OreDictFilter.java @@ -16,7 +16,40 @@ public class OreDictFilter extends TransporterFilter @Override public boolean canFilter(ItemStack itemStack) { - return MekanismUtils.oreDictCheck(itemStack, oreDictName); + String oreKey = MekanismUtils.getOreDictName(itemStack); + + if(oreKey == null) + { + return false; + } + + if(oreDictName.equals(oreKey)) + { + return true; + } + else if(oreDictName.endsWith("*") && !oreDictName.startsWith("*")) + { + if(oreKey.startsWith(oreDictName.substring(0, oreDictName.length()-1))) + { + return true; + } + } + else if(oreDictName.startsWith("*") && !oreDictName.endsWith("*")) + { + if(oreKey.endsWith(oreDictName.substring(1))) + { + return true; + } + } + else if(oreDictName.startsWith("*") && oreDictName.endsWith("*")) + { + if(oreKey.contains(oreDictName.substring(1, oreDictName.length()-1))) + { + return true; + } + } + + return false; } @Override diff --git a/common/mekanism/common/util/MekanismUtils.java b/common/mekanism/common/util/MekanismUtils.java index 6299ab878..24c579be5 100644 --- a/common/mekanism/common/util/MekanismUtils.java +++ b/common/mekanism/common/util/MekanismUtils.java @@ -1,7 +1,5 @@ package mekanism.common.util; -import ic2.api.Direction; - import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; @@ -10,7 +8,9 @@ import java.lang.reflect.Method; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; +import java.util.HashMap; import java.util.Iterator; +import java.util.Map; import mekanism.api.EnumColor; import mekanism.api.IConfigurable; @@ -36,7 +36,6 @@ import mekanism.common.network.PacketElectricChest.ElectricChestPacketType; import mekanism.common.tileentity.TileEntityBoundingBlock; import mekanism.common.tileentity.TileEntityDynamicTank; import mekanism.common.tileentity.TileEntityElectricChest; -import mekanism.common.tileentity.TileEntityLogisticalTransporter; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -453,6 +452,37 @@ public final class MekanismUtils return hasResource; } + public static String getOreDictName(ItemStack check) + { + HashMap> oreStacks = (HashMap>)MekanismUtils.getPrivateValue(null, OreDictionary.class, new String[] {"oreStacks"}); + + int idFound = -1; + + for(Map.Entry> entry : oreStacks.entrySet()) + { + for(ItemStack stack : entry.getValue()) + { + if(stack.isItemEqual(check)) + { + idFound = entry.getKey(); + break; + } + } + + if(idFound != -1) + { + break; + } + } + + if(idFound == -1) + { + return null; + } + + return OreDictionary.getOreName(idFound); + } + /** * Returns an integer facing that converts a world-based orientation to a machine-based oriention. * @param side - world based diff --git a/common/mekanism/common/util/TransporterUtils.java b/common/mekanism/common/util/TransporterUtils.java index 1bf4c9844..7a59e9429 100644 --- a/common/mekanism/common/util/TransporterUtils.java +++ b/common/mekanism/common/util/TransporterUtils.java @@ -353,6 +353,16 @@ public final class TransporterUtils return null; } + public static EnumColor increment(EnumColor color) + { + if(colors.indexOf(color) == colors.size()-1) + { + return colors.get(0); + } + + return colors.get(colors.indexOf(color)+1); + } + public static void incrementColor(TileEntityLogisticalTransporter tileEntity) { if(tileEntity.color == null) diff --git a/resources/assets/mekanism/gui/GuiItemStackFilter.png b/resources/assets/mekanism/gui/GuiItemStackFilter.png index 82347eff98e068761320f8fee032c3f8f9f42248..e7a715d26ccaf179c8eafb90a081a27f7290a4a2 100644 GIT binary patch delta 2865 zcmc(gX;c$g7RRfK1i~T|O9YW6wy4l35u|02Kt%);2jnP%vWvDX(m*3P{;Y6*2QRfRe^P7!H0XXkX(^q zP}kdR5y04fDhoRGW`5mQ{QTHO76aM>qZfvo^ace5Mlm_P`(tc)dBlivL3US0ONxYf zH{JQp{XoS$%QnDv7F}Fq zjr{V^kmCgrbwVG#|S3L={-J%25U-l6qz@dR^)?|5&onN%u1-u^;c`{%~q$_cHW z9^b~kz5t=YrNkI?Qz{#;W2X2({8{WR}l1Q76&Oo{c1IC2RJKjoacefH`mKM1<{}i;Dva6J!-1On10>- zYhV2*nRjIXxh0q8E6KJugn=I`Sk6b$B}tt6Lvd6{NC=Y}#0odGkLSobq}gmfa8&15 zyB4Q+NX=@g?tCpjs^5J=8b#LD)^1l^@ERD3iz8OOdUSCcp)N-@xh~>;--9fc3Ozbx z+7S}9OiWD7nxnnTVF2a3*7RyhbMn z=qn&KL;Lmbi2`U}K)VkZ&0q+sOJp-m;>RgxmzI`}v_uy6AJLZ_+5nvmzniW}wcbHu zPX?gNA>PUa<=oMH8_WlUyH6E7j&N~tX)G|@!jknBEJMvJ{BO}{H2-~1%^qn)emuno zMFF)-pXSfb%*>3iNb)@~ST|TzZR$dbT|N0mm^FyU>&>>C;wiBkltVu{P0fz%QCUVL zAdc3;&Cazc5~s^`D~m{WZi+=_6kvBHcS`dNu0)-Ysj=N30g3|X;&t#U3h>pW<(kxc zY!ul3AmPz2%2ou}HW21Yi37n@Ch>e8@)H|4Q`>$S8HFIqoRY2sMgl1=3@K~c{ zOBSRK-Dc?+-yp)Q+^VgTKSC^ug7Ld{d`jGrYSGD0!CzqU#e5Zq>3aqD(!rAPVq7Xaf_-PxhVcdzp*+9T}8^@%Y}-qK1Tc+m1aU7 zhlj5t>Rb5`F$IZ6!WR+E}E&0#MDh#h-BPOv4zK+g0Q8!Qq}kS~4i&fNoo z|91=e7xw&*E#c(~Ri*tZS`r-LJFmJf#aWM_jTtkHn{Fi&eCg~YId$N2V!bG~qp;05 zUZwJYuOk=*>ehuhQxtHc9mzrzLmct*VfRgt4T;3oD-Bg8=;HpIj?PqXq9ed-52vG) zRu2TQ{HgsMqKd;v{5n$(JB=H)D*G@Y21je-*``Ob)PjL!BFojOC)q$#e)1cHo6iP9 zNhK>VJputy-D{};{i8@ouPGED=30Rb9BNDf(0@Re3%#L`H@;Rkt48Y})5JHnniGMTl}reXV_5 zYH4g+pWL04O*qp1bhkuAA0K-zPmd}dT1x>eOs|c=*Kk#%p(o6+XE=<*#BcPWIDDbM zp=Ax4nt=nm!7X;=USI>)3Wx3zEHq&tgWM5I>QIM)xLbBVBZqP0cnO)Rm@SU|Li$^c zroSP;Auo^iRUR$~(9t&S2W2SY@`A2rj)u?dPuVrMU+=tn)mI*lG*f7A{q2#1PTcS@ zPT>`AAYbg!#1ST2bu!~0j^m%v@Ip@E1lTYfwv+Nbo<9RzmWQ0fd%vwc9T~*qPC>f% zm=50ig(VxX1{~ZV(J~$~$NxC*@`aM{o8a>pA_U`l&gI@AXyA~Nv|A??8*pqowC@y+ z@F}E0<%%@V;A+g7-5T5d5Wpw^sb2@3$zuPr5KIn^S|12H-L;HjBe`yEHpvS{uJxT1nSkJ-v1#TEj~EbXnWjn!VR zs%nN<8}@DK%ur*uiUm25b6bOkAgjRprVjaG7u8y`lYY=51Wy3?v%|@KTgBF(gx>+1Mq?oW delta 3872 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 Wc4zI>^PB|G=cL)$69vcJBmW72;)y8$ diff --git a/resources/assets/mekanism/gui/GuiOreDictFilter.png b/resources/assets/mekanism/gui/GuiOreDictFilter.png index 82347eff98e068761320f8fee032c3f8f9f42248..ff64b4b62bf212cf870ecd333ccd4344e3d53072 100644 GIT binary patch delta 3221 zcmchXXH*l37RM)Jq6x4XTEqn;s1!wrYeS@s3aIo40xA%(utAZwpaFzT0xECm>jD-^ zqO71x@0|pdA{Yn@NDl#ALRr8_5ABVg-Y4Jt@Xp)$Fz23g&zbwbzyJRZSG`d+-yRK1 zk_D9vczqY9Ql~mT zdJfe@E-{VrytDHhm}{ehlS1~!^#$&)>*6V48?&tA;%&uH+GlZ0<+M;`vsBzmD*JtO zx!JGo$QsgdY5|PaC4L=V4q7<_22yTE8Agn zqq}=K{GsLL>Jqb)R_foBv6dDX*~iV}27NlMRKwD^8~zTu}X3*eIjDcyCC?<~JYEv`01 z(^_b}KHo99zBFW9#7$u0zp6Opzxh{D+ayy^MOzOJ)fOyw?luhWr1i=Z+C6SDRDr(7 z4-;K5&!X=7wUczvd^XIk3|+lj!e$$@o2b*Baf^2!z@`dHJEC2z$ae-d6hAw>EUqd9 zMeqjqtkPP63I1K3ii)oHfJbAk0zu@znU$5*RabXPS*hK(kS)nOa7i`(DWufHty4MU z^KmF}G)8R6dTK2zC%SXrWNu~nZN!53np@`%!dhGzfZ0hkw~v|~@nNsuy(egNrjG%} zw5@npU7FCyZqdCe8cX(Zv`I72lU8`CxF|vAa=AC+sQjSJzMh^F1*t!j-n$lFTaIVA zmsH0qlX}miA*D_$?7LtWyi2J`|B3NY`sSAw(v*5TDXBa*UqN9(_Q6Jn7Vw4`nO1n) z%gdpKHocscXU#8GbypFSqd9y&|BuV$4=~?mMvecrk-B)I9-hi68#A6>$|lE!hx*;z z?YVu!xy-w(TY}JUH9W;f9m2@@f3Oflk!oMY zH%}@UJ8$SbUNCVmS%QAB4MaGdEAT?5g$Vi07#%s=fG z41#XK$8@iQIds5de>VO}8Xb5-=5n7vT14QogcdqOg9v0e`5#f|Nz9A&=s#?PwK<4A z59fr*gR=6-*RKYU;awgtHZrUPc9?2R`30K3hA&(J*0cdS)bd4I8mOM6=R`Vq2{46_yeg@6Zwy4%Ka`*2wLKBH9JCv76| zC70PQdrk%qoDVrE+vE%ZpInX8HRAUXfk(>$>hWcCps9*xWY(0>bmUlRrjPgbFYL-@&l`S0@?Rp3>q%n?T{m(Y-x?6@Ozc|5W z2_>)nWuI_=TqvbdsiXeY54E>oT(&4+GZh(Mx#Jv;ZUeVq&>ZN*AU1(W1k7K((8DWe z5`nF6Cd^ofdA6tJVJ?FMp-_kL*1Dh?;*HGj9^27dC9rgcZ>6;6DF{fgHT5SRvV{Pt z`yDY5VleCefoEG748#p$iZ|LEj|bE)v@2nymEIROCwea8| zCjoM5jAX+}0(EVW&o>Ho6Fi#^c$@fFQ9(hwVNlz4!nhQ@=T>#TT~ba?&Pm`lrD6~B zPaSUh@ThlJOv5s>2BR?4Nx!|4f$uAR&qQ6#f z*&lR6Ph6QaJjf5MQ)aY2j0^vm8mrSl5ye79z1e&bJTv1R65E~c&Vq!ypxZ~tY>HOYPL@hH?mn7XIOD`U_AY$HscMl?^Vn(WiS*eRJ36)oSZrl zkkEQHfgeW*ial;xunr;7xOmDc0#ZStcxNq~!3Vei{tiy+t;#H}@LEXa(nzlyii-aJ zl`s|>^t~=F-)mcTr@1JV0u&5u-e?|))g25DsU2!mW>m)5rQP|CXlio>e2Vb>AnCD; zwnGL-rq!YkBOW}3ck({tenV`LGYrMu&>;ecNvvVnbBO%?!D5*v7YMjPhTdw#?;!$q z^Yd!)6$toh`a>I{DFpmBK4C%hN4yC_eaD0%k-t-W$75&=v2PCi-iRTGbY5hV7#}bv zXSWFuOv#p|CtY?brpqZqTX3?iMClH8zk=$?Q5~Zm0v|s>3xKbsoJ)=*A=l}{tWAWc8;Q!G3J6iC!rTrb_(eO9P{2#{) cNuS|Mu9iPGrM>zt0zjVgrq(98r`^K-1tFhMd;kCd delta 3872 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 WyR&!dc}@c8bJFbWiNfRVk^cnQL5U3j diff --git a/resources/assets/mekanism/gui/GuiRobitRepair.png b/resources/assets/mekanism/gui/GuiRobitRepair.png index e71a612ff18c51a07567d483832ad337b3e3c879..0f756159b0863b906eb4fb0b25f18f6e5f2259af 100644 GIT binary patch delta 8408 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 delta 8537 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 ba};!mZgzo=cNJON0P`|7Fvl0`IY;~lU