package tc.oc.pgm.fallingblocks; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.BlockState; import tc.oc.pgm.filters.Filter; import tc.oc.pgm.filters.query.BlockQuery; import tc.oc.commons.bukkit.util.Materials; import javax.annotation.Nullable; public class FallingBlocksRule { public static final int DEFAULT_DELAY = 2; public final Filter fall; public final Filter stick; public final int delay; public FallingBlocksRule(Filter fall, Filter stick, int delay) { this.fall = fall; this.stick = stick; this.delay = delay; } public boolean canFall(Block block) { return this.canFall(block.getState()); } public boolean canFall(BlockState block) { // Can't spawn falling air blocks return block.getMaterial() != Material.AIR && fall.query(new BlockQuery(block)) .toBoolean(block.getMaterial().hasGravity()); } public boolean canSupport(BlockState supporter) { return supporter.getMaterial() != Material.AIR && stick.query(new BlockQuery(supporter)).isAllowed(); } public boolean canSupport(Block supporter) { // Supportive air would be pointless since nothing could ever fall return supporter.getType() != Material.AIR && stick.query(new BlockQuery(supporter)).isAllowed(); } /** * Test if the given block is supportive from the given direction, * either because this rule makes the block sticky, or because it's * a solid block supporting from below. */ public boolean canSupport(@Nullable Block supporter, BlockFace from) { if(supporter == null || supporter.getType() == Material.AIR) return false; if(from == BlockFace.DOWN && Materials.canSupportBlocks(supporter.getType())) return true; return canSupport(supporter); } @Override public String toString() { return this.getClass().getSimpleName() + "{fall=" + this.fall + " stick=" + this.stick + " delay=" + this.delay + "}"; } }