Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
115 changes: 65 additions & 50 deletions src/main/java/noppes/npcs/client/renderer/RenderNPCInterface.java
Original file line number Diff line number Diff line change
Expand Up @@ -536,65 +536,80 @@ protected void renderLivingAt(EntityLivingBase entityliving, double d, double d1

@Override
public ResourceLocation getEntityTexture(Entity entity) {

EntityNPCInterface npc = (EntityNPCInterface) entity;
if (npc.textureLocation == null) {
if (npc.display.skinType == 0) {

// Early exit if texture already resolved
if (npc.textureLocation != null) {
return npc.textureLocation;
}

// SkinType 0: custom texture or default
if (npc.display.skinType == 0) {
if (npc.display.texture.isEmpty()) {
return npc.textureLocation = fallBackSkin(npc);
}

try {
if (npc instanceof EntityCustomNpc && ((EntityCustomNpc) npc).modelData.entityClass == null) {
if (!(npc.display.texture).isEmpty()) {
try {
npc.textureLocation = adjustLocalTexture(npc, new ResourceLocation(npc.display.texture));
} catch (IOException ignored) {
}
}
npc.textureLocation = adjustLocalTexture(npc, new ResourceLocation(npc.display.texture));
} else {
npc.textureLocation = new ResourceLocation(npc.display.texture);
ResourceLocation resLoc = new ResourceLocation(npc.display.texture);
Minecraft.getMinecraft().getResourceManager().getResource(resLoc);
npc.textureLocation = resLoc;
}
} 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);
if (map.containsKey(Type.SKIN)) {
npc.textureLocation = minecraft.func_152342_ad().func_152792_a((MinecraftProfileTexture) map.get(Type.SKIN), Type.SKIN);
}
LastTextureTick = 0;
} else if (npc.display.skinType == 2 || npc.display.skinType == 3) {
ResourceLocation location = new ResourceLocation("skins/" + (npc.display.skinType + npc.display.url).hashCode());
// If URL Empty Steve
if (npc.display.url.isEmpty()) {
return fallBackSkin(npc);
}
// If URL Cached then grab it
else if (ClientCacheHandler.isCachedNPC(location)) {
try {
ResourceLocation loc = ClientCacheHandler.getNPCTexture(npc.display.url, npc.display.skinType == 3, location).getLocation();
if (loc != null) {
npc.textureLocation = loc;
} else {
return fallBackSkin(npc);
}
} catch (Exception ignored) {
}
}
// For New URL Requests do not spam it
else if (LastTextureTick < 5) { //fixes request flood somewhat
return fallBackSkin(npc);
} catch (IOException ignored) {
return fallBackSkin(npc);
}
}

// SkinType 1: player profile skin
else if (npc.display.skinType == 1 && npc.display.playerProfile != null) {
final Minecraft minecraft = Minecraft.getMinecraft();
Map map = minecraft.func_152342_ad().func_152788_a(npc.display.playerProfile);
if (map.containsKey(Type.SKIN)) {
npc.textureLocation = minecraft.func_152342_ad()
.func_152792_a((MinecraftProfileTexture) map.get(Type.SKIN), Type.SKIN);
}
LastTextureTick = 0;
}

// SkinType 2 / 3: load from URL
else if (npc.display.skinType == 2 || npc.display.skinType == 3) {
if (npc.display.url.isEmpty()) { // If URL is empty → fallback
return fallBackSkin(npc);
}

ResourceLocation location = new ResourceLocation("skins/" + (npc.display.skinType + npc.display.url).hashCode());

try {
if (ClientCacheHandler.isCachedNPC(location)) { // If URL is cached
ResourceLocation loc = ClientCacheHandler
.getNPCTexture(npc.display.url, npc.display.skinType == 3, location)
.getLocation();
if (loc == null) return fallBackSkin(npc);
npc.textureLocation = loc;
} else if (LastTextureTick >= 5) { // Prevent request flooding
ResourceLocation loc = ClientCacheHandler
.getNPCTexture(npc.display.url, npc.display.skinType == 3, location)
.getLocation();
if (loc == null) return fallBackSkin(npc);
npc.textureLocation = loc;
LastTextureTick = 0;
} else {
try {
ResourceLocation loc = ClientCacheHandler.getNPCTexture(npc.display.url, npc.display.skinType == 3, location).getLocation();
if (loc != null) {
npc.textureLocation = loc;
} else {
return fallBackSkin(npc);
}
LastTextureTick = 0;
} catch (Exception ignored) {
}
return fallBackSkin(npc);
}
} else {
} catch (Exception ignored) {
return fallBackSkin(npc);
}
}
return npc.textureLocation;

// Fallback: if no valid skin type matched
else {
return fallBackSkin(npc);
}

// Final safety net
return npc.textureLocation == null ? fallBackSkin(npc) : npc.textureLocation;
}

private ResourceLocation adjustLocalTexture(EntityNPCInterface npc, ResourceLocation location) throws IOException {
Expand Down