package mekanism.common.multipart;
import java.util.Collections;
import java.util.List;
import mcmultipart.microblock.IMicroblock.IFaceMicroblock;
import mcmultipart.multipart.IMultipart;
import mcmultipart.multipart.INormallyOccludingPart;
import mcmultipart.multipart.Multipart;
import mcmultipart.multipart.PartSlot;
import mcmultipart.raytrace.PartMOP;
import mekanism.api.Coord4D;
import mekanism.api.EnumColor;
import mekanism.common.MekanismItems;
import mekanism.common.block.states.BlockStateFacing;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
//import net.minecraft.util.IIcon;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.Vec3d;
import net.minecraftforge.common.property.IExtendedBlockState;
public class PartGlowPanel extends Multipart implements INormallyOccludingPart
{
public EnumColor colour = EnumColor.WHITE;
public EnumFacing side = EnumFacing.DOWN;
public static AxisAlignedBB[] bounds = new AxisAlignedBB[6];
static
{
AxisAlignedBB cuboid = new AxisAlignedBB(0.25, 0, 0.25, 0.75, 0.125, 0.75);
Vec3d fromOrigin = new Vec3d(-0.5, -0.5, -0.5);
for(EnumFacing side : EnumFacing.VALUES)
{
bounds[side.ordinal()] = MultipartMekanism.rotate(cuboid.offset(fromOrigin.xCoord, fromOrigin.yCoord, fromOrigin.zCoord), side).offset(-fromOrigin.xCoord, -fromOrigin.zCoord, -fromOrigin.zCoord);
}
}
public PartGlowPanel()
{
super();
}
public PartGlowPanel(EnumColor colour, EnumFacing side)
{
super();
setColour(colour);
setOrientation(side);
}
@Override
public void addSelectionBoxes(List<AxisAlignedBB> list)
{
list.add(bounds[side.ordinal()]);
}
@Override
public ResourceLocation getType()
{
return new ResourceLocation("mekanism:glow_panel");
}
public void setColour(EnumColor newColour)
{
colour = newColour;
}
public void setOrientation(EnumFacing newSide)
{
side = newSide;
}
@Override
public void onNeighborTileChange(EnumFacing side)
{
if(!getWorld().isRemote && !canStay())
{
MultipartMekanism.dropItem(new ItemStack(MekanismItems.GlowPanel, 1, colour.getMetaValue()), this);
getContainer().removePart(this);
}
}
@Override
public void onPartChanged(IMultipart other)
{
if(!getWorld().isRemote && !canStay())
{
MultipartMekanism.dropItem(new ItemStack(MekanismItems.GlowPanel, 1, colour.getMetaValue()), this);
getContainer().removePart(this);
}
}
@Override
public void writeUpdatePacket(PacketBuffer data)
{
data.writeInt(side.ordinal());
data.writeInt(colour.getMetaValue());
}
@Override
public void readUpdatePacket(PacketBuffer data)
{
side = EnumFacing.getFront(data.readInt());
colour = EnumColor.DYES[data.readInt()];
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound nbt)
{
nbt.setInteger("side", side.ordinal());
nbt.setInteger("colour", colour.getMetaValue());
return nbt;
}
@Override
public void readFromNBT(NBTTagCompound nbt)
{
side = EnumFacing.getFront(nbt.getInteger("side"));
colour = EnumColor.DYES[nbt.getInteger("colour")];
}
@Override
public int getLightValue()
{
return 15;
}
@Override
public void addOcclusionBoxes(List<AxisAlignedBB> list)
{
addSelectionBoxes(list);
}
@Override
public float getHardness(PartMOP partHit)
{
return 3.5F;
}
@Override
public List<ItemStack> getDrops()
{
return Collections.singletonList(getPickBlock(null, null));
}
@Override
public ItemStack getPickBlock(EntityPlayer player, PartMOP hit)
{
return new ItemStack(MekanismItems.GlowPanel, 1, colour.getMetaValue());
}
public boolean canStay()
{
Coord4D adj = new Coord4D(getPos().offset(side), getWorld());
return getWorld().isSideSolid(adj.getPos(), side.getOpposite()) || (getContainer().getPartInSlot(PartSlot.getFaceSlot(side)) instanceof IFaceMicroblock && ((IFaceMicroblock)getContainer().getPartInSlot(PartSlot.getFaceSlot(side))).isFaceHollow());
}
@Override
public ResourceLocation getModelPath()
{
return getType();
}
@Override
public BlockStateContainer createBlockState()
{
return new GlowPanelBlockState();
}
@Override
public IBlockState getActualState(IBlockState state)
{
return state.withProperty(BlockStateFacing.facingProperty, side);
}
@Override
public IBlockState getExtendedState(IBlockState state)
{
state = state.withProperty(BlockStateFacing.facingProperty, side);
if(state instanceof IExtendedBlockState)
{
return ((IExtendedBlockState)state).withProperty(ColorProperty.INSTANCE, new ColorProperty(colour));
}
return state;
}
public static int hash(IExtendedBlockState state)
{
int hash = 1;
hash = 31 * hash + state.getValue(ColorProperty.INSTANCE).color.ordinal();
hash = 31 * hash + state.getValue(BlockStateFacing.facingProperty).ordinal();
return hash;
}
@Override
public boolean shouldBreakingUseExtendedState() {
return true;
}
}