geforkt von Mirrors/FastAsyncWorldEdit
refactor: Drop custom snakeyaml implementation (#1523)
* refactor: Drop custom snakeyaml implementation * Merge branch 'main' into chore/main/remove-snakeyaml-wannabe-abstraction
Dieser Commit ist enthalten in:
Ursprung
c2f3c13a09
Commit
9ba90d8c83
@ -141,6 +141,7 @@ public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements
|
|||||||
return parent;
|
return parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
private synchronized boolean init() {
|
private synchronized boolean init() {
|
||||||
if (ibdToStateOrdinal != null && ibdToStateOrdinal[1] != 0) {
|
if (ibdToStateOrdinal != null && ibdToStateOrdinal[1] != 0) {
|
||||||
return false;
|
return false;
|
||||||
@ -159,10 +160,9 @@ public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements
|
|||||||
try {
|
try {
|
||||||
for (Field field : BlockStateProperties.class.getDeclaredFields()) {
|
for (Field field : BlockStateProperties.class.getDeclaredFields()) {
|
||||||
Object obj = field.get(null);
|
Object obj = field.get(null);
|
||||||
if (!(obj instanceof net.minecraft.world.level.block.state.properties.Property)) {
|
if (!(obj instanceof net.minecraft.world.level.block.state.properties.Property<?> state)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
net.minecraft.world.level.block.state.properties.Property<?> state = (net.minecraft.world.level.block.state.properties.Property<?>) obj;
|
|
||||||
Property<?> property;
|
Property<?> property;
|
||||||
if (state instanceof net.minecraft.world.level.block.state.properties.BooleanProperty) {
|
if (state instanceof net.minecraft.world.level.block.state.properties.BooleanProperty) {
|
||||||
property = new BooleanProperty(
|
property = new BooleanProperty(
|
||||||
@ -288,6 +288,7 @@ public final class PaperweightFaweAdapter extends CachedBukkitAdapter implements
|
|||||||
return SideEffectSet.defaults().getSideEffectsToApply();
|
return SideEffectSet.defaults().getSideEffectsToApply();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
public boolean setBlock(org.bukkit.Chunk chunk, int x, int y, int z, BlockStateHolder state, boolean update) {
|
public boolean setBlock(org.bukkit.Chunk chunk, int x, int y, int z, BlockStateHolder state, boolean update) {
|
||||||
CraftChunk craftChunk = (CraftChunk) chunk;
|
CraftChunk craftChunk = (CraftChunk) chunk;
|
||||||
LevelChunk levelChunk = craftChunk.getHandle();
|
LevelChunk levelChunk = craftChunk.getHandle();
|
||||||
|
@ -246,7 +246,7 @@ public class PaperweightFaweWorldNativeAccess implements WorldNativeAccess<Level
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (IntPair chunk : toSend) {
|
for (IntPair chunk : toSend) {
|
||||||
PaperweightPlatformAdapter.sendChunk(getLevel().getWorld().getHandle(), chunk.x, chunk.z, false);
|
PaperweightPlatformAdapter.sendChunk(getLevel().getWorld().getHandle(), chunk.x(), chunk.z(), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -262,7 +262,7 @@ public class PaperweightFaweWorldNativeAccess implements WorldNativeAccess<Level
|
|||||||
sideEffectSet != null && sideEffectSet.shouldApply(SideEffect.UPDATE)
|
sideEffectSet != null && sideEffectSet.shouldApply(SideEffect.UPDATE)
|
||||||
));
|
));
|
||||||
for (IntPair chunk : cachedChunksToSend) {
|
for (IntPair chunk : cachedChunksToSend) {
|
||||||
PaperweightPlatformAdapter.sendChunk(getLevel().getWorld().getHandle(), chunk.x, chunk.z, false);
|
PaperweightPlatformAdapter.sendChunk(getLevel().getWorld().getHandle(), chunk.x(), chunk.z(), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -77,6 +77,8 @@ import java.util.concurrent.Future;
|
|||||||
import java.util.concurrent.locks.ReadWriteLock;
|
import java.util.concurrent.locks.ReadWriteLock;
|
||||||
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.StreamSupport;
|
||||||
|
|
||||||
public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBlocks {
|
public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBlocks {
|
||||||
|
|
||||||
@ -320,6 +322,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public CompoundTag getEntity(UUID uuid) {
|
public CompoundTag getEntity(UUID uuid) {
|
||||||
Entity entity = serverLevel.getEntity(uuid);
|
Entity entity = serverLevel.getEntity(uuid);
|
||||||
if (entity != null) {
|
if (entity != null) {
|
||||||
@ -365,10 +368,9 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean contains(Object get) {
|
public boolean contains(Object get) {
|
||||||
if (!(get instanceof CompoundTag)) {
|
if (!(get instanceof CompoundTag getTag)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
CompoundTag getTag = (CompoundTag) get;
|
|
||||||
Map<String, Tag> value = getTag.getValue();
|
Map<String, Tag> value = getTag.getValue();
|
||||||
CompoundTag getParts = (CompoundTag) value.get("UUID");
|
CompoundTag getParts = (CompoundTag) value.get("UUID");
|
||||||
UUID getUUID = new UUID(getParts.getLong("Most"), getParts.getLong("Least"));
|
UUID getUUID = new UUID(getParts.getLong("Most"), getParts.getLong("Least"));
|
||||||
@ -388,17 +390,10 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc
|
|||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Iterator<CompoundTag> iterator() {
|
public Iterator<CompoundTag> iterator() {
|
||||||
Iterable<CompoundTag> result = Iterables.transform(
|
Iterable<CompoundTag> result = StreamSupport.stream(Iterables.concat(slices).spliterator(), false).map(input -> {
|
||||||
Iterables.concat(slices),
|
|
||||||
new com.google.common.base.Function<Entity, CompoundTag>() {
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public CompoundTag apply(@Nullable Entity input) {
|
|
||||||
net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag();
|
net.minecraft.nbt.CompoundTag tag = new net.minecraft.nbt.CompoundTag();
|
||||||
return (CompoundTag) adapter.toNative(input.saveWithoutId(tag));
|
return (CompoundTag) adapter.toNative(input.saveWithoutId(tag));
|
||||||
}
|
}).collect(Collectors.toList());
|
||||||
}
|
|
||||||
);
|
|
||||||
return result.iterator();
|
return result.iterator();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -842,6 +837,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc
|
|||||||
* @return the given array to be filled with data, or a new array if null is given.
|
* @return the given array to be filled with data, or a new array if null is given.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public char[] update(int layer, char[] data, boolean aggressive) {
|
public char[] update(int layer, char[] data, boolean aggressive) {
|
||||||
LevelChunkSection section = getSections(aggressive)[layer];
|
LevelChunkSection section = getSections(aggressive)[layer];
|
||||||
// Section is null, return empty array
|
// Section is null, return empty array
|
||||||
@ -1005,6 +1001,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public synchronized boolean trim(boolean aggressive) {
|
public synchronized boolean trim(boolean aggressive) {
|
||||||
skyLight = new DataLayer[getSectionCount()];
|
skyLight = new DataLayer[getSectionCount()];
|
||||||
blockLight = new DataLayer[getSectionCount()];
|
blockLight = new DataLayer[getSectionCount()];
|
||||||
|
@ -67,6 +67,7 @@ public class PaperweightGetBlocks_Copy implements IChunkGet {
|
|||||||
return tiles.get(BlockVector3.at(x, y, z));
|
return tiles.get(BlockVector3.at(x, y, z));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||||
protected void storeEntity(Entity entity) {
|
protected void storeEntity(Entity entity) {
|
||||||
BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter();
|
BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter();
|
||||||
net.minecraft.nbt.CompoundTag compoundTag = new net.minecraft.nbt.CompoundTag();
|
net.minecraft.nbt.CompoundTag compoundTag = new net.minecraft.nbt.CompoundTag();
|
||||||
|
@ -227,6 +227,7 @@ public final class PaperweightPlatformAdapter extends NMSAdapter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public static void sendChunk(ServerLevel nmsWorld, int chunkX, int chunkZ, boolean lighting) {
|
public static void sendChunk(ServerLevel nmsWorld, int chunkX, int chunkZ, boolean lighting) {
|
||||||
ChunkHolder chunkHolder = getPlayerChunk(nmsWorld, chunkX, chunkZ);
|
ChunkHolder chunkHolder = getPlayerChunk(nmsWorld, chunkX, chunkZ);
|
||||||
if (chunkHolder == null) {
|
if (chunkHolder == null) {
|
||||||
@ -412,6 +413,7 @@ public final class PaperweightPlatformAdapter extends NMSAdapter {
|
|||||||
return BiomeTypes.get(resourceLocation.toString().toLowerCase(Locale.ROOT));
|
return BiomeTypes.get(resourceLocation.toString().toLowerCase(Locale.ROOT));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
static void removeBeacon(BlockEntity beacon, LevelChunk levelChunk) {
|
static void removeBeacon(BlockEntity beacon, LevelChunk levelChunk) {
|
||||||
try {
|
try {
|
||||||
// Do the method ourselves to avoid trying to reflect generic method parameters
|
// Do the method ourselves to avoid trying to reflect generic method parameters
|
||||||
|
@ -70,6 +70,7 @@ public class PaperweightStarlightRelighter implements Relighter {
|
|||||||
private final ReentrantLock areaLock = new ReentrantLock();
|
private final ReentrantLock areaLock = new ReentrantLock();
|
||||||
private final NMSRelighter delegate;
|
private final NMSRelighter delegate;
|
||||||
|
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
public PaperweightStarlightRelighter(ServerLevel serverLevel, IQueueExtent<IQueueChunk> queue) {
|
public PaperweightStarlightRelighter(ServerLevel serverLevel, IQueueExtent<IQueueChunk> queue) {
|
||||||
this.serverLevel = serverLevel;
|
this.serverLevel = serverLevel;
|
||||||
this.delegate = new NMSRelighter(queue);
|
this.delegate = new NMSRelighter(queue);
|
||||||
|
@ -16,6 +16,7 @@ public class PaperweightStarlightRelighterFactory implements RelighterFactory {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nonnull
|
public @Nonnull
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
Relighter createRelighter(RelightMode relightMode, World world, IQueueExtent<IQueueChunk> queue) {
|
Relighter createRelighter(RelightMode relightMode, World world, IQueueExtent<IQueueChunk> queue) {
|
||||||
org.bukkit.World w = Bukkit.getWorld(world.getName());
|
org.bukkit.World w = Bukkit.getWorld(world.getName());
|
||||||
if (w == null) {
|
if (w == null) {
|
||||||
|
@ -35,6 +35,7 @@ public class PaperweightLazyCompoundTag extends LazyCompoundTag {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public Map<String, Tag> getValue() {
|
public Map<String, Tag> getValue() {
|
||||||
if (compoundTag == null) {
|
if (compoundTag == null) {
|
||||||
compoundTag = (CompoundTag) WorldEditPlugin.getInstance().getBukkitImplAdapter().toNative(compoundTagSupplier.get());
|
compoundTag = (CompoundTag) WorldEditPlugin.getInstance().getBukkitImplAdapter().toNative(compoundTagSupplier.get());
|
||||||
@ -92,6 +93,7 @@ public class PaperweightLazyCompoundTag extends LazyCompoundTag {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public List<Tag> getList(String key) {
|
public List<Tag> getList(String key) {
|
||||||
net.minecraft.nbt.Tag tag = compoundTagSupplier.get().get(key);
|
net.minecraft.nbt.Tag tag = compoundTagSupplier.get().get(key);
|
||||||
if (tag instanceof net.minecraft.nbt.ListTag nbtList) {
|
if (tag instanceof net.minecraft.nbt.ListTag nbtList) {
|
||||||
@ -108,6 +110,7 @@ public class PaperweightLazyCompoundTag extends LazyCompoundTag {
|
|||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public ListTag getListTag(String key) {
|
public ListTag getListTag(String key) {
|
||||||
net.minecraft.nbt.Tag tag = compoundTagSupplier.get().get(key);
|
net.minecraft.nbt.Tag tag = compoundTagSupplier.get().get(key);
|
||||||
if (tag instanceof net.minecraft.nbt.ListTag) {
|
if (tag instanceof net.minecraft.nbt.ListTag) {
|
||||||
|
@ -402,6 +402,7 @@ public class PaperweightRegen extends Regenerator<ChunkAccess, ProtoChunk, Level
|
|||||||
}
|
}
|
||||||
|
|
||||||
//util
|
//util
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
private void removeWorldFromWorldsMap() {
|
private void removeWorldFromWorldsMap() {
|
||||||
Fawe.instance().getQueueHandler().sync(() -> {
|
Fawe.instance().getQueueHandler().sync(() -> {
|
||||||
try {
|
try {
|
||||||
@ -421,6 +422,7 @@ public class PaperweightRegen extends Regenerator<ChunkAccess, ProtoChunk, Level
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||||
private BiomeSource fastOverworldBiomeSource(BiomeSource biomeSource) throws Exception {
|
private BiomeSource fastOverworldBiomeSource(BiomeSource biomeSource) throws Exception {
|
||||||
Field legacyBiomeInitLayerField = OverworldBiomeSource.class.getDeclaredField(
|
Field legacyBiomeInitLayerField = OverworldBiomeSource.class.getDeclaredField(
|
||||||
Refraction.pickName("legacyBiomeInitLayer", "i"));
|
Refraction.pickName("legacyBiomeInitLayer", "i"));
|
||||||
@ -584,17 +586,7 @@ public class PaperweightRegen extends Regenerator<ChunkAccess, ProtoChunk, Level
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class FastAreaLazy implements Area {
|
private record FastAreaLazy(ConcurrentHashMap<Long, Integer> sharedMap, PixelTransformer transformer) implements Area {
|
||||||
|
|
||||||
private final PixelTransformer transformer;
|
|
||||||
//ConcurrentHashMap is 50% faster that Long2IntLinkedOpenHashMap in a synchronized context
|
|
||||||
//using a map for each thread worsens the performance significantly due to cache misses (factor 5)
|
|
||||||
private final ConcurrentHashMap<Long, Integer> sharedMap;
|
|
||||||
|
|
||||||
public FastAreaLazy(ConcurrentHashMap<Long, Integer> sharedMap, PixelTransformer transformer) {
|
|
||||||
this.sharedMap = sharedMap;
|
|
||||||
this.transformer = transformer;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int get(int x, int z) {
|
public int get(int x, int z) {
|
||||||
|
@ -246,7 +246,7 @@ public class PaperweightFaweWorldNativeAccess implements WorldNativeAccess<Level
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (IntPair chunk : toSend) {
|
for (IntPair chunk : toSend) {
|
||||||
PaperweightPlatformAdapter.sendChunk(getLevel().getWorld().getHandle(), chunk.x, chunk.z, false);
|
PaperweightPlatformAdapter.sendChunk(getLevel().getWorld().getHandle(), chunk.x(), chunk.z(), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -262,7 +262,7 @@ public class PaperweightFaweWorldNativeAccess implements WorldNativeAccess<Level
|
|||||||
sideEffectSet != null && sideEffectSet.shouldApply(SideEffect.UPDATE)
|
sideEffectSet != null && sideEffectSet.shouldApply(SideEffect.UPDATE)
|
||||||
));
|
));
|
||||||
for (IntPair chunk : cachedChunksToSend) {
|
for (IntPair chunk : cachedChunksToSend) {
|
||||||
PaperweightPlatformAdapter.sendChunk(getLevel().getWorld().getHandle(), chunk.x, chunk.z, false);
|
PaperweightPlatformAdapter.sendChunk(getLevel().getWorld().getHandle(), chunk.x(), chunk.z(), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -309,6 +309,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public CompoundTag getEntity(UUID uuid) {
|
public CompoundTag getEntity(UUID uuid) {
|
||||||
Entity entity = serverLevel.getEntity(uuid);
|
Entity entity = serverLevel.getEntity(uuid);
|
||||||
if (entity != null) {
|
if (entity != null) {
|
||||||
@ -868,6 +869,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc
|
|||||||
* @return the given array to be filled with data, or a new array if null is given.
|
* @return the given array to be filled with data, or a new array if null is given.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public char[] update(int layer, char[] data, boolean aggressive) {
|
public char[] update(int layer, char[] data, boolean aggressive) {
|
||||||
LevelChunkSection section = getSections(aggressive)[layer];
|
LevelChunkSection section = getSections(aggressive)[layer];
|
||||||
// Section is null, return empty array
|
// Section is null, return empty array
|
||||||
@ -1064,6 +1066,7 @@ public class PaperweightGetBlocks extends CharGetBlocks implements BukkitGetBloc
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public synchronized boolean trim(boolean aggressive) {
|
public synchronized boolean trim(boolean aggressive) {
|
||||||
skyLight = new DataLayer[getSectionCount()];
|
skyLight = new DataLayer[getSectionCount()];
|
||||||
blockLight = new DataLayer[getSectionCount()];
|
blockLight = new DataLayer[getSectionCount()];
|
||||||
|
@ -67,6 +67,7 @@ public class PaperweightGetBlocks_Copy implements IChunkGet {
|
|||||||
return tiles.get(BlockVector3.at(x, y, z));
|
return tiles.get(BlockVector3.at(x, y, z));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||||
protected void storeEntity(Entity entity) {
|
protected void storeEntity(Entity entity) {
|
||||||
BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter();
|
BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter();
|
||||||
net.minecraft.nbt.CompoundTag compoundTag = new net.minecraft.nbt.CompoundTag();
|
net.minecraft.nbt.CompoundTag compoundTag = new net.minecraft.nbt.CompoundTag();
|
||||||
|
@ -559,6 +559,7 @@ public final class PaperweightPlatformAdapter extends NMSAdapter {
|
|||||||
return BiomeTypes.get(resourceLocation.toString().toLowerCase(Locale.ROOT));
|
return BiomeTypes.get(resourceLocation.toString().toLowerCase(Locale.ROOT));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
static void removeBeacon(BlockEntity beacon, LevelChunk levelChunk) {
|
static void removeBeacon(BlockEntity beacon, LevelChunk levelChunk) {
|
||||||
try {
|
try {
|
||||||
// Do the method ourselves to avoid trying to reflect generic method parameters
|
// Do the method ourselves to avoid trying to reflect generic method parameters
|
||||||
@ -594,13 +595,7 @@ public final class PaperweightPlatformAdapter extends NMSAdapter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static class FakeIdMapBlock implements IdMap<net.minecraft.world.level.block.state.BlockState> {
|
record FakeIdMapBlock(int size) implements IdMap<net.minecraft.world.level.block.state.BlockState> {
|
||||||
|
|
||||||
private final int size;
|
|
||||||
|
|
||||||
FakeIdMapBlock(int size) {
|
|
||||||
this.size = size;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getId(final net.minecraft.world.level.block.state.BlockState entry) {
|
public int getId(final net.minecraft.world.level.block.state.BlockState entry) {
|
||||||
@ -613,11 +608,6 @@ public final class PaperweightPlatformAdapter extends NMSAdapter {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public int size() {
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Iterator<net.minecraft.world.level.block.state.BlockState> iterator() {
|
public Iterator<net.minecraft.world.level.block.state.BlockState> iterator() {
|
||||||
@ -626,13 +616,7 @@ public final class PaperweightPlatformAdapter extends NMSAdapter {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static class FakeIdMapBiome implements IdMap<Biome> {
|
record FakeIdMapBiome(int size) implements IdMap<Biome> {
|
||||||
|
|
||||||
private final int size;
|
|
||||||
|
|
||||||
FakeIdMapBiome(int size) {
|
|
||||||
this.size = size;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getId(final Biome entry) {
|
public int getId(final Biome entry) {
|
||||||
@ -645,11 +629,6 @@ public final class PaperweightPlatformAdapter extends NMSAdapter {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public int size() {
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Iterator<Biome> iterator() {
|
public Iterator<Biome> iterator() {
|
||||||
|
@ -70,6 +70,7 @@ public class PaperweightStarlightRelighter implements Relighter {
|
|||||||
private final ReentrantLock areaLock = new ReentrantLock();
|
private final ReentrantLock areaLock = new ReentrantLock();
|
||||||
private final NMSRelighter delegate;
|
private final NMSRelighter delegate;
|
||||||
|
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
public PaperweightStarlightRelighter(ServerLevel serverLevel, IQueueExtent<IQueueChunk> queue) {
|
public PaperweightStarlightRelighter(ServerLevel serverLevel, IQueueExtent<IQueueChunk> queue) {
|
||||||
this.serverLevel = serverLevel;
|
this.serverLevel = serverLevel;
|
||||||
this.delegate = new NMSRelighter(queue);
|
this.delegate = new NMSRelighter(queue);
|
||||||
|
@ -16,6 +16,7 @@ public class PaperweightStarlightRelighterFactory implements RelighterFactory {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @Nonnull
|
public @Nonnull
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
Relighter createRelighter(RelightMode relightMode, World world, IQueueExtent<IQueueChunk> queue) {
|
Relighter createRelighter(RelightMode relightMode, World world, IQueueExtent<IQueueChunk> queue) {
|
||||||
org.bukkit.World w = Bukkit.getWorld(world.getName());
|
org.bukkit.World w = Bukkit.getWorld(world.getName());
|
||||||
if (w == null) {
|
if (w == null) {
|
||||||
|
@ -35,6 +35,7 @@ public class PaperweightLazyCompoundTag extends LazyCompoundTag {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public Map<String, Tag> getValue() {
|
public Map<String, Tag> getValue() {
|
||||||
if (compoundTag == null) {
|
if (compoundTag == null) {
|
||||||
compoundTag = (CompoundTag) WorldEditPlugin.getInstance().getBukkitImplAdapter().toNative(compoundTagSupplier.get());
|
compoundTag = (CompoundTag) WorldEditPlugin.getInstance().getBukkitImplAdapter().toNative(compoundTagSupplier.get());
|
||||||
@ -92,6 +93,7 @@ public class PaperweightLazyCompoundTag extends LazyCompoundTag {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public List<Tag> getList(String key) {
|
public List<Tag> getList(String key) {
|
||||||
net.minecraft.nbt.Tag tag = compoundTagSupplier.get().get(key);
|
net.minecraft.nbt.Tag tag = compoundTagSupplier.get().get(key);
|
||||||
if (tag instanceof net.minecraft.nbt.ListTag nbtList) {
|
if (tag instanceof net.minecraft.nbt.ListTag nbtList) {
|
||||||
@ -108,6 +110,7 @@ public class PaperweightLazyCompoundTag extends LazyCompoundTag {
|
|||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public ListTag getListTag(String key) {
|
public ListTag getListTag(String key) {
|
||||||
net.minecraft.nbt.Tag tag = compoundTagSupplier.get().get(key);
|
net.minecraft.nbt.Tag tag = compoundTagSupplier.get().get(key);
|
||||||
if (tag instanceof net.minecraft.nbt.ListTag) {
|
if (tag instanceof net.minecraft.nbt.ListTag) {
|
||||||
|
@ -184,6 +184,7 @@ public class PaperweightRegen extends Regenerator<ChunkAccess, ProtoChunk, Level
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
protected boolean initNewWorld() throws Exception {
|
protected boolean initNewWorld() throws Exception {
|
||||||
//world folder
|
//world folder
|
||||||
tempDir = java.nio.file.Files.createTempDirectory("FastAsyncWorldEditWorldGen");
|
tempDir = java.nio.file.Files.createTempDirectory("FastAsyncWorldEditWorldGen");
|
||||||
@ -385,6 +386,7 @@ public class PaperweightRegen extends Regenerator<ChunkAccess, ProtoChunk, Level
|
|||||||
}
|
}
|
||||||
|
|
||||||
//util
|
//util
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
private void removeWorldFromWorldsMap() {
|
private void removeWorldFromWorldsMap() {
|
||||||
Fawe.instance().getQueueHandler().sync(() -> {
|
Fawe.instance().getQueueHandler().sync(() -> {
|
||||||
try {
|
try {
|
||||||
|
@ -11,8 +11,6 @@ import java.lang.reflect.Method;
|
|||||||
|
|
||||||
public class BukkitQueueHandler extends QueueHandler {
|
public class BukkitQueueHandler extends QueueHandler {
|
||||||
|
|
||||||
private static final Logger LOGGER = LogManagerCompat.getLogger();
|
|
||||||
|
|
||||||
private volatile boolean timingsEnabled;
|
private volatile boolean timingsEnabled;
|
||||||
private static boolean alertTimingsChange = true;
|
private static boolean alertTimingsChange = true;
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ public class BrushListener implements Listener {
|
|||||||
BukkitPlayer player = BukkitAdapter.adapt(bukkitPlayer);
|
BukkitPlayer player = BukkitAdapter.adapt(bukkitPlayer);
|
||||||
LocalSession session = player.getSession();
|
LocalSession session = player.getSession();
|
||||||
Tool tool = session.getTool(player);
|
Tool tool = session.getTool(player);
|
||||||
if (tool instanceof ScrollTool) {
|
if (tool instanceof ScrollTool scrollable) {
|
||||||
final int slot = event.getNewSlot();
|
final int slot = event.getNewSlot();
|
||||||
final int oldSlot = event.getPreviousSlot();
|
final int oldSlot = event.getPreviousSlot();
|
||||||
final int ri;
|
final int ri;
|
||||||
@ -43,7 +43,6 @@ public class BrushListener implements Listener {
|
|||||||
} else {
|
} else {
|
||||||
ri = -1;
|
ri = -1;
|
||||||
}
|
}
|
||||||
ScrollTool scrollable = (ScrollTool) tool;
|
|
||||||
if (scrollable.increment(player, ri)) {
|
if (scrollable.increment(player, ri)) {
|
||||||
bukkitPlayer.getInventory().setHeldItemSlot(oldSlot);
|
bukkitPlayer.getInventory().setHeldItemSlot(oldSlot);
|
||||||
}
|
}
|
||||||
|
@ -53,8 +53,7 @@ public class WorldGuardFeature extends BukkitMaskManager implements Listener {
|
|||||||
if (region instanceof GlobalProtectedRegion) {
|
if (region instanceof GlobalProtectedRegion) {
|
||||||
return RegionWrapper.GLOBAL();
|
return RegionWrapper.GLOBAL();
|
||||||
}
|
}
|
||||||
if (region instanceof ProtectedPolygonalRegion) {
|
if (region instanceof ProtectedPolygonalRegion casted) {
|
||||||
ProtectedPolygonalRegion casted = (ProtectedPolygonalRegion) region;
|
|
||||||
BlockVector3 max = region.getMaximumPoint();
|
BlockVector3 max = region.getMaximumPoint();
|
||||||
BlockVector3 min = region.getMinimumPoint();
|
BlockVector3 min = region.getMinimumPoint();
|
||||||
return new Polygonal2DRegion(null, casted.getPoints(), min.getBlockY(), max.getBlockY());
|
return new Polygonal2DRegion(null, casted.getPoints(), min.getBlockY(), max.getBlockY());
|
||||||
|
@ -43,6 +43,7 @@ import java.util.UUID;
|
|||||||
|
|
||||||
import static org.bukkit.Bukkit.getWorld;
|
import static org.bukkit.Bukkit.getWorld;
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
public class FaweDelegateRegionManager {
|
public class FaweDelegateRegionManager {
|
||||||
|
|
||||||
public boolean setCuboids(
|
public boolean setCuboids(
|
||||||
|
@ -50,6 +50,7 @@ import java.util.UUID;
|
|||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.zip.GZIPInputStream;
|
import java.util.zip.GZIPInputStream;
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
public class FaweDelegateSchematicHandler {
|
public class FaweDelegateSchematicHandler {
|
||||||
|
|
||||||
private static final Logger LOGGER = LogManagerCompat.getLogger();
|
private static final Logger LOGGER = LogManagerCompat.getLogger();
|
||||||
|
@ -25,6 +25,7 @@ import java.util.List;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
@SuppressWarnings({"unused", "rawtypes"})
|
||||||
public class FaweQueueCoordinator extends QueueCoordinator {
|
public class FaweQueueCoordinator extends QueueCoordinator {
|
||||||
|
|
||||||
public final IQueueExtent<IQueueChunk> instance;
|
public final IQueueExtent<IQueueChunk> instance;
|
||||||
|
@ -33,6 +33,7 @@ import java.util.concurrent.CompletableFuture;
|
|||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
@CommandDeclaration(command = "generatebiome",
|
@CommandDeclaration(command = "generatebiome",
|
||||||
permission = "plots.generatebiome",
|
permission = "plots.generatebiome",
|
||||||
category = CommandCategory.APPEARANCE,
|
category = CommandCategory.APPEARANCE,
|
||||||
|
@ -120,7 +120,7 @@ public enum FaweCache implements Trimable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public <T, V> LoadingCache<T, V> createCache(Supplier<V> withInitial) {
|
public <T, V> LoadingCache<T, V> createCache(Supplier<V> withInitial) {
|
||||||
return CacheBuilder.newBuilder().build(new CacheLoader<T, V>() {
|
return CacheBuilder.newBuilder().build(new CacheLoader<>() {
|
||||||
@Override
|
@Override
|
||||||
public V load(@Nonnull T key) {
|
public V load(@Nonnull T key) {
|
||||||
return withInitial.get();
|
return withInitial.get();
|
||||||
@ -129,7 +129,7 @@ public enum FaweCache implements Trimable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public <T, V> LoadingCache<T, V> createCache(Function<T, V> withInitial) {
|
public <T, V> LoadingCache<T, V> createCache(Function<T, V> withInitial) {
|
||||||
return CacheBuilder.newBuilder().build(new CacheLoader<T, V>() {
|
return CacheBuilder.newBuilder().build(new CacheLoader<>() {
|
||||||
@Override
|
@Override
|
||||||
public V load(@Nonnull T key) {
|
public V load(@Nonnull T key) {
|
||||||
return withInitial.apply(key);
|
return withInitial.apply(key);
|
||||||
@ -246,9 +246,6 @@ public enum FaweCache implements Trimable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert raw char array to palette
|
* Convert raw char array to palette
|
||||||
*
|
|
||||||
* @param layerOffset
|
|
||||||
* @param blocks
|
|
||||||
* @return palette
|
* @return palette
|
||||||
*/
|
*/
|
||||||
public Palette toPalette(int layerOffset, char[] blocks) {
|
public Palette toPalette(int layerOffset, char[] blocks) {
|
||||||
@ -257,9 +254,6 @@ public enum FaweCache implements Trimable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert raw int array to palette
|
* Convert raw int array to palette
|
||||||
*
|
|
||||||
* @param layerOffset
|
|
||||||
* @param blocks
|
|
||||||
* @return palette
|
* @return palette
|
||||||
*/
|
*/
|
||||||
public Palette toPalette(int layerOffset, int[] blocks) {
|
public Palette toPalette(int layerOffset, int[] blocks) {
|
||||||
@ -344,8 +338,6 @@ public enum FaweCache implements Trimable {
|
|||||||
/**
|
/**
|
||||||
* Convert raw int array to unstretched palette (1.16)
|
* Convert raw int array to unstretched palette (1.16)
|
||||||
*
|
*
|
||||||
* @param layerOffset
|
|
||||||
* @param blocks
|
|
||||||
* @return palette
|
* @return palette
|
||||||
*/
|
*/
|
||||||
public Palette toPaletteUnstretched(int layerOffset, char[] blocks) {
|
public Palette toPaletteUnstretched(int layerOffset, char[] blocks) {
|
||||||
|
@ -9,13 +9,7 @@ import com.sk89q.worldedit.function.mask.SolidBlockMask;
|
|||||||
import com.sk89q.worldedit.function.pattern.Pattern;
|
import com.sk89q.worldedit.function.pattern.Pattern;
|
||||||
import com.sk89q.worldedit.math.BlockVector3;
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
|
|
||||||
public class AngleBrush implements Brush {
|
public record AngleBrush(int distance) implements Brush {
|
||||||
|
|
||||||
private final int distance;
|
|
||||||
|
|
||||||
public AngleBrush(int distance) {
|
|
||||||
this.distance = distance;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void build(EditSession editSession, BlockVector3 position, Pattern pattern, double size) throws
|
public void build(EditSession editSession, BlockVector3 position, Pattern pattern, double size) throws
|
||||||
|
@ -7,19 +7,7 @@ import com.sk89q.worldedit.function.pattern.Pattern;
|
|||||||
import com.sk89q.worldedit.math.BlockVector3;
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
import com.sk89q.worldedit.math.Vector3;
|
import com.sk89q.worldedit.math.Vector3;
|
||||||
|
|
||||||
public class BlobBrush implements Brush {
|
public record BlobBrush(Vector3 radius, double frequency, double amplitude, double sphericity) implements Brush {
|
||||||
|
|
||||||
private final double amplitude;
|
|
||||||
private final double frequency;
|
|
||||||
private final Vector3 radius;
|
|
||||||
private final double sphericity;
|
|
||||||
|
|
||||||
public BlobBrush(Vector3 radius, double frequency, double amplitude, double sphericity) {
|
|
||||||
this.frequency = frequency;
|
|
||||||
this.amplitude = amplitude;
|
|
||||||
this.radius = radius;
|
|
||||||
this.sphericity = sphericity;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void build(EditSession editSession, BlockVector3 position, Pattern pattern, double size) throws
|
public void build(EditSession editSession, BlockVector3 position, Pattern pattern, double size) throws
|
||||||
|
@ -38,10 +38,9 @@ public class CatenaryBrush implements Brush, ResettableTool {
|
|||||||
public void build(EditSession editSession, BlockVector3 pos2, final Pattern pattern, double size) throws
|
public void build(EditSession editSession, BlockVector3 pos2, final Pattern pattern, double size) throws
|
||||||
MaxChangedBlocksException {
|
MaxChangedBlocksException {
|
||||||
Actor actor = editSession.getActor();
|
Actor actor = editSession.getActor();
|
||||||
if (!(actor instanceof Player)) {
|
if (!(actor instanceof Player player)) {
|
||||||
throw FaweCache.PLAYER_ONLY;
|
throw FaweCache.PLAYER_ONLY;
|
||||||
}
|
}
|
||||||
Player player = (Player) actor;
|
|
||||||
if (pos1 == null || pos2.equals(pos1)) {
|
if (pos1 == null || pos2.equals(pos1)) {
|
||||||
pos1 = pos2;
|
pos1 = pos2;
|
||||||
actor.print(Caption.of("fawe.worldedit.brush.brush.line.primary", pos2));
|
actor.print(Caption.of("fawe.worldedit.brush.brush.line.primary", pos2));
|
||||||
|
@ -11,38 +11,17 @@ import com.sk89q.worldedit.math.BlockVector3;
|
|||||||
import com.sk89q.worldedit.math.Vector3;
|
import com.sk89q.worldedit.math.Vector3;
|
||||||
import com.sk89q.worldedit.math.transform.AffineTransform;
|
import com.sk89q.worldedit.math.transform.AffineTransform;
|
||||||
|
|
||||||
public class CircleBrush implements Brush {
|
public record CircleBrush(boolean filled) implements Brush {
|
||||||
|
|
||||||
private final boolean filled;
|
|
||||||
|
|
||||||
public CircleBrush(boolean filled) {
|
|
||||||
|
|
||||||
this.filled = filled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void build(EditSession editSession, BlockVector3 position, Pattern pattern, double size) throws
|
public void build(EditSession editSession, BlockVector3 position, Pattern pattern, double size) throws
|
||||||
MaxChangedBlocksException {
|
MaxChangedBlocksException {
|
||||||
Actor actor = editSession.getActor();
|
Actor actor = editSession.getActor();
|
||||||
if (!(actor instanceof Player)) {
|
if (!(actor instanceof Player player)) {
|
||||||
throw FaweCache.PLAYER_ONLY;
|
throw FaweCache.PLAYER_ONLY;
|
||||||
}
|
}
|
||||||
Player player = (Player) actor;
|
|
||||||
Vector3 normal = position.toVector3().subtract(player.getLocation());
|
Vector3 normal = position.toVector3().subtract(player.getLocation());
|
||||||
editSession.makeCircle(position, pattern, size, size, size, filled, normal);
|
editSession.makeCircle(position, pattern, size, size, size, filled, normal);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Vector3 any90Rotate(Vector3 normal) {
|
|
||||||
normal = normal.normalize();
|
|
||||||
if (normal.getX() == 1 || normal.getY() == 1 || normal.getZ() == 1) {
|
|
||||||
return Vector3.at(normal.getZ(), normal.getX(), normal.getY());
|
|
||||||
}
|
|
||||||
AffineTransform affine = new AffineTransform();
|
|
||||||
affine = affine.rotateX(90);
|
|
||||||
affine = affine.rotateY(90);
|
|
||||||
affine = affine.rotateZ(90);
|
|
||||||
Vector3 random = affine.apply(normal);
|
|
||||||
return random.cross(normal).normalize();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -43,10 +43,9 @@ public class CommandBrush implements Brush {
|
|||||||
.replace("{size}", Integer.toString(radius));
|
.replace("{size}", Integer.toString(radius));
|
||||||
|
|
||||||
Actor actor = editSession.getActor();
|
Actor actor = editSession.getActor();
|
||||||
if (!(actor instanceof Player)) {
|
if (!(actor instanceof Player player)) {
|
||||||
throw FaweCache.PLAYER_ONLY;
|
throw FaweCache.PLAYER_ONLY;
|
||||||
}
|
}
|
||||||
Player player = (Player) actor;
|
|
||||||
//Use max world height to allow full coverage of the world height
|
//Use max world height to allow full coverage of the world height
|
||||||
Location face = player.getBlockTraceFace(editSession.getWorld().getMaxY(), true);
|
Location face = player.getBlockTraceFace(editSession.getWorld().getMaxY(), true);
|
||||||
if (face == null) {
|
if (face == null) {
|
||||||
|
@ -39,7 +39,7 @@ public class ImageBrush implements Brush {
|
|||||||
|
|
||||||
private final ColorFunction colorFunction;
|
private final ColorFunction colorFunction;
|
||||||
|
|
||||||
public ImageBrush(BufferedImage image, LocalSession session, boolean alpha /*, boolean glass */) throws IOException {
|
public ImageBrush(BufferedImage image, LocalSession session, boolean alpha /*, boolean glass */) {
|
||||||
this.session = session;
|
this.session = session;
|
||||||
this.table = new SummedColorTable(image, alpha);
|
this.table = new SummedColorTable(image, alpha);
|
||||||
this.width = image.getWidth();
|
this.width = image.getWidth();
|
||||||
@ -89,10 +89,9 @@ public class ImageBrush implements Brush {
|
|||||||
double scale = Math.max(width, height) / sizeDouble;
|
double scale = Math.max(width, height) / sizeDouble;
|
||||||
|
|
||||||
Actor actor = editSession.getActor();
|
Actor actor = editSession.getActor();
|
||||||
if (!(actor instanceof Player)) {
|
if (!(actor instanceof Player player)) {
|
||||||
throw FaweCache.PLAYER_ONLY;
|
throw FaweCache.PLAYER_ONLY;
|
||||||
}
|
}
|
||||||
Player player = (Player) actor;
|
|
||||||
Location loc = player.getLocation();
|
Location loc = player.getLocation();
|
||||||
float yaw = loc.getYaw();
|
float yaw = loc.getYaw();
|
||||||
float pitch = loc.getPitch();
|
float pitch = loc.getPitch();
|
||||||
|
@ -34,8 +34,6 @@ import java.util.function.Supplier;
|
|||||||
|
|
||||||
public class InspectBrush extends BrushTool {
|
public class InspectBrush extends BrushTool {
|
||||||
|
|
||||||
private static final Logger LOGGER = LogManagerCompat.getLogger();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct the tool.
|
* Construct the tool.
|
||||||
*/
|
*/
|
||||||
|
@ -14,19 +14,7 @@ import com.sk89q.worldedit.session.ClipboardHolder;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class PopulateSchem implements Brush {
|
public record PopulateSchem(Mask mask, List<ClipboardHolder> clipboards, int rarity, boolean randomRotate) implements Brush {
|
||||||
|
|
||||||
private final Mask mask;
|
|
||||||
private final boolean randomRotate;
|
|
||||||
private final List<ClipboardHolder> clipboards;
|
|
||||||
private final int rarity;
|
|
||||||
|
|
||||||
public PopulateSchem(Mask mask, List<ClipboardHolder> clipboards, int rarity, boolean randomRotate) {
|
|
||||||
this.mask = mask;
|
|
||||||
this.clipboards = clipboards;
|
|
||||||
this.rarity = rarity;
|
|
||||||
this.randomRotate = randomRotate;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void build(EditSession editSession, BlockVector3 position, Pattern pattern, double size) throws
|
public void build(EditSession editSession, BlockVector3 position, Pattern pattern, double size) throws
|
||||||
|
@ -14,13 +14,7 @@ import com.sk89q.worldedit.function.visitor.RecursiveVisitor;
|
|||||||
import com.sk89q.worldedit.math.BlockVector3;
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
import com.sk89q.worldedit.world.block.BlockState;
|
import com.sk89q.worldedit.world.block.BlockState;
|
||||||
|
|
||||||
public class RecurseBrush implements Brush {
|
public record RecurseBrush(boolean dfs) implements Brush {
|
||||||
|
|
||||||
private final boolean dfs;
|
|
||||||
|
|
||||||
public RecurseBrush(boolean dfs) {
|
|
||||||
this.dfs = dfs;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void build(EditSession editSession, BlockVector3 position, Pattern to, double size) throws MaxChangedBlocksException {
|
public void build(EditSession editSession, BlockVector3 position, Pattern to, double size) throws MaxChangedBlocksException {
|
||||||
|
@ -10,17 +10,7 @@ import com.sk89q.worldedit.math.Vector3;
|
|||||||
|
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
public class RockBrush implements Brush {
|
public record RockBrush(double amplitude, double frequency, Vector3 radius) implements Brush {
|
||||||
|
|
||||||
private final double amplitude;
|
|
||||||
private final double frequency;
|
|
||||||
private final Vector3 radius;
|
|
||||||
|
|
||||||
public RockBrush(Vector3 radius, double frequency, double amplitude) {
|
|
||||||
this.frequency = frequency;
|
|
||||||
this.amplitude = amplitude;
|
|
||||||
this.radius = radius;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void build(EditSession editSession, BlockVector3 position, Pattern pattern, double size) throws
|
public void build(EditSession editSession, BlockVector3 position, Pattern pattern, double size) throws
|
||||||
|
@ -50,10 +50,9 @@ public class ScatterCommand extends ScatterBrush {
|
|||||||
.replace("{size}", Integer.toString(radius));
|
.replace("{size}", Integer.toString(radius));
|
||||||
|
|
||||||
Actor actor = editSession.getActor();
|
Actor actor = editSession.getActor();
|
||||||
if (!(actor instanceof Player)) {
|
if (!(actor instanceof Player player)) {
|
||||||
throw FaweCache.PLAYER_ONLY;
|
throw FaweCache.PLAYER_ONLY;
|
||||||
}
|
}
|
||||||
Player player = (Player) actor;
|
|
||||||
player.setSelection(selector);
|
player.setSelection(selector);
|
||||||
List<String> cmds = StringMan.split(replaced, ';');
|
List<String> cmds = StringMan.split(replaced, ';');
|
||||||
for (String cmd : cmds) {
|
for (String cmd : cmds) {
|
||||||
|
@ -137,61 +137,4 @@ public class SplineBrush implements Brush, ResettableTool {
|
|||||||
return sum.multiply(1.0 / points.size());
|
return sum.multiply(1.0 / points.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
private BlockVector3 normal(Collection<BlockVector3> points, BlockVector3 centroid) {
|
|
||||||
int n = points.size();
|
|
||||||
switch (n) {
|
|
||||||
case 1:
|
|
||||||
return null;
|
|
||||||
case 2:
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Calc full 3x3 covariance matrix, excluding symmetries:
|
|
||||||
double xx = 0.0;
|
|
||||||
double xy = 0.0;
|
|
||||||
double xz = 0.0;
|
|
||||||
double yy = 0.0;
|
|
||||||
double yz = 0.0;
|
|
||||||
double zz = 0.0;
|
|
||||||
|
|
||||||
MutableVector3 r = new MutableVector3();
|
|
||||||
for (BlockVector3 p : points) {
|
|
||||||
r.mutX(p.getX() - centroid.getX());
|
|
||||||
r.mutY(p.getY() - centroid.getY());
|
|
||||||
r.mutZ(p.getZ() - centroid.getZ());
|
|
||||||
xx += r.getX() * r.getX();
|
|
||||||
xy += r.getX() * r.getY();
|
|
||||||
xz += r.getX() * r.getZ();
|
|
||||||
yy += r.getY() * r.getY();
|
|
||||||
yz += r.getY() * r.getZ();
|
|
||||||
zz += r.getZ() * r.getZ();
|
|
||||||
}
|
|
||||||
|
|
||||||
double det_x = yy * zz - yz * yz;
|
|
||||||
double det_y = xx * zz - xz * xz;
|
|
||||||
double det_z = xx * yy - xy * xy;
|
|
||||||
|
|
||||||
double det_max = Math.max(Math.max(det_x, det_y), det_z);
|
|
||||||
if (det_max <= 0.0) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pick path with best conditioning:
|
|
||||||
BlockVector3 dir;
|
|
||||||
if (det_max == det_x) {
|
|
||||||
double a = (xz * yz - xy * zz) / det_x;
|
|
||||||
double b = (xy * yz - xz * yy) / det_x;
|
|
||||||
dir = BlockVector3.at(1.0, a, b);
|
|
||||||
} else if (det_max == det_y) {
|
|
||||||
double a = (yz * xz - xy * zz) / det_y;
|
|
||||||
double b = (xy * xz - yz * xx) / det_y;
|
|
||||||
dir = BlockVector3.at(a, 1.0, b);
|
|
||||||
} else {
|
|
||||||
double a = (yz * xy - xz * yy) / det_z;
|
|
||||||
double b = (xz * xy - yz * xx) / det_z;
|
|
||||||
dir = BlockVector3.at(a, b, 1.0);
|
|
||||||
}
|
|
||||||
return dir.normalize();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -51,10 +51,9 @@ public class StencilBrush extends HeightBrush {
|
|||||||
final SolidBlockMask solid = new SolidBlockMask(editSession);
|
final SolidBlockMask solid = new SolidBlockMask(editSession);
|
||||||
|
|
||||||
Actor actor = editSession.getActor();
|
Actor actor = editSession.getActor();
|
||||||
if (!(actor instanceof Player)) {
|
if (!(actor instanceof Player player)) {
|
||||||
throw FaweCache.PLAYER_ONLY;
|
throw FaweCache.PLAYER_ONLY;
|
||||||
}
|
}
|
||||||
Player player = (Player) actor;
|
|
||||||
Location loc = player.getLocation();
|
Location loc = player.getLocation();
|
||||||
float yaw = loc.getYaw();
|
float yaw = loc.getYaw();
|
||||||
float pitch = loc.getPitch();
|
float pitch = loc.getPitch();
|
||||||
|
@ -21,7 +21,6 @@ public class SurfaceSphereBrush implements Brush {
|
|||||||
public void build(EditSession editSession, BlockVector3 position, Pattern pattern, double size) throws
|
public void build(EditSession editSession, BlockVector3 position, Pattern pattern, double size) throws
|
||||||
MaxChangedBlocksException {
|
MaxChangedBlocksException {
|
||||||
SurfaceMask surface = new SurfaceMask(editSession);
|
SurfaceMask surface = new SurfaceMask(editSession);
|
||||||
final SolidBlockMask solid = new SolidBlockMask(editSession);
|
|
||||||
final RadiusMask radius = new RadiusMask(0, (int) size);
|
final RadiusMask radius = new RadiusMask(0, (int) size);
|
||||||
RecursiveVisitor visitor = new RecursiveVisitor(
|
RecursiveVisitor visitor = new RecursiveVisitor(
|
||||||
new MaskIntersection(surface, radius),
|
new MaskIntersection(surface, radius),
|
||||||
|
@ -52,8 +52,6 @@ public abstract class Scroll implements ScrollTool {
|
|||||||
parserContext.setWorld(player.getWorld());
|
parserContext.setWorld(player.getWorld());
|
||||||
parserContext.setSession(session);
|
parserContext.setSession(session);
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case NONE:
|
|
||||||
return null;
|
|
||||||
case CLIPBOARD:
|
case CLIPBOARD:
|
||||||
if (arguments.size() != 2) {
|
if (arguments.size() != 2) {
|
||||||
if (message) {
|
if (message) {
|
||||||
|
@ -18,9 +18,6 @@ import com.sk89q.worldedit.session.ClipboardHolder;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* An implementation of a {@link Spline} using a Clipboard as source for the structure.
|
* An implementation of a {@link Spline} using a Clipboard as source for the structure.
|
||||||
*
|
|
||||||
* @author Schuwi
|
|
||||||
* @version 1.0
|
|
||||||
*/
|
*/
|
||||||
public class ClipboardSpline extends Spline {
|
public class ClipboardSpline extends Spline {
|
||||||
|
|
||||||
|
@ -15,9 +15,6 @@ import java.util.List;
|
|||||||
* Embodies an abstract implementation for pasting structures along a spline.<br>
|
* Embodies an abstract implementation for pasting structures along a spline.<br>
|
||||||
* A curve is being interpolated by the provided {@link Interpolation} implementation
|
* A curve is being interpolated by the provided {@link Interpolation} implementation
|
||||||
* and the structure is pasted along this curve by the specific Spline implementation.
|
* and the structure is pasted along this curve by the specific Spline implementation.
|
||||||
*
|
|
||||||
* @author Schuwi
|
|
||||||
* @version 1.0
|
|
||||||
*/
|
*/
|
||||||
public abstract class Spline {
|
public abstract class Spline {
|
||||||
|
|
||||||
@ -202,19 +199,7 @@ public abstract class Spline {
|
|||||||
return finalPosition;
|
return finalPosition;
|
||||||
}
|
}
|
||||||
|
|
||||||
private class Section {
|
private record Section(double uniStart, double uniLength, double flexStart, double flexLength) {
|
||||||
|
|
||||||
final double uniStart;
|
|
||||||
final double uniLength;
|
|
||||||
final double flexStart;
|
|
||||||
final double flexLength;
|
|
||||||
|
|
||||||
Section(double uniStart, double uniLength, double flexStart, double flexLength) {
|
|
||||||
this.uniStart = uniStart;
|
|
||||||
this.uniLength = uniLength;
|
|
||||||
this.flexStart = flexStart;
|
|
||||||
this.flexLength = flexLength;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,23 +90,20 @@ public class SweepBrush implements Brush, ResettableTool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (copies) {
|
switch (copies) {
|
||||||
case 1: {
|
case 1 -> {
|
||||||
spline.pastePosition(0D);
|
spline.pastePosition(0D);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
case -1: {
|
case -1 -> {
|
||||||
double length = interpol.arcLength(0, 1);
|
double length = interpol.arcLength(0, 1);
|
||||||
double step = 1 / (length * quality);
|
double step = 1 / (length * quality);
|
||||||
for (double pos = 0; pos <= 1; pos += step) {
|
for (double pos = 0; pos <= 1; pos += step) {
|
||||||
spline.pastePosition(pos);
|
spline.pastePosition(pos);
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
default: {
|
default -> {
|
||||||
for (double pos = 0D; pos <= 1D; pos += 1D / (copies - 1)) {
|
for (double pos = 0D; pos <= 1D; pos += 1D / (copies - 1)) {
|
||||||
spline.pastePosition(pos);
|
spline.pastePosition(pos);
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
actor.print(Caption.of("fawe.worldedit.brush.spline.secondary"));
|
actor.print(Caption.of("fawe.worldedit.brush.spline.secondary"));
|
||||||
|
@ -42,7 +42,7 @@ public class Caption {
|
|||||||
private static Component color(TextComponent text) {
|
private static Component color(TextComponent text) {
|
||||||
String content = text.content();
|
String content = text.content();
|
||||||
if (colorCodes.matcher(content).find()) {
|
if (colorCodes.matcher(content).find()) {
|
||||||
TextComponent legacy = LegacyComponentSerializer.INSTANCE.deserialize(content, '&');
|
TextComponent legacy = LegacyComponentSerializer.legacy().deserialize(content, '&');
|
||||||
legacy.style().merge(text.style(), Style.Merge.Strategy.IF_ABSENT_ON_TARGET);
|
legacy.style().merge(text.style(), Style.Merge.Strategy.IF_ABSENT_ON_TARGET);
|
||||||
if (!text.children().isEmpty()) {
|
if (!text.children().isEmpty()) {
|
||||||
text = TextComponent.builder().append(legacy).append(text.children()).build();
|
text = TextComponent.builder().append(legacy).append(text.children()).build();
|
||||||
@ -86,8 +86,7 @@ public class Caption {
|
|||||||
if (children != (children = color(parent, children))) {
|
if (children != (children = color(parent, children))) {
|
||||||
parent = parent.children(children);
|
parent = parent.children(children);
|
||||||
}
|
}
|
||||||
if (parent instanceof TranslatableComponent) {
|
if (parent instanceof TranslatableComponent tc) {
|
||||||
TranslatableComponent tc = (TranslatableComponent) parent;
|
|
||||||
List<Component> args = tc.args();
|
List<Component> args = tc.args();
|
||||||
if (args != (args = color(parent, args))) {
|
if (args != (args = color(parent, args))) {
|
||||||
parent = tc.args(args);
|
parent = tc.args(args);
|
||||||
|
@ -100,7 +100,6 @@ public class Config {
|
|||||||
* Set all values in the file (load first to avoid overwriting).
|
* Set all values in the file (load first to avoid overwriting).
|
||||||
*/
|
*/
|
||||||
public void save(File file) {
|
public void save(File file) {
|
||||||
Class<? extends Config> root = getClass();
|
|
||||||
try {
|
try {
|
||||||
if (!file.exists()) {
|
if (!file.exists()) {
|
||||||
File parent = file.getParentFile();
|
File parent = file.getParentFile();
|
||||||
@ -198,23 +197,6 @@ public class Config {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the static fields in a section.
|
|
||||||
*/
|
|
||||||
private Map<String, Object> getFields(Class<?> clazz) {
|
|
||||||
HashMap<String, Object> map = new HashMap<>();
|
|
||||||
for (Field field : clazz.getFields()) {
|
|
||||||
if (Modifier.isStatic(field.getModifiers())) {
|
|
||||||
try {
|
|
||||||
map.put(toNodeName(field.getName()), field.get(null));
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String toYamlString(Object value, String spacing) {
|
private String toYamlString(Object value, String spacing) {
|
||||||
if (value instanceof List) {
|
if (value instanceof List) {
|
||||||
Collection<?> listValue = (Collection<?>) value;
|
Collection<?> listValue = (Collection<?>) value;
|
||||||
@ -314,19 +296,6 @@ public class Config {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the field for a specific config node.
|
|
||||||
*
|
|
||||||
* @param split the node (split by period)
|
|
||||||
*/
|
|
||||||
private Field getField(String[] split, Class<?> root) {
|
|
||||||
Object instance = getInstance(split, root);
|
|
||||||
if (instance == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return getField(split, instance);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the field for a specific config node and instance.
|
* Get the field for a specific config node and instance.
|
||||||
* <p>
|
* <p>
|
||||||
|
@ -3,7 +3,6 @@ package com.fastasyncworldedit.core.configuration;
|
|||||||
/**
|
/**
|
||||||
* Exception thrown when attempting to load an invalid {@link Configuration}
|
* Exception thrown when attempting to load an invalid {@link Configuration}
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("serial")
|
|
||||||
public class InvalidConfigurationException extends Exception {
|
public class InvalidConfigurationException extends Exception {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -76,8 +76,7 @@ public class MemorySection implements ConfigurationSection {
|
|||||||
return Double.parseDouble((String) obj);
|
return Double.parseDouble((String) obj);
|
||||||
} catch (NumberFormatException ignored) {
|
} catch (NumberFormatException ignored) {
|
||||||
}
|
}
|
||||||
} else if (obj instanceof List) {
|
} else if (obj instanceof List<?> val) {
|
||||||
List<?> val = (List<?>) obj;
|
|
||||||
if (!val.isEmpty()) {
|
if (!val.isEmpty()) {
|
||||||
return toDouble(val.get(0), def);
|
return toDouble(val.get(0), def);
|
||||||
}
|
}
|
||||||
@ -94,8 +93,7 @@ public class MemorySection implements ConfigurationSection {
|
|||||||
return Integer.parseInt((String) obj);
|
return Integer.parseInt((String) obj);
|
||||||
} catch (NumberFormatException ignored) {
|
} catch (NumberFormatException ignored) {
|
||||||
}
|
}
|
||||||
} else if (obj instanceof List) {
|
} else if (obj instanceof List<?> val) {
|
||||||
List<?> val = (List<?>) obj;
|
|
||||||
if (!val.isEmpty()) {
|
if (!val.isEmpty()) {
|
||||||
return toInt(val.get(0), def);
|
return toInt(val.get(0), def);
|
||||||
}
|
}
|
||||||
@ -112,8 +110,7 @@ public class MemorySection implements ConfigurationSection {
|
|||||||
return Long.parseLong((String) obj);
|
return Long.parseLong((String) obj);
|
||||||
} catch (NumberFormatException ignored) {
|
} catch (NumberFormatException ignored) {
|
||||||
}
|
}
|
||||||
} else if (obj instanceof List) {
|
} else if (obj instanceof List<?> val) {
|
||||||
List<?> val = (List<?>) obj;
|
|
||||||
if (!val.isEmpty()) {
|
if (!val.isEmpty()) {
|
||||||
return toLong(val.get(0), def);
|
return toLong(val.get(0), def);
|
||||||
}
|
}
|
||||||
@ -706,8 +703,7 @@ public class MemorySection implements ConfigurationSection {
|
|||||||
for (Object object : list) {
|
for (Object object : list) {
|
||||||
if (object instanceof Character) {
|
if (object instanceof Character) {
|
||||||
result.add((Character) object);
|
result.add((Character) object);
|
||||||
} else if (object instanceof String) {
|
} else if (object instanceof String str) {
|
||||||
String str = (String) object;
|
|
||||||
|
|
||||||
if (str.length() == 1) {
|
if (str.length() == 1) {
|
||||||
result.add(str.charAt(0));
|
result.add(str.charAt(0));
|
||||||
@ -797,14 +793,12 @@ public class MemorySection implements ConfigurationSection {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void mapChildrenKeys(Set<String> output, ConfigurationSection section, boolean deep) {
|
protected void mapChildrenKeys(Set<String> output, ConfigurationSection section, boolean deep) {
|
||||||
if (section instanceof MemorySection) {
|
if (section instanceof MemorySection sec) {
|
||||||
MemorySection sec = (MemorySection) section;
|
|
||||||
|
|
||||||
for (Map.Entry<String, Object> entry : sec.map.entrySet()) {
|
for (Map.Entry<String, Object> entry : sec.map.entrySet()) {
|
||||||
output.add(createPath(section, entry.getKey(), this));
|
output.add(createPath(section, entry.getKey(), this));
|
||||||
|
|
||||||
if (deep && (entry.getValue() instanceof ConfigurationSection)) {
|
if (deep && (entry.getValue() instanceof ConfigurationSection subsection)) {
|
||||||
ConfigurationSection subsection = (ConfigurationSection) entry.getValue();
|
|
||||||
mapChildrenKeys(output, subsection, deep);
|
mapChildrenKeys(output, subsection, deep);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -818,8 +812,7 @@ public class MemorySection implements ConfigurationSection {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void mapChildrenValues(Map<String, Object> output, ConfigurationSection section, boolean deep) {
|
protected void mapChildrenValues(Map<String, Object> output, ConfigurationSection section, boolean deep) {
|
||||||
if (section instanceof MemorySection) {
|
if (section instanceof MemorySection sec) {
|
||||||
MemorySection sec = (MemorySection) section;
|
|
||||||
|
|
||||||
for (Map.Entry<String, Object> entry : sec.map.entrySet()) {
|
for (Map.Entry<String, Object> entry : sec.map.entrySet()) {
|
||||||
output.put(createPath(section, entry.getKey(), this), entry.getValue());
|
output.put(createPath(section, entry.getKey(), this), entry.getValue());
|
||||||
|
@ -31,8 +31,10 @@ public class Settings extends Config {
|
|||||||
public boolean PROTOCOL_SUPPORT_FIX = false;
|
public boolean PROTOCOL_SUPPORT_FIX = false;
|
||||||
@Comment("These first 6 aren't configurable") // This is a comment
|
@Comment("These first 6 aren't configurable") // This is a comment
|
||||||
@Final // Indicates that this value isn't configurable
|
@Final // Indicates that this value isn't configurable
|
||||||
|
@SuppressWarnings("unused")
|
||||||
public String ISSUES = "https://github.com/IntellectualSites/FastAsyncWorldEdit/issues";
|
public String ISSUES = "https://github.com/IntellectualSites/FastAsyncWorldEdit/issues";
|
||||||
@Final
|
@Final
|
||||||
|
@SuppressWarnings("unused")
|
||||||
public String WIKI = "https://github.com/IntellectualSites/FastAsyncWorldEdit-Documentation/wiki";
|
public String WIKI = "https://github.com/IntellectualSites/FastAsyncWorldEdit-Documentation/wiki";
|
||||||
@Final
|
@Final
|
||||||
public String DATE; // These values are set from FAWE before loading
|
public String DATE; // These values are set from FAWE before loading
|
||||||
|
@ -1,607 +0,0 @@
|
|||||||
package com.fastasyncworldedit.core.configuration;
|
|
||||||
|
|
||||||
import org.yaml.snakeyaml.DumperOptions;
|
|
||||||
import org.yaml.snakeyaml.DumperOptions.FlowStyle;
|
|
||||||
import org.yaml.snakeyaml.composer.Composer;
|
|
||||||
import org.yaml.snakeyaml.constructor.BaseConstructor;
|
|
||||||
import org.yaml.snakeyaml.constructor.Constructor;
|
|
||||||
import org.yaml.snakeyaml.emitter.Emitable;
|
|
||||||
import org.yaml.snakeyaml.emitter.Emitter;
|
|
||||||
import org.yaml.snakeyaml.error.YAMLException;
|
|
||||||
import org.yaml.snakeyaml.events.Event;
|
|
||||||
import org.yaml.snakeyaml.introspector.BeanAccess;
|
|
||||||
import org.yaml.snakeyaml.nodes.Node;
|
|
||||||
import org.yaml.snakeyaml.nodes.Tag;
|
|
||||||
import org.yaml.snakeyaml.parser.Parser;
|
|
||||||
import org.yaml.snakeyaml.parser.ParserImpl;
|
|
||||||
import org.yaml.snakeyaml.reader.StreamReader;
|
|
||||||
import org.yaml.snakeyaml.reader.UnicodeReader;
|
|
||||||
import org.yaml.snakeyaml.representer.Representer;
|
|
||||||
import org.yaml.snakeyaml.resolver.Resolver;
|
|
||||||
import org.yaml.snakeyaml.serializer.Serializer;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.Reader;
|
|
||||||
import java.io.StringReader;
|
|
||||||
import java.io.StringWriter;
|
|
||||||
import java.io.Writer;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Public YAML interface. Each Thread must have its own instance.
|
|
||||||
*/
|
|
||||||
public class Yaml {
|
|
||||||
|
|
||||||
protected final Resolver resolver;
|
|
||||||
protected BaseConstructor constructor;
|
|
||||||
protected Representer representer;
|
|
||||||
protected DumperOptions dumperOptions;
|
|
||||||
private String name;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create Yaml instance. It is safe to create a few instances and use them
|
|
||||||
* in different Threads.
|
|
||||||
*/
|
|
||||||
public Yaml() {
|
|
||||||
this(new Constructor(), new Representer(), new DumperOptions(), new Resolver());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create Yaml instance.
|
|
||||||
*
|
|
||||||
* @param dumperOptions DumperOptions to configure outgoing objects
|
|
||||||
*/
|
|
||||||
public Yaml(DumperOptions dumperOptions) {
|
|
||||||
this(new Constructor(), new Representer(), dumperOptions);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create Yaml instance. It is safe to create a few instances and use them
|
|
||||||
* in different Threads.
|
|
||||||
*
|
|
||||||
* @param representer Representer to emit outgoing objects
|
|
||||||
*/
|
|
||||||
public Yaml(Representer representer) {
|
|
||||||
this(new Constructor(), representer);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create Yaml instance. It is safe to create a few instances and use them
|
|
||||||
* in different Threads.
|
|
||||||
*
|
|
||||||
* @param constructor BaseConstructor to construct incoming documents
|
|
||||||
*/
|
|
||||||
public Yaml(BaseConstructor constructor) {
|
|
||||||
this(constructor, new Representer());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create Yaml instance. It is safe to create a few instances and use them
|
|
||||||
* in different Threads.
|
|
||||||
*
|
|
||||||
* @param constructor BaseConstructor to construct incoming documents
|
|
||||||
* @param representer Representer to emit outgoing objects
|
|
||||||
*/
|
|
||||||
public Yaml(BaseConstructor constructor, Representer representer) {
|
|
||||||
this(constructor, representer, new DumperOptions());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create Yaml instance. It is safe to create a few instances and use them
|
|
||||||
* in different Threads.
|
|
||||||
*
|
|
||||||
* @param representer Representer to emit outgoing objects
|
|
||||||
* @param dumperOptions DumperOptions to configure outgoing objects
|
|
||||||
*/
|
|
||||||
public Yaml(Representer representer, DumperOptions dumperOptions) {
|
|
||||||
this(new Constructor(), representer, dumperOptions, new Resolver());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create Yaml instance. It is safe to create a few instances and use them
|
|
||||||
* in different Threads.
|
|
||||||
*
|
|
||||||
* @param constructor BaseConstructor to construct incoming documents
|
|
||||||
* @param representer Representer to emit outgoing objects
|
|
||||||
* @param dumperOptions DumperOptions to configure outgoing objects
|
|
||||||
*/
|
|
||||||
public Yaml(BaseConstructor constructor, Representer representer, DumperOptions dumperOptions) {
|
|
||||||
this(constructor, representer, dumperOptions, new Resolver());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create Yaml instance. It is safe to create a few instances and use them
|
|
||||||
* in different Threads.
|
|
||||||
*
|
|
||||||
* @param constructor BaseConstructor to construct incoming documents
|
|
||||||
* @param representer Representer to emit outgoing objects
|
|
||||||
* @param dumperOptions DumperOptions to configure outgoing objects
|
|
||||||
* @param resolver Resolver to detect implicit type
|
|
||||||
*/
|
|
||||||
public Yaml(BaseConstructor constructor, Representer representer, DumperOptions dumperOptions, Resolver resolver) {
|
|
||||||
if (!constructor.isExplicitPropertyUtils()) {
|
|
||||||
constructor.setPropertyUtils(representer.getPropertyUtils());
|
|
||||||
} else if (!representer.isExplicitPropertyUtils()) {
|
|
||||||
representer.setPropertyUtils(constructor.getPropertyUtils());
|
|
||||||
}
|
|
||||||
this.constructor = constructor;
|
|
||||||
representer.setDefaultFlowStyle(dumperOptions.getDefaultFlowStyle());
|
|
||||||
representer.setDefaultScalarStyle(dumperOptions.getDefaultScalarStyle());
|
|
||||||
representer.getPropertyUtils().setAllowReadOnlyProperties(dumperOptions.isAllowReadOnlyProperties());
|
|
||||||
representer.setTimeZone(dumperOptions.getTimeZone());
|
|
||||||
this.representer = representer;
|
|
||||||
this.dumperOptions = dumperOptions;
|
|
||||||
this.resolver = resolver;
|
|
||||||
this.name = "Yaml:" + System.identityHashCode(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Serialize a Java object into a YAML String.
|
|
||||||
*
|
|
||||||
* @param data Java object to be Serialized to YAML
|
|
||||||
* @return YAML String
|
|
||||||
*/
|
|
||||||
public String dump(Object data) {
|
|
||||||
List<Object> list = new ArrayList<>(1);
|
|
||||||
list.add(data);
|
|
||||||
return dumpAll(list.iterator());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Produce the corresponding representation tree for a given Object.
|
|
||||||
*
|
|
||||||
* @param data instance to build the representation tree for
|
|
||||||
* @return representation tree
|
|
||||||
* @see <a href="http://yaml.org/spec/1.1/#id859333">Figure 3.1. Processing
|
|
||||||
* Overview</a>
|
|
||||||
*/
|
|
||||||
public Node represent(Object data) {
|
|
||||||
return representer.represent(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Serialize a sequence of Java objects into a YAML String.
|
|
||||||
*
|
|
||||||
* @param data Iterator with Objects
|
|
||||||
* @return YAML String with all the objects in proper sequence
|
|
||||||
*/
|
|
||||||
public String dumpAll(Iterator<? extends Object> data) {
|
|
||||||
StringWriter buffer = new StringWriter();
|
|
||||||
dumpAll(data, buffer, null);
|
|
||||||
return buffer.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Serialize a Java object into a YAML stream.
|
|
||||||
*
|
|
||||||
* @param data Java object to be serialized to YAML
|
|
||||||
* @param output stream to write to
|
|
||||||
*/
|
|
||||||
public void dump(Object data, Writer output) {
|
|
||||||
List<Object> list = new ArrayList<>(1);
|
|
||||||
list.add(data);
|
|
||||||
dumpAll(list.iterator(), output, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Serialize a sequence of Java objects into a YAML stream.
|
|
||||||
*
|
|
||||||
* @param data Iterator with Objects
|
|
||||||
* @param output stream to write to
|
|
||||||
*/
|
|
||||||
public void dumpAll(Iterator<? extends Object> data, Writer output) {
|
|
||||||
dumpAll(data, output, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void dumpAll(Iterator<? extends Object> data, Writer output, Tag rootTag) {
|
|
||||||
Serializer serializer = new Serializer(new Emitter(output, dumperOptions), resolver, dumperOptions, rootTag);
|
|
||||||
try {
|
|
||||||
serializer.open();
|
|
||||||
while (data.hasNext()) {
|
|
||||||
Node node = representer.represent(data.next());
|
|
||||||
serializer.serialize(node);
|
|
||||||
}
|
|
||||||
serializer.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new YAMLException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* Serialize a Java object into a YAML string. Override the default root tag
|
|
||||||
* with {@code rootTag}.
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* <p>
|
|
||||||
* This method is similar to {@code Yaml.dump(data)} except that the
|
|
||||||
* root tag for the whole document is replaced with the given tag. This has
|
|
||||||
* two main uses.
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* <p>
|
|
||||||
* First, if the root tag is replaced with a standard YAML tag, such as
|
|
||||||
* {@code Tag.MAP}, then the object will be dumped as a map. The root
|
|
||||||
* tag will appear as {@code !!map}, or blank (implicit !!map).
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* <p>
|
|
||||||
* Second, if the root tag is replaced by a different custom tag, then the
|
|
||||||
* document appears to be a different type when loaded. For example, if an
|
|
||||||
* instance of MyClass is dumped with the tag !!YourClass, then it will be
|
|
||||||
* handled as an instance of YourClass when loaded.
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @param data Java object to be serialized to YAML
|
|
||||||
* @param rootTag the tag for the whole YAML document. The tag should be Tag.MAP
|
|
||||||
* for a JavaBean to make the tag disappear (to use implicit tag
|
|
||||||
* !!map). If {@code null} is provided then the standard tag
|
|
||||||
* with the full class name is used.
|
|
||||||
* @param flowStyle flow style for the whole document. See Chapter 10. Collection
|
|
||||||
* Styles http://yaml.org/spec/1.1/#id930798. If
|
|
||||||
* {@code null} is provided then the flow style from
|
|
||||||
* DumperOptions is used.
|
|
||||||
* @return YAML String
|
|
||||||
*/
|
|
||||||
public String dumpAs(Object data, Tag rootTag, FlowStyle flowStyle) {
|
|
||||||
FlowStyle oldStyle = representer.getDefaultFlowStyle();
|
|
||||||
if (flowStyle != null) {
|
|
||||||
representer.setDefaultFlowStyle(flowStyle);
|
|
||||||
}
|
|
||||||
List<Object> list = new ArrayList<>(1);
|
|
||||||
list.add(data);
|
|
||||||
StringWriter buffer = new StringWriter();
|
|
||||||
dumpAll(list.iterator(), buffer, rootTag);
|
|
||||||
representer.setDefaultFlowStyle(oldStyle);
|
|
||||||
return buffer.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* Serialize a Java object into a YAML string. Override the default root tag
|
|
||||||
* with {@code Tag.MAP}.
|
|
||||||
* </p>
|
|
||||||
* <p>
|
|
||||||
* This method is similar to {@code Yaml.dump(data)} except that the
|
|
||||||
* root tag for the whole document is replaced with {@code Tag.MAP} tag
|
|
||||||
* (implicit !!map).
|
|
||||||
* </p>
|
|
||||||
* <p>
|
|
||||||
* Block Mapping is used as the collection style. See 10.2.2. Block Mappings
|
|
||||||
* (http://yaml.org/spec/1.1/#id934537)
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @param data Java object to be serialized to YAML
|
|
||||||
* @return YAML String
|
|
||||||
*/
|
|
||||||
public String dumpAsMap(Object data) {
|
|
||||||
return dumpAs(data, Tag.MAP, FlowStyle.BLOCK);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Serialize the representation tree into Events.
|
|
||||||
*
|
|
||||||
* @param data representation tree
|
|
||||||
* @return Event list
|
|
||||||
* @see <a href="http://yaml.org/spec/1.1/#id859333">Processing Overview</a>
|
|
||||||
*/
|
|
||||||
public List<Event> serialize(Node data) {
|
|
||||||
SilentEmitter emitter = new SilentEmitter();
|
|
||||||
Serializer serializer = new Serializer(emitter, resolver, dumperOptions, null);
|
|
||||||
try {
|
|
||||||
serializer.open();
|
|
||||||
serializer.serialize(data);
|
|
||||||
serializer.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new YAMLException(e);
|
|
||||||
}
|
|
||||||
return emitter.getEvents();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse the only YAML document in a String and produce the corresponding
|
|
||||||
* Java object. (Because the encoding in known BOM is not respected.)
|
|
||||||
*
|
|
||||||
* @param yaml YAML data to load from (BOM must not be present)
|
|
||||||
* @return parsed object
|
|
||||||
*/
|
|
||||||
public Object load(String yaml) {
|
|
||||||
return loadFromReader(new StreamReader(yaml), Object.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse the only YAML document in a stream and produce the corresponding
|
|
||||||
* Java object.
|
|
||||||
*
|
|
||||||
* @param io data to load from (BOM is respected and removed)
|
|
||||||
* @return parsed object
|
|
||||||
*/
|
|
||||||
public Object load(InputStream io) {
|
|
||||||
return loadFromReader(new StreamReader(new UnicodeReader(io)), Object.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse the only YAML document in a stream and produce the corresponding
|
|
||||||
* Java object.
|
|
||||||
*
|
|
||||||
* @param io data to load from (BOM must not be present)
|
|
||||||
* @return parsed object
|
|
||||||
*/
|
|
||||||
public Object load(Reader io) {
|
|
||||||
return loadFromReader(new StreamReader(io), Object.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse the only YAML document in a stream and produce the corresponding
|
|
||||||
* Java object.
|
|
||||||
*
|
|
||||||
* @param <T> Class is defined by the second argument
|
|
||||||
* @param io data to load from (BOM must not be present)
|
|
||||||
* @param type Class of the object to be created
|
|
||||||
* @return parsed object
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public <T> T loadAs(Reader io, Class<T> type) {
|
|
||||||
return (T) loadFromReader(new StreamReader(io), type);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse the only YAML document in a String and produce the corresponding
|
|
||||||
* Java object. (Because the encoding in known BOM is not respected.)
|
|
||||||
*
|
|
||||||
* @param <T> Class is defined by the second argument
|
|
||||||
* @param yaml YAML data to load from (BOM must not be present)
|
|
||||||
* @param type Class of the object to be created
|
|
||||||
* @return parsed object
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public <T> T loadAs(String yaml, Class<T> type) {
|
|
||||||
return (T) loadFromReader(new StreamReader(yaml), type);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse the only YAML document in a stream and produce the corresponding
|
|
||||||
* Java object.
|
|
||||||
*
|
|
||||||
* @param <T> Class is defined by the second argument
|
|
||||||
* @param input data to load from (BOM is respected and removed)
|
|
||||||
* @param type Class of the object to be created
|
|
||||||
* @return parsed object
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public <T> T loadAs(InputStream input, Class<T> type) {
|
|
||||||
return (T) loadFromReader(new StreamReader(new UnicodeReader(input)), type);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Object loadFromReader(StreamReader sreader, Class<?> type) {
|
|
||||||
Composer composer = new Composer(new ParserImpl(sreader), resolver);
|
|
||||||
constructor.setComposer(composer);
|
|
||||||
return constructor.getSingleData(type);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse all YAML documents in a String and produce corresponding Java
|
|
||||||
* objects. The documents are parsed only when the iterator is invoked.
|
|
||||||
*
|
|
||||||
* @param yaml YAML data to load from (BOM must not be present)
|
|
||||||
* @return an iterator over the parsed Java objects in this String in proper
|
|
||||||
* sequence
|
|
||||||
*/
|
|
||||||
public Iterable<Object> loadAll(Reader yaml) {
|
|
||||||
Composer composer = new Composer(new ParserImpl(new StreamReader(yaml)), resolver);
|
|
||||||
constructor.setComposer(composer);
|
|
||||||
Iterator<Object> result = new Iterator<Object>() {
|
|
||||||
public boolean hasNext() {
|
|
||||||
return constructor.checkData();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Object next() {
|
|
||||||
return constructor.getData();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void remove() {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
return new YamlIterable(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse all YAML documents in a String and produce corresponding Java
|
|
||||||
* objects. (Because the encoding in known BOM is not respected.) The
|
|
||||||
* documents are parsed only when the iterator is invoked.
|
|
||||||
*
|
|
||||||
* @param yaml YAML data to load from (BOM must not be present)
|
|
||||||
* @return an iterator over the parsed Java objects in this String in proper
|
|
||||||
* sequence
|
|
||||||
*/
|
|
||||||
public Iterable<Object> loadAll(String yaml) {
|
|
||||||
return loadAll(new StringReader(yaml));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse all YAML documents in a stream and produce corresponding Java
|
|
||||||
* objects. The documents are parsed only when the iterator is invoked.
|
|
||||||
*
|
|
||||||
* @param yaml YAML data to load from (BOM is respected and ignored)
|
|
||||||
* @return an iterator over the parsed Java objects in this stream in proper
|
|
||||||
* sequence
|
|
||||||
*/
|
|
||||||
public Iterable<Object> loadAll(InputStream yaml) {
|
|
||||||
return loadAll(new UnicodeReader(yaml));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse the first YAML document in a stream and produce the corresponding
|
|
||||||
* representation tree. (This is the opposite of the represent() method)
|
|
||||||
*
|
|
||||||
* @param yaml YAML document
|
|
||||||
* @return parsed root Node for the specified YAML document
|
|
||||||
* @see <a href="http://yaml.org/spec/1.1/#id859333">Figure 3.1. Processing
|
|
||||||
* Overview</a>
|
|
||||||
*/
|
|
||||||
public Node compose(Reader yaml) {
|
|
||||||
Composer composer = new Composer(new ParserImpl(new StreamReader(yaml)), resolver);
|
|
||||||
constructor.setComposer(composer);
|
|
||||||
return composer.getSingleNode();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse all YAML documents in a stream and produce corresponding
|
|
||||||
* representation trees.
|
|
||||||
*
|
|
||||||
* @param yaml stream of YAML documents
|
|
||||||
* @return parsed root Nodes for all the specified YAML documents
|
|
||||||
* @see <a href="http://yaml.org/spec/1.1/#id859333">Processing Overview</a>
|
|
||||||
*/
|
|
||||||
public Iterable<Node> composeAll(Reader yaml) {
|
|
||||||
final Composer composer = new Composer(new ParserImpl(new StreamReader(yaml)), resolver);
|
|
||||||
constructor.setComposer(composer);
|
|
||||||
Iterator<Node> result = new Iterator<Node>() {
|
|
||||||
public boolean hasNext() {
|
|
||||||
return composer.checkNode();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Node next() {
|
|
||||||
return composer.getNode();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void remove() {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
return new NodeIterable(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add an implicit scalar detector. If an implicit scalar value matches the
|
|
||||||
* given regexp, the corresponding tag is assigned to the scalar.
|
|
||||||
*
|
|
||||||
* @param tag tag to assign to the node
|
|
||||||
* @param regexp regular expression to match against
|
|
||||||
* @param first a sequence of possible initial characters or null (which means any).
|
|
||||||
*/
|
|
||||||
public void addImplicitResolver(Tag tag, Pattern regexp, String first) {
|
|
||||||
resolver.addImplicitResolver(tag, regexp, first);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a meaningful name. It simplifies debugging in a multi-threaded
|
|
||||||
* environment. If nothing is set explicitly the address of the instance is
|
|
||||||
* returned.
|
|
||||||
*
|
|
||||||
* @return human readable name
|
|
||||||
*/
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set a meaningful name to be shown in {@code toString()}.
|
|
||||||
*
|
|
||||||
* @param name human readable name
|
|
||||||
*/
|
|
||||||
public void setName(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse a YAML stream and produce parsing events.
|
|
||||||
*
|
|
||||||
* @param yaml YAML document(s)
|
|
||||||
* @return parsed events
|
|
||||||
* @see <a href="http://yaml.org/spec/1.1/#id859333">Processing Overview</a>
|
|
||||||
*/
|
|
||||||
public Iterable<Event> parse(Reader yaml) {
|
|
||||||
final Parser parser = new ParserImpl(new StreamReader(yaml));
|
|
||||||
Iterator<Event> result = new Iterator<Event>() {
|
|
||||||
public boolean hasNext() {
|
|
||||||
return parser.peekEvent() != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Event next() {
|
|
||||||
return parser.getEvent();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void remove() {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
return new EventIterable(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBeanAccess(BeanAccess beanAccess) {
|
|
||||||
constructor.getPropertyUtils().setBeanAccess(beanAccess);
|
|
||||||
representer.getPropertyUtils().setBeanAccess(beanAccess);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static class SilentEmitter implements Emitable {
|
|
||||||
|
|
||||||
private final List<Event> events = new ArrayList<>(100);
|
|
||||||
|
|
||||||
public List<Event> getEvents() {
|
|
||||||
return events;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void emit(Event event) throws IOException {
|
|
||||||
events.add(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static class YamlIterable implements Iterable<Object> {
|
|
||||||
|
|
||||||
private final Iterator<Object> iterator;
|
|
||||||
|
|
||||||
public YamlIterable(Iterator<Object> iterator) {
|
|
||||||
this.iterator = iterator;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Iterator<Object> iterator() {
|
|
||||||
return iterator;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static class NodeIterable implements Iterable<Node> {
|
|
||||||
|
|
||||||
private final Iterator<Node> iterator;
|
|
||||||
|
|
||||||
public NodeIterable(Iterator<Node> iterator) {
|
|
||||||
this.iterator = iterator;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Iterator<Node> iterator() {
|
|
||||||
return iterator;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static class EventIterable implements Iterable<Event> {
|
|
||||||
|
|
||||||
private final Iterator<Event> iterator;
|
|
||||||
|
|
||||||
public EventIterable(Iterator<Event> iterator) {
|
|
||||||
this.iterator = iterator;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Iterator<Event> iterator() {
|
|
||||||
return iterator;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -3,10 +3,10 @@ package com.fastasyncworldedit.core.configuration.file;
|
|||||||
import com.fastasyncworldedit.core.configuration.Configuration;
|
import com.fastasyncworldedit.core.configuration.Configuration;
|
||||||
import com.fastasyncworldedit.core.configuration.ConfigurationSection;
|
import com.fastasyncworldedit.core.configuration.ConfigurationSection;
|
||||||
import com.fastasyncworldedit.core.configuration.InvalidConfigurationException;
|
import com.fastasyncworldedit.core.configuration.InvalidConfigurationException;
|
||||||
import com.fastasyncworldedit.core.configuration.Yaml;
|
|
||||||
import com.sk89q.worldedit.internal.util.LogManagerCompat;
|
import com.sk89q.worldedit.internal.util.LogManagerCompat;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
import org.yaml.snakeyaml.DumperOptions;
|
import org.yaml.snakeyaml.DumperOptions;
|
||||||
|
import org.yaml.snakeyaml.Yaml;
|
||||||
import org.yaml.snakeyaml.error.YAMLException;
|
import org.yaml.snakeyaml.error.YAMLException;
|
||||||
import org.yaml.snakeyaml.representer.Representer;
|
import org.yaml.snakeyaml.representer.Representer;
|
||||||
|
|
||||||
@ -127,7 +127,7 @@ public class YamlConfiguration extends FileConfiguration {
|
|||||||
|
|
||||||
Map<?, ?> input;
|
Map<?, ?> input;
|
||||||
try {
|
try {
|
||||||
input = (Map<?, ?>) yaml.load(contents);
|
input = yaml.load(contents);
|
||||||
} catch (final YAMLException e) {
|
} catch (final YAMLException e) {
|
||||||
throw new InvalidConfigurationException(e);
|
throw new InvalidConfigurationException(e);
|
||||||
} catch (final ClassCastException e) {
|
} catch (final ClassCastException e) {
|
||||||
@ -193,8 +193,7 @@ public class YamlConfiguration extends FileConfiguration {
|
|||||||
if (options().copyHeader()) {
|
if (options().copyHeader()) {
|
||||||
final Configuration def = getDefaults();
|
final Configuration def = getDefaults();
|
||||||
|
|
||||||
if (def != null && def instanceof FileConfiguration) {
|
if (def != null && def instanceof final FileConfiguration filedefaults) {
|
||||||
final FileConfiguration filedefaults = (FileConfiguration) def;
|
|
||||||
final String defaultsHeader = filedefaults.buildHeader();
|
final String defaultsHeader = filedefaults.buildHeader();
|
||||||
|
|
||||||
if ((defaultsHeader != null) && !defaultsHeader.isEmpty()) {
|
if ((defaultsHeader != null) && !defaultsHeader.isEmpty()) {
|
||||||
|
@ -27,28 +27,6 @@ public class ConfigurationSerialization {
|
|||||||
this.clazz = clazz;
|
this.clazz = clazz;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Attempts to deserialize the given arguments into a new instance of the
|
|
||||||
* given class.
|
|
||||||
* <p>
|
|
||||||
* <p>The class must implement {@link ConfigurationSerializable}, including
|
|
||||||
* the extra methods as specified in the javadoc of
|
|
||||||
* ConfigurationSerializable.</p>
|
|
||||||
* <p>
|
|
||||||
* <p>If a new instance could not be made, an example being the class not
|
|
||||||
* fully implementing the interface, null will be returned.</p>
|
|
||||||
*
|
|
||||||
* @param args Arguments for deserialization
|
|
||||||
* @param clazz Class to deserialize into
|
|
||||||
* @return New instance of the specified class
|
|
||||||
*/
|
|
||||||
public static ConfigurationSerializable deserializeObject(
|
|
||||||
Map<String, ?> args,
|
|
||||||
Class<? extends ConfigurationSerializable> clazz
|
|
||||||
) {
|
|
||||||
return new ConfigurationSerialization(clazz).deserialize(args);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attempts to deserialize the given arguments into a new instance of the
|
* Attempts to deserialize the given arguments into a new instance of the
|
||||||
* <p>
|
* <p>
|
||||||
@ -66,7 +44,7 @@ public class ConfigurationSerialization {
|
|||||||
* @return New instance of the specified class
|
* @return New instance of the specified class
|
||||||
*/
|
*/
|
||||||
public static ConfigurationSerializable deserializeObject(Map<String, ?> args) {
|
public static ConfigurationSerializable deserializeObject(Map<String, ?> args) {
|
||||||
Class<? extends ConfigurationSerializable> clazz = null;
|
Class<? extends ConfigurationSerializable> clazz;
|
||||||
|
|
||||||
if (args.containsKey(SERIALIZED_TYPE_KEY)) {
|
if (args.containsKey(SERIALIZED_TYPE_KEY)) {
|
||||||
try {
|
try {
|
||||||
@ -116,25 +94,6 @@ public class ConfigurationSerialization {
|
|||||||
aliases.put(alias, clazz);
|
aliases.put(alias, clazz);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Unregisters the specified alias to a {@link ConfigurationSerializable}
|
|
||||||
*
|
|
||||||
* @param alias Alias to unregister
|
|
||||||
*/
|
|
||||||
public static void unregisterClass(String alias) {
|
|
||||||
aliases.remove(alias);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Unregisters any aliases for the specified {@link ConfigurationSerializable} class.
|
|
||||||
*
|
|
||||||
* @param clazz Class to unregister
|
|
||||||
*/
|
|
||||||
public static void unregisterClass(Class<? extends ConfigurationSerializable> clazz) {
|
|
||||||
while (aliases.values().remove(clazz)) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attempts to get a registered {@link ConfigurationSerializable} class by
|
* Attempts to get a registered {@link ConfigurationSerializable} class by
|
||||||
* its alias.
|
* its alias.
|
||||||
|
@ -2,7 +2,6 @@ package com.fastasyncworldedit.core.entity;
|
|||||||
|
|
||||||
import com.fastasyncworldedit.core.Fawe;
|
import com.fastasyncworldedit.core.Fawe;
|
||||||
import com.fastasyncworldedit.core.util.TaskManager;
|
import com.fastasyncworldedit.core.util.TaskManager;
|
||||||
import com.sk89q.jnbt.CompoundTag;
|
|
||||||
import com.sk89q.worldedit.entity.BaseEntity;
|
import com.sk89q.worldedit.entity.BaseEntity;
|
||||||
import com.sk89q.worldedit.util.nbt.CompoundBinaryTag;
|
import com.sk89q.worldedit.util.nbt.CompoundBinaryTag;
|
||||||
import com.sk89q.worldedit.world.entity.EntityType;
|
import com.sk89q.worldedit.world.entity.EntityType;
|
||||||
|
@ -20,6 +20,7 @@ public interface MapMetadatable extends Metadatable {
|
|||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
default <T> T getAndSetMeta(String key, T value) {
|
default <T> T getAndSetMeta(String key, T value) {
|
||||||
return (T) getRawMeta().put(key, value);
|
return (T) getRawMeta().put(key, value);
|
||||||
}
|
}
|
||||||
@ -40,6 +41,7 @@ public interface MapMetadatable extends Metadatable {
|
|||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
default <V> V getMeta(String key) {
|
default <V> V getMeta(String key) {
|
||||||
return (V) getRawMeta().get(key);
|
return (V) getRawMeta().get(key);
|
||||||
}
|
}
|
||||||
@ -49,6 +51,7 @@ public interface MapMetadatable extends Metadatable {
|
|||||||
*/
|
*/
|
||||||
@Nonnull
|
@Nonnull
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
default <V> V getMeta(String key, @Nonnull V def) {
|
default <V> V getMeta(String key, @Nonnull V def) {
|
||||||
V value = (V) getRawMeta().get(key);
|
V value = (V) getRawMeta().get(key);
|
||||||
return value == null ? def : value;
|
return value == null ? def : value;
|
||||||
@ -58,6 +61,7 @@ public interface MapMetadatable extends Metadatable {
|
|||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
default <V> V deleteMeta(String key) {
|
default <V> V deleteMeta(String key) {
|
||||||
return (V) getRawMeta().remove(key);
|
return (V) getRawMeta().remove(key);
|
||||||
}
|
}
|
||||||
|
@ -65,8 +65,7 @@ public class PasteEvent extends Event implements Cancellable {
|
|||||||
* @return a new event
|
* @return a new event
|
||||||
*/
|
*/
|
||||||
public PasteEvent clone(Stage stage) {
|
public PasteEvent clone(Stage stage) {
|
||||||
PasteEvent clone = new PasteEvent(actor, clipboard, uri, extent, to);
|
return new PasteEvent(actor, clipboard, uri, extent, to);
|
||||||
return clone;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -109,11 +109,7 @@ public class RichMaskParser extends FaweParser<Mask> {
|
|||||||
// Legacy syntax
|
// Legacy syntax
|
||||||
if (charMask) {
|
if (charMask) {
|
||||||
switch (char0) {
|
switch (char0) {
|
||||||
case '\\':
|
case '\\', '/', '{', '|', '~' -> {
|
||||||
case '/':
|
|
||||||
case '{':
|
|
||||||
case '|':
|
|
||||||
case '~': {
|
|
||||||
String value = command.substring(1) + ((entry.getValue().isEmpty())
|
String value = command.substring(1) + ((entry.getValue().isEmpty())
|
||||||
? ""
|
? ""
|
||||||
: "[" + StringMan.join(
|
: "[" + StringMan.join(
|
||||||
@ -127,17 +123,13 @@ public class RichMaskParser extends FaweParser<Mask> {
|
|||||||
value = value.replaceAll(":", "][");
|
value = value.replaceAll(":", "][");
|
||||||
}
|
}
|
||||||
mask = parseFromInput(char0 + "[" + value + "]", context);
|
mask = parseFromInput(char0 + "[" + value + "]", context);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
case '%':
|
case '%', '$', '<', '>', '!' -> {
|
||||||
case '$':
|
|
||||||
case '<':
|
|
||||||
case '>':
|
|
||||||
case '!':
|
|
||||||
input = input.substring(input.indexOf(char0) + 1);
|
input = input.substring(input.indexOf(char0) + 1);
|
||||||
mask = parseFromInput(char0 + "[" + input + "]", context);
|
mask = parseFromInput(char0 + "[" + input + "]", context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (mask == null) {
|
if (mask == null) {
|
||||||
if (command.startsWith("[")) {
|
if (command.startsWith("[")) {
|
||||||
int end = command.lastIndexOf(']');
|
int end = command.lastIndexOf(']');
|
||||||
|
@ -24,7 +24,7 @@ public class YAxisMaskParser extends SimpleInputParser<Mask> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Mask parseFromSimpleInput(String input, ParserContext context) {
|
public Mask parseFromSimpleInput(String input, ParserContext context) {
|
||||||
return new YAxisMask(context.getExtent());
|
return new YAxisMask();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -30,15 +30,11 @@ public class Linear2DPatternParser extends RichParser<Pattern> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Stream<String> getSuggestions(String argumentInput, int index) {
|
protected Stream<String> getSuggestions(String argumentInput, int index) {
|
||||||
switch (index) {
|
return switch (index) {
|
||||||
case 0:
|
case 0 -> this.worldEdit.getPatternFactory().getSuggestions(argumentInput).stream();
|
||||||
return this.worldEdit.getPatternFactory().getSuggestions(argumentInput).stream();
|
case 1, 2 -> SuggestionHelper.suggestPositiveIntegers(argumentInput);
|
||||||
case 1:
|
default -> Stream.empty();
|
||||||
case 2:
|
};
|
||||||
return SuggestionHelper.suggestPositiveIntegers(argumentInput);
|
|
||||||
default:
|
|
||||||
return Stream.empty();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -30,16 +30,11 @@ public class Linear3DPatternParser extends RichParser<Pattern> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Stream<String> getSuggestions(String argumentInput, int index) {
|
protected Stream<String> getSuggestions(String argumentInput, int index) {
|
||||||
switch (index) {
|
return switch (index) {
|
||||||
case 0:
|
case 0 -> this.worldEdit.getPatternFactory().getSuggestions(argumentInput).stream();
|
||||||
return this.worldEdit.getPatternFactory().getSuggestions(argumentInput).stream();
|
case 1, 2, 3 -> SuggestionHelper.suggestPositiveIntegers(argumentInput);
|
||||||
case 1:
|
default -> Stream.empty();
|
||||||
case 2:
|
};
|
||||||
case 3:
|
|
||||||
return SuggestionHelper.suggestPositiveIntegers(argumentInput);
|
|
||||||
default:
|
|
||||||
return Stream.empty();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -29,16 +29,11 @@ public class LinearPatternParser extends RichParser<Pattern> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Stream<String> getSuggestions(String argumentInput, int index) {
|
protected Stream<String> getSuggestions(String argumentInput, int index) {
|
||||||
switch (index) {
|
return switch (index) {
|
||||||
case 0:
|
case 0 -> this.worldEdit.getPatternFactory().getSuggestions(argumentInput).stream();
|
||||||
return this.worldEdit.getPatternFactory().getSuggestions(argumentInput).stream();
|
case 1, 2, 3 -> SuggestionHelper.suggestPositiveIntegers(argumentInput);
|
||||||
case 1:
|
default -> Stream.empty();
|
||||||
case 2:
|
};
|
||||||
case 3:
|
|
||||||
return SuggestionHelper.suggestPositiveIntegers(argumentInput);
|
|
||||||
default:
|
|
||||||
return Stream.empty();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -26,15 +26,11 @@ public class MaskedPatternParser extends RichParser<Pattern> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Stream<String> getSuggestions(String argumentInput, int index) {
|
protected Stream<String> getSuggestions(String argumentInput, int index) {
|
||||||
switch (index) {
|
return switch (index) {
|
||||||
case 0:
|
case 0 -> this.worldEdit.getMaskFactory().getSuggestions(argumentInput).stream();
|
||||||
return this.worldEdit.getMaskFactory().getSuggestions(argumentInput).stream();
|
case 1, 2 -> this.worldEdit.getPatternFactory().getSuggestions(argumentInput).stream();
|
||||||
case 1:
|
default -> Stream.empty();
|
||||||
case 2:
|
};
|
||||||
return this.worldEdit.getPatternFactory().getSuggestions(argumentInput).stream();
|
|
||||||
default:
|
|
||||||
return Stream.empty();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -26,16 +26,11 @@ public class OffsetPatternParser extends RichParser<Pattern> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Stream<String> getSuggestions(String argumentInput, int index) {
|
protected Stream<String> getSuggestions(String argumentInput, int index) {
|
||||||
switch (index) {
|
return switch (index) {
|
||||||
case 0:
|
case 0 -> this.worldEdit.getPatternFactory().getSuggestions(argumentInput).stream();
|
||||||
return this.worldEdit.getPatternFactory().getSuggestions(argumentInput).stream();
|
case 1, 2, 3 -> SuggestionHelper.suggestPositiveIntegers(argumentInput);
|
||||||
case 1:
|
default -> Stream.empty();
|
||||||
case 2:
|
};
|
||||||
case 3:
|
|
||||||
return SuggestionHelper.suggestPositiveIntegers(argumentInput);
|
|
||||||
default:
|
|
||||||
return Stream.empty();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -26,16 +26,11 @@ public class RandomOffsetPatternParser extends RichParser<Pattern> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Stream<String> getSuggestions(String argumentInput, int index) {
|
protected Stream<String> getSuggestions(String argumentInput, int index) {
|
||||||
switch (index) {
|
return switch (index) {
|
||||||
case 0:
|
case 0 -> this.worldEdit.getPatternFactory().getSuggestions(argumentInput).stream();
|
||||||
return this.worldEdit.getPatternFactory().getSuggestions(argumentInput).stream();
|
case 1, 2, 3 -> SuggestionHelper.suggestPositiveIntegers(argumentInput);
|
||||||
case 1:
|
default -> Stream.empty();
|
||||||
case 2:
|
};
|
||||||
case 3:
|
|
||||||
return SuggestionHelper.suggestPositiveIntegers(argumentInput);
|
|
||||||
default:
|
|
||||||
return Stream.empty();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -26,16 +26,11 @@ public class SolidRandomOffsetPatternParser extends RichParser<Pattern> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Stream<String> getSuggestions(String argumentInput, int index) {
|
protected Stream<String> getSuggestions(String argumentInput, int index) {
|
||||||
switch (index) {
|
return switch (index) {
|
||||||
case 0:
|
case 0 -> this.worldEdit.getPatternFactory().getSuggestions(argumentInput).stream();
|
||||||
return this.worldEdit.getPatternFactory().getSuggestions(argumentInput).stream();
|
case 1, 2, 3 -> SuggestionHelper.suggestPositiveIntegers(argumentInput);
|
||||||
case 1:
|
default -> Stream.empty();
|
||||||
case 2:
|
};
|
||||||
case 3:
|
|
||||||
return SuggestionHelper.suggestPositiveIntegers(argumentInput);
|
|
||||||
default:
|
|
||||||
return Stream.empty();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -26,14 +26,11 @@ public class SurfaceRandomOffsetPatternParser extends RichParser<Pattern> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Stream<String> getSuggestions(String argumentInput, int index) {
|
protected Stream<String> getSuggestions(String argumentInput, int index) {
|
||||||
switch (index) {
|
return switch (index) {
|
||||||
case 0:
|
case 0 -> this.worldEdit.getPatternFactory().getSuggestions(argumentInput).stream();
|
||||||
return this.worldEdit.getPatternFactory().getSuggestions(argumentInput).stream();
|
case 1 -> SuggestionHelper.suggestPositiveIntegers(argumentInput);
|
||||||
case 1:
|
default -> Stream.empty();
|
||||||
return SuggestionHelper.suggestPositiveIntegers(argumentInput);
|
};
|
||||||
default:
|
|
||||||
return Stream.empty();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -50,8 +50,8 @@ public class RandomTransformParser extends InputParser<ResettableExtent> {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
RandomTransform randomTransform = new RandomTransform();
|
RandomTransform randomTransform = new RandomTransform();
|
||||||
for (int i = 0; i < split.size(); i++) {
|
for (String s : split) {
|
||||||
ResettableExtent transform = worldEdit.getTransformFactory().parseFromInput(split.get(i), context);
|
ResettableExtent transform = worldEdit.getTransformFactory().parseFromInput(s, context);
|
||||||
randomTransform.add(transform, 1d);
|
randomTransform.add(transform, 1d);
|
||||||
}
|
}
|
||||||
return randomTransform;
|
return randomTransform;
|
||||||
|
@ -22,6 +22,7 @@ import java.lang.reflect.Method;
|
|||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||||
public class Bindings {
|
public class Bindings {
|
||||||
|
|
||||||
private static final Logger LOGGER = LogManagerCompat.getLogger();
|
private static final Logger LOGGER = LogManagerCompat.getLogger();
|
||||||
|
@ -2,6 +2,7 @@ package com.fastasyncworldedit.core.extension.platform.binding;
|
|||||||
|
|
||||||
import com.sk89q.worldedit.WorldEdit;
|
import com.sk89q.worldedit.WorldEdit;
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
public class CommandBindings extends Bindings {
|
public class CommandBindings extends Bindings {
|
||||||
|
|
||||||
public CommandBindings(WorldEdit worldEdit) {
|
public CommandBindings(WorldEdit worldEdit) {
|
||||||
|
@ -32,6 +32,7 @@ import org.enginehub.piston.inject.InjectedValueAccess;
|
|||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
public class ConsumeBindings extends Bindings {
|
public class ConsumeBindings extends Bindings {
|
||||||
|
|
||||||
private final PlatformCommandManager manager;
|
private final PlatformCommandManager manager;
|
||||||
|
@ -15,6 +15,7 @@ import com.sk89q.worldedit.util.formatting.text.TextComponent;
|
|||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
public class PrimitiveBindings extends Bindings {
|
public class PrimitiveBindings extends Bindings {
|
||||||
|
|
||||||
public PrimitiveBindings(WorldEdit worldEdit) {
|
public PrimitiveBindings(WorldEdit worldEdit) {
|
||||||
@ -48,26 +49,12 @@ public class PrimitiveBindings extends Bindings {
|
|||||||
*/
|
*/
|
||||||
@Binding
|
@Binding
|
||||||
public Boolean getBoolean(String argument) {
|
public Boolean getBoolean(String argument) {
|
||||||
switch (argument.toLowerCase(Locale.ROOT)) {
|
return switch (argument.toLowerCase(Locale.ROOT)) {
|
||||||
case "":
|
case "" -> throw new InputParseException(Caption.of("fawe.error.input-parser-exception"));
|
||||||
throw new InputParseException(Caption.of("fawe.error.input-parser-exception"));
|
case "true", "yes", "on", "y", "1", "t" -> true;
|
||||||
case "true":
|
case "false", "no", "off", "f", "n", "0" -> false;
|
||||||
case "yes":
|
default -> throw new InputParseException(Caption.of("fawe.error.invalid-boolean", TextComponent.of(argument)));
|
||||||
case "on":
|
};
|
||||||
case "y":
|
|
||||||
case "1":
|
|
||||||
case "t":
|
|
||||||
return true;
|
|
||||||
case "false":
|
|
||||||
case "no":
|
|
||||||
case "off":
|
|
||||||
case "f":
|
|
||||||
case "n":
|
|
||||||
case "0":
|
|
||||||
return false;
|
|
||||||
default:
|
|
||||||
throw new InputParseException(Caption.of("fawe.error.invalid-boolean", TextComponent.of(argument)));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -84,18 +71,13 @@ public class PrimitiveBindings extends Bindings {
|
|||||||
final double radiusY;
|
final double radiusY;
|
||||||
final double radiusZ;
|
final double radiusZ;
|
||||||
switch (radii.length) {
|
switch (radii.length) {
|
||||||
case 1:
|
case 1 -> radiusX = radiusY = radiusZ = PrimitiveBindings.parseNumericInput(radii[0]);
|
||||||
radiusX = radiusY = radiusZ = PrimitiveBindings.parseNumericInput(radii[0]);
|
case 3 -> {
|
||||||
break;
|
|
||||||
|
|
||||||
case 3:
|
|
||||||
radiusX = PrimitiveBindings.parseNumericInput(radii[0]);
|
radiusX = PrimitiveBindings.parseNumericInput(radii[0]);
|
||||||
radiusY = PrimitiveBindings.parseNumericInput(radii[1]);
|
radiusY = PrimitiveBindings.parseNumericInput(radii[1]);
|
||||||
radiusZ = PrimitiveBindings.parseNumericInput(radii[2]);
|
radiusZ = PrimitiveBindings.parseNumericInput(radii[2]);
|
||||||
break;
|
}
|
||||||
|
default -> throw new InputParseException("You must either specify 1 or 3 radius values.");
|
||||||
default:
|
|
||||||
throw new InputParseException("You must either specify 1 or 3 radius values.");
|
|
||||||
}
|
}
|
||||||
return Vector3.at(radiusX, radiusY, radiusZ);
|
return Vector3.at(radiusX, radiusY, radiusZ);
|
||||||
}
|
}
|
||||||
@ -115,17 +97,12 @@ public class PrimitiveBindings extends Bindings {
|
|||||||
final double radiusX;
|
final double radiusX;
|
||||||
final double radiusZ;
|
final double radiusZ;
|
||||||
switch (radii.length) {
|
switch (radii.length) {
|
||||||
case 1:
|
case 1 -> radiusX = radiusZ = PrimitiveBindings.parseNumericInput(radii[0]);
|
||||||
radiusX = radiusZ = PrimitiveBindings.parseNumericInput(radii[0]);
|
case 2 -> {
|
||||||
break;
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
radiusX = PrimitiveBindings.parseNumericInput(radii[0]);
|
radiusX = PrimitiveBindings.parseNumericInput(radii[0]);
|
||||||
radiusZ = PrimitiveBindings.parseNumericInput(radii[1]);
|
radiusZ = PrimitiveBindings.parseNumericInput(radii[1]);
|
||||||
break;
|
}
|
||||||
|
default -> throw new InputParseException("You must either specify 1 or 2 radius values.");
|
||||||
default:
|
|
||||||
throw new InputParseException("You must either specify 1 or 2 radius values.");
|
|
||||||
}
|
}
|
||||||
return Vector2.at(radiusX, radiusZ);
|
return Vector2.at(radiusX, radiusZ);
|
||||||
}
|
}
|
||||||
@ -145,18 +122,13 @@ public class PrimitiveBindings extends Bindings {
|
|||||||
final double radiusY;
|
final double radiusY;
|
||||||
final double radiusZ;
|
final double radiusZ;
|
||||||
switch (radii.length) {
|
switch (radii.length) {
|
||||||
case 1:
|
case 1 -> radiusX = radiusY = radiusZ = PrimitiveBindings.parseNumericInput(radii[0]);
|
||||||
radiusX = radiusY = radiusZ = PrimitiveBindings.parseNumericInput(radii[0]);
|
case 3 -> {
|
||||||
break;
|
|
||||||
|
|
||||||
case 3:
|
|
||||||
radiusX = PrimitiveBindings.parseNumericInput(radii[0]);
|
radiusX = PrimitiveBindings.parseNumericInput(radii[0]);
|
||||||
radiusY = PrimitiveBindings.parseNumericInput(radii[1]);
|
radiusY = PrimitiveBindings.parseNumericInput(radii[1]);
|
||||||
radiusZ = PrimitiveBindings.parseNumericInput(radii[2]);
|
radiusZ = PrimitiveBindings.parseNumericInput(radii[2]);
|
||||||
break;
|
}
|
||||||
|
default -> throw new InputParseException("You must either specify 1 or 3 radius values.");
|
||||||
default:
|
|
||||||
throw new InputParseException("You must either specify 1 or 3 radius values.");
|
|
||||||
}
|
}
|
||||||
return BlockVector3.at(radiusX, radiusY, radiusZ);
|
return BlockVector3.at(radiusX, radiusY, radiusZ);
|
||||||
}
|
}
|
||||||
@ -175,17 +147,12 @@ public class PrimitiveBindings extends Bindings {
|
|||||||
final double radiusX;
|
final double radiusX;
|
||||||
final double radiusZ;
|
final double radiusZ;
|
||||||
switch (radii.length) {
|
switch (radii.length) {
|
||||||
case 1:
|
case 1 -> radiusX = radiusZ = parseNumericInput(radii[0]);
|
||||||
radiusX = radiusZ = parseNumericInput(radii[0]);
|
case 2 -> {
|
||||||
break;
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
radiusX = parseNumericInput(radii[0]);
|
radiusX = parseNumericInput(radii[0]);
|
||||||
radiusZ = parseNumericInput(radii[1]);
|
radiusZ = parseNumericInput(radii[1]);
|
||||||
break;
|
}
|
||||||
|
default -> throw new InputParseException("You must either specify 1 or 2 radius values.");
|
||||||
default:
|
|
||||||
throw new InputParseException("You must either specify 1 or 2 radius values.");
|
|
||||||
}
|
}
|
||||||
return BlockVector2.at(radiusX, radiusZ);
|
return BlockVector2.at(radiusX, radiusZ);
|
||||||
}
|
}
|
||||||
|
@ -125,8 +125,7 @@ public class ProvideBindings extends Bindings {
|
|||||||
return extent;
|
return extent;
|
||||||
}
|
}
|
||||||
EditSession editSession = editSession(getLocalSession(actor), actor, access);
|
EditSession editSession = editSession(getLocalSession(actor), actor, access);
|
||||||
if (access instanceof InjectedValueStore) {
|
if (access instanceof InjectedValueStore store) {
|
||||||
InjectedValueStore store = (InjectedValueStore) access;
|
|
||||||
store.injectValue(Key.of(EditSession.class), ValueProvider.constant(editSession));
|
store.injectValue(Key.of(EditSession.class), ValueProvider.constant(editSession));
|
||||||
}
|
}
|
||||||
return editSession;
|
return editSession;
|
||||||
|
@ -101,6 +101,7 @@ public class DisallowedBlocksExtent extends AbstractDelegateExtent implements IB
|
|||||||
return super.setBlock(x, y, z, block);
|
return super.setBlock(x, y, z, block);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
private <B extends BlockStateHolder<B>> B checkBlock(B block) {
|
private <B extends BlockStateHolder<B>> B checkBlock(B block) {
|
||||||
if (blockedBlocks != null) {
|
if (blockedBlocks != null) {
|
||||||
if (blockedBlocks.contains(block.getBlockType().getId())) {
|
if (blockedBlocks.contains(block.getBlockType().getId())) {
|
||||||
|
@ -65,11 +65,11 @@ public class StripNBTExtent extends AbstractDelegateExtent implements IBatchProc
|
|||||||
return super.createEntity(location, stripEntityNBT(entity));
|
return super.createEntity(location, stripEntityNBT(entity));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public <B extends BlockStateHolder<B>> B stripBlockNBT(B block) {
|
public <B extends BlockStateHolder<B>> B stripBlockNBT(B block) {
|
||||||
if (!(block instanceof BaseBlock)) {
|
if (!(block instanceof BaseBlock localBlock)) {
|
||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
BaseBlock localBlock = (BaseBlock) block;
|
|
||||||
if (!localBlock.hasNbtData()) {
|
if (!localBlock.hasNbtData()) {
|
||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
@ -93,6 +93,7 @@ public class TransformExtent extends BlockTransformExtent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public <T extends BlockStateHolder<T>> boolean setBlock(int x, int y, int z, T block)
|
public <T extends BlockStateHolder<T>> boolean setBlock(int x, int y, int z, T block)
|
||||||
throws WorldEditException {
|
throws WorldEditException {
|
||||||
return super.setBlock(getPos(x, y, z), transformInverse(block));
|
return super.setBlock(getPos(x, y, z), transformInverse(block));
|
||||||
@ -100,6 +101,7 @@ public class TransformExtent extends BlockTransformExtent {
|
|||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public <B extends BlockStateHolder<B>> boolean setBlock(BlockVector3 location, B block)
|
public <B extends BlockStateHolder<B>> boolean setBlock(BlockVector3 location, B block)
|
||||||
throws WorldEditException {
|
throws WorldEditException {
|
||||||
return super.setBlock(getPos(location), transformInverse(block));
|
return super.setBlock(getPos(location), transformInverse(block));
|
||||||
|
@ -107,7 +107,7 @@ public class CPUOptimizedClipboard extends LinearClipboard {
|
|||||||
}
|
}
|
||||||
for (Map.Entry<IntTriple, CompoundTag> entry : nbtMapLoc.entrySet()) {
|
for (Map.Entry<IntTriple, CompoundTag> entry : nbtMapLoc.entrySet()) {
|
||||||
IntTriple key = entry.getKey();
|
IntTriple key = entry.getKey();
|
||||||
setTile(getIndex(key.getX(), key.getY(), key.getZ()), entry.getValue());
|
setTile(getIndex(key.x(), key.y(), key.z()), entry.getValue());
|
||||||
}
|
}
|
||||||
nbtMapLoc.clear();
|
nbtMapLoc.clear();
|
||||||
}
|
}
|
||||||
|
@ -379,7 +379,7 @@ public class DiskOptimizedClipboard extends LinearClipboard implements Closeable
|
|||||||
nbt = null;
|
nbt = null;
|
||||||
for (Map.Entry<IntTriple, CompoundTag> entry : nbtMap.entrySet()) {
|
for (Map.Entry<IntTriple, CompoundTag> entry : nbtMap.entrySet()) {
|
||||||
IntTriple key = entry.getKey();
|
IntTriple key = entry.getKey();
|
||||||
int index = getIndex(key.getX(), key.getY(), key.getZ());
|
int index = getIndex(key.x(), key.y(), key.z());
|
||||||
if (index == i) {
|
if (index == i) {
|
||||||
nbt = entry.getValue();
|
nbt = entry.getValue();
|
||||||
break;
|
break;
|
||||||
|
@ -42,8 +42,6 @@ public abstract class LinearClipboard extends SimpleClipboard {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* The locations provided are relative to the clipboard min
|
* The locations provided are relative to the clipboard min
|
||||||
*
|
|
||||||
* @param task
|
|
||||||
*/
|
*/
|
||||||
public abstract void streamBiomes(IntValueReader task);
|
public abstract void streamBiomes(IntValueReader task);
|
||||||
|
|
||||||
@ -63,13 +61,12 @@ public abstract class LinearClipboard extends SimpleClipboard {
|
|||||||
@Override
|
@Override
|
||||||
public Iterator<BlockVector3> iterator(Order order) {
|
public Iterator<BlockVector3> iterator(Order order) {
|
||||||
Region region = getRegion();
|
Region region = getRegion();
|
||||||
switch (order) {
|
if (order == Order.YZX) {
|
||||||
case YZX:
|
|
||||||
if (region instanceof CuboidRegion) {
|
if (region instanceof CuboidRegion) {
|
||||||
Iterator<BlockVector3> iter = ((CuboidRegion) region).iterator_old();
|
Iterator<BlockVector3> iter = ((CuboidRegion) region).iterator_old();
|
||||||
LinearFilter filter = new LinearFilter();
|
LinearFilter filter = new LinearFilter();
|
||||||
|
|
||||||
return new ForwardingIterator<BlockVector3>() {
|
return new ForwardingIterator<>() {
|
||||||
@Override
|
@Override
|
||||||
protected Iterator<BlockVector3> delegate() {
|
protected Iterator<BlockVector3> delegate() {
|
||||||
return iter;
|
return iter;
|
||||||
@ -81,9 +78,8 @@ public abstract class LinearClipboard extends SimpleClipboard {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
default:
|
|
||||||
return order.create(region);
|
|
||||||
}
|
}
|
||||||
|
return order.create(region);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -215,7 +215,7 @@ public class MemoryOptimizedClipboard extends LinearClipboard {
|
|||||||
nbt = null;
|
nbt = null;
|
||||||
for (Map.Entry<IntTriple, CompoundTag> entry : nbtMap.entrySet()) {
|
for (Map.Entry<IntTriple, CompoundTag> entry : nbtMap.entrySet()) {
|
||||||
IntTriple trio = entry.getKey();
|
IntTriple trio = entry.getKey();
|
||||||
int index = getIndex(trio.getX(), trio.getY(), trio.getZ());
|
int index = getIndex(trio.x(), trio.y(), trio.z());
|
||||||
if (index == i) {
|
if (index == i) {
|
||||||
nbt = entry.getValue();
|
nbt = entry.getValue();
|
||||||
break;
|
break;
|
||||||
@ -308,10 +308,9 @@ public class MemoryOptimizedClipboard extends LinearClipboard {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<? extends Entity> getEntities(Region region) {
|
public List<? extends Entity> getEntities(Region region) {
|
||||||
return new ArrayList<>(entities
|
return entities
|
||||||
.stream()
|
.stream()
|
||||||
.filter(e -> region.contains(e.getLocation().toBlockPoint()))
|
.filter(e -> region.contains(e.getLocation().toBlockPoint())).collect(Collectors.toList());
|
||||||
.collect(Collectors.toList()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -69,8 +69,7 @@ public class MultiClipboardHolder extends URIClipboardHolder {
|
|||||||
@Override
|
@Override
|
||||||
public URI getURI(Clipboard clipboard) {
|
public URI getURI(Clipboard clipboard) {
|
||||||
for (ClipboardHolder holder : getHolders()) {
|
for (ClipboardHolder holder : getHolders()) {
|
||||||
if (holder instanceof URIClipboardHolder) {
|
if (holder instanceof URIClipboardHolder uriHolder) {
|
||||||
URIClipboardHolder uriHolder = (URIClipboardHolder) holder;
|
|
||||||
URI uri = uriHolder.getURI(clipboard);
|
URI uri = uriHolder.getURI(clipboard);
|
||||||
if (uri != null) {
|
if (uri != null) {
|
||||||
return uri;
|
return uri;
|
||||||
|
@ -66,12 +66,10 @@ public class ResizableClipboardBuilder extends MemoryOptimizedHistory {
|
|||||||
try {
|
try {
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
Change change = iterator.next();
|
Change change = iterator.next();
|
||||||
if (change instanceof MutableBlockChange) {
|
if (change instanceof MutableBlockChange blockChange) {
|
||||||
MutableBlockChange blockChange = (MutableBlockChange) change;
|
|
||||||
BlockState block = BlockState.getFromOrdinal(blockChange.ordinal);
|
BlockState block = BlockState.getFromOrdinal(blockChange.ordinal);
|
||||||
clipboard.setBlock(blockChange.x, blockChange.y, blockChange.z, block);
|
clipboard.setBlock(blockChange.x, blockChange.y, blockChange.z, block);
|
||||||
} else if (change instanceof MutableTileChange) {
|
} else if (change instanceof MutableTileChange tileChange) {
|
||||||
MutableTileChange tileChange = (MutableTileChange) change;
|
|
||||||
int x = tileChange.tag.getInt("x");
|
int x = tileChange.tag.getInt("x");
|
||||||
int y = tileChange.tag.getInt("y");
|
int y = tileChange.tag.getInt("y");
|
||||||
int z = tileChange.tag.getInt("z");
|
int z = tileChange.tag.getInt("z");
|
||||||
|
@ -275,8 +275,7 @@ public class FastSchematicReader extends NBTSchematicReader {
|
|||||||
|
|
||||||
if (blocksOut != null && blocksOut.getSize() != 0) {
|
if (blocksOut != null && blocksOut.getSize() != 0) {
|
||||||
try (FaweInputStream fis = new FaweInputStream(new LZ4BlockInputStream(new FastByteArraysInputStream(blocksOut.toByteArrays())))) {
|
try (FaweInputStream fis = new FaweInputStream(new LZ4BlockInputStream(new FastByteArraysInputStream(blocksOut.toByteArrays())))) {
|
||||||
if (clipboard instanceof LinearClipboard) {
|
if (clipboard instanceof LinearClipboard linear) {
|
||||||
LinearClipboard linear = (LinearClipboard) clipboard;
|
|
||||||
int volume = width * height * length;
|
int volume = width * height * length;
|
||||||
if (palette.length < 128) {
|
if (palette.length < 128) {
|
||||||
for (int index = 0; index < volume; index++) {
|
for (int index = 0; index < volume; index++) {
|
||||||
|
@ -99,7 +99,7 @@ public class MinecraftStructure implements ClipboardReader, ClipboardWriter {
|
|||||||
for (Map.Entry<String, Tag> entry : properties.getValue().entrySet()) {
|
for (Map.Entry<String, Tag> entry : properties.getValue().entrySet()) {
|
||||||
String key = entry.getKey();
|
String key = entry.getKey();
|
||||||
String value = ((StringTag) entry.getValue()).getValue();
|
String value = ((StringTag) entry.getValue()).getValue();
|
||||||
Property property = type.getProperty(key);
|
Property<Object> property = type.getProperty(key);
|
||||||
state = state.with(property, property.getValueFor(value));
|
state = state.with(property, property.getValueFor(value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ public abstract class ForkedFilter<T extends ForkedFilter<T>> implements Filter
|
|||||||
|
|
||||||
protected final Map<Thread, T> children;
|
protected final Map<Thread, T> children;
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public ForkedFilter(T root) {
|
public ForkedFilter(T root) {
|
||||||
if (root != null) {
|
if (root != null) {
|
||||||
children = root.children;
|
children = root.children;
|
||||||
|
@ -12,6 +12,7 @@ public abstract class DelegateFilter<T extends Filter> implements IDelegateFilte
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public final T getParent() {
|
public final T getParent() {
|
||||||
return (T) parent;
|
return (T) parent;
|
||||||
}
|
}
|
||||||
|
@ -20,8 +20,6 @@ public interface IBatchProcessorHolder extends IBatchProcessor {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the held processor
|
* Set the held processor
|
||||||
*
|
|
||||||
* @param set
|
|
||||||
*/
|
*/
|
||||||
void setProcessor(IBatchProcessor set);
|
void setProcessor(IBatchProcessor set);
|
||||||
|
|
||||||
|
@ -55,14 +55,11 @@ public class MultiBatchProcessor implements IBatchProcessor {
|
|||||||
list.add(processor);
|
list.add(processor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
switch (list.size()) {
|
return switch (list.size()) {
|
||||||
case 0:
|
case 0 -> EmptyBatchProcessor.getInstance();
|
||||||
return EmptyBatchProcessor.getInstance();
|
case 1 -> list.get(0);
|
||||||
case 1:
|
default -> new MultiBatchProcessor(list.toArray(new IBatchProcessor[0]));
|
||||||
return list.get(0);
|
};
|
||||||
default:
|
|
||||||
return new MultiBatchProcessor(list.toArray(new IBatchProcessor[0]));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addBatchProcessor(IBatchProcessor processor) {
|
public void addBatchProcessor(IBatchProcessor processor) {
|
||||||
|
@ -34,6 +34,7 @@ import java.util.concurrent.ConcurrentLinkedQueue;
|
|||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.concurrent.locks.ReentrantLock;
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
|
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
public class NMSRelighter implements Relighter {
|
public class NMSRelighter implements Relighter {
|
||||||
|
|
||||||
private static final int DISPATCH_SIZE = 64;
|
private static final int DISPATCH_SIZE = 64;
|
||||||
@ -988,11 +989,10 @@ public class NMSRelighter implements Relighter {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
switch (reason) {
|
switch (reason) {
|
||||||
case SkipReason.SOLID: {
|
case SkipReason.SOLID -> {
|
||||||
Arrays.fill(mask, (byte) 0);
|
Arrays.fill(mask, (byte) 0);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
case SkipReason.AIR: {
|
case SkipReason.AIR -> {
|
||||||
int index = 0;
|
int index = 0;
|
||||||
for (int z = 0; z < 16; z++) {
|
for (int z = 0; z < 16; z++) {
|
||||||
for (int x = 0; x < 16; x++) {
|
for (int x = 0; x < 16; x++) {
|
||||||
|
@ -26,8 +26,6 @@ public class OreGen implements Resource {
|
|||||||
private final double ONE_8 = 1 / 8F;
|
private final double ONE_8 = 1 / 8F;
|
||||||
private final double ONE_16 = 1 / 16F;
|
private final double ONE_16 = 1 / 16F;
|
||||||
|
|
||||||
public int laced = 0;
|
|
||||||
|
|
||||||
public OreGen(Extent extent, Mask mask, Pattern pattern, int size, int minY, int maxY) {
|
public OreGen(Extent extent, Mask mask, Pattern pattern, int size, int minY, int maxY) {
|
||||||
this.maxSize = size;
|
this.maxSize = size;
|
||||||
this.maxSizeO8 = size * ONE_8;
|
this.maxSizeO8 = size * ONE_8;
|
||||||
|
@ -55,8 +55,7 @@ public abstract class ABlockMask extends AbstractExtentMask {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Mask tryCombine(Mask mask) {
|
public Mask tryCombine(Mask mask) {
|
||||||
if (mask instanceof ABlockMask) {
|
if (mask instanceof ABlockMask other) {
|
||||||
ABlockMask other = (ABlockMask) mask;
|
|
||||||
BlockMask newMask = new BlockMask(getExtent());
|
BlockMask newMask = new BlockMask(getExtent());
|
||||||
for (BlockState state : BlockTypesCache.states) {
|
for (BlockState state : BlockTypesCache.states) {
|
||||||
if (state != null) {
|
if (state != null) {
|
||||||
@ -76,8 +75,7 @@ public abstract class ABlockMask extends AbstractExtentMask {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Mask tryOr(Mask mask) {
|
public Mask tryOr(Mask mask) {
|
||||||
if (mask instanceof ABlockMask) {
|
if (mask instanceof ABlockMask other) {
|
||||||
ABlockMask other = (ABlockMask) mask;
|
|
||||||
BlockMask newMask = new BlockMask(getExtent());
|
BlockMask newMask = new BlockMask(getExtent());
|
||||||
for (BlockState state : BlockTypesCache.states) {
|
for (BlockState state : BlockTypesCache.states) {
|
||||||
if (state != null) {
|
if (state != null) {
|
||||||
|
@ -161,16 +161,13 @@ public class BlockMaskBuilder {
|
|||||||
for (int i = last; i < length; i++) {
|
for (int i = last; i < length; i++) {
|
||||||
char c = input.charAt(i);
|
char c = input.charAt(i);
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case '[':
|
case '[', '{', '(' -> {
|
||||||
case '{':
|
|
||||||
case '(':
|
|
||||||
int next = StringMan.findMatchingBracket(input, i);
|
int next = StringMan.findMatchingBracket(input, i);
|
||||||
if (next != -1) {
|
if (next != -1) {
|
||||||
i = next;
|
i = next;
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
case ']':
|
case ']', ',' -> {
|
||||||
case ',': {
|
|
||||||
charSequence.setSubstring(last, i);
|
charSequence.setSubstring(last, i);
|
||||||
if (key == null && PropertyKey.getByName(charSequence) == null) {
|
if (key == null && PropertyKey.getByName(charSequence) == null) {
|
||||||
suggest(
|
suggest(
|
||||||
@ -218,35 +215,21 @@ public class BlockMaskBuilder {
|
|||||||
key = null;
|
key = null;
|
||||||
operator = null;
|
operator = null;
|
||||||
last = i + 1;
|
last = i + 1;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
case '~':
|
case '~', '!', '=', '<', '>' -> {
|
||||||
case '!':
|
|
||||||
case '=':
|
|
||||||
case '<':
|
|
||||||
case '>': {
|
|
||||||
charSequence.setSubstring(last, i);
|
charSequence.setSubstring(last, i);
|
||||||
boolean extra = input.charAt(i + 1) == '=';
|
boolean extra = input.charAt(i + 1) == '=';
|
||||||
if (extra) {
|
if (extra) {
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
switch (c) {
|
operator = switch (c) {
|
||||||
case '~':
|
case '~' -> EQUAL_OR_NULL;
|
||||||
operator = EQUAL_OR_NULL;
|
case '!' -> NOT;
|
||||||
break;
|
case '=' -> EQUAL;
|
||||||
case '!':
|
case '<' -> extra ? LESS_EQUAL : LESS;
|
||||||
operator = NOT;
|
case '>' -> extra ? GREATER_EQUAL : GREATER;
|
||||||
break;
|
default -> operator;
|
||||||
case '=':
|
};
|
||||||
operator = EQUAL;
|
|
||||||
break;
|
|
||||||
case '<':
|
|
||||||
operator = extra ? LESS_EQUAL : LESS;
|
|
||||||
break;
|
|
||||||
case '>':
|
|
||||||
operator = extra ? GREATER_EQUAL : GREATER;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (charSequence.length() > 0 || key == null) {
|
if (charSequence.length() > 0 || key == null) {
|
||||||
key = PropertyKey.getByName(charSequence);
|
key = PropertyKey.getByName(charSequence);
|
||||||
if (key == null) {
|
if (key == null) {
|
||||||
@ -258,10 +241,9 @@ public class BlockMaskBuilder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
last = i + 1;
|
last = i + 1;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
default:
|
default -> {
|
||||||
break;
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -395,6 +377,7 @@ public class BlockMaskBuilder {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||||
public <T> BlockMaskBuilder filter(
|
public <T> BlockMaskBuilder filter(
|
||||||
Predicate<BlockType> typePredicate,
|
Predicate<BlockType> typePredicate,
|
||||||
BiPredicate<BlockType, Map.Entry<Property<T>, T>> allowed
|
BiPredicate<BlockType, Map.Entry<Property<T>, T>> allowed
|
||||||
@ -491,6 +474,7 @@ public class BlockMaskBuilder {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||||
public BlockMaskBuilder addAll(
|
public BlockMaskBuilder addAll(
|
||||||
Predicate<BlockType> typePredicate,
|
Predicate<BlockType> typePredicate,
|
||||||
BiPredicate<BlockType, Map.Entry<Property<?>, ?>> propPredicate
|
BiPredicate<BlockType, Map.Entry<Property<?>, ?>> propPredicate
|
||||||
|
@ -13,7 +13,6 @@ public class ExtremaMask extends AngleMask {
|
|||||||
protected boolean testSlope(Extent extent, int x, int y, int z) {
|
protected boolean testSlope(Extent extent, int x, int y, int z) {
|
||||||
double slope;
|
double slope;
|
||||||
double tmp;
|
double tmp;
|
||||||
boolean aboveMin;
|
|
||||||
lastY = y;
|
lastY = y;
|
||||||
|
|
||||||
int base = getHeight(extent, x, y, z);
|
int base = getHeight(extent, x, y, z);
|
||||||
|
@ -55,14 +55,11 @@ public class MaskUnion extends MaskIntersection {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
switch (set.size()) {
|
return switch (set.size()) {
|
||||||
case 0:
|
case 0 -> Masks.alwaysTrue();
|
||||||
return Masks.alwaysTrue();
|
case 1 -> set.iterator().next();
|
||||||
case 1:
|
default -> new MaskUnion(masks).optimize();
|
||||||
return set.iterator().next();
|
};
|
||||||
default:
|
|
||||||
return new MaskUnion(masks).optimize();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -51,8 +51,7 @@ public class SingleBlockStateMask extends ABlockMask {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Mask tryCombine(Mask mask) {
|
public Mask tryCombine(Mask mask) {
|
||||||
if (mask instanceof ABlockMask) {
|
if (mask instanceof ABlockMask other) {
|
||||||
ABlockMask other = (ABlockMask) mask;
|
|
||||||
if (other.test(BlockState.getFromOrdinal(ordinal))) {
|
if (other.test(BlockState.getFromOrdinal(ordinal))) {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package com.fastasyncworldedit.core.function.mask;
|
package com.fastasyncworldedit.core.function.mask;
|
||||||
|
|
||||||
import com.sk89q.worldedit.extent.Extent;
|
|
||||||
import com.sk89q.worldedit.function.mask.AbstractMask;
|
import com.sk89q.worldedit.function.mask.AbstractMask;
|
||||||
import com.sk89q.worldedit.function.mask.Mask;
|
import com.sk89q.worldedit.function.mask.Mask;
|
||||||
import com.sk89q.worldedit.math.BlockVector3;
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
@ -9,7 +8,7 @@ public class YAxisMask extends AbstractMask implements ResettableMask {
|
|||||||
|
|
||||||
private transient int layer = -1;
|
private transient int layer = -1;
|
||||||
|
|
||||||
public YAxisMask(Extent extent) {
|
public YAxisMask() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -27,7 +26,7 @@ public class YAxisMask extends AbstractMask implements ResettableMask {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Mask copy() {
|
public Mask copy() {
|
||||||
return new YAxisMask(null);
|
return new YAxisMask();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ public class PatternTraverser {
|
|||||||
reset(pattern, newExtent);
|
reset(pattern, newExtent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings({"unchecked"})
|
||||||
private void reset(Object pattern, Extent newExtent) {
|
private void reset(Object pattern, Extent newExtent) {
|
||||||
if (pattern == null) {
|
if (pattern == null) {
|
||||||
return;
|
return;
|
||||||
|
@ -95,9 +95,9 @@ public abstract class DFSVisitor implements Operation {
|
|||||||
int countAdd = 0;
|
int countAdd = 0;
|
||||||
int countAttempt = 0;
|
int countAttempt = 0;
|
||||||
for (IntTriple direction : dirs) {
|
for (IntTriple direction : dirs) {
|
||||||
mutable2.mutX(from.getX() + direction.getX());
|
mutable2.mutX(from.getX() + direction.x());
|
||||||
mutable2.mutY(from.getY() + direction.getY());
|
mutable2.mutY(from.getY() + direction.y());
|
||||||
mutable2.mutZ(from.getZ() + direction.getZ());
|
mutable2.mutZ(from.getZ() + direction.z());
|
||||||
if (isVisitable(mutable, mutable2)) {
|
if (isVisitable(mutable, mutable2)) {
|
||||||
Node adjacent = new Node(mutable2.getBlockX(), mutable2.getBlockY(), mutable2.getBlockZ());
|
Node adjacent = new Node(mutable2.getBlockX(), mutable2.getBlockY(), mutable2.getBlockZ());
|
||||||
if (!adjacent.equals(current.from)) {
|
if (!adjacent.equals(current.from)) {
|
||||||
@ -175,7 +175,7 @@ public abstract class DFSVisitor implements Operation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final int hashCode() {
|
public int hashCode() {
|
||||||
return (x ^ (z << 12)) ^ (y << 24);
|
return (x ^ (z << 12)) ^ (y << 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -208,17 +208,7 @@ public abstract class DFSVisitor implements Operation {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class NodePair {
|
public record NodePair(Node from, Node to, int depth) {
|
||||||
|
|
||||||
public final Node to;
|
|
||||||
public final Node from;
|
|
||||||
private final int depth;
|
|
||||||
|
|
||||||
NodePair(Node from, Node to, int depth) {
|
|
||||||
this.from = from;
|
|
||||||
this.to = to;
|
|
||||||
this.depth = depth;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,13 +4,7 @@ import com.sk89q.worldedit.WorldEditException;
|
|||||||
import com.sk89q.worldedit.function.RegionFunction;
|
import com.sk89q.worldedit.function.RegionFunction;
|
||||||
import com.sk89q.worldedit.math.BlockVector3;
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
|
|
||||||
public class IntersectRegionFunction implements RegionFunction {
|
public record IntersectRegionFunction(RegionFunction... functions) implements RegionFunction {
|
||||||
|
|
||||||
private final RegionFunction[] functions;
|
|
||||||
|
|
||||||
public IntersectRegionFunction(RegionFunction... functions) {
|
|
||||||
this.functions = functions;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(BlockVector3 position) throws WorldEditException {
|
public boolean apply(BlockVector3 position) throws WorldEditException {
|
||||||
|
@ -50,6 +50,7 @@ public class MutableEntityChange implements Change {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings({"unchecked"})
|
||||||
public void delete(UndoContext context) {
|
public void delete(UndoContext context) {
|
||||||
Map<String, Tag> map = tag.getValue();
|
Map<String, Tag> map = tag.getValue();
|
||||||
long most;
|
long most;
|
||||||
|
@ -38,9 +38,7 @@ public abstract class CompressedCompoundTag<T> extends CompoundTag {
|
|||||||
CompoundTag tag = (CompoundTag) nbtIn.readTag();
|
CompoundTag tag = (CompoundTag) nbtIn.readTag();
|
||||||
Map<String, Tag> value = tag.getValue();
|
Map<String, Tag> value = tag.getValue();
|
||||||
Map<String, Tag> raw = super.getValue();
|
Map<String, Tag> raw = super.getValue();
|
||||||
for (Map.Entry<String, Tag> entry : value.entrySet()) {
|
raw.putAll(value);
|
||||||
raw.put(entry.getKey(), entry.getValue());
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@ import java.util.Iterator;
|
|||||||
import java.util.Stack;
|
import java.util.Stack;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||||
public class JSON2NBT {
|
public class JSON2NBT {
|
||||||
|
|
||||||
private static final Pattern INT_ARRAY_MATCHER = Pattern.compile("\\[[-+\\d|,\\s]+\\]");
|
private static final Pattern INT_ARRAY_MATCHER = Pattern.compile("\\[[-+\\d|,\\s]+\\]");
|
||||||
@ -56,11 +57,11 @@ public class JSON2NBT {
|
|||||||
}
|
}
|
||||||
} else if (!flag) {
|
} else if (!flag) {
|
||||||
if (c0 != 123 && c0 != 91) {
|
if (c0 != 123 && c0 != 91) {
|
||||||
if (c0 == 125 && (stack.isEmpty() || ((Character) stack.pop()).charValue() != 123)) {
|
if (c0 == 125 && (stack.isEmpty() || (Character) stack.pop() != 123)) {
|
||||||
throw new NBTException("Unbalanced curly brackets {}: " + str);
|
throw new NBTException("Unbalanced curly brackets {}: " + str);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c0 == 93 && (stack.isEmpty() || ((Character) stack.pop()).charValue() != 91)) {
|
if (c0 == 93 && (stack.isEmpty() || (Character) stack.pop() != 91)) {
|
||||||
throw new NBTException("Unbalanced square brackets []: " + str);
|
throw new NBTException("Unbalanced square brackets []: " + str);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -68,7 +69,7 @@ public class JSON2NBT {
|
|||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
|
||||||
stack.push(Character.valueOf(c0));
|
stack.push(c0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -93,7 +94,6 @@ public class JSON2NBT {
|
|||||||
private static JSON2NBT.Any nameValueToNBT(String key, String value) throws NBTException {
|
private static JSON2NBT.Any nameValueToNBT(String key, String value) throws NBTException {
|
||||||
value = value.trim();
|
value = value.trim();
|
||||||
String s;
|
String s;
|
||||||
boolean c0;
|
|
||||||
char c01;
|
char c01;
|
||||||
if (value.startsWith("{")) {
|
if (value.startsWith("{")) {
|
||||||
value = value.substring(1, value.length() - 1);
|
value = value.substring(1, value.length() - 1);
|
||||||
@ -102,7 +102,6 @@ public class JSON2NBT {
|
|||||||
for (JSON2NBT$list1 = new JSON2NBT.Compound(key); value.length() > 0; value = value.substring(s.length() + 1)) {
|
for (JSON2NBT$list1 = new JSON2NBT.Compound(key); value.length() > 0; value = value.substring(s.length() + 1)) {
|
||||||
s = nextNameValuePair(value, true);
|
s = nextNameValuePair(value, true);
|
||||||
if (s.length() > 0) {
|
if (s.length() > 0) {
|
||||||
c0 = false;
|
|
||||||
JSON2NBT$list1.tagList.add(getTagFromNameValue(s, false));
|
JSON2NBT$list1.tagList.add(getTagFromNameValue(s, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -124,7 +123,6 @@ public class JSON2NBT {
|
|||||||
for (JSON2NBT$list = new JSON2NBT.List(key); value.length() > 0; value = value.substring(s.length() + 1)) {
|
for (JSON2NBT$list = new JSON2NBT.List(key); value.length() > 0; value = value.substring(s.length() + 1)) {
|
||||||
s = nextNameValuePair(value, false);
|
s = nextNameValuePair(value, false);
|
||||||
if (s.length() > 0) {
|
if (s.length() > 0) {
|
||||||
c0 = true;
|
|
||||||
JSON2NBT$list.tagList.add(getTagFromNameValue(s, true));
|
JSON2NBT$list.tagList.add(getTagFromNameValue(s, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -392,10 +390,8 @@ public class JSON2NBT {
|
|||||||
|
|
||||||
public Tag parse() throws NBTException {
|
public Tag parse() throws NBTException {
|
||||||
ArrayList<Tag> list = new ArrayList<>();
|
ArrayList<Tag> list = new ArrayList<>();
|
||||||
Iterator var2 = this.tagList.iterator();
|
|
||||||
|
|
||||||
while (var2.hasNext()) {
|
for (Any JSON2NBT$any : this.tagList) {
|
||||||
JSON2NBT.Any JSON2NBT$any = (JSON2NBT.Any) var2.next();
|
|
||||||
list.add(JSON2NBT$any.parse());
|
list.add(JSON2NBT$any.parse());
|
||||||
}
|
}
|
||||||
Class<? extends Tag> tagType = list.isEmpty() ? CompoundTag.class : list.get(0).getClass();
|
Class<? extends Tag> tagType = list.isEmpty() ? CompoundTag.class : list.get(0).getClass();
|
||||||
@ -414,10 +410,8 @@ public class JSON2NBT {
|
|||||||
|
|
||||||
public Tag parse() throws NBTException {
|
public Tag parse() throws NBTException {
|
||||||
HashMap<String, Tag> map = new HashMap<>();
|
HashMap<String, Tag> map = new HashMap<>();
|
||||||
Iterator var2 = this.tagList.iterator();
|
|
||||||
|
|
||||||
while (var2.hasNext()) {
|
for (Any JSON2NBT$any : this.tagList) {
|
||||||
JSON2NBT.Any JSON2NBT$any = (JSON2NBT.Any) var2.next();
|
|
||||||
map.put(JSON2NBT$any.json, JSON2NBT$any.parse());
|
map.put(JSON2NBT$any.json, JSON2NBT$any.parse());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@ import org.apache.logging.log4j.Logger;
|
|||||||
import java.io.DataInputStream;
|
import java.io.DataInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||||
public class StreamDelegate {
|
public class StreamDelegate {
|
||||||
|
|
||||||
private static final Logger LOGGER = LogManagerCompat.getLogger();
|
private static final Logger LOGGER = LogManagerCompat.getLogger();
|
||||||
|
Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden Mehr anzeigen
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren