Skip to content

Commit

Permalink
Fixed calculation of blocks in unloaded chunks in 1.19
Browse files Browse the repository at this point in the history
  • Loading branch information
OmerBenGera committed Jul 9, 2022
1 parent f326372 commit 9f30588
Showing 1 changed file with 22 additions and 7 deletions.
@@ -1,5 +1,6 @@
package com.bgsoftware.superiorskyblock.nms.v1_19_R1;

import com.bgsoftware.common.reflection.ReflectMethod;
import com.bgsoftware.superiorskyblock.SuperiorSkyblockPlugin;
import com.bgsoftware.superiorskyblock.api.island.Island;
import com.bgsoftware.superiorskyblock.api.key.Key;
Expand Down Expand Up @@ -53,6 +54,7 @@
import net.minecraft.world.level.chunk.DataPaletteBlock;
import net.minecraft.world.level.chunk.NibbleArray;
import net.minecraft.world.level.chunk.PalettedContainerRO;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Biome;
Expand All @@ -77,6 +79,9 @@
@SuppressWarnings({"ConstantConditions", "deprecation"})
public final class NMSChunksImpl implements NMSChunks {

private static final ReflectMethod<Codec<DataPaletteBlock<?>>> CODE_RW_METHOD = new ReflectMethod<>(
DataPaletteBlock.class, "a", Registry.class, Codec.class, DataPaletteBlock.d.class, Object.class);

private final SuperiorSkyblockPlugin plugin;

public NMSChunksImpl(SuperiorSkyblockPlugin plugin) {
Expand Down Expand Up @@ -262,9 +267,9 @@ public CompletableFuture<List<CalculatedChunk>> calculateChunks(List<ChunkPositi
IRegistry<BiomeBase> biomesRegistry = worldServer.getBiomeRegistry();
Registry<Holder<BiomeBase>> biomesRegistryHolder = worldServer.getBiomeRegistryHolder();

Codec<PalettedContainerRO<IBlockData>> blocksCodec = DataPaletteBlock.b(Block.CODEC, IBlockData.b,
Codec<DataPaletteBlock<IBlockData>> blocksCodec = makeCodecRW(Block.CODEC, IBlockData.b,
DataPaletteBlock.d.d, Blocks.a.m());
Codec<PalettedContainerRO<Holder<BiomeBase>>> biomesCodec = DataPaletteBlock.b(biomesRegistryHolder,
Codec<DataPaletteBlock<Holder<BiomeBase>>> biomesCodec = makeCodecRW(biomesRegistryHolder,
biomesRegistry.q(), DataPaletteBlock.d.e, biomesRegistry.h(Biomes.b));

net.minecraft.world.level.chunk.ChunkSection[] chunkSections =
Expand All @@ -277,9 +282,9 @@ public CompletableFuture<List<CalculatedChunk>> calculateChunks(List<ChunkPositi
int sectionIndex = worldServer.getSectionIndexFromSectionY(yPosition);

if (sectionIndex >= 0 && sectionIndex < chunkSections.length) {
PalettedContainerRO<IBlockData> blocksDataPalette;
DataPaletteBlock<IBlockData> blocksDataPalette;
if (sectionCompound.hasKeyOfType("block_states", 10)) {
DataResult<PalettedContainerRO<IBlockData>> dataResult = blocksCodec.parse(DynamicOpsNBT.a,
DataResult<DataPaletteBlock<IBlockData>> dataResult = blocksCodec.parse(DynamicOpsNBT.a,
sectionCompound.getCompound("block_states").getHandle()).promotePartial((sx) -> {
});
blocksDataPalette = dataResult.getOrThrow(false, error -> {
Expand All @@ -288,9 +293,9 @@ public CompletableFuture<List<CalculatedChunk>> calculateChunks(List<ChunkPositi
blocksDataPalette = new DataPaletteBlock<>(Block.CODEC, Blocks.a.m(), DataPaletteBlock.d.d);
}

PalettedContainerRO<Holder<BiomeBase>> biomesDataPalette;
DataPaletteBlock<Holder<BiomeBase>> biomesDataPalette;
if (sectionCompound.hasKeyOfType("biomes", 10)) {
DataResult<PalettedContainerRO<Holder<BiomeBase>>> dataResult = biomesCodec.parse(DynamicOpsNBT.a,
DataResult<DataPaletteBlock<Holder<BiomeBase>>> dataResult = biomesCodec.parse(DynamicOpsNBT.a,
sectionCompound.getCompound("biomes").getHandle()).promotePartial((sx) -> {
});
biomesDataPalette = dataResult.getOrThrow(false, error -> {
Expand All @@ -301,7 +306,7 @@ public CompletableFuture<List<CalculatedChunk>> calculateChunks(List<ChunkPositi
}

chunkSections[sectionIndex] = new net.minecraft.world.level.chunk.ChunkSection(
yPosition, blocksDataPalette.e(), biomesDataPalette.e());
yPosition, blocksDataPalette, biomesDataPalette);
}

}
Expand Down Expand Up @@ -424,6 +429,8 @@ private static CalculatedChunk calculateChunk(ChunkPosition chunkPosition,
}
}

Bukkit.broadcastMessage(chunkPosition + ": " + blockCounts);

return new CalculatedChunk(chunkPosition, blockCounts, spawnersLocations);
}

Expand Down Expand Up @@ -470,4 +477,12 @@ private static void removeBlocks(ChunkAccess chunk) {
}
}

private static <E> Codec makeCodecRW(Registry<E> idMap, Codec<E> codec, DataPaletteBlock.d strategy, E object) {
if (CODE_RW_METHOD.isValid()) {
return CODE_RW_METHOD.invoke(null, idMap, codec, strategy, object);
} else {
return DataPaletteBlock.codecRW(idMap, codec, strategy, object, null);
}
}

}

0 comments on commit 9f30588

Please sign in to comment.