diff --git a/src/main/java/noppes/npcs/client/ClientCacheHandler.java b/src/main/java/noppes/npcs/client/ClientCacheHandler.java index 3e81bc125..dd55f7b5b 100644 --- a/src/main/java/noppes/npcs/client/ClientCacheHandler.java +++ b/src/main/java/noppes/npcs/client/ClientCacheHandler.java @@ -43,6 +43,12 @@ public class ClientCacheHandler { } } + public static boolean isCachedNPC(ResourceLocation resource) { + synchronized (imageDataCache) { + return imageDataCache.containsKey(resource.getResourcePath()); + } + } + public static void clearCache() { ClientCacheHandler.imageDataCache.clear(); ClientCacheHandler.animationCache.clear(); diff --git a/src/main/java/noppes/npcs/client/renderer/ImageData.java b/src/main/java/noppes/npcs/client/renderer/ImageData.java index db80df47b..5ca7cf33c 100644 --- a/src/main/java/noppes/npcs/client/renderer/ImageData.java +++ b/src/main/java/noppes/npcs/client/renderer/ImageData.java @@ -83,7 +83,7 @@ public class ImageData { } } - private ResourceLocation getLocation() { + public ResourceLocation getLocation() { return this.isUrl && this.imageDownloadAlt.getBufferedImage() == null ? null : this.location; } diff --git a/src/main/java/noppes/npcs/client/renderer/RenderNPCInterface.java b/src/main/java/noppes/npcs/client/renderer/RenderNPCInterface.java index 5dc55057a..b611c9d5f 100644 --- a/src/main/java/noppes/npcs/client/renderer/RenderNPCInterface.java +++ b/src/main/java/noppes/npcs/client/renderer/RenderNPCInterface.java @@ -320,8 +320,6 @@ public class RenderNPCInterface extends RenderLiving{ } else { npc.textureLocation = new ResourceLocation(npc.display.texture); } - } else if(LastTextureTick < 5) { //fixes request flood somewhat - return AbstractClientPlayer.locationStevePng; } else if(npc.display.skinType == 1 && npc.display.playerProfile != null) { Minecraft minecraft = Minecraft.getMinecraft(); Map map = minecraft.func_152342_ad().func_152788_a(npc.display.playerProfile); @@ -330,22 +328,25 @@ public class RenderNPCInterface extends RenderLiving{ } LastTextureTick = 0; } else if (npc.display.skinType == 2 || npc.display.skinType == 3) { - try { - MessageDigest digest = MessageDigest.getInstance("MD5"); - byte[] hash = digest.digest(npc.display.url.getBytes("UTF-8")); - StringBuilder sb = new StringBuilder(2*hash.length); - for (byte b : hash) { - sb.append(String.format("%02x", b&0xff)); - } - if (npc.display.skinType == 2) { - npc.textureLocation = new ResourceLocation("skins/" + sb.toString()); - ClientCacheHandler.getNPCTexture(npc.display.url, false, npc.textureLocation); - } else { - npc.textureLocation = new ResourceLocation("skins64/" + sb.toString()); - ClientCacheHandler.getNPCTexture(npc.display.url, true, npc.textureLocation); - } - LastTextureTick = 0; - } catch(Exception ignored){} + ResourceLocation location = new ResourceLocation("skins/" + (npc.display.modelType + npc.display.url).hashCode()); + // If URL Empty Steve + if(npc.display.url.isEmpty()){ return AbstractClientPlayer.locationStevePng; } + // If URL Cached then grab it + else if(ClientCacheHandler.isCachedNPC(location)){ + try { + npc.textureLocation = ClientCacheHandler.getNPCTexture(npc.display.url, npc.display.modelType > 0, location).getLocation(); + } catch(Exception ignored){} + } + // For New URL Requests do not spam it + else if(LastTextureTick < 5) { //fixes request flood somewhat + return AbstractClientPlayer.locationStevePng; + } + else { + try { + npc.textureLocation = ClientCacheHandler.getNPCTexture(npc.display.url, npc.display.modelType > 0, location).getLocation(); + LastTextureTick = 0; + } catch(Exception ignored){} + } } else { return AbstractClientPlayer.locationStevePng; }