diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/InputExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/InputExtent.java index 3d3b695c7..4b5e4c7cf 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/InputExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/InputExtent.java @@ -120,7 +120,7 @@ public interface InputExtent { * @param position location * @return the light level at the location */ - default int getEmmittedLight(MutableBlockVector3 position) { + default int getEmmittedLight(BlockVector3 position) { return getEmmittedLight(position.getX(), position.getY(), position.getZ()); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/SnowSimulator.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/SnowSimulator.java index 6dc337cb9..5fa40ca69 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/SnowSimulator.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/block/SnowSimulator.java @@ -24,13 +24,21 @@ import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.LayerFunction; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.registry.state.BooleanProperty; +import com.sk89q.worldedit.registry.state.EnumProperty; import com.sk89q.worldedit.registry.state.Property; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockTypes; +import java.util.Locale; +import java.util.Map; + public class SnowSimulator implements LayerFunction { public static final BooleanProperty snowy = (BooleanProperty) (Property) BlockTypes.GRASS_BLOCK.getProperty("snowy"); + private static final EnumProperty slab = (EnumProperty) (Property) BlockTypes.SANDSTONE_SLAB.getProperty("type"); + private static final EnumProperty stair = (EnumProperty) (Property) BlockTypes.SANDSTONE_STAIRS.getProperty("half"); + private static final EnumProperty trapdoor = (EnumProperty) (Property) BlockTypes.ACACIA_TRAPDOOR.getProperty("half"); + private static final BooleanProperty trapdoorOpen = (BooleanProperty) (Property) BlockTypes.ACACIA_TRAPDOOR.getProperty("open"); private final BlockState ice = BlockTypes.ICE.getDefaultState(); private final BlockState snow = BlockTypes.SNOW.getDefaultState(); @@ -92,6 +100,7 @@ public class SnowSimulator implements LayerFunction { return false; } + // Can't put snow this far up if (position.getBlockY() == this.extent.getMaximumPoint().getBlockY()) { return false; @@ -103,6 +112,22 @@ public class SnowSimulator implements LayerFunction { // Can only replace air (or snow in stack mode) if (!above.getBlockType().getMaterial().isAir() && (!stack || above.getBlockType() != BlockTypes.SNOW)) { return false; + } else if (!block.getBlockType().getId().toLowerCase(Locale.ROOT).contains("ice") && this.extent.getEmmittedLight(abovePosition) > 10) { + return false; + } else if (!block.getBlockType().getMaterial().isFullCube()) { + Map, Object> states = block.getStates(); + if (states.containsKey(slab) && block.getState(slab).equalsIgnoreCase("bottom")) { + return false; + } else if (states.containsKey(trapdoorOpen) && states.containsKey(trapdoor) && (block.getState(trapdoorOpen) + || block.getState(trapdoor).equalsIgnoreCase("bottom"))) { + return false; + } else if (states.containsKey(stair) && block.getState(stair).equalsIgnoreCase("bottom")) { + return false; + } else { + return false; + } + } else if (!block.getBlockType().getId().toLowerCase(Locale.ROOT).contains("ice") && block.getBlockType().getMaterial().isTranslucent()) { + return false; } if (stack && above.getBlockType() == BlockTypes.SNOW) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/block/BlockStateIdAccess.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/block/BlockStateIdAccess.java index bcffdc98f..aa88cfe14 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/block/BlockStateIdAccess.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/block/BlockStateIdAccess.java @@ -20,37 +20,13 @@ package com.sk89q.worldedit.internal.block; import com.sk89q.worldedit.world.block.BlockState; -import com.sk89q.worldedit.world.registry.BlockRegistry; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import java.util.BitSet; -import java.util.OptionalInt; import javax.annotation.Nullable; -import static com.google.common.base.Preconditions.checkState; - public final class BlockStateIdAccess { private static final int INVALID_ID = -1; - private static final int EXPECTED_BLOCK_COUNT = 2 << 13; - private static final Int2ObjectOpenHashMap TO_STATE = - new Int2ObjectOpenHashMap<>(EXPECTED_BLOCK_COUNT); - - static { - TO_STATE.defaultReturnValue(null); - } - - public interface BlockStateInternalId { - int getInternalId(BlockState blockState); - - void setInternalId(BlockState blockState, int internalId); - } - - private static BlockStateInternalId blockStateInternalId; - - public static void setBlockStateInternalId(BlockStateInternalId blockStateInternalId) { - BlockStateIdAccess.blockStateInternalId = blockStateInternalId; - } /** * An invalid internal ID, for verification purposes. @@ -65,8 +41,7 @@ public final class BlockStateIdAccess { } public static int getBlockStateId(BlockState holder) { - return holder.getOrdinal(); - //return blockStateInternalId.getInternalId(holder); + return holder.getInternalId(); } @Nullable @@ -74,39 +49,6 @@ public final class BlockStateIdAccess { return BlockState.getFromOrdinal(id); } - /** - * For platforms that don't have an internal ID system, - * {@link BlockRegistry#getInternalBlockStateId(BlockState)} will return - * {@link OptionalInt#empty()}. In those cases, we will use our own ID system, - * since it's useful for other entries as well. - * - * @return an unused ID in WorldEdit's ID tracker - */ - private static int provideUnusedWorldEditId() { - return usedIds.nextClearBit(0); - } - - private static final BitSet usedIds = new BitSet(); - - public static void register(BlockState blockState, int id) { - int i = isValidInternalId(id) ? id : provideUnusedWorldEditId(); - BlockState existing = getBlockStateById(id); - checkState(existing == null || existing == blockState, - "BlockState %s is using the same block ID (%s) as BlockState %s", - blockState, i, existing); - blockStateInternalId.setInternalId(blockState, i); - TO_STATE.put(i, blockState); - usedIds.set(i); - } - - public static void clear() { - for (BlockState value : TO_STATE.values()) { - blockStateInternalId.setInternalId(value, invalidId()); - } - TO_STATE.clear(); - usedIds.clear(); - } - private BlockStateIdAccess() { }