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.minecraftforge.common.util.ForgeDirection;
import buildcraft.BuildCraftTransport;
import buildcraft.api.core.EnumColor;
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.ColorUtils;
import buildcraft.core.lib.utils.MatrixTranformations;
import buildcraft.transport.PipeIconProvider;
import buildcraft.transport.TravelingItem;
import buildcraft.transport.pipes.events.PipeEventItem;
public class LensPluggable extends PipePluggable {
public int color;
public boolean isFilter;
protected IPipeTile container;
private ForgeDirection side;
private static final class LensPluggableRenderer implements IPipePluggableRenderer {
public static final IPipePluggableRenderer INSTANCE = new LensPluggableRenderer();
private static final float zFightOffset = 1 / 4096.0F;
private LensPluggableRenderer() {
}
@Override
public void renderPluggable(RenderBlocks renderblocks, IPipe pipe, ForgeDirection side, PipePluggable pipePluggable, ITextureStates blockStateMachine, int renderPass, int x, int y, int z) {
float[][] zeroState = new float[3][2];
// 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.125F;
// Z START - END
zeroState[2][0] = 0.1875F;
zeroState[2][1] = 0.8125F;
if (renderPass == 1) {
int color = ((LensPluggable) pipePluggable).color;
blockStateMachine.setRenderMask(1 << side.ordinal() | (1 << (side.ordinal() ^ 1)));
for (int i = 0; i < 3; i++) {
zeroState[i][0] += zFightOffset;
zeroState[i][1] -= zFightOffset;
}
if (color == -1) {
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider.getIcon(PipeIconProvider.TYPE.PipeLensClearOverlay.ordinal()));
} else {
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider.getIcon(PipeIconProvider.TYPE.PipeLensOverlay.ordinal()));
((FakeBlock) blockStateMachine).setColor(ColorUtils.getRGBColor(15 - color));
}
blockStateMachine.setRenderAllSides();
} else {
if (((LensPluggable) pipePluggable).isFilter) {
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider.getIcon(PipeIconProvider.TYPE.PipeFilter.ordinal()));
} else {
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider.getIcon(PipeIconProvider.TYPE.PipeLens.ordinal()));
}
}
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);
((FakeBlock) blockStateMachine).setColor(0xFFFFFF);
}
}
public LensPluggable() {
}
public LensPluggable(ItemStack stack) {
color = stack.getItemDamage() & 15;
isFilter = stack.getItemDamage() >= 16;
if (stack.getItemDamage() >= 32) {
isFilter = stack.getItemDamage() == 33;
color = -1;
}
}
@Override
public void validate(IPipeTile pipe, ForgeDirection direction) {
this.container = pipe;
this.side = direction;
}
@Override
public void invalidate() {
this.container = null;
this.side = ForgeDirection.UNKNOWN;
}
@Override
public ItemStack[] getDropItems(IPipeTile pipe) {
int meta = color | (isFilter ? 16 : 0);
if (color == -1) {
meta = isFilter ? 33 : 32;
}
return new ItemStack[]{new ItemStack(BuildCraftTransport.lensItem, 1, meta)};
}
@Override
public boolean isBlocking(IPipeTile pipe, ForgeDirection direction) {
return false;
}
@Override
public AxisAlignedBB getBoundingBox(ForgeDirection side) {
float[][] bounds = new float[3][2];
// X START - END
bounds[0][0] = 0.25F - 0.0625F;
bounds[0][1] = 0.75F + 0.0625F;
// Y START - END
bounds[1][0] = 0.000F;
bounds[1][1] = 0.125F;
// Z START - END
bounds[2][0] = 0.25F - 0.0625F;
bounds[2][1] = 0.75F + 0.0625F;
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 LensPluggableRenderer.INSTANCE;
}
@Override
public void readFromNBT(NBTTagCompound tag) {
color = tag.getByte("c");
isFilter = tag.getBoolean("f");
}
@Override
public void writeToNBT(NBTTagCompound tag) {
tag.setByte("c", (byte) color);
tag.setBoolean("f", isFilter);
}
@Override
public void writeData(ByteBuf data) {
data.writeByte(((color + 1) & 0x1F) | (isFilter ? 0x20 : 0));
}
@Override
public void readData(ByteBuf data) {
int flags = data.readUnsignedByte();
color = (flags & 0x1F) - 1;
isFilter = (flags & 0x20) > 0;
}
@Override
public boolean requiresRenderUpdate(PipePluggable o) {
LensPluggable other = (LensPluggable) o;
return other.color != color || other.isFilter != isFilter;
}
private void color(TravelingItem item) {
if ((item.toCenter && item.input.getOpposite() == side)
|| (!item.toCenter && item.output == side)) {
if (color == -1) {
item.color = null;
} else {
item.color = EnumColor.fromId(color);
}
}
}
public void eventHandler(PipeEventItem.ReachedEnd event) {
if (!isFilter) {
color(event.item);
}
}
public void eventHandler(PipeEventItem.Entered event) {
if (!isFilter) {
color(event.item);
}
}
}