001    package net.minecraft.world.chunk.storage;
002    
003    import net.minecraft.nbt.NBTTagCompound;
004    import net.minecraft.nbt.NBTTagList;
005    import net.minecraft.world.biome.WorldChunkManager;
006    import net.minecraft.world.chunk.NibbleArray;
007    
008    public class ChunkLoader
009    {
010        public static AnvilConverterData load(NBTTagCompound par0NBTTagCompound)
011        {
012            int var1 = par0NBTTagCompound.getInteger("xPos");
013            int var2 = par0NBTTagCompound.getInteger("zPos");
014            AnvilConverterData var3 = new AnvilConverterData(var1, var2);
015            var3.blocks = par0NBTTagCompound.getByteArray("Blocks");
016            var3.data = new NibbleArrayReader(par0NBTTagCompound.getByteArray("Data"), 7);
017            var3.skyLight = new NibbleArrayReader(par0NBTTagCompound.getByteArray("SkyLight"), 7);
018            var3.blockLight = new NibbleArrayReader(par0NBTTagCompound.getByteArray("BlockLight"), 7);
019            var3.heightmap = par0NBTTagCompound.getByteArray("HeightMap");
020            var3.terrainPopulated = par0NBTTagCompound.getBoolean("TerrainPopulated");
021            var3.entities = par0NBTTagCompound.getTagList("Entities");
022            var3.tileEntities = par0NBTTagCompound.getTagList("TileEntities");
023            var3.tileTicks = par0NBTTagCompound.getTagList("TileTicks");
024    
025            try
026            {
027                var3.lastUpdated = par0NBTTagCompound.getLong("LastUpdate");
028            }
029            catch (ClassCastException var5)
030            {
031                var3.lastUpdated = (long)par0NBTTagCompound.getInteger("LastUpdate");
032            }
033    
034            return var3;
035        }
036    
037        public static void convertToAnvilFormat(AnvilConverterData par0AnvilConverterData, NBTTagCompound par1NBTTagCompound, WorldChunkManager par2WorldChunkManager)
038        {
039            par1NBTTagCompound.setInteger("xPos", par0AnvilConverterData.x);
040            par1NBTTagCompound.setInteger("zPos", par0AnvilConverterData.z);
041            par1NBTTagCompound.setLong("LastUpdate", par0AnvilConverterData.lastUpdated);
042            int[] var3 = new int[par0AnvilConverterData.heightmap.length];
043    
044            for (int var4 = 0; var4 < par0AnvilConverterData.heightmap.length; ++var4)
045            {
046                var3[var4] = par0AnvilConverterData.heightmap[var4];
047            }
048    
049            par1NBTTagCompound.setIntArray("HeightMap", var3);
050            par1NBTTagCompound.setBoolean("TerrainPopulated", par0AnvilConverterData.terrainPopulated);
051            NBTTagList var16 = new NBTTagList("Sections");
052            int var7;
053    
054            for (int var5 = 0; var5 < 8; ++var5)
055            {
056                boolean var6 = true;
057    
058                for (var7 = 0; var7 < 16 && var6; ++var7)
059                {
060                    int var8 = 0;
061    
062                    while (var8 < 16 && var6)
063                    {
064                        int var9 = 0;
065    
066                        while (true)
067                        {
068                            if (var9 < 16)
069                            {
070                                int var10 = var7 << 11 | var9 << 7 | var8 + (var5 << 4);
071                                byte var11 = par0AnvilConverterData.blocks[var10];
072    
073                                if (var11 == 0)
074                                {
075                                    ++var9;
076                                    continue;
077                                }
078    
079                                var6 = false;
080                            }
081    
082                            ++var8;
083                            break;
084                        }
085                    }
086                }
087    
088                if (!var6)
089                {
090                    byte[] var19 = new byte[4096];
091                    NibbleArray var20 = new NibbleArray(var19.length, 4);
092                    NibbleArray var21 = new NibbleArray(var19.length, 4);
093                    NibbleArray var23 = new NibbleArray(var19.length, 4);
094    
095                    for (int var22 = 0; var22 < 16; ++var22)
096                    {
097                        for (int var12 = 0; var12 < 16; ++var12)
098                        {
099                            for (int var13 = 0; var13 < 16; ++var13)
100                            {
101                                int var14 = var22 << 11 | var13 << 7 | var12 + (var5 << 4);
102                                byte var15 = par0AnvilConverterData.blocks[var14];
103                                var19[var12 << 8 | var13 << 4 | var22] = (byte)(var15 & 255);
104                                var20.set(var22, var12, var13, par0AnvilConverterData.data.get(var22, var12 + (var5 << 4), var13));
105                                var21.set(var22, var12, var13, par0AnvilConverterData.skyLight.get(var22, var12 + (var5 << 4), var13));
106                                var23.set(var22, var12, var13, par0AnvilConverterData.blockLight.get(var22, var12 + (var5 << 4), var13));
107                            }
108                        }
109                    }
110    
111                    NBTTagCompound var24 = new NBTTagCompound();
112                    var24.setByte("Y", (byte)(var5 & 255));
113                    var24.setByteArray("Blocks", var19);
114                    var24.setByteArray("Data", var20.data);
115                    var24.setByteArray("SkyLight", var21.data);
116                    var24.setByteArray("BlockLight", var23.data);
117                    var16.appendTag(var24);
118                }
119            }
120    
121            par1NBTTagCompound.setTag("Sections", var16);
122            byte[] var17 = new byte[256];
123    
124            for (int var18 = 0; var18 < 16; ++var18)
125            {
126                for (var7 = 0; var7 < 16; ++var7)
127                {
128                    var17[var7 << 4 | var18] = (byte)(par2WorldChunkManager.getBiomeGenAt(par0AnvilConverterData.x << 4 | var18, par0AnvilConverterData.z << 4 | var7).biomeID & 255);
129                }
130            }
131    
132            par1NBTTagCompound.setByteArray("Biomes", var17);
133            par1NBTTagCompound.setTag("Entities", par0AnvilConverterData.entities);
134            par1NBTTagCompound.setTag("TileEntities", par0AnvilConverterData.tileEntities);
135    
136            if (par0AnvilConverterData.tileTicks != null)
137            {
138                par1NBTTagCompound.setTag("TileTicks", par0AnvilConverterData.tileTicks);
139            }
140        }
141    }