Skip to content

Commit e398a61

Browse files
committed
update ModelTextureReferencesResolvableValidator to validate if face reference textures exist
1 parent b7c5c3e commit e398a61

1 file changed

Lines changed: 33 additions & 2 deletions

File tree

src/main/java/dev/kinau/resourcepackvalidator/validator/models/ModelTextureReferencesResolvableValidator.java

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package dev.kinau.resourcepackvalidator.validator.models;
22

3+
import com.google.gson.JsonArray;
34
import com.google.gson.JsonElement;
45
import com.google.gson.JsonObject;
56
import dev.kinau.resourcepackvalidator.ValidationJob;
@@ -15,7 +16,13 @@
1516
import lombok.extern.slf4j.Slf4j;
1617

1718
import java.io.File;
18-
import java.util.*;
19+
import java.util.ArrayList;
20+
import java.util.HashMap;
21+
import java.util.HashSet;
22+
import java.util.List;
23+
import java.util.Map;
24+
import java.util.Optional;
25+
import java.util.Set;
1926
import java.util.stream.Collectors;
2027

2128
@Slf4j
@@ -114,11 +121,13 @@ private boolean validateTextureData(ModelPathWithSource model, ValidationJob job
114121
textureReferences.put(s, textureReferenceWithSource.referenceValue());
115122
});
116123

117-
118124
if (!detectReferenceChain(textureData, model, context))
119125
return false;
120126

121127
Set<TextureReferenceWithSource> references = textureData.values().stream().filter(s -> s.referenceValue().startsWith("#")).collect(Collectors.toSet());
128+
for (ModelWithSource parent : parents) {
129+
references.addAll(getFaceReferenceTextures(parent));
130+
}
122131
if (references.isEmpty()) return true;
123132

124133
boolean failed = false;
@@ -199,6 +208,28 @@ private Map<String, TextureReferenceWithSource> getTextureData(ModelWithSource m
199208
return textureData;
200209
}
201210

211+
private Set<TextureReferenceWithSource> getFaceReferenceTextures(ModelWithSource modelData) {
212+
Set<TextureReferenceWithSource> faceTextures = new HashSet<>();
213+
214+
if (modelData.modelObject().has("elements") && modelData.modelObject().get("elements").isJsonArray()) {
215+
JsonArray elements = modelData.modelObject().getAsJsonArray("elements");
216+
for (JsonElement element : elements) {
217+
if (!element.isJsonObject()) continue;
218+
JsonObject elementObj = element.getAsJsonObject();
219+
if (!elementObj.has("faces") || !elementObj.get("faces").isJsonObject()) continue;
220+
JsonObject facesObj = elementObj.getAsJsonObject("faces");
221+
for (String face : facesObj.keySet()) {
222+
if (!facesObj.get(face).isJsonObject()) continue;
223+
JsonObject faceObj = facesObj.getAsJsonObject(face);
224+
if (!faceObj.has("texture") || !faceObj.get("texture").isJsonPrimitive() || !faceObj.getAsJsonPrimitive("texture").isString()) continue;
225+
if (!faceObj.getAsJsonPrimitive("texture").getAsString().startsWith("#")) continue;
226+
faceTextures.add(new TextureReferenceWithSource(modelData.vanilla(), faceObj.getAsJsonPrimitive("texture").getAsString()));
227+
}
228+
}
229+
}
230+
return faceTextures;
231+
}
232+
202233
private boolean detectReferenceChain(Map<String, TextureReferenceWithSource> textureData, ModelPathWithSource model, FileContext context) {
203234
for (TextureReferenceWithSource textureField : textureData.values()) {
204235
// a child is already failing, do not fail twice for the parent again

0 commit comments

Comments
 (0)