geforkt von Mirrors/FastAsyncWorldEdit
Fix #806
Dieser Commit ist enthalten in:
Ursprung
b450a0af80
Commit
798b4cdd4e
@ -120,7 +120,7 @@ public interface InputExtent {
|
|||||||
* @param position location
|
* @param position location
|
||||||
* @return the light level at the 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());
|
return getEmmittedLight(position.getX(), position.getY(), position.getZ());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,13 +24,21 @@ import com.sk89q.worldedit.extent.Extent;
|
|||||||
import com.sk89q.worldedit.function.LayerFunction;
|
import com.sk89q.worldedit.function.LayerFunction;
|
||||||
import com.sk89q.worldedit.math.BlockVector3;
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
import com.sk89q.worldedit.registry.state.BooleanProperty;
|
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.registry.state.Property;
|
||||||
import com.sk89q.worldedit.world.block.BlockState;
|
import com.sk89q.worldedit.world.block.BlockState;
|
||||||
import com.sk89q.worldedit.world.block.BlockTypes;
|
import com.sk89q.worldedit.world.block.BlockTypes;
|
||||||
|
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class SnowSimulator implements LayerFunction {
|
public class SnowSimulator implements LayerFunction {
|
||||||
|
|
||||||
public static final BooleanProperty snowy = (BooleanProperty) (Property<?>) BlockTypes.GRASS_BLOCK.getProperty("snowy");
|
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 ice = BlockTypes.ICE.getDefaultState();
|
||||||
private final BlockState snow = BlockTypes.SNOW.getDefaultState();
|
private final BlockState snow = BlockTypes.SNOW.getDefaultState();
|
||||||
@ -92,6 +100,7 @@ public class SnowSimulator implements LayerFunction {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Can't put snow this far up
|
// Can't put snow this far up
|
||||||
if (position.getBlockY() == this.extent.getMaximumPoint().getBlockY()) {
|
if (position.getBlockY() == this.extent.getMaximumPoint().getBlockY()) {
|
||||||
return false;
|
return false;
|
||||||
@ -103,6 +112,22 @@ public class SnowSimulator implements LayerFunction {
|
|||||||
// Can only replace air (or snow in stack mode)
|
// Can only replace air (or snow in stack mode)
|
||||||
if (!above.getBlockType().getMaterial().isAir() && (!stack || above.getBlockType() != BlockTypes.SNOW)) {
|
if (!above.getBlockType().getMaterial().isAir() && (!stack || above.getBlockType() != BlockTypes.SNOW)) {
|
||||||
return false;
|
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<Property<?>, 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) {
|
if (stack && above.getBlockType() == BlockTypes.SNOW) {
|
||||||
|
@ -20,37 +20,13 @@
|
|||||||
package com.sk89q.worldedit.internal.block;
|
package com.sk89q.worldedit.internal.block;
|
||||||
|
|
||||||
import com.sk89q.worldedit.world.block.BlockState;
|
import com.sk89q.worldedit.world.block.BlockState;
|
||||||
import com.sk89q.worldedit.world.registry.BlockRegistry;
|
|
||||||
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||||
|
|
||||||
import java.util.BitSet;
|
|
||||||
import java.util.OptionalInt;
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkState;
|
|
||||||
|
|
||||||
public final class BlockStateIdAccess {
|
public final class BlockStateIdAccess {
|
||||||
|
|
||||||
private static final int INVALID_ID = -1;
|
private static final int INVALID_ID = -1;
|
||||||
private static final int EXPECTED_BLOCK_COUNT = 2 << 13;
|
|
||||||
private static final Int2ObjectOpenHashMap<BlockState> 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.
|
* An invalid internal ID, for verification purposes.
|
||||||
@ -65,8 +41,7 @@ public final class BlockStateIdAccess {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static int getBlockStateId(BlockState holder) {
|
public static int getBlockStateId(BlockState holder) {
|
||||||
return holder.getOrdinal();
|
return holder.getInternalId();
|
||||||
//return blockStateInternalId.getInternalId(holder);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@ -74,39 +49,6 @@ public final class BlockStateIdAccess {
|
|||||||
return BlockState.getFromOrdinal(id);
|
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() {
|
private BlockStateIdAccess() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren