2020-05-06 09:48:49 +00:00
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2018-01-16 03:13:17 +00:00
From: Aikar <aikar@aikar.co>
Date: Mon, 15 Jan 2018 22:11:48 -0500
Subject: [PATCH] Basic PlayerProfile API
2018-05-11 03:01:52 +00:00
Establishes base extension of profile systems for future edits too
2018-01-16 03:13:17 +00:00
2018-01-19 05:03:09 +00:00
diff --git a/src/main/java/com/destroystokyo/paper/profile/CraftPlayerProfile.java b/src/main/java/com/destroystokyo/paper/profile/CraftPlayerProfile.java
2018-01-16 03:13:17 +00:00
new file mode 100644
2020-06-25 09:27:25 +00:00
index 0000000000000000000000000000000000000000..d73de9eb89c4e3a748907f2da21a3072cc6b7f41
2018-01-16 03:13:17 +00:00
--- /dev/null
2018-01-19 05:03:09 +00:00
+++ b/src/main/java/com/destroystokyo/paper/profile/CraftPlayerProfile.java
2020-06-25 09:27:25 +00:00
@@ -0,0 +1,296 @@
2018-01-16 03:13:17 +00:00
+package com.destroystokyo.paper.profile;
+
2018-03-22 05:28:22 +00:00
+import com.destroystokyo.paper.PaperConfig;
+import com.google.common.base.Charsets;
2018-01-16 03:13:17 +00:00
+import com.mojang.authlib.GameProfile;
+import com.mojang.authlib.properties.Property;
+import com.mojang.authlib.properties.PropertyMap;
2018-03-18 15:31:32 +00:00
+import net.minecraft.server.MinecraftServer;
2018-03-26 01:50:46 +00:00
+import net.minecraft.server.UserCache;
2020-06-22 02:59:34 +00:00
+import org.apache.commons.lang3.Validate;
2018-03-22 05:28:22 +00:00
+import org.bukkit.craftbukkit.entity.CraftPlayer;
+import org.spigotmc.SpigotConfig;
2018-01-16 03:13:17 +00:00
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
2018-01-21 19:09:09 +00:00
+import java.util.AbstractSet;
2018-01-16 03:13:17 +00:00
+import java.util.Collection;
2018-01-21 19:09:09 +00:00
+import java.util.Iterator;
2018-03-23 01:56:18 +00:00
+import java.util.Objects;
2018-01-16 03:13:17 +00:00
+import java.util.Set;
+import java.util.UUID;
+
2018-01-19 05:03:09 +00:00
+public class CraftPlayerProfile implements PlayerProfile {
2018-01-16 03:13:17 +00:00
+
2018-03-18 15:31:32 +00:00
+ private GameProfile profile;
2018-03-23 01:40:57 +00:00
+ private final PropertySet properties = new PropertySet();
2018-01-16 03:13:17 +00:00
+
2018-03-22 05:28:22 +00:00
+ public CraftPlayerProfile(CraftPlayer player) {
2018-03-23 01:40:57 +00:00
+ this.profile = player.getHandle().getProfile();
+ }
+
2018-01-19 05:03:09 +00:00
+ public CraftPlayerProfile(UUID id, String name) {
2018-03-26 00:05:30 +00:00
+ this.profile = new GameProfile(id, name);
2018-03-23 01:40:57 +00:00
+ }
+
+ public CraftPlayerProfile(GameProfile profile) {
2020-06-22 02:59:34 +00:00
+ Validate.notNull(profile, "GameProfile cannot be null!");
2018-03-23 01:40:57 +00:00
+ this.profile = profile;
2018-03-22 05:28:22 +00:00
+ }
+
2018-03-26 00:05:30 +00:00
+ @Override
+ public boolean hasProperty(String property) {
+ return profile.getProperties().containsKey(property);
+ }
2018-03-22 05:28:22 +00:00
+
2018-03-26 00:05:30 +00:00
+ @Override
+ public void setProperty(ProfileProperty property) {
+ String name = property.getName();
+ PropertyMap properties = profile.getProperties();
+ properties.removeAll(name);
+ properties.put(name, new Property(name, property.getValue(), property.getSignature()));
2018-03-22 05:28:22 +00:00
+ }
+
2018-03-26 00:05:30 +00:00
+ public GameProfile getGameProfile() {
2018-03-23 01:40:57 +00:00
+ return profile;
+ }
+
2018-03-26 00:05:30 +00:00
+ @Nullable
+ @Override
+ public UUID getId() {
+ return profile.getId();
2018-01-16 03:13:17 +00:00
+ }
+
2018-03-26 01:50:46 +00:00
+ @Override
+ public UUID setId(@Nullable UUID uuid) {
+ GameProfile prev = this.profile;
+ this.profile = new GameProfile(uuid, prev.getName());
+ copyProfileProperties(prev, this.profile);
+ return prev.getId();
+ }
+
2018-03-26 00:05:30 +00:00
+ @Nullable
2018-01-16 03:13:17 +00:00
+ @Override
2018-03-26 00:05:30 +00:00
+ public String getName() {
+ return profile.getName();
2018-01-19 05:38:49 +00:00
+ }
+
2018-03-26 01:50:46 +00:00
+ @Override
+ public String setName(@Nullable String name) {
+ GameProfile prev = this.profile;
+ this.profile = new GameProfile(prev.getId(), name);
+ copyProfileProperties(prev, this.profile);
+ return prev.getName();
+ }
+
2018-03-26 00:05:30 +00:00
+ @Nonnull
2018-01-19 05:38:49 +00:00
+ @Override
2018-03-26 00:05:30 +00:00
+ public Set<ProfileProperty> getProperties() {
+ return properties;
2018-01-16 03:13:17 +00:00
+ }
+
+ @Override
+ public void setProperties(Collection<ProfileProperty> properties) {
+ properties.forEach(this::setProperty);
+ }
+
+ @Override
2018-03-26 00:05:30 +00:00
+ public void clearProperties() {
+ profile.getProperties().clear();
+ }
+
+ @Override
2018-01-16 03:13:17 +00:00
+ public boolean removeProperty(String property) {
+ return !profile.getProperties().removeAll(property).isEmpty();
+ }
+
+ @Override
2018-03-26 00:05:30 +00:00
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ CraftPlayerProfile that = (CraftPlayerProfile) o;
+ return Objects.equals(profile, that.profile);
+ }
+
+ @Override
+ public int hashCode() {
+ return profile.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return profile.toString();
+ }
+
+ @Override
+ public CraftPlayerProfile clone() {
+ CraftPlayerProfile clone = new CraftPlayerProfile(this.getId(), this.getName());
+ clone.setProperties(getProperties());
+ return clone;
2018-01-16 03:13:17 +00:00
+ }
+
+ @Override
+ public boolean isComplete() {
+ return profile.isComplete();
+ }
+
2018-03-26 01:50:46 +00:00
+ @Override
+ public boolean completeFromCache() {
2020-06-23 08:53:02 +00:00
+ MinecraftServer server = MinecraftServer.getServer();
+ return completeFromCache(false, server.getOnlineMode() || (SpigotConfig.bungee && PaperConfig.bungeeOnlineMode));
+ }
+
+ public boolean completeFromCache(boolean onlineMode) {
+ return completeFromCache(false, onlineMode);
2018-03-26 01:50:46 +00:00
+ }
+
2020-06-23 08:53:02 +00:00
+ public boolean completeFromCache(boolean lookupUUID, boolean onlineMode) {
2018-03-23 01:40:57 +00:00
+ MinecraftServer server = MinecraftServer.getServer();
+ String name = profile.getName();
2018-03-26 01:50:46 +00:00
+ UserCache userCache = server.getUserCache();
2018-03-23 01:40:57 +00:00
+ if (profile.getId() == null) {
2018-03-26 01:50:46 +00:00
+ final GameProfile profile;
2020-06-23 08:53:02 +00:00
+ if (onlineMode) {
+ profile = lookupUUID ? userCache.getProfile(name) : userCache.getProfileIfCached(name);
2018-03-26 01:50:46 +00:00
+ } else {
+ // Make an OfflinePlayer using an offline mode UUID since the name has no profile
+ profile = new GameProfile(UUID.nameUUIDFromBytes(("OfflinePlayer:" + name).getBytes(Charsets.UTF_8)), name);
+ }
2018-07-31 05:37:41 +00:00
+ if (profile != null) {
2020-06-20 01:32:42 +00:00
+ // if old has it, assume its newer, so overwrite, else use cached if it was set and ours wasn't
+ copyProfileProperties(this.profile, profile);
2018-07-31 05:37:41 +00:00
+ this.profile = profile;
2018-03-23 01:40:57 +00:00
+ }
+ }
2018-03-26 01:50:46 +00:00
+
2020-06-20 18:46:57 +00:00
+ if ((profile.getName() == null || !hasTextures()) && profile.getId() != null) {
2018-03-26 01:50:46 +00:00
+ GameProfile profile = userCache.getProfile(this.profile.getId());
2018-03-26 00:05:30 +00:00
+ if (profile != null) {
2020-06-20 01:32:42 +00:00
+ // if old has it, assume its newer, so overwrite, else use cached if it was set and ours wasn't
+ copyProfileProperties(this.profile, profile);
2018-03-26 00:05:30 +00:00
+ this.profile = profile;
+ }
+ }
2018-03-26 01:50:46 +00:00
+ return this.profile.isComplete();
+ }
+
+ public boolean complete(boolean textures) {
+ MinecraftServer server = MinecraftServer.getServer();
2020-06-23 08:53:02 +00:00
+ return complete(textures, server.getOnlineMode() || (SpigotConfig.bungee && PaperConfig.bungeeOnlineMode));
+ }
+ public boolean complete(boolean textures, boolean onlineMode) {
+ MinecraftServer server = MinecraftServer.getServer();
2018-03-26 01:50:46 +00:00
+
2020-06-25 09:27:25 +00:00
+ boolean isCompleteFromCache = this.completeFromCache(true, onlineMode);
2020-06-23 08:53:02 +00:00
+ if (onlineMode && (!isCompleteFromCache || textures && !hasTextures())) {
2018-03-23 01:40:57 +00:00
+ GameProfile result = server.getSessionService().fillProfileProperties(profile, true);
2018-03-22 05:28:22 +00:00
+ if (result != null) {
2020-06-20 01:32:42 +00:00
+ copyProfileProperties(result, this.profile, true);
2018-03-22 05:28:22 +00:00
+ }
2020-06-25 09:27:25 +00:00
+ if (this.profile.isComplete()) {
+ server.getUserCache().saveProfile(this.profile);
+ }
2018-03-21 23:12:02 +00:00
+ }
2020-06-23 08:53:02 +00:00
+ return profile.isComplete() && (!onlineMode || !textures || hasTextures());
2018-03-18 15:31:32 +00:00
+ }
+
2018-03-26 00:05:30 +00:00
+ private static void copyProfileProperties(GameProfile source, GameProfile target) {
2020-06-20 01:32:42 +00:00
+ copyProfileProperties(source, target, false);
+ }
+
+ private static void copyProfileProperties(GameProfile source, GameProfile target, boolean clearTarget) {
2018-03-26 01:50:46 +00:00
+ PropertyMap sourceProperties = source.getProperties();
2020-06-20 01:32:42 +00:00
+ PropertyMap targetProperties = target.getProperties();
+ if (clearTarget) targetProperties.clear();
2018-03-26 01:50:46 +00:00
+ if (sourceProperties.isEmpty()) {
+ return;
+ }
+
+ for (Property property : sourceProperties.values()) {
2020-06-20 01:32:42 +00:00
+ targetProperties.put(property.getName(), property);
2018-03-26 00:05:30 +00:00
+ }
+ }
+
2018-01-19 05:03:09 +00:00
+ private static ProfileProperty toBukkit(Property property) {
2018-01-16 03:13:17 +00:00
+ return new ProfileProperty(property.getName(), property.getValue(), property.getSignature());
+ }
2018-01-19 05:03:09 +00:00
+
2018-01-19 05:38:49 +00:00
+ public static PlayerProfile asBukkitCopy(GameProfile gameProfile) {
2018-03-22 05:28:22 +00:00
+ CraftPlayerProfile profile = new CraftPlayerProfile(gameProfile.getId(), gameProfile.getName());
+ copyProfileProperties(gameProfile, profile.profile);
2018-01-19 05:03:09 +00:00
+ return profile;
+ }
+
2018-01-19 05:38:49 +00:00
+ public static PlayerProfile asBukkitMirror(GameProfile profile) {
+ return new CraftPlayerProfile(profile);
+ }
+
2018-01-19 05:03:09 +00:00
+ public static Property asAuthlib(ProfileProperty property) {
+ return new Property(property.getName(), property.getValue(), property.getSignature());
+ }
2018-03-26 00:05:30 +00:00
+
2018-01-19 05:38:49 +00:00
+ public static GameProfile asAuthlibCopy(PlayerProfile profile) {
+ CraftPlayerProfile craft = ((CraftPlayerProfile) profile);
+ return asAuthlib(craft.clone());
+ }
+
+ public static GameProfile asAuthlib(PlayerProfile profile) {
+ CraftPlayerProfile craft = ((CraftPlayerProfile) profile);
+ return craft.getGameProfile();
+ }
2018-01-21 19:09:09 +00:00
+
+ private class PropertySet extends AbstractSet<ProfileProperty> {
+
+ @Override
2018-03-08 02:03:01 +00:00
+ @Nonnull
2018-01-21 19:09:09 +00:00
+ public Iterator<ProfileProperty> iterator() {
2018-03-08 02:03:01 +00:00
+ return new ProfilePropertyIterator(profile.getProperties().values().iterator());
2018-01-21 19:09:09 +00:00
+ }
+
+ @Override
+ public int size() {
+ return profile.getProperties().size();
+ }
+
+ @Override
+ public boolean add(ProfileProperty property) {
+ setProperty(property);
+ return true;
+ }
+
+ @Override
+ public boolean addAll(Collection<? extends ProfileProperty> c) {
+ //noinspection unchecked
+ setProperties((Collection<ProfileProperty>) c);
+ return true;
+ }
+
+ @Override
+ public boolean contains(Object o) {
+ return o instanceof ProfileProperty && profile.getProperties().containsKey(((ProfileProperty) o).getName());
+ }
2018-03-08 02:03:01 +00:00
+
+ private class ProfilePropertyIterator implements Iterator<ProfileProperty> {
+ private final Iterator<Property> iterator;
+
+ ProfilePropertyIterator(Iterator<Property> iterator) {
+ this.iterator = iterator;
+ }
+
+ @Override
+ public boolean hasNext() {
+ return iterator.hasNext();
+ }
+
+ @Override
+ public ProfileProperty next() {
+ return toBukkit(iterator.next());
+ }
+
+ @Override
+ public void remove() {
+ iterator.remove();
+ }
+ }
2018-01-21 19:09:09 +00:00
+ }
2018-01-16 03:13:17 +00:00
+}
2018-05-11 03:01:52 +00:00
diff --git a/src/main/java/com/destroystokyo/paper/profile/PaperAuthenticationService.java b/src/main/java/com/destroystokyo/paper/profile/PaperAuthenticationService.java
new file mode 100644
2020-06-25 13:11:48 +00:00
index 0000000000000000000000000000000000000000..ef9f55afd6bffa8c02c6820295223e5465eed91e
2018-05-11 03:01:52 +00:00
--- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/profile/PaperAuthenticationService.java
2020-06-25 13:11:48 +00:00
@@ -0,0 +1,31 @@
2018-05-11 03:01:52 +00:00
+package com.destroystokyo.paper.profile;
+
2020-06-25 13:11:48 +00:00
+import com.mojang.authlib.*;
2018-05-11 03:01:52 +00:00
+import com.mojang.authlib.minecraft.MinecraftSessionService;
+import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService;
2020-06-25 13:11:48 +00:00
+import com.mojang.authlib.yggdrasil.YggdrasilEnvironment;
2018-05-11 03:01:52 +00:00
+
+import java.net.Proxy;
+
+public class PaperAuthenticationService extends YggdrasilAuthenticationService {
2020-06-25 13:11:48 +00:00
+ private final Environment environment;
2018-05-11 03:01:52 +00:00
+ public PaperAuthenticationService(Proxy proxy, String clientToken) {
+ super(proxy, clientToken);
2020-06-25 13:11:48 +00:00
+ this.environment = (Environment)EnvironmentParser.getEnvironmentFromProperties().orElse(YggdrasilEnvironment.PROD);;
2018-05-11 03:01:52 +00:00
+ }
+
+ @Override
+ public UserAuthentication createUserAuthentication(Agent agent) {
+ return new PaperUserAuthentication(this, agent);
+ }
+
+ @Override
+ public MinecraftSessionService createMinecraftSessionService() {
2020-06-25 13:11:48 +00:00
+ return new PaperMinecraftSessionService(this, this.environment);
2018-05-11 03:01:52 +00:00
+ }
+
+ @Override
+ public GameProfileRepository createProfileRepository() {
2020-06-25 13:11:48 +00:00
+ return new PaperGameProfileRepository(this, this.environment);
2018-05-11 03:01:52 +00:00
+ }
+}
diff --git a/src/main/java/com/destroystokyo/paper/profile/PaperGameProfileRepository.java b/src/main/java/com/destroystokyo/paper/profile/PaperGameProfileRepository.java
new file mode 100644
2020-06-25 13:11:48 +00:00
index 0000000000000000000000000000000000000000..582c169c85ac66f1f9430f79042e4655f776c157
2018-05-11 03:01:52 +00:00
--- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/profile/PaperGameProfileRepository.java
2020-06-25 13:11:48 +00:00
@@ -0,0 +1,18 @@
2018-05-11 03:01:52 +00:00
+package com.destroystokyo.paper.profile;
+
+import com.mojang.authlib.Agent;
2020-06-25 13:11:48 +00:00
+import com.mojang.authlib.Environment;
2018-05-11 03:01:52 +00:00
+import com.mojang.authlib.ProfileLookupCallback;
+import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService;
+import com.mojang.authlib.yggdrasil.YggdrasilGameProfileRepository;
+
+public class PaperGameProfileRepository extends YggdrasilGameProfileRepository {
2020-06-25 13:11:48 +00:00
+ public PaperGameProfileRepository(YggdrasilAuthenticationService authenticationService, Environment environment) {
+ super(authenticationService, environment);
2018-05-11 03:01:52 +00:00
+ }
+
+ @Override
+ public void findProfilesByNames(String[] names, Agent agent, ProfileLookupCallback callback) {
+ super.findProfilesByNames(names, agent, callback);
+ }
+}
diff --git a/src/main/java/com/destroystokyo/paper/profile/PaperMinecraftSessionService.java b/src/main/java/com/destroystokyo/paper/profile/PaperMinecraftSessionService.java
new file mode 100644
2020-06-25 13:11:48 +00:00
index 0000000000000000000000000000000000000000..93d73c27340645c7502acafdc0b2cfbc1a759dd8
2018-05-11 03:01:52 +00:00
--- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/profile/PaperMinecraftSessionService.java
2020-06-25 13:11:48 +00:00
@@ -0,0 +1,30 @@
2018-05-11 03:01:52 +00:00
+package com.destroystokyo.paper.profile;
+
2020-06-25 13:11:48 +00:00
+import com.mojang.authlib.Environment;
2018-05-11 03:01:52 +00:00
+import com.mojang.authlib.GameProfile;
+import com.mojang.authlib.minecraft.MinecraftProfileTexture;
+import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService;
+import com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService;
+
+import java.util.Map;
+
+public class PaperMinecraftSessionService extends YggdrasilMinecraftSessionService {
2020-06-25 13:11:48 +00:00
+ protected PaperMinecraftSessionService(YggdrasilAuthenticationService authenticationService, Environment environment) {
+ super(authenticationService, environment);
2018-05-11 03:01:52 +00:00
+ }
+
+ @Override
+ public Map<MinecraftProfileTexture.Type, MinecraftProfileTexture> getTextures(GameProfile profile, boolean requireSecure) {
+ return super.getTextures(profile, requireSecure);
+ }
+
+ @Override
+ public GameProfile fillProfileProperties(GameProfile profile, boolean requireSecure) {
+ return super.fillProfileProperties(profile, requireSecure);
+ }
+
+ @Override
+ protected GameProfile fillGameProfile(GameProfile profile, boolean requireSecure) {
+ return super.fillGameProfile(profile, requireSecure);
+ }
+}
diff --git a/src/main/java/com/destroystokyo/paper/profile/PaperUserAuthentication.java b/src/main/java/com/destroystokyo/paper/profile/PaperUserAuthentication.java
new file mode 100644
2020-05-06 09:48:49 +00:00
index 0000000000000000000000000000000000000000..3aceb0ea8a1a3ed94dd8a9e954c52ecd341c6bd1
2018-05-11 03:01:52 +00:00
--- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/profile/PaperUserAuthentication.java
@@ -0,0 +1,11 @@
+package com.destroystokyo.paper.profile;
+
+import com.mojang.authlib.Agent;
+import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService;
+import com.mojang.authlib.yggdrasil.YggdrasilUserAuthentication;
+
+public class PaperUserAuthentication extends YggdrasilUserAuthentication {
+ public PaperUserAuthentication(YggdrasilAuthenticationService authenticationService, Agent agent) {
+ super(authenticationService, agent);
+ }
+}
2018-01-19 05:12:03 +00:00
diff --git a/src/main/java/net/minecraft/server/MCUtil.java b/src/main/java/net/minecraft/server/MCUtil.java
2020-06-25 13:11:48 +00:00
index da7a325d070e194cd1664ed20dcb3a762c9a517a..797654c653ec6dc4d46b457cf8a6121b29eca7aa 100644
2018-01-19 05:12:03 +00:00
--- a/src/main/java/net/minecraft/server/MCUtil.java
+++ b/src/main/java/net/minecraft/server/MCUtil.java
2020-05-22 23:03:48 +00:00
@@ -1,8 +1,11 @@
2018-01-19 05:12:03 +00:00
package net.minecraft.server;
2018-09-03 23:59:54 +00:00
import com.destroystokyo.paper.block.TargetBlockInfo;
2018-01-19 05:12:03 +00:00
+import com.destroystokyo.paper.profile.CraftPlayerProfile;
+import com.destroystokyo.paper.profile.PlayerProfile;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import org.apache.commons.lang.exception.ExceptionUtils;
2020-05-22 23:03:48 +00:00
+import com.mojang.authlib.GameProfile;
2018-01-19 05:12:03 +00:00
import org.bukkit.Location;
2018-09-03 23:59:54 +00:00
import org.bukkit.block.BlockFace;
2020-05-22 23:03:48 +00:00
import org.bukkit.craftbukkit.CraftWorld;
2020-06-09 07:17:25 +00:00
@@ -337,6 +340,10 @@ public final class MCUtil {
2018-01-19 05:12:03 +00:00
return run.get();
}
+ public static PlayerProfile toBukkit(GameProfile profile) {
2018-01-19 05:38:49 +00:00
+ return CraftPlayerProfile.asBukkitMirror(profile);
2018-01-19 05:12:03 +00:00
+ }
+
/**
* Calculates distance between 2 entities
* @param e1
2020-06-25 13:11:48 +00:00
diff --git a/src/main/java/net/minecraft/server/Main.java b/src/main/java/net/minecraft/server/Main.java
2020-06-26 16:20:03 +00:00
index d88946122e98abdefed54b29f510c7d4049fdff6..55c79f17a25f1bfe80cbc65e8c01ea1703f27538 100644
2020-06-25 13:11:48 +00:00
--- a/src/main/java/net/minecraft/server/Main.java
+++ b/src/main/java/net/minecraft/server/Main.java
@@ -87,7 +87,7 @@ public class Main {
}
File file = (File) optionset.valueOf("universe"); // CraftBukkit
2018-05-11 03:01:52 +00:00
- YggdrasilAuthenticationService yggdrasilauthenticationservice = new YggdrasilAuthenticationService(Proxy.NO_PROXY, UUID.randomUUID().toString());
+ YggdrasilAuthenticationService yggdrasilauthenticationservice = new com.destroystokyo.paper.profile.PaperAuthenticationService(Proxy.NO_PROXY, UUID.randomUUID().toString()); // Paper
MinecraftSessionService minecraftsessionservice = yggdrasilauthenticationservice.createMinecraftSessionService();
GameProfileRepository gameprofilerepository = yggdrasilauthenticationservice.createProfileRepository();
2020-06-25 13:11:48 +00:00
UserCache usercache = new UserCache(gameprofilerepository, new File(file, MinecraftServer.b.getName()));
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
2020-06-26 16:20:03 +00:00
index b06bb3dccda23ebed1532e17f9699b9b6828d9d8..62ca208a95434ca1d8970b01f7291647e0b1f93f 100644
2020-06-25 13:11:48 +00:00
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
2020-06-26 16:20:03 +00:00
@@ -1601,6 +1601,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
2020-06-25 13:11:48 +00:00
this.G = i;
2018-03-18 15:31:32 +00:00
}
2019-04-27 06:26:04 +00:00
+ public final MinecraftSessionService getSessionService() { return this.getMinecraftSessionService(); } // Paper - OBFHELPER
public MinecraftSessionService getMinecraftSessionService() {
return this.minecraftSessionService;
2018-03-18 15:31:32 +00:00
}
2020-06-20 01:32:42 +00:00
diff --git a/src/main/java/net/minecraft/server/TileEntitySkull.java b/src/main/java/net/minecraft/server/TileEntitySkull.java
2020-06-25 13:11:48 +00:00
index 4fae1b3274a96b871b39de083e9b28ab6129533f..9a2efd38f28819355a271b9515ac98c3382c7383 100644
2020-06-20 01:32:42 +00:00
--- a/src/main/java/net/minecraft/server/TileEntitySkull.java
+++ b/src/main/java/net/minecraft/server/TileEntitySkull.java
2020-06-25 13:11:48 +00:00
@@ -161,6 +161,7 @@ public class TileEntitySkull extends TileEntity /*implements ITickable*/ { // Pa
2020-06-20 01:32:42 +00:00
private void f() {
// Spigot start
GameProfile profile = this.gameProfile;
2020-06-22 02:59:34 +00:00
+ if (profile != null && profile.isComplete() && profile.getProperties().containsKey("textures")) return; // Paper
2020-06-20 01:32:42 +00:00
b(profile, new Predicate<GameProfile>() {
@Override
2020-06-25 13:11:48 +00:00
@@ -181,7 +182,16 @@ public class TileEntitySkull extends TileEntity /*implements ITickable*/ { // Pa
2020-06-20 01:32:42 +00:00
} else if (MinecraftServer.getServer() == null) {
callback.apply(gameprofile);
} else {
- GameProfile profile = skinCache.getIfPresent(gameprofile.getName().toLowerCase(java.util.Locale.ROOT));
+ // Paper start
+ com.destroystokyo.paper.profile.CraftPlayerProfile paperProfile = new com.destroystokyo.paper.profile.CraftPlayerProfile(gameprofile);
+ if (sync) {
+ // might complete by cache, but if not, go ahead and do it now, avoid the code below
2020-06-23 08:53:02 +00:00
+ paperProfile.complete(true, true);
2020-06-20 01:32:42 +00:00
+ } else {
2020-06-23 08:53:02 +00:00
+ paperProfile.completeFromCache(false, true);
2020-06-20 01:32:42 +00:00
+ }
+ GameProfile profile = paperProfile.getGameProfile();
+ // Paper end
if (profile != null && Iterables.getFirst(profile.getProperties().get("textures"), (Object) null) != null) {
callback.apply(profile);
2020-06-25 13:11:48 +00:00
@@ -190,7 +200,10 @@ public class TileEntitySkull extends TileEntity /*implements ITickable*/ { // Pa
2020-06-20 01:32:42 +00:00
Callable<GameProfile> callable = new Callable<GameProfile>() {
@Override
public GameProfile call() {
- final GameProfile profile = skinCache.getUnchecked(gameprofile.getName().toLowerCase(java.util.Locale.ROOT));
+ // Paper start
2020-06-23 08:53:02 +00:00
+ paperProfile.complete(true, true);
2020-06-20 01:32:42 +00:00
+ final GameProfile profile = paperProfile.getGameProfile();
+ // Paper end
MinecraftServer.getServer().processQueue.add(new Runnable() {
@Override
public void run() {
2018-03-26 01:50:46 +00:00
diff --git a/src/main/java/net/minecraft/server/UserCache.java b/src/main/java/net/minecraft/server/UserCache.java
2020-06-25 13:11:48 +00:00
index 4f769211cf98c3da720a904da3dcdcd4c7611f0b..a038397028848edb4f43cd4f7262546666e32883 100644
2018-03-26 01:50:46 +00:00
--- a/src/main/java/net/minecraft/server/UserCache.java
+++ b/src/main/java/net/minecraft/server/UserCache.java
2019-01-01 03:15:55 +00:00
@@ -43,7 +43,7 @@ public class UserCache {
2018-03-26 01:50:46 +00:00
public static final SimpleDateFormat a = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
private static boolean c;
2019-05-27 06:17:50 +00:00
- private final Map<String, UserCache.UserCacheEntry> d = new java.util.concurrent.ConcurrentHashMap<>(); // Paper
+ private final Map<String, UserCache.UserCacheEntry> d = new java.util.concurrent.ConcurrentHashMap<>();private final Map<String, UserCache.UserCacheEntry> nameCache = d; // Paper - OBFHELPER // Paper
private final Map<UUID, UserCache.UserCacheEntry> e = new java.util.concurrent.ConcurrentHashMap<>(); // Paper
2018-03-26 01:50:46 +00:00
private final Deque<GameProfile> f = new java.util.concurrent.LinkedBlockingDeque<GameProfile>(); // CraftBukkit
private final GameProfileRepository g;
2020-06-25 13:11:48 +00:00
@@ -93,6 +93,7 @@ public class UserCache {
2020-06-20 01:32:42 +00:00
return UserCache.c;
}
+ public void saveProfile(GameProfile gameprofile) { a(gameprofile); } // Paper - OBFHELPER
public void a(GameProfile gameprofile) {
this.a(gameprofile, (Date) null);
}
2020-06-25 13:11:48 +00:00
@@ -154,6 +155,13 @@ public class UserCache {
2018-07-18 00:08:13 +00:00
return usercache_usercacheentry == null ? null : usercache_usercacheentry.a();
2018-03-26 01:50:46 +00:00
}
+ // Paper start
+ @Nullable public GameProfile getProfileIfCached(String name) {
+ UserCache.UserCacheEntry entry = this.nameCache.get(name.toLowerCase(Locale.ROOT));
+ return entry == null ? null : entry.getProfile();
+ }
+ // Paper end
+
@Nullable
2019-12-11 23:43:22 +00:00
public GameProfile getProfile(UUID uuid) {
2019-12-13 01:18:18 +00:00
UserCache.UserCacheEntry usercache_usercacheentry = (UserCache.UserCacheEntry) this.e.get(uuid);
2020-06-25 13:11:48 +00:00
@@ -262,7 +270,7 @@ public class UserCache {
2018-03-26 01:50:46 +00:00
class UserCacheEntry {
- private final GameProfile b;
+ private final GameProfile b;public GameProfile getProfile() { return b; } // Paper - OBFHELPER
private final Date c;
private UserCacheEntry(GameProfile gameprofile, Date date) {
2018-01-16 03:13:17 +00:00
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
2020-06-27 05:12:11 +00:00
index 60a44992a962e15686f89247823389d3757d8b8c..feea84de7d2184caf24d79faee8874f7698e826e 100644
2018-01-16 03:13:17 +00:00
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
2020-06-25 14:09:55 +00:00
@@ -225,6 +225,9 @@ import org.yaml.snakeyaml.error.MarkedYAMLException;
2019-04-27 06:26:04 +00:00
import net.md_5.bungee.api.chat.BaseComponent; // Spigot
2018-01-16 03:13:17 +00:00
+import javax.annotation.Nullable; // Paper
+import javax.annotation.Nonnull; // Paper
+
public final class CraftServer implements Server {
2018-07-18 00:08:13 +00:00
private final String serverName = "Paper"; // Paper
2018-01-16 03:13:17 +00:00
private final String serverVersion;
2020-06-27 05:12:11 +00:00
@@ -2229,5 +2232,24 @@ public final class CraftServer implements Server {
2018-01-16 03:13:17 +00:00
public boolean suggestPlayerNamesWhenNullTabCompletions() {
return com.destroystokyo.paper.PaperConfig.suggestPlayersWhenNullTabCompletions;
}
+
2019-04-27 06:26:04 +00:00
+ @Override
2018-01-16 03:13:17 +00:00
+ public com.destroystokyo.paper.profile.PlayerProfile createProfile(@Nonnull UUID uuid) {
+ return createProfile(uuid, null);
+ }
+
2019-04-27 06:26:04 +00:00
+ @Override
2018-01-16 03:13:17 +00:00
+ public com.destroystokyo.paper.profile.PlayerProfile createProfile(@Nonnull String name) {
+ return createProfile(null, name);
+ }
+
2019-04-27 06:26:04 +00:00
+ @Override
2018-01-16 03:13:17 +00:00
+ public com.destroystokyo.paper.profile.PlayerProfile createProfile(@Nullable UUID uuid, @Nullable String name) {
2018-03-22 05:28:22 +00:00
+ 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);
+ }
2018-01-19 05:03:09 +00:00
+ return new com.destroystokyo.paper.profile.CraftPlayerProfile(uuid, name);
2018-01-16 03:13:17 +00:00
+ }
// Paper end
}
2020-06-20 01:32:42 +00:00
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java
2020-06-23 08:53:02 +00:00
index 4fb27cc7ed062696239f75b6f85ddb0a31866568..c31011ff91f4ea8368e3afbc5ec07eff84e93fe2 100644
2020-06-20 01:32:42 +00:00
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java
2020-06-22 02:59:34 +00:00
@@ -71,6 +71,13 @@ class CraftMetaSkull extends CraftMetaItem implements SkullMeta {
2020-06-20 01:32:42 +00:00
}
private void setProfile(GameProfile profile) {
+ // Paper start
2020-06-22 02:59:34 +00:00
+ if (profile != null) {
+ com.destroystokyo.paper.profile.CraftPlayerProfile paperProfile = new com.destroystokyo.paper.profile.CraftPlayerProfile(profile);
2020-06-23 08:53:02 +00:00
+ paperProfile.completeFromCache(false, true);
2020-06-22 02:59:34 +00:00
+ profile = paperProfile.getGameProfile();
+ }
2020-06-20 01:32:42 +00:00
+ // Paper end
this.profile = profile;
this.serializedProfile = (profile == null) ? null : GameProfileSerializer.serialize(new NBTTagCompound(), profile);
}