geforkt von Mirrors/Paper
57dd397155
Upstream has released updates that appears to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: b999860d SPIGOT-2304: Add LootGenerateEvent CraftBukkit Changes:77fd87e4
SPIGOT-2304: Implement LootGenerateEventa1a705ee
SPIGOT-5566: Doused campfires & fires should call EntityChangeBlockEvent41712edd
SPIGOT-5707: PersistentDataHolder not Persistent on API dropped Item
168 Zeilen
6.6 KiB
Diff
168 Zeilen
6.6 KiB
Diff
From 1ff7ab3d1f80417607329ccfb45a20d98dffe303 Mon Sep 17 00:00:00 2001
|
|
From: Zach Brown <zach@zachbr.io>
|
|
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 960e1fd4ad..c5b8e76e2c 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityPlayer.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityPlayer.java
|
|
@@ -76,6 +76,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 6b67201852..e148940ab3 100644
|
|
--- a/src/main/java/net/minecraft/server/PlayerList.java
|
|
+++ b/src/main/java/net/minecraft/server/PlayerList.java
|
|
@@ -94,6 +94,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.getProfile(gameprofile.getId());
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
|
|
index 0e8a21b803..32e02af96e 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
|
|
@@ -260,6 +260,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
|
|
+
|
|
@Override
|
|
public Location getBedSpawnLocation() {
|
|
NBTTagCompound data = getData();
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
index a8f46ceb4b..8cf17e5ebf 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
@@ -139,6 +139,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) {
|
|
@@ -1349,6 +1350,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")) {
|
|
@@ -1371,6 +1384,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());
|
|
}
|
|
@@ -1385,6 +1400,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.26.2
|
|
|