Battery now renders by distributing to lowest first

This commit is contained in:
Calclavia 2014-02-23 16:57:22 +08:00
parent f227c706da
commit bc53346781
5 changed files with 84 additions and 17 deletions

View file

@ -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<EnergyDistributionNetwork, TileEnergyDistribution>
{
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<TileEnergyDistribution> connectorsInlevel = new LinkedHashSet<TileEnergyDistribution>();
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;
}
/**

View file

@ -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<String> connectionParts = new ArrayList<String>();
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]));

View file

@ -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;
}

View file

@ -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()

View file

@ -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();
}