2011-07-13 06:06:07 +02:00
|
|
|
package net.minecraft.server;
|
|
|
|
|
|
|
|
import java.io.DataInputStream;
|
|
|
|
import java.io.DataOutputStream;
|
|
|
|
import java.io.File;
|
|
|
|
import java.io.FileInputStream;
|
|
|
|
import java.io.FileOutputStream;
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.io.InputStream;
|
|
|
|
import java.io.OutputStream;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.logging.Logger;
|
|
|
|
|
2011-07-13 07:16:59 +02:00
|
|
|
import java.util.UUID; // CraftBukkit
|
2011-12-12 18:39:52 +01:00
|
|
|
import org.bukkit.craftbukkit.entity.CraftPlayer; // CraftBukkit
|
2011-07-13 07:16:59 +02:00
|
|
|
|
2011-11-30 00:17:43 +01:00
|
|
|
public class WorldNBTStorage implements PlayerFileData, IDataManager {
|
2011-07-13 06:06:07 +02:00
|
|
|
|
2011-11-30 00:17:43 +01:00
|
|
|
private static final Logger log = Logger.getLogger("Minecraft");
|
|
|
|
private final File baseDir;
|
|
|
|
private final File playerDir;
|
|
|
|
private final File dataDir;
|
|
|
|
private final long sessionId = System.currentTimeMillis();
|
2011-11-20 09:01:14 +01:00
|
|
|
private final String f;
|
2011-07-13 07:16:59 +02:00
|
|
|
private UUID uuid = null; // CraftBukkit
|
2011-07-13 06:06:07 +02:00
|
|
|
|
2011-11-30 00:17:43 +01:00
|
|
|
public WorldNBTStorage(File file1, String s, boolean flag) {
|
|
|
|
this.baseDir = new File(file1, s);
|
|
|
|
this.baseDir.mkdirs();
|
|
|
|
this.playerDir = new File(this.baseDir, "players");
|
|
|
|
this.dataDir = new File(this.baseDir, "data");
|
|
|
|
this.dataDir.mkdirs();
|
2011-11-20 09:01:14 +01:00
|
|
|
this.f = s;
|
2011-07-13 06:06:07 +02:00
|
|
|
if (flag) {
|
2011-11-30 00:17:43 +01:00
|
|
|
this.playerDir.mkdirs();
|
2011-07-13 06:06:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
this.f();
|
|
|
|
}
|
|
|
|
|
|
|
|
private void f() {
|
|
|
|
try {
|
2011-11-30 00:17:43 +01:00
|
|
|
File file1 = new File(this.baseDir, "session.lock");
|
2011-07-13 06:06:07 +02:00
|
|
|
DataOutputStream dataoutputstream = new DataOutputStream(new FileOutputStream(file1));
|
|
|
|
|
|
|
|
try {
|
2011-11-30 00:17:43 +01:00
|
|
|
dataoutputstream.writeLong(this.sessionId);
|
2011-07-13 06:06:07 +02:00
|
|
|
} finally {
|
|
|
|
dataoutputstream.close();
|
|
|
|
}
|
|
|
|
} catch (IOException ioexception) {
|
|
|
|
ioexception.printStackTrace();
|
|
|
|
throw new RuntimeException("Failed to check session lock, aborting");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-11-30 00:17:43 +01:00
|
|
|
public File getDirectory() { // CraftBukkit - prot to public.
|
|
|
|
return this.baseDir;
|
2011-07-13 06:06:07 +02:00
|
|
|
}
|
|
|
|
|
2011-11-30 00:17:43 +01:00
|
|
|
public void checkSession() {
|
2011-07-13 06:06:07 +02:00
|
|
|
try {
|
2011-11-30 00:17:43 +01:00
|
|
|
File file1 = new File(this.baseDir, "session.lock");
|
2011-07-13 06:06:07 +02:00
|
|
|
DataInputStream datainputstream = new DataInputStream(new FileInputStream(file1));
|
|
|
|
|
|
|
|
try {
|
2011-11-30 00:17:43 +01:00
|
|
|
if (datainputstream.readLong() != this.sessionId) {
|
|
|
|
throw new WorldConlictException("The save is being accessed from another location, aborting");
|
2011-07-13 06:06:07 +02:00
|
|
|
}
|
|
|
|
} finally {
|
|
|
|
datainputstream.close();
|
|
|
|
}
|
|
|
|
} catch (IOException ioexception) {
|
2011-11-30 00:17:43 +01:00
|
|
|
throw new WorldConlictException("Failed to check session lock, aborting");
|
2011-07-13 06:06:07 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-11-30 00:17:43 +01:00
|
|
|
public IChunkLoader createChunkLoader(WorldProvider worldprovider) {
|
2011-11-20 09:01:14 +01:00
|
|
|
File file1;
|
2011-07-13 06:06:07 +02:00
|
|
|
|
2011-11-20 09:01:14 +01:00
|
|
|
if (worldprovider instanceof WorldProviderHell) {
|
2011-11-30 00:17:43 +01:00
|
|
|
file1 = new File(this.baseDir, "DIM-1");
|
2011-11-20 09:01:14 +01:00
|
|
|
file1.mkdirs();
|
|
|
|
return new ChunkLoader(file1, true);
|
2011-11-30 00:17:43 +01:00
|
|
|
} else if (worldprovider instanceof WorldProviderTheEnd) {
|
|
|
|
file1 = new File(this.baseDir, "DIM1");
|
2011-07-13 06:06:07 +02:00
|
|
|
file1.mkdirs();
|
|
|
|
return new ChunkLoader(file1, true);
|
|
|
|
} else {
|
2011-11-30 00:17:43 +01:00
|
|
|
return new ChunkLoader(this.baseDir, true);
|
2011-07-13 06:06:07 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-11-30 00:17:43 +01:00
|
|
|
public WorldData getWorldData() {
|
|
|
|
File file1 = new File(this.baseDir, "level.dat");
|
2011-07-13 06:06:07 +02:00
|
|
|
NBTTagCompound nbttagcompound;
|
|
|
|
NBTTagCompound nbttagcompound1;
|
|
|
|
|
|
|
|
if (file1.exists()) {
|
|
|
|
try {
|
2011-11-30 00:17:43 +01:00
|
|
|
nbttagcompound = NBTCompressedStreamTools.a((InputStream) (new FileInputStream(file1)));
|
|
|
|
nbttagcompound1 = nbttagcompound.getCompound("Data");
|
2011-07-13 06:06:07 +02:00
|
|
|
return new WorldData(nbttagcompound1);
|
|
|
|
} catch (Exception exception) {
|
|
|
|
exception.printStackTrace();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-11-30 00:17:43 +01:00
|
|
|
file1 = new File(this.baseDir, "level.dat_old");
|
2011-07-13 06:06:07 +02:00
|
|
|
if (file1.exists()) {
|
|
|
|
try {
|
2011-11-30 00:17:43 +01:00
|
|
|
nbttagcompound = NBTCompressedStreamTools.a((InputStream) (new FileInputStream(file1)));
|
|
|
|
nbttagcompound1 = nbttagcompound.getCompound("Data");
|
2011-07-13 06:06:07 +02:00
|
|
|
return new WorldData(nbttagcompound1);
|
|
|
|
} catch (Exception exception1) {
|
|
|
|
exception1.printStackTrace();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2011-11-30 00:17:43 +01:00
|
|
|
public void saveWorldData(WorldData worlddata, List list) {
|
2011-07-13 06:06:07 +02:00
|
|
|
NBTTagCompound nbttagcompound = worlddata.a(list);
|
|
|
|
NBTTagCompound nbttagcompound1 = new NBTTagCompound();
|
|
|
|
|
2011-11-30 00:17:43 +01:00
|
|
|
nbttagcompound1.set("Data", nbttagcompound);
|
2011-07-13 06:06:07 +02:00
|
|
|
|
|
|
|
try {
|
2011-11-30 00:17:43 +01:00
|
|
|
File file1 = new File(this.baseDir, "level.dat_new");
|
|
|
|
File file2 = new File(this.baseDir, "level.dat_old");
|
|
|
|
File file3 = new File(this.baseDir, "level.dat");
|
2011-07-13 06:06:07 +02:00
|
|
|
|
2011-11-30 00:17:43 +01:00
|
|
|
NBTCompressedStreamTools.a(nbttagcompound1, (OutputStream) (new FileOutputStream(file1)));
|
2011-07-13 06:06:07 +02:00
|
|
|
if (file2.exists()) {
|
|
|
|
file2.delete();
|
|
|
|
}
|
|
|
|
|
|
|
|
file3.renameTo(file2);
|
|
|
|
if (file3.exists()) {
|
|
|
|
file3.delete();
|
|
|
|
}
|
|
|
|
|
|
|
|
file1.renameTo(file3);
|
|
|
|
if (file1.exists()) {
|
|
|
|
file1.delete();
|
|
|
|
}
|
|
|
|
} catch (Exception exception) {
|
|
|
|
exception.printStackTrace();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-11-30 00:17:43 +01:00
|
|
|
public void saveWorldData(WorldData worlddata) {
|
2011-07-13 06:06:07 +02:00
|
|
|
NBTTagCompound nbttagcompound = worlddata.a();
|
|
|
|
NBTTagCompound nbttagcompound1 = new NBTTagCompound();
|
|
|
|
|
2011-11-30 00:17:43 +01:00
|
|
|
nbttagcompound1.set("Data", nbttagcompound);
|
2011-07-13 06:06:07 +02:00
|
|
|
|
|
|
|
try {
|
2011-11-30 00:17:43 +01:00
|
|
|
File file1 = new File(this.baseDir, "level.dat_new");
|
|
|
|
File file2 = new File(this.baseDir, "level.dat_old");
|
|
|
|
File file3 = new File(this.baseDir, "level.dat");
|
2011-07-13 06:06:07 +02:00
|
|
|
|
2011-11-30 00:17:43 +01:00
|
|
|
NBTCompressedStreamTools.a(nbttagcompound1, (OutputStream) (new FileOutputStream(file1)));
|
2011-07-13 06:06:07 +02:00
|
|
|
if (file2.exists()) {
|
|
|
|
file2.delete();
|
|
|
|
}
|
|
|
|
|
|
|
|
file3.renameTo(file2);
|
|
|
|
if (file3.exists()) {
|
|
|
|
file3.delete();
|
|
|
|
}
|
|
|
|
|
|
|
|
file1.renameTo(file3);
|
|
|
|
if (file1.exists()) {
|
|
|
|
file1.delete();
|
|
|
|
}
|
|
|
|
} catch (Exception exception) {
|
|
|
|
exception.printStackTrace();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-01-12 16:27:39 +01:00
|
|
|
public void save(EntityHuman entityhuman) {
|
2011-07-13 06:06:07 +02:00
|
|
|
try {
|
|
|
|
NBTTagCompound nbttagcompound = new NBTTagCompound();
|
|
|
|
|
|
|
|
entityhuman.d(nbttagcompound);
|
2011-11-30 00:17:43 +01:00
|
|
|
File file1 = new File(this.playerDir, "_tmp_.dat");
|
|
|
|
File file2 = new File(this.playerDir, entityhuman.name + ".dat");
|
2011-07-13 06:06:07 +02:00
|
|
|
|
2011-11-30 00:17:43 +01:00
|
|
|
NBTCompressedStreamTools.a(nbttagcompound, (OutputStream) (new FileOutputStream(file1)));
|
2011-07-13 06:06:07 +02:00
|
|
|
if (file2.exists()) {
|
|
|
|
file2.delete();
|
|
|
|
}
|
|
|
|
|
|
|
|
file1.renameTo(file2);
|
|
|
|
} catch (Exception exception) {
|
2011-11-30 00:17:43 +01:00
|
|
|
log.warning("Failed to save player data for " + entityhuman.name);
|
2011-07-13 06:06:07 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-01-12 16:27:39 +01:00
|
|
|
public void load(EntityHuman entityhuman) {
|
2011-11-30 00:17:43 +01:00
|
|
|
NBTTagCompound nbttagcompound = this.getPlayerData(entityhuman.name);
|
2011-07-13 06:06:07 +02:00
|
|
|
|
|
|
|
if (nbttagcompound != null) {
|
2011-12-12 18:39:52 +01:00
|
|
|
// CraftBukkit start
|
|
|
|
if (entityhuman instanceof EntityPlayer) {
|
2012-01-14 23:02:10 +01:00
|
|
|
CraftPlayer player = (CraftPlayer) entityhuman.bukkitEntity;
|
2011-12-12 18:39:52 +01:00
|
|
|
player.setFirstPlayed(new File(playerDir, entityhuman.name + ".dat").lastModified());
|
|
|
|
}
|
|
|
|
// CraftBukkit end
|
2011-07-13 06:06:07 +02:00
|
|
|
entityhuman.e(nbttagcompound);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-11-30 00:17:43 +01:00
|
|
|
public NBTTagCompound getPlayerData(String s) {
|
2011-07-13 06:06:07 +02:00
|
|
|
try {
|
2011-11-30 00:17:43 +01:00
|
|
|
File file1 = new File(this.playerDir, s + ".dat");
|
2011-07-13 06:06:07 +02:00
|
|
|
|
|
|
|
if (file1.exists()) {
|
2011-11-30 00:17:43 +01:00
|
|
|
return NBTCompressedStreamTools.a((InputStream) (new FileInputStream(file1)));
|
2011-07-13 06:06:07 +02:00
|
|
|
}
|
|
|
|
} catch (Exception exception) {
|
2011-11-30 00:17:43 +01:00
|
|
|
log.warning("Failed to load player data for " + s);
|
2011-07-13 06:06:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2011-11-30 00:17:43 +01:00
|
|
|
public PlayerFileData getPlayerFileData() {
|
2011-07-13 06:06:07 +02:00
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void e() {}
|
|
|
|
|
2011-11-30 00:17:43 +01:00
|
|
|
public File getDataFile(String s) {
|
|
|
|
return new File(this.dataDir, s + ".dat");
|
2011-07-13 06:06:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// CraftBukkit start
|
|
|
|
public UUID getUUID() {
|
2011-07-13 07:16:59 +02:00
|
|
|
if (uuid != null) return uuid;
|
2011-07-13 06:06:07 +02:00
|
|
|
try {
|
2011-11-30 00:17:43 +01:00
|
|
|
File file1 = new File(this.baseDir, "uid.dat");
|
2011-07-13 07:16:59 +02:00
|
|
|
if (!file1.exists()) {
|
2011-07-13 06:06:07 +02:00
|
|
|
DataOutputStream dos = new DataOutputStream(new FileOutputStream(file1));
|
2011-07-13 07:16:59 +02:00
|
|
|
uuid = UUID.randomUUID();
|
|
|
|
dos.writeLong(uuid.getMostSignificantBits());
|
|
|
|
dos.writeLong(uuid.getLeastSignificantBits());
|
|
|
|
dos.close();
|
2011-07-13 06:06:07 +02:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
DataInputStream dis = new DataInputStream(new FileInputStream(file1));
|
2011-07-13 07:16:59 +02:00
|
|
|
uuid = new UUID(dis.readLong(), dis.readLong());
|
|
|
|
dis.close();
|
2011-07-13 06:06:07 +02:00
|
|
|
}
|
2011-07-13 07:16:59 +02:00
|
|
|
return uuid;
|
2011-07-13 06:06:07 +02:00
|
|
|
}
|
|
|
|
catch (IOException ex) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
2011-12-04 18:57:00 +01:00
|
|
|
|
|
|
|
public File getPlayerDir() {
|
|
|
|
return playerDir;
|
|
|
|
}
|
2011-07-13 06:06:07 +02:00
|
|
|
// CraftBukkit end
|
|
|
|
}
|