diff --git a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/mimicObject/ChunkLoader.java b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/mimicObject/ChunkLoader.java index ff9216f3e..3165d16a5 100644 --- a/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/mimicObject/ChunkLoader.java +++ b/common/src/main/java/com/seibel/lod/common/wrappers/worldGeneration/mimicObject/ChunkLoader.java @@ -35,6 +35,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.*; +import net.minecraft.world.level.chunk.storage.ChunkSerializer; import net.minecraft.world.level.levelgen.Heightmap; #if MC_VERSION_1_18_2 || MC_VERSION_1_18_1 import net.minecraft.world.level.levelgen.blending.BlendingData; @@ -52,10 +53,12 @@ public class ChunkLoader { #if MC_VERSION_1_18_2 || MC_VERSION_1_18_1 private static final Codec> BLOCK_STATE_CODEC = PalettedContainer.codec(Block.BLOCK_STATE_REGISTRY, BlockState.CODEC, PalettedContainer.Strategy.SECTION_STATES, Blocks.AIR.defaultBlockState()); - private static final String TAG_UPGRADE_DATA = "UpgradeData"; - private static final String BLOCK_TICKS_TAG = "block_ticks"; - private static final String FLUID_TICKS_TAG = "fluid_ticks"; #endif + private static final String TAG_UPGRADE_DATA = "UpgradeData"; + private static final String BLOCK_TICKS_TAG_18 = "block_ticks"; + private static final String FLUID_TICKS_TAG_18 = "fluid_ticks"; + private static final String BLOCK_TICKS_TAG_PRE18 = "TileTicks"; + private static final String FLUID_TICKS_TAG_PRE18 = "LiquidTicks"; private static final ConfigBasedLogger LOGGER = BatchGenerationEnvironment.LOAD_LOGGER; #if MC_VERSION_1_18_2 || MC_VERSION_1_18_1 @@ -76,15 +79,14 @@ public class ChunkLoader { #if MC_VERSION_1_18_2 || MC_VERSION_1_18_1 Registry biomes = level.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY); + #if MC_VERSION_1_18_1 + Codec> biomeCodec = PalettedContainer.codec( + biomes, biomes.byNameCodec(), PalettedContainer.Strategy.SECTION_BIOMES, biomes.getOrThrow(Biomes.PLAINS)); + #elif MC_VERSION_1_18_2 + Codec>> biomeCodec = PalettedContainer.codec( + biomes.asHolderIdMap(), biomes.holderByNameCodec(), PalettedContainer.Strategy.SECTION_BIOMES, biomes.getHolderOrThrow(Biomes.PLAINS)); + #endif #endif - #if MC_VERSION_1_18_1 - Codec> biomeCodec = PalettedContainer.codec( - biomes, biomes.byNameCodec(), PalettedContainer.Strategy.SECTION_BIOMES, biomes.getOrThrow(Biomes.PLAINS)); - #elif MC_VERSION_1_18_2 - Codec>> biomeCodec = PalettedContainer.codec( - biomes.asHolderIdMap(), biomes.holderByNameCodec(), PalettedContainer.Strategy.SECTION_BIOMES, biomes.getHolderOrThrow(Biomes.PLAINS)); - #endif - int i = level.getSectionsCount(); LevelChunkSection[] chunkSections = new LevelChunkSection[i]; @@ -92,11 +94,6 @@ public class ChunkLoader boolean hasSkyLight = level.dimensionType().hasSkyLight(); ListTag tagSections = chunkData.getList("sections", 10); - #if MC_VERSION_1_17_1 - boolean bl2 = level.dimensionType().hasSkyLight(); - if (isLightOn) - lightEngine.retainData(chunkPos, true); - #endif for (int j = 0; j < tagSections.size(); ++j) { CompoundTag tagSection = tagSections.getCompound(j); @@ -126,18 +123,8 @@ public class ChunkLoader ? biomeCodec.parse(NbtOps.INSTANCE, tagSection.getCompound("biomes")).promotePartial(string -> logErrors(chunkPos, i, (String) string)).getOrThrow(false, LOGGER::error) : new PalettedContainer>(biomes.asHolderIdMap(), biomes.getHolderOrThrow(Biomes.PLAINS), PalettedContainer.Strategy.SECTION_BIOMES); #endif - - chunkSections[sectionId] = new LevelChunkSection(sectionYPos, blockStateContainer, biomeContainer); } - - if (!isLightOn) - continue; - - if (tagSection.contains("BlockLight", 7)) - lightEngine.queueSectionData(LightLayer.BLOCK, SectionPos.of(chunkPos, sectionYPos), new DataLayer(tagSection.getByteArray("BlockLight")), true); - if (hasSkyLight && tagSection.contains("SkyLight", 7)) - lightEngine.queueSectionData(LightLayer.SKY, SectionPos.of(chunkPos, sectionYPos), new DataLayer(tagSection.getByteArray("SkyLight")), true); #elif MC_VERSION_1_17_1 if (tagSection.contains("Palette", 9) && tagSection.contains("BlockStates", 12)) { LevelChunkSection levelChunkSection = new LevelChunkSection(sectionYPos << 4); @@ -147,15 +134,14 @@ public class ChunkLoader if (!levelChunkSection.isEmpty()) chunkSections[level.getSectionIndexFromSectionY(sectionYPos)] = levelChunkSection; } - if (isLightOn) { - if (tagSection.contains("BlockLight", 7)) - lightEngine.queueSectionData(LightLayer.BLOCK, SectionPos.of(chunkPos, sectionYPos), - new DataLayer(tagSection.getByteArray("BlockLight")), true); - if (bl2 && tagSection.contains("SkyLight", 7)) - lightEngine.queueSectionData(LightLayer.SKY, SectionPos.of(chunkPos, sectionYPos), - new DataLayer(tagSection.getByteArray("SkyLight")), true); - } #endif + if (!isLightOn) continue; + if (tagSection.contains("BlockLight", 7)) + lightEngine.queueSectionData(LightLayer.BLOCK, SectionPos.of(chunkPos, sectionYPos), + new DataLayer(tagSection.getByteArray("BlockLight")), true); + if (hasSkyLight && tagSection.contains("SkyLight", 7)) + lightEngine.queueSectionData(LightLayer.SKY, SectionPos.of(chunkPos, sectionYPos), + new DataLayer(tagSection.getByteArray("SkyLight")), true); } return chunkSections; } @@ -172,6 +158,8 @@ public class ChunkLoader Heightmap.primeHeightmaps(chunk, ChunkStatus.FULL.heightmapsAfter()); } + // Structures reading is disabled since... I don't think its actually useful??? + /* #if MC_VERSION_1_18_1 private static Map, StructureStart> unpackStructureStart(StructurePieceSerializationContext structurePieceSerializationContext, CompoundTag compoundTag, long l) { @@ -281,7 +269,7 @@ public class ChunkLoader unpackStructureStart(StructurePieceSerializationContext.fromLevel(level.getLevel()), tagStructures, level.getSeed())); chunk.setAllReferences(unpackStructureReferences(#if MC_VERSION_1_18_2 level.registryAccess() ,#endif chunk.getPos(), tagStructures)); } - #endif + #endif*/ private static void readPostPocessings(LevelChunk chunk, CompoundTag chunkData) { @@ -296,98 +284,89 @@ public class ChunkLoader } } - public static ChunkStatus.ChunkType readChunkType(CompoundTag compoundTag) + public static ChunkStatus.ChunkType readChunkType(CompoundTag tagLevel) { - return ChunkStatus.byName(compoundTag.getString("Status")).getChunkType(); - - // TODO Check if we should use the lines underneath to return or use the thing above -// ChunkStatus chunkStatus = ChunkStatus.byName(tagLevel.getString("Status")); -// if (chunkStatus != null) { -// return chunkStatus.getChunkType(); -// } -// return ChunkStatus.ChunkType.PROTOCHUNK; + ChunkStatus chunkStatus = ChunkStatus.byName(tagLevel.getString("Status")); + if (chunkStatus != null) { + return chunkStatus.getChunkType(); + } + return ChunkStatus.ChunkType.PROTOCHUNK; } public static LevelChunk read(WorldGenLevel level, LevelLightEngine lightEngine, ChunkPos chunkPos, CompoundTag chunkData) { #if MC_VERSION_1_17_1 CompoundTag tagLevel = chunkData.getCompound("Level"); + #else + CompoundTag tagLevel = chunkData; + #endif + + ChunkPos actualPos = new ChunkPos(tagLevel.getInt("xPos"), tagLevel.getInt("zPos")); + if (!Objects.equals(chunkPos, actualPos)) { + LOGGER.error("Chunk file at {} is in the wrong location; Ignoring. (Expected {}, got {})", chunkPos, chunkPos, actualPos); + return null; + } ChunkStatus.ChunkType chunkType = readChunkType(tagLevel); + #if MC_VERSION_1_18_1 || MC_VERSION_1_18_2 + BlendingData blendingData = readBlendingData(tagLevel); + if (chunkType == ChunkStatus.ChunkType.PROTOCHUNK && (blendingData == null || !blendingData.oldNoise())) + return null; + #else if (chunkType != ChunkStatus.ChunkType.LEVELCHUNK) return null; #endif - ChunkPos actualPos = new ChunkPos(chunkData.getInt("xPos"), chunkData.getInt("zPos")); - if (!Objects.equals(chunkPos, actualPos)) - { - LOGGER.error("Chunk file at {} is in the wrong location; Ignoring. (Expected {}, got {})", (Object) chunkPos, (Object) chunkPos, (Object) actualPos); - return null; - } + long inhabitedTime = tagLevel.getLong("InhabitedTime"); - #if MC_VERSION_1_18_1 || MC_VERSION_1_18_2 - ChunkStatus.ChunkType chunkType = readChunkType(chunkData); - BlendingData blendingData = readBlendingData(chunkData); - if (chunkType == ChunkStatus.ChunkType.PROTOCHUNK && (blendingData == null || !blendingData.oldNoise())) - return null; - - // Prepare the light engine - boolean isLightOn = chunkData.getBoolean("isLightOn"); - if (isLightOn) - level.getLightEngine().retainData(chunkPos, true); - - // Read params for making the LevelChunk - UpgradeData upgradeData = chunkData.contains(TAG_UPGRADE_DATA, 10) - ? new UpgradeData(chunkData.getCompound(TAG_UPGRADE_DATA), level) + //================== Read params for making the LevelChunk ================== + UpgradeData upgradeData = tagLevel.contains(TAG_UPGRADE_DATA, 10) + ? new UpgradeData(tagLevel.getCompound(TAG_UPGRADE_DATA), level) : UpgradeData.EMPTY; - LevelChunkTicks blockTicks = LevelChunkTicks.load(chunkData.getList(BLOCK_TICKS_TAG, 10), + + boolean isLightOn = tagLevel.getBoolean("isLightOn"); + if (isLightOn) lightEngine.retainData(chunkPos, true); + #if MC_VERSION_1_18_1 || MC_VERSION_1_18_2 + + LevelChunkTicks blockTicks = LevelChunkTicks.load(tagLevel.getList(BLOCK_TICKS_TAG_18, 10), string -> Registry.BLOCK.getOptional(ResourceLocation.tryParse(string)), chunkPos); - LevelChunkTicks fluidTicks = LevelChunkTicks.load(chunkData.getList(FLUID_TICKS_TAG, 10), + LevelChunkTicks fluidTicks = LevelChunkTicks.load(tagLevel.getList(FLUID_TICKS_TAG_18, 10), string -> Registry.FLUID.getOptional(ResourceLocation.tryParse(string)), chunkPos); - long inhabitedTime = chunkData.getLong("InhabitedTime"); - LevelChunkSection[] chunkSections = readSections(level, lightEngine, actualPos, chunkData); - - // Make chunk - LevelChunk chunk = new LevelChunk((Level) level, chunkPos, upgradeData, blockTicks, fluidTicks, inhabitedTime, chunkSections, null, blendingData); + #elif MC_VERSION_1_17_1 - // ====================== Read params for making the LevelChunk - // ============================ ChunkBiomeContainer chunkBiomeContainer = new ChunkBiomeContainer( level.getLevel().registryAccess().registryOrThrow(Registry.BIOME_REGISTRY), level, chunkPos, level.getLevel().getChunkSource().getGenerator().getBiomeSource(), tagLevel.contains("Biomes", 11) ? tagLevel.getIntArray("Biomes") : null); - UpgradeData upgradeData = tagLevel.contains("UpgradeData", 10) - ? new UpgradeData(tagLevel.getCompound("UpgradeData"), level) - : UpgradeData.EMPTY; - - TickList blockTicks = tagLevel.contains("TileTicks", 9) - ? ChunkTickList.create(tagLevel.getList("TileTicks", 10), Registry.BLOCK::getKey, Registry.BLOCK::get) + TickList blockTicks = tagLevel.contains(BLOCK_TICKS_TAG_PRE18, 9) + ? ChunkTickList.create(tagLevel.getList(BLOCK_TICKS_TAG_PRE18, 10), Registry.BLOCK::getKey, Registry.BLOCK::get) : new ProtoTickList(block -> (block == null || block.defaultBlockState().isAir()), chunkPos, tagLevel.getList("ToBeTicked", 9), level); - TickList liquidTicks = tagLevel.contains("LiquidTicks", 9) - ? ChunkTickList.create(tagLevel.getList("LiquidTicks", 10), Registry.FLUID::getKey, Registry.FLUID::get) + TickList fluidTicks = tagLevel.contains(FLUID_TICKS_TAG_PRE18, 9) + ? ChunkTickList.create(tagLevel.getList(FLUID_TICKS_TAG_PRE18, 10), Registry.FLUID::getKey, Registry.FLUID::get) : new ProtoTickList(fluid -> (fluid == null || fluid == Fluids.EMPTY), chunkPos, tagLevel.getList("LiquidsToBeTicked", 9), level); - - long inhabitedTime = tagLevel.getLong("InhabitedTime"); + #endif LevelChunkSection[] levelChunkSections = readSections(level, lightEngine, chunkPos, tagLevel); // ======================== Make the chunk // =========================================== - LevelChunk chunk = new LevelChunk(level.getLevel(), chunkPos, chunkBiomeContainer, upgradeData, blockTicks, - liquidTicks, inhabitedTime, levelChunkSections, null); + #if MC_VERSION_1_18_1 || MC_VERSION_1_18_2 + LevelChunk chunk = new LevelChunk((Level) level, chunkPos, upgradeData, blockTicks, + fluidTicks, inhabitedTime, levelChunkSections, null, blendingData); + #else + LevelChunk chunk = new LevelChunk((Level) level, chunkPos, chunkBiomeContainer, upgradeData, blockTicks, + fluidTicks, inhabitedTime, levelChunkSections, null); #endif // Set some states after object creation - #if MC_VERSION_1_18_1 || MC_VERSION_1_18_2 - readStructures(level, chunk, chunkData); + //#if MC_VERSION_1_18_1 || MC_VERSION_1_18_2 + //readStructures(level, chunk, chunkData); + //#endif chunk.setLightCorrect(isLightOn); - #elif MC_VERSION_1_17_1 - chunk.setLightCorrect(tagLevel.getBoolean("isLightOn")); - #endif readHeightmaps(chunk, chunkData); readPostPocessings(chunk, chunkData); return chunk;