Skip to content

Commit ddb8a25

Browse files
authored
fix: global palette is not really any more (#3448)
* fix: global palette is not really any more - supersedes #3431 * fix for not "global" palette * simplify * Use bounded Arrays#stream
1 parent 80312c7 commit ddb8a25

File tree

12 files changed

+132
-58
lines changed

12 files changed

+132
-58
lines changed

worldedit-bukkit/adapters/adapter-1_20_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R2/PaperweightPlatformAdapter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -431,9 +431,9 @@ public static LevelChunkSection newChunkSection(
431431
try {
432432
int num_palette;
433433
if (get == null) {
434-
num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter);
434+
num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter, false);
435435
} else {
436-
num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter);
436+
num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter, false);
437437
}
438438

439439
int bitsPerEntry = MathMan.log2nlz(num_palette - 1);

worldedit-bukkit/adapters/adapter-1_20_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R3/PaperweightPlatformAdapter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -431,9 +431,9 @@ public static LevelChunkSection newChunkSection(
431431
try {
432432
int num_palette;
433433
if (get == null) {
434-
num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter);
434+
num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter, false);
435435
} else {
436-
num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter);
436+
num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter, false);
437437
}
438438

439439
int bitsPerEntry = MathMan.log2nlz(num_palette - 1);

worldedit-bukkit/adapters/adapter-1_20_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R4/PaperweightPlatformAdapter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -425,9 +425,9 @@ public static LevelChunkSection newChunkSection(
425425
try {
426426
int num_palette;
427427
if (get == null) {
428-
num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter);
428+
num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter, false);
429429
} else {
430-
num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter);
430+
num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter, false);
431431
}
432432

433433
int bitsPerEntry = MathMan.log2nlz(num_palette - 1);

worldedit-bukkit/adapters/adapter-1_21/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_R1/PaperweightPlatformAdapter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -415,9 +415,9 @@ public static LevelChunkSection newChunkSection(
415415
try {
416416
int num_palette;
417417
if (get == null) {
418-
num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter);
418+
num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter, false);
419419
} else {
420-
num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter);
420+
num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter, false);
421421
}
422422

423423
int bitsPerEntry = MathMan.log2nlz(num_palette - 1);

worldedit-bukkit/adapters/adapter-1_21_11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_11/PaperweightGetBlocks.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,7 @@ protected <T extends Future<T>> T internalCall(
409409
new char[4096],
410410
adapter,
411411
serverLevel.registryAccess(),
412+
serverLevel.palettedContainerFactory().blockStatesStrategy(),
412413
biomeData
413414
);
414415
if (PaperweightPlatformAdapter.setSectionAtomic(
@@ -484,6 +485,7 @@ protected <T extends Future<T>> T internalCall(
484485
setArr,
485486
adapter,
486487
serverLevel.registryAccess(),
488+
serverLevel.palettedContainerFactory().blockStatesStrategy(),
487489
biomeData
488490
);
489491
if (PaperweightPlatformAdapter.setSectionAtomic(
@@ -548,6 +550,7 @@ protected <T extends Future<T>> T internalCall(
548550
setArr,
549551
adapter,
550552
serverLevel.registryAccess(),
553+
serverLevel.palettedContainerFactory().blockStatesStrategy(),
551554
biomeData != null ? biomeData : (PalettedContainer<Holder<Biome>>) existingSection.getBiomes()
552555
);
553556
if (!PaperweightPlatformAdapter.setSectionAtomic(

worldedit-bukkit/adapters/adapter-1_21_11/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_11/PaperweightPlatformAdapter.java

Lines changed: 24 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import com.sk89q.worldedit.internal.util.LogManagerCompat;
1919
import com.sk89q.worldedit.world.biome.BiomeType;
2020
import com.sk89q.worldedit.world.biome.BiomeTypes;
21-
import com.sk89q.worldedit.world.block.BlockState;
2221
import com.sk89q.worldedit.world.block.BlockTypesCache;
2322
import io.papermc.lib.PaperLib;
2423
import net.minecraft.core.BlockPos;
@@ -33,13 +32,13 @@
3332
import net.minecraft.server.level.ChunkMap;
3433
import net.minecraft.server.level.ServerLevel;
3534
import net.minecraft.server.level.ServerPlayer;
35+
import net.minecraft.util.Mth;
3636
import net.minecraft.util.ProblemReporter;
3737
import net.minecraft.util.ThreadingDetector;
3838
import net.minecraft.world.entity.Entity;
3939
import net.minecraft.world.level.ChunkPos;
4040
import net.minecraft.world.level.LevelAccessor;
4141
import net.minecraft.world.level.biome.Biome;
42-
import net.minecraft.world.level.block.Block;
4342
import net.minecraft.world.level.block.Blocks;
4443
import net.minecraft.world.level.block.entity.BlockEntity;
4544
import net.minecraft.world.level.chunk.LevelChunk;
@@ -402,9 +401,10 @@ public static LevelChunkSection newChunkSection(
402401
final char[] blocks,
403402
CachedBukkitAdapter adapter,
404403
RegistryAccess registryAccess,
404+
Strategy<net.minecraft.world.level.block.state.BlockState> strategy,
405405
@Nullable PalettedContainer<Holder<Biome>> biomes
406406
) {
407-
return newChunkSection(layer, null, blocks, adapter, registryAccess, biomes);
407+
return newChunkSection(layer, null, blocks, adapter, registryAccess, strategy, biomes);
408408
}
409409

410410
public static LevelChunkSection newChunkSection(
@@ -413,6 +413,7 @@ public static LevelChunkSection newChunkSection(
413413
char[] set,
414414
CachedBukkitAdapter adapter,
415415
RegistryAccess registryAccess,
416+
Strategy<net.minecraft.world.level.block.state.BlockState> strategy,
416417
@Nullable PalettedContainer<Holder<Biome>> biomes
417418
) {
418419
if (set == null) {
@@ -425,47 +426,36 @@ public static LevelChunkSection newChunkSection(
425426
try {
426427
int num_palette;
427428
if (get == null) {
428-
num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter);
429+
num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter, true);
429430
} else {
430-
num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter);
431+
num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter, true);
431432
}
432433

433-
int bitsPerEntry = MathMan.log2nlz(num_palette - 1);
434-
if (bitsPerEntry > 0 && bitsPerEntry < 5) {
435-
bitsPerEntry = 4;
436-
} else if (bitsPerEntry > 8) {
437-
bitsPerEntry = MathMan.log2nlz(Block.BLOCK_STATE_REGISTRY.size() - 1);
438-
}
439-
440-
int bitsPerEntryNonZero = Math.max(bitsPerEntry, 1); // We do want to use zero sometimes
441-
final int blockBitArrayEnd = MathMan.longArrayLength(bitsPerEntryNonZero, 4096);
442-
443-
if (num_palette == 1) {
444-
for (int i = 0; i < blockBitArrayEnd; i++) {
445-
blockStates[i] = 0;
446-
}
434+
boolean singleValue = num_palette == 1;
435+
LongStream bits;
436+
if (singleValue) {
437+
bits = null;
447438
} else {
448-
final BitArrayUnstretched bitArray = new BitArrayUnstretched(bitsPerEntryNonZero, 4096, blockStates);
439+
int bitsPerEntry = Mth.ceillog2(num_palette);
440+
if (bitsPerEntry < 4) {
441+
bitsPerEntry = 4;
442+
}
443+
final int blockBitArrayEnd = MathMan.longArrayLength(bitsPerEntry, 4096);
444+
final BitArrayUnstretched bitArray = new BitArrayUnstretched(bitsPerEntry, 4096, blockStates);
445+
449446
bitArray.fromRaw(blocksCopy);
447+
bits = Arrays.stream(blockStates, 0, blockBitArrayEnd);
450448
}
451449

452-
final long[] bits = Arrays.copyOfRange(blockStates, 0, blockBitArrayEnd);
453-
List<net.minecraft.world.level.block.state.BlockState> palette;
454-
if (bitsPerEntry < 9) {
455-
palette = new ArrayList<>();
456-
for (int i = 0; i < num_palette; i++) {
457-
int ordinal = paletteToBlock[i];
458-
blockToPalette[ordinal] = Integer.MAX_VALUE;
459-
final BlockState state = BlockTypesCache.states[ordinal];
460-
palette.add(((PaperweightBlockMaterial) state.getMaterial()).getState());
461-
}
462-
} else {
463-
palette = List.of();
450+
List<net.minecraft.world.level.block.state.BlockState> palette = new ArrayList<>();
451+
for (int i = 0; i < num_palette; i++) {
452+
int ordinal = paletteToBlock[i];
453+
PaperweightBlockMaterial material = (PaperweightBlockMaterial) BlockTypesCache.states[ordinal].getMaterial();
454+
palette.add(material.getState());
464455
}
465456

466457
// Create palette with data
467-
var strategy = Strategy.createForBlockStates(Block.BLOCK_STATE_REGISTRY);
468-
var packedData = new PalettedContainerRO.PackedData<>(palette, Optional.of(LongStream.of(bits)), bitsPerEntry);
458+
var packedData = new PalettedContainerRO.PackedData<>(palette, Optional.ofNullable(bits));
469459
DataResult<PalettedContainer<net.minecraft.world.level.block.state.BlockState>> result;
470460
if (PaperLib.isPaper()) {
471461
result = PalettedContainer.unpack(strategy, packedData, Blocks.AIR.defaultBlockState(), null);

worldedit-bukkit/adapters/adapter-1_21_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_4/PaperweightPlatformAdapter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -401,9 +401,9 @@ public static LevelChunkSection newChunkSection(
401401
try {
402402
int num_palette;
403403
if (get == null) {
404-
num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter);
404+
num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter, false);
405405
} else {
406-
num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter);
406+
num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter, false);
407407
}
408408

409409
int bitsPerEntry = MathMan.log2nlz(num_palette - 1);

worldedit-bukkit/adapters/adapter-1_21_5/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_5/PaperweightPlatformAdapter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -400,9 +400,9 @@ public static LevelChunkSection newChunkSection(
400400
try {
401401
int num_palette;
402402
if (get == null) {
403-
num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter);
403+
num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter, false);
404404
} else {
405-
num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter);
405+
num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter, false);
406406
}
407407

408408
int bitsPerEntry = MathMan.log2nlz(num_palette - 1);

worldedit-bukkit/adapters/adapter-1_21_6/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_6/PaperweightPlatformAdapter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -429,9 +429,9 @@ public static LevelChunkSection newChunkSection(
429429
try {
430430
int num_palette;
431431
if (get == null) {
432-
num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter);
432+
num_palette = createPalette(blockToPalette, paletteToBlock, blocksCopy, set, adapter, false);
433433
} else {
434-
num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter);
434+
num_palette = createPalette(layer, blockToPalette, paletteToBlock, blocksCopy, get, set, adapter, false);
435435
}
436436

437437
int bitsPerEntry = MathMan.log2nlz(num_palette - 1);

worldedit-bukkit/adapters/adapter-1_21_9/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_21_9/PaperweightGetBlocks.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,7 @@ protected <T extends Future<T>> T internalCall(
413413
new char[4096],
414414
adapter,
415415
serverLevel.registryAccess(),
416+
serverLevel.palettedContainerFactory().blockStatesStrategy(),
416417
biomeData
417418
);
418419
if (PaperweightPlatformAdapter.setSectionAtomic(
@@ -488,6 +489,7 @@ protected <T extends Future<T>> T internalCall(
488489
setArr,
489490
adapter,
490491
serverLevel.registryAccess(),
492+
serverLevel.palettedContainerFactory().blockStatesStrategy(),
491493
biomeData
492494
);
493495
if (PaperweightPlatformAdapter.setSectionAtomic(
@@ -552,6 +554,7 @@ protected <T extends Future<T>> T internalCall(
552554
setArr,
553555
adapter,
554556
serverLevel.registryAccess(),
557+
serverLevel.palettedContainerFactory().blockStatesStrategy(),
555558
biomeData != null ? biomeData : (PalettedContainer<Holder<Biome>>) existingSection.getBiomes()
556559
);
557560
if (!PaperweightPlatformAdapter.setSectionAtomic(

0 commit comments

Comments
 (0)