From f54e54da4071d2281f3063aae72940f5cdfa2baf Mon Sep 17 00:00:00 2001 From: Matthew Messinger Date: Sun, 26 Aug 2018 16:35:15 -0400 Subject: [PATCH] Fix skulls causing Pony to load before the texture is loaded. --- .../hdskins/DynamicTextureImage.java | 5 +++-- .../voxelmodpack/hdskins/HDSkinManager.java | 5 +---- .../hdskins/IBufferedTexture.java | 10 +++++++++ .../hdskins/ThreadDownloadImageETag.java | 3 ++- .../mixin/MixinThreadDownloadImageData.java | 10 +++++---- .../com/minelittlepony/pony/data/Pony.java | 22 ++++++------------- .../render/skull/PlayerSkullRenderer.java | 3 ++- 7 files changed, 31 insertions(+), 27 deletions(-) create mode 100644 src/hdskins/java/com/voxelmodpack/hdskins/IBufferedTexture.java diff --git a/src/hdskins/java/com/voxelmodpack/hdskins/DynamicTextureImage.java b/src/hdskins/java/com/voxelmodpack/hdskins/DynamicTextureImage.java index d7598b08..7847e245 100644 --- a/src/hdskins/java/com/voxelmodpack/hdskins/DynamicTextureImage.java +++ b/src/hdskins/java/com/voxelmodpack/hdskins/DynamicTextureImage.java @@ -4,7 +4,7 @@ import net.minecraft.client.renderer.texture.DynamicTexture; import java.awt.image.BufferedImage; -public class DynamicTextureImage extends DynamicTexture { +public class DynamicTextureImage extends DynamicTexture implements IBufferedTexture { private BufferedImage image; @@ -13,7 +13,8 @@ public class DynamicTextureImage extends DynamicTexture { this.image = bufferedImage; } - public BufferedImage getImage() { + @Override + public BufferedImage getBufferedImage() { return image; } diff --git a/src/hdskins/java/com/voxelmodpack/hdskins/HDSkinManager.java b/src/hdskins/java/com/voxelmodpack/hdskins/HDSkinManager.java index 14b898dd..ce640d8d 100644 --- a/src/hdskins/java/com/voxelmodpack/hdskins/HDSkinManager.java +++ b/src/hdskins/java/com/voxelmodpack/hdskins/HDSkinManager.java @@ -57,7 +57,6 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.function.Function; -import java.util.stream.Collectors; import javax.annotation.Nullable; public final class HDSkinManager implements IResourceManagerReloadListener { @@ -215,9 +214,6 @@ public final class HDSkinManager implements IResourceManagerReloadListener { skins.invalidateAll(); reloadSkins(); - clearListeners = clearListeners.stream() - .filter(this::onSkinCacheCleared) - .collect(Collectors.toList()); } private void clearNetworkSkin(NetworkPlayerInfo player) { @@ -258,6 +254,7 @@ public final class HDSkinManager implements IResourceManagerReloadListener { if (playClient != null) { playClient.getPlayerInfoMap().forEach(this::clearNetworkSkin); } + clearListeners.removeIf(this::onSkinCacheCleared); } public void parseSkin(Type type, ResourceLocation resource, MinecraftProfileTexture texture) { diff --git a/src/hdskins/java/com/voxelmodpack/hdskins/IBufferedTexture.java b/src/hdskins/java/com/voxelmodpack/hdskins/IBufferedTexture.java new file mode 100644 index 00000000..155e0f53 --- /dev/null +++ b/src/hdskins/java/com/voxelmodpack/hdskins/IBufferedTexture.java @@ -0,0 +1,10 @@ +package com.voxelmodpack.hdskins; + +import java.awt.image.BufferedImage; +import javax.annotation.Nullable; + +public interface IBufferedTexture { + + @Nullable + BufferedImage getBufferedImage(); +} diff --git a/src/hdskins/java/com/voxelmodpack/hdskins/ThreadDownloadImageETag.java b/src/hdskins/java/com/voxelmodpack/hdskins/ThreadDownloadImageETag.java index 92377f01..d9d314b3 100644 --- a/src/hdskins/java/com/voxelmodpack/hdskins/ThreadDownloadImageETag.java +++ b/src/hdskins/java/com/voxelmodpack/hdskins/ThreadDownloadImageETag.java @@ -30,7 +30,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.imageio.ImageIO; -public class ThreadDownloadImageETag extends SimpleTexture { +public class ThreadDownloadImageETag extends SimpleTexture implements IBufferedTexture { private static final Logger LOGGER = LogManager.getLogger(); private static final AtomicInteger THREAD_ID = new AtomicInteger(0); @@ -84,6 +84,7 @@ public class ThreadDownloadImageETag extends SimpleTexture { } } + @Override @Nullable public BufferedImage getBufferedImage() { return bufferedImage; diff --git a/src/main/java/com/minelittlepony/mixin/MixinThreadDownloadImageData.java b/src/main/java/com/minelittlepony/mixin/MixinThreadDownloadImageData.java index 6c4f0a60..9ca6a523 100644 --- a/src/main/java/com/minelittlepony/mixin/MixinThreadDownloadImageData.java +++ b/src/main/java/com/minelittlepony/mixin/MixinThreadDownloadImageData.java @@ -1,14 +1,16 @@ package com.minelittlepony.mixin; -import java.awt.image.BufferedImage; - +import com.voxelmodpack.hdskins.IBufferedTexture; +import net.minecraft.client.renderer.ThreadDownloadImageData; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -import net.minecraft.client.renderer.ThreadDownloadImageData; +import java.awt.image.BufferedImage; @Mixin(ThreadDownloadImageData.class) -public interface MixinThreadDownloadImageData { +public interface MixinThreadDownloadImageData extends IBufferedTexture { + @Accessor("bufferedImage") + @Override BufferedImage getBufferedImage(); } diff --git a/src/main/java/com/minelittlepony/pony/data/Pony.java b/src/main/java/com/minelittlepony/pony/data/Pony.java index 656f1a6a..56e5901b 100644 --- a/src/main/java/com/minelittlepony/pony/data/Pony.java +++ b/src/main/java/com/minelittlepony/pony/data/Pony.java @@ -2,9 +2,7 @@ package com.minelittlepony.pony.data; import com.google.common.base.MoreObjects; import com.minelittlepony.MineLittlePony; -import com.minelittlepony.mixin.MixinThreadDownloadImageData; -import com.voxelmodpack.hdskins.DynamicTextureImage; -import com.voxelmodpack.hdskins.ThreadDownloadImageETag; +import com.voxelmodpack.hdskins.IBufferedTexture; import net.minecraft.block.material.Material; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.ITextureObject; @@ -69,7 +67,7 @@ public class Pony { } @Nullable - private BufferedImage getBufferedImage(@Nonnull ResourceLocation resource) { + public static BufferedImage getBufferedImage(@Nonnull ResourceLocation resource) { try { IResource skin = Minecraft.getMinecraft().getResourceManager().getResource(resource); BufferedImage skinImage = TextureUtil.readBufferedImage(skin.getInputStream()); @@ -78,22 +76,16 @@ public class Pony { return skinImage; } catch (IOException ignored) { } - try { - ITextureObject texture = Minecraft.getMinecraft().getTextureManager().getTexture(resource); + ITextureObject texture = Minecraft.getMinecraft().getTextureManager().getTexture(resource); - if (texture instanceof MixinThreadDownloadImageData) { - return ((MixinThreadDownloadImageData) texture).getBufferedImage(); - } else if (texture instanceof ThreadDownloadImageETag) { - return ((ThreadDownloadImageETag) texture).getBufferedImage(); - } else if (texture instanceof DynamicTextureImage) { - return ((DynamicTextureImage) texture).getImage(); - } - } catch (Exception ignored) { } + if (texture instanceof IBufferedTexture) { + return ((IBufferedTexture) texture).getBufferedImage(); + } return null; } - private IPonyData checkSkin(BufferedImage bufferedimage) { + private IPonyData checkSkin(@Nullable BufferedImage bufferedimage) { if (bufferedimage == null) return new PonyData(); MineLittlePony.logger.debug("\tStart skin check for pony #{} with image {}.", ponyId, bufferedimage); return PonyData.parse(bufferedimage); diff --git a/src/main/java/com/minelittlepony/render/skull/PlayerSkullRenderer.java b/src/main/java/com/minelittlepony/render/skull/PlayerSkullRenderer.java index cae3bacc..db14de76 100644 --- a/src/main/java/com/minelittlepony/render/skull/PlayerSkullRenderer.java +++ b/src/main/java/com/minelittlepony/render/skull/PlayerSkullRenderer.java @@ -2,6 +2,7 @@ package com.minelittlepony.render.skull; import com.minelittlepony.PonyConfig; import com.minelittlepony.model.components.ModelDeadMau5Ears; +import com.minelittlepony.pony.data.Pony; import com.minelittlepony.pony.data.PonyLevel; import com.minelittlepony.render.PonySkull; import com.minelittlepony.render.RenderPony; @@ -41,7 +42,7 @@ public class PlayerSkullRenderer extends PonySkull { deadMau5.setVisible("deadmau5".equals(profile.getName())); ResourceLocation skin = HDSkinManager.INSTANCE.getTextures(profile).get(MinecraftProfileTexture.Type.SKIN); - if (skin != null) { + if (skin != null && Pony.getBufferedImage(skin) != null) { return skin; }