package net.glowstone.block.blocktype; import net.glowstone.EventFactory; import net.glowstone.block.GlowBlock; import net.glowstone.block.GlowBlockState; import net.glowstone.entity.GlowPlayer; import org.bukkit.Material; import org.bukkit.TreeSpecies; import org.bukkit.block.BlockFace; import org.bukkit.event.block.BlockGrowEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.material.CocoaPlant; import org.bukkit.material.CocoaPlant.CocoaPlantSize; import org.bukkit.material.MaterialData; import org.bukkit.material.Tree; import org.bukkit.util.Vector; import java.util.Arrays; import java.util.Collection; import java.util.Collections; public class BlockCocoa extends BlockNeedsAttached implements IBlockGrowable { private static final BlockFace[] FACES = {BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST}; @Override public void placeBlock(GlowPlayer player, GlowBlockState state, BlockFace face, ItemStack holding, Vector clickedLoc) { state.setType(getMaterial()); final MaterialData data = state.getData(); if (data instanceof CocoaPlant) { final CocoaPlant cocoa = (CocoaPlant) data; cocoa.setFacingDirection(face.getOppositeFace()); cocoa.setSize(CocoaPlantSize.SMALL); } else { warnMaterialData(CocoaPlant.class, data); } } @Override protected BlockFace getAttachedFace(GlowBlock me) { return ((CocoaPlant) me.getState().getData()).getFacing(); } @Override public boolean canPlaceAt(GlowBlock block, BlockFace against) { final BlockFace face = against.getOppositeFace(); if (Arrays.asList(FACES).contains(face) && block.getRelative(face).getType() == Material.LOG) { final MaterialData data = block.getRelative(face).getState().getData(); if (data instanceof Tree) { if (((Tree) data).getSpecies() == TreeSpecies.JUNGLE) { return true; } } else { warnMaterialData(Tree.class, data); } } return false; } @Override public Collection<ItemStack> getDrops(GlowBlock block, ItemStack tool) { final MaterialData data = block.getState().getData(); if (data instanceof CocoaPlant) { int amount = 1; if (((CocoaPlant) data).getSize() == CocoaPlantSize.LARGE) { amount = 3; } return Collections.unmodifiableList(Arrays.asList(new ItemStack(Material.INK_SACK, amount, (short) 3))); } else { warnMaterialData(CocoaPlant.class, data); } return BlockDropless.EMPTY_STACK; } @Override public boolean isFertilizable(GlowBlock block) { final MaterialData data = block.getState().getData(); if (data instanceof CocoaPlant) { if (((CocoaPlant) data).getSize() != CocoaPlantSize.LARGE) { return true; } } else { warnMaterialData(CocoaPlant.class, data); } return false; } @Override public boolean canGrowWithChance(GlowBlock block) { return true; } @Override public boolean canTickRandomly() { return true; } @Override public void grow(GlowPlayer player, GlowBlock block) { final MaterialData data = block.getState().getData(); if (data instanceof CocoaPlant) { final CocoaPlant cocoa = (CocoaPlant) data; CocoaPlantSize size = cocoa.getSize(); if (size == CocoaPlantSize.SMALL) { cocoa.setSize(CocoaPlantSize.MEDIUM); } else if (size == CocoaPlantSize.MEDIUM) { cocoa.setSize(CocoaPlantSize.LARGE); } else { return; } final GlowBlockState state = block.getState(); state.setData(cocoa); BlockGrowEvent growEvent = new BlockGrowEvent(block, state); EventFactory.callEvent(growEvent); if (!growEvent.isCancelled()) { state.update(true); } } else { warnMaterialData(CocoaPlant.class, data); } } @Override public void updateBlock(GlowBlock block) { final MaterialData data = block.getState().getData(); if (data instanceof CocoaPlant) { final CocoaPlant cocoa = (CocoaPlant) data; final CocoaPlantSize size = cocoa.getSize(); if (size != CocoaPlantSize.LARGE && random.nextInt(5) == 0) { if (size == CocoaPlantSize.SMALL) { cocoa.setSize(CocoaPlantSize.MEDIUM); } else if (size == CocoaPlantSize.MEDIUM) { cocoa.setSize(CocoaPlantSize.LARGE); } else { return; } final GlowBlockState state = block.getState(); state.setData(cocoa); BlockGrowEvent growEvent = new BlockGrowEvent(block, state); EventFactory.callEvent(growEvent); if (!growEvent.isCancelled()) { state.update(true); } } } else { warnMaterialData(CocoaPlant.class, data); } } }