Create sections for chunk conversion if non-existant
Required to add in the new biome sections
This commit is contained in:
parent
358ceb80a5
commit
8c189d0faf
|
@ -15313,10 +15313,10 @@ index 0000000000000000000000000000000000000000..d28ade80499dce882a9a84309a2a0da5
|
||||||
+}
|
+}
|
||||||
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2832.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2832.java
|
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2832.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2832.java
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000000000000000000000000000000000000..6a975a5e69f4aad4b65aaf1300b5136d72ea6499
|
index 0000000000000000000000000000000000000000..b1049823fc2ff1c8183f4664ff4d40da6495f9ee
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2832.java
|
+++ b/src/main/java/ca/spottedleaf/dataconverter/minecraft/versions/V2832.java
|
||||||
@@ -0,0 +1,919 @@
|
@@ -0,0 +1,920 @@
|
||||||
+package ca.spottedleaf.dataconverter.minecraft.versions;
|
+package ca.spottedleaf.dataconverter.minecraft.versions;
|
||||||
+
|
+
|
||||||
+import ca.spottedleaf.dataconverter.converters.DataConverter;
|
+import ca.spottedleaf.dataconverter.converters.DataConverter;
|
||||||
|
@ -15710,73 +15710,74 @@ index 0000000000000000000000000000000000000000..6a975a5e69f4aad4b65aaf1300b5136d
|
||||||
+ final MapType<String>[] newBiomes = createBiomeSections(level, isOverworld, minSection, isAlreadyExtended);
|
+ final MapType<String>[] newBiomes = createBiomeSections(level, isOverworld, minSection, isAlreadyExtended);
|
||||||
+ final MapType<String> wrappedEmptyBlockPalette = getEmptyBlockPalette();
|
+ final MapType<String> wrappedEmptyBlockPalette = getEmptyBlockPalette();
|
||||||
+
|
+
|
||||||
+ final ListType sections = level.getList("Sections", ObjectType.MAP);
|
+ ListType sections = level.getList("Sections", ObjectType.MAP);
|
||||||
|
+ if (sections == null) {
|
||||||
|
+ level.setList("Sections", sections = Types.NBT.createEmptyList());
|
||||||
|
+ }
|
||||||
+
|
+
|
||||||
+ // must update sections for two things:
|
+ // must update sections for two things:
|
||||||
+ // 1. the biomes are now stored per section, so we must insert the biomes palette into each section (and create them if they don't exist)
|
+ // 1. the biomes are now stored per section, so we must insert the biomes palette into each section (and create them if they don't exist)
|
||||||
+ // 2. each section must now have block states (or at least DFU is ensuring they do, but current code does not require)
|
+ // 2. each section must now have block states (or at least DFU is ensuring they do, but current code does not require)
|
||||||
+ V2841.SimplePaletteReader bottomSection = null;
|
+ V2841.SimplePaletteReader bottomSection = null;
|
||||||
+ final Set<String> allBlocks = new HashSet<>();
|
+ final Set<String> allBlocks = new HashSet<>();
|
||||||
+ if (sections != null) {
|
+ final IntOpenHashSet existingSections = new IntOpenHashSet();
|
||||||
+ final IntOpenHashSet existingSections = new IntOpenHashSet();
|
|
||||||
+
|
+
|
||||||
+ for (int i = 0, len = sections.size(); i < len; ++i) {
|
+ for (int i = 0, len = sections.size(); i < len; ++i) {
|
||||||
+ final MapType<String> section = sections.getMap(i);
|
+ final MapType<String> section = sections.getMap(i);
|
||||||
+
|
+
|
||||||
+ final int y = section.getInt("Y");
|
+ final int y = section.getInt("Y");
|
||||||
+ final int sectionIndex = y - minSection;
|
+ final int sectionIndex = y - minSection;
|
||||||
+
|
+
|
||||||
+ existingSections.add(y);
|
+ existingSections.add(y);
|
||||||
+
|
+
|
||||||
+ // add in relevant biome section
|
+ // add in relevant biome section
|
||||||
+ if (sectionIndex >= 0 && sectionIndex < newBiomes.length) {
|
+ if (sectionIndex >= 0 && sectionIndex < newBiomes.length) {
|
||||||
+ // exclude out of bounds sections (i.e the light sections above and below the world)
|
+ // exclude out of bounds sections (i.e the light sections above and below the world)
|
||||||
+ section.setMap("biomes", newBiomes[sectionIndex]);
|
+ section.setMap("biomes", newBiomes[sectionIndex]);
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ // update palette
|
+ // update palette
|
||||||
+ final ListType palette = section.getList("Palette", ObjectType.MAP);
|
+ final ListType palette = section.getList("Palette", ObjectType.MAP);
|
||||||
+ final long[] blockStates = section.getLongs("BlockStates");
|
+ final long[] blockStates = section.getLongs("BlockStates");
|
||||||
+
|
+
|
||||||
+ section.remove("Palette");
|
+ section.remove("Palette");
|
||||||
+ section.remove("BlockStates");
|
+ section.remove("BlockStates");
|
||||||
+
|
+
|
||||||
+ if (palette != null) {
|
+ if (palette != null) {
|
||||||
+ for (int j = 0, len2 = palette.size(); j < len2; ++j) {
|
+ for (int j = 0, len2 = palette.size(); j < len2; ++j) {
|
||||||
+ allBlocks.add(V2841.getBlockId(palette.getMap(j)));
|
+ allBlocks.add(V2841.getBlockId(palette.getMap(j)));
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ final MapType<String> palettedContainer;
|
|
||||||
+ if (palette != null && blockStates != null) {
|
|
||||||
+ // only if both exist, same as DFU, same as legacy chunk loading code
|
|
||||||
+ section.setMap("block_states", palettedContainer = wrapPaletteOptimised(palette, blockStates));
|
|
||||||
+ } else {
|
|
||||||
+ section.setMap("block_states", palettedContainer = wrappedEmptyBlockPalette.copy()); // must write a palette now, copy so that later edits do not edit them all
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (section.getInt("Y", Integer.MAX_VALUE) == 0) {
|
|
||||||
+ bottomSection = new V2841.SimplePaletteReader(palettedContainer.getList("palette", ObjectType.MAP), palettedContainer.getLongs("data"));
|
|
||||||
+ }
|
+ }
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ // all existing sections updated, now we must create new sections just for the biomes migration
|
+ final MapType<String> palettedContainer;
|
||||||
+ for (int sectionIndex = 0; sectionIndex < newBiomes.length; ++sectionIndex) {
|
+ if (palette != null && blockStates != null) {
|
||||||
+ final int sectionY = sectionIndex + minSection;
|
+ // only if both exist, same as DFU, same as legacy chunk loading code
|
||||||
+ if (!existingSections.add(sectionY)) {
|
+ section.setMap("block_states", palettedContainer = wrapPaletteOptimised(palette, blockStates));
|
||||||
+ // exists already
|
+ } else {
|
||||||
+ continue;
|
+ section.setMap("block_states", palettedContainer = wrappedEmptyBlockPalette.copy()); // must write a palette now, copy so that later edits do not edit them all
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ final MapType<String> newSection = Types.NBT.createEmptyMap();
|
|
||||||
+ sections.addMap(newSection);
|
|
||||||
+
|
|
||||||
+ newSection.setByte("Y", (byte)sectionY);
|
|
||||||
+ // must write a palette now, copy so that later edits do not edit them all
|
|
||||||
+ newSection.setMap("block_states", wrappedEmptyBlockPalette.copy());
|
|
||||||
+
|
|
||||||
+ newSection.setGeneric("biomes", newBiomes[sectionIndex]);
|
|
||||||
+ }
|
+ }
|
||||||
|
+
|
||||||
|
+ if (section.getInt("Y", Integer.MAX_VALUE) == 0) {
|
||||||
|
+ bottomSection = new V2841.SimplePaletteReader(palettedContainer.getList("palette", ObjectType.MAP), palettedContainer.getLongs("data"));
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ // all existing sections updated, now we must create new sections just for the biomes migration
|
||||||
|
+ for (int sectionIndex = 0; sectionIndex < newBiomes.length; ++sectionIndex) {
|
||||||
|
+ final int sectionY = sectionIndex + minSection;
|
||||||
|
+ if (!existingSections.add(sectionY)) {
|
||||||
|
+ // exists already
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ final MapType<String> newSection = Types.NBT.createEmptyMap();
|
||||||
|
+ sections.addMap(newSection);
|
||||||
|
+
|
||||||
|
+ newSection.setByte("Y", (byte)sectionY);
|
||||||
|
+ // must write a palette now, copy so that later edits do not edit them all
|
||||||
|
+ newSection.setMap("block_states", wrappedEmptyBlockPalette.copy());
|
||||||
|
+
|
||||||
|
+ newSection.setGeneric("biomes", newBiomes[sectionIndex]);
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ // update status so interpolation can take place
|
+ // update status so interpolation can take place
|
||||||
|
|
Loading…
Reference in New Issue