aboutsummaryrefslogtreecommitdiffhomepage
path: root/Spigot-Server-Patches/0405-Add-APIs-to-replace-OfflinePlayer-getLastPlayed.patch
diff options
context:
space:
mode:
authorSpottedleaf <[email protected]>2019-05-26 10:40:12 -0700
committerSpottedleaf <[email protected]>2019-05-26 10:40:12 -0700
commit07762fc610e0d2c116e81278e728a786f70a7cf0 (patch)
tree41a146fd48489acf1bdebb81dd3a9c57fbc55084 /Spigot-Server-Patches/0405-Add-APIs-to-replace-OfflinePlayer-getLastPlayed.patch
parent17fe7a1b43e2bf409fe761760a943e385c6d0e5f (diff)
downloadPaper-07762fc610e0d2c116e81278e728a786f70a7cf0.tar.gz
Paper-07762fc610e0d2c116e81278e728a786f70a7cf0.zip
Revert Don-t-recheck-type-after-setting-a-block.patch
Diffstat (limited to 'Spigot-Server-Patches/0405-Add-APIs-to-replace-OfflinePlayer-getLastPlayed.patch')
-rw-r--r--Spigot-Server-Patches/0405-Add-APIs-to-replace-OfflinePlayer-getLastPlayed.patch167
1 files changed, 167 insertions, 0 deletions
diff --git a/Spigot-Server-Patches/0405-Add-APIs-to-replace-OfflinePlayer-getLastPlayed.patch b/Spigot-Server-Patches/0405-Add-APIs-to-replace-OfflinePlayer-getLastPlayed.patch
new file mode 100644
index 0000000000..0a15d17ad6
--- /dev/null
+++ b/Spigot-Server-Patches/0405-Add-APIs-to-replace-OfflinePlayer-getLastPlayed.patch
@@ -0,0 +1,167 @@
+From 15c47ec9ce65bdbcbeb5cd913f9b2113ba27f091 Mon Sep 17 00:00:00 2001
+From: Zach Brown <[email protected]>
+Date: Wed, 2 Jan 2019 00:35:43 -0600
+Subject: [PATCH] Add APIs to replace OfflinePlayer#getLastPlayed
+
+Currently OfflinePlayer#getLastPlayed could more accurately be described
+as "OfflinePlayer#getLastTimeTheirDataWasSaved".
+
+The API doc says it should return the last time the server "witnessed"
+the player, whilst also saying it should return the last time they
+logged in. The current implementation does neither.
+
+Given this interesting contradiction in the API documentation and the
+current defacto implementation, I've elected to deprecate (with no
+intent to remove) and replace it with two new methods, clearly named and
+documented as to their purpose.
+
+diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java
+index 57c6455bd8..541461275c 100644
+--- a/src/main/java/net/minecraft/server/EntityPlayer.java
++++ b/src/main/java/net/minecraft/server/EntityPlayer.java
+@@ -72,6 +72,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
+ public int ping;
+ public boolean viewingCredits;
+ private int containerUpdateDelay; // Paper
++ public long loginTime; // Paper
+ // Paper start - cancellable death event
+ public boolean queueHealthUpdatePacket = false;
+ public net.minecraft.server.PacketPlayOutUpdateHealth queuedHealthUpdatePacket;
+diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java
+index ec760325ba..135d25abd2 100644
+--- a/src/main/java/net/minecraft/server/PlayerList.java
++++ b/src/main/java/net/minecraft/server/PlayerList.java
+@@ -95,6 +95,7 @@ public abstract class PlayerList {
+ }
+
+ public void a(NetworkManager networkmanager, EntityPlayer entityplayer) {
++ entityplayer.loginTime = System.currentTimeMillis(); // Paper
+ GameProfile gameprofile = entityplayer.getProfile();
+ UserCache usercache = this.server.getUserCache();
+ GameProfile gameprofile1 = usercache.a(gameprofile.getId());
+diff --git a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
+index fbdb2df27d..e1973c5d67 100644
+--- a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
++++ b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
+@@ -245,6 +245,61 @@ public class CraftOfflinePlayer implements OfflinePlayer, ConfigurationSerializa
+ return getData() != null;
+ }
+
++ // Paper start
++ @Override
++ public long getLastLogin() {
++ Player player = getPlayer();
++ if (player != null) return player.getLastLogin();
++
++ NBTTagCompound data = getPaperData();
++
++ if (data != null) {
++ if (data.hasKey("LastLogin")) {
++ return data.getLong("LastLogin");
++ } else {
++ // if the player file cannot provide accurate data, this is probably the closest we can approximate
++ File file = getDataFile();
++ return file.lastModified();
++ }
++ } else {
++ return 0;
++ }
++ }
++
++ @Override
++ public long getLastSeen() {
++ Player player = getPlayer();
++ if (player != null) return player.getLastSeen();
++
++ NBTTagCompound data = getPaperData();
++
++ if (data != null) {
++ if (data.hasKey("LastSeen")) {
++ return data.getLong("LastSeen");
++ } else {
++ // if the player file cannot provide accurate data, this is probably the closest we can approximate
++ File file = getDataFile();
++ return file.lastModified();
++ }
++ } else {
++ return 0;
++ }
++ }
++
++ private NBTTagCompound getPaperData() {
++ NBTTagCompound result = getData();
++
++ if (result != null) {
++ if (!result.hasKey("Paper")) {
++ result.set("Paper", new NBTTagCompound());
++ }
++ result = result.getCompound("Paper");
++ }
++
++ return result;
++ }
++ // Paper end
++
+ public Location getBedSpawnLocation() {
+ NBTTagCompound data = getData();
+ if (data == null) return null;
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+index 8d32982c53..a03796cd5e 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+@@ -132,6 +132,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+ private org.bukkit.event.player.PlayerResourcePackStatusEvent.Status resourcePackStatus;
+ private String resourcePackHash;
+ private static final boolean DISABLE_CHANNEL_LIMIT = System.getProperty("paper.disableChannelLimit") != null; // Paper - add a flag to disable the channel limit
++ private long lastSaveTime;
+ // Paper end
+
+ public CraftPlayer(CraftServer server, EntityPlayer entity) {
+@@ -1337,6 +1338,18 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+ this.firstPlayed = firstPlayed;
+ }
+
++ // Paper start
++ @Override
++ public long getLastLogin() {
++ return getHandle().loginTime;
++ }
++
++ @Override
++ public long getLastSeen() {
++ return isOnline() ? System.currentTimeMillis() : this.lastSaveTime;
++ }
++ // Paper end
++
+ public void readExtraData(NBTTagCompound nbttagcompound) {
+ hasPlayedBefore = true;
+ if (nbttagcompound.hasKey("bukkit")) {
+@@ -1359,6 +1372,8 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+ }
+
+ public void setExtraData(NBTTagCompound nbttagcompound) {
++ this.lastSaveTime = System.currentTimeMillis(); // Paper
++
+ if (!nbttagcompound.hasKey("bukkit")) {
+ nbttagcompound.set("bukkit", new NBTTagCompound());
+ }
+@@ -1373,6 +1388,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+ data.setLong("firstPlayed", getFirstPlayed());
+ data.setLong("lastPlayed", System.currentTimeMillis());
+ data.setString("lastKnownName", handle.getName());
++
++ // Paper start - persist for use in offline save data
++ if (!nbttagcompound.hasKey("Paper")) {
++ nbttagcompound.set("Paper", new NBTTagCompound());
++ }
++
++ NBTTagCompound paper = nbttagcompound.getCompound("Paper");
++ paper.setLong("LastLogin", handle.loginTime);
++ paper.setLong("LastSeen", System.currentTimeMillis());
++ // Paper end
+ }
+
+ @Override
+--
+2.21.0
+