Merge branch 'v6' into v7

This commit is contained in:
Alexander Brandes 2022-05-18 22:13:29 +02:00
commit 396a1575d2
No known key found for this signature in database
GPG Key ID: 158F5701A6AAD00C
18 changed files with 213 additions and 70 deletions

View File

@ -14,6 +14,6 @@ jobs:
if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }} if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: release-drafter/release-drafter@v5.19.0 - uses: release-drafter/release-drafter@v5
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

2
.gitignore vendored
View File

@ -133,3 +133,5 @@ classes/
*.bat *.bat
docs/ docs/
build/ build/
.DS_Store

View File

@ -1,4 +0,0 @@
jdkVersion = "17"
build = "gradle clean build -x test"
tools = ["findsecbugs", "ErrorProne", "Semgrep", "Detekt", "Infer"]
ignoreRules = ["CatchAndPrintStackTrace", "ReferenceEquality", "FallThrough", "FutureReturnValueIgnored", "MixedMutabilityReturnType", "EmptyCatch", "MissingCasesInEnumSwitch", "OperatorPrecedence", "StaticAssignmentInConstructor", "ReferenceEquality", "EqualsHashCode", "EqualsGetClass", "TypeParameterUnusedInFormals", "StringSplitter", "InlineMeSuggester", "NULL_DEREFERENCE"]

View File

@ -25,7 +25,11 @@
*/ */
package com.plotsquared.bukkit.generator; package com.plotsquared.bukkit.generator;
import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.generator.AugmentedUtils; import com.plotsquared.core.generator.AugmentedUtils;
import com.plotsquared.core.queue.QueueCoordinator;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldedit.util.SideEffectSet;
import org.bukkit.Chunk; import org.bukkit.Chunk;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.generator.BlockPopulator; import org.bukkit.generator.BlockPopulator;
@ -52,7 +56,14 @@ public class BukkitAugmentedGenerator extends BlockPopulator {
@Override @Override
public void populate(@NonNull World world, @NonNull Random random, @NonNull Chunk source) { public void populate(@NonNull World world, @NonNull Random random, @NonNull Chunk source) {
AugmentedUtils.generate(source, world.getName(), source.getX(), source.getZ(), null); QueueCoordinator queue = PlotSquared.platform().globalBlockQueue().getNewQueue(BukkitAdapter.adapt(world));
// The chunk is already loaded and we do not want to load the chunk in "fully" by using any PaperLib methods.
queue.setForceSync(true);
queue.setSideEffectSet(SideEffectSet.none());
queue.setBiomesEnabled(false);
queue.setChunkObject(source);
AugmentedUtils.generateChunk(world.getName(), source.getX(), source.getZ(), queue);
queue.enqueue();
} }
} }

View File

@ -168,6 +168,7 @@ public class EntityEventListener implements Listener {
case "RAID": case "RAID":
case "SHEARED": case "SHEARED":
case "SILVERFISH_BLOCK": case "SILVERFISH_BLOCK":
case "ENDER_PEARL":
case "TRAP": case "TRAP":
case "VILLAGE_DEFENSE": case "VILLAGE_DEFENSE":
case "VILLAGE_INVASION": case "VILLAGE_INVASION":

View File

@ -198,6 +198,7 @@ public class PaperListener implements Listener {
case "RAID": case "RAID":
case "SHEARED": case "SHEARED":
case "SILVERFISH_BLOCK": case "SILVERFISH_BLOCK":
case "ENDER_PEARL":
case "TRAP": case "TRAP":
case "VILLAGE_DEFENSE": case "VILLAGE_DEFENSE":
case "VILLAGE_INVASION": case "VILLAGE_INVASION":

View File

@ -76,10 +76,11 @@ public final class BukkitChunkCoordinator extends ChunkCoordinator {
private final int totalSize; private final int totalSize;
private final AtomicInteger expectedSize; private final AtomicInteger expectedSize;
private final AtomicInteger loadingChunks = new AtomicInteger(); private final AtomicInteger loadingChunks = new AtomicInteger();
private final boolean forceSync;
private int batchSize; private int batchSize;
private PlotSquaredTask task; private PlotSquaredTask task;
private boolean shouldCancel; private volatile boolean shouldCancel;
private boolean finished; private boolean finished;
@Inject @Inject
@ -92,7 +93,8 @@ public final class BukkitChunkCoordinator extends ChunkCoordinator {
@Assisted final @NonNull Runnable whenDone, @Assisted final @NonNull Runnable whenDone,
@Assisted final @NonNull Consumer<Throwable> throwableConsumer, @Assisted final @NonNull Consumer<Throwable> throwableConsumer,
@Assisted final boolean unloadAfter, @Assisted final boolean unloadAfter,
@Assisted final @NonNull Collection<ProgressSubscriber> progressSubscribers @Assisted final @NonNull Collection<ProgressSubscriber> progressSubscribers,
@Assisted final boolean forceSync
) { ) {
this.requestedChunks = new LinkedBlockingQueue<>(requestedChunks); this.requestedChunks = new LinkedBlockingQueue<>(requestedChunks);
this.availableChunks = new LinkedBlockingQueue<>(); this.availableChunks = new LinkedBlockingQueue<>();
@ -107,14 +109,27 @@ public final class BukkitChunkCoordinator extends ChunkCoordinator {
this.plugin = JavaPlugin.getPlugin(BukkitPlatform.class); this.plugin = JavaPlugin.getPlugin(BukkitPlatform.class);
this.bukkitWorld = Bukkit.getWorld(world.getName()); this.bukkitWorld = Bukkit.getWorld(world.getName());
this.progressSubscribers.addAll(progressSubscribers); this.progressSubscribers.addAll(progressSubscribers);
this.forceSync = forceSync;
} }
@Override @Override
public void start() { public void start() {
if (!forceSync) {
// Request initial batch // Request initial batch
this.requestBatch(); this.requestBatch();
// Wait until next tick to give the chunks a chance to be loaded // Wait until next tick to give the chunks a chance to be loaded
TaskManager.runTaskLater(() -> task = TaskManager.runTaskRepeat(this, TaskTime.ticks(1)), TaskTime.ticks(1)); TaskManager.runTaskLater(() -> task = TaskManager.runTaskRepeat(this, TaskTime.ticks(1)), TaskTime.ticks(1));
} else {
try {
while (!shouldCancel && !requestedChunks.isEmpty()) {
chunkConsumer.accept(requestedChunks.poll());
}
} catch (Throwable t) {
throwableConsumer.accept(t);
} finally {
finish();
}
}
} }
@Override @Override
@ -131,7 +146,9 @@ public final class BukkitChunkCoordinator extends ChunkCoordinator {
for (final ProgressSubscriber subscriber : this.progressSubscribers) { for (final ProgressSubscriber subscriber : this.progressSubscribers) {
subscriber.notifyEnd(); subscriber.notifyEnd();
} }
if (task != null) {
task.cancel(); task.cancel();
}
finished = true; finished = true;
} }
} }

View File

@ -63,10 +63,27 @@ import java.util.function.Consumer;
public class BukkitQueueCoordinator extends BasicQueueCoordinator { public class BukkitQueueCoordinator extends BasicQueueCoordinator {
private final SideEffectSet noSideEffectSet; private static final SideEffectSet NO_SIDE_EFFECT_SET;
private final SideEffectSet lightingSideEffectSet; private static final SideEffectSet EDGE_SIDE_EFFECT_SET;
private final SideEffectSet edgeSideEffectSet; private static final SideEffectSet LIGHTING_SIDE_EFFECT_SET;
private final SideEffectSet edgeLightingSideEffectSet; private static final SideEffectSet EDGE_LIGHTING_SIDE_EFFECT_SET;
static {
NO_SIDE_EFFECT_SET = SideEffectSet.none().with(SideEffect.LIGHTING, SideEffect.State.OFF).with(
SideEffect.NEIGHBORS,
SideEffect.State.OFF
);
EDGE_SIDE_EFFECT_SET = SideEffectSet.none().with(SideEffect.UPDATE, SideEffect.State.ON).with(
SideEffect.NEIGHBORS,
SideEffect.State.ON
);
LIGHTING_SIDE_EFFECT_SET = SideEffectSet.none().with(SideEffect.NEIGHBORS, SideEffect.State.OFF);
EDGE_LIGHTING_SIDE_EFFECT_SET = SideEffectSet.none().with(SideEffect.UPDATE, SideEffect.State.ON).with(
SideEffect.NEIGHBORS,
SideEffect.State.ON
);
}
private org.bukkit.World bukkitWorld; private org.bukkit.World bukkitWorld;
@Inject @Inject
private ChunkCoordinatorBuilderFactory chunkCoordinatorBuilderFactory; private ChunkCoordinatorBuilderFactory chunkCoordinatorBuilderFactory;
@ -77,19 +94,6 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator {
@Inject @Inject
public BukkitQueueCoordinator(@NonNull World world) { public BukkitQueueCoordinator(@NonNull World world) {
super(world); super(world);
noSideEffectSet = SideEffectSet.none().with(SideEffect.LIGHTING, SideEffect.State.OFF).with(
SideEffect.NEIGHBORS,
SideEffect.State.OFF
);
lightingSideEffectSet = SideEffectSet.none().with(SideEffect.NEIGHBORS, SideEffect.State.OFF);
edgeSideEffectSet = noSideEffectSet.with(SideEffect.UPDATE, SideEffect.State.ON).with(
SideEffect.NEIGHBORS,
SideEffect.State.ON
);
edgeLightingSideEffectSet = noSideEffectSet.with(SideEffect.UPDATE, SideEffect.State.ON).with(
SideEffect.NEIGHBORS,
SideEffect.State.ON
);
} }
@Override @Override
@ -202,7 +206,7 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator {
localChunk.getTiles().forEach((blockVector3, tag) -> { localChunk.getTiles().forEach((blockVector3, tag) -> {
try { try {
BaseBlock block = getWorld().getBlock(blockVector3).toBaseBlock(tag); BaseBlock block = getWorld().getBlock(blockVector3).toBaseBlock(tag);
getWorld().setBlock(blockVector3, block, noSideEffectSet); getWorld().setBlock(blockVector3, block, getSideEffectSet(SideEffectState.NONE));
} catch (WorldEditException ignored) { } catch (WorldEditException ignored) {
StateWrapper sw = new StateWrapper(tag); StateWrapper sw = new StateWrapper(tag);
sw.restoreTag(getWorld().getName(), blockVector3.getX(), blockVector3.getY(), blockVector3.getZ()); sw.restoreTag(getWorld().getName(), blockVector3.getX(), blockVector3.getY(), blockVector3.getZ());
@ -259,9 +263,9 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator {
} }
SideEffectSet sideEffectSet; SideEffectSet sideEffectSet;
if (lighting) { if (lighting) {
sideEffectSet = edge ? edgeLightingSideEffectSet : lightingSideEffectSet; sideEffectSet = getSideEffectSet(edge ? SideEffectState.EDGE_LIGHTING : SideEffectState.LIGHTING);
} else { } else {
sideEffectSet = edge ? edgeSideEffectSet : noSideEffectSet; sideEffectSet = getSideEffectSet(edge ? SideEffectState.EDGE : SideEffectState.NONE);
} }
getWorld().setBlock(loc, block, sideEffectSet); getWorld().setBlock(loc, block, sideEffectSet);
} catch (WorldEditException ignored) { } catch (WorldEditException ignored) {
@ -382,4 +386,23 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator {
return false; return false;
} }
private SideEffectSet getSideEffectSet(SideEffectState state) {
if (getSideEffectSet() != null) {
return getSideEffectSet();
}
return switch (state) {
case NONE -> NO_SIDE_EFFECT_SET;
case EDGE -> EDGE_SIDE_EFFECT_SET;
case LIGHTING -> LIGHTING_SIDE_EFFECT_SET;
case EDGE_LIGHTING -> EDGE_LIGHTING_SIDE_EFFECT_SET;
};
}
private enum SideEffectState {
NONE,
EDGE,
LIGHTING,
EDGE_LIGHTING
}
} }

View File

@ -76,7 +76,7 @@ public class BukkitSetupUtils extends SetupUtils {
@Override @Override
public void updateGenerators(final boolean force) { public void updateGenerators(final boolean force) {
if (!SetupUtils.generators.isEmpty() && !force) { if (loaded && !SetupUtils.generators.isEmpty() && !force) {
return; return;
} }
String testWorld = "CheckingPlotSquaredGenerator"; String testWorld = "CheckingPlotSquaredGenerator";
@ -100,6 +100,7 @@ public class BukkitSetupUtils extends SetupUtils {
e.printStackTrace(); e.printStackTrace();
} }
} }
loaded = true;
} }
@Override @Override

View File

@ -54,12 +54,23 @@ public class AugmentedUtils {
enabled = true; enabled = true;
} }
public static boolean generate( /**
@Nullable Object chunkObject, * Generate an augmented world chunk at the given location. If a queue is given, the data will be written to it, else a new
* queue will be created and written to world. Returns true if generation occurred.
*
* @param world World name to generate data for. Must be a PlotSquared world containing one or more areas else nothing will
* happen.
* @param chunkX Chunk X position
* @param chunkZ Chunk Z position
* @param queue Queue to write to, if desired.
* @return true if generation occurred.
* @since 6.8.0
*/
public static boolean generateChunk(
final @NonNull String world, final @NonNull String world,
final int chunkX, final int chunkX,
final int chunkZ, final int chunkZ,
QueueCoordinator queue @Nullable QueueCoordinator queue
) { ) {
if (!enabled) { if (!enabled) {
return false; return false;
@ -97,9 +108,6 @@ public class AugmentedUtils {
.platform() .platform()
.worldUtil() .worldUtil()
.getWeWorld(world)); .getWeWorld(world));
if (chunkObject != null) {
queue.setChunkObject(chunkObject);
}
} }
QueueCoordinator primaryMask; QueueCoordinator primaryMask;
// coordinates // coordinates
@ -157,13 +165,9 @@ public class AugmentedUtils {
} }
generationResult = true; generationResult = true;
} }
if (chunkObject != null) {
primaryMask.setChunkObject(chunkObject);
}
if (chunkObject != null) {
secondaryMask.setChunkObject(chunkObject);
}
// This queue should not be enqueued as it is simply used to restrict block setting, and then delegate to the
// actual queue
ScopedQueueCoordinator scoped = ScopedQueueCoordinator scoped =
new ScopedQueueCoordinator( new ScopedQueueCoordinator(
secondaryMask, secondaryMask,
@ -172,8 +176,6 @@ public class AugmentedUtils {
); );
generator.generateChunk(scoped, area); generator.generateChunk(scoped, area);
generator.populateChunk(scoped, area); generator.populateChunk(scoped, area);
scoped.setForceSync(true);
scoped.enqueue();
} }
if (enqueue) { if (enqueue) {
queue.enqueue(); queue.enqueue();
@ -181,4 +183,19 @@ public class AugmentedUtils {
return generationResult; return generationResult;
} }
/**
* @deprecated Use {@link AugmentedUtils#generateChunk(String, int, int, QueueCoordinator)} as chunkObject is not required
* in the above method
*/
@Deprecated(forRemoval = true, since = "6.8.0")
public static boolean generate(
@Nullable Object chunkObject,
final @NonNull String world,
final int chunkX,
final int chunkZ,
QueueCoordinator queue
) {
return generateChunk(world, chunkX, chunkZ, queue);
}
} }

View File

@ -34,6 +34,7 @@ import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector2;
import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.util.SideEffectSet;
import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.biome.BiomeType;
import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BaseBlock;
@ -61,6 +62,7 @@ public abstract class BasicQueueCoordinator extends QueueCoordinator {
private int lastX = Integer.MIN_VALUE; private int lastX = Integer.MIN_VALUE;
private int lastZ = Integer.MIN_VALUE; private int lastZ = Integer.MIN_VALUE;
private boolean settingBiomes = false; private boolean settingBiomes = false;
private boolean disableBiomes = false;
private boolean settingTiles = false; private boolean settingTiles = false;
private boolean regen = false; private boolean regen = false;
private int[] regenStart; private int[] regenStart;
@ -68,7 +70,8 @@ public abstract class BasicQueueCoordinator extends QueueCoordinator {
private CuboidRegion regenRegion = null; private CuboidRegion regenRegion = null;
private Consumer<BlockVector2> consumer = null; private Consumer<BlockVector2> consumer = null;
private boolean unloadAfter = true; private boolean unloadAfter = true;
private Runnable whenDone; private Runnable whenDone = null;
private SideEffectSet sideEffectSet = null;
@Nullable @Nullable
private LightingMode lightingMode = LightingMode.valueOf(Settings.QUEUE.LIGHTING_MODE); private LightingMode lightingMode = LightingMode.valueOf(Settings.QUEUE.LIGHTING_MODE);
@ -120,6 +123,9 @@ public abstract class BasicQueueCoordinator extends QueueCoordinator {
@SuppressWarnings("removal") @SuppressWarnings("removal")
@Override @Override
public boolean setBiome(int x, int z, @NonNull BiomeType biomeType) { public boolean setBiome(int x, int z, @NonNull BiomeType biomeType) {
if (disableBiomes) {
return false;
}
LocalChunk chunk = getChunk(x >> 4, z >> 4); LocalChunk chunk = getChunk(x >> 4, z >> 4);
for (int y = world.getMinY(); y <= world.getMaxY(); y++) { for (int y = world.getMinY(); y <= world.getMaxY(); y++) {
chunk.setBiome(x & 15, y, z & 15, biomeType); chunk.setBiome(x & 15, y, z & 15, biomeType);
@ -130,6 +136,9 @@ public abstract class BasicQueueCoordinator extends QueueCoordinator {
@Override @Override
public final boolean setBiome(int x, int y, int z, @NonNull BiomeType biomeType) { public final boolean setBiome(int x, int y, int z, @NonNull BiomeType biomeType) {
if (disableBiomes) {
return false;
}
LocalChunk chunk = getChunk(x >> 4, z >> 4); LocalChunk chunk = getChunk(x >> 4, z >> 4);
chunk.setBiome(x & 15, y, z & 15, biomeType); chunk.setBiome(x & 15, y, z & 15, biomeType);
settingBiomes = true; settingBiomes = true;
@ -141,6 +150,12 @@ public abstract class BasicQueueCoordinator extends QueueCoordinator {
return this.settingBiomes; return this.settingBiomes;
} }
@Override
public void setBiomesEnabled(boolean settingBiomes) {
this.settingBiomes = settingBiomes;
this.disableBiomes = true;
}
@Override @Override
public boolean setTile(int x, int y, int z, @NonNull CompoundTag tag) { public boolean setTile(int x, int y, int z, @NonNull CompoundTag tag) {
LocalChunk chunk = getChunk(x >> 4, z >> 4); LocalChunk chunk = getChunk(x >> 4, z >> 4);
@ -315,6 +330,29 @@ public abstract class BasicQueueCoordinator extends QueueCoordinator {
this.whenDone = whenDone; this.whenDone = whenDone;
} }
@Override
public SideEffectSet getSideEffectSet() {
return sideEffectSet;
}
@Override
public void setSideEffectSet(SideEffectSet sideEffectSet) {
this.sideEffectSet = sideEffectSet;
}
// Don't ask about the @NonNull placement. That's how it needs to be else it errors.
@Override
public void setBiomeCuboid(
final com.plotsquared.core.location.@NonNull Location pos1,
final com.plotsquared.core.location.@NonNull Location pos2,
@NonNull final BiomeType biome
) {
if (disableBiomes) {
return;
}
super.setBiomeCuboid(pos1, pos2, biome);
}
/** /**
* Get the {@link LocalChunk} from the queue at the given chunk coordinates. Returns a new instance if one doesn't exist * Get the {@link LocalChunk} from the queue at the given chunk coordinates. Returns a new instance if one doesn't exist
*/ */

View File

@ -64,7 +64,7 @@ public class BlockArrayCacheScopedQueueCoordinator extends ScopedQueueCoordinato
* *
* @param min Inclusive location of the minimum point to limit the scope to. * @param min Inclusive location of the minimum point to limit the scope to.
* @param max Inclusive location of the maximum point to limit the scope to. * @param max Inclusive location of the maximum point to limit the scope to.
* @since TODO * @since 6.8.0
*/ */
public BlockArrayCacheScopedQueueCoordinator(Location min, Location max) { public BlockArrayCacheScopedQueueCoordinator(Location min, Location max) {
super(null, min, max); super(null, min, max);

View File

@ -41,7 +41,7 @@ import org.checkerframework.checker.nullness.qual.Nullable;
* *
* @deprecated This class is poorly designed and will no longer be used in P2 * @deprecated This class is poorly designed and will no longer be used in P2
*/ */
@Deprecated(forRemoval = true, since = "TODO") @Deprecated(forRemoval = true, since = "6.8.0")
public class ChunkQueueCoordinator extends ScopedQueueCoordinator { public class ChunkQueueCoordinator extends ScopedQueueCoordinator {
public final BiomeType[][][] biomeResult; public final BiomeType[][][] biomeResult;

View File

@ -32,6 +32,7 @@ import com.sk89q.worldedit.entity.Entity;
import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector2;
import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.util.SideEffectSet;
import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.biome.BiomeType;
import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BaseBlock;
@ -135,6 +136,13 @@ public class DelegateQueueCoordinator extends QueueCoordinator {
return false; return false;
} }
@Override
public void setBiomesEnabled(final boolean enabled) {
if (parent != null) {
parent.setBiomesEnabled(enabled);
}
}
@Override @Override
public boolean setEntity(@NonNull Entity entity) { public boolean setEntity(@NonNull Entity entity) {
if (parent != null) { if (parent != null) {
@ -248,6 +256,21 @@ public class DelegateQueueCoordinator extends QueueCoordinator {
} }
} }
@Override
public SideEffectSet getSideEffectSet() {
if (parent != null) {
return parent.getSideEffectSet();
}
return null;
}
@Override
public void setSideEffectSet(final SideEffectSet sideEffectSet) {
if (parent != null) {
parent.setSideEffectSet(sideEffectSet);
}
}
@Override @Override
public @NonNull List<BlockVector2> getReadChunks() { public @NonNull List<BlockVector2> getReadChunks() {
if (parent != null) { if (parent != null) {

View File

@ -35,6 +35,7 @@ import com.sk89q.worldedit.entity.Entity;
import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector2;
import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.util.SideEffectSet;
import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.biome.BiomeType;
import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BaseBlock;
@ -248,6 +249,14 @@ public abstract class QueueCoordinator {
*/ */
public abstract boolean isSettingBiomes(); public abstract boolean isSettingBiomes();
/**
* If the queue should accept biome placement
*
* @param enabled If biomes should be enabled
* @since 6.8.0
*/
public abstract void setBiomesEnabled(boolean enabled);
/** /**
* Add entities to be created * Add entities to be created
* *
@ -413,6 +422,20 @@ public abstract class QueueCoordinator {
*/ */
public abstract void setLightingMode(@Nullable LightingMode mode); public abstract void setLightingMode(@Nullable LightingMode mode);
/**
* Get the overriding {@link SideEffectSet} to be used by the queue if it exists, else null
*
* @return Overriding {@link SideEffectSet} or null
*/
public abstract @Nullable SideEffectSet getSideEffectSet();
/**
* Set the overriding {@link SideEffectSet} to be used by the queue. Null to use default side effects.
*
* @param sideEffectSet side effects to override with, or null to use default
*/
public abstract void setSideEffectSet(@Nullable SideEffectSet sideEffectSet);
/** /**
* Fill a cuboid between two positions with a BlockState * Fill a cuboid between two positions with a BlockState
* *

View File

@ -40,21 +40,18 @@ import org.checkerframework.checker.nullness.qual.Nullable;
* *
* @deprecated This should be renamed to NormalizedScopedQueueCoordinator or something. * @deprecated This should be renamed to NormalizedScopedQueueCoordinator or something.
*/ */
@Deprecated(forRemoval = true, since = "TODO") @Deprecated(forRemoval = true, since = "6.8.0")
public class ScopedQueueCoordinator extends DelegateQueueCoordinator { public class ScopedQueueCoordinator extends DelegateQueueCoordinator {
private final Location min; private final Location min;
private final Location max; private final Location max;
private final int minX; private final int minX;
private final int minY;
private final int minZ; private final int minZ;
private final int maxX; private final int maxX;
private final int maxY;
private final int maxZ; private final int maxZ;
private final int dx; private final int dx;
private final int dy;
private final int dz; private final int dz;
/** /**
@ -65,15 +62,12 @@ public class ScopedQueueCoordinator extends DelegateQueueCoordinator {
this.min = min; this.min = min;
this.max = max; this.max = max;
this.minX = min.getX(); this.minX = min.getX();
this.minY = min.getY();
this.minZ = min.getZ(); this.minZ = min.getZ();
this.maxX = max.getX(); this.maxX = max.getX();
this.maxY = max.getY();
this.maxZ = max.getZ(); this.maxZ = max.getZ();
this.dx = maxX - minX; this.dx = maxX - minX;
this.dy = maxY - minY;
this.dz = maxZ - minZ; this.dz = maxZ - minZ;
} }
@ -84,11 +78,11 @@ public class ScopedQueueCoordinator extends DelegateQueueCoordinator {
@Override @Override
public boolean setBiome(int x, int y, int z, @NonNull BiomeType biome) { public boolean setBiome(int x, int y, int z, @NonNull BiomeType biome) {
return x >= 0 && x <= dx && y >= 0 && y <= dy && z >= 0 && z <= dz && super.setBiome(x + minX, y + minY, z + minZ, biome); return x >= 0 && x <= dx && z >= 0 && z <= dz && super.setBiome(x + minX, y, z + minZ, biome);
} }
public void fillBiome(BiomeType biome) { public void fillBiome(BiomeType biome) {
for (int y = 0; y <= dy; y++) { for (int y = min.getY(); y <= max.getY(); y++) {
for (int x = 0; x <= dx; x++) { for (int x = 0; x <= dx; x++) {
for (int z = 0; z < dz; z++) { for (int z = 0; z < dz; z++) {
setBiome(x, y, z, biome); setBiome(x, y, z, biome);
@ -99,27 +93,22 @@ public class ScopedQueueCoordinator extends DelegateQueueCoordinator {
@Override @Override
public boolean setBlock(int x, int y, int z, @NonNull BaseBlock id) { public boolean setBlock(int x, int y, int z, @NonNull BaseBlock id) {
return x >= 0 && x <= dx && y >= 0 && y <= dy && z >= 0 && z <= dz && super.setBlock(x + minX, y + minY, z + minZ, id); return x >= 0 && x <= dx && z >= 0 && z <= dz && super.setBlock(x + minX, y, z + minZ, id);
} }
@Override @Override
public boolean setBlock(int x, int y, int z, @NonNull BlockState id) { public boolean setBlock(int x, int y, int z, @NonNull BlockState id) {
return x >= 0 && x <= dx && y >= 0 && y <= dy && z >= 0 && z <= dz && super.setBlock(x + minX, y + minY, z + minZ, id); return x >= 0 && x <= dx && z >= 0 && z <= dz && super.setBlock(x + minX, y, z + minZ, id);
} }
@Override @Override
public boolean setBlock(int x, int y, int z, @NonNull Pattern pattern) { public boolean setBlock(int x, int y, int z, @NonNull Pattern pattern) {
return x >= 0 && x <= dx && y >= 0 && y <= dy && z >= 0 && z <= dz && super.setBlock( return x >= 0 && x <= dx && z >= 0 && z <= dz && super.setBlock(x + minX, y, z + minZ, pattern);
x + minX,
y + minY,
z + minZ,
pattern
);
} }
@Override @Override
public boolean setTile(int x, int y, int z, @NonNull CompoundTag tag) { public boolean setTile(int x, int y, int z, @NonNull CompoundTag tag) {
return x >= 0 && x <= dx && y >= 0 && y <= dy && z >= 0 && z <= dz && super.setTile(x + minX, y + minY, z + minZ, tag); return x >= 0 && x <= dx && z >= 0 && z <= dz && super.setTile(x + minX, y, z + minZ, tag);
} }
public @NonNull Location getMin() { public @NonNull Location getMin() {

View File

@ -34,6 +34,7 @@ import java.util.HashMap;
public abstract class SetupUtils { public abstract class SetupUtils {
public static HashMap<String, GeneratorWrapper<?>> generators = new HashMap<>(); public static HashMap<String, GeneratorWrapper<?>> generators = new HashMap<>();
protected boolean loaded = false;
/** /**
* @since 6.1.0 * @since 6.1.0

View File

@ -18,7 +18,7 @@ plugins {
idea idea
} }
version = "6.7.1-SNAPSHOT" version = "6.8.1-SNAPSHOT"
allprojects { allprojects {
group = "com.plotsquared" group = "com.plotsquared"