165 Zeilen
7.2 KiB
Diff
165 Zeilen
7.2 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Zach Brown <zach@zachbr.io>
|
|
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 08c936288b5ac8738d7cff9fe95b1256ae32cd28..a8de1f58fffe2541478083defc18be949d0c75f1 100644
|
|
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
|
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
|
@@ -248,6 +248,7 @@ public class ServerPlayer extends 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 7d81334b8bbfc04f1188de777b0cacd6f80131d3..2a0d3319899f0b3f38135e25306b87b1974b3d83 100644
|
|
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
|
|
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
|
|
@@ -180,6 +180,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();
|
|
String s;
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
|
|
index 34925d6448e0ef1d5bb4b24359f732b67aaa4230..0c1b5f625a351905e082b2c2a63bfd737101527e 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 29ede2405a645499e804a2f914a2563ef443f919..0e251c385db7969398eca95e3353de4a3de6d189 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
@@ -197,6 +197,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);
|
|
@@ -1958,6 +1959,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")) {
|
|
@@ -1980,6 +1993,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());
|
|
}
|
|
@@ -1994,6 +2009,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
|