/** * Light can spread into a block if * - it is translucent, * - or the side isn't ful * <p> * {@inheritDoc} */ @Override public boolean canSpreadInto(Block block, Side side) { return block.isTranslucent() || !block.isFullSide(side); } }
/** * Light can spread out of a block if * - it has luminance (ie, glows), * - it is translucent * - or the side isn't full * <p> * {@inheritDoc} */ @Override public boolean canSpreadOutOf(Block block, Side side) { return block.getLuminance() > 0 || block.isTranslucent() || !block.isFullSide(side); }
/** * Light is more permissive if the block is changed to be translucent or has an open side, * otherwise is less permissive or identical. * <p> * {@inheritDoc} */ @Override public PropagationComparison comparePropagation(Block newBlock, Block oldBlock, Side side) { if (newBlock.isTranslucent() && oldBlock.isTranslucent()) { return PropagationComparison.IDENTICAL; } else if (newBlock.isTranslucent()) { if (oldBlock.isFullSide(side)) { return PropagationComparison.MORE_PERMISSIVE; } } else if (oldBlock.isTranslucent()) { if (newBlock.isFullSide(side)) { return PropagationComparison.MORE_RESTRICTED; } } else { boolean newBlocked = newBlock.isFullSide(side); boolean oldBlocked = oldBlock.isFullSide(side); if (newBlocked && !oldBlocked) { return PropagationComparison.MORE_RESTRICTED; } if (oldBlocked && !newBlocked) { return PropagationComparison.MORE_PERMISSIVE; } } return PropagationComparison.IDENTICAL; }
@Override public boolean isSufficientlySupported(Vector3i location, Map<Vector3i, Block> blockOverrides) { final Block block = getBlockWithOverrides(location, blockOverrides); if (block.isSupportRequired()) { final Vector3i bottomLocation = Side.BOTTOM.getAdjacentPos(location); return !getWorldProvider().isBlockRelevant(bottomLocation) || getBlockWithOverrides(bottomLocation, blockOverrides).isFullSide(Side.TOP); } return true; }
/** * Returns true if the side should be rendered adjacent to the second side provided. * * @param blockToCheck The block to check * @param currentBlock The current block * @return True if the side is visible for the given block types */ private boolean isSideVisibleForBlockTypes(Block blockToCheck, Block currentBlock, Side side) { // Liquids can be transparent but there should be no visible adjacent faces if (currentBlock.isLiquid() && blockToCheck.isLiquid()) { return false; } return currentBlock.isWaving() != blockToCheck.isWaving() || blockToCheck.getMeshGenerator() == null || !blockToCheck.isFullSide(side.reverse()) || (!currentBlock.isTranslucent() && blockToCheck.isTranslucent()); }