diff --git a/Spigot-Server-Patches/0131-Optimize-UserCache-Thread-Safe.patch b/Spigot-Server-Patches/0131-Optimize-UserCache-Thread-Safe.patch index 5f3f74dfb..ceaeb913e 100644 --- a/Spigot-Server-Patches/0131-Optimize-UserCache-Thread-Safe.patch +++ b/Spigot-Server-Patches/0131-Optimize-UserCache-Thread-Safe.patch @@ -1,4 +1,4 @@ -From 5a73d0282b24f09156533a66c32aa2f86ba00541 Mon Sep 17 00:00:00 2001 +From 24802e2d2a7d5233284330e7dc7267a534289c1c Mon Sep 17 00:00:00 2001 From: Aikar Date: Mon, 16 May 2016 20:47:41 -0400 Subject: [PATCH] Optimize UserCache / Thread Safe @@ -23,7 +23,7 @@ index 45d3dbde2..ab7933079 100644 // Spigot end } diff --git a/src/main/java/net/minecraft/server/UserCache.java b/src/main/java/net/minecraft/server/UserCache.java -index 487fc11f1..924dc63a4 100644 +index 487fc11f1..4fb17a801 100644 --- a/src/main/java/net/minecraft/server/UserCache.java +++ b/src/main/java/net/minecraft/server/UserCache.java @@ -109,7 +109,7 @@ public class UserCache { @@ -55,7 +55,7 @@ index 487fc11f1..924dc63a4 100644 String s1 = s.toLowerCase(Locale.ROOT); UserCache.UserCacheEntry usercache_usercacheentry = (UserCache.UserCacheEntry) this.d.get(s1); -@@ -166,7 +167,7 @@ public class UserCache { +@@ -166,14 +167,15 @@ public class UserCache { return usercache_usercacheentry == null ? null : usercache_usercacheentry.a(); } @@ -64,7 +64,16 @@ index 487fc11f1..924dc63a4 100644 ArrayList arraylist = Lists.newArrayList(this.d.keySet()); return (String[]) arraylist.toArray(new String[arraylist.size()]); -@@ -228,8 +229,15 @@ public class UserCache { + } + ++ @Nullable public GameProfile getProfile(UUID uuid) { return a(uuid); } // Paper - OBFHELPER + @Nullable +- public GameProfile a(UUID uuid) { ++ public synchronized GameProfile a(UUID uuid) { // Paper - synchronize + UserCache.UserCacheEntry usercache_usercacheentry = (UserCache.UserCacheEntry) this.e.get(uuid); + + return usercache_usercacheentry == null ? null : usercache_usercacheentry.a(); +@@ -228,8 +230,15 @@ public class UserCache { } @@ -80,7 +89,7 @@ index 487fc11f1..924dc63a4 100644 BufferedWriter bufferedwriter = null; try { -@@ -243,6 +251,14 @@ public class UserCache { +@@ -243,6 +252,14 @@ public class UserCache { } finally { IOUtils.closeQuietly(bufferedwriter); } @@ -96,5 +105,5 @@ index 487fc11f1..924dc63a4 100644 } -- -2.16.1 +2.16.2 diff --git a/Spigot-Server-Patches/0214-Basic-PlayerProfile-API.patch b/Spigot-Server-Patches/0214-Basic-PlayerProfile-API.patch index d6d675bee..1017c8c09 100644 --- a/Spigot-Server-Patches/0214-Basic-PlayerProfile-API.patch +++ b/Spigot-Server-Patches/0214-Basic-PlayerProfile-API.patch @@ -1,4 +1,4 @@ -From c27298c0ed821b2e7556e75100ed55c5830bcead Mon Sep 17 00:00:00 2001 +From ece9ffa638c05b83affc7321bbe17f54774ff340 Mon Sep 17 00:00:00 2001 From: Aikar Date: Mon, 15 Jan 2018 22:11:48 -0500 Subject: [PATCH] Basic PlayerProfile API @@ -6,16 +6,21 @@ Subject: [PATCH] Basic PlayerProfile API diff --git a/src/main/java/com/destroystokyo/paper/profile/CraftPlayerProfile.java b/src/main/java/com/destroystokyo/paper/profile/CraftPlayerProfile.java new file mode 100644 -index 000000000..1d669e3e2 +index 000000000..af6a81586 --- /dev/null +++ b/src/main/java/com/destroystokyo/paper/profile/CraftPlayerProfile.java -@@ -0,0 +1,199 @@ +@@ -0,0 +1,248 @@ +package com.destroystokyo.paper.profile; + ++import com.destroystokyo.paper.PaperConfig; ++import com.google.common.base.Charsets; +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.properties.Property; +import com.mojang.authlib.properties.PropertyMap; +import net.minecraft.server.MinecraftServer; ++import net.minecraft.server.UserCache; ++import org.bukkit.craftbukkit.entity.CraftPlayer; ++import org.spigotmc.SpigotConfig; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; @@ -30,6 +35,13 @@ index 000000000..1d669e3e2 + private GameProfile profile; + private final PropertySet properties; + ++ public CraftPlayerProfile(CraftPlayer player) { ++ GameProfile playerProfile = player.getHandle().getProfile(); ++ this.profile = new GameProfile(playerProfile.getId(), playerProfile.getName()); ++ copyProfileProperties(this.profile, this.profile); ++ this.properties = new PropertySet(); ++ } ++ + /** + * Constructs a new Game Profile with the specified ID and name. + *

@@ -40,7 +52,41 @@ index 000000000..1d669e3e2 + * @throws IllegalArgumentException Both ID and name are either null or empty + */ + public CraftPlayerProfile(UUID id, String name) { -+ this(new GameProfile(id, name)); ++ this(createGameProfile(id, name)); ++ } ++ ++ private static GameProfile createGameProfile(UUID id, String name) { ++ new GameProfile(id, name); // Validate that both are not null ++ MinecraftServer server = MinecraftServer.getServer(); ++ UserCache userCache = server.getUserCache(); ++ GameProfile profile = null; ++ boolean isOnlineMode = server.getOnlineMode() || (SpigotConfig.bungee && PaperConfig.bungeeOnlineMode); ++ if (id == null && isOnlineMode) { ++ profile = userCache.getProfile(name); ++ } ++ ++ if (profile == null && name == null && id != null) { ++ profile = userCache.getProfile(id); ++ } ++ ++ if (profile == null && id == null && name != null && !isOnlineMode) { ++ // Make an OfflinePlayer using an offline mode UUID since the name has no profile ++ id = UUID.nameUUIDFromBytes(("OfflinePlayer:" + name).getBytes(Charsets.UTF_8)); ++ } ++ ++ GameProfile resultProfile = new GameProfile(id, name); ++ if (profile != null) { ++ copyProfileProperties(profile, resultProfile); ++ } ++ return resultProfile; ++ } ++ ++ private static void copyProfileProperties(GameProfile source, GameProfile target) { ++ PropertyMap properties = target.getProperties(); ++ properties.clear(); ++ for (Property property : source.getProperties().values()) { ++ properties.put(property.getName(), property); ++ } + } + + public CraftPlayerProfile(GameProfile profile) { @@ -122,7 +168,10 @@ index 000000000..1d669e3e2 + + public boolean complete() { + if (!profile.isComplete()) { -+ profile = MinecraftServer.getServer().getSessionService().fillProfileProperties(profile, true); ++ GameProfile result = MinecraftServer.getServer().getSessionService().fillProfileProperties(profile, true); ++ if (result != null) { ++ this.profile = result; ++ } + } + return profile.isComplete(); + } @@ -132,8 +181,8 @@ index 000000000..1d669e3e2 + } + + public static PlayerProfile asBukkitCopy(GameProfile gameProfile) { -+ PlayerProfile profile = new CraftPlayerProfile(gameProfile.getId(), gameProfile.getName()); -+ gameProfile.getProperties().values().forEach(property -> profile.setProperty(toBukkit(property))); ++ CraftPlayerProfile profile = new CraftPlayerProfile(gameProfile.getId(), gameProfile.getName()); ++ copyProfileProperties(gameProfile, profile.profile); + return profile; + } + @@ -247,7 +296,7 @@ index e8bddc171..3b01ebd96 100644 return this.W; } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 77c16fe2c..aca5ea7c0 100644 +index 77c16fe2c..2dd7ed96a 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -135,6 +135,10 @@ import org.bukkit.craftbukkit.util.CraftNamespacedKey; @@ -261,7 +310,7 @@ index 77c16fe2c..aca5ea7c0 100644 public final class CraftServer implements Server { private final String serverName = "Paper"; private final String serverVersion; -@@ -1923,5 +1927,17 @@ public final class CraftServer implements Server { +@@ -1923,5 +1927,21 @@ public final class CraftServer implements Server { public boolean suggestPlayerNamesWhenNullTabCompletions() { return com.destroystokyo.paper.PaperConfig.suggestPlayersWhenNullTabCompletions; } @@ -275,6 +324,10 @@ index 77c16fe2c..aca5ea7c0 100644 + } + + public com.destroystokyo.paper.profile.PlayerProfile createProfile(@Nullable UUID uuid, @Nullable String name) { ++ Player player = uuid != null ? Bukkit.getPlayer(uuid) : (name != null ? Bukkit.getPlayerExact(name) : null); ++ if (player != null) { ++ return new com.destroystokyo.paper.profile.CraftPlayerProfile((CraftPlayer)player); ++ } + return new com.destroystokyo.paper.profile.CraftPlayerProfile(uuid, name); + } // Paper end diff --git a/Spigot-Server-Patches/0278-Player.setPlayerProfile-API.patch b/Spigot-Server-Patches/0278-Player.setPlayerProfile-API.patch index 6d6f844fb..d1233f6d5 100644 --- a/Spigot-Server-Patches/0278-Player.setPlayerProfile-API.patch +++ b/Spigot-Server-Patches/0278-Player.setPlayerProfile-API.patch @@ -1,4 +1,4 @@ -From 9ae1f2a102c740bf3ff54f6397741196bfdd8f53 Mon Sep 17 00:00:00 2001 +From 7c932f5bcecf83c9dc4402042a9329fc1af62585 Mon Sep 17 00:00:00 2001 From: Aikar Date: Sun, 18 Mar 2018 12:29:48 -0400 Subject: [PATCH] Player.setPlayerProfile API @@ -19,7 +19,7 @@ index 4b82e43a8..35fde8b23 100644 private final ItemCooldown bW; @Nullable diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 21631c588..87e31cf0d 100644 +index 21631c588..9c894185b 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -1,6 +1,8 @@ @@ -82,7 +82,7 @@ index 21631c588..87e31cf0d 100644 + } + } + public PlayerProfile getPlayerProfile() { -+ return CraftPlayerProfile.asBukkitCopy(getHandle().getProfile()); ++ return new CraftPlayerProfile(this); + } + // Paper end