mirror of
https://github.com/EngineHub/WorldEdit.git
synced 2025-01-18 12:34:20 +08:00
Merge branch 'version/7.3.x'
This commit is contained in:
commit
305f0cb328
1
.gitignore
vendored
1
.gitignore
vendored
@ -14,6 +14,7 @@ target
|
||||
forge-download
|
||||
out
|
||||
run
|
||||
.jqwik-database
|
||||
|
||||
/dependency-reduced-pom.xml
|
||||
*-private.sh
|
||||
|
@ -1,3 +1,7 @@
|
||||
7.3.6
|
||||
- [Bukkit] Allow 1.21 Paper adapter to load on 1.21.1
|
||||
- Revert "Shutdown the executor service on disable, to prevent waiting on async tasks before shutting down" due to it causing issues in some situations
|
||||
|
||||
7.3.5
|
||||
- [Bukkit] Utilise new Bukkit registry API, allowing WorldEdit to work with Commodore disabled (`paper.disableOldApiSupport` flag on Paper)
|
||||
- Fix queryRel not behaving correctly in //deform and the deform brush
|
||||
|
@ -12,10 +12,9 @@ Java Edition required. WorldEdit is compatible with Forge, Fabric, Bukkit, Spigo
|
||||
|
||||
## Download WorldEdit
|
||||
|
||||
This place contains the Java code for WorldEdit, but if you want to just use WorldEdit, get the mod or plugin from these pages:
|
||||
This place contains the Java code for WorldEdit, but if you want to just use WorldEdit, get the mod or plugin from Modrinth:
|
||||
|
||||
* For the mod: https://www.curseforge.com/minecraft/mc-mods/worldedit
|
||||
* For the server plugin: https://dev.bukkit.org/projects/worldedit
|
||||
https://modrinth.com/plugin/worldedit/versions
|
||||
|
||||
Edit the Code
|
||||
---------
|
||||
|
@ -8,10 +8,6 @@
|
||||
id("io.papermc.paperweight.userdev")
|
||||
}
|
||||
|
||||
configure<buildlogic.CommonJavaExtension> {
|
||||
banSlf4j = false
|
||||
}
|
||||
|
||||
paperweight {
|
||||
injectPaperRepository = false
|
||||
}
|
||||
|
@ -8,9 +8,6 @@
|
||||
id("buildlogic.common")
|
||||
}
|
||||
|
||||
val commonJava = extensions.create<buildlogic.CommonJavaExtension>("commonJava")
|
||||
commonJava.banSlf4j.convention(true)
|
||||
|
||||
tasks
|
||||
.withType<JavaCompile>()
|
||||
.matching { it.name == "compileJava" || it.name == "compileTestJava" }
|
||||
@ -33,7 +30,9 @@
|
||||
}
|
||||
|
||||
tasks.withType<Test>().configureEach {
|
||||
useJUnitPlatform()
|
||||
useJUnitPlatform {
|
||||
includeEngines("junit-jupiter", "jqwik")
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
@ -41,6 +40,7 @@
|
||||
"testImplementation"(platform(stringyLibs.getLibrary("junit-bom")))
|
||||
"testImplementation"(stringyLibs.getLibrary("junit-jupiter-api"))
|
||||
"testImplementation"(stringyLibs.getLibrary("junit-jupiter-params"))
|
||||
"testImplementation"(stringyLibs.getLibrary("jqwik"))
|
||||
"testImplementation"(platform(stringyLibs.getLibrary("mockito-bom")))
|
||||
"testImplementation"(stringyLibs.getLibrary("mockito-core"))
|
||||
"testImplementation"(stringyLibs.getLibrary("mockito-junit-jupiter"))
|
||||
@ -67,16 +67,6 @@
|
||||
withSourcesJar()
|
||||
}
|
||||
|
||||
configurations["compileClasspath"].apply {
|
||||
resolutionStrategy.componentSelection {
|
||||
withModule("org.slf4j:slf4j-api") {
|
||||
if (commonJava.banSlf4j.get()) {
|
||||
reject("No SLF4J allowed on compile classpath")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tasks.named("check").configure {
|
||||
dependsOn("checkstyleMain", "checkstyleTest")
|
||||
}
|
||||
|
@ -1,3 +1,6 @@
|
||||
import buildlogic.getLibrary
|
||||
import buildlogic.stringyLibs
|
||||
|
||||
plugins {
|
||||
id("com.github.johnrengelman.shadow")
|
||||
id("buildlogic.core-and-platform")
|
||||
@ -9,17 +12,23 @@
|
||||
|
||||
tasks.named<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>("shadowJar") {
|
||||
archiveClassifier.set("dist")
|
||||
relocate("com.sk89q.jchronic", "com.sk89q.worldedit.jchronic")
|
||||
val jchronic = stringyLibs.getLibrary("jchronic").get()
|
||||
dependencies {
|
||||
include(project(":worldedit-libs:core"))
|
||||
include(project(":worldedit-libs:${project.name.replace("worldedit-", "")}"))
|
||||
include(project(":worldedit-core"))
|
||||
exclude("com.google.code.findbugs:jsr305")
|
||||
include(dependency(jchronic))
|
||||
exclude(dependency("com.google.code.findbugs:jsr305"))
|
||||
}
|
||||
exclude("GradleStart**")
|
||||
exclude(".cache")
|
||||
exclude("LICENSE*")
|
||||
exclude("META-INF/maven/**")
|
||||
minimize()
|
||||
minimize {
|
||||
// jchronic uses reflection to load things, so we need to exclude it from minimizing
|
||||
exclude(dependency(jchronic))
|
||||
}
|
||||
}
|
||||
val javaComponent = components["java"] as AdhocComponentWithVariants
|
||||
// I don't think we want this published (it's the shadow jar)
|
||||
|
@ -1,7 +0,0 @@
|
||||
package buildlogic
|
||||
|
||||
import org.gradle.api.provider.Property
|
||||
|
||||
interface CommonJavaExtension {
|
||||
val banSlf4j: Property<Boolean>
|
||||
}
|
@ -145,6 +145,10 @@ Checks based on Google Checks, modified for EngineHub.
|
||||
<property name="sortImportsInGroupAlphabetically" value="true"/>
|
||||
<property name="customImportOrderRules" value="THIRD_PARTY_PACKAGE###STANDARD_JAVA_PACKAGE###STATIC"/>
|
||||
</module>
|
||||
<module name="IllegalImport">
|
||||
<property name="illegalPkgs" value="org.slf4j"/>
|
||||
<message key="name.invalidPattern" value="Illegal import - {0}. Use Log4J instead."/>
|
||||
</module>
|
||||
<module name="MethodParamPad"/>
|
||||
<module name="OperatorWrap">
|
||||
<property name="option" value="NL"/>
|
||||
|
@ -66,6 +66,8 @@ junit-jupiter-api.module = "org.junit.jupiter:junit-jupiter-api"
|
||||
junit-jupiter-params.module = "org.junit.jupiter:junit-jupiter-params"
|
||||
junit-jupiter-engine.module = "org.junit.jupiter:junit-jupiter-engine"
|
||||
|
||||
jqwik = "net.jqwik:jqwik:1.9.0"
|
||||
|
||||
mockito-bom = "org.mockito:mockito-bom:5.11.0"
|
||||
mockito-core.module = "org.mockito:mockito-core"
|
||||
mockito-junit-jupiter.module = "org.mockito:mockito-junit-jupiter"
|
||||
|
@ -56,7 +56,6 @@
|
||||
because("Resolving Spigot annotations")
|
||||
}
|
||||
"compileOnly"(libs.paperApi) {
|
||||
exclude("org.slf4j", "slf4j-api")
|
||||
exclude("junit", "junit")
|
||||
}
|
||||
"implementation"(libs.paperLib)
|
||||
|
@ -32,6 +32,7 @@
|
||||
import com.sk89q.worldedit.extent.NullExtent;
|
||||
import com.sk89q.worldedit.extent.TracingExtent;
|
||||
import com.sk89q.worldedit.extent.buffer.ForgetfulExtentBuffer;
|
||||
import com.sk89q.worldedit.extent.buffer.internal.BatchingExtent;
|
||||
import com.sk89q.worldedit.extent.cache.LastAccessExtentCache;
|
||||
import com.sk89q.worldedit.extent.inventory.BlockBag;
|
||||
import com.sk89q.worldedit.extent.inventory.BlockBagExtent;
|
||||
@ -199,6 +200,7 @@ public String getDisplayName() {
|
||||
|
||||
private @Nullable SideEffectExtent sideEffectExtent;
|
||||
private final SurvivalModeExtent survivalExtent;
|
||||
private @Nullable BatchingExtent batchingExtent;
|
||||
private @Nullable ChunkBatchingExtent chunkBatchingExtent;
|
||||
private final BlockBagExtent blockBagExtent;
|
||||
@SuppressWarnings("deprecation")
|
||||
@ -267,6 +269,7 @@ public String getDisplayName() {
|
||||
this.bypassReorderHistory = traceIfNeeded(new DataValidatorExtent(extent, world));
|
||||
|
||||
// This extent can be skipped by calling rawSetBlock()
|
||||
extent = traceIfNeeded(batchingExtent = new BatchingExtent(extent));
|
||||
@SuppressWarnings("deprecation")
|
||||
MultiStageReorder reorder = new MultiStageReorder(extent, false);
|
||||
extent = traceIfNeeded(reorderExtent = reorder);
|
||||
@ -557,7 +560,7 @@ public void setSideEffectApplier(SideEffectSet sideEffectSet) {
|
||||
*/
|
||||
@Deprecated
|
||||
public boolean hasFastMode() {
|
||||
return sideEffectExtent != null && this.sideEffectExtent.getSideEffectSet().doesApplyAny();
|
||||
return sideEffectExtent != null && !this.sideEffectExtent.getSideEffectSet().doesApplyAny();
|
||||
}
|
||||
|
||||
public SideEffectSet getSideEffectApplier() {
|
||||
@ -616,10 +619,12 @@ public void setBatchingChunks(boolean batchingChunks) {
|
||||
}
|
||||
return;
|
||||
}
|
||||
assert batchingExtent != null : "same nullness as chunkBatchingExtent";
|
||||
if (!batchingChunks && isBatchingChunks()) {
|
||||
internalFlushSession();
|
||||
}
|
||||
chunkBatchingExtent.setEnabled(batchingChunks);
|
||||
batchingExtent.setEnabled(!batchingChunks);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -648,6 +653,8 @@ public void disableBuffering() {
|
||||
setReorderMode(ReorderMode.NONE);
|
||||
if (chunkBatchingExtent != null) {
|
||||
chunkBatchingExtent.setEnabled(false);
|
||||
assert batchingExtent != null : "same nullness as chunkBatchingExtent";
|
||||
batchingExtent.setEnabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -134,7 +134,7 @@ public int line(Actor actor, EditSession editSession,
|
||||
@Arg(desc = "The pattern of blocks to place")
|
||||
Pattern pattern,
|
||||
@Arg(desc = "The thickness of the line", def = "0")
|
||||
int thickness,
|
||||
double thickness,
|
||||
@Switch(name = 'h', desc = "Generate only a shell")
|
||||
boolean shell) throws WorldEditException {
|
||||
if (!((region instanceof CuboidRegion) || (region instanceof ConvexPolyhedralRegion))) {
|
||||
@ -171,7 +171,7 @@ public int curve(Actor actor, EditSession editSession,
|
||||
@Arg(desc = "The pattern of blocks to place")
|
||||
Pattern pattern,
|
||||
@Arg(desc = "The thickness of the curve", def = "0")
|
||||
int thickness,
|
||||
double thickness,
|
||||
@Switch(name = 'h', desc = "Generate only a shell")
|
||||
boolean shell) throws WorldEditException {
|
||||
if (!(region instanceof ConvexPolyhedralRegion cpregion)) {
|
||||
|
@ -0,0 +1,111 @@
|
||||
/*
|
||||
* WorldEdit, a Minecraft world manipulation toolkit
|
||||
* Copyright (C) sk89q <http://www.sk89q.com>
|
||||
* Copyright (C) WorldEdit team and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.sk89q.worldedit.extent.buffer.internal;
|
||||
|
||||
import com.google.common.base.Throwables;
|
||||
import com.sk89q.worldedit.WorldEditException;
|
||||
import com.sk89q.worldedit.extent.AbstractBufferingExtent;
|
||||
import com.sk89q.worldedit.extent.Extent;
|
||||
import com.sk89q.worldedit.function.operation.Operation;
|
||||
import com.sk89q.worldedit.function.operation.RunContext;
|
||||
import com.sk89q.worldedit.math.BlockVector3;
|
||||
import com.sk89q.worldedit.util.collection.BlockMap;
|
||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
||||
|
||||
/**
|
||||
* An extent that buffers all changes until completed.
|
||||
*/
|
||||
public class BatchingExtent extends AbstractBufferingExtent {
|
||||
|
||||
private final BlockMap<BaseBlock> blockMap = BlockMap.createForBaseBlock();
|
||||
private boolean enabled;
|
||||
|
||||
public BatchingExtent(Extent extent) {
|
||||
this(extent, true);
|
||||
}
|
||||
|
||||
public BatchingExtent(Extent extent, boolean enabled) {
|
||||
super(extent);
|
||||
this.enabled = enabled;
|
||||
}
|
||||
|
||||
public boolean isEnabled() {
|
||||
return enabled;
|
||||
}
|
||||
|
||||
public void setEnabled(boolean enabled) {
|
||||
this.enabled = enabled;
|
||||
}
|
||||
|
||||
public boolean commitRequired() {
|
||||
return enabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <B extends BlockStateHolder<B>> boolean setBlock(BlockVector3 location, B block) throws WorldEditException {
|
||||
if (!enabled) {
|
||||
return setDelegateBlock(location, block);
|
||||
}
|
||||
blockMap.put(location, block.toBaseBlock());
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BaseBlock getBufferedFullBlock(BlockVector3 position) {
|
||||
if (!enabled) {
|
||||
// Early exit if we're not enabled.
|
||||
return null;
|
||||
}
|
||||
return blockMap.get(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Operation commitBefore() {
|
||||
if (!commitRequired()) {
|
||||
return null;
|
||||
}
|
||||
return new Operation() {
|
||||
|
||||
@Override
|
||||
public Operation resume(RunContext run) throws WorldEditException {
|
||||
try {
|
||||
blockMap.forEach((position, block) -> {
|
||||
try {
|
||||
getExtent().setBlock(position, block);
|
||||
} catch (WorldEditException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
});
|
||||
} catch (RuntimeException e) {
|
||||
Throwables.throwIfInstanceOf(e.getCause(), WorldEditException.class);
|
||||
throw e;
|
||||
}
|
||||
blockMap.clear();
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancel() {
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
@ -143,7 +143,7 @@ private void decodeBlocksIntoClipboard(VersionedDataFixer fixer, LinCompoundTag
|
||||
);
|
||||
|
||||
byte[] blocks = blockContainer.getTag("Data", LinTagType.byteArrayTag()).value();
|
||||
LinListTag<LinCompoundTag> blockEntities = blockContainer.getListTag("BlockEntities", LinTagType.compoundTag());
|
||||
LinListTag<LinCompoundTag> blockEntities = blockContainer.findListTag("BlockEntities", LinTagType.compoundTag());
|
||||
|
||||
ReaderUtil.initializeClipboardFromBlocks(
|
||||
clipboard, palette, blocks, blockEntities, fixer, true
|
||||
|
@ -31,7 +31,6 @@
|
||||
import com.sk89q.worldedit.world.block.BlockStateHolder;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@ -91,18 +90,11 @@ protected Operation commitBefore() {
|
||||
}
|
||||
return new Operation() {
|
||||
|
||||
// we get modified between create/resume -- only create this on resume to prevent CME
|
||||
private Iterator<BlockVector3> iterator;
|
||||
|
||||
@Override
|
||||
public Operation resume(RunContext run) throws WorldEditException {
|
||||
if (iterator == null) {
|
||||
List<BlockVector3> blockVectors = new ArrayList<>(blockMap.keySet());
|
||||
RegionOptimizedVectorSorter.sort(blockVectors);
|
||||
iterator = blockVectors.iterator();
|
||||
}
|
||||
while (iterator.hasNext()) {
|
||||
BlockVector3 position = iterator.next();
|
||||
for (BlockVector3 position : blockVectors) {
|
||||
BaseBlock block = blockMap.get(position);
|
||||
getExtent().setBlock(position, block);
|
||||
}
|
||||
|
@ -283,7 +283,7 @@ public static <B extends BlockStateHolder<B>> B transform(B block, Transform tra
|
||||
Property<Object> propAsObj = (Property<Object>) prop;
|
||||
result = result.with(propAsObj, "none");
|
||||
}
|
||||
directionalProperties.put(closestProp, result.getState(prop));
|
||||
directionalProperties.put(closestProp, state);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -227,7 +227,8 @@ private static Substring onlyOnLastQuotedWord(Substring lastArg, Substring sugge
|
||||
return suggestion;
|
||||
}
|
||||
String substr = suggestion.getSubstring();
|
||||
int sp = substr.lastIndexOf(' ');
|
||||
// Check if there is a space inside the substring, and suggest starting from there instead.
|
||||
int sp = substr.trim().lastIndexOf(' ');
|
||||
if (sp < 0) {
|
||||
return suggestion;
|
||||
}
|
||||
|
@ -19,11 +19,12 @@
|
||||
|
||||
package com.sk89q.worldedit.util;
|
||||
|
||||
import com.google.common.base.Verify;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.common.collect.Sets;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.EnumMap;
|
||||
import java.util.EnumSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
@ -37,33 +38,73 @@ public class SideEffectSet {
|
||||
.collect(Collectors.toMap(Function.identity(), state -> SideEffect.State.OFF))
|
||||
);
|
||||
|
||||
private final Map<SideEffect, SideEffect.State> sideEffects;
|
||||
private final Set<SideEffect> appliedSideEffects;
|
||||
private final boolean appliesAny;
|
||||
static {
|
||||
Verify.verify(
|
||||
SideEffect.State.values().length == 3,
|
||||
"Implementation requires specifically 3 values in the SideEffect.State enum"
|
||||
);
|
||||
int maxEffects = Integer.SIZE / 2;
|
||||
Verify.verify(
|
||||
SideEffect.values().length <= maxEffects,
|
||||
"Implementation requires less than " + maxEffects + " side effects"
|
||||
);
|
||||
Verify.verify(
|
||||
SideEffect.State.OFF.ordinal() == 0,
|
||||
"Implementation requires SideEffect.State.OFF to be the first value"
|
||||
);
|
||||
}
|
||||
|
||||
private static int shift(SideEffect effect) {
|
||||
return effect.ordinal() * 2;
|
||||
}
|
||||
|
||||
private static int computeSideEffectsBitmap(Map<SideEffect, SideEffect.State> sideEffects) {
|
||||
int sideEffectsBitmap = 0;
|
||||
for (SideEffect effect : SideEffect.values()) {
|
||||
SideEffect.State state = sideEffects.getOrDefault(effect, effect.getDefaultValue());
|
||||
sideEffectsBitmap |= (state.ordinal() << shift(effect));
|
||||
}
|
||||
return sideEffectsBitmap;
|
||||
}
|
||||
|
||||
/**
|
||||
* Side-effects and state are encoded into this field, 2 bits per side-effect. Least-significant bit is first.
|
||||
*/
|
||||
private final int sideEffectsBitmap;
|
||||
private final Set<SideEffect> sideEffectsToApply;
|
||||
|
||||
public SideEffectSet(Map<SideEffect, SideEffect.State> sideEffects) {
|
||||
this.sideEffects = Maps.immutableEnumMap(sideEffects);
|
||||
this(computeSideEffectsBitmap(sideEffects));
|
||||
}
|
||||
|
||||
appliedSideEffects = sideEffects.entrySet()
|
||||
.stream()
|
||||
.filter(entry -> entry.getValue() != SideEffect.State.OFF)
|
||||
.map(Map.Entry::getKey)
|
||||
.collect(Collectors.toSet());
|
||||
appliesAny = !appliedSideEffects.isEmpty();
|
||||
private SideEffectSet(int sideEffectsBitmap) {
|
||||
this.sideEffectsBitmap = sideEffectsBitmap;
|
||||
var sideEffectsToApply = EnumSet.noneOf(SideEffect.class);
|
||||
for (SideEffect effect : SideEffect.values()) {
|
||||
if (shouldApply(effect)) {
|
||||
sideEffectsToApply.add(effect);
|
||||
}
|
||||
}
|
||||
this.sideEffectsToApply = Sets.immutableEnumSet(sideEffectsToApply);
|
||||
}
|
||||
|
||||
public SideEffectSet with(SideEffect sideEffect, SideEffect.State state) {
|
||||
Map<SideEffect, SideEffect.State> entries = this.sideEffects.isEmpty() ? Maps.newEnumMap(SideEffect.class) : new EnumMap<>(this.sideEffects);
|
||||
entries.put(sideEffect, state);
|
||||
return new SideEffectSet(entries);
|
||||
int mask = 0b11 << shift(sideEffect);
|
||||
int newState = (state.ordinal() << shift(sideEffect)) & mask;
|
||||
int newBitmap = (sideEffectsBitmap & ~mask) | newState;
|
||||
return new SideEffectSet(newBitmap);
|
||||
}
|
||||
|
||||
public boolean doesApplyAny() {
|
||||
return this.appliesAny;
|
||||
return sideEffectsBitmap != 0;
|
||||
}
|
||||
|
||||
public SideEffect.State getState(SideEffect effect) {
|
||||
return sideEffects.getOrDefault(effect, effect.getDefaultValue());
|
||||
return SideEffect.State.values()[getRawState(effect)];
|
||||
}
|
||||
|
||||
private int getRawState(SideEffect effect) {
|
||||
return (sideEffectsBitmap >> shift(effect)) & 0b11;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -77,11 +118,11 @@ public SideEffect.State getState(SideEffect effect) {
|
||||
* @return Whether it should apply
|
||||
*/
|
||||
public boolean shouldApply(SideEffect effect) {
|
||||
return getState(effect) != SideEffect.State.OFF;
|
||||
return getRawState(effect) != 0;
|
||||
}
|
||||
|
||||
public Set<SideEffect> getSideEffectsToApply() {
|
||||
return this.appliedSideEffects;
|
||||
return sideEffectsToApply;
|
||||
}
|
||||
|
||||
public static SideEffectSet defaults() {
|
||||
|
@ -86,7 +86,6 @@ public long skip(long n) throws IOException {
|
||||
|
||||
public void seek(long n) throws IOException {
|
||||
long diff = n - position;
|
||||
System.err.println("Seek to " + n + " from position " + position + " using " + diff);
|
||||
|
||||
if (diff < 0) {
|
||||
throw new IOException("Can't seek backwards");
|
||||
|
@ -0,0 +1,78 @@
|
||||
/*
|
||||
* WorldEdit, a Minecraft world manipulation toolkit
|
||||
* Copyright (C) sk89q <http://www.sk89q.com>
|
||||
* Copyright (C) WorldEdit team and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.sk89q.worldedit.util;
|
||||
|
||||
import net.jqwik.api.ForAll;
|
||||
import net.jqwik.api.Property;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public class SideEffectSetTest {
|
||||
@Property
|
||||
public boolean stateOrDefaultIsCorrect(
|
||||
@ForAll Map<SideEffect, SideEffect.State> stateMap,
|
||||
@ForAll SideEffect effectToTest
|
||||
) {
|
||||
SideEffectSet set = new SideEffectSet(stateMap);
|
||||
return set.getState(effectToTest) == stateMap.getOrDefault(effectToTest, effectToTest.getDefaultValue());
|
||||
}
|
||||
|
||||
@Property
|
||||
public boolean shouldApplyUnlessOff(
|
||||
@ForAll Map<SideEffect, SideEffect.State> stateMap,
|
||||
@ForAll SideEffect effectToTest
|
||||
) {
|
||||
SideEffectSet set = new SideEffectSet(stateMap);
|
||||
return set.shouldApply(effectToTest)
|
||||
== (stateMap.getOrDefault(effectToTest, effectToTest.getDefaultValue()) != SideEffect.State.OFF);
|
||||
}
|
||||
|
||||
@Property
|
||||
public boolean withChangesState(
|
||||
@ForAll Map<SideEffect, SideEffect.State> stateMap,
|
||||
@ForAll SideEffect effectToTest,
|
||||
@ForAll SideEffect.State stateToSet
|
||||
) {
|
||||
SideEffectSet set = new SideEffectSet(stateMap).with(effectToTest, stateToSet);
|
||||
return set.getState(effectToTest) == stateToSet;
|
||||
}
|
||||
|
||||
@Property
|
||||
public boolean anyShouldApplyEqualsDoesApplyAny(@ForAll Map<SideEffect, SideEffect.State> stateMap) {
|
||||
SideEffectSet set = new SideEffectSet(stateMap);
|
||||
boolean anyShouldApply = false;
|
||||
for (SideEffect effect : SideEffect.values()) {
|
||||
if (set.shouldApply(effect)) {
|
||||
anyShouldApply = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return anyShouldApply == set.doesApplyAny();
|
||||
}
|
||||
|
||||
@Property
|
||||
public boolean shouldApplyEqualsApplySetContains(
|
||||
@ForAll Map<SideEffect, SideEffect.State> stateMap,
|
||||
@ForAll SideEffect effectToTest
|
||||
) {
|
||||
SideEffectSet set = new SideEffectSet(stateMap);
|
||||
return set.shouldApply(effectToTest) == set.getSideEffectsToApply().contains(effectToTest);
|
||||
}
|
||||
}
|
@ -3,3 +3,5 @@ junit.jupiter.execution.parallel.mode.default=concurrent
|
||||
junit.jupiter.execution.parallel.mode.classes.default=same_thread
|
||||
junit.jupiter.execution.parallel.config.strategy=dynamic
|
||||
junit.jupiter.execution.parallel.config.dynamic.factor=4
|
||||
|
||||
jqwik.tries.default = 10000
|
||||
|
@ -10,11 +10,6 @@
|
||||
id("buildlogic.platform")
|
||||
}
|
||||
|
||||
commonJava {
|
||||
// Not easy to do, because it's in a bunch of separate configurations
|
||||
banSlf4j = false
|
||||
}
|
||||
|
||||
platform {
|
||||
kind = buildlogic.WorldEditKind.Mod
|
||||
includeClasspath = true
|
||||
|
@ -7,11 +7,6 @@
|
||||
id("buildlogic.platform")
|
||||
}
|
||||
|
||||
commonJava {
|
||||
// Not easy to do, because it's in a bunch of separate configurations
|
||||
banSlf4j = false
|
||||
}
|
||||
|
||||
platform {
|
||||
kind = buildlogic.WorldEditKind.Mod
|
||||
}
|
||||
|
@ -14,10 +14,6 @@
|
||||
includeClasspath = true
|
||||
}
|
||||
|
||||
commonJava {
|
||||
banSlf4j = false
|
||||
}
|
||||
|
||||
minecraft {
|
||||
injectRepositories(false)
|
||||
version(libs.versions.sponge.minecraft.get())
|
||||
|
Loading…
Reference in New Issue
Block a user