Paper/src/main/java/net/minecraft/server/WorldNBTStorage.java

275 lines
8.6 KiB
Java
Raw Normal View History

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.logging.Logger;
// CraftBukkit start
import java.util.UUID;
import org.bukkit.craftbukkit.entity.CraftPlayer;
// CraftBukkit end
2012-07-29 09:33:13 +02:00
public class WorldNBTStorage implements IDataManager, PlayerFileData {
2011-07-13 06:06:07 +02: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;
private UUID uuid = null; // CraftBukkit
2011-07-13 06:06:07 +02: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) {
this.playerDir.mkdirs();
2011-07-13 06:06:07 +02:00
}
2012-07-29 09:33:13 +02:00
this.h();
2011-07-13 06:06:07 +02:00
}
2012-07-29 09:33:13 +02:00
private void h() {
2011-07-13 06:06:07 +02:00
try {
File file1 = new File(this.baseDir, "session.lock");
2011-07-13 06:06:07 +02:00
DataOutputStream dataoutputstream = new DataOutputStream(new FileOutputStream(file1));
try {
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");
}
}
2012-07-29 09:33:13 +02:00
public File getDirectory() { // CraftBukkit - protected to public
return this.baseDir;
2011-07-13 06:06:07 +02:00
}
2012-07-29 09:33:13 +02:00
public void checkSession() throws ExceptionWorldConflict { // CraftBukkit - throws ExceptionWorldConflict
2011-07-13 06:06:07 +02:00
try {
File file1 = new File(this.baseDir, "session.lock");
2011-07-13 06:06:07 +02:00
DataInputStream datainputstream = new DataInputStream(new FileInputStream(file1));
try {
if (datainputstream.readLong() != this.sessionId) {
2012-07-29 09:33:13 +02:00
throw new ExceptionWorldConflict("The save is being accessed from another location, aborting");
2011-07-13 06:06:07 +02:00
}
} finally {
datainputstream.close();
}
} catch (IOException ioexception) {
2012-07-29 09:33:13 +02:00
throw new ExceptionWorldConflict("Failed to check session lock, aborting");
2011-07-13 06:06:07 +02:00
}
}
public IChunkLoader createChunkLoader(WorldProvider worldprovider) {
2012-03-01 11:49:23 +01:00
throw new RuntimeException("Old Chunk Storage is no longer supported.");
2011-07-13 06:06:07 +02: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 {
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();
}
}
file1 = new File(this.baseDir, "level.dat_old");
2011-07-13 06:06:07 +02:00
if (file1.exists()) {
try {
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;
}
2012-07-29 09:33:13 +02:00
public void saveWorldData(WorldData worlddata, NBTTagCompound nbttagcompound) {
NBTTagCompound nbttagcompound1 = worlddata.a(nbttagcompound);
NBTTagCompound nbttagcompound2 = new NBTTagCompound();
2011-07-13 06:06:07 +02:00
2012-07-29 09:33:13 +02:00
nbttagcompound2.set("Data", nbttagcompound1);
2011-07-13 06:06:07 +02:00
try {
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
2012-07-29 09:33:13 +02:00
NBTCompressedStreamTools.a(nbttagcompound2, (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();
}
}
public void saveWorldData(WorldData worlddata) {
2011-07-13 06:06:07 +02:00
NBTTagCompound nbttagcompound = worlddata.a();
NBTTagCompound nbttagcompound1 = new NBTTagCompound();
nbttagcompound1.set("Data", nbttagcompound);
2011-07-13 06:06:07 +02:00
try {
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
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);
2012-07-29 09:33:13 +02:00
File file1 = new File(this.playerDir, entityhuman.name + ".dat.tmp");
File file2 = new File(this.playerDir, entityhuman.name + ".dat");
2011-07-13 06:06:07 +02: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) {
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) {
NBTTagCompound nbttagcompound = this.getPlayerData(entityhuman.name);
2011-07-13 06:06:07 +02:00
if (nbttagcompound != null) {
// CraftBukkit start
if (entityhuman instanceof EntityPlayer) {
2012-01-14 23:02:10 +01:00
CraftPlayer player = (CraftPlayer) entityhuman.bukkitEntity;
player.setFirstPlayed(new File(playerDir, entityhuman.name + ".dat").lastModified());
}
// CraftBukkit end
2011-07-13 06:06:07 +02:00
entityhuman.e(nbttagcompound);
}
}
public NBTTagCompound getPlayerData(String s) {
2011-07-13 06:06:07 +02:00
try {
File file1 = new File(this.playerDir, s + ".dat");
2011-07-13 06:06:07 +02:00
if (file1.exists()) {
return NBTCompressedStreamTools.a((InputStream) (new FileInputStream(file1)));
2011-07-13 06:06:07 +02:00
}
} catch (Exception exception) {
log.warning("Failed to load player data for " + s);
2011-07-13 06:06:07 +02:00
}
return null;
}
public PlayerFileData getPlayerFileData() {
2011-07-13 06:06:07 +02:00
return this;
}
2012-03-30 23:33:51 +02:00
public String[] getSeenPlayers() {
2012-07-29 09:33:13 +02:00
String[] astring = this.playerDir.list();
for (int i = 0; i < astring.length; ++i) {
if (astring[i].endsWith(".dat")) {
astring[i] = astring[i].substring(0, astring[i].length() - 4);
}
}
return astring;
2012-03-30 23:33:51 +02:00
}
2012-07-29 09:33:13 +02:00
public void a() {}
2011-07-13 06:06:07 +02:00
public File getDataFile(String s) {
return new File(this.dataDir, s + ".dat");
2011-07-13 06:06:07 +02:00
}
2012-07-29 09:33:13 +02:00
public String g() {
return this.f;
}
2011-07-13 06:06:07 +02:00
// CraftBukkit start
public UUID getUUID() {
if (uuid != null) return uuid;
2011-07-13 06:06:07 +02:00
try {
File file1 = new File(this.baseDir, "uid.dat");
if (!file1.exists()) {
2011-07-13 06:06:07 +02:00
DataOutputStream dos = new DataOutputStream(new FileOutputStream(file1));
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));
uuid = new UUID(dis.readLong(), dis.readLong());
dis.close();
2011-07-13 06:06:07 +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
}