From 59b945a33fdf1b4b7193bdbf0a1186f57ed4cb6a Mon Sep 17 00:00:00 2001 From: "Aidan C. Brady" Date: Sun, 24 Nov 2013 12:12:42 -0600 Subject: [PATCH] Fixed Model3D textures, fixed error spam on world load, fixed Digital Miner breaking blocks on top, general code cleanup --- common/mekanism/api/gas/EnumGas.java | 13 +- common/mekanism/client/ClientProxy.java | 24 ++-- .../mekanism/client/gui/GuiConfiguration.java | 2 +- .../mekanism/client/gui/GuiDynamicTank.java | 2 +- .../mekanism/client/gui/GuiElectricPump.java | 2 +- .../client/gui/GuiLogisticalSorter.java | 2 +- .../client/gui/GuiTItemStackFilter.java | 2 +- .../client/gui/GuiTOreDictFilter.java | 2 +- .../client/render/MekanismRenderer.java | 52 +++++--- .../tileentity/RenderConfigurableMachine.java | 4 +- .../render/tileentity/RenderDynamicTank.java | 2 +- .../RenderLogisticalTransporter.java | 41 ++++--- .../tileentity/RenderMechanicalPipe.java | 2 +- .../tileentity/RenderPressurizedTube.java | 2 +- .../tileentity/RenderUniversalCable.java | 8 +- common/mekanism/common/CommonProxy.java | 2 + common/mekanism/common/HashList.java | 8 ++ common/mekanism/common/Mekanism.java | 2 + .../tileentity/TileEntityDigitalMiner.java | 2 +- .../TileEntityLogisticalSorter.java | 2 +- .../TileEntityLogisticalTransporter.java | 9 +- .../transporter/TransporterPathfinder.java | 9 +- .../mekanism/common/util/InventoryUtils.java | 116 ++++++++++++++++++ .../common/util/TransporterUtils.java | 114 ----------------- .../{items => blocks}/LiquidEnergy.png | Bin .../textures/blocks/LiquidEnergy.png.mcmeta | 5 + .../{items => blocks}/LiquidHydrogen.png | Bin .../textures/blocks/LiquidHydrogen.png.mcmeta | 5 + .../{items => blocks}/LiquidOxygen.png | Bin .../textures/blocks/LiquidOxygen.png.mcmeta | 5 + .../blocks/LogisticalSorterSideOn.png | Bin 4258 -> 0 bytes .../mekanism/textures/items/LiquidEnergy.txt | 32 ----- .../textures/items/LiquidHydrogen.txt | 32 ----- .../mekanism/textures/items/LiquidOxygen.txt | 32 ----- 34 files changed, 239 insertions(+), 296 deletions(-) rename resources/assets/mekanism/textures/{items => blocks}/LiquidEnergy.png (100%) create mode 100644 resources/assets/mekanism/textures/blocks/LiquidEnergy.png.mcmeta rename resources/assets/mekanism/textures/{items => blocks}/LiquidHydrogen.png (100%) create mode 100644 resources/assets/mekanism/textures/blocks/LiquidHydrogen.png.mcmeta rename resources/assets/mekanism/textures/{items => blocks}/LiquidOxygen.png (100%) create mode 100644 resources/assets/mekanism/textures/blocks/LiquidOxygen.png.mcmeta delete mode 100644 resources/assets/mekanism/textures/blocks/LogisticalSorterSideOn.png delete mode 100644 resources/assets/mekanism/textures/items/LiquidEnergy.txt delete mode 100644 resources/assets/mekanism/textures/items/LiquidHydrogen.txt delete mode 100644 resources/assets/mekanism/textures/items/LiquidOxygen.txt diff --git a/common/mekanism/api/gas/EnumGas.java b/common/mekanism/api/gas/EnumGas.java index dbc8a1c1f..e6fac0eea 100644 --- a/common/mekanism/api/gas/EnumGas.java +++ b/common/mekanism/api/gas/EnumGas.java @@ -1,7 +1,6 @@ package mekanism.api.gas; import net.minecraft.util.Icon; -import net.minecraft.util.ResourceLocation; /** * The gasses currently available in Mekanism. @@ -10,13 +9,12 @@ import net.minecraft.util.ResourceLocation; */ public enum EnumGas { - NONE("None", null, null), - OXYGEN("Oxygen", null, null), - HYDROGEN("Hydrogen", null, null); + NONE("None", null), + OXYGEN("Oxygen", null), + HYDROGEN("Hydrogen", null); public String name; public Icon gasIcon; - public ResourceLocation texturePath; public static EnumGas getFromName(String gasName) { @@ -34,13 +32,12 @@ public enum EnumGas public boolean hasTexture() { - return gasIcon != null && texturePath != null; + return gasIcon != null; } - private EnumGas(String s, Icon icon, ResourceLocation path) + private EnumGas(String s, Icon icon) { name = s; gasIcon = icon; - texturePath = path; } } diff --git a/common/mekanism/client/ClientProxy.java b/common/mekanism/client/ClientProxy.java index 41d4a3dac..f31e68c7c 100644 --- a/common/mekanism/client/ClientProxy.java +++ b/common/mekanism/client/ClientProxy.java @@ -5,7 +5,6 @@ import java.io.File; import java.util.HashMap; import mekanism.api.IConfigurable; -import mekanism.api.gas.EnumGas; import mekanism.client.gui.GuiCombiner; import mekanism.client.gui.GuiConfiguration; import mekanism.client.gui.GuiCredits; @@ -71,6 +70,7 @@ import mekanism.common.tileentity.TileEntityChargepad; import mekanism.common.tileentity.TileEntityCombiner; import mekanism.common.tileentity.TileEntityCrusher; import mekanism.common.tileentity.TileEntityDigitalMiner; +import mekanism.common.tileentity.TileEntityDiversionTransporter; import mekanism.common.tileentity.TileEntityDynamicTank; import mekanism.common.tileentity.TileEntityDynamicValve; import mekanism.common.tileentity.TileEntityElectricChest; @@ -82,7 +82,6 @@ import mekanism.common.tileentity.TileEntityEnergyCube; import mekanism.common.tileentity.TileEntityEnrichmentChamber; import mekanism.common.tileentity.TileEntityFactory; import mekanism.common.tileentity.TileEntityGasTank; -import mekanism.common.tileentity.TileEntityDiversionTransporter; import mekanism.common.tileentity.TileEntityLogisticalSorter; import mekanism.common.tileentity.TileEntityLogisticalTransporter; import mekanism.common.tileentity.TileEntityMechanicalPipe; @@ -93,8 +92,6 @@ import mekanism.common.tileentity.TileEntityPressurizedTube; import mekanism.common.tileentity.TileEntityPurificationChamber; import mekanism.common.tileentity.TileEntityTeleporter; import mekanism.common.tileentity.TileEntityUniversalCable; -import mekanism.common.util.MekanismUtils; -import mekanism.common.util.MekanismUtils.ResourceType; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; @@ -108,7 +105,6 @@ import cpw.mods.fml.client.registry.ClientRegistry; import cpw.mods.fml.client.registry.KeyBindingRegistry; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.common.network.NetworkRegistry; -import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.common.registry.TickRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -279,18 +275,6 @@ public class ClientProxy extends CommonProxy RenderingRegistry.registerBlockHandler(new TransmitterRenderingHandler()); RenderingRegistry.registerBlockHandler(new BasicRenderingHandler()); - if(!EnumGas.HYDROGEN.hasTexture()) - { - EnumGas.HYDROGEN.gasIcon = MekanismRenderer.getTextureMap(1).registerIcon("mekanism:LiquidHydrogen"); - EnumGas.HYDROGEN.texturePath = MekanismUtils.getResource(ResourceType.TEXTURE_ITEMS, "LiquidHydrogen.png"); - } - - if(!EnumGas.OXYGEN.hasTexture()) - { - EnumGas.OXYGEN.gasIcon = MekanismRenderer.getTextureMap(1).registerIcon("mekanism:LiquidOxygen"); - EnumGas.OXYGEN.texturePath = MekanismUtils.getResource(ResourceType.TEXTURE_ITEMS, "LiquidOxygen.png"); - } - System.out.println("[Mekanism] Render registrations complete."); } @@ -420,6 +404,12 @@ public class ClientProxy extends CommonProxy } } + @Override + public void preInit() + { + MekanismRenderer.init(); + } + @Override public double getReach(EntityPlayer player) { diff --git a/common/mekanism/client/gui/GuiConfiguration.java b/common/mekanism/client/gui/GuiConfiguration.java index f6b2f0bc5..24f424d53 100644 --- a/common/mekanism/client/gui/GuiConfiguration.java +++ b/common/mekanism/client/gui/GuiConfiguration.java @@ -165,7 +165,7 @@ public class GuiConfiguration extends GuiMekanism GL11.glEnable(GL11.GL_LIGHTING); GL11.glEnable(GL12.GL_RESCALE_NORMAL); - mc.getTextureManager().bindTexture(MekanismRenderer.getColorResource(configurable.getEjector().getOutputColor())); + mc.getTextureManager().bindTexture(MekanismRenderer.getBlocksTexture()); itemRenderer.renderIcon(80, 49, MekanismRenderer.getColorIcon(configurable.getEjector().getOutputColor()), 16, 16); GL11.glDisable(GL11.GL_LIGHTING); diff --git a/common/mekanism/client/gui/GuiDynamicTank.java b/common/mekanism/client/gui/GuiDynamicTank.java index 4254bd60a..c04565797 100644 --- a/common/mekanism/client/gui/GuiDynamicTank.java +++ b/common/mekanism/client/gui/GuiDynamicTank.java @@ -94,7 +94,7 @@ public class GuiDynamicTank extends GuiContainer scale = 0; } - mc.renderEngine.bindTexture(MekanismRenderer.getLiquidTexture()); + mc.renderEngine.bindTexture(MekanismRenderer.getBlocksTexture()); drawTexturedModelRectFromIcon(width + xPos, height + yPos + 58 - renderRemaining - start, fluid.getFluid().getIcon(), 16, 16 - (16 - renderRemaining)); start+=16; diff --git a/common/mekanism/client/gui/GuiElectricPump.java b/common/mekanism/client/gui/GuiElectricPump.java index dac7cc851..d72004064 100644 --- a/common/mekanism/client/gui/GuiElectricPump.java +++ b/common/mekanism/client/gui/GuiElectricPump.java @@ -97,7 +97,7 @@ public class GuiElectricPump extends GuiContainer scale = 0; } - mc.renderEngine.bindTexture(MekanismRenderer.getLiquidTexture()); + mc.renderEngine.bindTexture(MekanismRenderer.getBlocksTexture()); drawTexturedModelRectFromIcon(width + yPos, height + xPos + 58 - renderRemaining - start, fluid.getFluid().getIcon(), 16, 16 - (16 - renderRemaining)); start+=16; diff --git a/common/mekanism/client/gui/GuiLogisticalSorter.java b/common/mekanism/client/gui/GuiLogisticalSorter.java index b7b581a6e..3f2e6d36e 100644 --- a/common/mekanism/client/gui/GuiLogisticalSorter.java +++ b/common/mekanism/client/gui/GuiLogisticalSorter.java @@ -330,7 +330,7 @@ public class GuiLogisticalSorter extends GuiMekanism GL11.glEnable(GL11.GL_LIGHTING); GL11.glEnable(GL12.GL_RESCALE_NORMAL); - mc.getTextureManager().bindTexture(MekanismRenderer.getColorResource(tileEntity.color)); + mc.getTextureManager().bindTexture(MekanismRenderer.getBlocksTexture()); itemRenderer.renderIcon(13, 137, MekanismRenderer.getColorIcon(tileEntity.color), 16, 16); GL11.glDisable(GL11.GL_LIGHTING); diff --git a/common/mekanism/client/gui/GuiTItemStackFilter.java b/common/mekanism/client/gui/GuiTItemStackFilter.java index 80f485291..47489b175 100644 --- a/common/mekanism/client/gui/GuiTItemStackFilter.java +++ b/common/mekanism/client/gui/GuiTItemStackFilter.java @@ -190,7 +190,7 @@ public class GuiTItemStackFilter extends GuiMekanism GL11.glEnable(GL11.GL_LIGHTING); GL11.glEnable(GL12.GL_RESCALE_NORMAL); - mc.getTextureManager().bindTexture(MekanismRenderer.getColorResource(filter.color)); + mc.getTextureManager().bindTexture(MekanismRenderer.getBlocksTexture()); itemRenderer.renderIcon(12, 44, MekanismRenderer.getColorIcon(filter.color), 16, 16); GL11.glDisable(GL11.GL_LIGHTING); diff --git a/common/mekanism/client/gui/GuiTOreDictFilter.java b/common/mekanism/client/gui/GuiTOreDictFilter.java index 6735ff425..d75f2f8cf 100644 --- a/common/mekanism/client/gui/GuiTOreDictFilter.java +++ b/common/mekanism/client/gui/GuiTOreDictFilter.java @@ -177,7 +177,7 @@ public class GuiTOreDictFilter extends GuiMekanism GL11.glEnable(GL11.GL_LIGHTING); GL11.glEnable(GL12.GL_RESCALE_NORMAL); - mc.getTextureManager().bindTexture(MekanismRenderer.getColorResource(filter.color)); + mc.getTextureManager().bindTexture(MekanismRenderer.getBlocksTexture()); itemRenderer.renderIcon(12, 44, MekanismRenderer.getColorIcon(filter.color), 16, 16); GL11.glDisable(GL11.GL_LIGHTING); diff --git a/common/mekanism/client/render/MekanismRenderer.java b/common/mekanism/client/render/MekanismRenderer.java index a4a4acd42..467a18708 100644 --- a/common/mekanism/client/render/MekanismRenderer.java +++ b/common/mekanism/client/render/MekanismRenderer.java @@ -4,10 +4,10 @@ import java.util.Arrays; import java.util.List; import mekanism.api.EnumColor; +import mekanism.api.gas.EnumGas; 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; @@ -22,12 +22,16 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.Icon; import net.minecraft.util.ResourceLocation; import net.minecraft.util.Timer; +import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.common.ForgeDirection; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.ForgeSubscribe; import net.minecraftforge.fluids.Fluid; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; +import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -38,9 +42,34 @@ public class MekanismRenderer public static Icon[] colors = new Icon[256]; + public static Icon energyIcon; + private static float lightmapLastX; private static float lightmapLastY; private static boolean optifineBreak = false; + + public static void init() + { + MinecraftForge.EVENT_BUS.register(new MekanismRenderer()); + } + + @EventHandler + @ForgeSubscribe /* Screwy Forge code */ + public void onStitch(TextureStitchEvent.Pre event) + { + if(event.map.textureType == 0) + { + for(EnumColor color : EnumColor.values()) + { + colors[color.ordinal()] = event.map.registerIcon("mekanism:Overlay" + color.friendlyName.replace(" ", "")); + } + + energyIcon = event.map.registerIcon("mekanism:LiquidEnergy"); + + EnumGas.HYDROGEN.gasIcon = event.map.registerIcon("mekanism:LiquidHydrogen"); + EnumGas.OXYGEN.gasIcon = event.map.registerIcon("mekanism:LiquidOxygen"); + } + } public static class Model3D { @@ -152,18 +181,8 @@ 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()]; } @@ -175,9 +194,7 @@ public class MekanismRenderer { lightmapLastX = OpenGlHelper.lastBrightnessX; lightmapLastY = OpenGlHelper.lastBrightnessY; - } - catch(NoSuchFieldError e) - { + } catch(NoSuchFieldError e) { optifineBreak = true; } @@ -428,8 +445,13 @@ public class MekanismRenderer return 0; } - public static ResourceLocation getLiquidTexture() + public static ResourceLocation getBlocksTexture() { return TextureMap.locationBlocksTexture; } + + public static ResourceLocation getItemsTexture() + { + return TextureMap.locationItemsTexture; + } } diff --git a/common/mekanism/client/render/tileentity/RenderConfigurableMachine.java b/common/mekanism/client/render/tileentity/RenderConfigurableMachine.java index d6a1d3bc9..776dfb7ee 100644 --- a/common/mekanism/client/render/tileentity/RenderConfigurableMachine.java +++ b/common/mekanism/client/render/tileentity/RenderConfigurableMachine.java @@ -14,12 +14,10 @@ import mekanism.common.util.MekanismUtils.ResourceType; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GLAllocation; -import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Icon; import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; @@ -68,7 +66,7 @@ public class RenderConfigurableMachine extends TileEntitySpecialRenderer GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.4F); - bindTexture(MekanismUtils.getResource(ResourceType.TEXTURE_BLOCKS, "Overlay" + color.friendlyName.replace(" ", "") + ".png")); + bindTexture(MekanismRenderer.getBlocksTexture()); GL11.glTranslatef((float)x, (float)y, (float)z); int display = getOverlayDisplay(world, ForgeDirection.getOrientation(pos.sideHit), color).display; diff --git a/common/mekanism/client/render/tileentity/RenderDynamicTank.java b/common/mekanism/client/render/tileentity/RenderDynamicTank.java index 14bccfdb4..b4f8b6237 100644 --- a/common/mekanism/client/render/tileentity/RenderDynamicTank.java +++ b/common/mekanism/client/render/tileentity/RenderDynamicTank.java @@ -47,7 +47,7 @@ public class RenderDynamicTank extends TileEntitySpecialRenderer data.length = tileEntity.structure.volLength; data.width = tileEntity.structure.volWidth; - bindTexture(MekanismRenderer.getLiquidTexture()); + bindTexture(MekanismRenderer.getBlocksTexture()); if(data.location != null && data.height > 0 && tileEntity.structure.fluidStored.getFluid() != null) { diff --git a/common/mekanism/client/render/tileentity/RenderLogisticalTransporter.java b/common/mekanism/client/render/tileentity/RenderLogisticalTransporter.java index e6cd36a56..e8f20f120 100644 --- a/common/mekanism/client/render/tileentity/RenderLogisticalTransporter.java +++ b/common/mekanism/client/render/tileentity/RenderLogisticalTransporter.java @@ -84,28 +84,31 @@ public class RenderLogisticalTransporter extends TileEntitySpecialRenderer for(TransporterStack stack : tileEntity.transit) { - GL11.glPushMatrix(); - entityItem.setEntityItemStack(stack.itemStack); - - float[] pos = TransporterUtils.getStackPosition(tileEntity, stack, partialTick*TileEntityLogisticalTransporter.SPEED); - - GL11.glTranslated(x + pos[0], y + pos[1] - entityItem.yOffset, z + pos[2]); - GL11.glScalef(0.75F, 0.75F, 0.75F); - - renderer.doRenderItem(entityItem, 0, 0, 0, 0, 0); - GL11.glPopMatrix(); - - if(stack.color != null) + if(stack != null) { - bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "TransporterBox.png")); GL11.glPushMatrix(); - MekanismRenderer.glowOn(); - GL11.glDisable(GL11.GL_CULL_FACE); - GL11.glColor4f(stack.color.getColor(0), stack.color.getColor(1), stack.color.getColor(2), 1.0F); - GL11.glTranslatef((float)(x + pos[0]), (float)(y + pos[1] - entityItem.yOffset - (stack.itemStack.itemID < 256 ? 0.1 : 0)), (float)(z + pos[2])); - modelBox.render(0.0625F); - MekanismRenderer.glowOff(); + entityItem.setEntityItemStack(stack.itemStack); + + float[] pos = TransporterUtils.getStackPosition(tileEntity, stack, partialTick*TileEntityLogisticalTransporter.SPEED); + + GL11.glTranslated(x + pos[0], y + pos[1] - entityItem.yOffset, z + pos[2]); + GL11.glScalef(0.75F, 0.75F, 0.75F); + + renderer.doRenderItem(entityItem, 0, 0, 0, 0, 0); GL11.glPopMatrix(); + + if(stack.color != null) + { + bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "TransporterBox.png")); + GL11.glPushMatrix(); + MekanismRenderer.glowOn(); + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glColor4f(stack.color.getColor(0), stack.color.getColor(1), stack.color.getColor(2), 1.0F); + GL11.glTranslatef((float)(x + pos[0]), (float)(y + pos[1] - entityItem.yOffset - (stack.itemStack.itemID < 256 ? 0.1 : 0)), (float)(z + pos[2])); + modelBox.render(0.0625F); + MekanismRenderer.glowOff(); + GL11.glPopMatrix(); + } } } } diff --git a/common/mekanism/client/render/tileentity/RenderMechanicalPipe.java b/common/mekanism/client/render/tileentity/RenderMechanicalPipe.java index 6eb718b79..3d4b20272 100644 --- a/common/mekanism/client/render/tileentity/RenderMechanicalPipe.java +++ b/common/mekanism/client/render/tileentity/RenderMechanicalPipe.java @@ -69,7 +69,7 @@ public class RenderMechanicalPipe extends TileEntitySpecialRenderer MekanismRenderer.glowOn(); } - bindTexture(MekanismRenderer.getLiquidTexture()); + bindTexture(MekanismRenderer.getBlocksTexture()); GL11.glTranslatef((float)x, (float)y, (float)z); for(int i = 0; i < 6; i++) diff --git a/common/mekanism/client/render/tileentity/RenderPressurizedTube.java b/common/mekanism/client/render/tileentity/RenderPressurizedTube.java index 67e6741a9..1cb583cf0 100644 --- a/common/mekanism/client/render/tileentity/RenderPressurizedTube.java +++ b/common/mekanism/client/render/tileentity/RenderPressurizedTube.java @@ -118,7 +118,7 @@ public class RenderPressurizedTube extends TileEntitySpecialRenderer push(); GL11.glColor4f(1.0F, 1.0F, 1.0F, tileEntity.gasScale); - bindTexture(tileEntity.refGas.texturePath); + bindTexture(MekanismRenderer.getBlocksTexture()); GL11.glTranslatef((float)x, (float)y, (float)z); if(tileEntity.gasScale > 0) diff --git a/common/mekanism/client/render/tileentity/RenderUniversalCable.java b/common/mekanism/client/render/tileentity/RenderUniversalCable.java index 28835ecf0..04e47eb73 100644 --- a/common/mekanism/client/render/tileentity/RenderUniversalCable.java +++ b/common/mekanism/client/render/tileentity/RenderUniversalCable.java @@ -30,8 +30,6 @@ public class RenderUniversalCable extends TileEntitySpecialRenderer { private static ModelTransmitter model = new ModelTransmitter(Size.SMALL); - private static Icon renderIcon = MekanismRenderer.getTextureMap(1).registerIcon("mekanism:LiquidEnergy"); - private static Model3D[] energy = null; private static Map sideDisplayLists = new HashMap(); @@ -75,7 +73,7 @@ public class RenderUniversalCable extends TileEntitySpecialRenderer MekanismRenderer.glowOn(); GL11.glColor4f(1F, 1F, 1F, tileEntity.getEnergyScale()); - bindTexture(MekanismUtils.getResource(ResourceType.TEXTURE_ITEMS, "LiquidEnergy.png")); + bindTexture(MekanismRenderer.getBlocksTexture()); GL11.glTranslatef((float)x, (float)y, (float)z); if(energy == null) @@ -125,7 +123,7 @@ public class RenderUniversalCable extends TileEntitySpecialRenderer Model3D[] energyArray = new Model3D[7]; Model3D centerModel = new Model3D(); centerModel.baseBlock = Block.waterStill; - centerModel.setTexture(renderIcon); + centerModel.setTexture(MekanismRenderer.energyIcon); centerModel.minX = 0.3 + offset; centerModel.minY = 0.3 + offset; @@ -141,7 +139,7 @@ public class RenderUniversalCable extends TileEntitySpecialRenderer { Model3D toReturn = new Model3D(); toReturn.baseBlock = Block.waterStill; - toReturn.setTexture(renderIcon); + toReturn.setTexture(MekanismRenderer.energyIcon); toReturn.setSideRender(side, false); toReturn.setSideRender(side.getOpposite(), false); diff --git a/common/mekanism/common/CommonProxy.java b/common/mekanism/common/CommonProxy.java index 0e7b48cc0..ff8b65871 100644 --- a/common/mekanism/common/CommonProxy.java +++ b/common/mekanism/common/CommonProxy.java @@ -314,6 +314,8 @@ public class CommonProxy return null; } + public void preInit() {} + public double getReach(EntityPlayer player) { if(player instanceof EntityPlayerMP) diff --git a/common/mekanism/common/HashList.java b/common/mekanism/common/HashList.java index 488cf6fe1..ab6312661 100644 --- a/common/mekanism/common/HashList.java +++ b/common/mekanism/common/HashList.java @@ -39,6 +39,14 @@ public class HashList implements Iterable { if(!list.contains(obj)) { + if(index > size()) + { + for(int i = size(); i <= index-1; i++) + { + list.add(i, null); + } + } + list.add(index, obj); } } diff --git a/common/mekanism/common/Mekanism.java b/common/mekanism/common/Mekanism.java index 1b347925e..38e4344dc 100644 --- a/common/mekanism/common/Mekanism.java +++ b/common/mekanism/common/Mekanism.java @@ -1057,6 +1057,8 @@ public class Mekanism System.out.println("[Mekanism] Detected Tekkit in root directory - hello, fellow user!"); } + Mekanism.proxy.preInit(); + MinecraftForge.EVENT_BUS.register(hooks); //Register infuses diff --git a/common/mekanism/common/tileentity/TileEntityDigitalMiner.java b/common/mekanism/common/tileentity/TileEntityDigitalMiner.java index 8ec6e06c5..03f8c6585 100644 --- a/common/mekanism/common/tileentity/TileEntityDigitalMiner.java +++ b/common/mekanism/common/tileentity/TileEntityDigitalMiner.java @@ -984,7 +984,7 @@ public class TileEntityDigitalMiner extends TileEntityElectricBlock implements I { for(int x = xCoord-1; x <= xCoord+1; x++) { - for(int y = yCoord; y <= yCoord+2; y++) + for(int y = yCoord; y <= yCoord+1; y++) { for(int z = zCoord-1; z <= zCoord+1; z++) { diff --git a/common/mekanism/common/tileentity/TileEntityLogisticalSorter.java b/common/mekanism/common/tileentity/TileEntityLogisticalSorter.java index 3b2fd868c..60d8319a5 100644 --- a/common/mekanism/common/tileentity/TileEntityLogisticalSorter.java +++ b/common/mekanism/common/tileentity/TileEntityLogisticalSorter.java @@ -374,7 +374,7 @@ public class TileEntityLogisticalSorter extends TileEntityElectricBlock implemen if(back instanceof IInventory) { - return TransporterUtils.canInsert(back, null, stack, ForgeDirection.getOrientation(facing).getOpposite().ordinal(), true); + return InventoryUtils.canInsert(back, null, stack, ForgeDirection.getOrientation(facing).getOpposite().ordinal(), true); } return false; diff --git a/common/mekanism/common/tileentity/TileEntityLogisticalTransporter.java b/common/mekanism/common/tileentity/TileEntityLogisticalTransporter.java index 5253ce364..68ef6f72b 100644 --- a/common/mekanism/common/tileentity/TileEntityLogisticalTransporter.java +++ b/common/mekanism/common/tileentity/TileEntityLogisticalTransporter.java @@ -52,7 +52,10 @@ public class TileEntityLogisticalTransporter extends TileEntity implements ITile { for(TransporterStack stack : transit) { - stack.progress = Math.min(100, stack.progress+SPEED); + if(stack != null) + { + stack.progress = Math.min(100, stack.progress+SPEED); + } } } else { @@ -143,7 +146,7 @@ public class TileEntityLogisticalTransporter extends TileEntity implements ITile { if(stack.isFinal(this)) { - if(stack.pathType == Path.DEST && !TransporterUtils.canInsert(stack.getDest().getTileEntity(worldObj), stack.color, stack.itemStack, stack.getSide(this), false)) + if(stack.pathType == Path.DEST && !InventoryUtils.canInsert(stack.getDest().getTileEntity(worldObj), stack.color, stack.itemStack, stack.getSide(this), false)) { if(!recalculate(stack, null)) { @@ -151,7 +154,7 @@ public class TileEntityLogisticalTransporter extends TileEntity implements ITile continue; } } - else if(stack.pathType == Path.HOME && !TransporterUtils.canInsert(stack.getDest().getTileEntity(worldObj), stack.color, stack.itemStack, stack.getSide(this), true)) + else if(stack.pathType == Path.HOME && !InventoryUtils.canInsert(stack.getDest().getTileEntity(worldObj), stack.color, stack.itemStack, stack.getSide(this), true)) { if(!recalculate(stack, null)) { diff --git a/common/mekanism/common/transporter/TransporterPathfinder.java b/common/mekanism/common/transporter/TransporterPathfinder.java index 03ee639fd..150a25260 100644 --- a/common/mekanism/common/transporter/TransporterPathfinder.java +++ b/common/mekanism/common/transporter/TransporterPathfinder.java @@ -14,8 +14,7 @@ import mekanism.common.tileentity.TileEntityLogisticalSorter; import mekanism.common.tileentity.TileEntityLogisticalTransporter; import mekanism.common.transporter.TransporterPathfinder.Pathfinder.DestChecker; import mekanism.common.transporter.TransporterStack.Path; -import mekanism.common.util.TransporterUtils; -import net.minecraft.inventory.IInventory; +import mekanism.common.util.InventoryUtils; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; @@ -213,7 +212,7 @@ public final class TransporterPathfinder continue; } - if(TransporterUtils.canInsert(tile, transportStack.color, transportStack.itemStack, side.ordinal(), false)) + if(InventoryUtils.canInsert(tile, transportStack.color, transportStack.itemStack, side.ordinal(), false)) { destsFound.add(Object3D.get(tile)); } @@ -240,7 +239,7 @@ public final class TransporterPathfinder @Override public boolean isValid(TransporterStack stack, int side, TileEntity tile) { - return TransporterUtils.canInsert(tile, stack.color, stack.itemStack, side, false); + return InventoryUtils.canInsert(tile, stack.color, stack.itemStack, side, false); } }; @@ -507,7 +506,7 @@ public final class TransporterPathfinder @Override public boolean isValid(TransporterStack stack, int side, TileEntity tile) { - return TransporterUtils.canInsert(tile, stack.color, stack.itemStack, side, true); + return InventoryUtils.canInsert(tile, stack.color, stack.itemStack, side, true); } }; diff --git a/common/mekanism/common/util/InventoryUtils.java b/common/mekanism/common/util/InventoryUtils.java index d315baa46..ebbc9bdb9 100644 --- a/common/mekanism/common/util/InventoryUtils.java +++ b/common/mekanism/common/util/InventoryUtils.java @@ -1,5 +1,7 @@ package mekanism.common.util; +import mekanism.api.EnumColor; +import mekanism.api.IConfigurable; import mekanism.common.tileentity.TileEntityBin; import mekanism.common.tileentity.TileEntityLogisticalSorter; import mekanism.common.transporter.InvStack; @@ -7,6 +9,7 @@ import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; import net.minecraft.inventory.InventoryLargeChest; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityChest; import net.minecraftforge.common.ForgeDirection; @@ -332,4 +335,117 @@ public final class InventoryUtils return null; } + public static boolean canInsert(TileEntity tileEntity, EnumColor color, ItemStack itemStack, int side, boolean force) + { + if(!(tileEntity instanceof IInventory)) + { + return false; + } + + if(force && tileEntity instanceof TileEntityLogisticalSorter) + { + return ((TileEntityLogisticalSorter)tileEntity).canSendHome(itemStack); + } + + if(!force && tileEntity instanceof IConfigurable) + { + IConfigurable config = (IConfigurable)tileEntity; + int tileSide = config.getOrientation(); + EnumColor configColor = config.getEjector().getInputColor(ForgeDirection.getOrientation(MekanismUtils.getBaseOrientation(side, tileSide)).getOpposite()); + + if(config.getEjector().hasStrictInput() && configColor != null && configColor != color) + { + return false; + } + } + + IInventory inventory = (IInventory)tileEntity; + + if(!(inventory instanceof ISidedInventory)) + { + inventory = InventoryUtils.checkChestInv(inventory); + + for(int i = 0; i <= inventory.getSizeInventory() - 1; i++) + { + if(!force) + { + if(!inventory.isItemValidForSlot(i, itemStack)) + { + continue; + } + } + + ItemStack inSlot = inventory.getStackInSlot(i); + + if(inSlot == null) + { + return true; + } + else if(inSlot.isItemEqual(itemStack) && inSlot.stackSize < inSlot.getMaxStackSize()) + { + if(inSlot.stackSize + itemStack.stackSize <= inSlot.getMaxStackSize()) + { + return true; + } + else { + int rejects = (inSlot.stackSize + itemStack.stackSize) - inSlot.getMaxStackSize(); + + if(rejects < itemStack.stackSize) + { + return true; + } + } + } + } + } + else { + ISidedInventory sidedInventory = (ISidedInventory)inventory; + int[] slots = sidedInventory.getAccessibleSlotsFromSide(ForgeDirection.getOrientation(side).getOpposite().ordinal()); + + if(slots != null && slots.length != 0) + { + if(force && sidedInventory instanceof TileEntityBin && ForgeDirection.getOrientation(side).getOpposite().ordinal() == 0) + { + slots = sidedInventory.getAccessibleSlotsFromSide(1); + } + + for(int get = 0; get <= slots.length - 1; get++) + { + int slotID = slots[get]; + + if(!force) + { + if(!sidedInventory.isItemValidForSlot(slotID, itemStack) || !sidedInventory.canInsertItem(slotID, itemStack, ForgeDirection.getOrientation(side).getOpposite().ordinal())) + { + continue; + } + } + + ItemStack inSlot = inventory.getStackInSlot(slotID); + + if(inSlot == null) + { + return true; + } + else if(inSlot.isItemEqual(itemStack) && inSlot.stackSize < inSlot.getMaxStackSize()) + { + if(inSlot.stackSize + itemStack.stackSize <= inSlot.getMaxStackSize()) + { + return true; + } + else { + int rejects = (inSlot.stackSize + itemStack.stackSize) - inSlot.getMaxStackSize(); + + if(rejects < itemStack.stackSize) + { + return true; + } + } + } + } + } + } + + return false; + } } diff --git a/common/mekanism/common/util/TransporterUtils.java b/common/mekanism/common/util/TransporterUtils.java index f26a14f2b..7bc86088c 100644 --- a/common/mekanism/common/util/TransporterUtils.java +++ b/common/mekanism/common/util/TransporterUtils.java @@ -200,120 +200,6 @@ public final class TransporterUtils return tileEntity.insertRR(outputter, itemStack.copy(), color); } - public static boolean canInsert(TileEntity tileEntity, EnumColor color, ItemStack itemStack, int side, boolean force) - { - if(!(tileEntity instanceof IInventory)) - { - return false; - } - - if(force && tileEntity instanceof TileEntityLogisticalSorter) - { - return ((TileEntityLogisticalSorter)tileEntity).canSendHome(itemStack); - } - - if(!force && tileEntity instanceof IConfigurable) - { - IConfigurable config = (IConfigurable)tileEntity; - int tileSide = config.getOrientation(); - EnumColor configColor = config.getEjector().getInputColor(ForgeDirection.getOrientation(MekanismUtils.getBaseOrientation(side, tileSide)).getOpposite()); - - if(config.getEjector().hasStrictInput() && configColor != null && configColor != color) - { - return false; - } - } - - IInventory inventory = (IInventory)tileEntity; - - if(!(inventory instanceof ISidedInventory)) - { - inventory = InventoryUtils.checkChestInv(inventory); - - for(int i = 0; i <= inventory.getSizeInventory() - 1; i++) - { - if(!force) - { - if(!inventory.isItemValidForSlot(i, itemStack)) - { - continue; - } - } - - ItemStack inSlot = inventory.getStackInSlot(i); - - if(inSlot == null) - { - return true; - } - else if(inSlot.isItemEqual(itemStack) && inSlot.stackSize < inSlot.getMaxStackSize()) - { - if(inSlot.stackSize + itemStack.stackSize <= inSlot.getMaxStackSize()) - { - return true; - } - else { - int rejects = (inSlot.stackSize + itemStack.stackSize) - inSlot.getMaxStackSize(); - - if(rejects < itemStack.stackSize) - { - return true; - } - } - } - } - } - else { - ISidedInventory sidedInventory = (ISidedInventory)inventory; - int[] slots = sidedInventory.getAccessibleSlotsFromSide(ForgeDirection.getOrientation(side).getOpposite().ordinal()); - - if(slots != null && slots.length != 0) - { - if(force && sidedInventory instanceof TileEntityBin && ForgeDirection.getOrientation(side).getOpposite().ordinal() == 0) - { - slots = sidedInventory.getAccessibleSlotsFromSide(1); - } - - for(int get = 0; get <= slots.length - 1; get++) - { - int slotID = slots[get]; - - if(!force) - { - if(!sidedInventory.isItemValidForSlot(slotID, itemStack) || !sidedInventory.canInsertItem(slotID, itemStack, ForgeDirection.getOrientation(side).getOpposite().ordinal())) - { - continue; - } - } - - ItemStack inSlot = inventory.getStackInSlot(slotID); - - if(inSlot == null) - { - return true; - } - else if(inSlot.isItemEqual(itemStack) && inSlot.stackSize < inSlot.getMaxStackSize()) - { - if(inSlot.stackSize + itemStack.stackSize <= inSlot.getMaxStackSize()) - { - return true; - } - else { - int rejects = (inSlot.stackSize + itemStack.stackSize) - inSlot.getMaxStackSize(); - - if(rejects < itemStack.stackSize) - { - return true; - } - } - } - } - } - } - - return false; - } - public static EnumColor increment(EnumColor color) { if(color == null) diff --git a/resources/assets/mekanism/textures/items/LiquidEnergy.png b/resources/assets/mekanism/textures/blocks/LiquidEnergy.png similarity index 100% rename from resources/assets/mekanism/textures/items/LiquidEnergy.png rename to resources/assets/mekanism/textures/blocks/LiquidEnergy.png diff --git a/resources/assets/mekanism/textures/blocks/LiquidEnergy.png.mcmeta b/resources/assets/mekanism/textures/blocks/LiquidEnergy.png.mcmeta new file mode 100644 index 000000000..4b721e09a --- /dev/null +++ b/resources/assets/mekanism/textures/blocks/LiquidEnergy.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 2 + } +} diff --git a/resources/assets/mekanism/textures/items/LiquidHydrogen.png b/resources/assets/mekanism/textures/blocks/LiquidHydrogen.png similarity index 100% rename from resources/assets/mekanism/textures/items/LiquidHydrogen.png rename to resources/assets/mekanism/textures/blocks/LiquidHydrogen.png diff --git a/resources/assets/mekanism/textures/blocks/LiquidHydrogen.png.mcmeta b/resources/assets/mekanism/textures/blocks/LiquidHydrogen.png.mcmeta new file mode 100644 index 000000000..4b721e09a --- /dev/null +++ b/resources/assets/mekanism/textures/blocks/LiquidHydrogen.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 2 + } +} diff --git a/resources/assets/mekanism/textures/items/LiquidOxygen.png b/resources/assets/mekanism/textures/blocks/LiquidOxygen.png similarity index 100% rename from resources/assets/mekanism/textures/items/LiquidOxygen.png rename to resources/assets/mekanism/textures/blocks/LiquidOxygen.png diff --git a/resources/assets/mekanism/textures/blocks/LiquidOxygen.png.mcmeta b/resources/assets/mekanism/textures/blocks/LiquidOxygen.png.mcmeta new file mode 100644 index 000000000..4b721e09a --- /dev/null +++ b/resources/assets/mekanism/textures/blocks/LiquidOxygen.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 2 + } +} diff --git a/resources/assets/mekanism/textures/blocks/LogisticalSorterSideOn.png b/resources/assets/mekanism/textures/blocks/LogisticalSorterSideOn.png deleted file mode 100644 index 8165e457c05e5a2aac8fa77c093bca9c86b44ce0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4258 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