package net.glowstone.block.blocktype; import net.glowstone.block.GlowBlock; import net.glowstone.block.GlowBlockState; import net.glowstone.entity.GlowPlayer; import org.bukkit.DoublePlantSpecies; import org.bukkit.Material; import org.bukkit.block.BlockFace; import org.bukkit.inventory.ItemStack; import org.bukkit.material.DoublePlant; import org.bukkit.material.MaterialData; import java.util.Arrays; import java.util.Collection; import java.util.Collections; public class BlockDoublePlant extends BlockNeedsAttached implements IBlockGrowable { @Override public boolean canPlaceAt(GlowBlock block, BlockFace against) { final Material type = block.getRelative(BlockFace.DOWN).getType(); if ((type == Material.GRASS || type == Material.DIRT || type == Material.SOIL) && block.getRelative(BlockFace.UP).getType() == Material.AIR) { return true; } return false; } @Override public void afterPlace(GlowPlayer player, GlowBlock block, ItemStack holding, GlowBlockState oldState) { final GlowBlockState headBlockState = block.getRelative(BlockFace.UP).getState(); headBlockState.setType(Material.DOUBLE_PLANT); headBlockState.setData(new DoublePlant(DoublePlantSpecies.PLANT_APEX)); headBlockState.update(true); } @Override public Collection<ItemStack> getDrops(GlowBlock block, ItemStack tool) { final MaterialData data = block.getState().getData(); if (data instanceof DoublePlant) { final DoublePlantSpecies species = ((DoublePlant) data).getSpecies(); if (species != DoublePlantSpecies.DOUBLE_TALLGRASS && species != DoublePlantSpecies.LARGE_FERN && species != DoublePlantSpecies.PLANT_APEX) { return Collections.unmodifiableList(Arrays.asList(data.toItemStack(1))); } } else { warnMaterialData(DoublePlant.class, data); } return BlockDropless.EMPTY_STACK; } @Override public void blockDestroy(GlowPlayer player, GlowBlock block, BlockFace face) { final MaterialData data = block.getState().getData(); if (data instanceof DoublePlant) { block.setType(Material.AIR); block.setData((byte) 0); if (((DoublePlant) data).getSpecies() == DoublePlantSpecies.PLANT_APEX) { block = block.getRelative(BlockFace.DOWN); if (!(block.getState().getData() instanceof DoublePlant)) { return; } } else { block = block.getRelative(BlockFace.UP); if (!(block.getState().getData() instanceof DoublePlant)) { return; } } block.setType(Material.AIR); block.setData((byte) 0); } else { warnMaterialData(DoublePlant.class, data); } } @Override public boolean isFertilizable(GlowBlock block) { MaterialData data = block.getState().getData(); if (data instanceof DoublePlant) { if (((DoublePlant) data).getSpecies() == DoublePlantSpecies.PLANT_APEX) { data = block.getRelative(BlockFace.DOWN).getState().getData(); if (!(data instanceof DoublePlant)) { return false; } } final DoublePlantSpecies species = ((DoublePlant) data).getSpecies(); if (species != DoublePlantSpecies.DOUBLE_TALLGRASS && species != DoublePlantSpecies.LARGE_FERN) { return true; } } else { warnMaterialData(DoublePlant.class, data); } return false; } @Override public boolean canGrowWithChance(GlowBlock block) { return true; } @Override public void grow(GlowPlayer player, GlowBlock block) { MaterialData data = block.getState().getData(); if (data instanceof DoublePlant) { if (((DoublePlant) data).getSpecies() == DoublePlantSpecies.PLANT_APEX) { data = block.getRelative(BlockFace.DOWN).getState().getData(); if (!(data instanceof DoublePlant)) { return; } } final DoublePlantSpecies species = ((DoublePlant) data).getSpecies(); switch (species) { case SUNFLOWER: case LILAC: case ROSE_BUSH: case PEONY: block.getWorld().dropItemNaturally(block.getLocation(), new ItemStack(data.toItemStack(1))); break; default: break; } } else { warnMaterialData(DoublePlant.class, data); } } }