diff --git a/electrical/src/main/java/resonantinduction/electrical/battery/EnergyDistributionNetwork.java b/electrical/src/main/java/resonantinduction/electrical/battery/EnergyDistributionNetwork.java index 8681a856..ac979ec9 100644 --- a/electrical/src/main/java/resonantinduction/electrical/battery/EnergyDistributionNetwork.java +++ b/electrical/src/main/java/resonantinduction/electrical/battery/EnergyDistributionNetwork.java @@ -1,26 +1,66 @@ package resonantinduction.electrical.battery; import java.util.Arrays; +import java.util.LinkedHashSet; +import java.util.Set; +import calclavia.lib.utility.FluidUtility; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.fluids.FluidStack; +import resonantinduction.api.mechanical.fluid.IFluidConnector; import universalelectricity.core.net.Network; public class EnergyDistributionNetwork extends Network { - public int getEnergyRenderForHeight() - { - - return 0; - } - public void redistribute(TileEnergyDistribution... exclusion) { long totalEnergy = 0; long totalCapacity = 0; - for (TileEnergyDistribution energyContainer : this.getConnectors()) + int lowestY = 255, highestY = 0; + + for (TileEnergyDistribution connector : this.getConnectors()) { - totalEnergy += energyContainer.energy.getEnergy(); - totalCapacity += energyContainer.energy.getEnergyCapacity(); + totalEnergy += connector.energy.getEnergy(); + totalCapacity += connector.energy.getEnergyCapacity(); + + lowestY = Math.min(connector.yCoord, lowestY); + highestY = Math.max(connector.yCoord, highestY); + + connector.renderEnergyAmount = 0; + } + + /** + * Apply render + */ + long remainingRenderEnergy = totalEnergy; + + for (int y = lowestY; y <= highestY; y++) + { + Set connectorsInlevel = new LinkedHashSet(); + + for (TileEnergyDistribution connector : this.getConnectors()) + { + if (connector.yCoord == y) + { + connectorsInlevel.add(connector); + } + } + + int levelSize = connectorsInlevel.size(); + long used = 0; + + for (TileEnergyDistribution connector : connectorsInlevel) + { + long tryInject = Math.min(remainingRenderEnergy / levelSize, connector.energy.getEnergyCapacity()); + connector.renderEnergyAmount = tryInject; + used += tryInject; + } + + remainingRenderEnergy -= used; + + if (remainingRenderEnergy <= 0) + break; } /** diff --git a/electrical/src/main/java/resonantinduction/electrical/battery/RenderBattery.java b/electrical/src/main/java/resonantinduction/electrical/battery/RenderBattery.java index 7366a5cf..7e8fdcbd 100644 --- a/electrical/src/main/java/resonantinduction/electrical/battery/RenderBattery.java +++ b/electrical/src/main/java/resonantinduction/electrical/battery/RenderBattery.java @@ -69,7 +69,8 @@ public class RenderBattery extends TileEntitySpecialRenderer implements ISimpleI @Override public void renderTileEntityAt(TileEntity t, double x, double y, double z, float f) { - String[][] partToDisable = new String[][] { new String[] { "bottom", "coil1" }, new String[] { "top" }, new String[] { "frame1", "frame2" }, new String[] { "frame3", "frame4" }, new String[] { "frame4", "frame1" }, new String[] { "frame2", "frame3" } }; + final String[][] partToDisable = new String[][] { new String[] { "bottom" }, new String[] { "top" }, new String[] { "frame1", "frame2" }, new String[] { "frame3", "frame4" }, new String[] { "frame4", "frame1" }, new String[] { "frame2", "frame3" } }; + final String[][] connectionPartToEnable = new String[][] { null, null, new String[] { "frame1con", "frame2con" }, new String[] { "frame3con", "frame4con" }, new String[] { "frame4con", "frame1con" }, new String[] { "frame2con", "frame3con" } }; GL11.glPushMatrix(); GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5); @@ -95,7 +96,22 @@ public class RenderBattery extends TileEntitySpecialRenderer implements ISimpleI } else if (check == ForgeDirection.DOWN) { - enabledParts.addAll(Arrays.asList(new String[] { "frame1con", "frame2con", "frame3con", "frame4con" })); + List connectionParts = new ArrayList(); + + for (ForgeDirection sideCheck : ForgeDirection.VALID_DIRECTIONS) + if (sideCheck.offsetY == 0) + connectionParts.addAll(Arrays.asList(connectionPartToEnable[sideCheck.ordinal()])); + + for (ForgeDirection sideCheck : ForgeDirection.VALID_DIRECTIONS) + { + if (sideCheck.offsetY == 0) + { + if (new Vector3(t).translate(sideCheck).getTileEntity(t.worldObj) instanceof TileBattery) + connectionParts.removeAll(Arrays.asList(connectionPartToEnable[sideCheck.ordinal()])); + } + } + + enabledParts.addAll(connectionParts); } } @@ -129,7 +145,7 @@ public class RenderBattery extends TileEntitySpecialRenderer implements ISimpleI { if (i != 1 || enabledParts.contains("coil1")) { - if ((8 - i) <= energyLevel) + if ((8 - i) < energyLevel) MODEL.renderOnly("coil" + i + "lit"); else MODEL.renderOnly("coil" + i); @@ -140,6 +156,8 @@ public class RenderBattery extends TileEntitySpecialRenderer implements ISimpleI disabledParts.addAll(Arrays.asList(new String[] { "coil1", "coil2", "coil3", "coil4", "coil5", "coil6", "coil7", "coil8" })); disabledParts.addAll(Arrays.asList(new String[] { "coil1lit", "coil2lit", "coil3lit", "coil4lit", "coil5lit", "coil6lit", "coil7lit", "coil8lit" })); disabledParts.addAll(Arrays.asList(new String[] { "frame1con", "frame2con", "frame3con", "frame4con" })); + + enabledParts.removeAll(Arrays.asList(new String[] { "coil1", "coil2", "coil3", "coil4", "coil5", "coil6", "coil7", "coil8" })); MODEL.renderAllExcept(disabledParts.toArray(new String[0])); MODEL.renderOnly(enabledParts.toArray(new String[0])); diff --git a/electrical/src/main/java/resonantinduction/electrical/battery/TileBattery.java b/electrical/src/main/java/resonantinduction/electrical/battery/TileBattery.java index 7f2eaa17..b877225c 100644 --- a/electrical/src/main/java/resonantinduction/electrical/battery/TileBattery.java +++ b/electrical/src/main/java/resonantinduction/electrical/battery/TileBattery.java @@ -89,7 +89,7 @@ public class TileBattery extends TileEnergyDistribution implements IVoltageInput public ArrayList getPacketData(int type) { ArrayList data = new ArrayList(); - data.add(energy.getEnergy()); + data.add(renderEnergyAmount); data.add(ioMap); return data; } diff --git a/electrical/src/main/java/resonantinduction/electrical/battery/TileEnergyDistribution.java b/electrical/src/main/java/resonantinduction/electrical/battery/TileEnergyDistribution.java index fe3c7579..ad0b5696 100644 --- a/electrical/src/main/java/resonantinduction/electrical/battery/TileEnergyDistribution.java +++ b/electrical/src/main/java/resonantinduction/electrical/battery/TileEnergyDistribution.java @@ -12,6 +12,8 @@ public class TileEnergyDistribution extends TileElectrical implements IConnector public boolean markClientUpdate = false; public boolean markDistributionUpdate = false; + + public long renderEnergyAmount = 0; @Override public void initiate() diff --git a/electrical/src/main/java/resonantinduction/electrical/charger/RenderCharger.java b/electrical/src/main/java/resonantinduction/electrical/charger/RenderCharger.java index a22ae49d..b4c5d44f 100644 --- a/electrical/src/main/java/resonantinduction/electrical/charger/RenderCharger.java +++ b/electrical/src/main/java/resonantinduction/electrical/charger/RenderCharger.java @@ -41,12 +41,21 @@ public class RenderCharger implements ISimpleItemRenderer RenderUtility.rotateBlockBasedOnDirection(part.getFacing()); RenderUtility.bind(TEXTURE); + GL11.glPushMatrix(); + GL11.glTranslatef(0, 0.12f, 0); MODEL.renderAll(); + GL11.glPopMatrix(); + GL11.glPopMatrix(); if (part.getStackInSlot(0) != null) { + GL11.glPushMatrix(); + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.5F, (float) z + 0.5F); + RenderUtility.rotateFaceToSideNoTranslate(part.placementSide); + RenderUtility.rotateBlockBasedOnDirection(part.getFacing()); OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240, 240); RenderItemOverlayTile.renderItem(part.world(), part.placementSide, part.getStackInSlot(0), new Vector3(0.00, -0.3, -0.00), 0, 4); + GL11.glPopMatrix(); EntityPlayer player = Minecraft.getMinecraft().thePlayer; boolean isLooking = false; @@ -64,20 +73,18 @@ public class RenderCharger implements ISimpleItemRenderer { long energy = CompatibilityModule.getEnergyItem(part.getStackInSlot(0)); long maxEnergy = CompatibilityModule.getMaxEnergyItem(part.getStackInSlot(0)); - GL11.glTranslatef(0, 0.2F, 0); - GL11.glRotatef(90, 1, 0, 0); - RenderUtility.renderText(UnitDisplay.getDisplay(energy, Unit.JOULES, 2, true) + "/" + UnitDisplay.getDisplay(maxEnergy, Unit.JOULES, 2, true), 1, 1); + RenderUtility.renderFloatingText(UnitDisplay.getDisplay(energy, Unit.JOULES, 2, true) + "/" + UnitDisplay.getDisplay(maxEnergy, Unit.JOULES, 2, true), new Vector3((float) x + 0.5F, (float) y + 0.8F, (float) z + 0.5F)); } } } } - GL11.glPopMatrix(); } @Override public void renderInventoryItem(ItemStack itemStack) { + GL11.glTranslatef(0.5f, 0.7f, 0.5f); RenderUtility.bind(TEXTURE); MODEL.renderAll(); }