minecraft-source/src/net/minecraft/world/level/chunk/storage/OldChunkStorage.java

117 lines
5.3 KiB
Java

package net.minecraft.world.level.chunk.storage;
import java.util.AbstractList;
import net.minecraft.world.level.chunk.ChunkBiomeContainer;
import net.minecraft.world.level.ChunkPos;
import net.minecraft.nbt.Tag;
import net.minecraft.world.level.chunk.DataLayer;
import net.minecraft.nbt.ListTag;
import net.minecraft.world.level.biome.BiomeSource;
import net.minecraft.world.level.chunk.OldDataLayer;
import net.minecraft.nbt.CompoundTag;
public class OldChunkStorage {
public static OldLevelChunk load(final CompoundTag jt) {
final int integer2 = jt.getInt("xPos");
final int integer3 = jt.getInt("zPos");
final OldLevelChunk a4 = new OldLevelChunk(integer2, integer3);
a4.blocks = jt.getByteArray("Blocks");
a4.data = new OldDataLayer(jt.getByteArray("Data"), 7);
a4.skyLight = new OldDataLayer(jt.getByteArray("SkyLight"), 7);
a4.blockLight = new OldDataLayer(jt.getByteArray("BlockLight"), 7);
a4.heightmap = jt.getByteArray("HeightMap");
a4.terrainPopulated = jt.getBoolean("TerrainPopulated");
a4.entities = jt.getList("Entities", 10);
a4.blockEntities = jt.getList("TileEntities", 10);
a4.blockTicks = jt.getList("TileTicks", 10);
try {
a4.lastUpdated = jt.getLong("LastUpdate");
}
catch (ClassCastException classCastException5) {
a4.lastUpdated = jt.getInt("LastUpdate");
}
return a4;
}
public static void convertToAnvilFormat(final OldLevelChunk a, final CompoundTag jt, final BiomeSource bkt) {
jt.putInt("xPos", a.x);
jt.putInt("zPos", a.z);
jt.putLong("LastUpdate", a.lastUpdated);
final int[] arr4 = new int[a.heightmap.length];
for (int integer5 = 0; integer5 < a.heightmap.length; ++integer5) {
arr4[integer5] = a.heightmap[integer5];
}
jt.putIntArray("HeightMap", arr4);
jt.putBoolean("TerrainPopulated", a.terrainPopulated);
final ListTag jz5 = new ListTag();
for (int integer6 = 0; integer6 < 8; ++integer6) {
boolean boolean7 = true;
for (int integer7 = 0; integer7 < 16 && boolean7; ++integer7) {
for (int integer8 = 0; integer8 < 16 && boolean7; ++integer8) {
for (int integer9 = 0; integer9 < 16; ++integer9) {
final int integer10 = integer7 << 11 | integer9 << 7 | integer8 + (integer6 << 4);
final int integer11 = a.blocks[integer10];
if (integer11 != 0) {
boolean7 = false;
break;
}
}
}
}
if (!boolean7) {
final byte[] arr5 = new byte[4096];
final DataLayer cac9 = new DataLayer();
final DataLayer cac10 = new DataLayer();
final DataLayer cac11 = new DataLayer();
for (int integer11 = 0; integer11 < 16; ++integer11) {
for (int integer12 = 0; integer12 < 16; ++integer12) {
for (int integer13 = 0; integer13 < 16; ++integer13) {
final int integer14 = integer11 << 11 | integer13 << 7 | integer12 + (integer6 << 4);
final int integer15 = a.blocks[integer14];
arr5[integer12 << 8 | integer13 << 4 | integer11] = (byte)(integer15 & 0xFF);
cac9.set(integer11, integer12, integer13, a.data.get(integer11, integer12 + (integer6 << 4), integer13));
cac10.set(integer11, integer12, integer13, a.skyLight.get(integer11, integer12 + (integer6 << 4), integer13));
cac11.set(integer11, integer12, integer13, a.blockLight.get(integer11, integer12 + (integer6 << 4), integer13));
}
}
}
final CompoundTag jt2 = new CompoundTag();
jt2.putByte("Y", (byte)(integer6 & 0xFF));
jt2.putByteArray("Blocks", arr5);
jt2.putByteArray("Data", cac9.getData());
jt2.putByteArray("SkyLight", cac10.getData());
jt2.putByteArray("BlockLight", cac11.getData());
((AbstractList<CompoundTag>)jz5).add(jt2);
}
}
jt.put("Sections", jz5);
jt.putIntArray("Biomes", new ChunkBiomeContainer(new ChunkPos(a.x, a.z), bkt).writeBiomes());
jt.put("Entities", a.entities);
jt.put("TileEntities", a.blockEntities);
if (a.blockTicks != null) {
jt.put("TileTicks", a.blockTicks);
}
jt.putBoolean("convertedFromAlphaFormat", true);
}
public static class OldLevelChunk {
public long lastUpdated;
public boolean terrainPopulated;
public byte[] heightmap;
public OldDataLayer blockLight;
public OldDataLayer skyLight;
public OldDataLayer data;
public byte[] blocks;
public ListTag entities;
public ListTag blockEntities;
public ListTag blockTicks;
public final int x;
public final int z;
public OldLevelChunk(final int integer1, final int integer2) {
this.x = integer1;
this.z = integer2;
}
}
}