aboutsummaryrefslogtreecommitdiffhomepage
path: root/CraftBukkit-Patches/0133-Convert-player-skulls-async.patch
diff options
context:
space:
mode:
Diffstat (limited to 'CraftBukkit-Patches/0133-Convert-player-skulls-async.patch')
-rw-r--r--CraftBukkit-Patches/0133-Convert-player-skulls-async.patch125
1 files changed, 125 insertions, 0 deletions
diff --git a/CraftBukkit-Patches/0133-Convert-player-skulls-async.patch b/CraftBukkit-Patches/0133-Convert-player-skulls-async.patch
new file mode 100644
index 0000000000..c97eff5575
--- /dev/null
+++ b/CraftBukkit-Patches/0133-Convert-player-skulls-async.patch
@@ -0,0 +1,125 @@
+From d23be5d57d15f481f15fe9e3fab86eae8e72836a Mon Sep 17 00:00:00 2001
+From: Thinkofdeath <[email protected]>
+Date: Sun, 20 Apr 2014 13:18:55 +0100
+Subject: [PATCH] Convert player skulls async
+
+
+diff --git a/src/main/java/net/minecraft/server/TileEntitySkull.java b/src/main/java/net/minecraft/server/TileEntitySkull.java
+index 2a50db9..2b59690 100644
+--- a/src/main/java/net/minecraft/server/TileEntitySkull.java
++++ b/src/main/java/net/minecraft/server/TileEntitySkull.java
+@@ -6,11 +6,61 @@ import net.minecraft.util.com.google.common.collect.Iterables;
+ import net.minecraft.util.com.mojang.authlib.GameProfile;
+ import net.minecraft.util.com.mojang.authlib.properties.Property;
+
++// Spigot start
++import com.google.common.cache.Cache;
++import com.google.common.cache.CacheBuilder;
++import com.google.common.cache.CacheLoader;
++import java.util.concurrent.Executor;
++import java.util.concurrent.Executors;
++import java.util.concurrent.TimeUnit;
++
++import com.google.common.util.concurrent.ThreadFactoryBuilder;
++import net.minecraft.util.com.mojang.authlib.Agent;
++// Spigot end
++
+ public class TileEntitySkull extends TileEntity {
+
+ private int a;
+ private int i;
+ private GameProfile j = null;
++ // Spigot start
++ private static final Executor executor = Executors.newFixedThreadPool(3,
++ new ThreadFactoryBuilder()
++ .setNameFormat("Head Conversion Thread - %1$d")
++ .build()
++ );
++ private static final Cache<String, GameProfile> skinCache = CacheBuilder.newBuilder()
++ .maximumSize( 5000 )
++ .expireAfterAccess( 60, TimeUnit.MINUTES )
++ .build( new CacheLoader<String, GameProfile>()
++ {
++ @Override
++ public GameProfile load(String key) throws Exception
++ {
++ GameProfile[] profiles = new GameProfile[1];
++ GameProfileLookup gameProfileLookup = new GameProfileLookup(profiles);
++
++ MinecraftServer.getServer().getGameProfileRepository().findProfilesByNames(new String[] { key }, Agent.MINECRAFT, gameProfileLookup);
++ if (!MinecraftServer.getServer().getOnlineMode() && profiles[0] == null) {
++ UUID uuid = EntityHuman.a(new GameProfile(null, key));
++ GameProfile profile = new GameProfile(uuid, key);
++
++ gameProfileLookup.onProfileLookupSucceeded(profile);
++ }
++
++ GameProfile profile = profiles[0];
++
++ Property property = Iterables.getFirst(profile.getProperties().get("textures"), null);
++
++ if (property == null) {
++ profile = MinecraftServer.getServer().av().fillProfileProperties(profile, true);
++ }
++
++
++ return profile;
++ }
++ } );
++ // Spigot end
+
+ public TileEntitySkull() {}
+
+@@ -66,18 +116,38 @@ public class TileEntitySkull extends TileEntity {
+ private void d() {
+ if (this.j != null && !UtilColor.b(this.j.getName())) {
+ if (!this.j.isComplete() || !this.j.getProperties().containsKey("textures")) {
+- GameProfile gameprofile = MinecraftServer.getServer().getUserCache().getProfile(this.j.getName());
+-
+- if (gameprofile != null) {
+- Property property = (Property) Iterables.getFirst(gameprofile.getProperties().get("textures"), null);
+-
+- if (property == null) {
+- gameprofile = MinecraftServer.getServer().av().fillProfileProperties(gameprofile, true);
++ // Spigot start - Handle async
++ final String name = this.j.getName();
++ setSkullType( 0 ); // Work around a client bug
++ executor.execute(new Runnable() {
++ @Override
++ public void run() {
++
++ GameProfile profile = skinCache.getUnchecked( name.toLowerCase() );
++
++ if (profile != null) {
++ final GameProfile finalProfile = profile;
++ MinecraftServer.getServer().processQueue.add(new Runnable() {
++ @Override
++ public void run() {
++ a = 3;
++ j = finalProfile;
++ world.notify( x, y, z );
++ }
++ });
++ } else {
++ MinecraftServer.getServer().processQueue.add(new Runnable() {
++ @Override
++ public void run() {
++ a = 3;
++ j = new GameProfile( null, name );
++ world.notify( x, y, z );
++ }
++ });
++ }
+ }
+-
+- this.j = gameprofile;
+- this.update();
+- }
++ });
++ // Spigot end
+ }
+ }
+ }
+--
+1.9.1
+