Path: blob/main/sp-server/src_aux/AnvilSaveConverter.java
8641 views
package net.minecraft.src;12import java.io.DataInputStream;3import java.io.DataOutputStream;4import java.io.File;5import java.io.IOException;6import java.util.ArrayList;7import java.util.Collection;8import java.util.Collections;9import java.util.Iterator;10import net.minecraft.server.MinecraftServer;1112public class AnvilSaveConverter extends SaveFormatOld {13public AnvilSaveConverter(File par1File) {14super(par1File);15}1617protected int getSaveVersion() {18return 19133;19}2021public void flushCache() {22RegionFileCache.clearRegionFileReferences();23}2425/**26* Returns back a loader for the specified save directory27*/28public ISaveHandler getSaveLoader(String par1Str, boolean par2) {29return new AnvilSaveHandler(this.savesDirectory, par1Str, par2);30}3132/**33* gets if the map is old chunk saving (true) or McRegion (false)34*/35public boolean isOldMapFormat(String par1Str) {36WorldInfo var2 = this.getWorldInfo(par1Str);37return var2 != null && var2.getSaveVersion() != this.getSaveVersion();38}3940/**41* converts the map to mcRegion42*/43public boolean convertMapFormat(String par1Str, IProgressUpdate par2IProgressUpdate) {44par2IProgressUpdate.setLoadingProgress(0);45ArrayList var3 = new ArrayList();46ArrayList var4 = new ArrayList();47ArrayList var5 = new ArrayList();48File var6 = new File(this.savesDirectory, par1Str);49File var7 = new File(var6, "DIM-1");50File var8 = new File(var6, "DIM1");51MinecraftServer.getServer().getLogAgent().func_98233_a("Scanning folders...");52this.addRegionFilesToCollection(var6, var3);5354if (var7.exists()) {55this.addRegionFilesToCollection(var7, var4);56}5758if (var8.exists()) {59this.addRegionFilesToCollection(var8, var5);60}6162int var9 = var3.size() + var4.size() + var5.size();63MinecraftServer.getServer().getLogAgent().func_98233_a("Total conversion count is " + var9);64WorldInfo var10 = this.getWorldInfo(par1Str);65Object var11 = null;6667if (var10.getTerrainType() == WorldType.FLAT) {68var11 = new WorldChunkManagerHell(BiomeGenBase.plains, 0.5F, 0.5F);69} else {70var11 = new WorldChunkManager(var10.getSeed(), var10.getTerrainType());71}7273this.convertFile(new File(var6, "region"), var3, (WorldChunkManager) var11, 0, var9, par2IProgressUpdate);74this.convertFile(new File(var7, "region"), var4, new WorldChunkManagerHell(BiomeGenBase.hell, 1.0F, 0.0F),75var3.size(), var9, par2IProgressUpdate);76this.convertFile(new File(var8, "region"), var5, new WorldChunkManagerHell(BiomeGenBase.sky, 0.5F, 0.0F),77var3.size() + var4.size(), var9, par2IProgressUpdate);78var10.setSaveVersion(19133);7980if (var10.getTerrainType() == WorldType.DEFAULT_1_1) {81var10.setTerrainType(WorldType.DEFAULT);82}8384this.createFile(par1Str);85ISaveHandler var12 = this.getSaveLoader(par1Str, false);86var12.saveWorldInfo(var10);87return true;88}8990/**91* par: filename for the level.dat_mcr backup92*/93private void createFile(String par1Str) {94File var2 = new File(this.savesDirectory, par1Str);9596if (!var2.exists()) {97System.out.println("Warning: Unable to create level.dat_mcr backup");98} else {99File var3 = new File(var2, "level.dat");100101if (!var3.exists()) {102System.out.println("Warning: Unable to create level.dat_mcr backup");103} else {104File var4 = new File(var2, "level.dat_mcr");105106if (!var3.renameTo(var4)) {107System.out.println("Warning: Unable to create level.dat_mcr backup");108}109}110}111}112113private void convertFile(File par1File, Iterable par2Iterable, WorldChunkManager par3WorldChunkManager, int par4,114int par5, IProgressUpdate par6IProgressUpdate) {115Iterator var7 = par2Iterable.iterator();116117while (var7.hasNext()) {118File var8 = (File) var7.next();119this.convertChunks(par1File, var8, par3WorldChunkManager, par4, par5, par6IProgressUpdate);120++par4;121int var9 = (int) Math.round(100.0D * (double) par4 / (double) par5);122par6IProgressUpdate.setLoadingProgress(var9);123}124}125126/**127* copies a 32x32 chunk set from par2File to par1File, via AnvilConverterData128*/129private void convertChunks(File par1File, File par2File, WorldChunkManager par3WorldChunkManager, int par4,130int par5, IProgressUpdate par6IProgressUpdate) {131try {132String var7 = par2File.getName();133RegionFile var8 = new RegionFile(par2File);134RegionFile var9 = new RegionFile(135new File(par1File, var7.substring(0, var7.length() - ".mcr".length()) + ".mca"));136137for (int var10 = 0; var10 < 32; ++var10) {138int var11;139140for (var11 = 0; var11 < 32; ++var11) {141if (var8.isChunkSaved(var10, var11) && !var9.isChunkSaved(var10, var11)) {142DataInputStream var12 = var8.getChunkDataInputStream(var10, var11);143144if (var12 == null) {145MinecraftServer.getServer().getLogAgent().func_98236_b("Failed to fetch input stream");146} else {147NBTTagCompound var13 = CompressedStreamTools.read(var12);148var12.close();149NBTTagCompound var14 = var13.getCompoundTag("Level");150AnvilConverterData var15 = ChunkLoader.load(var14);151NBTTagCompound var16 = new NBTTagCompound();152NBTTagCompound var17 = new NBTTagCompound();153var16.setTag("Level", var17);154ChunkLoader.convertToAnvilFormat(var15, var17, par3WorldChunkManager);155DataOutputStream var18 = var9.getChunkDataOutputStream(var10, var11);156CompressedStreamTools.write(var16, var18);157var18.close();158}159}160}161162var11 = (int) Math.round(100.0D * (double) (par4 * 1024) / (double) (par5 * 1024));163int var20 = (int) Math164.round(100.0D * (double) ((var10 + 1) * 32 + par4 * 1024) / (double) (par5 * 1024));165166if (var20 > var11) {167par6IProgressUpdate.setLoadingProgress(var20);168}169}170171var8.close();172var9.close();173} catch (IOException var19) {174var19.printStackTrace();175}176}177178/**179* filters the files in the par1 directory, and adds them to the par2180* collections181*/182private void addRegionFilesToCollection(File par1File, Collection par2Collection) {183File var3 = new File(par1File, "region");184File[] var4 = var3.listFiles(new AnvilSaveConverterFileFilter(this));185186if (var4 != null) {187Collections.addAll(par2Collection, var4);188}189}190}191192193