aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0269-Replace-OfflinePlayer-getLastPlayed.patch
diff options
context:
space:
mode:
authorNassim Jahnke <[email protected]>2024-12-03 19:21:12 +0100
committerNassim Jahnke <[email protected]>2024-12-03 19:28:24 +0100
commitc60e47fa58c171befcfb4ca48f38a201d559f90b (patch)
treefa84b280a687cfa88b11c3c35e856dc2adccb49f /patches/server/0269-Replace-OfflinePlayer-getLastPlayed.patch
parentab9a3db5ba76384531ad52299344dea588a367b2 (diff)
downloadPaper-c60e47fa58c171befcfb4ca48f38a201d559f90b.tar.gz
Paper-c60e47fa58c171befcfb4ca48f38a201d559f90b.zip
More more work
Diffstat (limited to 'patches/server/0269-Replace-OfflinePlayer-getLastPlayed.patch')
-rw-r--r--patches/server/0269-Replace-OfflinePlayer-getLastPlayed.patch164
1 files changed, 164 insertions, 0 deletions
diff --git a/patches/server/0269-Replace-OfflinePlayer-getLastPlayed.patch b/patches/server/0269-Replace-OfflinePlayer-getLastPlayed.patch
new file mode 100644
index 0000000000..6cc9f04ae6
--- /dev/null
+++ b/patches/server/0269-Replace-OfflinePlayer-getLastPlayed.patch
@@ -0,0 +1,164 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Zach Brown <[email protected]>
+Date: Wed, 2 Jan 2019 00:35:43 -0600
+Subject: [PATCH] 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/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+index 2db5ef211ac36d5aa7f337dd4a5c2600796d8b66..ae922d01caae4b2ed42641ae5039abe33603fa29 100644
+--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
++++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+@@ -294,6 +294,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player {
+ private int containerCounter;
+ public boolean wonGame;
+ private int containerUpdateDelay; // Paper - Configurable container update tick rate
++ public long loginTime; // Paper - Replace OfflinePlayer#getLastPlayed
+ // Paper start - cancellable death event
+ public boolean queueHealthUpdatePacket;
+ public net.minecraft.network.protocol.game.ClientboundSetHealthPacket queuedHealthUpdatePacket;
+diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
+index 8bb2749f751839f7dfd8fb62f676bd54ec8b1b09..4b2826f3319dca1f795653106d22fc6948c6a27a 100644
+--- a/src/main/java/net/minecraft/server/players/PlayerList.java
++++ b/src/main/java/net/minecraft/server/players/PlayerList.java
+@@ -182,6 +182,7 @@ public abstract class PlayerList {
+
+ public void placeNewPlayer(Connection connection, ServerPlayer player, CommonListenerCookie clientData) {
+ player.isRealPlayer = true; // Paper
++ player.loginTime = System.currentTimeMillis(); // Paper - Replace OfflinePlayer#getLastPlayed
+ GameProfile gameprofile = player.getGameProfile();
+ GameProfileCache usercache = this.server.getProfileCache();
+ // Optional optional; // CraftBukkit - decompile error
+diff --git a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
+index f6b2ca92fd3510a76cbf56d0ea55aa6caaf12ba1..e0d342a0ddd140b342f7af138c71596c6d718788 100644
+--- a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
++++ b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
+@@ -262,6 +262,61 @@ public class CraftOfflinePlayer implements OfflinePlayer, ConfigurationSerializa
+ return this.getData() != null;
+ }
+
++ // Paper start
++ @Override
++ public long getLastLogin() {
++ Player player = getPlayer();
++ if (player != null) return player.getLastLogin();
++
++ CompoundTag data = getPaperData();
++
++ if (data != null) {
++ if (data.contains("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();
++
++ CompoundTag data = getPaperData();
++
++ if (data != null) {
++ if (data.contains("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 CompoundTag getPaperData() {
++ CompoundTag result = getData();
++
++ if (result != null) {
++ if (!result.contains("Paper")) {
++ result.put("Paper", new CompoundTag());
++ }
++ result = result.getCompound("Paper");
++ }
++
++ return result;
++ }
++ // Paper end
++
+ @Override
+ public Location getLastDeathLocation() {
+ if (this.getData().contains("LastDeathLocation", 10)) {
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+index 63cc339b42c47879401628c8d0e0f62bd7dd76b4..d5f89783d12c61967637ed1e87037710df563308 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+@@ -215,6 +215,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+ private BorderChangeListener clientWorldBorderListener = this.createWorldBorderListener();
+ public org.bukkit.event.player.PlayerResourcePackStatusEvent.Status resourcePackStatus; // Paper - more resource pack API
+ 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 - getLastPlayed replacement API
+
+ public CraftPlayer(CraftServer server, ServerPlayer entity) {
+ super(server, entity);
+@@ -2064,6 +2065,18 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+ this.firstPlayed = firstPlayed;
+ }
+
++ // Paper start - getLastPlayed replacement API
++ @Override
++ public long getLastLogin() {
++ return this.getHandle().loginTime;
++ }
++
++ @Override
++ public long getLastSeen() {
++ return this.isOnline() ? System.currentTimeMillis() : this.lastSaveTime;
++ }
++ // Paper end - getLastPlayed replacement API
++
+ public void readExtraData(CompoundTag nbttagcompound) {
+ this.hasPlayedBefore = true;
+ if (nbttagcompound.contains("bukkit")) {
+@@ -2086,6 +2099,8 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+ }
+
+ public void setExtraData(CompoundTag nbttagcompound) {
++ this.lastSaveTime = System.currentTimeMillis(); // Paper
++
+ if (!nbttagcompound.contains("bukkit")) {
+ nbttagcompound.put("bukkit", new CompoundTag());
+ }
+@@ -2100,6 +2115,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+ data.putLong("firstPlayed", this.getFirstPlayed());
+ data.putLong("lastPlayed", System.currentTimeMillis());
+ data.putString("lastKnownName", handle.getScoreboardName());
++
++ // Paper start - persist for use in offline save data
++ if (!nbttagcompound.contains("Paper")) {
++ nbttagcompound.put("Paper", new CompoundTag());
++ }
++
++ CompoundTag paper = nbttagcompound.getCompound("Paper");
++ paper.putLong("LastLogin", handle.loginTime);
++ paper.putLong("LastSeen", System.currentTimeMillis());
++ // Paper end
+ }
+
+ @Override