Fix ChunkSnapshot#isSectionEmpty(int) and optimize PalettedContainer copying by not using codecs

This commit is contained in:
Jason Penilla 2021-12-09 00:08:11 -08:00
parent 71ac6d7e6a
commit 8e42edf892

View File

@ -338,14 +338,17 @@ public class CraftChunk implements Chunk {
PalettedContainerRO<Holder<net.minecraft.world.level.biome.Biome>>[] biome = (includeBiome || includeBiomeTempRain) ? new PalettedContainer[cs.length] : null;
Registry<net.minecraft.world.level.biome.Biome> iregistry = this.worldServer.registryAccess().lookupOrThrow(Registries.BIOME);
Codec<PalettedContainerRO<Holder<net.minecraft.world.level.biome.Biome>>> biomeCodec = PalettedContainer.codecRO(iregistry.asHolderIdMap(), iregistry.holderByNameCodec(), PalettedContainer.Strategy.SECTION_BIOMES, iregistry.getOrThrow(Biomes.PLAINS));
for (int i = 0; i < cs.length; i++) {
CompoundTag data = new CompoundTag();
data.put("block_states", SerializableChunkData.BLOCK_STATE_CODEC.encodeStart(NbtOps.INSTANCE, cs[i].getStates()).getOrThrow());
sectionBlockIDs[i] = SerializableChunkData.BLOCK_STATE_CODEC.parse(NbtOps.INSTANCE, data.getCompound("block_states")).getOrThrow(SerializableChunkData.ChunkReadException::new);
sectionEmpty[i] = cs[i].hasOnlyAir();
// Paper start - Fix ChunkSnapshot#isSectionEmpty(int); and remove codec usage
sectionEmpty[i] = cs[i].hasOnlyAir(); // fix sectionEmpty array not being filled
if (!sectionEmpty[i]) {
sectionBlockIDs[i] = cs[i].getStates().copy(); // use copy instead of round tripping with codecs
} else {
sectionBlockIDs[i] = CraftChunk.emptyBlockIDs; // use cached instance for empty block sections
}
// Paper end - Fix ChunkSnapshot#isSectionEmpty(int)
LevelLightEngine lightengine = this.worldServer.getLightEngine();
DataLayer skyLightArray = lightengine.getLayerListener(LightLayer.SKY).getDataLayerData(SectionPos.of(this.x, chunk.getSectionYFromSectionIndex(i), this.z)); // SPIGOT-7498: Convert section index
@ -364,8 +367,7 @@ public class CraftChunk implements Chunk {
}
if (biome != null) {
data.put("biomes", biomeCodec.encodeStart(NbtOps.INSTANCE, cs[i].getBiomes()).getOrThrow());
biome[i] = biomeCodec.parse(NbtOps.INSTANCE, data.getCompound("biomes")).getOrThrow(SerializableChunkData.ChunkReadException::new);
biome[i] = ((PalettedContainer<Holder<net.minecraft.world.level.biome.Biome>>) cs[i].getBiomes()).copy(); // Paper - Perf: use copy instead of round tripping with codecs
}
}