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);
}
}
}