package com.jaquadro.minecraft.gardencontainers.block;
import com.jaquadro.minecraft.gardencontainers.block.support.WindowBoxConnectionProfile;
import com.jaquadro.minecraft.gardencontainers.block.tile.TileEntityWindowBox;
import com.jaquadro.minecraft.gardencontainers.core.ClientProxy;
import com.jaquadro.minecraft.gardencore.api.WoodRegistry;
import com.jaquadro.minecraft.gardencore.api.plant.PlantItem;
import com.jaquadro.minecraft.gardencore.api.plant.PlantSize;
import com.jaquadro.minecraft.gardencore.api.plant.PlantType;
import com.jaquadro.minecraft.gardencore.block.BlockGarden;
import com.jaquadro.minecraft.gardencore.block.support.BasicSlotProfile;
import com.jaquadro.minecraft.gardencore.block.support.Slot5Profile;
import com.jaquadro.minecraft.gardencore.block.support.SlotShare0Profile;
import com.jaquadro.minecraft.gardencore.block.tile.TileEntityGarden;
import com.jaquadro.minecraft.gardencore.core.ModCreativeTabs;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.IIcon;
import net.minecraft.util.MathHelper;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.IPlantable;
import java.util.List;
public class BlockWindowBox extends BlockGarden
{
public static final String[] subTypes = new String[] { "oak", "spruce", "birch", "jungle", "acacia", "big_oak" };
private static ItemStack substrate = new ItemStack(Blocks.dirt, 1);
private class LocalSlotProfile extends Slot5Profile
{
private AxisAlignedBB[] mainClippingBounds = new AxisAlignedBB[] {
AxisAlignedBB.getBoundingBox(0.3125, 0, 0.3125, 1 - 0.3125, 0.0625, 1 - 0.3125),
AxisAlignedBB.getBoundingBox(0.25, 0.0625, 0.25, 1 - 0.25, 0.125, 1 - 0.25),
AxisAlignedBB.getBoundingBox(0.1875, 0.125, 0.1875, 1 - 0.1875, 1, 1 - 0.1875),
};
public LocalSlotProfile (Slot[] slots) {
super(slots);
}
@Override
public float getPlantOffsetY (IBlockAccess blockAccess, int x, int y, int z, int slot) {
TileEntityWindowBox garden = getTileEntity(blockAccess, x, y, z);
if (garden == null || garden.isUpper())
return -.0625f;
else
return -.5f - .0625f;
}
@Override
public AxisAlignedBB[] getClippingBounds (IBlockAccess blockAccess, int x, int y, int z, int slot) {
return mainClippingBounds;
}
}
public BlockWindowBox (String blockName, Material material) {
super(blockName, material);
setCreativeTab(ModCreativeTabs.tabGardenCore);
setHardness(0.5f);
setStepSound(Block.soundTypeWood);
//setLightOpacity(255);
connectionProfile = new WindowBoxConnectionProfile();
slotShareProfile = new SlotShare0Profile();
PlantType[] commonType = new PlantType[] { PlantType.GROUND };
PlantSize[] smallSize = new PlantSize[] { PlantSize.LARGE, PlantSize.MEDIUM, PlantSize.SMALL };
PlantSize[] allSize = new PlantSize[] { PlantSize.FULL, PlantSize.LARGE, PlantSize.MEDIUM, PlantSize.SMALL };
slotProfile = new LocalSlotProfile(new BasicSlotProfile.Slot[]{
new BasicSlotProfile.Slot(Slot5Profile.SLOT_COVER, new PlantType[] { PlantType.GROUND_COVER }, allSize),
new BasicSlotProfile.Slot(Slot5Profile.SLOT_NW, commonType, smallSize),
new BasicSlotProfile.Slot(Slot5Profile.SLOT_NE, commonType, smallSize),
new BasicSlotProfile.Slot(Slot5Profile.SLOT_SW, commonType, smallSize),
new BasicSlotProfile.Slot(Slot5Profile.SLOT_SE, commonType, smallSize),
});
}
@Override
public int getRenderType () {
return ClientProxy.windowBoxRenderID;
}
@Override
public boolean isOpaqueCube () {
return false;
}
@Override
public boolean renderAsNormalBlock () {
return false;
}
@Override
public ItemStack getGardenSubstrate (IBlockAccess world, int x, int y, int z, int slot) {
return substrate;
}
@Override
protected int getSlot (World world, int x, int y, int z, EntityPlayer player, float hitX, float hitY, float hitZ) {
TileEntityWindowBox tileEntity = getTileEntity(world, x, y, z);
if (hitX <= .5) {
if (hitZ <= .5 && tileEntity.isSlotValid(Slot5Profile.SLOT_NW))
return Slot5Profile.SLOT_NW;
else if (tileEntity.isSlotValid(Slot5Profile.SLOT_SW))
return Slot5Profile.SLOT_SW;
}
else {
if (hitZ <= .5 && tileEntity.isSlotValid(Slot5Profile.SLOT_NE))
return Slot5Profile.SLOT_NE;
else if (tileEntity.isSlotValid(Slot5Profile.SLOT_SE))
return Slot5Profile.SLOT_SE;
}
return TileEntityGarden.SLOT_INVALID;
}
@Override
protected int getEmptySlotForPlant (World world, int x, int y, int z, EntityPlayer player, PlantItem plant, float hitX, float hitY, float hitZ) {
return getSlot(world, x, y, z, player, hitX, hitY, hitZ);
}
@Override
public TileEntityWindowBox createNewTileEntity (World var1, int var2) {
return new TileEntityWindowBox();
}
@Override
public int damageDropped (int meta) {
return meta;
}
@Override
public void addCollisionBoxesToList (World world, int x, int y, int z, AxisAlignedBB mask, List list, Entity colliding) {
TileEntityWindowBox te = getTileEntity(world, x, y, z);
boolean validNE = te.isSlotValid(Slot5Profile.SLOT_NE);
boolean validNW = te.isSlotValid(Slot5Profile.SLOT_NW);
boolean validSE = te.isSlotValid(Slot5Profile.SLOT_SE);
boolean validSW = te.isSlotValid(Slot5Profile.SLOT_SW);
float yMin = te.isUpper() ? .5f : 0;
float yMax = te.isUpper() ? 1 : .5f;
if (validNW) {
setBlockBounds(0, yMin, 0, .5f, yMax, .5f);
super.addCollisionBoxesToList(world, x, y, z, mask, list, colliding);
}
if (validNE) {
setBlockBounds(.5f, yMin, 0, 1, yMax, .5f);
super.addCollisionBoxesToList(world, x, y, z, mask, list, colliding);
}
if (validSW) {
setBlockBounds(0, yMin, .5f, .5f, yMax, 1);
super.addCollisionBoxesToList(world, x, y, z, mask, list, colliding);
}
if (validSE) {
setBlockBounds(.5f, yMin, .5f, 1, yMax, 1);
super.addCollisionBoxesToList(world, x, y, z, mask, list, colliding);
}
setBlockBounds(world, x, y, z, validNW, validNE, validSW, validSE);
}
@Override
public void setBlockBoundsBasedOnState (IBlockAccess world, int x, int y, int z) {
TileEntityWindowBox te = getTileEntity(world, x, y, z);
boolean validNE = te.isSlotValid(Slot5Profile.SLOT_NE);
boolean validNW = te.isSlotValid(Slot5Profile.SLOT_NW);
boolean validSE = te.isSlotValid(Slot5Profile.SLOT_SE);
boolean validSW = te.isSlotValid(Slot5Profile.SLOT_SW);
setBlockBounds(world, x, y, z, validNW, validNE, validSW, validSE);
}
private void setBlockBounds (IBlockAccess world, int x, int y, int z, boolean validNW, boolean validNE, boolean validSW, boolean validSE) {
TileEntityWindowBox te = getTileEntity(world, x, y, z);
float yMin = te.isUpper() ? .5f : 0;
float yMax = te.isUpper() ? 1 : .5f;
float xMin = (validNW || validSW) ? 0 : .5f;
float xMax = (validNE || validSE) ? 1 : .5f;
float zMin = (validNW || validNE) ? 0 : .5f;
float zMax = (validSW || validSE) ? 1 : .5f;
setBlockBounds(xMin, yMin, zMin, xMax, yMax, zMax);
}
@Override
public void onBlockPlacedBy (World world, int x, int y, int z, EntityLivingBase entity, ItemStack itemStack) {
TileEntityWindowBox te = (TileEntityWindowBox) world.getTileEntity(x, y, z);
if (te == null || te.getDirection() != 0)
return;
int quadrant = MathHelper.floor_double((entity.rotationYaw * 4f / 360f) + .5) & 3;
switch (quadrant) {
case 0:
te.setDirection(3);
break;
case 1:
te.setDirection(4);
break;
case 2:
te.setDirection(2);
break;
case 3:
te.setDirection(5);
break;
}
if (world.isRemote) {
te.invalidate();
world.markBlockForUpdate(x, y, z);
}
}
@Override
public boolean canHarvestBlock (EntityPlayer player, int meta) {
return true;
}
@Override
public void getSubBlocks (Item item, CreativeTabs creativeTabs, List blockList) {
for (int i = 0; i < 6; i++)
blockList.add(new ItemStack(item, 1, i));
}
@Override
public IIcon getIcon (int side, int meta) {
return Blocks.planks.getIcon(side, meta);
}
@Override
public IIcon getIcon (IBlockAccess world, int x, int y, int z, int side) {
return Blocks.planks.getIcon(world, x, y, z, side);
}
public String[] getSubTypes () {
return subTypes;
}
public TileEntityWindowBox getTileEntity (IBlockAccess world, int x, int y, int z) {
TileEntity te = world.getTileEntity(x, y, z);
return (te != null && te instanceof TileEntityWindowBox) ? (TileEntityWindowBox) te : null;
}
@Override
public void registerBlockIcons (IIconRegister register) { }
}