package net.minecraft.world.chunk.storage;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import net.minecraft.nbt.CompressedStreamTools;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.IProgressUpdate;
import net.minecraft.util.MathHelper;
import net.minecraft.world.WorldType;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraft.world.biome.WorldChunkManager;
import net.minecraft.world.biome.WorldChunkManagerHell;
import net.minecraft.world.storage.ISaveHandler;
import net.minecraft.world.storage.SaveFormatComparator;
import net.minecraft.world.storage.SaveFormatOld;
import net.minecraft.world.storage.WorldInfo;
public class AnvilSaveConverter extends SaveFormatOld
{
public AnvilSaveConverter(File par1File)
{
super(par1File);
}
@SideOnly(Side.CLIENT)
public List getSaveList()
{
ArrayList var1 = new ArrayList();
File[] var2 = this.savesDirectory.listFiles();
File[] var3 = var2;
int var4 = var2.length;
for (int var5 = 0; var5 < var4; ++var5)
{
File var6 = var3[var5];
if (var6.isDirectory())
{
String var7 = var6.getName();
WorldInfo var8 = this.getWorldInfo(var7);
if (var8 != null && (var8.getSaveVersion() == 19132 || var8.getSaveVersion() == 19133))
{
boolean var9 = var8.getSaveVersion() != this.getSaveVersion();
String var10 = var8.getWorldName();
if (var10 == null || MathHelper.stringNullOrLengthZero(var10))
{
var10 = var7;
}
long var11 = 0L;
var1.add(new SaveFormatComparator(var7, var10, var8.getLastTimePlayed(), var11, var8.getGameType(), var9, var8.isHardcoreModeEnabled(), var8.areCommandsAllowed()));
}
}
}
return var1;
}
protected int getSaveVersion()
{
return 19133;
}
public void flushCache()
{
RegionFileCache.clearRegionFileReferences();
}
/**
* Returns back a loader for the specified save directory
*/
public ISaveHandler getSaveLoader(String par1Str, boolean par2)
{
return new AnvilSaveHandler(this.savesDirectory, par1Str, par2);
}
/**
* Checks if the save directory uses the old map format
*/
public boolean isOldMapFormat(String par1Str)
{
WorldInfo var2 = this.getWorldInfo(par1Str);
return var2 != null && var2.getSaveVersion() != this.getSaveVersion();
}
/**
* Converts the specified map to the new map format. Args: worldName, loadingScreen
*/
public boolean convertMapFormat(String par1Str, IProgressUpdate par2IProgressUpdate)
{
par2IProgressUpdate.setLoadingProgress(0);
ArrayList var3 = new ArrayList();
ArrayList var4 = new ArrayList();
ArrayList var5 = new ArrayList();
File var6 = new File(this.savesDirectory, par1Str);
File var7 = new File(var6, "DIM-1");
File var8 = new File(var6, "DIM1");
System.out.println("Scanning folders...");
this.addRegionFilesToCollection(var6, var3);
if (var7.exists())
{
this.addRegionFilesToCollection(var7, var4);
}
if (var8.exists())
{
this.addRegionFilesToCollection(var8, var5);
}
int var9 = var3.size() + var4.size() + var5.size();
System.out.println("Total conversion count is " + var9);
WorldInfo var10 = this.getWorldInfo(par1Str);
Object var11 = null;
if (var10.getTerrainType() == WorldType.FLAT)
{
var11 = new WorldChunkManagerHell(BiomeGenBase.plains, 0.5F, 0.5F);
}
else
{
var11 = new WorldChunkManager(var10.getSeed(), var10.getTerrainType());
}
this.convertFile(new File(var6, "region"), var3, (WorldChunkManager)var11, 0, var9, par2IProgressUpdate);
this.convertFile(new File(var7, "region"), var4, new WorldChunkManagerHell(BiomeGenBase.hell, 1.0F, 0.0F), var3.size(), var9, par2IProgressUpdate);
this.convertFile(new File(var8, "region"), var5, new WorldChunkManagerHell(BiomeGenBase.sky, 0.5F, 0.0F), var3.size() + var4.size(), var9, par2IProgressUpdate);
var10.setSaveVersion(19133);
if (var10.getTerrainType() == WorldType.DEFAULT_1_1)
{
var10.setTerrainType(WorldType.DEFAULT);
}
this.createFile(par1Str);
ISaveHandler var12 = this.getSaveLoader(par1Str, false);
var12.saveWorldInfo(var10);
return true;
}
/**
* par: filename for the level.dat_mcr backup
*/
private void createFile(String par1Str)
{
File var2 = new File(this.savesDirectory, par1Str);
if (!var2.exists())
{
System.out.println("Warning: Unable to create level.dat_mcr backup");
}
else
{
File var3 = new File(var2, "level.dat");
if (!var3.exists())
{
System.out.println("Warning: Unable to create level.dat_mcr backup");
}
else
{
File var4 = new File(var2, "level.dat_mcr");
if (!var3.renameTo(var4))
{
System.out.println("Warning: Unable to create level.dat_mcr backup");
}
}
}
}
private void convertFile(File par1File, Iterable par2Iterable, WorldChunkManager par3WorldChunkManager, int par4, int par5, IProgressUpdate par6IProgressUpdate)
{
Iterator var7 = par2Iterable.iterator();
while (var7.hasNext())
{
File var8 = (File)var7.next();
this.convertChunks(par1File, var8, par3WorldChunkManager, par4, par5, par6IProgressUpdate);
++par4;
int var9 = (int)Math.round(100.0D * (double)par4 / (double)par5);
par6IProgressUpdate.setLoadingProgress(var9);
}
}
/**
* copies a 32x32 chunk set from par2File to par1File, via AnvilConverterData
*/
private void convertChunks(File par1File, File par2File, WorldChunkManager par3WorldChunkManager, int par4, int par5, IProgressUpdate par6IProgressUpdate)
{
try
{
String var7 = par2File.getName();
RegionFile var8 = new RegionFile(par2File);
RegionFile var9 = new RegionFile(new File(par1File, var7.substring(0, var7.length() - ".mcr".length()) + ".mca"));
for (int var10 = 0; var10 < 32; ++var10)
{
int var11;
for (var11 = 0; var11 < 32; ++var11)
{
if (var8.isChunkSaved(var10, var11) && !var9.isChunkSaved(var10, var11))
{
DataInputStream var12 = var8.getChunkDataInputStream(var10, var11);
if (var12 == null)
{
System.out.println("Failed to fetch input stream");
}
else
{
NBTTagCompound var13 = CompressedStreamTools.read(var12);
var12.close();
NBTTagCompound var14 = var13.getCompoundTag("Level");
AnvilConverterData var15 = ChunkLoader.load(var14);
NBTTagCompound var16 = new NBTTagCompound();
NBTTagCompound var17 = new NBTTagCompound();
var16.setTag("Level", var17);
ChunkLoader.convertToAnvilFormat(var15, var17, par3WorldChunkManager);
DataOutputStream var18 = var9.getChunkDataOutputStream(var10, var11);
CompressedStreamTools.write(var16, var18);
var18.close();
}
}
}
var11 = (int)Math.round(100.0D * (double)(par4 * 1024) / (double)(par5 * 1024));
int var20 = (int)Math.round(100.0D * (double)((var10 + 1) * 32 + par4 * 1024) / (double)(par5 * 1024));
if (var20 > var11)
{
par6IProgressUpdate.setLoadingProgress(var20);
}
}
var8.close();
var9.close();
}
catch (IOException var19)
{
var19.printStackTrace();
}
}
/**
* filters the files in the par1 directory, and adds them to the par2 collections
*/
private void addRegionFilesToCollection(File par1File, Collection par2Collection)
{
File var3 = new File(par1File, "region");
File[] var4 = var3.listFiles(new AnvilSaveConverterFileFilter(this));
if (var4 != null)
{
Collections.addAll(par2Collection, var4);
}
}
}