--- /home/matt/mc-dev-private//net/minecraft/server/WorldNBTStorage.java 2015-05-05 21:41:21.444627290 +0100 +++ src/main/java/net/minecraft/server/WorldNBTStorage.java 2015-05-05 21:41:21.444627290 +0100 @@ -11,6 +11,12 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +// CraftBukkit start +import java.util.UUID; + +import org.bukkit.craftbukkit.entity.CraftPlayer; +// CraftBukkit end + public class WorldNBTStorage implements IDataManager, IPlayerFileData { private static final Logger a = LogManager.getLogger(); @@ -19,6 +25,7 @@ private final File dataDir; private final long sessionId = MinecraftServer.az(); private final String f; + private UUID uuid = null; // CraftBukkit public WorldNBTStorage(File file, String s, boolean flag) { this.baseDir = new File(file, s); @@ -202,12 +209,39 @@ } if (nbttagcompound != null) { + // CraftBukkit start + if (entityhuman instanceof EntityPlayer) { + CraftPlayer player = (CraftPlayer) entityhuman.getBukkitEntity(); + // Only update first played if it is older than the one we have + long modified = new File(this.playerDir, entityhuman.getUniqueID().toString() + ".dat").lastModified(); + if (modified < player.getFirstPlayed()) { + player.setFirstPlayed(modified); + } + } + // CraftBukkit end + entityhuman.f(nbttagcompound); } return nbttagcompound; } + // CraftBukkit start + 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) { + a.warn("Failed to load player data for " + s); + } + + return null; + } + // CraftBukkit end + public IPlayerFileData getPlayerFileData() { return this; } @@ -237,4 +271,50 @@ public String g() { return this.f; } + + // CraftBukkit start + public UUID getUUID() { + if (uuid != null) return uuid; + File file1 = new File(this.baseDir, "uid.dat"); + if (file1.exists()) { + DataInputStream dis = null; + try { + dis = new DataInputStream(new FileInputStream(file1)); + return uuid = new UUID(dis.readLong(), dis.readLong()); + } catch (IOException ex) { + a.warn("Failed to read " + file1 + ", generating new random UUID", ex); + } finally { + if (dis != null) { + try { + dis.close(); + } catch (IOException ex) { + // NOOP + } + } + } + } + uuid = UUID.randomUUID(); + DataOutputStream dos = null; + try { + dos = new DataOutputStream(new FileOutputStream(file1)); + dos.writeLong(uuid.getMostSignificantBits()); + dos.writeLong(uuid.getLeastSignificantBits()); + } catch (IOException ex) { + a.warn("Failed to write " + file1, ex); + } finally { + if (dos != null) { + try { + dos.close(); + } catch (IOException ex) { + // NOOP + } + } + } + return uuid; + } + + public File getPlayerDir() { + return playerDir; + } + // CraftBukkit end }