diff --git a/Spigot-Server-Patches/Basic-PlayerProfile-API.patch b/Spigot-Server-Patches/Basic-PlayerProfile-API.patch index a9a6f7a5e2..84fdf9bb64 100644 --- a/Spigot-Server-Patches/Basic-PlayerProfile-API.patch +++ b/Spigot-Server-Patches/Basic-PlayerProfile-API.patch @@ -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 +0,0 @@ +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 @@ -0,0 +0,0 @@ import org.bukkit.craftbukkit.util.CraftNamespacedKey; @@ -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/Optimize-UserCache-Thread-Safe.patch b/Spigot-Server-Patches/Optimize-UserCache-Thread-Safe.patch index d7bbc5a540..720fc9539a 100644 --- a/Spigot-Server-Patches/Optimize-UserCache-Thread-Safe.patch +++ b/Spigot-Server-Patches/Optimize-UserCache-Thread-Safe.patch @@ -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 @@ -0,0 +0,0 @@ public class UserCache { @@ -64,6 +64,15 @@ index 487fc11f1..924dc63a4 100644 ArrayList arraylist = Lists.newArrayList(this.d.keySet()); return (String[]) arraylist.toArray(new String[arraylist.size()]); + } + ++ @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(); @@ -0,0 +0,0 @@ public class UserCache { } diff --git a/Spigot-Server-Patches/Player.setPlayerProfile-API.patch b/Spigot-Server-Patches/Player.setPlayerProfile-API.patch index 9399d4ccf4..301a764086 100644 --- a/Spigot-Server-Patches/Player.setPlayerProfile-API.patch +++ b/Spigot-Server-Patches/Player.setPlayerProfile-API.patch @@ -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 @@ -0,0 +0,0 @@ @@ -82,7 +82,7 @@ index 21631c588..87e31cf0d 100644 + } + } + public PlayerProfile getPlayerProfile() { -+ return CraftPlayerProfile.asBukkitCopy(getHandle().getProfile()); ++ return new CraftPlayerProfile(this); + } + // Paper end