@@ -77,13 +77,14 @@ object ItemIconProvider {
7777
7878 private fun loadIcon (name : String ): BufferedImage ? {
7979 val jar = clientJar() ? : return null
80- val elements = resolveElements(jar, name)
80+ val resolved = resolveElements(jar, name)
81+ val elements = resolved?.first
8182 if (elements != null ) {
82- renderElements(jar, elements.first, elements .second)?.let { return it }
83+ renderElements(jar, elements, resolved .second)?.let { return it }
8384 }
8485
8586 val direct = readEntry(jar, " $TEXTURE_ROOT /item/$name .png" ) ? : readEntry(jar, " $TEXTURE_ROOT /block/$name .png" )
86- val fromModel = elements ?.second?.let { pickTexture(jar, it, FLAT_TEXTURE_KEYS ) }
87+ val fromModel = resolved ?.second?.let { pickTexture(jar, it, FLAT_TEXTURE_KEYS ) }
8788 return (direct ? : fromModel)?.let (::normalize)
8889 }
8990
@@ -94,10 +95,13 @@ object ItemIconProvider {
9495 // then walks "parent" upward, merging each level's "textures" (a child's own values win) until
9596 // a model with "elements" is found. Stops there rather than continuing further up, since every
9697 // vanilla model that defines shape also defines (or inherits from what's already been merged)
97- // concrete texture values for it. Returns null if the chain ends without ever finding elements
98- // (flat items like tools/food terminate at item/generated, which has neither) - the merged
99- // texture map is still returned in that case, letting the caller fall back to a flat texture.
100- private fun resolveElements (jar : ZipFile , name : String ): Pair <List <ModelElement >, Map<String, String>>? {
98+ // concrete texture values for it. The merged texture map is always returned alongside whatever
99+ // elements were found (possibly null, e.g. flat items like tools/food that terminate at
100+ // item/generated, which has neither) - callers fall back to it for a flat texture. This matters
101+ // even for a flat item whose own layer0 texture isn't named after the material itself (e.g. a
102+ // stained glass pane's flat icon reuses its stained-glass block's texture) - only this merged
103+ // map, not a guess based on the material's own name, can recover the right texture path there.
104+ private fun resolveElements (jar : ZipFile , name : String ): Pair <List <ModelElement >? , Map<String, String>>? {
101105 var path: String? = findLeafModelPath(jar, name) ? : return null
102106 val textureLayers = mutableListOf<Map <String , String >>()
103107 var elements: List <ModelElement >? = null
@@ -116,7 +120,7 @@ object ItemIconProvider {
116120
117121 val merged = mutableMapOf<String , String >()
118122 for (layer in textureLayers.asReversed()) merged.putAll(layer)
119- return elements?. let { it to merged }
123+ return elements to merged
120124 }
121125
122126 // A material's displayed model isn't always reachable by guessing "models/item/<name>.json"
0 commit comments