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
/eaglercraftbungee/rundir
/lwjgl-rundir/_eagstorage*
/lwjgl-rundir/saves
/lwjgl-rundir/lwjgl_saves
/lwjgl-rundir/filesystem
/lwjgl-rundir/texturepacks
/lwjgl-rundir/options.txt

View File

@ -1,7 +1,10 @@
package net.lax1dude.eaglercraft;
import java.io.File;
import javax.swing.JOptionPane;
import net.lax1dude.eaglercraft.anvil.SaveConverterMcRegion;
import net.minecraft.client.Minecraft;
public class MinecraftMain {
@ -12,6 +15,13 @@ public class MinecraftMain {
JOptionPane.PLAIN_MESSAGE);
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 =
* 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.UnsupportedFlavorException;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@ -29,6 +30,8 @@ import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;
@ -65,9 +68,8 @@ import org.lwjgl.util.glu.GLU;
import de.cuina.fireandfuel.CodecJLayerMP3;
import net.lax1dude.eaglercraft.AssetRepository;
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.minecraft.src.ISaveFormat;
import net.minecraft.src.MathHelper;
import paulscode.sound.SoundSystem;
import paulscode.sound.SoundSystemConfig;
@ -1550,6 +1552,215 @@ public class EaglerAdapterImpl2 {
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.
// 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.
// 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.
// 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.
// 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.
// Jad home page: http://www.kpdus.com/jad.html
@ -6,6 +6,14 @@ package net.minecraft.src;
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 McRegionChunkLoader(File file) {
@ -36,7 +44,7 @@ public class McRegionChunkLoader implements IChunkLoader {
.append(" is missing block data, skipping").toString());
return null;
}
Chunk chunk = ChunkLoader.loadChunkIntoWorldFromCompound(world, nbttagcompound.getCompoundTag("Level"));
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)
@ -44,7 +52,7 @@ public class McRegionChunkLoader implements IChunkLoader {
.toString());
nbttagcompound.setInteger("xPos", i);
nbttagcompound.setInteger("zPos", j);
chunk = ChunkLoader.loadChunkIntoWorldFromCompound(world, nbttagcompound.getCompoundTag("Level"));
chunk = EaglercraftChunkLoader.loadChunkIntoWorldFromCompound(world, nbttagcompound.getCompoundTag("Level"));
}
return chunk;
}
@ -57,7 +65,7 @@ public class McRegionChunkLoader implements IChunkLoader {
NBTTagCompound nbttagcompound = new NBTTagCompound();
NBTTagCompound nbttagcompound1 = new NBTTagCompound();
nbttagcompound.setTag("Level", nbttagcompound1);
ChunkLoader.storeChunkInCompound(chunk, world, nbttagcompound1);
EaglercraftChunkLoader.storeChunkInCompound(chunk, world, nbttagcompound1);
CompressedStreamTools.func_1139_a(nbttagcompound, dataoutputstream);
dataoutputstream.close();
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.
// 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.
// 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.
// 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.
// Jad home page: http://www.kpdus.com/jad.html
@ -8,17 +8,23 @@ import java.io.*;
import java.util.*;
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 SaveConverterMcRegion(File file) {
super(file);
}
public String func_22178_a() {
public String formatName() {
return "Scaevolus' McRegion";
}
public List func_22176_b() {
public List getWorldList() {
ArrayList arraylist = new ArrayList();
File afile[] = field_22180_a.listFiles();
File afile1[] = afile;
@ -29,7 +35,7 @@ public class SaveConverterMcRegion extends SaveFormatOld {
continue;
}
String s = file.getName();
WorldInfo worldinfo = func_22173_b(s);
WorldInfo worldinfo = getWorldInfoForWorld(s);
if (worldinfo == null) {
continue;
}
@ -44,20 +50,20 @@ public class SaveConverterMcRegion extends SaveFormatOld {
return arraylist;
}
public void func_22177_c() {
public void flushCache() {
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);
}
public boolean func_22175_a(String s) {
WorldInfo worldinfo = func_22173_b(s);
public boolean worldNeedsConvert_maybe(String s) {
WorldInfo worldinfo = getWorldInfoForWorld(s);
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);
ArrayList arraylist = 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());
func_22181_a(file, arraylist, 0, 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);
ISaveHandler isavehandler = func_22174_a(s, false);
isavehandler.func_22152_a(worldinfo);
ISaveHandler isavehandler = loadWorldHandler(s, false);
isavehandler.saveWorldInfo(worldinfo);
func_22182_a(arraylist1, arraylist.size() + arraylist2.size(), i, iprogressupdate);
if (file1.exists()) {
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.
// Jad home page: http://www.kpdus.com/jad.html
@ -8,6 +8,14 @@ import java.io.*;
import java.util.ArrayList;
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 SaveFormatOld(File file) {
@ -17,15 +25,15 @@ public class SaveFormatOld implements ISaveFormat {
field_22180_a = file;
}
public String func_22178_a() {
public String formatName() {
return "Old Format";
}
public List func_22176_b() {
public List getWorldList() {
ArrayList arraylist = new ArrayList();
for (int i = 0; i < 5; i++) {
String s = (new StringBuilder()).append("World").append(i + 1).toString();
WorldInfo worldinfo = func_22173_b(s);
WorldInfo worldinfo = getWorldInfoForWorld(s);
if (worldinfo != null) {
arraylist.add(
new SaveFormatComparator(s, "", worldinfo.func_22301_l(), worldinfo.func_22306_g(), false));
@ -35,10 +43,10 @@ public class SaveFormatOld implements ISaveFormat {
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);
if (!file.exists()) {
return null;
@ -56,7 +64,7 @@ public class SaveFormatOld implements ISaveFormat {
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);
if (!file.exists()) {
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);
if (!file.exists()) {
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);
}
public boolean func_22175_a(String s) {
public boolean worldNeedsConvert_maybe(String s) {
return false;
}
public boolean func_22171_a(String s, IProgressUpdate iprogressupdate) {
public boolean convertSave(String s, IProgressUpdate iprogressupdate) {
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.
// Jad home page: http://www.kpdus.com/jad.html
@ -8,6 +8,15 @@ import java.io.*;
import java.util.List;
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 SaveHandler(File file, String s, boolean flag) {
@ -39,7 +48,7 @@ public class SaveHandler implements ISaveHandler {
return field_22155_b;
}
public void func_22150_b() {
public void checkSessionLock() {
try {
File file = new File(field_22155_b, "session.lock");
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) {
File file = new File(field_22155_b, "DIM-1");
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");
if (file.exists()) {
try {
@ -79,7 +88,7 @@ public class SaveHandler implements ISaveHandler {
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 nbttagcompound1 = new 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 nbttagcompound1 = new 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.
// Jad home page: http://www.kpdus.com/jad.html
@ -7,13 +7,18 @@ package net.minecraft.src;
import java.io.File;
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 SaveOldDir(File file, String s, boolean flag) {
super(file, s, flag);
}
public IChunkLoader func_22149_a(WorldProvider worldprovider) {
public IChunkLoader getChunkLoader(WorldProvider worldprovider) {
File file = func_22153_a();
if (worldprovider instanceof WorldProviderHell) {
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);
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;
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
package net.lax1dude.eaglercraft.beta;
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) braces deadcode
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.io.*;
import java.util.*;
import net.lax1dude.eaglercraft.EaglerAdapter;
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 ChunkLoader(File file, boolean flag) {
saveDir = file;
createIfNecessary = flag;
public class EaglercraftChunkLoader implements IChunkLoader {
public final String directory;
public EaglercraftChunkLoader(String dir) {
this.directory = dir;
}
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()) {
@Override
public Chunk loadChunk(World world, int x, int z) {
String name = getChunkPath(x, z);
String path = directory + "/" + name;
byte[] dat = EaglerAdapter.readFile(path);
if(dat != null) {
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());
NBTTagCompound nbt = (NBTTagCompound) NBTBase.readTag(new DataInputStream(new ByteArrayInputStream(dat)));
int xx = nbt.getInteger("xPos");
int zz = nbt.getInteger("zPos");
if(x != xx || z != zz) {
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;
}
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 = 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 = loadChunkIntoWorldFromCompound(world, nbttagcompound.getCompoundTag("Level"));
}
return chunk;
} catch (Exception exception) {
exception.printStackTrace();
return loadChunkIntoWorldFromCompound(world, nbt);
} catch (IOException e) {
System.err.println("Corrupt chunk '" + name + "' was found at: [" + x + ", " + z + "]");
System.err.println("The file will be deleted");
EaglerAdapter.deleteFile(path);
e.printStackTrace();
return null;
}
}else {
return null;
}
return null;
}
@Override
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());
}
NBTTagCompound toSave = new NBTTagCompound();
storeChunkInCompound(chunk, world, toSave);
ByteArrayOutputStream bao = new ByteArrayOutputStream(98304);
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);
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();
NBTBase.writeTag(toSave, new DataOutputStream(bao));
} catch (IOException e) {
System.err.println("Failed to serialize chunk at [" + chunk.xPosition + ", " + chunk.zPosition + "] to byte array");
e.printStackTrace();
return;
}
EaglerAdapter.writeFile(directory + "/" + getChunkPath(chunk.xPosition, chunk.zPosition), bao.toByteArray());
}
public static void storeChunkInCompound(Chunk chunk, World world, NBTTagCompound nbttagcompound) {
world.checkSessionLock();
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);
}
@Override
public void saveExtraChunkData(World world, Chunk chunk) {
}
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);
}
@Override
public void func_814_a() {
}
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) {
@ -177,7 +133,7 @@ public class ChunkLoader implements IChunkLoader {
chunk.addEntity(entity);
}
}
}
NBTTagList nbttaglist1 = nbttagcompound.getTagList("TileEntities");
if (nbttaglist1 != null) {
@ -188,20 +144,49 @@ public class ChunkLoader implements IChunkLoader {
chunk.func_1001_a(tileentity);
}
}
}
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.TextureLocation;
import net.lax1dude.eaglercraft.adapter.Tessellator;
import net.lax1dude.eaglercraft.beta.EaglercraftSaveManager;
import net.lax1dude.eaglercraft.beta.SingleplayerCommands;
import net.minecraft.src.*;
@ -59,7 +60,12 @@ public class Minecraft implements Runnable {
public void startGame() {
RenderManager.instance.itemRenderer = new ItemRenderer(this);
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);
texturePackList = new TexturePackList(this);
renderEngine = new RenderEngine(texturePackList, gameSettings);
@ -767,10 +773,10 @@ public class Minecraft implements Runnable {
public void startWorld(String s, String s1, long l) {
changeWorld1(null);
System.gc();
if (field_22008_V.func_22175_a(s)) {
if (field_22008_V.worldNeedsConvert_maybe(s)) {
func_22002_b(s, s1);
} 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);
if (world.isNewWorld) {
changeWorld2(world, "Generating level");
@ -881,9 +887,9 @@ public class Minecraft implements Runnable {
private void func_22002_b(String s, String s1) {
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 :)");
field_22008_V.func_22171_a(s, loadingScreen);
field_22008_V.convertSave(s, loadingScreen);
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";
}
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()) {
}
}

View File

@ -29,7 +29,7 @@ public class GuiRenameWorld extends GuiScreen {
controlList.add(
new GuiButton(1, width / 2 - 100, height / 4 + 120 + 12, stringtranslate.translateKey("gui.cancel")));
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();
field_22114_h = new GuiDisableButton(fontRenderer, width / 2 - 100, 60, 200, 20, s);
field_22114_h.field_22082_a = true;
@ -48,7 +48,7 @@ public class GuiRenameWorld extends GuiScreen {
mc.displayGuiScreen(field_22112_a);
} else if (guibutton.id == 0) {
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);
}
}

View File

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

View File

@ -8,21 +8,21 @@ import java.util.List;
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 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

@ -13,9 +13,8 @@ class PacketCounter {
field_22238_a++;
field_22237_b += i;
}
PacketCounter(Empty1 empty1) {
this();
public PacketCounter(Object wtf) {
}
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();
multiplayerWorld = false;
field_22147_p = isavehandler;
worldinfo = isavehandler.func_22151_c();
worldinfo = isavehandler.getWorldInfo();
isNewWorld = worldinfo == null;
if (worldprovider != null) {
worldProvider = worldprovider;
@ -150,7 +150,7 @@ public class World implements IBlockAccess {
}
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());
}
@ -213,7 +213,7 @@ public class World implements IBlockAccess {
private void saveLevel() {
checkSessionLock();
field_22147_p.func_22148_a(worldinfo, playerEntities);
field_22147_p.saveWorldAndPlayer(worldinfo, playerEntities);
}
public boolean func_650_a(int i) {
@ -1817,7 +1817,7 @@ public class World implements IBlockAccess {
}
public void checkSessionLock() {
field_22147_p.func_22150_b();
field_22147_p.checkSessionLock();
}
public void setWorldTime(long l) {

View File

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