diff --git a/libs/geyserutils-geyser-1.0-SNAPSHOT.jar b/libs/geyserutils-geyser-1.0-SNAPSHOT.jar index e5aeb05..6981883 100644 Binary files a/libs/geyserutils-geyser-1.0-SNAPSHOT.jar and b/libs/geyserutils-geyser-1.0-SNAPSHOT.jar differ diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/ExtensionMain.java b/src/main/java/re/imc/geysermodelenginepackgenerator/ExtensionMain.java index c8c8a6a..683cdca 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/ExtensionMain.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/ExtensionMain.java @@ -6,6 +6,7 @@ import org.geysermc.geyser.api.event.lifecycle.GeyserLoadResourcePacksEvent; import org.geysermc.geyser.api.event.lifecycle.GeyserPreInitializeEvent; import org.geysermc.geyser.api.extension.Extension; import re.imc.geysermodelenginepackgenerator.generator.Entity; +import re.imc.geysermodelenginepackgenerator.generator.Geometry; import re.imc.geysermodelenginepackgenerator.util.ZipUtil; import java.io.File; @@ -44,6 +45,13 @@ public class ExtensionMain implements Extension { for (String entity : GeneratorMain.entityMap.keySet()) { String id = "modelengine:" + entity; GeyserUtils.addCustomEntity(id); + + Geometry geometry = GeneratorMain.geometryMap.get(entity); + geometry.getBones().forEach(bone -> { + GeyserUtils.addProperty(id, bone, Boolean.class); + }); + + GeyserUtils.registerProperties(id); } } diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java b/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java index b2d4b98..9b3bc99 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java @@ -102,6 +102,7 @@ public class GeneratorMain { File modelsFolder = new File(output, "models/entity"); File texturesFolder = new File(output, "textures/entity"); File animationControllersFolder = new File(output, "animation_controllers"); + File renderControllersFolder = new File(output, "render_controllers"); File manifestFile = new File(output, "manifest.json"); @@ -140,6 +141,7 @@ public class GeneratorMain { modelsFolder.mkdirs(); texturesFolder.mkdirs(); animationControllersFolder.mkdirs(); + renderControllersFolder.mkdirs(); for (Map.Entry entry : animationMap.entrySet()) { entry.getValue().modify(); @@ -190,14 +192,33 @@ public class GeneratorMain { } for (Map.Entry entry : entityMap.entrySet()) { - entry.getValue().modify(); - Path path = entityFolder.toPath().resolve(entry.getValue().getPath() + entry.getKey() + ".entity.json"); - path.toFile().getParentFile().mkdirs(); - if (path.toFile().exists()) { + Entity entity = entry.getValue(); + entity.getProperties().setProperty("render_controller", "controller.render." + entry.getKey()); + entity.modify(); + + Path entityPath = entityFolder.toPath().resolve(entity.getPath() + entry.getKey() + ".entity.json"); + entityPath.toFile().getParentFile().mkdirs(); + if (entityPath.toFile().exists()) { continue; } try { - Files.writeString(path, entry.getValue().getJson(), StandardCharsets.UTF_8); + Files.writeString(entityPath, entity.getJson(), StandardCharsets.UTF_8); + } catch (IOException e) { + e.printStackTrace(); + } + + // render controller part + + String id = entity.getModelId(); + if (!geometryMap.containsKey(id)) continue; + RenderController controller = new RenderController(id, geometryMap.get(id).getBones()); + + Path renderPath = new File(renderControllersFolder, "controller.render." + id + ".json").toPath(); + if (renderPath.toFile().exists()) { + continue; + } + try { + Files.writeString(renderPath, controller.generate(), StandardCharsets.UTF_8); } catch (IOException e) { e.printStackTrace(); } diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Geometry.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Geometry.java index 927095a..600ae7d 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Geometry.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Geometry.java @@ -9,7 +9,9 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; @Getter @Setter @@ -19,6 +21,7 @@ public class Geometry { String modelId; JsonObject json; + List bones = new ArrayList<>(); String path; public void load(String json) { @@ -46,7 +49,7 @@ public class Geometry { name.startsWith("b_") || name.startsWith("ob_")) { iterator.remove(); - } + } else bones.add(name); } } setId("geometry.modelengine_" + modelId); diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java new file mode 100644 index 0000000..8e368f5 --- /dev/null +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java @@ -0,0 +1,56 @@ +package re.imc.geysermodelenginepackgenerator.generator; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; + +import java.util.List; + +public class RenderController { + + String modelId; + List bones; + + public RenderController(String modelId, List bones) { + this.modelId = modelId; + this.bones = bones; + } + + // look, I'm fine with your other code and stuff, but I ain't using templates for JSON lmao + public String generate() { + JsonObject root = new JsonObject(); + root.addProperty("format_version", "1.8.0"); + + JsonObject renderControllers = new JsonObject(); + root.add("render_controllers", renderControllers); + + JsonObject controller = new JsonObject(); + renderControllers.add("controller.render." + modelId, controller); + + controller.addProperty("geometry", "Geometry.default"); + + JsonArray materials = new JsonArray(); + JsonObject materialItem = new JsonObject(); + materialItem.addProperty("*", "Material.default"); + materials.add(materialItem); + controller.add("materials", materials); + + JsonArray textures = new JsonArray(); + textures.add("Texture.default"); + controller.add("textures", textures); + + JsonArray partVisibility = new JsonArray(); + JsonObject visibilityDefault = new JsonObject(); + visibilityDefault.addProperty("*", true); + partVisibility.add(visibilityDefault); + + for (String bone : bones) { + JsonObject visibilityItem = new JsonObject(); + visibilityItem.addProperty(bone, "query.property('" + modelId + ":" + bone + "')"); + partVisibility.add(visibilityItem); + } + controller.add("part_visibility", partVisibility); + + return root.toString(); + } + +}