summaryrefslogtreecommitdiffstats
path: root/src/main/java/net/minecraft/server/WorldNBTStorage.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/net/minecraft/server/WorldNBTStorage.java')
-rw-r--r--src/main/java/net/minecraft/server/WorldNBTStorage.java257
1 files changed, 257 insertions, 0 deletions
diff --git a/src/main/java/net/minecraft/server/WorldNBTStorage.java b/src/main/java/net/minecraft/server/WorldNBTStorage.java
new file mode 100644
index 00000000..934e777d
--- /dev/null
+++ b/src/main/java/net/minecraft/server/WorldNBTStorage.java
@@ -0,0 +1,257 @@
+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;
+
+import java.util.UUID; // CraftBukkit
+
+public class WorldNBTStorage implements PlayerFileData, IDataManager {
+
+ 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();
+ private final String f;
+ private UUID uuid = null; // CraftBukkit
+
+ 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();
+ this.f = s;
+ if (flag) {
+ this.playerDir.mkdirs();
+ }
+
+ this.f();
+ }
+
+ private void f() {
+ try {
+ File file1 = new File(this.baseDir, "session.lock");
+ DataOutputStream dataoutputstream = new DataOutputStream(new FileOutputStream(file1));
+
+ try {
+ dataoutputstream.writeLong(this.sessionId);
+ } finally {
+ dataoutputstream.close();
+ }
+ } catch (IOException ioexception) {
+ ioexception.printStackTrace();
+ throw new RuntimeException("Failed to check session lock, aborting");
+ }
+ }
+
+ public File getDirectory() { // CraftBukkit - prot to public.
+ return this.baseDir;
+ }
+
+ public void checkSession() {
+ try {
+ File file1 = new File(this.baseDir, "session.lock");
+ DataInputStream datainputstream = new DataInputStream(new FileInputStream(file1));
+
+ try {
+ if (datainputstream.readLong() != this.sessionId) {
+ throw new WorldConlictException("The save is being accessed from another location, aborting");
+ }
+ } finally {
+ datainputstream.close();
+ }
+ } catch (IOException ioexception) {
+ throw new WorldConlictException("Failed to check session lock, aborting");
+ }
+ }
+
+ public IChunkLoader createChunkLoader(WorldProvider worldprovider) {
+ File file1;
+
+ if (worldprovider instanceof WorldProviderHell) {
+ file1 = new File(this.baseDir, "DIM-1");
+ file1.mkdirs();
+ return new ChunkLoader(file1, true);
+ } else if (worldprovider instanceof WorldProviderTheEnd) {
+ file1 = new File(this.baseDir, "DIM1");
+ file1.mkdirs();
+ return new ChunkLoader(file1, true);
+ } else {
+ return new ChunkLoader(this.baseDir, true);
+ }
+ }
+
+ public WorldData getWorldData() {
+ File file1 = new File(this.baseDir, "level.dat");
+ NBTTagCompound nbttagcompound;
+ NBTTagCompound nbttagcompound1;
+
+ if (file1.exists()) {
+ try {
+ nbttagcompound = NBTCompressedStreamTools.a((InputStream) (new FileInputStream(file1)));
+ nbttagcompound1 = nbttagcompound.getCompound("Data");
+ return new WorldData(nbttagcompound1);
+ } catch (Exception exception) {
+ exception.printStackTrace();
+ }
+ }
+
+ file1 = new File(this.baseDir, "level.dat_old");
+ if (file1.exists()) {
+ try {
+ nbttagcompound = NBTCompressedStreamTools.a((InputStream) (new FileInputStream(file1)));
+ nbttagcompound1 = nbttagcompound.getCompound("Data");
+ return new WorldData(nbttagcompound1);
+ } catch (Exception exception1) {
+ exception1.printStackTrace();
+ }
+ }
+
+ return null;
+ }
+
+ public void saveWorldData(WorldData worlddata, List list) {
+ NBTTagCompound nbttagcompound = worlddata.a(list);
+ NBTTagCompound nbttagcompound1 = new NBTTagCompound();
+
+ nbttagcompound1.set("Data", nbttagcompound);
+
+ 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");
+
+ NBTCompressedStreamTools.a(nbttagcompound1, (OutputStream) (new FileOutputStream(file1)));
+ 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) {
+ NBTTagCompound nbttagcompound = worlddata.a();
+ NBTTagCompound nbttagcompound1 = new NBTTagCompound();
+
+ nbttagcompound1.set("Data", nbttagcompound);
+
+ 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");
+
+ NBTCompressedStreamTools.a(nbttagcompound1, (OutputStream) (new FileOutputStream(file1)));
+ 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 a(EntityHuman entityhuman) {
+ try {
+ NBTTagCompound nbttagcompound = new NBTTagCompound();
+
+ entityhuman.d(nbttagcompound);
+ File file1 = new File(this.playerDir, "_tmp_.dat");
+ File file2 = new File(this.playerDir, entityhuman.name + ".dat");
+
+ NBTCompressedStreamTools.a(nbttagcompound, (OutputStream) (new FileOutputStream(file1)));
+ if (file2.exists()) {
+ file2.delete();
+ }
+
+ file1.renameTo(file2);
+ } catch (Exception exception) {
+ log.warning("Failed to save player data for " + entityhuman.name);
+ }
+ }
+
+ public void b(EntityHuman entityhuman) {
+ NBTTagCompound nbttagcompound = this.getPlayerData(entityhuman.name);
+
+ if (nbttagcompound != null) {
+ entityhuman.e(nbttagcompound);
+ }
+ }
+
+ public NBTTagCompound getPlayerData(String s) {
+ try {
+ File file1 = new File(this.playerDir, s + ".dat");
+
+ if (file1.exists()) {
+ return NBTCompressedStreamTools.a((InputStream) (new FileInputStream(file1)));
+ }
+ } catch (Exception exception) {
+ log.warning("Failed to load player data for " + s);
+ }
+
+ return null;
+ }
+
+ public PlayerFileData getPlayerFileData() {
+ return this;
+ }
+
+ public void e() {}
+
+ public File getDataFile(String s) {
+ return new File(this.dataDir, s + ".dat");
+ }
+
+ // CraftBukkit start
+ public UUID getUUID() {
+ if (uuid != null) return uuid;
+ try {
+ File file1 = new File(this.baseDir, "uid.dat");
+ if (!file1.exists()) {
+ DataOutputStream dos = new DataOutputStream(new FileOutputStream(file1));
+ uuid = UUID.randomUUID();
+ dos.writeLong(uuid.getMostSignificantBits());
+ dos.writeLong(uuid.getLeastSignificantBits());
+ dos.close();
+ }
+ else {
+ DataInputStream dis = new DataInputStream(new FileInputStream(file1));
+ uuid = new UUID(dis.readLong(), dis.readLong());
+ dis.close();
+ }
+ return uuid;
+ }
+ catch (IOException ex) {
+ return null;
+ }
+ }
+ // CraftBukkit end
+}