diff --git a/src/main/java/net/worldseed/resourcepack/multipart/generator/AnimationGenerator.java b/src/main/java/net/worldseed/resourcepack/multipart/generator/AnimationGenerator.java index 72c1923..ee94323 100644 --- a/src/main/java/net/worldseed/resourcepack/multipart/generator/AnimationGenerator.java +++ b/src/main/java/net/worldseed/resourcepack/multipart/generator/AnimationGenerator.java @@ -37,6 +37,7 @@ public static JsonObject generate(JsonArray animationRaw) { List> scale = new ArrayList<>(); JsonArray keyframes = animator.getJsonArray("keyframes"); + if (keyframes == null) continue; for (int k = 0; k < keyframes.size(); k++) { JsonObject keyframe = keyframes.getJsonObject(k); diff --git a/src/main/java/net/worldseed/resourcepack/multipart/generator/GeoGenerator.java b/src/main/java/net/worldseed/resourcepack/multipart/generator/GeoGenerator.java index 9ea01eb..63ca678 100644 --- a/src/main/java/net/worldseed/resourcepack/multipart/generator/GeoGenerator.java +++ b/src/main/java/net/worldseed/resourcepack/multipart/generator/GeoGenerator.java @@ -6,11 +6,11 @@ import java.util.*; public class GeoGenerator { - private static List parseRecursive(JsonObject obj, Map cubeMap, Map locators, Map nullObjects, String parent) { + private static List parseRecursive(JsonObject obj, Map cubeMap, Map locators, Map nullObjects, Map groupUuidToName, String parent) { List res = new ArrayList<>(); float scale = 0.25f; - String name = getOutlinerName(obj); + String name = getOutlinerName(obj, groupUuidToName); JsonArray pivot = obj.getJsonArray("origin"); if (pivot == null) { pivot = Json.createArrayBuilder().add(0).add(0).add(0).build(); @@ -40,7 +40,7 @@ private static List parseRecursive(JsonObject obj, Map parseRecursive(JsonObject obj, Map groupUuidToName) { JsonString name = obj.getJsonString("name"); if (name != null) return name.getString(); JsonString uuid = obj.getJsonString("uuid"); - if (uuid != null) return uuid.getString(); + if (uuid != null) { + String id = uuid.getString(); + String mapped = groupUuidToName.get(id); + if (mapped != null) return mapped; + return id; + } return "bone_" + Integer.toUnsignedString(obj.hashCode()); } - public static JsonArray generate(JsonArray elements, JsonArray outliner, Map textures) { + /** Maps Blockbench group UUID strings to human-readable bone names when outliner nodes omit {@code name}. */ + static Map collectGroupUuidToName(JsonArray groups) { + Map map = new HashMap<>(); + if (groups == null) return map; + for (JsonValue v : groups) { + if (v.getValueType() != JsonValue.ValueType.OBJECT) continue; + collectGroupUuidToNameRecursive(v.asJsonObject(), map); + } + return map; + } + + private static void collectGroupUuidToNameRecursive(JsonObject group, Map out) { + JsonString uuid = group.getJsonString("uuid"); + JsonString name = group.getJsonString("name"); + if (uuid != null && name != null) { + out.putIfAbsent(uuid.getString(), name.getString()); + } + JsonArray children = group.getJsonArray("children"); + if (children == null) return; + for (JsonValue c : children) { + if (c.getValueType() != JsonValue.ValueType.OBJECT) continue; + collectGroupUuidToNameRecursive(c.asJsonObject(), out); + } + } + + public static JsonArray generate(JsonArray elements, JsonArray outliner, Map textures, Map groupUuidToName) { Map blocks = new HashMap<>(); Map locators = new HashMap<>(); Map nullObjects = new HashMap<>(); @@ -100,7 +130,7 @@ public static JsonArray generate(JsonArray elements, JsonArray outliner, Map textures = TextureGenerator.generate(model.getJsonArray("textures"), mcmetas, width, height); - JsonArray bones = GeoGenerator.generate(model.getJsonArray("elements"), model.getJsonArray("outliner"), textures); + var groupUuidToName = GeoGenerator.collectGroupUuidToName(model.getJsonArray("groups")); + JsonArray bones = GeoGenerator.generate(model.getJsonArray("elements"), model.getJsonArray("outliner"), textures, groupUuidToName); JsonObject description = Json.createObjectBuilder() .add("identifier", "geometry.unknown")