diff --git a/pom.xml b/pom.xml index dcd0771..b5a01fe 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,10 @@ true + + jitpack.io + https://jitpack.io + @@ -62,5 +66,20 @@ system ${project.basedir}/libs/geyserutils-geyser-1.0-SNAPSHOT.jar + + me.rochblondiaux + blockbenchmodelreader + 1.2 + + + com.github.GeyserMC.PackConverter + bedrock-pack-schema + 3d8150474d + + + com.github.GeyserMC.PackConverter + pack-schema-api + 3d8150474d + \ No newline at end of file diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java b/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java index 881a388..8b3518c 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/GeneratorMain.java @@ -14,13 +14,15 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; public class GeneratorMain { public static final Map entityMap = new HashMap<>(); - public static final Map animationMap = new HashMap<>(); - public static final Map geometryMap = new HashMap<>(); - public static final Map textureMap = new HashMap<>(); + public static final Map animationMap = new HashMap<>(); + public static final Map geometryMap = new HashMap<>(); + public static final Map> textureMap = new HashMap<>(); public static final Gson GSON = new GsonBuilder().setPrettyPrinting() .create(); @@ -40,13 +42,23 @@ public class GeneratorMain { String modelId = folder.getName().toLowerCase(); Entity entity = new Entity(modelId); + TextureConfig textureConfig = new TextureConfig(); boolean canAdd = false; for (File e : folder.listFiles()) { if (e.isDirectory()) { generateFromFolder(currentPath + folder.getName() + "/", e); } if (e.getName().endsWith(".png")) { - textureMap.put(modelId, new Texture(modelId, currentPath, e.toPath())); + String textureName = e.getName().replace(".png", ""); + Set bindingBones = new HashSet<>(); + bindingBones.add("*"); + if (!textureConfig.getBingingBones().containsKey(textureName)) { + bindingBones = textureConfig.getBingingBones().get(textureName); + } + textureMap.computeIfAbsent(modelId, s -> new HashMap<>()).put(textureName, new Texture(modelId, currentPath, bindingBones, e.toPath())); + if (!textureConfig.getBingingBones().isEmpty()) { + textureConfig.getBingingBones().put(textureName, Set.of("*")); + } } if (e.getName().endsWith(".json")) { try { @@ -136,6 +148,15 @@ public class GeneratorMain { materialsFolder.mkdirs(); File materialFile = new File(materialsFolder, "entity.material"); + + if (!materialFile.exists()) { + try { + Files.writeString(materialFile.toPath(), + Material.TEMPLATE, StandardCharsets.UTF_8); + } catch (IOException e) { + e.printStackTrace(); + } + } for (Map.Entry entry : animationMap.entrySet()) { Entity entity = entityMap.get(entry.getKey()); @@ -179,7 +200,7 @@ public class GeneratorMain { } } - for (Map.Entry entry : textureMap.entrySet()) { + for (Map.Entry> entry : textureMap.entrySet()) { Path path = texturesFolder.toPath().resolve(entry.getValue().getPath() + entry.getKey() + ".png"); path.toFile().getParentFile().mkdirs(); @@ -213,7 +234,7 @@ public class GeneratorMain { String id = entity.getModelId(); if (!geometryMap.containsKey(id)) continue; - RenderController controller = new RenderController(id, geometryMap.get(id).getBones()); + RenderController controller = new RenderController(id, geometryMap.get(id).getBones(), entity); entity.setRenderController(controller); Path renderPath = new File(renderControllersFolder, "controller.render." + id + ".json").toPath(); if (renderPath.toFile().exists()) { diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Entity.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Entity.java index d195564..0ed2c85 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Entity.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Entity.java @@ -11,6 +11,7 @@ import me.zimzaza4.geyserutils.geyser.GeyserUtils; import re.imc.geysermodelenginepackgenerator.GeneratorMain; import java.util.HashSet; +import java.util.Map; import java.util.Properties; import java.util.Set; @@ -26,13 +27,12 @@ public class Entity { "description": { "identifier": "modelengine:%entity_id%", "materials": { - "default": "%material%" + "default": "%material%", + "anim": "entity_alphatest_anim_change_color" }, "textures": { - "default": "%texture%" }, "geometry": { - "default": "%geometry%" }, "animations": { "look_at_target": "%look_at_target%" @@ -54,19 +54,13 @@ public class Entity { String modelId; JsonObject json; boolean hasHeadAnimation = false; - @Setter - @Getter Animation animation; - - @Setter - @Getter Geometry geometry; - - @Setter - @Getter RenderController renderController; - String path; + Map textureMap; + TextureConfig textureConfig; + Properties config = new Properties(); @@ -87,6 +81,14 @@ public class Entity { JsonObject description = json.get("minecraft:client_entity").getAsJsonObject().get("description").getAsJsonObject(); JsonObject jsonAnimations = description.get("animations").getAsJsonObject(); + JsonObject jsonTextures = description.get("textures").getAsJsonObject(); + JsonObject jsonGeometry = description.get("geometry").getAsJsonObject(); + + for (String name : textureMap.keySet()) { + jsonTextures.addProperty(name,"textures/entity/" + path + modelId + "/" + name); + jsonGeometry.addProperty(name, "geometry.modelengine_" + modelId); + } + JsonArray animate = description.get("scripts").getAsJsonObject().get("animate").getAsJsonArray(); if (animation != null) { diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Material.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Material.java new file mode 100644 index 0000000..2150879 --- /dev/null +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Material.java @@ -0,0 +1,17 @@ +package re.imc.geysermodelenginepackgenerator.generator; + +public class Material { + public static final String TEMPLATE = """ + { + "materials":{ + "version":"1.0.0", + "entity_alphatest_anim_change_color:entity_alphatest_change_color":{ + "+defines":[ + "USE_UV_ANIM" + ] + } + } + } + """; + +} diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java index 0f7ecab..275c0ec 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/RenderController.java @@ -11,10 +11,12 @@ public class RenderController { public static final Set NEED_REMOVE_WHEN_SORT = Set.of("pbody_", "plarm_", "prarm_", "plleg_", "prleg_", "phead_", "p_"); String modelId; Set bones; + Entity entity; - public RenderController(String modelId, Set bones) { + public RenderController(String modelId, Set bones, Entity entity) { this.modelId = modelId; this.bones = bones; + this.entity = entity; } // look, I'm fine with your other code and stuff, but I ain't using templates for JSON lmao diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Texture.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Texture.java index c0bd870..2715e5e 100644 --- a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Texture.java +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/Texture.java @@ -5,6 +5,7 @@ import lombok.Getter; import lombok.Setter; import java.nio.file.Path; +import java.util.Set; @Getter @Setter @@ -12,8 +13,7 @@ import java.nio.file.Path; public class Texture { String modelId; - String path; + Set bindingBones; Path originalPath; - } diff --git a/src/main/java/re/imc/geysermodelenginepackgenerator/generator/TextureConfig.java b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/TextureConfig.java new file mode 100644 index 0000000..39d752f --- /dev/null +++ b/src/main/java/re/imc/geysermodelenginepackgenerator/generator/TextureConfig.java @@ -0,0 +1,33 @@ +package re.imc.geysermodelenginepackgenerator.generator; + +import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +public class TextureConfig { + + @SerializedName("binding_bones") + Map> bingingBones = new HashMap<>(); + @SerializedName("anim_textures") + Map animTextures = new HashMap<>(); + + @NoArgsConstructor + @AllArgsConstructor + @Getter + @Setter + public static class AnimTextureOptions { + boolean animUv; + float fps; + int frames; + } +}