diff options
Diffstat (limited to 'CraftBukkit-Patches/0133-Convert-player-skulls-async.patch')
-rw-r--r-- | CraftBukkit-Patches/0133-Convert-player-skulls-async.patch | 125 |
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 + |