diff --git a/worldedit-bukkit/build.gradle.kts b/worldedit-bukkit/build.gradle.kts index 07a532615..35221faa4 100644 --- a/worldedit-bukkit/build.gradle.kts +++ b/worldedit-bukkit/build.gradle.kts @@ -25,6 +25,7 @@ repositories { configurations.all { resolutionStrategy { + force() force("com.google.guava:guava:21.0") } } @@ -35,11 +36,10 @@ dependencies { "api"(project(":worldedit-libs:core")) "api"(project(":worldedit-libs:bukkit")) "compile"(":worldedit-adapters:") - "compile"("org.spigotmcv1_13_r2:spigotmcv1_13_r2:1_13_r2") "compile"("org.spigotmcv1_14_r1:spigotmcv1_14_r1:1_14_r1") "compile"("org.spigotmcv1_15_r1:spigotmcv1_15_r1:1_15_r1") "compile"("it.unimi.dsi:fastutil:8.2.1") - "api"("com.destroystokyo.paper:paper-api:1.15.1-R0.1-SNAPSHOT") { + "api"("com.destroystokyo.paper:paper-api:1.15.2-R0.1-SNAPSHOT") { exclude("junit", "junit") isTransitive = false } diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java index 266fbecd1..f72295ec7 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java +++ b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/FaweBukkit.java @@ -102,9 +102,6 @@ public class FaweBukkit implements IFawe, Listener { new ChunkListener_9(); } }); - - //Start Metrics - new Metrics(plugin); } @Override // Please don't delete this again, it's WIP diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_13/BlockMaterial_1_13.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_13/BlockMaterial_1_13.java deleted file mode 100644 index 1a81c20fe..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_13/BlockMaterial_1_13.java +++ /dev/null @@ -1,153 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_13; - -import com.sk89q.util.ReflectionUtil; -import com.sk89q.worldedit.world.registry.BlockMaterial; -import net.minecraft.server.v1_13_R2.Block; -import net.minecraft.server.v1_13_R2.EnumPistonReaction; -import net.minecraft.server.v1_13_R2.IBlockData; -import net.minecraft.server.v1_13_R2.ITileEntity; -import net.minecraft.server.v1_13_R2.Material; -import org.bukkit.craftbukkit.v1_13_R2.block.data.CraftBlockData; - -public class BlockMaterial_1_13 implements BlockMaterial { - private final Block block; - private final IBlockData defaultState; - private final Material material; - private final boolean isTranslucent; - private final CraftBlockData craftBlockData; - private final org.bukkit.Material craftMaterial; - - public BlockMaterial_1_13(Block block) { - this(block, block.getBlockData()); - } - - public BlockMaterial_1_13(Block block, IBlockData defaultState) { - this.block = block; - this.defaultState = defaultState; - this.material = defaultState.getMaterial(); - this.craftBlockData = CraftBlockData.fromData(defaultState); - this.craftMaterial = craftBlockData.getMaterial(); - this.isTranslucent = ReflectionUtil.getField(Block.class, block, "n"); - } - - public Block getBlock() { - return block; - } - - public IBlockData getState() { - return defaultState; - } - - public CraftBlockData getCraftBlockData() { - return craftBlockData; - } - - public Material getMaterial() { - return material; - } - - @Override - public boolean isAir() { - return defaultState.isAir(); - } - - @Override - public boolean isFullCube() { - return craftMaterial.isOccluding(); - } - - @Override - public boolean isOpaque() { - return material.f(); - } - - @Override - public boolean isPowerSource() { - return defaultState.isPowerSource(); - } - - @Override - public boolean isLiquid() { - return material.isLiquid(); - } - - @Override - public boolean isSolid() { - return material.isBuildable(); - } - - @Override - public float getHardness() { - return block.strength; - } - - @Override - public float getResistance() { - return block.getDurability(); - } - - @Override - public float getSlipperiness() { - return block.n(); - } - - @Override - public int getLightValue() { - return defaultState.e(); - } - - @Override - public int getLightOpacity() { - return isTranslucent() ? 15 : 0; - } - - @Override - public boolean isFragileWhenPushed() { - return material.getPushReaction() == EnumPistonReaction.DESTROY; - } - - @Override - public boolean isUnpushable() { - return material.getPushReaction() == EnumPistonReaction.BLOCK; - } - - @Override - public boolean isTicksRandomly() { - return block.isTicking(defaultState); - } - - @Override - public boolean isMovementBlocker() { - return material.isSolid(); - } - - @Override - public boolean isBurnable() { - return material.isBurnable(); - } - - @Override - public boolean isToolRequired() { - return !material.isAlwaysDestroyable(); - } - - @Override - public boolean isReplacedDuringPlacement() { - return material.isReplaceable(); - } - - @Override - public boolean isTranslucent() { - return isTranslucent; - } - - @Override - public boolean hasContainer() { - return block instanceof ITileEntity; - } - - @Override - public int getMapColor() { - return material.i().rgb; - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_13/BukkitAdapter_1_13.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_13/BukkitAdapter_1_13.java deleted file mode 100644 index 775416f8f..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_13/BukkitAdapter_1_13.java +++ /dev/null @@ -1,284 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_13; - -import com.boydti.fawe.Fawe; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.bukkit.adapter.DelegateLock; -import com.boydti.fawe.bukkit.adapter.NMSAdapter; -import com.boydti.fawe.config.Settings; -import com.boydti.fawe.object.collection.BitArray4096; -import com.boydti.fawe.util.MathMan; -import com.boydti.fawe.util.ReflectionUtils; -import com.boydti.fawe.util.TaskManager; -import com.sk89q.worldedit.world.block.BlockState; -import com.sk89q.worldedit.world.block.BlockTypesCache; -import io.papermc.lib.PaperLib; -import net.jpountz.util.UnsafeUtils; -import net.minecraft.server.v1_13_R2.Block; -import net.minecraft.server.v1_13_R2.Chunk; -import net.minecraft.server.v1_13_R2.ChunkCoordIntPair; -import net.minecraft.server.v1_13_R2.ChunkSection; -import net.minecraft.server.v1_13_R2.DataBits; -import net.minecraft.server.v1_13_R2.DataPalette; -import net.minecraft.server.v1_13_R2.DataPaletteBlock; -import net.minecraft.server.v1_13_R2.DataPaletteLinear; -import net.minecraft.server.v1_13_R2.GameProfileSerializer; -import net.minecraft.server.v1_13_R2.IBlockData; -import net.minecraft.server.v1_13_R2.PlayerChunk; -import net.minecraft.server.v1_13_R2.PlayerChunkMap; -import org.bukkit.craftbukkit.v1_13_R2.CraftChunk; -import org.bukkit.craftbukkit.v1_13_R2.CraftWorld; -import sun.misc.Unsafe; - -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.util.Arrays; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.locks.Lock; -import java.util.function.Function; - -public final class BukkitAdapter_1_13 extends NMSAdapter { - /* - NMS fields - */ - public final static Field fieldBits; - public final static Field fieldPalette; - public final static Field fieldSize; - - public final static Field fieldFluidCount; - public final static Field fieldTickingBlockCount; - public final static Field fieldNonEmptyBlockCount; - - private final static Field fieldDirtyCount; - private final static Field fieldDirtyBits; - - private static final int CHUNKSECTION_BASE; - private static final int CHUNKSECTION_SHIFT; - - private static final Field fieldLock; - - static { - try { - fieldSize = DataPaletteBlock.class.getDeclaredField("i"); - fieldSize.setAccessible(true); - fieldBits = DataPaletteBlock.class.getDeclaredField("a"); - fieldBits.setAccessible(true); - fieldPalette = DataPaletteBlock.class.getDeclaredField("h"); - fieldPalette.setAccessible(true); - - fieldFluidCount = ChunkSection.class.getDeclaredField("e"); - fieldFluidCount.setAccessible(true); - fieldTickingBlockCount = ChunkSection.class.getDeclaredField("tickingBlockCount"); - fieldTickingBlockCount.setAccessible(true); - fieldNonEmptyBlockCount = ChunkSection.class.getDeclaredField("nonEmptyBlockCount"); - fieldNonEmptyBlockCount.setAccessible(true); - - fieldDirtyCount = PlayerChunk.class.getDeclaredField("dirtyCount"); - fieldDirtyCount.setAccessible(true); - fieldDirtyBits = PlayerChunk.class.getDeclaredField("h"); - fieldDirtyBits.setAccessible(true); - - { - Field tmp; - try { - tmp = DataPaletteBlock.class.getDeclaredField("writeLock"); - } catch (NoSuchFieldException paper) { - tmp = DataPaletteBlock.class.getDeclaredField("j"); - } - ReflectionUtils.setAccessibleNonFinal(tmp); - fieldLock = tmp; - fieldLock.setAccessible(true); - } - - Unsafe unsafe = UnsafeUtils.getUNSAFE(); - CHUNKSECTION_BASE = unsafe.arrayBaseOffset(ChunkSection[].class); - int scale = unsafe.arrayIndexScale(ChunkSection[].class); - if ((scale & (scale - 1)) != 0) - throw new Error("data type scale not a power of two"); - CHUNKSECTION_SHIFT = 31 - Integer.numberOfLeadingZeros(scale); - } catch (RuntimeException e) { - throw e; - } catch (Throwable rethrow) { - rethrow.printStackTrace(); - throw new RuntimeException(rethrow); - } - } - - protected static boolean setSectionAtomic(ChunkSection[] sections, ChunkSection expected, ChunkSection value, int layer) { - long offset = ((long) layer << CHUNKSECTION_SHIFT) + CHUNKSECTION_BASE; - if (layer >= 0 && layer < sections.length) { - return UnsafeUtils.getUNSAFE().compareAndSwapObject(sections, offset, expected, value); - } - return false; - } - - protected static DelegateLock applyLock(ChunkSection section) { - try { - synchronized (section) { - DataPaletteBlock blocks = section.getBlocks(); - Lock currentLock = (Lock) fieldLock.get(blocks); - if (currentLock instanceof DelegateLock) { - return (DelegateLock) currentLock; - } - DelegateLock newLock = new DelegateLock(currentLock); - fieldLock.set(blocks, newLock); - return newLock; - } - } catch (IllegalAccessException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - - public static Chunk ensureLoaded(net.minecraft.server.v1_13_R2.World nmsWorld, int X, int Z) { - Chunk nmsChunk = nmsWorld.getChunkIfLoaded(X, Z); - if (nmsChunk != null) { - return nmsChunk; - } - if (Fawe.isMainThread()) { - return nmsWorld.getChunkAt(X, Z); - } - if (PaperLib.isPaper()) { - CraftWorld craftWorld = nmsWorld.getWorld(); - CompletableFuture future = craftWorld.getChunkAtAsync(X, Z, true); - try { - CraftChunk chunk = (CraftChunk) future.get(); - return chunk.getHandle(); - } catch (Throwable e) { - e.printStackTrace(); - } - } - // TODO optimize - return TaskManager.IMP.sync(() -> nmsWorld.getChunkAt(X, Z)); - } - - public static PlayerChunk getPlayerChunk(net.minecraft.server.v1_13_R2.WorldServer nmsWorld, final int cx, final int cz) { - PlayerChunkMap chunkMap = nmsWorld.getPlayerChunkMap(); - PlayerChunk playerChunk = chunkMap.getChunk(cx, cz); - if (playerChunk == null) { - return null; - } - return playerChunk; - } - - public static void sendChunk(net.minecraft.server.v1_13_R2.WorldServer nmsWorld, int X, int Z, int mask) { - PlayerChunk playerChunk = getPlayerChunk(nmsWorld, X, Z); - if (playerChunk == null) { - return; - } - if (playerChunk.e()) { - Chunk nmsChunk = playerChunk.chunk; - ChunkSection[] sections = nmsChunk.getSections(); - for (int layer = 0; layer < 16; layer++) { - if (sections[layer] == null && (mask & (1 << layer)) != 0) { - sections[layer] = new ChunkSection(layer << 4, nmsWorld.worldProvider.g()); - } - } - TaskManager.IMP.sync(() -> { - try { - int dirtyBits = fieldDirtyBits.getInt(playerChunk); - if (dirtyBits == 0) { - nmsWorld.getPlayerChunkMap().a(playerChunk); - } - if (mask == 0) { - dirtyBits = 65535; - } else { - dirtyBits |= mask; - } - - fieldDirtyBits.set(playerChunk, dirtyBits); - fieldDirtyCount.set(playerChunk, 64); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - return null; - }); - return; - } - return; - } - - /* - NMS conversion - */ - public static ChunkSection newChunkSection(final int layer, final char[] blocks, boolean light) { - return newChunkSection(layer, null, blocks, light); - } - - public static ChunkSection newChunkSection(final int layer, final Function get, char[] set, boolean light) { - if (set == null) { - return newChunkSection(layer, light); - } - final int[] blockToPalette = FaweCache.INSTANCE.getBLOCK_TO_PALETTE().get(); - final int[] paletteToBlock = FaweCache.INSTANCE.getPALETTE_TO_BLOCK().get(); - final long[] blockStates = FaweCache.INSTANCE.getBLOCK_STATES().get(); - final int[] blocksCopy = FaweCache.INSTANCE.getSECTION_BLOCKS().get(); - try { - int[] num_palette_buffer = new int[1]; - int air; - if (get == null) { - air = createPalette(blockToPalette, paletteToBlock, blocksCopy, num_palette_buffer, set); - } else { - air = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, num_palette_buffer, get, set); - } - int num_palette = num_palette_buffer[0]; - // BlockStates - int bitsPerEntry = MathMan.log2nlz(num_palette - 1); - if (Settings.IMP.PROTOCOL_SUPPORT_FIX || num_palette != 1) { - bitsPerEntry = Math.max(bitsPerEntry, 4); // Protocol support breaks <4 bits per entry - } else { - bitsPerEntry = Math.max(bitsPerEntry, 1); // For some reason minecraft needs 4096 bits to store 0 entries - } - - final int blockBitArrayEnd = (bitsPerEntry * 4096) >> 6; - if (num_palette == 1) { - for (int i = 0; i < blockBitArrayEnd; i++) blockStates[i] = 0; - } else { - final BitArray4096 bitArray = new BitArray4096(blockStates, bitsPerEntry); - bitArray.fromRaw(blocksCopy); - } - - ChunkSection section = newChunkSection(layer, light); - // set palette & data bits - final DataPaletteBlock dataPaletteBlocks = section.getBlocks(); - // private DataPalette h; - // protected DataBits a; - final long[] bits = Arrays.copyOfRange(blockStates, 0, blockBitArrayEnd); - final DataBits nmsBits = new DataBits(bitsPerEntry, 4096, bits); - final DataPalette palette; -// palette = new DataPaletteHash<>(Block.REGISTRY_ID, bitsPerEntry, dataPaletteBlocks, GameProfileSerializer::d, GameProfileSerializer::a); - palette = new DataPaletteLinear<>(Block.REGISTRY_ID, bitsPerEntry, dataPaletteBlocks, GameProfileSerializer::d); - - // set palette - for (int i = 0; i < num_palette; i++) { - final int ordinal = paletteToBlock[i]; - blockToPalette[ordinal] = Integer.MAX_VALUE; - final BlockState state = BlockTypesCache.states[ordinal]; - final IBlockData ibd = ((BlockMaterial_1_13) state.getMaterial()).getState(); - palette.a(ibd); - } - try { - fieldBits.set(dataPaletteBlocks, nmsBits); - fieldPalette.set(dataPaletteBlocks, palette); - fieldSize.set(dataPaletteBlocks, bitsPerEntry); - setCount(0, 4096 - air, section); - } catch (final IllegalAccessException | NoSuchFieldException e) { - throw new RuntimeException(e); - } - - return section; - } catch (final Throwable e){ - Arrays.fill(blockToPalette, Integer.MAX_VALUE); - throw e; - } - } - - private static ChunkSection newChunkSection(int layer, boolean light) { - return new ChunkSection(layer << 4, light); - } - - public static void setCount(final int tickingBlockCount, final int nonEmptyBlockCount, final ChunkSection section) throws NoSuchFieldException, IllegalAccessException { - fieldFluidCount.setShort(section, (short) 0); // TODO FIXME - fieldTickingBlockCount.setShort(section, (short) tickingBlockCount); - fieldNonEmptyBlockCount.setShort(section, (short) nonEmptyBlockCount); - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_13/BukkitGetBlocks_1_13.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_13/BukkitGetBlocks_1_13.java deleted file mode 100644 index 527b9408c..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_13/BukkitGetBlocks_1_13.java +++ /dev/null @@ -1,633 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_13; - -import static org.slf4j.LoggerFactory.getLogger; - -import com.boydti.fawe.Fawe; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.IChunkSet; -import com.boydti.fawe.beta.implementation.blocks.CharGetBlocks; -import com.boydti.fawe.beta.implementation.queue.QueueHandler; -import com.boydti.fawe.bukkit.adapter.DelegateLock; -import com.boydti.fawe.object.collection.AdaptedMap; -import com.boydti.fawe.object.collection.BitArray4096; -import com.boydti.fawe.util.ReflectionUtils; -import com.google.common.base.Suppliers; -import com.google.common.collect.Iterables; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.ListTag; -import com.sk89q.jnbt.LongTag; -import com.sk89q.jnbt.StringTag; -import com.sk89q.jnbt.Tag; -import com.sk89q.worldedit.bukkit.BukkitAdapter; -import com.sk89q.worldedit.bukkit.WorldEditPlugin; -import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; -import com.sk89q.worldedit.bukkit.adapter.impl.FAWE_Spigot_v1_13_R2; -import com.sk89q.worldedit.internal.Constants; -import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.world.biome.BiomeType; -import com.sk89q.worldedit.world.block.BlockTypes; -import java.util.AbstractSet; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.Callable; -import java.util.concurrent.Future; -import java.util.function.Function; -import javax.annotation.Nullable; -import net.minecraft.server.v1_13_R2.BiomeBase; -import net.minecraft.server.v1_13_R2.BlockPosition; -import net.minecraft.server.v1_13_R2.Chunk; -import net.minecraft.server.v1_13_R2.ChunkSection; -import net.minecraft.server.v1_13_R2.DataBits; -import net.minecraft.server.v1_13_R2.DataPalette; -import net.minecraft.server.v1_13_R2.DataPaletteBlock; -import net.minecraft.server.v1_13_R2.DataPaletteHash; -import net.minecraft.server.v1_13_R2.DataPaletteLinear; -import net.minecraft.server.v1_13_R2.Entity; -import net.minecraft.server.v1_13_R2.EntityTypes; -import net.minecraft.server.v1_13_R2.IBlockData; -import net.minecraft.server.v1_13_R2.NBTTagCompound; -import net.minecraft.server.v1_13_R2.NBTTagInt; -import net.minecraft.server.v1_13_R2.TileEntity; -import net.minecraft.server.v1_13_R2.WorldServer; -import org.bukkit.World; -import org.bukkit.block.Biome; -import org.bukkit.craftbukkit.v1_13_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_13_R2.block.CraftBlock; -import org.bukkit.event.entity.CreatureSpawnEvent; -import org.jetbrains.annotations.NotNull; - -public class BukkitGetBlocks_1_13 extends CharGetBlocks { - public ChunkSection[] sections; - public Chunk nmsChunk; - public WorldServer world; - public int X, Z; - - public BukkitGetBlocks_1_13(World world, int X, int Z) { - this(((CraftWorld) world).getHandle(), X, Z); - } - - public BukkitGetBlocks_1_13(WorldServer world, int X, int Z) { - this.world = world; - this.X = X; - this.Z = Z; - } - - public int getX() { - return X; - } - - public int getZ() { - return Z; - } - - @Override - public BiomeType getBiomeType(int x, int y, int z) { - BiomeBase base = getChunk().getBiomeIndex()[(z << 4) + x]; - return BukkitAdapter.adapt(CraftBlock.biomeBaseToBiome(base)); - } - - @Override - public CompoundTag getTile(int x, int y, int z) { - TileEntity tileEntity = getChunk().getTileEntity(new BlockPosition((x & 15) + (X << 4), y, (z & 15) + (Z << 4))); - if (tileEntity == null) { - return null; - } - return new LazyCompoundTag_1_13(Suppliers.memoize(() -> tileEntity.save(new NBTTagCompound()))); - } - - private static final Function posNms2We = v -> BlockVector3.at(v.getX(), v.getY(), v.getZ()); - - private final static Function nmsTile2We = tileEntity -> new LazyCompoundTag_1_13(Suppliers.memoize(() -> tileEntity.save(new NBTTagCompound()))); - - @Override - public Map getTiles() { - Map nmsTiles = getChunk().getTileEntities(); - if (nmsTiles.isEmpty()) { - return Collections.emptyMap(); - } - return AdaptedMap.immutable(nmsTiles, posNms2We, nmsTile2We); - } - - @Override - public CompoundTag getEntity(UUID uuid) { - Entity entity = world.getEntity(uuid); - if (entity != null) { - org.bukkit.entity.Entity bukkitEnt = entity.getBukkitEntity(); - return BukkitAdapter.adapt(bukkitEnt).getState().getNbtData(); - } - for (List entry : getChunk().getEntitySlices()) { - if (entry != null) { - for (Entity ent : entry) { - if (uuid.equals(ent.getUniqueID())) { - org.bukkit.entity.Entity bukkitEnt = ent.getBukkitEntity(); - return BukkitAdapter.adapt(bukkitEnt).getState().getNbtData(); - } - } - } - } - return null; - } - - @Override - public Set getEntities() { - List[] slices = getChunk().getEntitySlices(); - int size = 0; - for (List slice : slices) { - if (slice != null) size += slice.size(); - } - if (slices.length == 0) { - return Collections.emptySet(); - } - int finalSize = size; - return new AbstractSet() { - @Override - public int size() { - return finalSize; - } - - @Override - public boolean isEmpty() { - return false; - } - - @Override - public boolean contains(Object get) { - if (!(get instanceof CompoundTag)) { - return false; - } - CompoundTag getTag = (CompoundTag) get; - Map value = getTag.getValue(); - CompoundTag getParts = (CompoundTag) value.get("UUID"); - UUID getUUID = new UUID(getParts.getLong("Most"), getParts.getLong("Least")); - for (List slice : slices) { - if (slice != null) { - for (Entity entity : slice) { - UUID uuid = entity.getUniqueID(); - if (uuid.equals(getUUID)) { - return true; - } - } - } - } - return false; - } - - @NotNull - @Override - public Iterator iterator() { - Iterable result = Iterables.transform(Iterables.concat(slices), new com.google.common.base.Function() { - @Nullable - @Override - public CompoundTag apply(@Nullable Entity input) { - BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); - NBTTagCompound tag = new NBTTagCompound(); - return (CompoundTag) adapter.toNative(input.save(tag)); - } - }); - return result.iterator(); - } - }; - } - - private void updateGet(BukkitGetBlocks_1_13 get, Chunk nmsChunk, ChunkSection[] sections, ChunkSection section, char[] arr, int layer) { - synchronized (get) { - if (this.nmsChunk != nmsChunk) { - this.nmsChunk = nmsChunk; - this.sections = sections.clone(); - this.reset(); - } - if (this.sections == null) { - this.sections = sections.clone(); - } - if (this.sections[layer] != section) { - this.sections[layer] = section; - } - this.blocks[layer] = arr; - } - } - - private void removeEntity(Entity entity) { - entity.die(); - entity.valid = false; - } - - public Chunk ensureLoaded(net.minecraft.server.v1_13_R2.World nmsWorld, int X, int Z) { - return BukkitAdapter_1_13.ensureLoaded(nmsWorld, X, Z); - } - - @Override - public > T call(IChunkSet set, Runnable finalizer) { - try { - WorldServer nmsWorld = world; - boolean light = nmsWorld.worldProvider.g(); - Chunk nmsChunk = ensureLoaded(nmsWorld, X, Z); - - // Remove existing tiles - { - Map tiles = nmsChunk.getTileEntities(); - if (!tiles.isEmpty()) { - for (Map.Entry entry : tiles.entrySet()) { - final BlockPosition pos = entry.getKey(); - final int lx = pos.getX() & 15; - final int ly = pos.getY(); - final int lz = pos.getZ() & 15; - final int layer = ly >> 4; - if (!set.hasSection(layer)) { - continue; - } - if (set.getBlock(lx, ly, lz).getOrdinal() != 0) { - TileEntity tile = entry.getValue(); - tile.y(); - tile.invalidateBlockCache(); - } - } - } - } - - int bitMask = 0; - synchronized (nmsChunk) { - ChunkSection[] sections = nmsChunk.getSections(); - - for (int layer = 0; layer < 16; layer++) { - if (!set.hasSection(layer)) continue; - - bitMask |= 1 << layer; - - char[] setArr = set.load(layer); - ChunkSection newSection; - ChunkSection existingSection = sections[layer]; - if (existingSection == null) { - newSection = BukkitAdapter_1_13.newChunkSection(layer, setArr, light); - if (BukkitAdapter_1_13.setSectionAtomic(sections, null, newSection, layer)) { - updateGet(this, nmsChunk, sections, newSection, setArr, layer); - continue; - } else { - existingSection = sections[layer]; - if (existingSection == null) { - System.out.println("Skipping invalid null section. chunk:" + X + "," + Z + " layer: " + layer); - continue; - } - } - } - DelegateLock lock = BukkitAdapter_1_13.applyLock(existingSection); - synchronized (this) { - synchronized (lock) { - lock.untilFree(); - ChunkSection getSection; - if (this.nmsChunk != nmsChunk) { - this.nmsChunk = nmsChunk; - this.sections = null; - this.reset(); - } else { - getSection = this.getSections()[layer]; - if (getSection != existingSection) { - this.sections[layer] = existingSection; - this.reset(); - } else if (lock.isModified()) { - this.reset(layer); - } - } - newSection = BukkitAdapter_1_13.newChunkSection(layer, this::load, setArr, light); - if (!BukkitAdapter_1_13.setSectionAtomic(sections, existingSection, newSection, layer)) { - System.out.println("Failed to set chunk section:" + X + "," + Z + " layer: " + layer); - continue; - } else { - updateGet(this, nmsChunk, sections, newSection, setArr, layer); - } - } - } - } - - // Biomes - BiomeType[] biomes = set.getBiomes(); - if (biomes != null) { - // set biomes - final BiomeBase[] currentBiomes = nmsChunk.getBiomeIndex(); - for (int i = 0; i < biomes.length; i++) { - final BiomeType biome = biomes[i]; - if (biome != null) { - final Biome craftBiome = BukkitAdapter.adapt(biome); - currentBiomes[i] = CraftBlock.biomeToBiomeBase(craftBiome); - } - } - } - - Runnable[] syncTasks = null; - - int bx = X << 4; - int bz = Z << 4; - - Set entityRemoves = set.getEntityRemoves(); - if (entityRemoves != null && !entityRemoves.isEmpty()) { - if (syncTasks == null) syncTasks = new Runnable[3]; - - syncTasks[2] = new Runnable() { - @Override - public void run() { - final List[] entities = nmsChunk.getEntitySlices(); - - for (final Collection ents : entities) { - if (!ents.isEmpty()) { - final Iterator iter = ents.iterator(); - while (iter.hasNext()) { - final Entity entity = iter.next(); - if (entityRemoves.contains(entity.getUniqueID())) { - iter.remove(); - removeEntity(entity); - } - } - } - } - } - }; - } - - Set entities = set.getEntities(); - if (entities != null && !entities.isEmpty()) { - if (syncTasks == null) syncTasks = new Runnable[2]; - - syncTasks[1] = () -> { - for (final CompoundTag nativeTag : entities) { - final Map entityTagMap = ReflectionUtils.getMap(nativeTag.getValue()); - final StringTag idTag = (StringTag) entityTagMap.get("Id"); - final ListTag posTag = (ListTag) entityTagMap.get("Pos"); - final ListTag rotTag = (ListTag) entityTagMap.get("Rotation"); - if (idTag == null || posTag == null || rotTag == null) { - getLogger(BukkitGetBlocks_1_13.class).debug("Unknown entity tag: " + nativeTag); - continue; - } - final double x = posTag.getDouble(0); - final double y = posTag.getDouble(1); - final double z = posTag.getDouble(2); - final float yaw = rotTag.getFloat(0); - final float pitch = rotTag.getFloat(1); - final String id = idTag.getValue(); - - EntityTypes type = EntityTypes.a(id); - if (type != null) { - Entity entity = type.a(nmsWorld); - if (entity != null) { - UUID uuid = entity.getUniqueID(); - entityTagMap.put("UUIDMost", new LongTag(uuid.getMostSignificantBits())); - entityTagMap.put("UUIDLeast", new LongTag(uuid.getLeastSignificantBits())); - if (nativeTag != null) { - BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); - final NBTTagCompound tag = (NBTTagCompound) adapter.fromNative(nativeTag); - for (final String name : Constants.NO_COPY_ENTITY_NBT_FIELDS) { - tag.remove(name); - } - entity.f(tag); - } - entity.setLocation(x, y, z, yaw, pitch); - nmsWorld.addEntity(entity, CreatureSpawnEvent.SpawnReason.CUSTOM); - } - } - } - }; - - } - - // set tiles - Map tiles = set.getTiles(); - if (tiles != null && !tiles.isEmpty()) { - if (syncTasks == null) syncTasks = new Runnable[1]; - - syncTasks[0] = () -> { - for (final Map.Entry entry : tiles.entrySet()) { - final CompoundTag nativeTag = entry.getValue(); - final BlockVector3 blockHash = entry.getKey(); - final int x = blockHash.getX() + bx; - final int y = blockHash.getY(); - final int z = blockHash.getZ() + bz; - final BlockPosition pos = new BlockPosition(x, y, z); - - synchronized (nmsWorld) { - TileEntity tileEntity = nmsWorld.getTileEntity(pos); - if (tileEntity == null || tileEntity.x()) { - nmsWorld.n(pos); - tileEntity = nmsWorld.getTileEntity(pos); - } - if (tileEntity != null) { - BukkitImplAdapter adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); - final NBTTagCompound tag = (NBTTagCompound) adapter.fromNative(nativeTag); - tag.set("x", new NBTTagInt(x)); - tag.set("y", new NBTTagInt(y)); - tag.set("z", new NBTTagInt(z)); - tileEntity.load(tag); - } - } - } - }; - } - -// {//Lighting -// for (int layer = 0; layer < 16; layer++) { -// if (!set.hasSection(layer)) continue; -// //TODO lighting -// } -// } - - Runnable callback; - if (bitMask == 0 && biomes == null) { - callback = null; - } else { - int finalMask = bitMask; - callback = () -> { - // Set Modified - nmsChunk.f(true); // Set Modified - nmsChunk.mustSave = true; - nmsChunk.markDirty(); - // send to player - BukkitAdapter_1_13.sendChunk(nmsWorld, X, Z, finalMask); - if (finalizer != null) finalizer.run(); - }; - } - if (syncTasks != null) { - QueueHandler queueHandler = Fawe.get().getQueueHandler(); - Runnable[] finalSyncTasks = syncTasks; - - // Chain the sync tasks and the callback - Callable chain = () -> { - try { - // Run the sync tasks - for (Runnable task : finalSyncTasks) { - if (task != null) { - task.run(); - } - } - if (callback == null) { - if (finalizer != null) finalizer.run(); - return null; - } else { - return queueHandler.async(callback, null); - } - } catch (Throwable e) { - e.printStackTrace(); - throw e; - } - }; - return (T) (Future) queueHandler.sync(chain); - } else { - if (callback == null) { - if (finalizer != null) finalizer.run(); - } else { - callback.run(); - } - } - } - return null; - } catch (Throwable e) { - e.printStackTrace(); - return null; - } - } - - @Override - public synchronized char[] update(int layer, char[] data) { - ChunkSection section = getSections()[layer]; - // Section is null, return empty array - if (section == null) { - return FaweCache.INSTANCE.getEMPTY_CHAR_4096(); - } - if (data == null || data == FaweCache.INSTANCE.getEMPTY_CHAR_4096()) { - data = new char[4096]; - } - DelegateLock lock = BukkitAdapter_1_13.applyLock(section); - synchronized (lock) { - lock.untilFree(); - lock.setModified(false); - // Efficiently convert ChunkSection to raw data - try { - FAWE_Spigot_v1_13_R2 adapter = ((FAWE_Spigot_v1_13_R2) WorldEditPlugin.getInstance().getBukkitImplAdapter()); - - final DataPaletteBlock blocks = section.getBlocks(); - final DataBits bits = (DataBits) BukkitAdapter_1_13.fieldBits.get(blocks); - final DataPalette palette = (DataPalette) BukkitAdapter_1_13.fieldPalette.get(blocks); - - final int bitsPerEntry = bits.c(); - final long[] blockStates = bits.a(); - - new BitArray4096(blockStates, bitsPerEntry).toRaw(data); - - int num_palette; - if (palette instanceof DataPaletteLinear) { - num_palette = ((DataPaletteLinear) palette).b(); - } else if (palette instanceof DataPaletteHash) { - num_palette = ((DataPaletteHash) palette).b(); - } else { - num_palette = 0; - int[] paletteToBlockInts = FaweCache.INSTANCE.getPALETTE_TO_BLOCK().get(); - char[] paletteToBlockChars = FaweCache.INSTANCE.getPALETTE_TO_BLOCK_CHAR().get(); - try { - for (int i = 0; i < 4096; i++) { - char paletteVal = data[i]; - char ordinal = paletteToBlockChars[paletteVal]; - if (ordinal == Character.MAX_VALUE) { - paletteToBlockInts[num_palette++] = paletteVal; - IBlockData ibd = palette.a(data[i]); - if (ibd == null) { - ordinal = BlockTypes.AIR.getDefaultState().getOrdinalChar(); - } else { - ordinal = adapter.adaptToChar(ibd); - } - paletteToBlockChars[paletteVal] = ordinal; - } - data[i] = ordinal; - } - } finally { - for (int i = 0; i < num_palette; i++) { - int paletteVal = paletteToBlockInts[i]; - paletteToBlockChars[paletteVal] = Character.MAX_VALUE; - } - } - return data; - } - - char[] paletteToOrdinal = FaweCache.INSTANCE.getPALETTE_TO_BLOCK_CHAR().get(); - try { - if (num_palette != 1) { - for (int i = 0; i < num_palette; i++) { - char ordinal = ordinal(palette.a(i), adapter); - paletteToOrdinal[i] = ordinal; - } - for (int i = 0; i < 4096; i++) { - char paletteVal = data[i]; - char val = paletteToOrdinal[paletteVal]; - if (val == Character.MAX_VALUE) { - val = ordinal(palette.a(i), adapter); - paletteToOrdinal[i] = val; - } - data[i] = val; - } - } else { - char ordinal = ordinal(palette.a(0), adapter); - Arrays.fill(data, ordinal); - } - } finally { - for (int i = 0; i < num_palette; i++) { - paletteToOrdinal[i] = Character.MAX_VALUE; - } - } - return data; - } catch (IllegalAccessException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - } - - private final char ordinal(IBlockData ibd, FAWE_Spigot_v1_13_R2 adapter) { - if (ibd == null) { - return BlockTypes.AIR.getDefaultState().getOrdinalChar(); - } else { - return adapter.adaptToChar(ibd); - } - } - - public ChunkSection[] getSections() { - ChunkSection[] tmp = sections; - if (tmp == null) { - synchronized (this) { - tmp = sections; - if (tmp == null) { - Chunk chunk = getChunk(); - sections = tmp = chunk.getSections().clone(); - } - } - } - return tmp; - } - - public Chunk getChunk() { - Chunk tmp = nmsChunk; - if (tmp == null) { - synchronized (this) { - tmp = nmsChunk; - if (tmp == null) { - nmsChunk = tmp = ensureLoaded(this.world, X, Z); - } - } - } - return tmp; - } - - @Override - public boolean hasSection(int layer) { - return getSections()[layer] != null; - } - - @Override - public boolean trim(boolean aggressive) { - if (aggressive) { - sections = null; - nmsChunk = null; - } - return super.trim(aggressive); - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_13/LazyCompoundTag_1_13.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_13/LazyCompoundTag_1_13.java deleted file mode 100644 index 257d3782b..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_13/LazyCompoundTag_1_13.java +++ /dev/null @@ -1,152 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_13; - -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.ListTag; -import com.sk89q.jnbt.StringTag; -import com.sk89q.jnbt.Tag; -import com.sk89q.worldedit.bukkit.WorldEditPlugin; -import net.minecraft.server.v1_13_R2.NBTBase; -import net.minecraft.server.v1_13_R2.NBTNumber; -import net.minecraft.server.v1_13_R2.NBTTagCompound; -import net.minecraft.server.v1_13_R2.NBTTagList; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -public class LazyCompoundTag_1_13 extends CompoundTag { - private final Supplier nmsTag; - - public LazyCompoundTag_1_13(Supplier tag) { - super(null); - this.nmsTag = tag; - } - - public LazyCompoundTag_1_13(NBTTagCompound tag) { - this(() -> tag); - } - - public NBTTagCompound get() { - return nmsTag.get(); - } - - @Override - public Map getValue() { - Map value = super.getValue(); - if (value == null) { - Tag tag = WorldEditPlugin.getInstance().getBukkitImplAdapter().toNative(nmsTag.get()); - setValue(((CompoundTag) tag).getValue()); - } - return super.getValue(); - } - - public boolean containsKey(String key) { - return nmsTag.get().hasKey(key); - } - - public byte[] getByteArray(String key) { - return nmsTag.get().getByteArray(key); - } - - public byte getByte(String key) { - return nmsTag.get().getByte(key); - } - - public double getDouble(String key) { - return nmsTag.get().getDouble(key); - } - - public double asDouble(String key) { - NBTBase value = nmsTag.get().get(key); - if (value instanceof NBTNumber) { - return ((NBTNumber) value).asDouble(); - } - return 0; - } - - public float getFloat(String key) { - return nmsTag.get().getFloat(key); - } - - public int[] getIntArray(String key) { - return nmsTag.get().getIntArray(key); - } - - public int getInt(String key) { - return nmsTag.get().getInt(key); - } - - public int asInt(String key) { - NBTBase value = nmsTag.get().get(key); - if (value instanceof NBTNumber) { - return ((NBTNumber) value).asInt(); - } - return 0; - } - - public List getList(String key) { - NBTBase tag = nmsTag.get().get(key); - if (tag instanceof NBTTagList) { - ArrayList list = new ArrayList<>(); - NBTTagList nbtList = (NBTTagList) tag; - for (NBTBase elem : nbtList) { - if (elem instanceof NBTTagCompound) { - list.add(new LazyCompoundTag_1_13((NBTTagCompound) elem)); - } else { - list.add(WorldEditPlugin.getInstance().getBukkitImplAdapter().toNative(elem)); - } - } - return list; - } - return Collections.emptyList(); - } - - public ListTag getListTag(String key) { - NBTBase tag = nmsTag.get().get(key); - if (tag instanceof NBTTagList) { - return (ListTag) WorldEditPlugin.getInstance().getBukkitImplAdapter().toNative(tag); - } - return new ListTag(StringTag.class, Collections.emptyList()); - } - - @SuppressWarnings("unchecked") - public List getList(String key, Class listType) { - ListTag listTag = getListTag(key); - if (listTag.getType().equals(listType)) { - return (List) listTag.getValue(); - } else { - return Collections.emptyList(); - } - } - - public long[] getLongArray(String key) { - return nmsTag.get().o(key); - } - - public long getLong(String key) { - return nmsTag.get().getLong(key); - } - - public long asLong(String key) { - NBTBase value = nmsTag.get().get(key); - if (value instanceof NBTNumber) { - return ((NBTNumber) value).asLong(); - } - return 0; - } - - public short getShort(String key) { - return nmsTag.get().getShort(key); - } - - public String getString(String key) { - return nmsTag.get().getString(key); - } - - @Override - public String toString() { - return nmsTag.get().toString(); - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_13/MapChunkUtil_1_13.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_13/MapChunkUtil_1_13.java deleted file mode 100644 index b3cc9b6ec..000000000 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/adapter/mc1_13/MapChunkUtil_1_13.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.boydti.fawe.bukkit.adapter.mc1_13; - -import com.boydti.fawe.bukkit.adapter.MapChunkUtil; -import net.minecraft.server.v1_13_R2.PacketPlayOutMapChunk; - -public class MapChunkUtil_1_13 extends MapChunkUtil { - public MapChunkUtil_1_13() throws NoSuchFieldException { - fieldX = PacketPlayOutMapChunk.class.getDeclaredField("a"); - fieldZ = PacketPlayOutMapChunk.class.getDeclaredField("b"); - fieldBitMask = PacketPlayOutMapChunk.class.getDeclaredField("c"); - fieldChunkData = PacketPlayOutMapChunk.class.getDeclaredField("d"); - fieldBlockEntities = PacketPlayOutMapChunk.class.getDeclaredField("e"); - fieldFull = PacketPlayOutMapChunk.class.getDeclaredField("f"); - - fieldX.setAccessible(true); - fieldZ.setAccessible(true); - fieldBitMask.setAccessible(true); - fieldChunkData.setAccessible(true); - fieldBlockEntities.setAccessible(true); - fieldFull.setAccessible(true); - } - - @Override - public PacketPlayOutMapChunk createPacket() { - return new PacketPlayOutMapChunk(); - } -} diff --git a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/util/ItemUtil.java b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/util/ItemUtil.java index 2e709913c..e3f890537 100644 --- a/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/util/ItemUtil.java +++ b/worldedit-bukkit/src/main/java/com/boydti/fawe/bukkit/util/ItemUtil.java @@ -26,7 +26,7 @@ public class ItemUtil { private final Field fieldHandle; private final BukkitImplAdapter adapter; - private SoftReference>> hashToNMSTag = new SoftReference(new Int2ObjectOpenHashMap<>()); + private SoftReference>> hashToNMSTag = new SoftReference<>(new Int2ObjectOpenHashMap<>()); public ItemUtil() throws Exception { this.adapter = WorldEditPlugin.getInstance().getBukkitImplAdapter(); diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java index cab12b63d..77d23c43b 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java @@ -24,7 +24,6 @@ import static com.sk89q.worldedit.internal.anvil.ChunkDeleter.DELCHUNKS_FILE_NAM import com.boydti.fawe.Fawe; import com.boydti.fawe.bukkit.FaweBukkit; -import com.sk89q.worldedit.bukkit.adapter.impl.FAWE_Spigot_v1_13_R2; import com.sk89q.worldedit.bukkit.adapter.impl.FAWE_Spigot_v1_14_R4; import com.boydti.fawe.util.MainUtil; import com.google.common.base.Joiner; @@ -371,7 +370,6 @@ public class WorldEditPlugin extends JavaPlugin { //implements TabCompleter // Attempt to load a Bukkit adapter BukkitImplLoader adapterLoader = new BukkitImplLoader(); try { - adapterLoader.addClass(FAWE_Spigot_v1_13_R2.class); adapterLoader.addClass(FAWE_Spigot_v1_14_R4.class); adapterLoader.addClass(FAWE_Spigot_v1_15_R1.class); } catch (Throwable throwable) { diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/FAWE_Spigot_v1_13_R2.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/FAWE_Spigot_v1_13_R2.java deleted file mode 100644 index a47937759..000000000 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/FAWE_Spigot_v1_13_R2.java +++ /dev/null @@ -1,476 +0,0 @@ -/* - * WorldEdit, a Minecraft world manipulation toolkit - * Copyright (C) sk89q - * Copyright (C) WorldEdit team and contributors - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by the - * Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package com.sk89q.worldedit.bukkit.adapter.impl; - -import com.bekvon.bukkit.residence.commands.material; -import com.boydti.fawe.Fawe; -import com.boydti.fawe.FaweCache; -import com.boydti.fawe.beta.IChunkGet; -import com.boydti.fawe.beta.implementation.packet.ChunkPacket; -import com.boydti.fawe.beta.implementation.queue.SingleThreadQueueExtent; -import com.boydti.fawe.bukkit.adapter.mc1_13.BlockMaterial_1_13; -import com.boydti.fawe.bukkit.adapter.mc1_13.BukkitAdapter_1_13; -import com.boydti.fawe.bukkit.adapter.mc1_13.BukkitGetBlocks_1_13; -import com.boydti.fawe.bukkit.adapter.mc1_13.LazyCompoundTag_1_13; -import com.boydti.fawe.bukkit.adapter.mc1_13.MapChunkUtil_1_13; -import com.boydti.fawe.bukkit.adapter.mc1_14.BukkitGetBlocks_1_14; -import com.google.common.io.Files; -import com.sk89q.jnbt.CompoundTag; -import com.sk89q.jnbt.Tag; -import com.sk89q.worldedit.EditSession; -import com.sk89q.worldedit.MaxChangedBlocksException; -import com.sk89q.worldedit.blocks.BaseItemStack; -import com.sk89q.worldedit.blocks.TileEntityBlock; -import com.sk89q.worldedit.bukkit.BukkitAdapter; -import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; -import com.sk89q.worldedit.bukkit.adapter.CachedBukkitAdapter; -import com.sk89q.worldedit.bukkit.adapter.IDelegateBukkitImplAdapter; -import com.sk89q.worldedit.entity.BaseEntity; -import com.sk89q.worldedit.entity.LazyBaseEntity; -import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.regions.Region; -import com.sk89q.worldedit.registry.state.Property; -import com.sk89q.worldedit.world.biome.BiomeType; -import com.sk89q.worldedit.world.biome.BiomeTypes; -import com.sk89q.worldedit.world.block.BaseBlock; -import com.sk89q.worldedit.world.block.BlockState; -import com.sk89q.worldedit.world.block.BlockStateHolder; -import com.sk89q.worldedit.world.block.BlockType; -import com.sk89q.worldedit.world.block.BlockTypes; -import com.sk89q.worldedit.world.block.BlockTypesCache; -import com.sk89q.worldedit.world.entity.EntityType; -import com.sk89q.worldedit.world.registry.BlockMaterial; -import net.minecraft.server.v1_13_R2.BiomeBase; -import net.minecraft.server.v1_13_R2.Block; -import net.minecraft.server.v1_13_R2.BlockPosition; -import net.minecraft.server.v1_13_R2.Blocks; -import net.minecraft.server.v1_13_R2.Chunk; -import net.minecraft.server.v1_13_R2.ChunkProviderServer; -import net.minecraft.server.v1_13_R2.ChunkSection; -import net.minecraft.server.v1_13_R2.Entity; -import net.minecraft.server.v1_13_R2.EntityPlayer; -import net.minecraft.server.v1_13_R2.EntityTypes; -import net.minecraft.server.v1_13_R2.IBlockData; -import net.minecraft.server.v1_13_R2.IDataManager; -import net.minecraft.server.v1_13_R2.IRegistry; -import net.minecraft.server.v1_13_R2.ItemStack; -import net.minecraft.server.v1_13_R2.MinecraftKey; -import net.minecraft.server.v1_13_R2.MinecraftServer; -import net.minecraft.server.v1_13_R2.NBTBase; -import net.minecraft.server.v1_13_R2.NBTTagCompound; -import net.minecraft.server.v1_13_R2.NBTTagInt; -import net.minecraft.server.v1_13_R2.PacketPlayOutMapChunk; -import net.minecraft.server.v1_13_R2.PlayerChunk; -import net.minecraft.server.v1_13_R2.ServerNBTManager; -import net.minecraft.server.v1_13_R2.TileEntity; -import net.minecraft.server.v1_13_R2.World; -import net.minecraft.server.v1_13_R2.WorldData; -import net.minecraft.server.v1_13_R2.WorldNBTStorage; -import net.minecraft.server.v1_13_R2.WorldServer; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_13_R2.CraftChunk; -import org.bukkit.craftbukkit.v1_13_R2.CraftServer; -import org.bukkit.craftbukkit.v1_13_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_13_R2.block.CraftBlock; -import org.bukkit.craftbukkit.v1_13_R2.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_13_R2.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_13_R2.inventory.CraftItemStack; -import org.bukkit.entity.Player; -import org.bukkit.generator.ChunkGenerator; -import org.jetbrains.annotations.NotNull; - -import javax.annotation.Nullable; -import java.io.File; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.List; -import java.util.Map; -import java.util.OptionalInt; -import java.util.UUID; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; -import java.util.function.Supplier; - -import static com.google.common.base.Preconditions.checkNotNull; - -public final class FAWE_Spigot_v1_13_R2 extends CachedBukkitAdapter implements IDelegateBukkitImplAdapter { - private final Spigot_v1_13_R2_2 parent; - - // ------------------------------------------------------------------------ - // Code that may break between versions of Minecraft - // ------------------------------------------------------------------------ - - public FAWE_Spigot_v1_13_R2() throws NoSuchFieldException, NoSuchMethodException { - this.parent = new Spigot_v1_13_R2_2(); - } - - @Override - public BukkitImplAdapter getParent() { - return parent; - } - - public char[] idbToStateOrdinal; - - private synchronized boolean init() { - if (idbToStateOrdinal != null) return false; - idbToStateOrdinal = new char[Block.REGISTRY_ID.a()]; // size - for (int i = 0; i < idbToStateOrdinal.length; i++) { - BlockState state = BlockTypesCache.states[i]; - BlockMaterial mat = state.getMaterial(); - if (mat instanceof BlockMaterial_1_13) { - BlockMaterial_1_13 nmsMat = (BlockMaterial_1_13) mat; - int id = Block.REGISTRY_ID.getId(nmsMat.getState()); - idbToStateOrdinal[id] = state.getOrdinalChar(); - } - } - return true; - } - - @Override - public BlockMaterial getMaterial(BlockType blockType) { - Block block = getBlock(blockType); - return block != null ? new BlockMaterial_1_13(block) : new BlockMaterial_1_13(Blocks.AIR); - } - - @Override - public BlockMaterial getMaterial(BlockState state) { - IBlockData bs = ((CraftBlockData) Bukkit.createBlockData(state.getAsString())).getState(); - return bs != null ? new BlockMaterial_1_13(bs.getBlock(), bs) : new BlockMaterial_1_13(Blocks.AIR); - } - - public Block getBlock(BlockType blockType) { - return IRegistry.BLOCK.get(new MinecraftKey(blockType.getNamespace(), blockType.getResource())); - } - - @Override - public BaseBlock getBlock(Location location) { - checkNotNull(location); - - CraftWorld craftWorld = ((CraftWorld) location.getWorld()); - int x = location.getBlockX(); - int y = location.getBlockY(); - int z = location.getBlockZ(); - - org.bukkit.block.Block bukkitBlock = location.getBlock(); - BlockState state = BukkitAdapter.adapt(bukkitBlock.getBlockData()); - if (state.getBlockType().getMaterial().hasContainer()) { - //Read the NBT data - TileEntity te = craftWorld.getHandle().getTileEntity(new BlockPosition(x, y, z)); - if (te != null) { - NBTTagCompound tag = new NBTTagCompound(); - te.save(tag); // readTileEntityIntoTag - return state.toBaseBlock((CompoundTag) toNative(tag)); - } - } - - return state.toBaseBlock(); - } - - @Override - public > boolean setBlock(Location location, B state, boolean notifyAndLight) { - return this.setBlock(location.getChunk(), location.getBlockX(), location.getBlockY(), location.getBlockZ(), state, notifyAndLight); - } - - public boolean setBlock(org.bukkit.Chunk chunk, int x, int y, int z, BlockStateHolder state, boolean update) { - CraftChunk craftChunk = (CraftChunk) chunk; - Chunk nmsChunk = craftChunk.getHandle(); - World nmsWorld = nmsChunk.getWorld(); - - IBlockData blockData = ((BlockMaterial_1_13) state.getMaterial()).getState(); - ChunkSection[] sections = nmsChunk.getSections(); - int y4 = y >> 4; - ChunkSection section = sections[y4]; - - IBlockData existing; - if (section == null) { - existing = ((BlockMaterial_1_13) BlockTypes.AIR.getDefaultState().getMaterial()).getState(); - } else { - existing = section.getType(x & 15, y & 15, z & 15); - } - - BlockPosition pos = new BlockPosition(x, y, z); - - nmsChunk.d(pos); // removeTileEntity } Force delete the old tile entity - - CompoundTag nativeTag = state instanceof BaseBlock ? ((BaseBlock)state).getNbtData() : null; - if (nativeTag != null || existing instanceof TileEntityBlock) { - nmsWorld.setTypeAndData(pos, blockData, 0); - // remove tile - if (nativeTag != null) { - // We will assume that the tile entity was created for us, - // though we do not do this on the Forge version - TileEntity tileEntity = nmsWorld.getTileEntity(pos); - if (tileEntity != null) { - NBTTagCompound tag = (NBTTagCompound) fromNative(nativeTag); - tag.set("x", new NBTTagInt(x)); - tag.set("y", new NBTTagInt(y)); - tag.set("z", new NBTTagInt(z)); - tileEntity.load(tag); // readTagIntoTileEntity - } - } - } else { - if (existing == blockData) return true; - if (section == null) { - if (blockData.isAir()) return true; - sections[y4] = section = new ChunkSection(y4 << 4, nmsWorld.worldProvider.g()); - } - nmsChunk.setType(pos = new BlockPosition(x, y, z), blockData, false); - } - if (update) { - nmsWorld.getMinecraftWorld().notify(pos, existing, blockData, 0); - } - return true; - } - - @Nullable - private static String getEntityId(Entity entity) { - MinecraftKey minecraftkey = EntityTypes.getName(entity.P()); - return minecraftkey == null ? null : minecraftkey.toString(); - } - - private static void readEntityIntoTag(Entity entity, NBTTagCompound tag) { - entity.save(tag); - } - - @Override - public BaseEntity getEntity(org.bukkit.entity.Entity entity) { - checkNotNull(entity); - - CraftEntity craftEntity = ((CraftEntity) entity); - Entity mcEntity = craftEntity.getHandle(); - - String id = getEntityId(mcEntity); - - if (id != null) { - EntityType type = com.sk89q.worldedit.world.entity.EntityTypes.get(id); - Supplier saveTag = () -> { - NBTTagCompound tag = new NBTTagCompound(); - readEntityIntoTag(mcEntity, tag); - return (CompoundTag) toNative(tag); - }; - return new LazyBaseEntity(type, saveTag); - } else { - return null; - } - } - - @Override - public OptionalInt getInternalBlockStateId(BlockState state) { - BlockMaterial_1_13 material = (BlockMaterial_1_13) state.getMaterial(); - IBlockData mcState = material.getCraftBlockData().getState(); - return OptionalInt.of(Block.REGISTRY_ID.getId(mcState)); - } - - @Override - public BlockState adapt(BlockData blockData) { - CraftBlockData cbd = ((CraftBlockData) blockData); - IBlockData ibd = cbd.getState(); - return adapt(ibd); - } - - public BlockState adapt(IBlockData ibd) { - return BlockTypesCache.states[adaptToInt(ibd)]; - } - - public int adaptToInt(IBlockData ibd) { - try { - int id = Block.REGISTRY_ID.getId(ibd); - return idbToStateOrdinal[id]; - } catch (NullPointerException e) { - init(); - return adaptToInt(ibd); - } - } - - public char adaptToChar(IBlockData ibd) { - try { - int id = Block.REGISTRY_ID.getId(ibd); - return idbToStateOrdinal[id]; - } catch (NullPointerException e) { - init(); - return adaptToChar(ibd); - } - } - - @Override - public > BlockData adapt(B state) { - try { - BlockMaterial_1_13 material = (BlockMaterial_1_13) state.getMaterial(); - return material.getCraftBlockData(); - } catch (ClassCastException ignore) { - throw ignore; - } - } - - @Override - public void notifyAndLightBlock(Location position, BlockState previousType) { - this.setBlock(position.getChunk(), position.getBlockX(), position.getBlockY(), position.getBlockZ(), previousType, true); - } - - private MapChunkUtil_1_13 mapUtil = new MapChunkUtil_1_13(); - - @Override - public void sendFakeChunk(org.bukkit.World world, Player target, ChunkPacket packet) { - WorldServer nmsWorld = ((CraftWorld) world).getHandle(); - PlayerChunk map = BukkitAdapter_1_13.getPlayerChunk(nmsWorld, packet.getChunkX(), packet.getChunkZ()); - if (map != null && map.e()) { - boolean flag = false; - List inChunk = map.players; - if (inChunk != null && !inChunk.isEmpty()) { - EntityPlayer nmsTarget = target != null ? ((CraftPlayer) target).getHandle() : null; - for (EntityPlayer current : inChunk) { - if (nmsTarget == null || current == nmsTarget) { - synchronized (packet) { - PacketPlayOutMapChunk nmsPacket = (PacketPlayOutMapChunk) packet.getNativePacket(); - if (nmsPacket == null) { - nmsPacket = mapUtil.create(FAWE_Spigot_v1_13_R2.this, packet); - packet.setNativePacket(nmsPacket); - } - try { - FaweCache.INSTANCE.getCHUNK_FLAG().get().set(true); - current.playerConnection.sendPacket(nmsPacket); - } finally { - FaweCache.INSTANCE.getCHUNK_FLAG().get().set(false); - } - } - } - } - } - } - } - - @Override - public Map> getProperties(BlockType blockType) { - return getParent().getProperties(blockType); - } - - @Override - public org.bukkit.inventory.ItemStack adapt(BaseItemStack item) { - ItemStack stack = new ItemStack(IRegistry.ITEM.get(MinecraftKey.a(item.getType().getId())), item.getAmount()); - stack.setTag(((NBTTagCompound) fromNative(item.getNbtData()))); - return CraftItemStack.asCraftMirror(stack); - } - - @Override - public BaseItemStack adapt(org.bukkit.inventory.ItemStack itemStack) { - final ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack); - final BaseItemStack weStack = new BaseItemStack(BukkitAdapter.asItemType(itemStack.getType()), itemStack.getAmount()); - weStack.setNbtData(((CompoundTag) toNative(nmsStack.getTag()))); - return weStack; - } - - @Override - public Tag toNative(NBTBase foreign) { - return parent.toNative(foreign); - } - - @Override - public NBTBase fromNative(Tag foreign) { - if (foreign instanceof LazyCompoundTag_1_13) { - return ((LazyCompoundTag_1_13) foreign).get(); - } - return parent.fromNative(foreign); - } - - @Override - public boolean regenerate(org.bukkit.World world, Region region, @Nullable Long seed, @Nullable BiomeType biome, EditSession editSession) { - WorldServer originalWorld = ((CraftWorld) world).getHandle(); - ChunkProviderServer provider = originalWorld.getChunkProvider(); - if (provider == null) { - return false; - } - - File saveFolder = Files.createTempDir(); - // register this just in case something goes wrong - // normally it should be deleted at the end of this method - saveFolder.deleteOnExit(); - try { - MinecraftServer server = originalWorld.getServer().getServer(); - IDataManager originalDataManager = originalWorld.getDataManager(); - ServerNBTManager saveHandler = new ServerNBTManager(saveFolder, - originalWorld.getDataManager().getDirectory().getName(), server, server.dataConverterManager); - WorldData newWorldData = new WorldData(originalWorld.worldData.a((NBTTagCompound) null), - server.dataConverterManager, getDataVersion(), null); - newWorldData.checkName(UUID.randomUUID().toString()); - - ChunkGenerator generator = world.getGenerator(); - org.bukkit.World.Environment environment = world.getEnvironment(); - if (seed != null) { - if (biome == BiomeTypes.NETHER) { - environment = org.bukkit.World.Environment.NETHER; - } else if (biome == BiomeTypes.THE_END) { - environment = org.bukkit.World.Environment.THE_END; - } else { - environment = org.bukkit.World.Environment.NORMAL; - } - generator = null; - } - try (WorldServer freshWorld = new WorldServer(server, - saveHandler, - originalWorld.worldMaps, - newWorldData, - originalWorld.worldProvider.getDimensionManager(), - originalWorld.methodProfiler, - environment, - generator)) { - SingleThreadQueueExtent extent = new SingleThreadQueueExtent(); - extent.init(null, (x, z) -> new BukkitGetBlocks_1_13(freshWorld, x, z) { - @Override - public Chunk ensureLoaded(World nmsWorld, int X, int Z) { - Chunk cached = nmsWorld.getChunkIfLoaded(X, Z); - if (cached != null) return cached; - Future future = Fawe.get().getQueueHandler().sync((Supplier) () -> freshWorld.getChunkAt(X, Z)); -// while (!future.isDone()) { -// // this feels so dirty -// freshWorld.getChunkProvider().runTasks(); -// } - try { - return future.get(); - } catch (InterruptedException | ExecutionException e) { - throw new RuntimeException(e); - } - } - }, null); - for (BlockVector3 vec : region) { - editSession.setBlock(vec, extent.getFullBlock(vec)); - } - } - } catch (MaxChangedBlocksException e) { - throw new RuntimeException(e); - } finally { - saveFolder.delete(); - } - return true; - } - - @Override - public IChunkGet get(org.bukkit.World world, int chunkX, int chunkZ) { - return new BukkitGetBlocks_1_13(world, chunkX, chunkZ); - } - - @Override - public int getInternalBiomeId(BiomeType biome) { - BiomeBase base = CraftBlock.biomeToBiomeBase(BukkitAdapter.adapt(biome)); - return IRegistry.BIOME.a(base); - } -} diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/ErodeBrush.java b/worldedit-core/src/main/java/com/boydti/fawe/object/brush/ErodeBrush.java index d7c7ff3f6..cb23bef94 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/ErodeBrush.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/object/brush/ErodeBrush.java @@ -126,7 +126,6 @@ public class ErodeBrush implements Brush { private void erosionIteration(int brushSize, int brushSizeSquared, int erodeFaces, Clipboard current, Clipboard target) { int[] frequency = null; - for (int x = -brushSize, relx = 0; x <= brushSize; x++, relx++) { int x2 = x * x; for (int z = -brushSize, relz = 0; z <= brushSize; z++, relz++) { @@ -138,7 +137,7 @@ public class ErodeBrush implements Brush { continue; } BaseBlock state = current.getFullBlock(relx, rely, relz); - if (!state.getBlockType().getMaterial().isMovementBlocker()) { + if (!state.getMaterial().isMovementBlocker()) { continue; } int total = 0; @@ -151,7 +150,7 @@ public class ErodeBrush implements Brush { } for (BlockVector3 offs : FACES_TO_CHECK) { BaseBlock next = current.getFullBlock(relx + offs.getBlockX(), rely + offs.getBlockY(), relz + offs.getBlockZ()); - if (next.getBlockType().getMaterial().isMovementBlocker()) { + if (next.getMaterial().isMovementBlocker()) { continue; } total++; diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/FlatScalableHeightMap.java b/worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/FlatScalableHeightMap.java index 80b21e312..ed5557371 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/FlatScalableHeightMap.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/FlatScalableHeightMap.java @@ -5,6 +5,7 @@ public class FlatScalableHeightMap extends ScalableHeightMap { super(); } + @Override public double getHeight(int x, int z) { int dx = Math.abs(x); int dz = Math.abs(z); diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/HeightMap.java b/worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/HeightMap.java index 1eea82eec..8e64eb64e 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/HeightMap.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/HeightMap.java @@ -13,6 +13,7 @@ import com.sk89q.worldedit.util.Location; import java.util.concurrent.ThreadLocalRandom; public interface HeightMap { + double getHeight(int x, int z); void setSize(int size); diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/RotatableHeightMap.java b/worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/RotatableHeightMap.java index eff992937..d0e287ace 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/RotatableHeightMap.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/object/brush/heightmap/RotatableHeightMap.java @@ -6,7 +6,7 @@ import com.sk89q.worldedit.math.transform.AffineTransform; public class RotatableHeightMap extends AbstractDelegateHeightMap { private AffineTransform transform; - private MutableVector3 mutable; + private final MutableVector3 mutable; public RotatableHeightMap(HeightMap parent) { super(parent); @@ -25,4 +25,4 @@ public class RotatableHeightMap extends AbstractDelegateHeightMap { BlockVector3 pos = transform.apply(mutable.setComponents(x, 0, z)).toBlockPoint(); return super.getHeight(pos.getBlockX(), pos.getBlockZ()); } -} \ No newline at end of file +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java index fed6733cd..76f8ffe5e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java @@ -186,10 +186,10 @@ public class GenerationCommands { public int hcyl(Actor actor, LocalSession session, EditSession editSession, @Arg(desc = "The pattern of blocks to generate") Pattern pattern, - @Confirm(Confirm.Processor.RADIUS) @Arg(desc = "The radii of the cylinder. 1st is N/S, 2nd is E/W") - @Radii(2) - List radii, - @Arg(desc = "The height of the cylinder", def = "1") + @Arg(desc = "The radii of the cylinder. 1st is N/S, 2nd is E/W") + @Radii(2) + List radii, + @Arg(desc = "The height of the cylinder", def = "1") int height) throws WorldEditException { return cyl(actor, session, editSession, pattern, radii, height, true); } @@ -203,7 +203,7 @@ public class GenerationCommands { public int cyl(Actor actor, LocalSession session, EditSession editSession, @Arg(desc = "The pattern of blocks to generate") Pattern pattern, - @Confirm(Confirm.Processor.RADIUS) @Arg(desc = "The radii of the cylinder. 1st is N/S, 2nd is E/W") + @Arg(desc = "The radii of the cylinder. 1st is N/S, 2nd is E/W") @Radii(2) List radii, @Arg(desc = "The height of the cylinder", def = "1") @@ -245,7 +245,7 @@ public class GenerationCommands { public int hsphere(Actor actor, LocalSession session, EditSession editSession, @Arg(desc = "The pattern of blocks to generate") Pattern pattern, - @Confirm(Confirm.Processor.RADIUS) @Arg(desc = "The radii of the sphere. Order is N/S, U/D, E/W") + @Arg(desc = "The radii of the sphere. Order is N/S, U/D, E/W") @Radii(3) List radii, @Switch(name = 'r', desc = "Raise the bottom of the sphere to the placement position") @@ -262,7 +262,7 @@ public class GenerationCommands { public int sphere(Actor actor, LocalSession session, EditSession editSession, @Arg(desc = "The pattern of blocks to generate") Pattern pattern, - @Confirm(Confirm.Processor.RADIUS) @Arg(desc = "The radii of the sphere. Order is N/S, U/D, E/W") + @Arg(desc = "The radii of the sphere. Order is N/S, U/D, E/W") @Radii(3) List radii, @Switch(name = 'r', desc = "Raise the bottom of the sphere to the placement position") diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/CavesGen.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/CavesGen.java index 6db6bf816..a5d23c1b0 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/CavesGen.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/generator/CavesGen.java @@ -48,8 +48,8 @@ public class CavesGen extends GenBase { } protected void generateCaveNode(long seed, BlockVector2 chunkPos, Extent chunk, double x, double y, double z, double paramdouble1, double paramdouble2, double paramdouble3, int angle, int maxAngle, double paramDouble4) throws WorldEditException { - int bx = (chunkPos.getBlockX() << 4); - int bz = (chunkPos.getBlockZ() << 4); + int bx = chunkPos.getBlockX() << 4; + int bz = chunkPos.getBlockZ() << 4; double real_x = bx + 7; double real_z = bz + 7; @@ -57,7 +57,7 @@ public class CavesGen extends GenBase { double f2 = 0.0F; if (maxAngle <= 0) { - int checkAreaSize = (this.getCheckAreaSize() * 16) - 16; + int checkAreaSize = this.getCheckAreaSize() * 16 - 16; maxAngle = checkAreaSize - ThreadLocalRandom.current().nextInt(checkAreaSize / 4); } boolean isLargeCave = false; @@ -95,14 +95,14 @@ public class CavesGen extends GenBase { f1 += (ThreadLocalRandom.current().nextDouble() - ThreadLocalRandom.current() .nextDouble()) * ThreadLocalRandom.current().nextDouble() * 4.0F; - if ((!isLargeCave) && (angle == j) && (paramdouble1 > 1.0F) && (maxAngle > 0)) { + if (!isLargeCave && angle == j && paramdouble1 > 1.0F && maxAngle > 0) { generateCaveNode(ThreadLocalRandom.current().nextLong(), chunkPos, chunk, x, y, z, ThreadLocalRandom .current().nextDouble() * 0.5F + 0.5F, paramdouble2 - 1.570796F, paramdouble3 / 3.0F, angle, maxAngle, 1.0D); generateCaveNode(ThreadLocalRandom.current().nextLong(), chunkPos, chunk, x, y, z, ThreadLocalRandom .current().nextDouble() * 0.5F + 0.5F, paramdouble2 + 1.570796F, paramdouble3 / 3.0F, angle, maxAngle, 1.0D); return; } - if ((!isLargeCave) && (ThreadLocalRandom.current().nextInt(4) == 0)) { + if (!isLargeCave && ThreadLocalRandom.current().nextInt(4) == 0) { continue; } @@ -116,7 +116,8 @@ public class CavesGen extends GenBase { } //Boundaries check. - if ((x < real_x - 16.0D - d3 * 2.0D) || (z < real_z - 16.0D - d3 * 2.0D) || (x > real_x + 16.0D + d3 * 2.0D) || (z > real_z + 16.0D + d3 * 2.0D)) + if (x < real_x - 16.0D - d3 * 2.0D || z < real_z - 16.0D - d3 * 2.0D + || x > real_x + 16.0D + d3 * 2.0D || z > real_z + 16.0D + d3 * 2.0D) continue; @@ -146,15 +147,16 @@ public class CavesGen extends GenBase { // Search for water boolean waterFound = false; - for (int local_x = m; !waterFound && (local_x < n); local_x++) { - for (int local_z = i3; !waterFound && (local_z < i4); local_z++) { - for (int local_y = i2 + 1; !waterFound && (local_y >= i1 - 1); local_y--) { + for (int local_x = m; !waterFound && local_x < n; local_x++) { + for (int local_z = i3; !waterFound && local_z < i4; local_z++) { + for (int local_y = i2 + 1; !waterFound && local_y >= i1 - 1; local_y--) { if (local_y < 255) { BlockState material = chunk.getBlock(bx + local_x, local_y, bz + local_z); if (material.getBlockType() == BlockTypes.WATER) { waterFound = true; } - if ((local_y != i1 - 1) && (local_x != m) && (local_x != n - 1) && (local_z != i3) && (local_z != i4 - 1)) + if (local_y != i1 - 1 && local_x != m && local_x != n - 1 && local_z != i3 + && local_z != i4 - 1) local_y = i1; } } @@ -173,7 +175,7 @@ public class CavesGen extends GenBase { if (d9 * d9 + d10 * d10 < 1.0D) { for (int local_y = i2; local_y > i1; local_y--) { double d11 = ((local_y - 1) + 0.5D - y) / d4; - if ((d11 > -0.7D) && (d9 * d9 + d11 * d11 + d10 * d10 < 1.0D)) { + if (d11 > -0.7D && d9 * d9 + d11 * d11 + d10 * d10 < 1.0D) { BlockState material = chunk.getBlock(bx + local_x, local_y, bz + local_z); BlockState materialAbove = chunk.getBlock(bx + local_x, local_y + 1, bz + local_z); BlockType blockType = material.getBlockType(); @@ -254,8 +256,8 @@ public class CavesGen extends GenBase { largeCaveSpawned = true; } - if ((largeCaveSpawned) || (ThreadLocalRandom.current().nextInt(100) - <= this.caveSystemPocketChance - 1)) { + if (largeCaveSpawned || ThreadLocalRandom.current().nextInt(100) + <= this.caveSystemPocketChance - 1) { count += ThreadLocalRandom.current() .nextInt(this.caveSystemPocketMinSize, this.caveSystemPocketMaxSize); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/SolidBlockMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/SolidBlockMask.java index 40f691280..cf28fe38f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/SolidBlockMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/SolidBlockMask.java @@ -20,9 +20,8 @@ package com.sk89q.worldedit.function.mask; import com.sk89q.worldedit.extent.Extent; - import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.world.block.BlockState; + import javax.annotation.Nullable; public class SolidBlockMask extends BlockMask { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/history/changeset/ChangeSet.java b/worldedit-core/src/main/java/com/sk89q/worldedit/history/changeset/ChangeSet.java index 6d744e0a7..c7518c18b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/history/changeset/ChangeSet.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/history/changeset/ChangeSet.java @@ -19,16 +19,12 @@ package com.sk89q.worldedit.history.changeset; -import com.google.common.collect.Maps; import com.sk89q.worldedit.history.change.Change; import com.sk89q.worldedit.regions.Region; -import com.sk89q.worldedit.world.block.BlockState; import java.io.Closeable; import java.io.IOException; -import java.util.Collections; import java.util.Iterator; -import java.util.Map; /** * Tracks a set of undoable operations and allows their undo and redo. The diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/anvil/ChunkDeleter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/anvil/ChunkDeleter.java index 642708cbf..665210694 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/anvil/ChunkDeleter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/anvil/ChunkDeleter.java @@ -28,6 +28,9 @@ import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import com.sk89q.worldedit.math.BlockVector2; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.io.BufferedWriter; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -35,6 +38,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; +import java.nio.file.StandardOpenOption; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; @@ -45,8 +49,6 @@ import java.util.Set; import java.util.function.BiPredicate; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public final class ChunkDeleter { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk.java index f42997187..76afa606b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk.java @@ -259,11 +259,11 @@ public class AnvilChunk implements Chunk { WorldEdit.logger.warn("Unknown legacy block " + id + ":" + data + " found when loading legacy anvil chunk."); return BlockTypes.AIR.getDefaultState().toBaseBlock(); } - CompoundTag tileEntity = getBlockTileEntity(position); + CompoundTag tileEntity = getBlockTileEntity(position); - if (tileEntity != null) { - return state.toBaseBlock(tileEntity); - } + if (tileEntity != null) { + return state.toBaseBlock(tileEntity); + } return state.toBaseBlock(); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk13.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk13.java index e0717c0e2..5cf07bd91 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk13.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/AnvilChunk13.java @@ -54,7 +54,7 @@ public class AnvilChunk13 implements Chunk { /** * Construct the chunk with a compound tag. - * + * * @param tag the tag to read * @throws DataException on a data error */ @@ -226,7 +226,7 @@ public class AnvilChunk13 implements Chunk { BlockState[] sectionBlocks = blocks[section]; BlockState state = sectionBlocks != null ? sectionBlocks[(yIndex << 8) | (z << 4) | x] : BlockTypes.AIR.getDefaultState(); - CompoundTag tileEntity = getBlockTileEntity(position); + CompoundTag tileEntity = getBlockTileEntity(position); if (tileEntity != null) { return state.toBaseBlock(tileEntity); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/OldChunk.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/OldChunk.java index 540197cee..f123d7220 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/OldChunk.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/chunk/OldChunk.java @@ -184,11 +184,11 @@ public class OldChunk implements Chunk { return BlockTypes.AIR.getDefaultState().toBaseBlock(); } - CompoundTag tileEntity = getBlockTileEntity(position); + CompoundTag tileEntity = getBlockTileEntity(position); - if (tileEntity != null) { - return state.toBaseBlock(tileEntity); - } + if (tileEntity != null) { + return state.toBaseBlock(tileEntity); + } return state.toBaseBlock(); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/McRegionReader.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/McRegionReader.java index ec03ba6b1..29f37df31 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/McRegionReader.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/storage/McRegionReader.java @@ -85,7 +85,7 @@ public class McRegionReader { /** * Construct the reader. - * + * * @param stream the stream * @throws DataException * @throws IOException @@ -99,7 +99,7 @@ public class McRegionReader { /** * Read the header. - * + * * @throws IOException */ private void readHeader() throws IOException { @@ -113,7 +113,7 @@ public class McRegionReader { /** * Gets the uncompressed data input stream for a chunk. - * + * * @param position chunk position * @return an input stream * @throws IOException @@ -165,7 +165,7 @@ public class McRegionReader { /** * Get the offset for a chunk. May return 0 if it doesn't exist. - * + * * @param x the X coordinate * @param z the Z coordinate * @return the offset