39 lines
1.2 KiB
Java
39 lines
1.2 KiB
Java
package games.dmg.spigotbase;
|
|
|
|
import org.bukkit.block.Block;
|
|
import org.bukkit.block.BlockFace;
|
|
import org.bukkit.block.data.Bisected;
|
|
import org.bukkit.block.data.type.Slab;
|
|
import org.bukkit.block.data.type.Stairs;
|
|
|
|
final class SpawnableBlockPolicy {
|
|
private SpawnableBlockPolicy() {
|
|
}
|
|
|
|
static boolean isCandidate(Block surface) {
|
|
if (!hasSpawnableTop(surface)) {
|
|
return false;
|
|
}
|
|
Block above = surface.getRelative(BlockFace.UP);
|
|
Block secondAbove = above.getRelative(BlockFace.UP);
|
|
return isEmpty(above)
|
|
&& isEmpty(secondAbove)
|
|
&& above.getLightFromBlocks() == 0
|
|
&& above.getLightFromSky() <= 7;
|
|
}
|
|
|
|
private static boolean hasSpawnableTop(Block block) {
|
|
if (block.getBlockData() instanceof Slab slab) {
|
|
return slab.getType() == Slab.Type.TOP || slab.getType() == Slab.Type.DOUBLE;
|
|
}
|
|
if (block.getBlockData() instanceof Stairs stairs) {
|
|
return stairs.getHalf() == Bisected.Half.TOP;
|
|
}
|
|
return block.getType().isOccluding();
|
|
}
|
|
|
|
private static boolean isEmpty(Block block) {
|
|
return block.isPassable() && !block.isLiquid();
|
|
}
|
|
}
|