rewrote chunk storage to use single files (anvil still available via args[])

This commit is contained in:
LAX1DUDE 2022-04-27 22:39:25 -07:00
parent 699997d652
commit d39e81ff72
37 changed files with 996 additions and 367 deletions

3
.gitignore vendored
View File

@ -7,6 +7,7 @@ bin
/epkcompiler/bin /epkcompiler/bin
/eaglercraftbungee/rundir /eaglercraftbungee/rundir
/lwjgl-rundir/_eagstorage* /lwjgl-rundir/_eagstorage*
/lwjgl-rundir/saves /lwjgl-rundir/lwjgl_saves
/lwjgl-rundir/filesystem
/lwjgl-rundir/texturepacks /lwjgl-rundir/texturepacks
/lwjgl-rundir/options.txt /lwjgl-rundir/options.txt

View File

@ -1,7 +1,10 @@
package net.lax1dude.eaglercraft; package net.lax1dude.eaglercraft;
import java.io.File;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import net.lax1dude.eaglercraft.anvil.SaveConverterMcRegion;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
public class MinecraftMain { public class MinecraftMain {
@ -12,6 +15,13 @@ public class MinecraftMain {
JOptionPane.PLAIN_MESSAGE); JOptionPane.PLAIN_MESSAGE);
EaglerAdapter.initializeContext(); EaglerAdapter.initializeContext();
for(int i = 0; i < par0ArrayOfStr.length; ++i) {
String arg = par0ArrayOfStr[i];
if("--anvilSaveFormat".equalsIgnoreCase(arg)) {
EaglerAdapter.configureSaveFormat(new SaveConverterMcRegion(new File("lwjgl_saves")));
}
}
/* /*
* LocalStorageManager.loadStorage(); byte[] b = * LocalStorageManager.loadStorage(); byte[] b =
* EaglerAdapter.loadLocalStorage("forced"); if(b != null) { * EaglerAdapter.loadLocalStorage("forced"); if(b != null) {

View File

@ -14,6 +14,7 @@ import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
@ -29,6 +30,8 @@ import java.nio.ByteOrder;
import java.nio.FloatBuffer; import java.nio.FloatBuffer;
import java.nio.IntBuffer; import java.nio.IntBuffer;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.Set; import java.util.Set;
@ -65,9 +68,8 @@ import org.lwjgl.util.glu.GLU;
import de.cuina.fireandfuel.CodecJLayerMP3; import de.cuina.fireandfuel.CodecJLayerMP3;
import net.lax1dude.eaglercraft.AssetRepository; import net.lax1dude.eaglercraft.AssetRepository;
import net.lax1dude.eaglercraft.EarlyLoadScreen; import net.lax1dude.eaglercraft.EarlyLoadScreen;
import net.lax1dude.eaglercraft.adapter.EaglerAdapterImpl2.ProgramGL;
import net.lax1dude.eaglercraft.adapter.EaglerAdapterImpl2.RateLimit;
import net.lax1dude.eaglercraft.adapter.lwjgl.GameWindowListener; import net.lax1dude.eaglercraft.adapter.lwjgl.GameWindowListener;
import net.minecraft.src.ISaveFormat;
import net.minecraft.src.MathHelper; import net.minecraft.src.MathHelper;
import paulscode.sound.SoundSystem; import paulscode.sound.SoundSystem;
import paulscode.sound.SoundSystemConfig; import paulscode.sound.SoundSystemConfig;
@ -1550,6 +1552,215 @@ public class EaglerAdapterImpl2 {
return serverToJoinOnLaunch; return serverToJoinOnLaunch;
} }
private static final File filesystemBaseDirectory = new File("./filesystem");
static {
filesystemBaseDirectory.mkdirs();
}
// ======== Virtual Filesystem Functions =============
public static final boolean fileExists(String path) {
return (new File(filesystemBaseDirectory, stripPath(path))).isFile();
}
public static final boolean directoryExists(String path) {
return (new File(filesystemBaseDirectory, stripPath(path))).isDirectory();
}
public static final void writeFile(String path, byte[] data) {
try {
File f = new File(filesystemBaseDirectory, stripPath(path));
File p = f.getParentFile();
if(p != null) {
p.mkdirs();
}
FileOutputStream os = new FileOutputStream(f);
os.write(data);
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static final byte[] readFile(String path) {
File f = new File(filesystemBaseDirectory, stripPath(path));
if(!f.isFile()) {
return null;
}
try {
byte[] ret = new byte[(int)f.length()];
FileInputStream in = new FileInputStream(f);
in.read(ret);
in.close();
return ret;
}catch(IOException ex) {
ex.printStackTrace();
return null;
}
}
public static final long getLastModified(String path) {
return (new File(filesystemBaseDirectory, stripPath(path))).lastModified();
}
public static final void setLastModified(String path, long t) {
(new File(filesystemBaseDirectory, stripPath(path))).setLastModified(t);
}
public static final void touchFile(String path) {
(new File(filesystemBaseDirectory, stripPath(path))).setLastModified(System.currentTimeMillis());
}
public static final int getFileSize(String path) {
return (int)(new File(filesystemBaseDirectory, stripPath(path))).length();
}
public static final void renameFile(String oldPath, String newPath) {
File f1 = new File(filesystemBaseDirectory, stripPath(oldPath));
File f2 = new File(filesystemBaseDirectory, stripPath(newPath));
if(f1.exists()) {
if(f2.exists()) {
try {
FileInputStream fs1 = new FileInputStream(f1);
FileOutputStream fs2 = new FileOutputStream(f2);
byte[] buffer = new byte[1024 * 64];
int a;
while((a = fs1.read(buffer)) > 0) {
fs2.write(buffer, 0, a);
}
fs1.close();
fs2.close();
f1.delete();
} catch (IOException e) {
System.err.println("Copy from '" + oldPath + "' to '" + newPath + "' failed");
e.printStackTrace();
}
}else {
File p = f2.getParentFile();
if(p != null) {
p.mkdirs();
}
f1.renameTo(f2);
}
}
}
public static final void copyFile(String oldPath, String newPath) {
try {
File ff2 = new File(filesystemBaseDirectory, stripPath(newPath));
File p = ff2.getParentFile();
if(p != null) {
p.mkdirs();
}
FileInputStream f1 = new FileInputStream(new File(filesystemBaseDirectory, stripPath(oldPath)));
FileOutputStream f2 = new FileOutputStream(ff2);
byte[] buffer = new byte[1024 * 64];
int a;
while((a = f1.read(buffer)) > 0) {
f2.write(buffer, 0, a);
}
f1.close();
f2.close();
} catch (IOException e) {
System.err.println("Copy from '" + oldPath + "' to '" + newPath + "' failed");
e.printStackTrace();
}
}
public static final void deleteFile(String path) {
(new File(filesystemBaseDirectory, stripPath(path))).delete();
}
public static final Collection<FileEntry> listFiles(String path, boolean listDirs, boolean recursiveDirs) {
path = stripPath(path);
ArrayList<FileEntry> ret = new ArrayList<>();
File f = new File(filesystemBaseDirectory, path);
if(f.isFile()) {
ret.add(new FileEntry(path, false, f.lastModified(), (int)f.length()));
}else if(f.isDirectory()) {
for(File ff : f.listFiles()) {
if(ff.isDirectory()) {
if(listDirs && !recursiveDirs) {
ret.add(new FileEntry(path + "/" + ff.getName(), true, -1l, -1));
}
if(recursiveDirs) {
recursiveListing(path + "/" + ff.getName(), ff, ret, listDirs, recursiveDirs);
}
}else {
ret.add(new FileEntry(path + "/" + ff.getName(), false, ff.lastModified(), (int)ff.length()));
}
}
}
return ret;
}
private static void recursiveListing(String path, File f, Collection<FileEntry> lst, boolean listDirs, boolean recursiveDirs) {
if(f.isFile()) {
lst.add(new FileEntry(path, false, f.lastModified(), (int)f.length()));
}else if(f.isDirectory()) {
if(listDirs) {
lst.add(new FileEntry(path, true, -1l, -1));
}
if(recursiveDirs) {
for(File ff : f.listFiles()) {
recursiveListing(path + "/" + ff.getName(), ff, lst, listDirs, recursiveDirs);
}
}
}
}
public static final Collection<FileEntry> listFilesAndDirectories(String path) {
return listFiles(path, true, false);
}
public static final Collection<FileEntry> listFilesRecursive(String path) {
return listFiles(path, false, true);
}
public static class FileEntry {
public final String path;
public final boolean isDirectory;
public final long lastModified;
public final int fileSize;
protected FileEntry(String path, boolean isDirectory, long lastModified, int fileSize) {
this.path = path;
this.isDirectory = isDirectory;
this.lastModified = lastModified;
this.fileSize = fileSize;
}
public String getName() {
int i = path.indexOf('/');
if(i >= 0) {
return path.substring(i + 1);
}else {
return path;
}
}
}
private static String stripPath(String str) {
if(str.startsWith("/")) {
str = str.substring(1);
}
if(str.endsWith("/")) {
str = str.substring(0, str.length() - 1);
}
return str;
}
private static ISaveFormat svformat = null;
public static final void configureSaveFormat(ISaveFormat fmt) {
svformat = fmt;
}
public static final ISaveFormat getConfiguredSaveFormat() {
return svformat;
}
} }

View File

@ -1,4 +1,4 @@
package net.minecraft.src; package net.lax1dude.eaglercraft.anvil;
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html // Jad home page: http://www.kpdus.com/jad.html

View File

@ -1,4 +1,4 @@
package net.minecraft.src; package net.lax1dude.eaglercraft.anvil;
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html // Jad home page: http://www.kpdus.com/jad.html

View File

@ -0,0 +1,126 @@
package net.lax1dude.eaglercraft.anvil;
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) braces deadcode
import java.io.*;
import java.util.*;
import net.lax1dude.eaglercraft.beta.EaglercraftChunkLoader;
import net.minecraft.src.Chunk;
import net.minecraft.src.CompressedStreamTools;
import net.minecraft.src.IChunkLoader;
import net.minecraft.src.NBTTagCompound;
import net.minecraft.src.World;
import net.minecraft.src.WorldInfo;
public class ChunkLoader implements IChunkLoader {
public ChunkLoader(File file, boolean flag) {
saveDir = file;
createIfNecessary = flag;
}
private File chunkFileForXZ(int i, int j) {
String s = (new StringBuilder()).append("c.").append(Integer.toString(i, 36)).append(".")
.append(Integer.toString(j, 36)).append(".dat").toString();
String s1 = Integer.toString(i & 0x3f, 36);
String s2 = Integer.toString(j & 0x3f, 36);
File file = new File(saveDir, s1);
if (!file.exists()) {
if (createIfNecessary) {
file.mkdir();
} else {
return null;
}
}
file = new File(file, s2);
if (!file.exists()) {
if (createIfNecessary) {
file.mkdir();
} else {
return null;
}
}
file = new File(file, s);
if (!file.exists() && !createIfNecessary) {
return null;
} else {
return file;
}
}
public Chunk loadChunk(World world, int i, int j) {
File file = chunkFileForXZ(i, j);
if (file != null && file.exists()) {
try {
FileInputStream fileinputstream = new FileInputStream(file);
NBTTagCompound nbttagcompound = CompressedStreamTools.func_1138_a(fileinputstream);
if (!nbttagcompound.hasKey("Level")) {
System.out.println((new StringBuilder()).append("Chunk file at ").append(i).append(",").append(j)
.append(" is missing level data, skipping").toString());
return null;
}
if (!nbttagcompound.getCompoundTag("Level").hasKey("Blocks")) {
System.out.println((new StringBuilder()).append("Chunk file at ").append(i).append(",").append(j)
.append(" is missing block data, skipping").toString());
return null;
}
Chunk chunk = EaglercraftChunkLoader.loadChunkIntoWorldFromCompound(world, nbttagcompound.getCompoundTag("Level"));
if (!chunk.isAtLocation(i, j)) {
System.out.println((new StringBuilder()).append("Chunk file at ").append(i).append(",").append(j)
.append(" is in the wrong location; relocating. (Expected ").append(i).append(", ")
.append(j).append(", got ").append(chunk.xPosition).append(", ").append(chunk.zPosition)
.append(")").toString());
nbttagcompound.setInteger("xPos", i);
nbttagcompound.setInteger("zPos", j);
chunk = EaglercraftChunkLoader.loadChunkIntoWorldFromCompound(world, nbttagcompound.getCompoundTag("Level"));
}
return chunk;
} catch (Exception exception) {
exception.printStackTrace();
}
}
return null;
}
public void saveChunk(World world, Chunk chunk) {
world.checkSessionLock();
File file = chunkFileForXZ(chunk.xPosition, chunk.zPosition);
if (file.exists()) {
WorldInfo worldinfo = world.func_22144_v();
worldinfo.func_22297_b(worldinfo.func_22306_g() - file.length());
}
try {
File file1 = new File(saveDir, "tmp_chunk.dat");
FileOutputStream fileoutputstream = new FileOutputStream(file1);
NBTTagCompound nbttagcompound = new NBTTagCompound();
NBTTagCompound nbttagcompound1 = new NBTTagCompound();
nbttagcompound.setTag("Level", nbttagcompound1);
EaglercraftChunkLoader.storeChunkInCompound(chunk, world, nbttagcompound1);
CompressedStreamTools.writeGzippedCompoundToOutputStream(nbttagcompound, fileoutputstream);
fileoutputstream.close();
if (file.exists()) {
file.delete();
}
file1.renameTo(file);
WorldInfo worldinfo1 = world.func_22144_v();
worldinfo1.func_22297_b(worldinfo1.func_22306_g() + file.length());
} catch (Exception exception) {
exception.printStackTrace();
}
}
public void func_814_a() {
}
public void saveExtraData() {
}
public void saveExtraChunkData(World world, Chunk chunk) {
}
private File saveDir;
private boolean createIfNecessary;
}

View File

@ -1,4 +1,4 @@
package net.minecraft.src; package net.lax1dude.eaglercraft.anvil;
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html // Jad home page: http://www.kpdus.com/jad.html

View File

@ -1,4 +1,4 @@
package net.minecraft.src; package net.lax1dude.eaglercraft.anvil;
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html // Jad home page: http://www.kpdus.com/jad.html

View File

@ -1,4 +1,4 @@
package net.minecraft.src; package net.lax1dude.eaglercraft.anvil;
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html // Jad home page: http://www.kpdus.com/jad.html
@ -6,6 +6,14 @@ package net.minecraft.src;
import java.io.*; import java.io.*;
import net.lax1dude.eaglercraft.beta.EaglercraftChunkLoader;
import net.minecraft.src.Chunk;
import net.minecraft.src.CompressedStreamTools;
import net.minecraft.src.IChunkLoader;
import net.minecraft.src.NBTTagCompound;
import net.minecraft.src.World;
import net.minecraft.src.WorldInfo;
public class McRegionChunkLoader implements IChunkLoader { public class McRegionChunkLoader implements IChunkLoader {
public McRegionChunkLoader(File file) { public McRegionChunkLoader(File file) {
@ -36,7 +44,7 @@ public class McRegionChunkLoader implements IChunkLoader {
.append(" is missing block data, skipping").toString()); .append(" is missing block data, skipping").toString());
return null; return null;
} }
Chunk chunk = ChunkLoader.loadChunkIntoWorldFromCompound(world, nbttagcompound.getCompoundTag("Level")); Chunk chunk = EaglercraftChunkLoader.loadChunkIntoWorldFromCompound(world, nbttagcompound.getCompoundTag("Level"));
if (!chunk.isAtLocation(i, j)) { if (!chunk.isAtLocation(i, j)) {
System.out.println((new StringBuilder()).append("Chunk file at ").append(i).append(",").append(j) System.out.println((new StringBuilder()).append("Chunk file at ").append(i).append(",").append(j)
.append(" is in the wrong location; relocating. (Expected ").append(i).append(", ").append(j) .append(" is in the wrong location; relocating. (Expected ").append(i).append(", ").append(j)
@ -44,7 +52,7 @@ public class McRegionChunkLoader implements IChunkLoader {
.toString()); .toString());
nbttagcompound.setInteger("xPos", i); nbttagcompound.setInteger("xPos", i);
nbttagcompound.setInteger("zPos", j); nbttagcompound.setInteger("zPos", j);
chunk = ChunkLoader.loadChunkIntoWorldFromCompound(world, nbttagcompound.getCompoundTag("Level")); chunk = EaglercraftChunkLoader.loadChunkIntoWorldFromCompound(world, nbttagcompound.getCompoundTag("Level"));
} }
return chunk; return chunk;
} }
@ -57,7 +65,7 @@ public class McRegionChunkLoader implements IChunkLoader {
NBTTagCompound nbttagcompound = new NBTTagCompound(); NBTTagCompound nbttagcompound = new NBTTagCompound();
NBTTagCompound nbttagcompound1 = new NBTTagCompound(); NBTTagCompound nbttagcompound1 = new NBTTagCompound();
nbttagcompound.setTag("Level", nbttagcompound1); nbttagcompound.setTag("Level", nbttagcompound1);
ChunkLoader.storeChunkInCompound(chunk, world, nbttagcompound1); EaglercraftChunkLoader.storeChunkInCompound(chunk, world, nbttagcompound1);
CompressedStreamTools.func_1139_a(nbttagcompound, dataoutputstream); CompressedStreamTools.func_1139_a(nbttagcompound, dataoutputstream);
dataoutputstream.close(); dataoutputstream.close();
WorldInfo worldinfo = world.func_22144_v(); WorldInfo worldinfo = world.func_22144_v();

View File

@ -1,4 +1,4 @@
package net.minecraft.src; package net.lax1dude.eaglercraft.anvil;
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html // Jad home page: http://www.kpdus.com/jad.html

View File

@ -1,4 +1,4 @@
package net.minecraft.src; package net.lax1dude.eaglercraft.anvil;
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html // Jad home page: http://www.kpdus.com/jad.html

View File

@ -1,4 +1,4 @@
package net.minecraft.src; package net.lax1dude.eaglercraft.anvil;
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html // Jad home page: http://www.kpdus.com/jad.html

View File

@ -1,4 +1,4 @@
package net.minecraft.src; package net.lax1dude.eaglercraft.anvil;
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html // Jad home page: http://www.kpdus.com/jad.html
@ -8,17 +8,23 @@ import java.io.*;
import java.util.*; import java.util.*;
import java.util.zip.GZIPInputStream; import java.util.zip.GZIPInputStream;
import net.minecraft.src.IProgressUpdate;
import net.minecraft.src.ISaveHandler;
import net.minecraft.src.MathHelper;
import net.minecraft.src.SaveFormatComparator;
import net.minecraft.src.WorldInfo;
public class SaveConverterMcRegion extends SaveFormatOld { public class SaveConverterMcRegion extends SaveFormatOld {
public SaveConverterMcRegion(File file) { public SaveConverterMcRegion(File file) {
super(file); super(file);
} }
public String func_22178_a() { public String formatName() {
return "Scaevolus' McRegion"; return "Scaevolus' McRegion";
} }
public List func_22176_b() { public List getWorldList() {
ArrayList arraylist = new ArrayList(); ArrayList arraylist = new ArrayList();
File afile[] = field_22180_a.listFiles(); File afile[] = field_22180_a.listFiles();
File afile1[] = afile; File afile1[] = afile;
@ -29,7 +35,7 @@ public class SaveConverterMcRegion extends SaveFormatOld {
continue; continue;
} }
String s = file.getName(); String s = file.getName();
WorldInfo worldinfo = func_22173_b(s); WorldInfo worldinfo = getWorldInfoForWorld(s);
if (worldinfo == null) { if (worldinfo == null) {
continue; continue;
} }
@ -44,20 +50,20 @@ public class SaveConverterMcRegion extends SaveFormatOld {
return arraylist; return arraylist;
} }
public void func_22177_c() { public void flushCache() {
RegionFileCache.func_22192_a(); RegionFileCache.func_22192_a();
} }
public ISaveHandler func_22174_a(String s, boolean flag) { public ISaveHandler loadWorldHandler(String s, boolean flag) {
return new SaveOldDir(field_22180_a, s, flag); return new SaveOldDir(field_22180_a, s, flag);
} }
public boolean func_22175_a(String s) { public boolean worldNeedsConvert_maybe(String s) {
WorldInfo worldinfo = func_22173_b(s); WorldInfo worldinfo = getWorldInfoForWorld(s);
return worldinfo != null && worldinfo.func_22296_k() == 0; return worldinfo != null && worldinfo.func_22296_k() == 0;
} }
public boolean func_22171_a(String s, IProgressUpdate iprogressupdate) { public boolean convertSave(String s, IProgressUpdate iprogressupdate) {
iprogressupdate.setLoadingProgress(0); iprogressupdate.setLoadingProgress(0);
ArrayList arraylist = new ArrayList(); ArrayList arraylist = new ArrayList();
ArrayList arraylist1 = new ArrayList(); ArrayList arraylist1 = new ArrayList();
@ -74,10 +80,10 @@ public class SaveConverterMcRegion extends SaveFormatOld {
System.out.println((new StringBuilder()).append("Total conversion count is ").append(i).toString()); System.out.println((new StringBuilder()).append("Total conversion count is ").append(i).toString());
func_22181_a(file, arraylist, 0, i, iprogressupdate); func_22181_a(file, arraylist, 0, i, iprogressupdate);
func_22181_a(file1, arraylist2, arraylist.size(), i, iprogressupdate); func_22181_a(file1, arraylist2, arraylist.size(), i, iprogressupdate);
WorldInfo worldinfo = func_22173_b(s); WorldInfo worldinfo = getWorldInfoForWorld(s);
worldinfo.func_22289_d(19132); worldinfo.func_22289_d(19132);
ISaveHandler isavehandler = func_22174_a(s, false); ISaveHandler isavehandler = loadWorldHandler(s, false);
isavehandler.func_22152_a(worldinfo); isavehandler.saveWorldInfo(worldinfo);
func_22182_a(arraylist1, arraylist.size() + arraylist2.size(), i, iprogressupdate); func_22182_a(arraylist1, arraylist.size() + arraylist2.size(), i, iprogressupdate);
if (file1.exists()) { if (file1.exists()) {
func_22182_a(arraylist3, arraylist.size() + arraylist2.size() + arraylist1.size(), i, iprogressupdate); func_22182_a(arraylist3, arraylist.size() + arraylist2.size() + arraylist1.size(), i, iprogressupdate);

View File

@ -1,4 +1,4 @@
package net.minecraft.src; package net.lax1dude.eaglercraft.anvil;
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html // Jad home page: http://www.kpdus.com/jad.html
@ -8,6 +8,14 @@ import java.io.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import net.minecraft.src.CompressedStreamTools;
import net.minecraft.src.IProgressUpdate;
import net.minecraft.src.ISaveFormat;
import net.minecraft.src.ISaveHandler;
import net.minecraft.src.NBTTagCompound;
import net.minecraft.src.SaveFormatComparator;
import net.minecraft.src.WorldInfo;
public class SaveFormatOld implements ISaveFormat { public class SaveFormatOld implements ISaveFormat {
public SaveFormatOld(File file) { public SaveFormatOld(File file) {
@ -17,15 +25,15 @@ public class SaveFormatOld implements ISaveFormat {
field_22180_a = file; field_22180_a = file;
} }
public String func_22178_a() { public String formatName() {
return "Old Format"; return "Old Format";
} }
public List func_22176_b() { public List getWorldList() {
ArrayList arraylist = new ArrayList(); ArrayList arraylist = new ArrayList();
for (int i = 0; i < 5; i++) { for (int i = 0; i < 5; i++) {
String s = (new StringBuilder()).append("World").append(i + 1).toString(); String s = (new StringBuilder()).append("World").append(i + 1).toString();
WorldInfo worldinfo = func_22173_b(s); WorldInfo worldinfo = getWorldInfoForWorld(s);
if (worldinfo != null) { if (worldinfo != null) {
arraylist.add( arraylist.add(
new SaveFormatComparator(s, "", worldinfo.func_22301_l(), worldinfo.func_22306_g(), false)); new SaveFormatComparator(s, "", worldinfo.func_22301_l(), worldinfo.func_22306_g(), false));
@ -35,10 +43,10 @@ public class SaveFormatOld implements ISaveFormat {
return arraylist; return arraylist;
} }
public void func_22177_c() { public void flushCache() {
} }
public WorldInfo func_22173_b(String s) { public WorldInfo getWorldInfoForWorld(String s) {
File file = new File(field_22180_a, s); File file = new File(field_22180_a, s);
if (!file.exists()) { if (!file.exists()) {
return null; return null;
@ -56,7 +64,7 @@ public class SaveFormatOld implements ISaveFormat {
return null; return null;
} }
public void func_22170_a(String s, String s1) { public void renameWorldData(String s, String s1) {
File file = new File(field_22180_a, s); File file = new File(field_22180_a, s);
if (!file.exists()) { if (!file.exists()) {
return; return;
@ -74,7 +82,7 @@ public class SaveFormatOld implements ISaveFormat {
} }
} }
public void func_22172_c(String s) { public void deleteWorldByDirectory(String s) {
File file = new File(field_22180_a, s); File file = new File(field_22180_a, s);
if (!file.exists()) { if (!file.exists()) {
return; return;
@ -95,15 +103,15 @@ public class SaveFormatOld implements ISaveFormat {
} }
public ISaveHandler func_22174_a(String s, boolean flag) { public ISaveHandler loadWorldHandler(String s, boolean flag) {
return new SaveHandler(field_22180_a, s, flag); return new SaveHandler(field_22180_a, s, flag);
} }
public boolean func_22175_a(String s) { public boolean worldNeedsConvert_maybe(String s) {
return false; return false;
} }
public boolean func_22171_a(String s, IProgressUpdate iprogressupdate) { public boolean convertSave(String s, IProgressUpdate iprogressupdate) {
return false; return false;
} }

View File

@ -1,4 +1,4 @@
package net.minecraft.src; package net.lax1dude.eaglercraft.anvil;
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html // Jad home page: http://www.kpdus.com/jad.html
@ -8,6 +8,15 @@ import java.io.*;
import java.util.List; import java.util.List;
import java.util.logging.Logger; import java.util.logging.Logger;
import net.minecraft.src.CompressedStreamTools;
import net.minecraft.src.IChunkLoader;
import net.minecraft.src.ISaveHandler;
import net.minecraft.src.MinecraftException;
import net.minecraft.src.NBTTagCompound;
import net.minecraft.src.WorldInfo;
import net.minecraft.src.WorldProvider;
import net.minecraft.src.WorldProviderHell;
public class SaveHandler implements ISaveHandler { public class SaveHandler implements ISaveHandler {
public SaveHandler(File file, String s, boolean flag) { public SaveHandler(File file, String s, boolean flag) {
@ -39,7 +48,7 @@ public class SaveHandler implements ISaveHandler {
return field_22155_b; return field_22155_b;
} }
public void func_22150_b() { public void checkSessionLock() {
try { try {
File file = new File(field_22155_b, "session.lock"); File file = new File(field_22155_b, "session.lock");
DataInputStream datainputstream = new DataInputStream(new FileInputStream(file)); DataInputStream datainputstream = new DataInputStream(new FileInputStream(file));
@ -55,7 +64,7 @@ public class SaveHandler implements ISaveHandler {
} }
} }
public IChunkLoader func_22149_a(WorldProvider worldprovider) { public IChunkLoader getChunkLoader(WorldProvider worldprovider) {
if (worldprovider instanceof WorldProviderHell) { if (worldprovider instanceof WorldProviderHell) {
File file = new File(field_22155_b, "DIM-1"); File file = new File(field_22155_b, "DIM-1");
file.mkdirs(); file.mkdirs();
@ -65,7 +74,7 @@ public class SaveHandler implements ISaveHandler {
} }
} }
public WorldInfo func_22151_c() { public WorldInfo getWorldInfo() {
File file = new File(field_22155_b, "level.dat"); File file = new File(field_22155_b, "level.dat");
if (file.exists()) { if (file.exists()) {
try { try {
@ -79,7 +88,7 @@ public class SaveHandler implements ISaveHandler {
return null; return null;
} }
public void func_22148_a(WorldInfo worldinfo, List list) { public void saveWorldAndPlayer(WorldInfo worldinfo, List list) {
NBTTagCompound nbttagcompound = worldinfo.func_22305_a(list); NBTTagCompound nbttagcompound = worldinfo.func_22305_a(list);
NBTTagCompound nbttagcompound1 = new NBTTagCompound(); NBTTagCompound nbttagcompound1 = new NBTTagCompound();
nbttagcompound1.setTag("Data", nbttagcompound); nbttagcompound1.setTag("Data", nbttagcompound);
@ -104,7 +113,7 @@ public class SaveHandler implements ISaveHandler {
} }
} }
public void func_22152_a(WorldInfo worldinfo) { public void saveWorldInfo(WorldInfo worldinfo) {
NBTTagCompound nbttagcompound = worldinfo.func_22299_a(); NBTTagCompound nbttagcompound = worldinfo.func_22299_a();
NBTTagCompound nbttagcompound1 = new NBTTagCompound(); NBTTagCompound nbttagcompound1 = new NBTTagCompound();
nbttagcompound1.setTag("Data", nbttagcompound); nbttagcompound1.setTag("Data", nbttagcompound);

View File

@ -0,0 +1,35 @@
package net.lax1dude.eaglercraft.anvil;
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) braces deadcode
import java.util.List;
import net.minecraft.src.IChunkLoader;
import net.minecraft.src.ISaveHandler;
import net.minecraft.src.WorldInfo;
import net.minecraft.src.WorldProvider;
public class SaveHandlerMP implements ISaveHandler {
public SaveHandlerMP() {
}
public WorldInfo getWorldInfo() {
return null;
}
public void checkSessionLock() {
}
public IChunkLoader getChunkLoader(WorldProvider worldprovider) {
return null;
}
public void saveWorldAndPlayer(WorldInfo worldinfo, List list) {
}
public void saveWorldInfo(WorldInfo worldinfo) {
}
}

View File

@ -1,4 +1,4 @@
package net.minecraft.src; package net.lax1dude.eaglercraft.anvil;
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html // Jad home page: http://www.kpdus.com/jad.html
@ -7,13 +7,18 @@ package net.minecraft.src;
import java.io.File; import java.io.File;
import java.util.List; import java.util.List;
import net.minecraft.src.IChunkLoader;
import net.minecraft.src.WorldInfo;
import net.minecraft.src.WorldProvider;
import net.minecraft.src.WorldProviderHell;
public class SaveOldDir extends SaveHandler { public class SaveOldDir extends SaveHandler {
public SaveOldDir(File file, String s, boolean flag) { public SaveOldDir(File file, String s, boolean flag) {
super(file, s, flag); super(file, s, flag);
} }
public IChunkLoader func_22149_a(WorldProvider worldprovider) { public IChunkLoader getChunkLoader(WorldProvider worldprovider) {
File file = func_22153_a(); File file = func_22153_a();
if (worldprovider instanceof WorldProviderHell) { if (worldprovider instanceof WorldProviderHell) {
File file1 = new File(file, "DIM-1"); File file1 = new File(file, "DIM-1");
@ -24,8 +29,8 @@ public class SaveOldDir extends SaveHandler {
} }
} }
public void func_22148_a(WorldInfo worldinfo, List list) { public void saveWorldAndPlayer(WorldInfo worldinfo, List list) {
worldinfo.func_22289_d(19132); worldinfo.func_22289_d(19132);
super.func_22148_a(worldinfo, list); super.saveWorldAndPlayer(worldinfo, list);
} }
} }

View File

@ -0,0 +1,60 @@
package net.lax1dude.eaglercraft.beta;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.nio.charset.Charset;
import com.jcraft.jzlib.Deflater;
import com.jcraft.jzlib.DeflaterOutputStream;
import net.lax1dude.eaglercraft.SHA1Digest;
public class EPKCompiler {
private final ByteArrayOutputStream osb = new ByteArrayOutputStream();
private DataOutputStream os;
private Deflater d;
private final SHA1Digest dig = new SHA1Digest();
public EPKCompiler(String name) {
try {
d = new Deflater(9);
os = new DataOutputStream(osb);
os.write("EAGPKG!!".getBytes(Charset.forName("UTF-8")));
os.writeUTF("\n\n # eaglercraft package file - " + name + "\n # eagler eagler eagler eagler eagler eagler eagler\n\n");
d = new Deflater(9);
os = new DataOutputStream(new DeflaterOutputStream(osb, d));
}catch(Throwable t) {
throw new RuntimeException("this happened somehow", t);
}
}
public void append(String name, byte[] dat) {
try {
os.writeUTF("<file>");
os.writeUTF(name);
byte[] v = dat;
dig.update(v, 0, v.length);
byte[] final_ = new byte[20];
dig.doFinal(final_, 0);
os.write(final_);
os.writeInt(v.length);
os.write(v);
os.writeUTF("</file>");
}catch(Throwable t) {
throw new RuntimeException("this happened somehow", t);
}
}
public byte[] complete() {
try {
os.writeUTF(" end");
os.flush();
os.close();
return osb.toByteArray();
}catch(Throwable t) {
throw new RuntimeException("this happened somehow", t);
}
}
}

View File

@ -0,0 +1,63 @@
package net.lax1dude.eaglercraft.beta;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Arrays;
import com.jcraft.jzlib.InflaterInputStream;
import net.lax1dude.eaglercraft.SHA1Digest;
public class EPKDecompiler {
public static class FileEntry {
public final String name;
public final byte[] data;
protected FileEntry(String name, byte[] data) {
this.name = name;
this.data = data;
}
}
private final ByteArrayInputStream in2;
private DataInputStream in;
private SHA1Digest dg = new SHA1Digest();
private boolean isFinished = false;
public EPKDecompiler(byte[] data) throws IOException {
in2 = new ByteArrayInputStream(data);
in = new DataInputStream(in2);
byte[] header = new byte[8];
in.read(header);
if(!"EAGPKG!!".equals(new String(header, Charset.forName("UTF-8")))) throw new IOException("invalid epk file");
in.readUTF();
in = new DataInputStream(new InflaterInputStream(in2));
}
public FileEntry readFile() throws IOException {
if(isFinished) {
return null;
}
String s = in.readUTF();
if(s.equals(" end")) {
isFinished = true;
return null;
}else if(!s.equals("<file>")) {
throw new IOException("invalid epk file");
}
String path = in.readUTF();
byte[] digest = new byte[20];
byte[] digest2 = new byte[20];
in.read(digest);
int len = in.readInt();
byte[] file = new byte[len];
in.read(file);
dg.update(file, 0, len); dg.doFinal(digest2, 0);
if(!Arrays.equals(digest, digest2)) throw new IOException("invalid file hash for "+path);
if(!"</file>".equals(in.readUTF())) throw new IOException("invalid epk file");
return new FileEntry(path, file);
}
}

View File

@ -1,148 +1,104 @@
package net.minecraft.src; package net.lax1dude.eaglercraft.beta;
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html import java.io.ByteArrayInputStream;
// Decompiler options: packimports(3) braces deadcode import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.io.*; import net.lax1dude.eaglercraft.EaglerAdapter;
import java.util.*; import net.minecraft.src.Chunk;
import net.minecraft.src.Entity;
import net.minecraft.src.EntityList;
import net.minecraft.src.IChunkLoader;
import net.minecraft.src.NBTBase;
import net.minecraft.src.NBTTagCompound;
import net.minecraft.src.NBTTagList;
import net.minecraft.src.NibbleArray;
import net.minecraft.src.TileEntity;
import net.minecraft.src.World;
public class ChunkLoader implements IChunkLoader { public class EaglercraftChunkLoader implements IChunkLoader {
public ChunkLoader(File file, boolean flag) { public final String directory;
saveDir = file;
createIfNecessary = flag; public EaglercraftChunkLoader(String dir) {
this.directory = dir;
} }
private File chunkFileForXZ(int i, int j) { @Override
String s = (new StringBuilder()).append("c.").append(Integer.toString(i, 36)).append(".") public Chunk loadChunk(World world, int x, int z) {
.append(Integer.toString(j, 36)).append(".dat").toString(); String name = getChunkPath(x, z);
String s1 = Integer.toString(i & 0x3f, 36); String path = directory + "/" + name;
String s2 = Integer.toString(j & 0x3f, 36); byte[] dat = EaglerAdapter.readFile(path);
File file = new File(saveDir, s1); if(dat != null) {
if (!file.exists()) {
if (createIfNecessary) {
file.mkdir();
} else {
return null;
}
}
file = new File(file, s2);
if (!file.exists()) {
if (createIfNecessary) {
file.mkdir();
} else {
return null;
}
}
file = new File(file, s);
if (!file.exists() && !createIfNecessary) {
return null;
} else {
return file;
}
}
public Chunk loadChunk(World world, int i, int j) {
File file = chunkFileForXZ(i, j);
if (file != null && file.exists()) {
try { try {
FileInputStream fileinputstream = new FileInputStream(file); NBTTagCompound nbt = (NBTTagCompound) NBTBase.readTag(new DataInputStream(new ByteArrayInputStream(dat)));
NBTTagCompound nbttagcompound = CompressedStreamTools.func_1138_a(fileinputstream); int xx = nbt.getInteger("xPos");
if (!nbttagcompound.hasKey("Level")) { int zz = nbt.getInteger("zPos");
System.out.println((new StringBuilder()).append("Chunk file at ").append(i).append(",").append(j) if(x != xx || z != zz) {
.append(" is missing level data, skipping").toString()); String name2 = getChunkPath(xx, zz);
System.err.println("The chunk file '" + name + "' was supposed to be at [" + x + ", " + z + "], but the file contained a chunk from [" + xx + ", " + zz +
"]. It's data will be moved to file '" + name2 + "', and a new empty chunk will be created for file '" + name + "' for [" + x + ", " + z + "]");
EaglerAdapter.renameFile(path, directory + "/" + name2);
return null; return null;
} }
if (!nbttagcompound.getCompoundTag("Level").hasKey("Blocks")) {
System.out.println((new StringBuilder()).append("Chunk file at ").append(i).append(",").append(j) return loadChunkIntoWorldFromCompound(world, nbt);
.append(" is missing block data, skipping").toString()); } catch (IOException e) {
return null; System.err.println("Corrupt chunk '" + name + "' was found at: [" + x + ", " + z + "]");
} System.err.println("The file will be deleted");
Chunk chunk = loadChunkIntoWorldFromCompound(world, nbttagcompound.getCompoundTag("Level")); EaglerAdapter.deleteFile(path);
if (!chunk.isAtLocation(i, j)) { e.printStackTrace();
System.out.println((new StringBuilder()).append("Chunk file at ").append(i).append(",").append(j) return null;
.append(" is in the wrong location; relocating. (Expected ").append(i).append(", ")
.append(j).append(", got ").append(chunk.xPosition).append(", ").append(chunk.zPosition)
.append(")").toString());
nbttagcompound.setInteger("xPos", i);
nbttagcompound.setInteger("zPos", j);
chunk = loadChunkIntoWorldFromCompound(world, nbttagcompound.getCompoundTag("Level"));
}
return chunk;
} catch (Exception exception) {
exception.printStackTrace();
} }
}else {
return null;
} }
return null;
} }
@Override
public void saveChunk(World world, Chunk chunk) { public void saveChunk(World world, Chunk chunk) {
world.checkSessionLock(); NBTTagCompound toSave = new NBTTagCompound();
File file = chunkFileForXZ(chunk.xPosition, chunk.zPosition); storeChunkInCompound(chunk, world, toSave);
if (file.exists()) { ByteArrayOutputStream bao = new ByteArrayOutputStream(98304);
WorldInfo worldinfo = world.func_22144_v();
worldinfo.func_22297_b(worldinfo.func_22306_g() - file.length());
}
try { try {
File file1 = new File(saveDir, "tmp_chunk.dat"); NBTBase.writeTag(toSave, new DataOutputStream(bao));
FileOutputStream fileoutputstream = new FileOutputStream(file1); } catch (IOException e) {
NBTTagCompound nbttagcompound = new NBTTagCompound(); System.err.println("Failed to serialize chunk at [" + chunk.xPosition + ", " + chunk.zPosition + "] to byte array");
NBTTagCompound nbttagcompound1 = new NBTTagCompound(); e.printStackTrace();
nbttagcompound.setTag("Level", nbttagcompound1); return;
storeChunkInCompound(chunk, world, nbttagcompound1);
CompressedStreamTools.writeGzippedCompoundToOutputStream(nbttagcompound, fileoutputstream);
fileoutputstream.close();
if (file.exists()) {
file.delete();
}
file1.renameTo(file);
WorldInfo worldinfo1 = world.func_22144_v();
worldinfo1.func_22297_b(worldinfo1.func_22306_g() + file.length());
} catch (Exception exception) {
exception.printStackTrace();
} }
EaglerAdapter.writeFile(directory + "/" + getChunkPath(chunk.xPosition, chunk.zPosition), bao.toByteArray());
} }
public static void storeChunkInCompound(Chunk chunk, World world, NBTTagCompound nbttagcompound) { @Override
world.checkSessionLock(); public void saveExtraChunkData(World world, Chunk chunk) {
nbttagcompound.setInteger("xPos", chunk.xPosition); }
nbttagcompound.setInteger("zPos", chunk.zPosition);
nbttagcompound.setLong("LastUpdate", world.func_22139_r());
nbttagcompound.setByteArray("Blocks", chunk.blocks);
nbttagcompound.setByteArray("Data", chunk.data.data);
nbttagcompound.setByteArray("SkyLight", chunk.skylightMap.data);
nbttagcompound.setByteArray("BlockLight", chunk.blocklightMap.data);
nbttagcompound.setByteArray("HeightMap", chunk.heightMap);
nbttagcompound.setBoolean("TerrainPopulated", chunk.isTerrainPopulated);
chunk.hasEntities = false;
NBTTagList nbttaglist = new NBTTagList();
label0: for (int i = 0; i < chunk.entities.length; i++) {
Iterator iterator = chunk.entities[i].iterator();
do {
if (!iterator.hasNext()) {
continue label0;
}
Entity entity = (Entity) iterator.next();
chunk.hasEntities = true;
NBTTagCompound nbttagcompound1 = new NBTTagCompound();
if (entity.addEntityID(nbttagcompound1)) {
nbttaglist.setTag(nbttagcompound1);
}
} while (true);
}
nbttagcompound.setTag("Entities", nbttaglist); @Override
NBTTagList nbttaglist1 = new NBTTagList(); public void func_814_a() {
NBTTagCompound nbttagcompound2; }
for (Iterator iterator1 = chunk.chunkTileEntityMap.values().iterator(); iterator1.hasNext(); nbttaglist1
.setTag(nbttagcompound2)) {
TileEntity tileentity = (TileEntity) iterator1.next();
nbttagcompound2 = new NBTTagCompound();
tileentity.writeToNBT(nbttagcompound2);
}
nbttagcompound.setTag("TileEntities", nbttaglist1); @Override
public void saveExtraData() {
}
public static final String CHUNK_CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static String getChunkPath(int x, int z) {
int unsignedX = x + 30233088;
int unsignedZ = z + 30233088;
int radix = CHUNK_CHARS.length();
char[] path = new char[10];
for(int i = 0; i < 5; ++i) {
path[i * 2] = CHUNK_CHARS.charAt(unsignedX % radix);
unsignedX /= radix;
path[i * 2 + 1] = CHUNK_CHARS.charAt(unsignedZ % radix);
unsignedZ /= radix;
}
return new String(path);
} }
public static Chunk loadChunkIntoWorldFromCompound(World world, NBTTagCompound nbttagcompound) { public static Chunk loadChunkIntoWorldFromCompound(World world, NBTTagCompound nbttagcompound) {
@ -193,15 +149,44 @@ public class ChunkLoader implements IChunkLoader {
return chunk; return chunk;
} }
public void func_814_a() { public static void storeChunkInCompound(Chunk chunk, World world, NBTTagCompound nbttagcompound) {
nbttagcompound.setInteger("xPos", chunk.xPosition);
nbttagcompound.setInteger("zPos", chunk.zPosition);
nbttagcompound.setLong("LastUpdate", world.func_22139_r());
nbttagcompound.setByteArray("Blocks", chunk.blocks);
nbttagcompound.setByteArray("Data", chunk.data.data);
nbttagcompound.setByteArray("SkyLight", chunk.skylightMap.data);
nbttagcompound.setByteArray("BlockLight", chunk.blocklightMap.data);
nbttagcompound.setByteArray("HeightMap", chunk.heightMap);
nbttagcompound.setBoolean("TerrainPopulated", chunk.isTerrainPopulated);
chunk.hasEntities = false;
NBTTagList nbttaglist = new NBTTagList();
label0: for (int i = 0; i < chunk.entities.length; i++) {
Iterator iterator = chunk.entities[i].iterator();
do {
if (!iterator.hasNext()) {
continue label0;
}
Entity entity = (Entity) iterator.next();
chunk.hasEntities = true;
NBTTagCompound nbttagcompound1 = new NBTTagCompound();
if (entity.addEntityID(nbttagcompound1)) {
nbttaglist.setTag(nbttagcompound1);
}
} while (true);
}
nbttagcompound.setTag("Entities", nbttaglist);
NBTTagList nbttaglist1 = new NBTTagList();
NBTTagCompound nbttagcompound2;
for (Iterator iterator1 = chunk.chunkTileEntityMap.values().iterator(); iterator1.hasNext(); nbttaglist1
.setTag(nbttagcompound2)) {
TileEntity tileentity = (TileEntity) iterator1.next();
nbttagcompound2 = new NBTTagCompound();
tileentity.writeToNBT(nbttagcompound2);
}
nbttagcompound.setTag("TileEntities", nbttaglist1);
} }
public void saveExtraData() {
}
public void saveExtraChunkData(World world, Chunk chunk) {
}
private File saveDir;
private boolean createIfNecessary;
} }

View File

@ -0,0 +1,86 @@
package net.lax1dude.eaglercraft.beta;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.List;
import net.lax1dude.eaglercraft.EaglerAdapter;
import net.minecraft.src.IChunkLoader;
import net.minecraft.src.ISaveHandler;
import net.minecraft.src.NBTBase;
import net.minecraft.src.NBTTagCompound;
import net.minecraft.src.WorldInfo;
import net.minecraft.src.WorldProvider;
import net.minecraft.src.WorldProviderHell;
public class EaglercraftSaveHandler implements ISaveHandler {
public final String directory;
public EaglercraftSaveHandler(String dir) {
this.directory = dir;
}
@Override
public WorldInfo getWorldInfo() {
byte[] file = EaglerAdapter.readFile(directory + "/lvl");
if(file != null) {
try {
NBTBase nbt = NBTBase.readTag(new DataInputStream(new ByteArrayInputStream(file)));
if(nbt instanceof NBTTagCompound) {
return new WorldInfo((NBTTagCompound)nbt);
}
} catch (IOException e) {
System.err.println("Failed to load world data for '" + directory + "/lvl'");
e.printStackTrace();
}
}
return null;
}
@Override
public void checkSessionLock() {
}
@Override
public IChunkLoader getChunkLoader(WorldProvider worldprovider) {
if(worldprovider instanceof WorldProviderHell) {
return new EaglercraftChunkLoader(directory + "/c1");
}else {
return new EaglercraftChunkLoader(directory + "/c0");
}
}
@Override
public void saveWorldAndPlayer(WorldInfo worldinfo, List list) {
ByteArrayOutputStream out = new ByteArrayOutputStream(8192);
DataOutputStream ds = new DataOutputStream(out);
try {
NBTBase.writeTag(worldinfo.func_22305_a(list), ds);
} catch (IOException e) {
System.err.println("Failed to serialize world data for '" + directory + "/lvl'");
e.printStackTrace();
return;
}
EaglerAdapter.writeFile(directory + "/lvl", out.toByteArray());
}
@Override
public void saveWorldInfo(WorldInfo worldinfo) {
ByteArrayOutputStream out = new ByteArrayOutputStream(8192);
DataOutputStream ds = new DataOutputStream(out);
try {
NBTBase.writeTag(worldinfo.func_22299_a(), ds);
} catch (IOException e) {
System.err.println("Failed to serialize world data for '" + directory + "/lvl'");
e.printStackTrace();
return;
}
EaglerAdapter.writeFile(directory + "/lvl", out.toByteArray());
}
}

View File

@ -0,0 +1,140 @@
package net.lax1dude.eaglercraft.beta;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import net.lax1dude.eaglercraft.EaglerAdapter;
import net.lax1dude.eaglercraft.adapter.EaglerAdapterImpl2.FileEntry;
import net.minecraft.src.IProgressUpdate;
import net.minecraft.src.ISaveFormat;
import net.minecraft.src.ISaveHandler;
import net.minecraft.src.MathHelper;
import net.minecraft.src.NBTBase;
import net.minecraft.src.NBTTagCompound;
import net.minecraft.src.SaveFormatComparator;
import net.minecraft.src.WorldInfo;
public class EaglercraftSaveManager implements ISaveFormat {
public final String directory;
public EaglercraftSaveManager(String dir) {
this.directory = dir;
}
@Override
public String formatName() {
return "Eaglercraft VFS";
}
@Override
public ISaveHandler loadWorldHandler(String s, boolean flag) {
return new EaglercraftSaveHandler(directory + "/" + s);
}
@Override
public List getWorldList() {
ArrayList<SaveFormatComparator> lst = new ArrayList<>();
EaglerAdapter.listFilesAndDirectories(directory).forEach(new Consumer<FileEntry>() {
@Override
public void accept(FileEntry t) {
if(!t.isDirectory) {
return;
}
String folderName = t.getName();
String dir = t.path;
System.out.println(dir);
byte[] lvl = EaglerAdapter.readFile(dir + "/lvl");
if(lvl != null) {
try {
NBTBase nbt = NBTBase.readTag(new DataInputStream(new ByteArrayInputStream(lvl)));
if(nbt instanceof NBTTagCompound) {
WorldInfo w = new WorldInfo((NBTTagCompound)nbt);
String s1 = w.getWorldName();
if (s1 == null || MathHelper.func_22282_a(s1)) {
s1 = folderName;
}
lst.add(new SaveFormatComparator(folderName, s1, w.func_22301_l(), w.func_22306_g(), false));
}else {
throw new IOException("file '" + dir + "/lvl' does not contain an NBTTagCompound");
}
}catch(IOException e) {
System.err.println("Failed to load world data for '" + directory + "/lvl'");
System.err.println("It will be kept for future recovery");
e.printStackTrace();
}
}
}
});
return lst;
}
@Override
public void flushCache() {
}
@Override
public WorldInfo getWorldInfoForWorld(String s) {
byte[] lvl = EaglerAdapter.readFile(directory + "/" + s + "/lvl");
if(lvl != null) {
try {
NBTBase nbt = NBTBase.readTag(new DataInputStream(new ByteArrayInputStream(lvl)));
if(nbt instanceof NBTTagCompound) {
return new WorldInfo((NBTTagCompound)nbt);
}else {
throw new IOException("file '" + directory + "/" + s + "/lvl' does not contain an NBTTagCompound");
}
}catch(IOException e) {
System.err.println("Failed to load world data for '" + directory + "/lvl'");
System.err.println("It will be kept for future recovery");
e.printStackTrace();
}
}
return null;
}
@Override
public void deleteWorldByDirectory(String s) {
FilesystemUtils.recursiveDeleteDirectory(directory + "/" + s);
}
@Override
public boolean worldNeedsConvert_maybe(String s) {
return false;
}
@Override
public boolean convertSave(String s, IProgressUpdate iprogressupdate) {
return false;
}
@Override
public void renameWorldData(String s, String s1) {
byte[] lvl = EaglerAdapter.readFile(directory + "/" + s + "/lvl");
if(lvl != null) {
try {
NBTBase nbt = NBTBase.readTag(new DataInputStream(new ByteArrayInputStream(lvl)));
if(nbt instanceof NBTTagCompound) {
NBTTagCompound w = (NBTTagCompound)nbt;
w.setString("LevelName", s1);
ByteArrayOutputStream out = new ByteArrayOutputStream(lvl.length + 16 + s1.length() * 2); // should be large enough
NBTBase.writeTag(w, new DataOutputStream(out));
EaglerAdapter.writeFile(directory + "/" + s + "/lvl", out.toByteArray());
}else {
throw new IOException("file '" + directory + "/" + s + "/lvl' does not contain an NBTTagCompound");
}
}catch(IOException e) {
System.err.println("Failed to load world data for '" + directory + "/lvl'");
System.err.println("It will be kept for future recovery");
e.printStackTrace();
}
}
}
}

View File

@ -0,0 +1,20 @@
package net.lax1dude.eaglercraft.beta;
import java.util.function.Consumer;
import net.lax1dude.eaglercraft.EaglerAdapter;
import net.lax1dude.eaglercraft.adapter.EaglerAdapterImpl2.FileEntry;
public class FilesystemUtils {
public static void recursiveDeleteDirectory(String dir) {
EaglerAdapter.listFiles(dir, true, true).forEach(new Consumer<FileEntry>() {
@Override
public void accept(FileEntry t) {
EaglerAdapter.deleteFile(t.path);
}
});
EaglerAdapter.deleteFile(dir);
}
}

View File

@ -9,6 +9,7 @@ import java.io.*;
import net.lax1dude.eaglercraft.EaglerAdapter; import net.lax1dude.eaglercraft.EaglerAdapter;
import net.lax1dude.eaglercraft.TextureLocation; import net.lax1dude.eaglercraft.TextureLocation;
import net.lax1dude.eaglercraft.adapter.Tessellator; import net.lax1dude.eaglercraft.adapter.Tessellator;
import net.lax1dude.eaglercraft.beta.EaglercraftSaveManager;
import net.lax1dude.eaglercraft.beta.SingleplayerCommands; import net.lax1dude.eaglercraft.beta.SingleplayerCommands;
import net.minecraft.src.*; import net.minecraft.src.*;
@ -59,7 +60,12 @@ public class Minecraft implements Runnable {
public void startGame() { public void startGame() {
RenderManager.instance.itemRenderer = new ItemRenderer(this); RenderManager.instance.itemRenderer = new ItemRenderer(this);
mcDataDir = getMinecraftDir(); mcDataDir = getMinecraftDir();
field_22008_V = new SaveConverterMcRegion(new File(mcDataDir, "saves"));
field_22008_V = EaglerAdapter.getConfiguredSaveFormat();
if(field_22008_V == null) {
field_22008_V = new EaglercraftSaveManager("saves");
}
gameSettings = new GameSettings(this, mcDataDir); gameSettings = new GameSettings(this, mcDataDir);
texturePackList = new TexturePackList(this); texturePackList = new TexturePackList(this);
renderEngine = new RenderEngine(texturePackList, gameSettings); renderEngine = new RenderEngine(texturePackList, gameSettings);
@ -767,10 +773,10 @@ public class Minecraft implements Runnable {
public void startWorld(String s, String s1, long l) { public void startWorld(String s, String s1, long l) {
changeWorld1(null); changeWorld1(null);
System.gc(); System.gc();
if (field_22008_V.func_22175_a(s)) { if (field_22008_V.worldNeedsConvert_maybe(s)) {
func_22002_b(s, s1); func_22002_b(s, s1);
} else { } else {
ISaveHandler isavehandler = field_22008_V.func_22174_a(s, false); ISaveHandler isavehandler = field_22008_V.loadWorldHandler(s, false);
World world = new World(isavehandler, s1, l); World world = new World(isavehandler, s1, l);
if (world.isNewWorld) { if (world.isNewWorld) {
changeWorld2(world, "Generating level"); changeWorld2(world, "Generating level");
@ -881,9 +887,9 @@ public class Minecraft implements Runnable {
private void func_22002_b(String s, String s1) { private void func_22002_b(String s, String s1) {
loadingScreen.printText( loadingScreen.printText(
(new StringBuilder()).append("Converting World to ").append(field_22008_V.func_22178_a()).toString()); (new StringBuilder()).append("Converting World to ").append(field_22008_V.formatName()).toString());
loadingScreen.displayLoadingString("This may take a while :)"); loadingScreen.displayLoadingString("This may take a while :)");
field_22008_V.func_22171_a(s, loadingScreen); field_22008_V.convertSave(s, loadingScreen);
startWorld(s, s1, 0L); startWorld(s, s1, 0L);
} }

View File

@ -1,8 +0,0 @@
package net.minecraft.src;
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) braces deadcode
class Empty1 {
}

View File

@ -50,7 +50,7 @@ public class GuiCreateWorld extends GuiScreen {
field_22132_k = "World"; field_22132_k = "World";
} }
for (ISaveFormat isaveformat = mc.func_22004_c(); isaveformat for (ISaveFormat isaveformat = mc.func_22004_c(); isaveformat
.func_22173_b(field_22132_k) != null; field_22132_k = (new StringBuilder()).append(field_22132_k) .getWorldInfoForWorld(field_22132_k) != null; field_22132_k = (new StringBuilder()).append(field_22132_k)
.append("-").toString()) { .append("-").toString()) {
} }
} }

View File

@ -29,7 +29,7 @@ public class GuiRenameWorld extends GuiScreen {
controlList.add( controlList.add(
new GuiButton(1, width / 2 - 100, height / 4 + 120 + 12, stringtranslate.translateKey("gui.cancel"))); new GuiButton(1, width / 2 - 100, height / 4 + 120 + 12, stringtranslate.translateKey("gui.cancel")));
ISaveFormat isaveformat = mc.func_22004_c(); ISaveFormat isaveformat = mc.func_22004_c();
WorldInfo worldinfo = isaveformat.func_22173_b(field_22113_i); WorldInfo worldinfo = isaveformat.getWorldInfoForWorld(field_22113_i);
String s = worldinfo.getWorldName(); String s = worldinfo.getWorldName();
field_22114_h = new GuiDisableButton(fontRenderer, width / 2 - 100, 60, 200, 20, s); field_22114_h = new GuiDisableButton(fontRenderer, width / 2 - 100, 60, 200, 20, s);
field_22114_h.field_22082_a = true; field_22114_h.field_22082_a = true;
@ -48,7 +48,7 @@ public class GuiRenameWorld extends GuiScreen {
mc.displayGuiScreen(field_22112_a); mc.displayGuiScreen(field_22112_a);
} else if (guibutton.id == 0) { } else if (guibutton.id == 0) {
ISaveFormat isaveformat = mc.func_22004_c(); ISaveFormat isaveformat = mc.func_22004_c();
isaveformat.func_22170_a(field_22113_i, field_22114_h.func_22071_a().trim()); isaveformat.renameWorldData(field_22113_i, field_22114_h.func_22071_a().trim());
mc.displayGuiScreen(field_22112_a); mc.displayGuiScreen(field_22112_a);
} }
} }

View File

@ -31,7 +31,7 @@ public class GuiSelectWorld extends GuiScreen {
private void func_22084_k() { private void func_22084_k() {
ISaveFormat isaveformat = mc.func_22004_c(); ISaveFormat isaveformat = mc.func_22004_c();
field_22100_m = isaveformat.func_22176_b(); field_22100_m = isaveformat.getWorldList();
Collections.sort(field_22100_m); Collections.sort(field_22100_m);
field_22101_l = -1; field_22101_l = -1;
} }
@ -117,8 +117,8 @@ public class GuiSelectWorld extends GuiScreen {
field_22096_q = false; field_22096_q = false;
if (flag) { if (flag) {
ISaveFormat isaveformat = mc.func_22004_c(); ISaveFormat isaveformat = mc.func_22004_c();
isaveformat.func_22177_c(); isaveformat.flushCache();
isaveformat.func_22172_c(func_22091_c(i)); isaveformat.deleteWorldByDirectory(func_22091_c(i));
func_22084_k(); func_22084_k();
} }
mc.displayGuiScreen(this); mc.displayGuiScreen(this);

View File

@ -8,21 +8,21 @@ import java.util.List;
public interface ISaveFormat { public interface ISaveFormat {
public abstract String func_22178_a(); public abstract String formatName();
public abstract ISaveHandler func_22174_a(String s, boolean flag); public abstract ISaveHandler loadWorldHandler(String s, boolean flag);
public abstract List func_22176_b(); public abstract List getWorldList();
public abstract void func_22177_c(); public abstract void flushCache();
public abstract WorldInfo func_22173_b(String s); public abstract WorldInfo getWorldInfoForWorld(String s);
public abstract void func_22172_c(String s); public abstract void deleteWorldByDirectory(String s);
public abstract void func_22170_a(String s, String s1); public abstract void renameWorldData(String s, String s1);
public abstract boolean func_22175_a(String s); public abstract boolean worldNeedsConvert_maybe(String s);
public abstract boolean func_22171_a(String s, IProgressUpdate iprogressupdate); public abstract boolean convertSave(String s, IProgressUpdate iprogressupdate);
} }

View File

@ -8,13 +8,13 @@ import java.util.List;
public interface ISaveHandler { public interface ISaveHandler {
public abstract WorldInfo func_22151_c(); public abstract WorldInfo getWorldInfo();
public abstract void func_22150_b(); public abstract void checkSessionLock();
public abstract IChunkLoader func_22149_a(WorldProvider worldprovider); public abstract IChunkLoader getChunkLoader(WorldProvider worldprovider);
public abstract void func_22148_a(WorldInfo worldinfo, List list); public abstract void saveWorldAndPlayer(WorldInfo worldinfo, List list);
public abstract void func_22152_a(WorldInfo worldinfo); public abstract void saveWorldInfo(WorldInfo worldinfo);
} }

View File

@ -14,8 +14,7 @@ class PacketCounter {
field_22237_b += i; field_22237_b += i;
} }
PacketCounter(Empty1 empty1) { public PacketCounter(Object wtf) {
this();
} }
private int field_22238_a; private int field_22238_a;

View File

@ -1,30 +0,0 @@
package net.minecraft.src;
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) braces deadcode
import java.util.List;
public class SaveHandlerMP implements ISaveHandler {
public SaveHandlerMP() {
}
public WorldInfo func_22151_c() {
return null;
}
public void func_22150_b() {
}
public IChunkLoader func_22149_a(WorldProvider worldprovider) {
return null;
}
public void func_22148_a(WorldInfo worldinfo, List list) {
}
public void func_22152_a(WorldInfo worldinfo) {
}
}

View File

@ -1,67 +0,0 @@
package net.minecraft.src;
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) braces deadcode
import java.io.File;
import java.net.MalformedURLException;
import java.net.URI;
import java.util.*;
public class SoundPool {
public SoundPool() {
rand = new Random();
nameToSoundPoolEntriesMapping = new HashMap();
allSoundPoolEntries = new ArrayList();
numberOfSoundPoolEntries = 0;
field_1657_b = true;
}
public SoundPoolEntry addSound(String s, File file) {
try {
String s1 = s;
s = s.substring(0, s.indexOf("."));
if (field_1657_b) {
for (; Character.isDigit(s.charAt(s.length() - 1)); s = s.substring(0, s.length() - 1)) {
}
}
s = s.replaceAll("/", ".");
if (!nameToSoundPoolEntriesMapping.containsKey(s)) {
nameToSoundPoolEntriesMapping.put(s, new ArrayList());
}
SoundPoolEntry soundpoolentry = new SoundPoolEntry(s1, file.toURI().toURL());
((List) nameToSoundPoolEntriesMapping.get(s)).add(soundpoolentry);
allSoundPoolEntries.add(soundpoolentry);
numberOfSoundPoolEntries++;
return soundpoolentry;
} catch (MalformedURLException malformedurlexception) {
malformedurlexception.printStackTrace();
throw new RuntimeException(malformedurlexception);
}
}
public SoundPoolEntry getRandomSoundFromSoundPool(String s) {
List list = (List) nameToSoundPoolEntriesMapping.get(s);
if (list == null) {
return null;
} else {
return (SoundPoolEntry) list.get(rand.nextInt(list.size()));
}
}
public SoundPoolEntry getRandomSound() {
if (allSoundPoolEntries.size() == 0) {
return null;
} else {
return (SoundPoolEntry) allSoundPoolEntries.get(rand.nextInt(allSoundPoolEntries.size()));
}
}
private Random rand;
private Map nameToSoundPoolEntriesMapping;
private List allSoundPoolEntries;
public int numberOfSoundPoolEntries;
public boolean field_1657_b;
}

View File

@ -1,18 +0,0 @@
package net.minecraft.src;
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) braces deadcode
import java.net.URL;
public class SoundPoolEntry {
public SoundPoolEntry(String s, URL url) {
soundName = s;
soundUrl = url;
}
public String soundName;
public URL soundUrl;
}

View File

@ -1,28 +0,0 @@
package net.minecraft.src;
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) braces deadcode
import net.minecraft.client.Minecraft;
public class ThreadSleepForever extends Thread {
public ThreadSleepForever(Minecraft minecraft, String s) {
super(s);
mc = minecraft;
setDaemon(true);
start();
}
public void run() {
while (mc.running) {
try {
Thread.sleep(0x7fffffffL);
} catch (InterruptedException interruptedexception) {
}
}
}
final Minecraft mc; /* synthetic field */
}

View File

@ -116,7 +116,7 @@ public class World implements IBlockAccess {
field_1012_M = new ArrayList(); field_1012_M = new ArrayList();
multiplayerWorld = false; multiplayerWorld = false;
field_22147_p = isavehandler; field_22147_p = isavehandler;
worldinfo = isavehandler.func_22151_c(); worldinfo = isavehandler.getWorldInfo();
isNewWorld = worldinfo == null; isNewWorld = worldinfo == null;
if (worldprovider != null) { if (worldprovider != null) {
worldProvider = worldprovider; worldProvider = worldprovider;
@ -150,7 +150,7 @@ public class World implements IBlockAccess {
} }
protected IChunkProvider getChunkProvider() { protected IChunkProvider getChunkProvider() {
IChunkLoader ichunkloader = field_22147_p.func_22149_a(worldProvider); IChunkLoader ichunkloader = field_22147_p.getChunkLoader(worldProvider);
return new ChunkProviderLoadOrGenerate(this, ichunkloader, worldProvider.getChunkProvider()); return new ChunkProviderLoadOrGenerate(this, ichunkloader, worldProvider.getChunkProvider());
} }
@ -213,7 +213,7 @@ public class World implements IBlockAccess {
private void saveLevel() { private void saveLevel() {
checkSessionLock(); checkSessionLock();
field_22147_p.func_22148_a(worldinfo, playerEntities); field_22147_p.saveWorldAndPlayer(worldinfo, playerEntities);
} }
public boolean func_650_a(int i) { public boolean func_650_a(int i) {
@ -1817,7 +1817,7 @@ public class World implements IBlockAccess {
} }
public void checkSessionLock() { public void checkSessionLock() {
field_22147_p.func_22150_b(); field_22147_p.checkSessionLock();
} }
public void setWorldTime(long l) { public void setWorldTime(long l) {

View File

@ -6,6 +6,8 @@ package net.minecraft.src;
import java.util.*; import java.util.*;
import net.lax1dude.eaglercraft.anvil.SaveHandlerMP;
public class WorldClient extends World { public class WorldClient extends World {
public WorldClient(NetClientHandler netclienthandler, long l, int i) { public WorldClient(NetClientHandler netclienthandler, long l, int i) {