mirror of
https://github.com/plexusorg/Plex-FAWE.git
synced 2025-07-01 10:56:42 +00:00
idk, messing around with region filtering
This commit is contained in:
@ -16,7 +16,6 @@ import javax.annotation.Nullable;
|
||||
import static com.sk89q.worldedit.world.block.BlockTypes.states;
|
||||
public class CharFilterBlock extends ChunkFilterBlock {
|
||||
private CharGetBlocks get;
|
||||
|
||||
private IChunkSet set;
|
||||
|
||||
private char[] getArr;
|
||||
@ -43,7 +42,7 @@ public class CharFilterBlock extends ChunkFilterBlock {
|
||||
public void flood(final IChunkGet iget, final IChunkSet iset, final int layer, Flood flood, FilterBlockMask mask) {
|
||||
final int maxDepth = flood.getMaxDepth();
|
||||
final boolean checkDepth = maxDepth < Character.MAX_VALUE;
|
||||
if (init(iget, iset, layer)) {
|
||||
if (init(iget, iset, layer) != null) {
|
||||
while ((index = flood.poll()) != -1) {
|
||||
x = index & 15;
|
||||
z = (index >> 4) & 15;
|
||||
@ -62,10 +61,11 @@ public class CharFilterBlock extends ChunkFilterBlock {
|
||||
}
|
||||
}
|
||||
|
||||
private final boolean init(final IChunkGet iget, final IChunkSet iset, final int layer) {
|
||||
@Override
|
||||
public final ChunkFilterBlock init(final IChunkGet iget, final IChunkSet iset, final int layer) {
|
||||
this.layer = layer;
|
||||
final CharGetBlocks get = (CharGetBlocks) iget;
|
||||
if (!get.hasSection(layer)) return false;
|
||||
if (!get.hasSection(layer)) return null;
|
||||
this.set = iset;
|
||||
getArr = get.sections[layer].get(get, layer);
|
||||
if (set.hasSection(layer)) {
|
||||
@ -76,29 +76,44 @@ public class CharFilterBlock extends ChunkFilterBlock {
|
||||
setArr = null;
|
||||
}
|
||||
this.yy = layer << 4;
|
||||
return true;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void filter(final IChunkGet iget, final IChunkSet iset, final int layer, final Filter filter, final @Nullable Region region, BlockVector3 min, BlockVector3 max) {
|
||||
if (init(iget, iset, layer)) {
|
||||
if (region == null) {
|
||||
if (min != null && max != null) {
|
||||
iterate(min, max, layer, filter);
|
||||
} else {
|
||||
iterate(filter);
|
||||
}
|
||||
} else {
|
||||
if (min != null && max != null) {
|
||||
iterate(region, min, max, layer, filter);
|
||||
} else {
|
||||
iterate(region, filter);
|
||||
public void filter(Filter filter, int x, int y, int z) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
this.index = x | (z << 4) | (y << 8);
|
||||
filter.applyBlock(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void filter(Filter filter, int yStart, int yEnd) {
|
||||
for (y = yStart, index = (yStart << 8); y < yEnd; y++) {
|
||||
for (z = 0; z < 16; z++) {
|
||||
for (x = 0; x < 16; x++, index++) {
|
||||
filter.applyBlock(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void iterate(final Region region, final Filter filter) {
|
||||
@Override
|
||||
public void filter(Filter filter, int minX, int minY, int minZ, int maxX, int maxY, int maxZ) {
|
||||
int yis = (minY << 8);
|
||||
int zis = (minZ << 4);
|
||||
for (y = minY, index = yis; y <= maxY; y++) {
|
||||
for (z = minZ, index += zis; z <= maxZ; z++) {
|
||||
for (x = minX, index += minX; x <= maxX; x++, index++) {
|
||||
filter.applyBlock(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void filter(final Filter filter, final Region region) {
|
||||
for (y = 0, index = 0; y < 16; y++) {
|
||||
int absY = yy + y;
|
||||
for (z = 0; z < 16; z++) {
|
||||
@ -113,51 +128,8 @@ public class CharFilterBlock extends ChunkFilterBlock {
|
||||
}
|
||||
}
|
||||
|
||||
private void iterate(final Region region, BlockVector3 min, BlockVector3 max, int layer, final Filter filter) {
|
||||
int by = Math.max(min.getY(), layer << 4) & 15;
|
||||
int ty = Math.min(max.getY(), 15 + (layer << 4)) & 15;
|
||||
int bx = min.getX();
|
||||
int bz = min.getZ();
|
||||
int tx = max.getX();
|
||||
int tz = max.getZ();
|
||||
for (y = by; y <= ty; y++) {
|
||||
int yIndex = (y << 8);
|
||||
int absY = yy + y;
|
||||
for (z = bz; z <= tz; z++) {
|
||||
int zIndex = yIndex + ((z) << 4);
|
||||
int absZ = zz + z;
|
||||
for (x = bx; x <= tx; x++) {
|
||||
index = zIndex + x;
|
||||
int absX = xx + x;
|
||||
if (region.contains(absX, absY, absZ)) {
|
||||
filter.applyBlock(this);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void iterate(BlockVector3 min, BlockVector3 max, int layer, final Filter filter) {
|
||||
int by = Math.max(min.getY(), layer << 4) & 15;
|
||||
int ty = Math.min(max.getY(), 15 + (layer << 4)) & 15;
|
||||
int bx = min.getX();
|
||||
int bz = min.getZ();
|
||||
int tx = max.getX();
|
||||
int tz = max.getZ();
|
||||
for (y = by; y <= ty; y++) {
|
||||
int yIndex = (y << 8);
|
||||
for (z = bz; z <= tz; z++) {
|
||||
int zIndex = yIndex + ((z) << 4);
|
||||
for (x = bx; x <= tx; x++) {
|
||||
index = zIndex + x;
|
||||
filter.applyBlock(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private final void iterate(final Filter filter) {
|
||||
@Override
|
||||
public final void filter(final Filter filter) {
|
||||
for (y = 0, index = 0; y < 16; y++) {
|
||||
for (z = 0; z < 16; z++) {
|
||||
for (x = 0; x < 16; x++, index++) {
|
||||
|
@ -13,7 +13,18 @@ public abstract class ChunkFilterBlock extends SimpleFilterBlock {
|
||||
|
||||
public abstract ChunkFilterBlock init(int X, int Z, IChunkGet chunk);
|
||||
|
||||
public abstract ChunkFilterBlock init(final IChunkGet iget, final IChunkSet iset, final int layer);
|
||||
|
||||
public abstract void flood(final IChunkGet iget, final IChunkSet iset, final int layer, Flood flood, FilterBlockMask mask);
|
||||
|
||||
public abstract void filter(IChunkGet get, IChunkSet set, int layer, Filter filter, @Nullable Region region, BlockVector3 min, BlockVector3 max);
|
||||
|
||||
public abstract void filter(Filter filter, int x, int y, int z);
|
||||
|
||||
public abstract void filter(Filter filter, int minX, int minY, int minZ, int maxX, int maxY, int maxZ);
|
||||
|
||||
public abstract void filter(Filter filter);
|
||||
|
||||
public abstract void filter(Filter filter, int yStart, int yEnd);
|
||||
|
||||
public abstract void filter(final Filter filter, final Region region);
|
||||
}
|
||||
|
@ -6,5 +6,5 @@ package com.boydti.fawe.beta;
|
||||
public interface IBlocks extends Trimable {
|
||||
boolean hasSection(int layer);
|
||||
|
||||
void reset();
|
||||
IChunkSet reset();
|
||||
}
|
@ -71,7 +71,7 @@ public interface IChunk<T extends Future<T>> extends Trimable, Callable<T> {
|
||||
* @param unitialized a mutable block vector (buffer)
|
||||
* @param unitialized2 a mutable block vector (buffer)
|
||||
*/
|
||||
void filterBlocks(Filter filter, ChunkFilterBlock block, @Nullable Region region, MutableBlockVector3 unitialized, MutableBlockVector3 unitialized2);
|
||||
void filterBlocks(Filter filter, ChunkFilterBlock block, @Nullable Region region);
|
||||
|
||||
void flood(Flood flood, FilterBlockMask mask, ChunkFilterBlock block);
|
||||
|
||||
|
@ -8,8 +8,6 @@ import com.sk89q.worldedit.world.block.BlockState;
|
||||
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
@ -43,7 +41,7 @@ public interface IChunkSet extends IBlocks, OutputExtent {
|
||||
Set<UUID> getEntityRemoves();
|
||||
|
||||
@Override
|
||||
void reset();
|
||||
IChunkSet reset();
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
|
@ -3,7 +3,6 @@ package com.boydti.fawe.beta;
|
||||
import com.sk89q.jnbt.CompoundTag;
|
||||
import com.sk89q.worldedit.extent.Extent;
|
||||
import com.sk89q.worldedit.math.BlockVector3;
|
||||
import com.sk89q.worldedit.math.MutableBlockVector3;
|
||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
|
@ -1,14 +1,6 @@
|
||||
package com.boydti.fawe.beta;
|
||||
|
||||
import com.sk89q.jnbt.CompoundTag;
|
||||
import com.sk89q.worldedit.extent.Extent;
|
||||
import com.sk89q.worldedit.math.BlockVector3;
|
||||
import com.sk89q.worldedit.regions.Region;
|
||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
import com.sk89q.worldedit.world.block.BlockTypes;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public abstract class SimpleFilterBlock extends FilterBlock {
|
||||
private final Extent extent;
|
||||
|
@ -0,0 +1,113 @@
|
||||
package com.boydti.fawe.beta.implementation;
|
||||
|
||||
import com.boydti.fawe.beta.IChunkSet;
|
||||
import com.sk89q.jnbt.CompoundTag;
|
||||
import com.sk89q.worldedit.WorldEditException;
|
||||
import com.sk89q.worldedit.function.operation.Operation;
|
||||
import com.sk89q.worldedit.math.BlockVector2;
|
||||
import com.sk89q.worldedit.math.BlockVector3;
|
||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
public interface DelegateChunkSet extends IChunkSet {
|
||||
IChunkSet getParent();
|
||||
|
||||
@Override
|
||||
default boolean setBiome(int x, int y, int z, BiomeType biome) {
|
||||
return getParent().setBiome(x, y, z, biome);
|
||||
}
|
||||
|
||||
@Override
|
||||
default boolean setBlock(int x, int y, int z, BlockStateHolder holder) {
|
||||
return getParent().setBlock(x, y, z, holder);
|
||||
}
|
||||
|
||||
@Override
|
||||
default boolean isEmpty() {
|
||||
return getParent().isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
default void setTile(int x, int y, int z, CompoundTag tile) {
|
||||
getParent().setTile(x, y, z, tile);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void setEntity(CompoundTag tag) {
|
||||
getParent().setEntity(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void removeEntity(UUID uuid) {
|
||||
getParent().removeEntity(uuid);
|
||||
}
|
||||
|
||||
@Override
|
||||
default BlockState getBlock(int x, int y, int z) {
|
||||
return getParent().getBlock(x, y, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
default char[] getArray(int layer) {
|
||||
return getParent().getArray(layer);
|
||||
}
|
||||
|
||||
@Override
|
||||
default BiomeType[] getBiomes() {
|
||||
return getParent().getBiomes();
|
||||
}
|
||||
|
||||
@Override
|
||||
default Map<Short, CompoundTag> getTiles() {
|
||||
return getParent().getTiles();
|
||||
}
|
||||
|
||||
@Override
|
||||
default Set<CompoundTag> getEntities() {
|
||||
return getParent().getEntities();
|
||||
}
|
||||
|
||||
@Override
|
||||
default Set<UUID> getEntityRemoves() {
|
||||
return getParent().getEntityRemoves();
|
||||
}
|
||||
|
||||
@Override
|
||||
default IChunkSet reset() {
|
||||
IChunkSet parent = getParent();
|
||||
parent.reset();
|
||||
return parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
default Operation commit() {
|
||||
return getParent().commit();
|
||||
}
|
||||
|
||||
@Override
|
||||
default boolean hasSection(int layer) {
|
||||
return getParent().hasSection(layer);
|
||||
}
|
||||
|
||||
@Override
|
||||
default boolean trim(boolean aggressive) {
|
||||
return getParent().trim(aggressive);
|
||||
}
|
||||
|
||||
@Override
|
||||
default <T extends BlockStateHolder<T>> boolean setBlock(BlockVector3 position, T block) throws WorldEditException {
|
||||
return getParent().setBlock(position, block);
|
||||
}
|
||||
|
||||
@Override
|
||||
default boolean setBiome(BlockVector2 position, BiomeType biome) {
|
||||
return getParent().setBiome(position, biome);
|
||||
}
|
||||
}
|
@ -1,6 +1,7 @@
|
||||
package com.boydti.fawe.beta.implementation.blocks;
|
||||
|
||||
import com.boydti.fawe.beta.IBlocks;
|
||||
import com.boydti.fawe.beta.IChunkSet;
|
||||
|
||||
public class CharBlocks implements IBlocks {
|
||||
public final char[][] blocks;
|
||||
@ -9,14 +10,14 @@ public class CharBlocks implements IBlocks {
|
||||
public CharBlocks() {
|
||||
blocks = new char[16][];
|
||||
sections = new Section[16];
|
||||
for (int i = 0; i < 16; i++) sections[i] = NULL;
|
||||
for (int i = 0; i < 16; i++) sections[i] = EMPTY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean trim(final boolean aggressive) {
|
||||
boolean result = true;
|
||||
for (int i = 0; i < 16; i++) {
|
||||
if (sections[i] == NULL) {
|
||||
if (sections[i] == EMPTY) {
|
||||
blocks[i] = null;
|
||||
} else {
|
||||
result = false;
|
||||
@ -26,12 +27,13 @@ public class CharBlocks implements IBlocks {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
for (int i = 0; i < 16; i++) sections[i] = NULL;
|
||||
public IChunkSet reset() {
|
||||
for (int i = 0; i < 16; i++) sections[i] = EMPTY;
|
||||
return null;
|
||||
}
|
||||
|
||||
public void reset(final int layer) {
|
||||
sections[layer] = NULL;
|
||||
sections[layer] = EMPTY;
|
||||
}
|
||||
|
||||
public char[] load(final int layer) {
|
||||
@ -84,7 +86,7 @@ public class CharBlocks implements IBlocks {
|
||||
}
|
||||
}
|
||||
|
||||
public static final Section NULL = new Section() {
|
||||
public static final Section EMPTY = new Section() {
|
||||
@Override
|
||||
public final char[] get(final CharBlocks blocks, final int layer) {
|
||||
blocks.sections[layer] = FULL;
|
||||
|
@ -1,6 +1,7 @@
|
||||
package com.boydti.fawe.beta.implementation.blocks;
|
||||
|
||||
import com.boydti.fawe.beta.IChunkGet;
|
||||
import com.boydti.fawe.beta.IChunkSet;
|
||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
import com.sk89q.worldedit.world.block.BlockTypes;
|
||||
@ -19,14 +20,15 @@ public abstract class CharGetBlocks extends CharBlocks implements IChunkGet {
|
||||
@Override
|
||||
public boolean trim(final boolean aggressive) {
|
||||
for (int i = 0; i < 16; i++) {
|
||||
sections[i] = NULL;
|
||||
sections[i] = EMPTY;
|
||||
blocks[i] = null;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
public IChunkSet reset() {
|
||||
super.reset();
|
||||
return null;
|
||||
}
|
||||
}
|
@ -102,11 +102,12 @@ public class CharSetBlocks extends CharBlocks implements IChunkSet {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
public IChunkSet reset() {
|
||||
biomes = null;
|
||||
tiles = null;
|
||||
entities = null;
|
||||
entityRemoves = null;
|
||||
super.reset();
|
||||
return null;
|
||||
}
|
||||
}
|
@ -0,0 +1,77 @@
|
||||
package com.boydti.fawe.beta.implementation.blocks;
|
||||
|
||||
import com.boydti.fawe.FaweCache;
|
||||
import com.boydti.fawe.beta.IChunkSet;
|
||||
import com.boydti.fawe.beta.implementation.DelegateChunkSet;
|
||||
import com.sk89q.jnbt.CompoundTag;
|
||||
import com.sk89q.worldedit.regions.Region;
|
||||
import com.sk89q.worldedit.world.biome.BiomeType;
|
||||
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
||||
|
||||
public class RegionCharSetBlocks implements DelegateChunkSet {
|
||||
private final Region region;
|
||||
private final CharSetBlocks parent;
|
||||
private final int X, Z;
|
||||
|
||||
public RegionCharSetBlocks(Region region, int X, int Z, CharSetBlocks parent) {
|
||||
this.region = region;
|
||||
this.parent = parent;
|
||||
this.X = X;
|
||||
this.Z = Z;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSetBlocks getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
public Region getRegion() {
|
||||
return region;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setBiome(int x, int y, int z, BiomeType biome) {
|
||||
if (region.contains(x, y, z)) {
|
||||
return parent.setBiome(x, y, z, biome);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static final CharBlocks.Section EMPTY_REGION = new CharBlocks.Section() {
|
||||
@Override
|
||||
public final char[] get(final CharBlocks blocks, final int layer) {
|
||||
RegionCharSetBlocks checked = (RegionCharSetBlocks) blocks;
|
||||
Region region = checked.getRegion();
|
||||
|
||||
blocks.sections[layer] = FULL;
|
||||
char[] arr = blocks.blocks[layer];
|
||||
if (arr == null) {
|
||||
arr = blocks.blocks[layer] = blocks.load(layer);
|
||||
} else {
|
||||
blocks.blocks[layer] = blocks.load(layer, arr);
|
||||
}
|
||||
return arr;
|
||||
}
|
||||
};
|
||||
|
||||
public static final CharBlocks.Section NULL = new CharBlocks.Section() {
|
||||
@Override
|
||||
public final char[] get(final CharBlocks blocks, final int layer) {
|
||||
return FaweCache.EMPTY_CHAR_4096;
|
||||
}
|
||||
};
|
||||
|
||||
// EMPTY_CHAR_4096
|
||||
|
||||
@Override
|
||||
public boolean setBlock(final int x, final int y, final int z, final BlockStateHolder holder) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTile(final int x, final int y, final int z, final CompoundTag tile) {
|
||||
if (region.contains(x, y, z)) {
|
||||
super.setTile(x, y, z, tile);
|
||||
}
|
||||
}
|
||||
}
|
@ -2,16 +2,15 @@ package com.boydti.fawe.beta.implementation.holder;
|
||||
|
||||
import com.boydti.fawe.beta.ChunkFilterBlock;
|
||||
import com.boydti.fawe.beta.Filter;
|
||||
import com.boydti.fawe.beta.FilterBlock;
|
||||
import com.boydti.fawe.beta.FilterBlockMask;
|
||||
import com.boydti.fawe.beta.Flood;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.beta.implementation.blocks.CharSetBlocks;
|
||||
import com.boydti.fawe.beta.IChunk;
|
||||
import com.boydti.fawe.beta.IChunkGet;
|
||||
import com.boydti.fawe.beta.IChunkSet;
|
||||
import com.boydti.fawe.beta.IQueueExtent;
|
||||
import com.boydti.fawe.beta.implementation.SingleThreadQueueExtent;
|
||||
import com.boydti.fawe.beta.implementation.WorldChunkCache;
|
||||
import com.boydti.fawe.beta.implementation.blocks.CharSetBlocks;
|
||||
import com.boydti.fawe.util.MathMan;
|
||||
import com.sk89q.worldedit.math.MutableBlockVector3;
|
||||
import com.sk89q.worldedit.regions.Region;
|
||||
@ -47,39 +46,20 @@ public abstract class ChunkHolder implements IChunk, Supplier<IChunkGet> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void filterBlocks(final Filter filter, ChunkFilterBlock block, @Nullable Region region, @Nullable final MutableBlockVector3 min, @Nullable final MutableBlockVector3 max) {
|
||||
public void filterBlocks(final Filter filter, ChunkFilterBlock block, @Nullable Region region) {
|
||||
final IChunkGet get = getOrCreateGet();
|
||||
final IChunkSet set = getOrCreateSet();
|
||||
try {
|
||||
if (region != null) {
|
||||
switch (region.getChunkBounds(X, Z, min, max)) {
|
||||
case NONE:
|
||||
return;
|
||||
case FULL:
|
||||
if (min.getY() == 0 && max.getY() == 255) {
|
||||
break;
|
||||
}
|
||||
case PARTIAL:
|
||||
region = null;
|
||||
case CHECKED:
|
||||
default: {
|
||||
int minLayer = min.getY() >> 4;
|
||||
int maxLayer = max.getY() >> 4;
|
||||
block = block.init(X, Z, get);
|
||||
for (int layer = minLayer; layer <= maxLayer; layer++) {
|
||||
if (!get.hasSection(layer) || !filter.appliesLayer(this, layer)) continue;
|
||||
block.filter(get, set, layer, filter, region, min, max);
|
||||
}
|
||||
return;
|
||||
}
|
||||
region.filter(this, filter, block, get, set);
|
||||
} else {
|
||||
block = block.init(X, Z, get);
|
||||
for (int layer = 0; layer < 16; layer++) {
|
||||
if (!get.hasSection(layer) || !filter.appliesLayer(this, layer)) continue;
|
||||
block.init(get, set, layer);
|
||||
block.filter(filter);
|
||||
}
|
||||
}
|
||||
|
||||
block = block.init(X, Z, get);
|
||||
for (int layer = 0; layer < 16; layer++) {
|
||||
if (!get.hasSection(layer) || !filter.appliesLayer(this, layer)) continue;
|
||||
block.filter(get, set, layer, filter, region, null, null);
|
||||
}
|
||||
} finally {
|
||||
filter.finishChunk(this);
|
||||
}
|
||||
|
Reference in New Issue
Block a user