Skip to content
Open
Show file tree
Hide file tree
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
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ publishing {
publications.create<MavenPublication>("maven") {
groupId = "net.worldseed.multipart"
artifactId = "WorldSeedEntityEngine"
version = "11.3.5"
version = "11.3.6"

from(components["java"])
}
Expand Down
1 change: 0 additions & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
[versions]
java = "25"
junit = "6.0.0-M2"
minestom = "2025.10.11-1.21.10"
commons-io = "2.20.0"
Expand Down
6 changes: 3 additions & 3 deletions jitpack.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
jdk:
- openjdk21
- openjdk25
before_install:
- sdk install java 21.0.2-open
- sdk use java 21.0.2-open
- sdk install java 25-open
- sdk use java 25-open
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,28 @@
import java.util.*;

public class GeoGenerator {
private static List<JsonObject> parseRecursive(JsonObject obj, Map<String, JsonObject> cubeMap, Map<String, JsonObject> locators, Map<String, JsonObject> nullObjects, String parent) {
private static List<JsonObject> parseRecursive(JsonObject obj, Map<String, JsonObject> cubeMap, Map<String, JsonObject> locators, Map<String, JsonObject> nullObjects, Map<String, JsonObject> groups, String parent) {
List<JsonObject> res = new ArrayList<>();
float scale = 0.25f;

String name = obj.getString("name");
JsonArray pivot = obj.getJsonArray("origin");
pivot = Json.createArrayBuilder()
.add(-pivot.getJsonNumber(0).doubleValue() * scale)
.add(pivot.getJsonNumber(1).doubleValue() * scale)
.add(pivot.getJsonNumber(2).doubleValue() * scale)
.build();
JsonObject group = groups.get(obj.getString("uuid"));
JsonObject data = group != null ? group : obj;

String name = data.getString("name");
JsonArray pivot = data.getJsonArray("origin");
if (pivot == null) {
pivot = Json.createArrayBuilder().add(0).add(0).add(0).build();
} else {
pivot = Json.createArrayBuilder()
.add(-pivot.getJsonNumber(0).doubleValue() * scale)
.add(pivot.getJsonNumber(1).doubleValue() * scale)
.add(pivot.getJsonNumber(2).doubleValue() * scale)
.build();
}

JsonArrayBuilder cubes = Json.createArrayBuilder();

JsonArray rotation = obj.getJsonArray("rotation");
JsonArray rotation = data.getJsonArray("rotation");
if (rotation == null) {
rotation = Json.createArrayBuilder().add(0).add(0).add(0).build();
} else {
Expand All @@ -34,7 +41,7 @@ private static List<JsonObject> parseRecursive(JsonObject obj, Map<String, JsonO

for (JsonValue child : obj.getJsonArray("children")) {
if (child.getValueType() == JsonValue.ValueType.OBJECT) {
res.addAll(parseRecursive(child.asJsonObject(), cubeMap, locators, nullObjects, name));
res.addAll(parseRecursive(child.asJsonObject(), cubeMap, locators, nullObjects, groups, name));
} else if (child.getValueType() == JsonValue.ValueType.STRING) {
JsonObject cube = cubeMap.get(child.toString());
if (cube == null) continue;
Expand Down Expand Up @@ -85,10 +92,18 @@ private static List<JsonObject> parseRecursive(JsonObject obj, Map<String, JsonO
return res;
}

public static JsonArray generate(JsonArray elements, JsonArray outliner, Map<String, TextureGenerator.TextureData> textures) {
public static JsonArray generate(JsonArray elements, JsonArray outliner, JsonArray groupsArray, Map<String, TextureGenerator.TextureData> textures) {
Map<String, JsonObject> blocks = new HashMap<>();
Map<String, JsonObject> locators = new HashMap<>();
Map<String, JsonObject> nullObjects = new HashMap<>();
Map<String, JsonObject> groups = new HashMap<>();

if (groupsArray != null) {
for (JsonValue groupValue : groupsArray) {
JsonObject group = groupValue.asJsonObject();
groups.put(group.getString("uuid"), group);
}
}

for (var element : elements) {
JsonObject el = element.asJsonObject();
Expand All @@ -111,7 +126,7 @@ public static JsonArray generate(JsonArray elements, JsonArray outliner, Map<Str
for (var outline : outliner) {
if (outline instanceof JsonObject) {
JsonObject el = outline.asJsonObject();
bonesList.addAll(parseRecursive(el, blocks, locators, nullObjects, null));
bonesList.addAll(parseRecursive(el, blocks, locators, nullObjects, groups, null));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public static BBEntityModel generate(PackBuilder.Model modelObj) {
}

Map<String, TextureGenerator.TextureData> textures = TextureGenerator.generate(model.getJsonArray("textures"), mcmetas, width, height);
JsonArray bones = GeoGenerator.generate(model.getJsonArray("elements"), model.getJsonArray("outliner"), textures);
JsonArray bones = GeoGenerator.generate(model.getJsonArray("elements"), model.getJsonArray("outliner"), model.getJsonArray("groups"), textures);

JsonObject description = Json.createObjectBuilder()
.add("identifier", "geometry.unknown")
Expand Down
5 changes: 3 additions & 2 deletions src/test/java/demo_models/bulbasaur/BulbasaurMoveGoal.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ public void start() {

this.lastTargetPos = target.getPosition();

if (!navigator.getPathPosition().samePoint(lastTargetPos)) {
//noinspection ConstantValue
if (navigator.getPathPosition() == null || !navigator.getPathPosition().samePoint(lastTargetPos)) {
navigator.setPathTo(lastTargetPos);
} else {
forceEnd = true;
Expand Down Expand Up @@ -87,4 +88,4 @@ public void end() {
this.animationHandler.stopRepeat("animation.bulbasaur.ground_walk");
this.forceEnd = false;
}
}
}
2 changes: 1 addition & 1 deletion src/test/resources/bbmodel/weapon.bbmodel
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"meta":{"format_version":"4.10","model_format":"bedrock","box_uv":true},"name":"weapon","model_identifier":"","visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"bedrock_animation_mode":"entity","timeline_setups":[],"unhandled_root_fields":{},"resolution":{"width":32,"height":32},"elements":[{"name":"cube","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-1,-4,-3],"to":[5,-3,-1],"autouv":0,"color":9,"rotation":[0,90,0],"origin":[2,-8,0],"uv_offset":[4,4],"faces":{"north":{"uv":[6,6,12,7],"texture":0},"east":{"uv":[4,6,6,7],"texture":0},"south":{"uv":[14,6,20,7],"texture":0},"west":{"uv":[12,6,14,7],"texture":0},"up":{"uv":[12,6,6,4],"texture":0},"down":{"uv":[18,4,12,6],"texture":0}},"type":"cube","uuid":"673cb472-daf4-8d14-b9ed-4db607b1da9a"}],"outliner":[{"name":"bone","origin":[0,-6,0],"bedrock_binding":"","color":0,"uuid":"b5da9add-a741-ba4e-811b-eb250bb0bc7b","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["673cb472-daf4-8d14-b9ed-4db607b1da9a"]}],"textures":[{"path":"","name":"texture","folder":"block","namespace":"","id":"0","group":"","width":32,"height":32,"uv_width":32,"uv_height":32,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","pbr_channel":"color","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":false,"uuid":"8b69906f-f5bf-6158-140b-b3c4729b096e","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAALpJREFUWEdjZMABtlx5+B+b1PzeyVh1rJ3fw4jLLHziODWBHGChIoOi98SdJwwgB0iLS6CIP335gmHUAcMzBOiSCJ1f9GJN7RJX0rEm3pmnJmEVZwl/g1WcQ7kPb+5gBDnAQlwMNbW/fMUAcoCCBDeK+IMXXxlADuBWlEMR/3r/EQPIAezS6ijiP5/eZCDKAdicTrcQIKfwoKYeskqvUQeMhsBoCIyGwGgIjIbAaAiMhsBoCIyGwLAKAQAuh2YhJZ2urAAAAABJRU5ErkJggg=="}]}
{"meta":{"format_version":"5.0","model_format":"bedrock","box_uv":true},"name":"weapon","model_identifier":"","visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"bedrock_animation_mode":"entity","timeline_setups":[],"unhandled_root_fields":{},"resolution":{"width":32,"height":32},"elements":[{"name":"cube","box_uv":true,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-1,-4,-3],"to":[5,-3,-1],"autouv":0,"color":9,"rotation":[0,90,0],"origin":[2,-8,0],"uv_offset":[4,4],"faces":{"north":{"uv":[6,6,12,7],"texture":0},"east":{"uv":[4,6,6,7],"texture":0},"south":{"uv":[14,6,20,7],"texture":0},"west":{"uv":[12,6,14,7],"texture":0},"up":{"uv":[12,6,6,4],"texture":0},"down":{"uv":[18,4,12,6],"texture":0}},"type":"cube","uuid":"673cb472-daf4-8d14-b9ed-4db607b1da9a"}],"groups":[{"uuid":"b5da9add-a741-ba4e-811b-eb250bb0bc7b","export":true,"locked":false,"origin":[0,-6,0],"rotation":[0,0,0],"bedrock_binding":"","color":0,"name":"bone","children":[],"reset":false,"shade":true,"mirror_uv":false,"selected":false,"visibility":true,"autouv":0,"isOpen":true}],"outliner":[{"uuid":"b5da9add-a741-ba4e-811b-eb250bb0bc7b","isOpen":true,"children":["673cb472-daf4-8d14-b9ed-4db607b1da9a"]}],"textures":[{"name":"texture","path":"","folder":"block","namespace":"","id":"0","group":"","width":32,"height":32,"uv_width":32,"uv_height":32,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","pbr_channel":"color","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":false,"uuid":"8b69906f-f5bf-6158-140b-b3c4729b096e","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAALpJREFUWEdjZMABtlx5+B+b1PzeyVh1rJ3fw4jLLHziODWBHGChIoOi98SdJwwgB0iLS6CIP335gmHUAcMzBOiSCJ1f9GJN7RJX0rEm3pmnJmEVZwl/g1WcQ7kPb+5gBDnAQlwMNbW/fMUAcoCCBDeK+IMXXxlADuBWlEMR/3r/EQPIAezS6ijiP5/eZCDKAdicTrcQIKfwoKYeskqvUQeMhsBoCIyGwGgIjIbAaAiMhsBoCIyGwLAKAQAuh2YhJZ2urAAAAABJRU5ErkJggg=="}]}