package buildcraft.transport.pluggable; import io.netty.buffer.ByteBuf; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.IIcon; import net.minecraftforge.common.util.ForgeDirection; import cofh.api.energy.IEnergyHandler; import buildcraft.BuildCraftTransport; import buildcraft.api.core.render.ITextureStates; import buildcraft.api.transport.IPipe; import buildcraft.api.transport.IPipeTile; import buildcraft.api.transport.pluggable.IPipePluggableRenderer; import buildcraft.api.transport.pluggable.PipePluggable; import buildcraft.core.lib.render.FakeBlock; import buildcraft.core.lib.utils.MatrixTranformations; import buildcraft.transport.PipeIconProvider; public class PowerAdapterPluggable extends PipePluggable implements IEnergyHandler { private static final int MAX_POWER = 40; private IPipeTile container; protected static final class PowerAdapterPluggableRenderer implements IPipePluggableRenderer { private float zFightOffset = 1 / 4096.0F; @Override public void renderPluggable(RenderBlocks renderblocks, IPipe pipe, ForgeDirection side, PipePluggable pipePluggable, ITextureStates blockStateMachine, int renderPass, int x, int y, int z) { if (renderPass != 0) { return; } float[][] zeroState = new float[3][2]; IIcon[] icons = FakeBlock.INSTANCE.getTextureState().popArray(); int bottom = side.ordinal(); for (int i = 0; i < 6; i++) { icons[i] = BuildCraftTransport.instance.pipeIconProvider.getIcon( (i & 6) == (bottom & 6) ? PipeIconProvider.TYPE.PipePowerAdapterBottom.ordinal() : PipeIconProvider.TYPE.PipePowerAdapterSide.ordinal() ); } // X START - END zeroState[0][0] = 0.1875F; zeroState[0][1] = 0.8125F; // Y START - END zeroState[1][0] = 0.000F; zeroState[1][1] = 0.1251F; // Z START - END zeroState[2][0] = 0.1875F; zeroState[2][1] = 0.8125F; float[][] rotated = MatrixTranformations.deepClone(zeroState); MatrixTranformations.transform(rotated, side); renderblocks.setRenderBounds(rotated[0][0], rotated[1][0], rotated[2][0], rotated[0][1], rotated[1][1], rotated[2][1]); renderblocks.renderStandardBlock(blockStateMachine.getBlock(), x, y, z); icons[bottom] = icons[bottom ^ 1] = BuildCraftTransport.instance.pipeIconProvider.getIcon(PipeIconProvider.TYPE.PipePowerAdapterTop.ordinal()); // X START - END zeroState[0][0] = 0.25F + zFightOffset; zeroState[0][1] = 0.75F - zFightOffset; // Y START - END zeroState[1][0] = 0.125F; zeroState[1][1] = 0.25F + zFightOffset; // Z START - END zeroState[2][0] = 0.25F + zFightOffset; zeroState[2][1] = 0.75F - zFightOffset; rotated = MatrixTranformations.deepClone(zeroState); MatrixTranformations.transform(rotated, side); renderblocks.setRenderBounds(rotated[0][0], rotated[1][0], rotated[2][0], rotated[0][1], rotated[1][1], rotated[2][1]); renderblocks.renderStandardBlock(blockStateMachine.getBlock(), x, y, z); FakeBlock.INSTANCE.getTextureState().pushArray(); } } public PowerAdapterPluggable() { } @Override public void validate(IPipeTile pipe, ForgeDirection direction) { this.container = pipe; } @Override public void invalidate() { this.container = null; } @Override public void writeToNBT(NBTTagCompound nbt) { } @Override public void readFromNBT(NBTTagCompound nbt) { } @Override public ItemStack[] getDropItems(IPipeTile pipe) { return new ItemStack[]{new ItemStack(BuildCraftTransport.powerAdapterItem)}; } @Override public boolean isBlocking(IPipeTile pipe, ForgeDirection direction) { return true; } @Override public AxisAlignedBB getBoundingBox(ForgeDirection side) { float[][] bounds = new float[3][2]; // X START - END bounds[0][0] = 0.1875F; bounds[0][1] = 0.8125F; // Y START - END bounds[1][0] = 0.000F; bounds[1][1] = 0.251F; // Z START - END bounds[2][0] = 0.1875F; bounds[2][1] = 0.8125F; MatrixTranformations.transform(bounds, side); return AxisAlignedBB.getBoundingBox(bounds[0][0], bounds[1][0], bounds[2][0], bounds[0][1], bounds[1][1], bounds[2][1]); } @Override public IPipePluggableRenderer getRenderer() { return new PowerAdapterPluggableRenderer(); } @Override public void writeData(ByteBuf data) { } @Override public void readData(ByteBuf data) { } @Override public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate) { int maxR = Math.min(MAX_POWER, maxReceive); if (container != null && container.getPipe() instanceof IEnergyHandler) { int energyCanReceive = ((IEnergyHandler) container.getPipe()).receiveEnergy(from, maxR, true); if (!simulate) { return ((IEnergyHandler) container.getPipe()).receiveEnergy(from, energyCanReceive, false); } else { return energyCanReceive; } } return 0; } @Override public int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate) { return 0; } @Override public int getEnergyStored(ForgeDirection from) { if (container.getPipe() instanceof IEnergyHandler) { return ((IEnergyHandler) container.getPipe()).getEnergyStored(from); } else { return 0; } } @Override public int getMaxEnergyStored(ForgeDirection from) { if (container.getPipe() instanceof IEnergyHandler) { return ((IEnergyHandler) container.getPipe()).getMaxEnergyStored(from); } else { return 0; } } @Override public boolean canConnectEnergy(ForgeDirection from) { return true; } @Override public boolean requiresRenderUpdate(PipePluggable o) { return false; } }