From 586d6ad790e3316f1ef5cb731770ece1dea23617 Mon Sep 17 00:00:00 2001 From: CraftBukkit/Spigot Date: Mon, 12 Dec 2011 17:39:52 +0000 Subject: [PATCH] Implemented (offline)player date methods By: Nathan Adams --- .../craftbukkit/CraftOfflinePlayer.java | 66 +++++++++++++++++++ .../craftbukkit/entity/CraftPlayer.java | 47 +++++++++++++ 2 files changed, 113 insertions(+) diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java index 68789a9f8e..4f8fd21d95 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java @@ -1,8 +1,11 @@ package org.bukkit.craftbukkit; +import java.io.File; import java.util.LinkedHashMap; import java.util.Map; import net.minecraft.server.EntityPlayer; +import net.minecraft.server.NBTTagCompound; +import net.minecraft.server.WorldNBTStorage; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.Server; @@ -14,10 +17,12 @@ import org.bukkit.entity.Player; public class CraftOfflinePlayer implements OfflinePlayer, ConfigurationSerializable { private final String name; private final CraftServer server; + private final WorldNBTStorage storage; protected CraftOfflinePlayer(CraftServer server, String name) { this.server = server; this.name = name; + this.storage = (WorldNBTStorage)(server.console.worlds.get(0).getDataManager()); } public boolean isOnline() { @@ -119,4 +124,65 @@ public class CraftOfflinePlayer implements OfflinePlayer, ConfigurationSerializa hash = 97 * hash + (this.getName() != null ? this.getName().hashCode() : 0); return hash; } + + private NBTTagCompound getData() { + return storage.getPlayerData(getName()); + } + + private NBTTagCompound getBukkitData() { + NBTTagCompound result = getData(); + + if (result != null) { + if (!result.hasKey("bukkit")) { + result.setCompound("bukkit", new NBTTagCompound()); + } + result = result.getCompound("bukkit"); + } + + return result; + } + + private File getDataFile() { + return new File(storage.getPlayerDir(), name + ".dat"); + } + + public long getFirstPlayed() { + Player player = getPlayer(); + if (player != null) return player.getFirstPlayed(); + + NBTTagCompound data = getBukkitData(); + + if (data != null) { + if (data.hasKey("firstPlayed")) { + return data.getLong("firstPlayed"); + } else { + File file = getDataFile(); + return file.lastModified(); + } + } else { + return 0; + } + } + + public long getLastPlayed() { + Player player = getPlayer(); + if (player != null) return player.getFirstPlayed(); + + NBTTagCompound data = getBukkitData(); + + if (data != null) { + if (data.hasKey("lastPlayed")) { + return data.getLong("lastPlayed"); + } else { + File file = getDataFile(); + return file.lastModified(); + } + } else { + return 0; + } + } + + public boolean hasPlayedBefore() { + return getData() != null; + } } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index ba2757bf9e..bb94842e8c 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -2,9 +2,12 @@ package org.bukkit.craftbukkit.entity; import java.net.InetSocketAddress; import java.net.SocketAddress; +import java.util.Calendar; +import java.util.Date; import java.util.LinkedHashMap; import java.util.Map; import net.minecraft.server.EntityPlayer; +import net.minecraft.server.NBTTagCompound; import net.minecraft.server.Packet131ItemData; import net.minecraft.server.Packet200Statistic; import net.minecraft.server.Packet201PlayerInfo; @@ -39,8 +42,14 @@ import org.bukkit.map.MapView; @DelegateDeserialization(CraftOfflinePlayer.class) public class CraftPlayer extends CraftHumanEntity implements Player { + private long firstPlayed = 0; + private long lastPlayed = 0; + private boolean hasPlayedBefore = false; + public CraftPlayer(CraftServer server, EntityPlayer entity) { super(server, entity); + + firstPlayed = System.currentTimeMillis(); } @Override @@ -567,4 +576,42 @@ public class CraftPlayer extends CraftHumanEntity implements Player { hash = 97 * hash + (this.getName() != null ? this.getName().hashCode() : 0); return hash; } + + public long getFirstPlayed() { + return firstPlayed; + } + + public long getLastPlayed() { + return lastPlayed; + } + + public boolean hasPlayedBefore() { + return hasPlayedBefore; + } + + public void setFirstPlayed(long firstPlayed) { + this.firstPlayed = firstPlayed; + } + + public void readExtraData(NBTTagCompound nbttagcompound) { + hasPlayedBefore = true; + if (nbttagcompound.hasKey("bukkit")) { + NBTTagCompound data = nbttagcompound.getCompound("bukkit"); + + if (data.hasKey("firstPlayed")) { + firstPlayed = data.getLong("firstPlayed"); + lastPlayed = data.getLong("lastPlayed"); + } + } + } + + public void setExtraData(NBTTagCompound nbttagcompound) { + if (!nbttagcompound.hasKey("bukkit")) { + nbttagcompound.setCompound("bukkit", new NBTTagCompound()); + } + + NBTTagCompound data = nbttagcompound.getCompound("bukkit"); + data.setLong("firstPlayed", getFirstPlayed()); + data.setLong("lastPlayed", System.currentTimeMillis()); + } }