With "queueing" enabled, FAWE may start attempting to place chunks before the operation is finished.

This is unnacceptable for recursive operations, thus the queue should be disable in these cases
Fixes #842
This commit is contained in:
dordsor21 2021-01-11 15:06:55 +00:00
parent fa8660c7a9
commit ddb41a9669
No known key found for this signature in database
GPG Key ID: 1E53E88969FFCF0B
2 changed files with 30 additions and 20 deletions

View File

@ -26,30 +26,25 @@ public abstract class CharBlocks implements IBlocks {
return true;
}
};
protected static final Section EMPTY = new Section() {
protected final Section EMPTY = new Section() {
@Override
public final char[] get(CharBlocks blocks, int layer) {
blocks.loadLock.lock();
try {
char[] arr = blocks.blocks[layer];
public final synchronized char[] get(CharBlocks blocks, int layer) {
char[] arr = blocks.blocks[layer];
if (arr == null) {
arr = blocks.blocks[layer] = blocks.update(layer, null);
if (arr == null) {
arr = blocks.blocks[layer] = blocks.update(layer, null);
if (arr == null) {
throw new IllegalStateException("Array cannot be null: " + blocks.getClass());
}
} else {
blocks.blocks[layer] = blocks.update(layer, arr);
if (blocks.blocks[layer] == null) {
throw new IllegalStateException("Array cannot be null (update): " + blocks.getClass());
}
throw new IllegalStateException("Array cannot be null: " + blocks.getClass());
}
if (blocks.blocks[layer] != null) {
blocks.sections[layer] = FULL;
} else {
blocks.blocks[layer] = blocks.update(layer, arr);
if (blocks.blocks[layer] == null) {
throw new IllegalStateException("Array cannot be null (update): " + blocks.getClass());
}
return arr;
} finally {
blocks.loadLock.unlock();
}
if (blocks.blocks[layer] != null) {
blocks.sections[layer] = FULL;
}
return arr;
}
@Override
@ -59,7 +54,6 @@ public abstract class CharBlocks implements IBlocks {
};
public final char[][] blocks;
public final Section[] sections;
private final ReentrantLock loadLock = new ReentrantLock ();
public CharBlocks() {
blocks = new char[16][];

View File

@ -1179,6 +1179,10 @@ public class EditSession extends PassthroughExtent implements AutoCloseable {
// Pick how we're going to visit blocks
RecursiveVisitor visitor = new DirectionalVisitor(mask, replace, origin, direction, (int) (radius * 2 + 1));
// With queue enabled, FAWE may start attempting to place chunks before the operation is finished.
// This is unnacceptable for recursive operations.
disableQueue();
// Start at the origin
visitor.visit(origin);
@ -1237,6 +1241,10 @@ public class EditSession extends PassthroughExtent implements AutoCloseable {
visitor = new DownwardVisitor(mask, replace, origin.getBlockY(), (int) (radius * 2 + 1));
}
// With queue enabled, FAWE may start attempting to place chunks before the operation is finished.
// This is unnacceptable for recursive operations.
disableQueue();
// Start at the origin
visitor.visit(origin);
@ -1717,6 +1725,10 @@ public class EditSession extends PassthroughExtent implements AutoCloseable {
}
RecursiveVisitor visitor = new RecursiveVisitor(mask, replace, (int) (radius * 2 + 1));
// With queue enabled, FAWE may start attempting to place chunks before the operation is finished.
// This is unnacceptable for recursive operations.
disableQueue();
// Around the origin in a 3x3 block
for (BlockVector3 position : CuboidRegion.fromCenter(origin, 1)) {
if (mask.test(position)) {
@ -1758,6 +1770,10 @@ public class EditSession extends PassthroughExtent implements AutoCloseable {
BlockReplace replace = new BlockReplace(this, fluid.getDefaultState());
NonRisingVisitor visitor = new NonRisingVisitor(mask, replace);
// With queue enabled, FAWE may start attempting to place chunks before the operation is finished.
// This is unnacceptable for recursive operations.
disableQueue();
// Around the origin in a 3x3 block
for (BlockVector3 position : CuboidRegion.fromCenter(origin, 1)) {
if (liquidMask.test(position)) {