diff --git a/worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R2/PaperweightPlatformAdapter.java b/worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R2/PaperweightPlatformAdapter.java index bbbffad673..b516da2428 100644 --- a/worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R2/PaperweightPlatformAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R2/PaperweightPlatformAdapter.java @@ -431,9 +431,9 @@ public static LevelChunkSection newChunkSection( try { int num_palette; if (get == null) { - num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter); + num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter, false); } else { - num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter); + num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter, false); } int bitsPerEntry = MathMan.log2nlz(num_palette - 1); diff --git a/worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R3/PaperweightPlatformAdapter.java b/worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R3/PaperweightPlatformAdapter.java index 8c25ef1000..8ca32f79c3 100644 --- a/worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R3/PaperweightPlatformAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R3/PaperweightPlatformAdapter.java @@ -431,9 +431,9 @@ public static LevelChunkSection newChunkSection( try { int num_palette; if (get == null) { - num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter); + num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter, false); } else { - num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter); + num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter, false); } int bitsPerEntry = MathMan.log2nlz(num_palette - 1); diff --git a/worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R4/PaperweightPlatformAdapter.java b/worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R4/PaperweightPlatformAdapter.java index be033a455f..cbcb613b16 100644 --- a/worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R4/PaperweightPlatformAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R4/PaperweightPlatformAdapter.java @@ -425,9 +425,9 @@ public static LevelChunkSection newChunkSection( try { int num_palette; if (get == null) { - num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter); + num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter, false); } else { - num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter); + num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter, false); } int bitsPerEntry = MathMan.log2nlz(num_palette - 1); diff --git a/worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_R1/PaperweightPlatformAdapter.java b/worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_R1/PaperweightPlatformAdapter.java index 4976bf0649..f91810ead5 100644 --- a/worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_R1/PaperweightPlatformAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_R1/PaperweightPlatformAdapter.java @@ -415,9 +415,9 @@ public static LevelChunkSection newChunkSection( try { int num_palette; if (get == null) { - num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter); + num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter, false); } else { - num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter); + num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter, false); } int bitsPerEntry = MathMan.log2nlz(num_palette - 1); diff --git a/worldedit-bukkit/adapters/adapter-1_21_11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_11/PaperweightGetBlocks.java b/worldedit-bukkit/adapters/adapter-1_21_11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_11/PaperweightGetBlocks.java index 038135ca8d..15f6350617 100644 --- a/worldedit-bukkit/adapters/adapter-1_21_11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_11/PaperweightGetBlocks.java +++ b/worldedit-bukkit/adapters/adapter-1_21_11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_11/PaperweightGetBlocks.java @@ -409,6 +409,7 @@ protected > T internalCall( new char[4096], adapter, serverLevel.registryAccess(), + serverLevel.palettedContainerFactory().blockStatesStrategy(), biomeData ); if (PaperweightPlatformAdapter.setSectionAtomic( @@ -484,6 +485,7 @@ protected > T internalCall( setArr, adapter, serverLevel.registryAccess(), + serverLevel.palettedContainerFactory().blockStatesStrategy(), biomeData ); if (PaperweightPlatformAdapter.setSectionAtomic( @@ -548,6 +550,7 @@ protected > T internalCall( setArr, adapter, serverLevel.registryAccess(), + serverLevel.palettedContainerFactory().blockStatesStrategy(), biomeData != null ? biomeData : (PalettedContainer>) existingSection.getBiomes() ); if (!PaperweightPlatformAdapter.setSectionAtomic( diff --git a/worldedit-bukkit/adapters/adapter-1_21_11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_11/PaperweightPlatformAdapter.java b/worldedit-bukkit/adapters/adapter-1_21_11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_11/PaperweightPlatformAdapter.java index 52be60c424..a2c9261d5a 100644 --- a/worldedit-bukkit/adapters/adapter-1_21_11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_11/PaperweightPlatformAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_21_11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_11/PaperweightPlatformAdapter.java @@ -18,7 +18,6 @@ import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.biome.BiomeTypes; -import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockTypesCache; import io.papermc.lib.PaperLib; import net.minecraft.core.BlockPos; @@ -33,13 +32,13 @@ import net.minecraft.server.level.ChunkMap; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.Mth; import net.minecraft.util.ProblemReporter; import net.minecraft.util.ThreadingDetector; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.chunk.LevelChunk; @@ -402,9 +401,10 @@ public static LevelChunkSection newChunkSection( final char[] blocks, CachedBukkitAdapter adapter, RegistryAccess registryAccess, + Strategy strategy, @Nullable PalettedContainer> biomes ) { - return newChunkSection(layer, null, blocks, adapter, registryAccess, biomes); + return newChunkSection(layer, null, blocks, adapter, registryAccess, strategy, biomes); } public static LevelChunkSection newChunkSection( @@ -413,6 +413,7 @@ public static LevelChunkSection newChunkSection( char[] set, CachedBukkitAdapter adapter, RegistryAccess registryAccess, + Strategy strategy, @Nullable PalettedContainer> biomes ) { if (set == null) { @@ -425,47 +426,36 @@ public static LevelChunkSection newChunkSection( try { int num_palette; if (get == null) { - num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter); + num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter, true); } else { - num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter); + num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter, true); } - int bitsPerEntry = MathMan.log2nlz(num_palette - 1); - if (bitsPerEntry > 0 && bitsPerEntry < 5) { - bitsPerEntry = 4; - } else if (bitsPerEntry > 8) { - bitsPerEntry = MathMan.log2nlz(Block.BLOCK_STATE_REGISTRY.size() - 1); - } - - int bitsPerEntryNonZero = Math.max(bitsPerEntry, 1); // We do want to use zero sometimes - final int blockBitArrayEnd = MathMan.longArrayLength(bitsPerEntryNonZero, 4096); - - if (num_palette == 1) { - for (int i = 0; i < blockBitArrayEnd; i++) { - blockStates[i] = 0; - } + boolean singleValue = num_palette == 1; + LongStream bits; + if (singleValue) { + bits = null; } else { - final BitArrayUnstretched bitArray = new BitArrayUnstretched(bitsPerEntryNonZero, 4096, blockStates); + int bitsPerEntry = Mth.ceillog2(num_palette); + if (bitsPerEntry < 4) { + bitsPerEntry = 4; + } + final int blockBitArrayEnd = MathMan.longArrayLength(bitsPerEntry, 4096); + final BitArrayUnstretched bitArray = new BitArrayUnstretched(bitsPerEntry, 4096, blockStates); + bitArray.fromRaw(blocksCopy); + bits = Arrays.stream(blockStates, 0, blockBitArrayEnd); } - final long[] bits = Arrays.copyOfRange(blockStates, 0, blockBitArrayEnd); - List palette; - if (bitsPerEntry < 9) { - palette = new ArrayList<>(); - for (int i = 0; i < num_palette; i++) { - int ordinal = paletteToBlock[i]; - blockToPalette[ordinal] = Integer.MAX_VALUE; - final BlockState state = BlockTypesCache.states[ordinal]; - palette.add(((PaperweightBlockMaterial) state.getMaterial()).getState()); - } - } else { - palette = List.of(); + List palette = new ArrayList<>(); + for (int i = 0; i < num_palette; i++) { + int ordinal = paletteToBlock[i]; + PaperweightBlockMaterial material = (PaperweightBlockMaterial) BlockTypesCache.states[ordinal].getMaterial(); + palette.add(material.getState()); } // Create palette with data - var strategy = Strategy.createForBlockStates(Block.BLOCK_STATE_REGISTRY); - var packedData = new PalettedContainerRO.PackedData<>(palette, Optional.of(LongStream.of(bits)), bitsPerEntry); + var packedData = new PalettedContainerRO.PackedData<>(palette, Optional.ofNullable(bits)); DataResult> result; if (PaperLib.isPaper()) { result = PalettedContainer.unpack(strategy, packedData, Blocks.AIR.defaultBlockState(), null); diff --git a/worldedit-bukkit/adapters/adapter-1_21_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_4/PaperweightPlatformAdapter.java b/worldedit-bukkit/adapters/adapter-1_21_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_4/PaperweightPlatformAdapter.java index fb08d684cb..9dee48ebb7 100644 --- a/worldedit-bukkit/adapters/adapter-1_21_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_4/PaperweightPlatformAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_21_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_4/PaperweightPlatformAdapter.java @@ -401,9 +401,9 @@ public static LevelChunkSection newChunkSection( try { int num_palette; if (get == null) { - num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter); + num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter, false); } else { - num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter); + num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter, false); } int bitsPerEntry = MathMan.log2nlz(num_palette - 1); diff --git a/worldedit-bukkit/adapters/adapter-1_21_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_5/PaperweightPlatformAdapter.java b/worldedit-bukkit/adapters/adapter-1_21_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_5/PaperweightPlatformAdapter.java index 6c4ca83aae..5c09c212d9 100644 --- a/worldedit-bukkit/adapters/adapter-1_21_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_5/PaperweightPlatformAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_21_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_5/PaperweightPlatformAdapter.java @@ -400,9 +400,9 @@ public static LevelChunkSection newChunkSection( try { int num_palette; if (get == null) { - num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter); + num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter, false); } else { - num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter); + num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter, false); } int bitsPerEntry = MathMan.log2nlz(num_palette - 1); diff --git a/worldedit-bukkit/adapters/adapter-1_21_6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_6/PaperweightPlatformAdapter.java b/worldedit-bukkit/adapters/adapter-1_21_6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_6/PaperweightPlatformAdapter.java index d994091088..8f4693c19a 100644 --- a/worldedit-bukkit/adapters/adapter-1_21_6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_6/PaperweightPlatformAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_21_6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_6/PaperweightPlatformAdapter.java @@ -429,9 +429,9 @@ public static LevelChunkSection newChunkSection( try { int num_palette; if (get == null) { - num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter); + num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter, false); } else { - num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter); + num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter, false); } int bitsPerEntry = MathMan.log2nlz(num_palette - 1); diff --git a/worldedit-bukkit/adapters/adapter-1_21_9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_9/PaperweightGetBlocks.java b/worldedit-bukkit/adapters/adapter-1_21_9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_9/PaperweightGetBlocks.java index 5aea2c0363..e9c051477e 100644 --- a/worldedit-bukkit/adapters/adapter-1_21_9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_9/PaperweightGetBlocks.java +++ b/worldedit-bukkit/adapters/adapter-1_21_9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_9/PaperweightGetBlocks.java @@ -413,6 +413,7 @@ protected > T internalCall( new char[4096], adapter, serverLevel.registryAccess(), + serverLevel.palettedContainerFactory().blockStatesStrategy(), biomeData ); if (PaperweightPlatformAdapter.setSectionAtomic( @@ -488,6 +489,7 @@ protected > T internalCall( setArr, adapter, serverLevel.registryAccess(), + serverLevel.palettedContainerFactory().blockStatesStrategy(), biomeData ); if (PaperweightPlatformAdapter.setSectionAtomic( @@ -552,6 +554,7 @@ protected > T internalCall( setArr, adapter, serverLevel.registryAccess(), + serverLevel.palettedContainerFactory().blockStatesStrategy(), biomeData != null ? biomeData : (PalettedContainer>) existingSection.getBiomes() ); if (!PaperweightPlatformAdapter.setSectionAtomic( diff --git a/worldedit-bukkit/adapters/adapter-1_21_9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_9/PaperweightPlatformAdapter.java b/worldedit-bukkit/adapters/adapter-1_21_9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_9/PaperweightPlatformAdapter.java index 5da8b3cec5..3bbe8c7bad 100644 --- a/worldedit-bukkit/adapters/adapter-1_21_9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_9/PaperweightPlatformAdapter.java +++ b/worldedit-bukkit/adapters/adapter-1_21_9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_9/PaperweightPlatformAdapter.java @@ -5,6 +5,7 @@ import com.fastasyncworldedit.bukkit.adapter.CachedBukkitAdapter; import com.fastasyncworldedit.bukkit.adapter.DelegateSemaphore; import com.fastasyncworldedit.bukkit.adapter.NMSAdapter; +import com.fastasyncworldedit.bukkit.util.MinecraftVersion; import com.fastasyncworldedit.core.Fawe; import com.fastasyncworldedit.core.FaweCache; import com.fastasyncworldedit.core.math.BitArrayUnstretched; @@ -34,6 +35,7 @@ import net.minecraft.server.level.ChunkMap; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.Mth; import net.minecraft.util.ProblemReporter; import net.minecraft.util.ThreadingDetector; import net.minecraft.world.entity.Entity; @@ -106,6 +108,7 @@ public final class PaperweightPlatformAdapter extends NMSAdapter { private static final Field fieldRemove; private static final Logger LOGGER = LogManagerCompat.getLogger(); + private static final boolean IS_1_21_10 = MinecraftVersion.getCurrent().getRelease() == 10; private static Field SERVER_LEVEL_ENTITY_MANAGER; @@ -413,9 +416,10 @@ public static LevelChunkSection newChunkSection( final char[] blocks, CachedBukkitAdapter adapter, RegistryAccess registryAccess, + Strategy strategy, @Nullable PalettedContainer> biomes ) { - return newChunkSection(layer, null, blocks, adapter, registryAccess, biomes); + return newChunkSection(layer, null, blocks, adapter, registryAccess, strategy, biomes); } public static LevelChunkSection newChunkSection( @@ -424,11 +428,15 @@ public static LevelChunkSection newChunkSection( char[] set, CachedBukkitAdapter adapter, RegistryAccess registryAccess, + Strategy strategy, @Nullable PalettedContainer> biomes ) { if (set == null) { return newChunkSection(registryAccess, biomes); } + if (IS_1_21_10) { + return newChunkSection1_21_10(layer, get, set, adapter, registryAccess, strategy, biomes); + } final int[] blockToPalette = FaweCache.INSTANCE.BLOCK_TO_PALETTE.get(); final int[] paletteToBlock = FaweCache.INSTANCE.PALETTE_TO_BLOCK.get(); final long[] blockStates = FaweCache.INSTANCE.BLOCK_STATES.get(); @@ -436,9 +444,9 @@ public static LevelChunkSection newChunkSection( try { int num_palette; if (get == null) { - num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter); + num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter, false); } else { - num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter); + num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter, false); } int bitsPerEntry = MathMan.log2nlz(num_palette - 1); @@ -475,7 +483,6 @@ public static LevelChunkSection newChunkSection( } // Create palette with data - var strategy = Strategy.createForBlockStates(Block.BLOCK_STATE_REGISTRY); var packedData = new PalettedContainerRO.PackedData<>(palette, Optional.of(LongStream.of(bits)), bitsPerEntry); DataResult> result; if (PaperLib.isPaper()) { @@ -499,6 +506,74 @@ public static LevelChunkSection newChunkSection( } } + public static LevelChunkSection newChunkSection1_21_10( + final int layer, + final IntFunction get, + char[] set, + CachedBukkitAdapter adapter, + RegistryAccess registryAccess, + Strategy strategy, + @Nullable PalettedContainer> biomes + ) { + final int[] blockToPalette = FaweCache.INSTANCE.BLOCK_TO_PALETTE.get(); + final int[] paletteToBlock = FaweCache.INSTANCE.PALETTE_TO_BLOCK.get(); + final long[] blockStates = FaweCache.INSTANCE.BLOCK_STATES.get(); + final int[] blocksCopy = FaweCache.INSTANCE.SECTION_BLOCKS.get(); + try { + int num_palette; + if (get == null) { + num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter, true); + } else { + num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter, true); + } + + boolean singleValue = num_palette == 1; + LongStream bits; + if (singleValue) { + bits = null; + } else { + int bitsPerEntry = Mth.ceillog2(num_palette); + if (bitsPerEntry < 4) { + bitsPerEntry = 4; + } + final int blockBitArrayEnd = MathMan.longArrayLength(bitsPerEntry, 4096); + final BitArrayUnstretched bitArray = new BitArrayUnstretched(bitsPerEntry, 4096, blockStates); + + bitArray.fromRaw(blocksCopy); + bits = Arrays.stream(blockStates, 0, blockBitArrayEnd); + } + + List palette = new ArrayList<>(); + for (int i = 0; i < num_palette; i++) { + int ordinal = paletteToBlock[i]; + PaperweightBlockMaterial material = (PaperweightBlockMaterial) BlockTypesCache.states[ordinal].getMaterial(); + palette.add(material.getState()); + } + + // Create palette with data + var packedData = new PalettedContainerRO.PackedData<>(palette, Optional.ofNullable(bits)); + DataResult> result; + if (PaperLib.isPaper()) { + result = PalettedContainer.unpack(strategy, packedData, Blocks.AIR.defaultBlockState(), null); + } else { + //noinspection unchecked + result = (DataResult>) + palettedContainerUnpackSpigot.invokeExact(strategy, packedData); + } + if (biomes == null) { + biomes = PalettedContainerFactory.create(registryAccess).createForBiomes(); + } + return new LevelChunkSection(result.getOrThrow(), biomes); + } catch (Throwable e) { + throw new RuntimeException("Failed to create block palette", e); + } finally { + Arrays.fill(blockToPalette, Integer.MAX_VALUE); + Arrays.fill(paletteToBlock, Integer.MAX_VALUE); + Arrays.fill(blockStates, 0); + Arrays.fill(blocksCopy, 0); + } + } + @SuppressWarnings("deprecation") // Only deprecated in paper private static LevelChunkSection newChunkSection( RegistryAccess registryAccess, diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java index 13ff89349f..c13fdde034 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/NMSAdapter.java @@ -20,7 +20,8 @@ public static int createPalette( int[] paletteToBlock, int[] blocksCopy, char[] set, - CachedBukkitAdapter adapter + CachedBukkitAdapter adapter, + final boolean globalKindaDoesNotExist ) { int numPaletteEntries = 0; for (int i = 0; i < 4096; i++) { @@ -33,7 +34,7 @@ public static int createPalette( numPaletteEntries++; } } - mapPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter, numPaletteEntries); + mapPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter, numPaletteEntries, globalKindaDoesNotExist); return numPaletteEntries; } @@ -45,7 +46,8 @@ public static int createPalette( int[] blocksCopy, IntFunction get, char[] set, - CachedBukkitAdapter adapter + CachedBukkitAdapter adapter, + final boolean globalKindaDoesNotExist ) { int numPaletteEntries = 0; char[] getArr = null; @@ -67,7 +69,7 @@ public static int createPalette( numPaletteEntries++; } } - mapPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter, numPaletteEntries); + mapPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter, numPaletteEntries, globalKindaDoesNotExist); return numPaletteEntries; } @@ -78,11 +80,12 @@ private static void mapPalette( int[] blocksCopy, char[] set, CachedBukkitAdapter adapter, - int numPaletteEntries + int numPaletteEntries, + boolean globalKindaDoesNotExist ) { int bitsPerEntry = MathMan.log2nlz(numPaletteEntries - 1); // If bits per entry is over 8, the game uses the global palette. - if (bitsPerEntry > 8 && adapter != null) { + if (!globalKindaDoesNotExist && bitsPerEntry > 8 && adapter != null) { System.arraycopy(adapter.getIbdToOrdinal(), 0, paletteToBlock, 0, adapter.getIbdToOrdinal().length); System.arraycopy(adapter.getOrdinalToIbdID(), 0, blockToPalette, 0, adapter.getOrdinalToIbdID().length); } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/RandomFullClipboardPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/RandomFullClipboardPattern.java index aec705f9ee..de336286db 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/RandomFullClipboardPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/RandomFullClipboardPattern.java @@ -66,7 +66,7 @@ public boolean apply(Extent extent, BlockVector3 get, BlockVector3 set) throws W Clipboard clipboard = holder.getClipboard(); Transform newTransform = holder.getTransform(); if (newTransform.isIdentity()) { - clipboard.paste(extent, set, false); + clipboard.paste(extent, set, false, true, false); } else { newTransform = MutatingOperationTransformHolder.transform(newTransform, true); clipboard.paste(extent, set, false, newTransform);