package com.jaquadro.minecraft.gardencontainers.block;
import com.InfinityRaider.AgriCraft.api.v1.ISoilContainer;
import com.jaquadro.minecraft.gardencontainers.GardenContainers;
import com.jaquadro.minecraft.gardencontainers.block.tile.TileEntityLargePot;
import com.jaquadro.minecraft.gardencontainers.config.PatternConfig;
import com.jaquadro.minecraft.gardencontainers.core.ClientProxy;
import com.jaquadro.minecraft.gardencore.api.block.IChainAttachable;
import com.jaquadro.minecraft.gardencore.api.block.IGardenBlock;
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.BlockGardenContainer;
import com.jaquadro.minecraft.gardencore.block.support.*;
import com.jaquadro.minecraft.gardencore.block.tile.TileEntityGarden;
import com.jaquadro.minecraft.gardencore.core.ModBlocks;
import com.jaquadro.minecraft.gardencore.core.ModCreativeTabs;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.*;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.IIcon;
import net.minecraft.util.Vec3;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.EnumPlantType;
import net.minecraftforge.common.IPlantable;
import net.minecraftforge.common.util.ForgeDirection;
import cpw.mods.fml.common.Optional;
import java.util.ArrayList;
import java.util.List;
@Optional.Interface(modid = "AgriCraft", iface = "com.InfinityRaider.AgriCraft.api.v1.ISoilContainer")
public abstract class BlockLargePot extends BlockGardenContainer implements IChainAttachable, ISoilContainer
{
private class LocalSlotProfile extends Slot14ProfileBounded
{
public LocalSlotProfile (IGardenBlock garden, Slot[] slots) {
super(garden, slots);
}
@Override
public float getPlantOffsetY (IBlockAccess blockAccess, int x, int y, int z, int slot) {
return -.0625f;
}
@Override
public Object openPlantGUI (InventoryPlayer playerInventory, TileEntity gardenTile, boolean client) {
if (gardenTile instanceof TileEntityGarden && ((TileEntityGarden)gardenTile).getSubstrate() == null)
return null;
return super.openPlantGUI(playerInventory, gardenTile, client);
}
}
@SideOnly(Side.CLIENT)
private IIcon[] iconOverlayArray;
public BlockLargePot (String blockName) {
super(blockName, Material.clay);
setCreativeTab(ModCreativeTabs.tabGardenCore);
setHardness(.5f);
setResistance(5f);
setStepSound(Block.soundTypeStone);
connectionProfile = new ContainerConnectionProfile();
slotShareProfile = new SlotShare8Profile(Slot14Profile.SLOT_TOP_LEFT, Slot14Profile.SLOT_TOP,
Slot14Profile.SLOT_TOP_RIGHT, Slot14Profile.SLOT_RIGHT, Slot14Profile.SLOT_BOTTOM_RIGHT,
Slot14Profile.SLOT_BOTTOM, Slot14Profile.SLOT_BOTTOM_LEFT, Slot14Profile.SLOT_LEFT);
PlantType[] commonType = new PlantType[] { PlantType.GROUND, PlantType.AQUATIC_COVER, PlantType.AQUATIC_SURFACE};
PlantSize[] commonSize = new PlantSize[] { PlantSize.LARGE, PlantSize.MEDIUM, PlantSize.SMALL };
PlantSize[] allSize = new PlantSize[] { PlantSize.FULL, PlantSize.LARGE, PlantSize.MEDIUM, PlantSize.SMALL };
slotProfile = new LocalSlotProfile(this, new LocalSlotProfile.Slot[] {
new BasicSlotProfile.Slot(Slot14Profile.SLOT_CENTER, commonType, allSize),
new BasicSlotProfile.Slot(Slot14Profile.SLOT_COVER, new PlantType[] { PlantType.GROUND_COVER}, allSize),
new BasicSlotProfile.Slot(Slot14Profile.SLOT_NW, commonType, commonSize),
new BasicSlotProfile.Slot(Slot14Profile.SLOT_NE, commonType, commonSize),
new BasicSlotProfile.Slot(Slot14Profile.SLOT_SW, commonType, commonSize),
new BasicSlotProfile.Slot(Slot14Profile.SLOT_SE, commonType, commonSize),
new BasicSlotProfile.Slot(Slot14Profile.SLOT_TOP_LEFT, commonType, commonSize),
new BasicSlotProfile.Slot(Slot14Profile.SLOT_TOP, commonType, commonSize),
new BasicSlotProfile.Slot(Slot14Profile.SLOT_TOP_RIGHT, commonType, commonSize),
new BasicSlotProfile.Slot(Slot14Profile.SLOT_RIGHT, commonType, commonSize),
new BasicSlotProfile.Slot(Slot14Profile.SLOT_BOTTOM_RIGHT, commonType, commonSize),
new BasicSlotProfile.Slot(Slot14Profile.SLOT_BOTTOM, commonType, commonSize),
new BasicSlotProfile.Slot(Slot14Profile.SLOT_BOTTOM_LEFT, commonType, commonSize),
new BasicSlotProfile.Slot(Slot14Profile.SLOT_LEFT, commonType, commonSize),
});
}
public abstract String[] getSubTypes ();
@Override
public int getDefaultSlot () {
return Slot14Profile.SLOT_CENTER;
}
@Override
protected int getSlot (World world, int x, int y, int z, EntityPlayer player, float hitX, float hitY, float hitZ) {
return Slot14Profile.SLOT_CENTER;
}
@Override
protected int getEmptySlotForPlant (World world, int x, int y, int z, EntityPlayer player, PlantItem plant) {
TileEntityGarden garden = getTileEntity(world, x, y, z);
if (plant.getPlantTypeClass() == PlantType.GROUND_COVER)
return garden.getStackInSlot(Slot14Profile.SLOT_COVER) == null ? Slot14Profile.SLOT_COVER : SLOT_INVALID;
if (plant.getPlantSizeClass() == PlantSize.FULL)
return garden.getStackInSlot(Slot14Profile.SLOT_CENTER) == null ? Slot14Profile.SLOT_CENTER : SLOT_INVALID;
if (garden.getStackInSlot(Slot14Profile.SLOT_CENTER) == null)
return Slot14Profile.SLOT_CENTER;
if (plant.getPlantSizeClass() == PlantSize.SMALL) {
for (int slot : new int[] { Slot14Profile.SLOT_NE, Slot14Profile.SLOT_SW, Slot14Profile.SLOT_NW, Slot14Profile.SLOT_SE }) {
if (garden.getStackInSlot(slot) == null)
return slot;
}
}
for (int slot : new int[] { Slot14Profile.SLOT_LEFT, Slot14Profile.SLOT_RIGHT, Slot14Profile.SLOT_TOP,
Slot14Profile.SLOT_BOTTOM, Slot14Profile.SLOT_TOP_LEFT, Slot14Profile.SLOT_BOTTOM_RIGHT,
Slot14Profile.SLOT_TOP_RIGHT, Slot14Profile.SLOT_BOTTOM_LEFT }) {
if (!garden.isSlotValid(slot))
continue;
if (garden.getStackInSlot(slot) == null)
return slot;
}
return SLOT_INVALID;
}
@Override
public void addCollisionBoxesToList (World world, int x, int y, int z, AxisAlignedBB mask, List list, Entity colliding) {
float dim = .0625f;
TileEntityLargePot te = getTileEntity(world, x, y, z);
if (te == null || te.getSubstrate() == null || !isSubstrateSolid(te.getSubstrate().getItem()))
setBlockBounds(0, 0, 0, 1, dim, 1);
else
setBlockBounds(0, 0, 0, 1, 1 - dim, 1);
super.addCollisionBoxesToList(world, x, y, z, mask, list, colliding);
if (!te.isAttachedNeighbor(x - 1, y, z)) {
setBlockBounds(0, 0, 0, dim, 1, 1);
super.addCollisionBoxesToList(world, x, y, z, mask, list, colliding);
}
if (!te.isAttachedNeighbor(x, y, z - 1)) {
setBlockBounds(0, 0, 0, 1, 1, dim);
super.addCollisionBoxesToList(world, x, y, z, mask, list, colliding);
}
if (!te.isAttachedNeighbor(x + 1, y, z)) {
setBlockBounds(1 - dim, 0, 0, 1, 1, 1);
super.addCollisionBoxesToList(world, x, y, z, mask, list, colliding);
}
if (!te.isAttachedNeighbor(x, y, z + 1)) {
setBlockBounds(0, 0, 1 - dim, 1, 1, 1);
super.addCollisionBoxesToList(world, x, y, z, mask, list, colliding);
}
setBlockBoundsForItemRender();
}
@Override
public void setBlockBoundsForItemRender () {
setBlockBounds(0, 0, 0, 1, 1, 1);
}
@Override
public boolean isOpaqueCube () {
return false;
}
@Override
public boolean renderAsNormalBlock () {
return false;
}
@Override
public int getRenderType () {
return ClientProxy.largePotRenderID;
}
@Override
public int getRenderBlockPass () {
return 1;
}
@Override
public boolean canRenderInPass (int pass) {
ClientProxy.renderPass = pass;
return true;
}
@Override
public boolean isSideSolid (IBlockAccess world, int x, int y, int z, ForgeDirection side) {
return side != ForgeDirection.UP;
}
@Override
public boolean shouldSideBeRendered (IBlockAccess blockAccess, int x, int y, int z, int side) {
int nx = x;
int nz = z;
switch (side) {
case 0:
y++;
break;
case 1:
y--;
break;
case 2:
z++;
break;
case 3:
z--;
break;
case 4:
x++;
break;
case 5:
x--;
break;
}
if (side >= 2 && side < 6) {
TileEntityGarden te = getTileEntity(blockAccess, x, y, z);
if (te != null)
return !te.isAttachedNeighbor(nx, y, nz);
}
return side != 1;
}
@Override
public ArrayList<ItemStack> getDrops (World world, int x, int y, int z, int metadata, int fortune) {
TileEntityLargePot te = getTileEntity(world, x, y, z);
ArrayList<ItemStack> items = new ArrayList<ItemStack>();
int count = quantityDropped(metadata, fortune, world.rand);
for (int i = 0; i < count; i++) {
Item item = getItemDropped(metadata, world.rand, fortune);
int packedMeta = metadata | ((te != null) ? te.getCarving() << 8 : 0);
if (item != null)
items.add(new ItemStack(item, 1, packedMeta));
}
return items;
}
@Override
public boolean removedByPlayer (World world, EntityPlayer player, int x, int y, int z, boolean willHarvest) {
if (willHarvest)
return true;
return super.removedByPlayer(world, player, x, y, z, willHarvest);
}
@Override
public void harvestBlock (World world, EntityPlayer player, int x, int y, int z, int meta) {
super.harvestBlock(world, player, x, y, z, meta);
world.setBlockToAir(x, y, z);
}
private boolean isSubstrateSolid (Item item) {
Block block = Block.getBlockFromItem(item);
return block != Blocks.water;
}
@Override
public boolean canSustainPlant (IBlockAccess world, int x, int y, int z, ForgeDirection direction, IPlantable plantable) {
TileEntityGarden gardenTile = getTileEntity(world, x, y, z);
EnumPlantType plantType = plantable.getPlantType(world, x, y, z);
if (plantType == EnumPlantType.Crop)
return substrateSupportsCrops(gardenTile.getSubstrate());
return false;
}
protected boolean substrateSupportsCrops (ItemStack substrate) {
if (substrate == null || substrate.getItem() == null)
return false;
if (Block.getBlockFromItem(substrate.getItem()) == ModBlocks.gardenFarmland)
return true;
if (Block.getBlockFromItem(substrate.getItem()) == Blocks.farmland)
return true;
return false;
}
@Override
protected boolean applySubstrateToGarden (World world, int x, int y, int z, EntityPlayer player, int slot, ItemStack itemStack) {
if (getGardenSubstrate(world, x, y, z, slot) != null)
return false;
if (itemStack.getItem() == Items.water_bucket) {
TileEntityGarden garden = getTileEntity(world, x, y, z);
garden.setSubstrate(new ItemStack(Blocks.water));
garden.markDirty();
if (player != null && !player.capabilities.isCreativeMode)
player.inventory.setInventorySlotContents(player.inventory.currentItem, new ItemStack(Items.bucket));
world.markBlockForUpdate(x, y, z);
return true;
}
return super.applySubstrateToGarden(world, x, y, z, player, slot, itemStack);
}
@Override
protected boolean applyItemToGarden (World world, int x, int y, int z, EntityPlayer player, ItemStack itemStack, float hitX, float hitY, float hitZ, boolean hitValid) {
ItemStack item = (itemStack == null) ? player.inventory.getCurrentItem() : itemStack;
if (item == null)
return false;
TileEntityGarden garden = getTileEntity(world, x, y, z);
if (garden.getSubstrate() != null) {
if (item.getItem() == Items.bucket) {
if (Block.getBlockFromItem(garden.getSubstrate().getItem()) == Blocks.water) {
player.inventory.setInventorySlotContents(player.inventory.currentItem, new ItemStack(Items.water_bucket));
garden.setSubstrate(null);
garden.markDirty();
world.markBlockForUpdate(x, y, z);
}
return true;
}
if (item.getItem() == Items.water_bucket) {
applyWaterToSubstrate(world, x, y, z, garden, player);
return true;
}
else if (item.getItem() instanceof ItemHoe) {
applyHoeToSubstrate(world, x, y, z, garden, player);
return true;
}
}
return super.applyItemToGarden(world, x, y, z, player, itemStack, hitX, hitY, hitZ, hitValid);
}
protected void applyWaterToSubstrate (World world, int x, int y, int z, TileEntityGarden tile, EntityPlayer player) {
if (Block.getBlockFromItem(tile.getSubstrate().getItem()) == Blocks.dirt) {
tile.setSubstrate(new ItemStack(Blocks.farmland, 1, 7), new ItemStack(Blocks.dirt, 1, tile.getSubstrate().getItemDamage()));
tile.markDirty();
world.markBlockForUpdate(x, y, z);
}
}
protected boolean applyHoeToSubstrate (World world, int x, int y, int z, TileEntityGarden tile, EntityPlayer player) {
Block substrate = Block.getBlockFromItem(tile.getSubstrate().getItem());
if (substrate == Blocks.dirt || substrate == Blocks.grass)
tile.setSubstrate(new ItemStack(Blocks.farmland, 1, 7), new ItemStack(Blocks.dirt, 1, tile.getSubstrate().getItemDamage()));
else if (substrate == ModBlocks.gardenSoil)
tile.setSubstrate(new ItemStack(ModBlocks.gardenFarmland), new ItemStack(ModBlocks.gardenSoil));
else
return false;
tile.markDirty();
world.markBlockForUpdate(x, y, z);
world.playSoundEffect(x + .5f, y + .5f, z + .5f, Blocks.farmland.stepSound.getStepResourcePath(),
(Blocks.farmland.stepSound.getVolume() + 1) / 2f, Blocks.farmland.stepSound.getPitch() * .8f);
return true;
}
@Override
public boolean applyHoe (World world, int x, int y, int z) {
TileEntityGarden te = getTileEntity(world, x, y, z);
if (te != null && te.isEmpty())
return applyHoeToSubstrate(world, x, y, z, te, null);
return false;
}
@Override
public TileEntityLargePot getTileEntity (IBlockAccess world, int x, int y, int z) {
TileEntity te = world.getTileEntity(x, y, z);
return (te != null && te instanceof TileEntityLargePot) ? (TileEntityLargePot) te : null;
}
@Override
public TileEntityLargePot createNewTileEntity (World world, int data) {
return new TileEntityLargePot();
}
private static final Vec3[] chainAttachPoints = new Vec3[] {
Vec3.createVectorHelper(.03125 + .005, 1, .03125), Vec3.createVectorHelper(.03125, 1, 1 - .03125 - .005),
Vec3.createVectorHelper(1 - .03125, 1, .03125 + .005), Vec3.createVectorHelper(1 - .03125 - .005, 1, 1 - .03125),
};
@Override
public Vec3[] getChainAttachPoints (int side) {
if (side == 1)
return chainAttachPoints;
return null;
}
@SideOnly(Side.CLIENT)
public IIcon getOverlayIcon (int data) {
if (iconOverlayArray[data] != null)
return iconOverlayArray[data];
return null;
}
@SideOnly(Side.CLIENT)
@Override
public void registerBlockIcons (IIconRegister iconRegister) {
iconOverlayArray = new IIcon[256];
for (int i = 1; i < iconOverlayArray.length; i++) {
PatternConfig pattern = GardenContainers.config.getPattern(i);
if (pattern != null && pattern.getOverlay() != null)
iconOverlayArray[i] = iconRegister.registerIcon(GardenContainers.MOD_ID + ":" + pattern.getOverlay());
}
}
/** ISoilContainer methods */
@Override
public Block getSoil(World world, int x, int y, int z) {
ItemStack substrate = this.getGardenSubstrate(world, x, y, z, getDefaultSlot());
if(substrate == null || substrate.getItem()== null || !(substrate.getItem() instanceof ItemBlock)) {
return null;
}
return ((ItemBlock) substrate.getItem()).field_150939_a;
}
@Override
public int getSoilMeta(World world, int x, int y, int z) {
ItemStack substrate = this.getGardenSubstrate(world, x, y, z, getDefaultSlot());
if(substrate == null || substrate.getItem()== null || !(substrate.getItem() instanceof ItemBlock)) {
return -1;
}
return substrate.getItemDamage();
}
}