From d4f4ac0b73e2229fc70ac0c90cf4247c3c023850 Mon Sep 17 00:00:00 2001 From: iambibi <89582596+iambibi@users.noreply.github.com> Date: Mon, 19 Oct 2026 11:17:30 +0200 Subject: [PATCH 1/5] feat: add texture for blocks --- libs/OpenMC.jar | Bin 6994197 -> 7007932 bytes .../fr/openmc/riftengine/core/RiftPlugin.java | 1 + .../core/converter/ConverterManager.java | 8 +- .../writers/blocks/BlocksMappingWriter.java | 109 +++++++++++++++ .../blocks/TerrainTextureJsonWriter.java | 128 ++++++++++++++++++ .../writers/items/ItemsMappingWriter.java | 17 ++- .../writers/items/ItemsTextureJsonWriter.java | 6 +- .../writers/manifest/ManifestWriter.java | 5 +- .../core/utils/IdentifierUtils.java | 7 + 9 files changed, 268 insertions(+), 13 deletions(-) create mode 100644 src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/BlocksMappingWriter.java create mode 100644 src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/TerrainTextureJsonWriter.java diff --git a/libs/OpenMC.jar b/libs/OpenMC.jar index 1ebfe430b5a3a6c9a45624ec0d284f8aea885688..d5706f655b983d740f4150e9f1dac2adfe2e28ad 100644 GIT binary patch delta 110932 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

E9zfcHXu52Vb!I2%68VTAIy%f=i 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 delta 98543 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 items; + + public BlocksMappingWriter(List items) { + this.items = items; + } + + @Override + public void write(Path bedrockRootPath, Path javaRootPath) throws Exception { + JsonObject root = new JsonObject(); + root.addProperty("format_version", 1); + + Map blockStatesByBlock = new HashMap<>(); + + for (ItemEntry item : items) { + IABehaviour behaviour = item.getBehaviour(); + if (!behaviour.isBlock()) continue; + if (!(behaviour instanceof BlocksBehaviour blockBehaviour)) continue; + Map resources = item.getBestResourcesId(); + + if (resources == null) continue; + + BlockStateScanner.CustomBlockState state = blockBehaviour.blockState(); + JsonObject def = new JsonObject(); + + def.addProperty("name", item.getKey()); + def.addProperty("geometry", "minecraft:geometry.full_block"); + def.add("material_instances", createMaterialInstance(item, resources.keySet())); + + blockStatesByBlock.computeIfAbsent(state.javaBlock(), _ -> new JsonObject()) + .add(state.state(), def); + + } + + JsonObject blocksSetter = new JsonObject(); + blockStatesByBlock.forEach((javaBlock, overrides) -> { + JsonObject def = new JsonObject(); + def.addProperty("name", IdentifierUtils.removeNamespace(javaBlock)); + def.addProperty("only_override_states", true); + def.add("state_overrides", overrides); + blocksSetter.add(javaBlock, def); + }); + root.add("blocks", blocksSetter); + + Path outputFile = PathUtils.getGeyserPath(RiftPlugin.getInstance().getDataPath()) + .resolve("custom_mappings").resolve("ia-blocks-injected.json"); + Files.deleteIfExists(outputFile); + Files.createDirectories(outputFile.getParent()); + Files.writeString(outputFile, GSON.toJson(root), StandardCharsets.UTF_8); + } + + private JsonObject createMaterialInstance(ItemEntry item, Set faceResources) { + JsonObject materialInstance = new JsonObject(); + String fallback = faceResources.stream() + .filter(face -> !face.equals("all")).findFirst() + .orElse(faceResources.stream().findFirst().orElse(null)); + if (fallback == null) return materialInstance; + + materialInstance.add("*", material(textureKey(item, fallback))); + + faceResources.forEach(face -> { + switch (face) { + case "side" -> List.of("north", "south", "east", "west") + .forEach(f -> materialInstance.add(f, material(textureKey(item, f)))); + case "up", "down", "north", "south", "east", "west" -> materialInstance.add(face, material(textureKey(item, face))); + default -> {} + } + }); + + return materialInstance; + } + + public static String textureKey(ItemEntry item, String state) { + return state.equals(ItemEntry.DEFAULT_STATE) ? item.getKey() : (item.getKey() + "_" + state); + } + + private JsonObject material(String texture) { + JsonObject m = new JsonObject(); + m.addProperty("texture", texture); + m.addProperty("render_method", "alpha_test"); + m.addProperty("face_dimming", true); + m.addProperty("ambient_occlusion", true); + return m; + } +} \ No newline at end of file diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/TerrainTextureJsonWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/TerrainTextureJsonWriter.java new file mode 100644 index 0000000..e8ce110 --- /dev/null +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/TerrainTextureJsonWriter.java @@ -0,0 +1,128 @@ +package fr.openmc.riftengine.core.converter.writers.blocks; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import fr.openmc.core.bootstrap.integration.OMCLogger; +import fr.openmc.riftengine.api.scanner.items.ItemEntry; +import fr.openmc.riftengine.api.scanner.items.entry.behaviours.IABehaviour; +import fr.openmc.riftengine.core.converter.writers.PackWriter; +import fr.openmc.riftengine.core.converter.writers.manifest.ManifestWriter; +import fr.openmc.riftengine.core.utils.IdentifierUtils; +import fr.openmc.riftengine.core.utils.PathUtils; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.Map; + +/** + * Ecrit le terrain_texture.json qui sert grosso modo a relier les textures aux items (une ref = une resource) + */ +public class TerrainTextureJsonWriter implements PackWriter { + private final List items; + + private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); + + public TerrainTextureJsonWriter(List items) { + this.items = items; + } + + @Override + public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { + JsonObject root = new JsonObject(); + + JsonObject textureData = new JsonObject(); + + for (ItemEntry itemEntry : items) { + IABehaviour behaviour = itemEntry.getBehaviour(); + if (!behaviour.isBlock()) { + OMCLogger.warn("Item {} : n'a pas block", itemEntry.namespacedId()); + continue; + } + System.out.println("Item : " + itemEntry.namespacedId()); + + Map bestResources = itemEntry.getBestResourcesId(); + if (bestResources == null) { + OMCLogger.warn("Item {} : n'a pas de best resources", itemEntry.namespacedId()); + continue; + } + + for (var entry : bestResources.entrySet()) { + String[] textureDataStr = getTextureData(itemEntry, entry.getKey(), entry.getValue(), javaRootPath); + + if (textureDataStr == null) { + OMCLogger.warn("Item {} : textureDataStr n'a pas de contenu", itemEntry.namespacedId()); + continue; + } + + JsonObject itemData = new JsonObject(); + itemData.addProperty("textures", textureDataStr[1]); + textureData.add(textureDataStr[0], itemData); + } + } + + root.addProperty("resource_pack_name", ManifestWriter.PACK_NAME); + root.addProperty("texture_name", "atlas.terrain"); + root.addProperty("padding", 8); + root.addProperty("num_mip_levels", 4); + root.add("texture_data", textureData); + + Path outputFile = bedrockRootPath.resolve("textures").resolve("terrain_texture.json"); + Files.createDirectories(outputFile.getParent()); + Files.writeString(outputFile, GSON.toJson(root), StandardCharsets.UTF_8); + } + + /** + * Retourne les id du namespace et de la resource + * (en fonction de si y'a des textures multiples ect fishing rod) + * Note a moi meme: + * - le state normal est skip, a ma vue c'est le state par défaut + */ + public String[] getTextureData(ItemEntry itemEntry, String stateResource, String resourceId, Path javaRootPath) { + String texture = null; + String namespace = itemEntry.getKey(); + + if (resourceId.isEmpty()) { + texture = "textures/blocks/" + itemEntry.getMaterial().name().toLowerCase(); + } else if (resourceId.startsWith("minecraft:")) { + String path = IdentifierUtils.normalizeId(resourceId).split(":", 2)[1]; + texture = IdentifierUtils.toBedrockTexturePath("textures/" + path); + } else { + Map resources = itemEntry.getResourcePath().apply(javaRootPath); + if (resources == null) { + OMCLogger.warn("Item {} : impossible de déterminer la texture", itemEntry.namespacedId()); + return null; + } + + if (resources.isEmpty()) { + OMCLogger.warn("Item {} : impossible de déterminer la texture", itemEntry.namespacedId()); + return null; + } + + Path resourcePath; + if (resources.size() > 1) { + resourcePath = resources.get(stateResource); + if (!stateResource.equals(ItemEntry.DEFAULT_STATE)) + namespace = itemEntry.getKey() + "_" + stateResource; + } else { + resourcePath = resources.values().stream().findFirst().get(); + } + + Path reducedPath = PathUtils.getPathFromRoot(resourcePath, "textures"); + if (reducedPath != null) { + texture = IdentifierUtils.toBedrockTexturePath(reducedPath.toString()) + .replaceFirst("\\.[^/.]+$", ""); + } + } + + if (texture == null) { + OMCLogger.warn("Item {} : impossible de déterminer la texture", itemEntry.namespacedId()); + return null; + } + + return new String[] {namespace, texture}; + } +} diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsMappingWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsMappingWriter.java index f98b6dc..10e393b 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsMappingWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsMappingWriter.java @@ -60,7 +60,8 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws Exception { root.add("items", itemsSetter); Path outputFile = PathUtils.getGeyserPath(RiftPlugin.getInstance().getDataPath()) - .resolve("custom_mappings").resolve("ia-injected.json"); + .resolve("custom_mappings").resolve("ia-items-injected.json"); + Files.deleteIfExists(outputFile); Files.createDirectories(outputFile.getParent()); Files.writeString(outputFile, GSON.toJson(root), StandardCharsets.UTF_8); } @@ -75,11 +76,13 @@ private JsonObject handleUniqueTexture(ItemEntry item) { def.addProperty("model", item.getNamespace() + ":ia_auto/" + item.getKey()); } - def.addProperty("bedrock_identifier", item.namespacedId()); + def.addProperty("bedrock_identifier", item.getKey()); - JsonObject options = new JsonObject(); - options.addProperty("icon", item.namespacedId()); - def.add("bedrock_options", options); + if (item.getBehaviour().isItem()) { + JsonObject options = new JsonObject(); + options.addProperty("icon", item.getKey()); + def.add("bedrock_options", options); + } return def; } @@ -100,7 +103,7 @@ private JsonArray handleMultipleTexture(ItemEntry item) { String namespaceId = item.namespacedId(); - if (!stateResource.equals("normal")) + if (!stateResource.equals(ItemEntry.DEFAULT_STATE)) namespaceId += "_" + stateResource; defObject.addProperty("bedrock_identifier", namespaceId); @@ -111,7 +114,7 @@ private JsonArray handleMultipleTexture(ItemEntry item) { // y'a 5 types de conditions (broken, damaged, custom_model_data, has_component, fishing_rod_cast), // note pour plus tard si ajout elytra - if (!stateResource.equals("normal") && item.getMaterial().equals(Material.FISHING_ROD)) { + if (!stateResource.equals(ItemEntry.DEFAULT_STATE) && item.getMaterial().equals(Material.FISHING_ROD)) { options.addProperty("display_handheld", true); JsonObject predicate = new JsonObject(); predicate.addProperty("type", "condition"); diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsTextureJsonWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsTextureJsonWriter.java index 232ab8a..6a50e15 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsTextureJsonWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsTextureJsonWriter.java @@ -71,7 +71,7 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { */ public String[] getTextureData(ItemEntry itemEntry, String stateResource, String resourceId, Path javaRootPath) { String texture = null; - String namespace = itemEntry.namespacedId(); + String namespace = itemEntry.getKey(); if (resourceId.isEmpty()) { texture = "textures/items/" + itemEntry.getMaterial().name().toLowerCase();; @@ -93,8 +93,8 @@ public String[] getTextureData(ItemEntry itemEntry, String stateResource, String Path resourcePath; if (resources.size() > 1) { resourcePath = resources.get(stateResource); - if (!stateResource.equals("normal")) - namespace = itemEntry.namespacedId() + "_" + stateResource; + if (!stateResource.equals(ItemEntry.DEFAULT_STATE)) + namespace = itemEntry.getKey() + "_" + stateResource; } else { resourcePath = resources.values().stream().findFirst().get(); } diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/ManifestWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/ManifestWriter.java index 8d6c8a1..54d659e 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/ManifestWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/ManifestWriter.java @@ -8,6 +8,7 @@ import java.nio.file.Path; public class ManifestWriter implements PackWriter { + public static final String PACK_NAME = "RiftPack"; private final PackIdentity identity; @@ -23,7 +24,7 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { { "format_version": 2, "header": { - "name": "RiftPack", + "name": "%s", "description": "Généré par RiftEngine à partir de celui de Java", "uuid": "%s", "version": %s, @@ -37,7 +38,7 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { } ] } - """.formatted(identity.headerUuid(), versionJson, identity.moduleUuid(), versionJson); + """.formatted(PACK_NAME, identity.headerUuid(), versionJson, identity.moduleUuid(), versionJson); Files.writeString(bedrockRootPath.resolve("manifest.json"), manifest, StandardCharsets.UTF_8); diff --git a/src/main/java/fr/openmc/riftengine/core/utils/IdentifierUtils.java b/src/main/java/fr/openmc/riftengine/core/utils/IdentifierUtils.java index aaeaea3..b167d4d 100644 --- a/src/main/java/fr/openmc/riftengine/core/utils/IdentifierUtils.java +++ b/src/main/java/fr/openmc/riftengine/core/utils/IdentifierUtils.java @@ -24,6 +24,13 @@ public static String normalizeId(String id, String defaultNamespace) { return defaultNamespace + ":" + id; } + public static String removeNamespace(String namespacedId) { + String[] splited = namespacedId.split(":"); + if (splited.length != 2) return namespacedId; + + return splited[1]; + } + /** * Résout un identifiant en un chemin de fichier dans les assets */ From ccf932e772eaffdaa72cfa9e89160d1ed66b76ad Mon Sep 17 00:00:00 2001 From: iambibi <89582596+iambibi@users.noreply.github.com> Date: Mon, 19 Oct 2026 16:15:00 +0200 Subject: [PATCH 2/5] chore: ResolverRegistry for better organization and functionality --- .../fr/openmc/riftengine/core/RiftError.java | 37 ++++++++ .../openmc/riftengine/core/RiftRegistry.java | 5 + .../core/converter/ConverterManager.java | 15 +-- .../core/converter/writers/PackWriter.java | 9 +- .../writers/blocks/BlocksMappingWriter.java | 45 +++++---- .../blocks/TerrainTextureJsonWriter.java | 91 +++---------------- .../writers/items/ItemsMappingWriter.java | 4 - .../writers/items/ItemsTextureJsonWriter.java | 85 ++--------------- .../writers/items/ItemsTextureWriter.java | 49 ++-------- .../writers/manifest/ManifestWriter.java | 6 +- .../writers/manifest/PackIdentity.java | 19 ++-- .../writers/ui/ScoreboardUiWriter.java | 4 - .../registry/resolver/AbstractResolver.java | 7 ++ .../registry/resolver/ResolverRegistry.java | 16 ++++ .../resolvers/items/ItemResourceResolver.java | 72 +++++++++++++++ .../resolvers/items/ResolvedItemResource.java | 21 +++++ 16 files changed, 236 insertions(+), 249 deletions(-) create mode 100644 src/main/java/fr/openmc/riftengine/core/RiftError.java create mode 100644 src/main/java/fr/openmc/riftengine/core/registry/resolver/AbstractResolver.java create mode 100644 src/main/java/fr/openmc/riftengine/core/registry/resolver/ResolverRegistry.java create mode 100644 src/main/java/fr/openmc/riftengine/core/resolvers/items/ItemResourceResolver.java create mode 100644 src/main/java/fr/openmc/riftengine/core/resolvers/items/ResolvedItemResource.java diff --git a/src/main/java/fr/openmc/riftengine/core/RiftError.java b/src/main/java/fr/openmc/riftengine/core/RiftError.java new file mode 100644 index 0000000..f6628e1 --- /dev/null +++ b/src/main/java/fr/openmc/riftengine/core/RiftError.java @@ -0,0 +1,37 @@ +package fr.openmc.riftengine.core; + +import fr.openmc.core.bootstrap.integration.OMCLogger; + +public enum RiftError { + ITEM_NOT_RESOURCE("Item {} : n'a pas de best resources", ErrorType.WARN), + RESOURCE_NOT_FOUND("Item {} : a aucune resource", ErrorType.WARN) + + ; + + private enum ErrorType { + WARN, + ERROR, + DEBUG, + INFO + } + + private final String message; + private final ErrorType type; + + RiftError(String message, ErrorType type) { + this.message = message; + this.type = type; + } + + public void send(Object... args) { + if (type == ErrorType.WARN) { + OMCLogger.warn(message, args); + } else if (type == ErrorType.ERROR) { + OMCLogger.error(message, args); + } else if (type == ErrorType.DEBUG) { + OMCLogger.debug(message, args); + } else if (type == ErrorType.INFO) { + OMCLogger.info(message, args); + } + } +} diff --git a/src/main/java/fr/openmc/riftengine/core/RiftRegistry.java b/src/main/java/fr/openmc/riftengine/core/RiftRegistry.java index 550ad10..3e60598 100644 --- a/src/main/java/fr/openmc/riftengine/core/RiftRegistry.java +++ b/src/main/java/fr/openmc/riftengine/core/RiftRegistry.java @@ -6,6 +6,7 @@ import fr.openmc.core.bootstrap.registries.RegistryContext; import fr.openmc.core.bootstrap.registries.RegistryLoadingType; import fr.openmc.riftengine.core.registry.glyphs.GlyphsRegistry; +import fr.openmc.riftengine.core.registry.resolver.ResolverRegistry; import java.util.ArrayList; import java.util.Arrays; @@ -14,12 +15,16 @@ public final class RiftRegistry { // * Registre globaux public static GlyphsRegistry GLYPHS; + public static ResolverRegistry RESOLVERS; private static final List LOADED = new ArrayList<>(); private static final List ALL = List.of( new RegistryContext( () -> GLYPHS = new GlyphsRegistry(), + RegistryLoadingType.RUNTIME), + new RegistryContext( + () -> RESOLVERS = new ResolverRegistry(), RegistryLoadingType.RUNTIME) ); diff --git a/src/main/java/fr/openmc/riftengine/core/converter/ConverterManager.java b/src/main/java/fr/openmc/riftengine/core/converter/ConverterManager.java index 2cb3450..484f70b 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/ConverterManager.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/ConverterManager.java @@ -7,6 +7,7 @@ import fr.openmc.riftengine.api.scanner.items.ItemEntry; import fr.openmc.riftengine.core.RiftConfig; import fr.openmc.riftengine.core.RiftPlugin; +import fr.openmc.riftengine.core.RiftRegistry; import fr.openmc.riftengine.core.converter.writers.PackWriter; import fr.openmc.riftengine.core.converter.writers.blocks.BlocksMappingWriter; import fr.openmc.riftengine.core.converter.writers.blocks.TerrainTextureJsonWriter; @@ -21,6 +22,7 @@ import fr.openmc.riftengine.core.converter.writers.manifest.PackIdentity; import fr.openmc.riftengine.core.converter.writers.translations.TranslationInjector; import fr.openmc.riftengine.core.converter.writers.ui.ScoreboardUiWriter; +import fr.openmc.riftengine.core.resolvers.items.ItemResourceResolver; import org.bukkit.plugin.java.JavaPlugin; import java.io.File; @@ -35,15 +37,16 @@ public class ConverterManager { private final RiftPlugin plugin; private final List writers = new ArrayList<>(); - private final PackIdentity identity; public ConverterManager(RiftPlugin plugin) { this.plugin = plugin; RiftConfig config = plugin.getRiftConfig(); Path itemsAdderContents = getItemsAdderContents(plugin); + ItemResourceResolver resolver = RiftRegistry.RESOLVERS.ITEM_RESOURCE_RESOLVER; + try { - identity = PackIdentity.loadOrCreate(plugin); + PackIdentity identity = PackIdentity.loadOrCreate(plugin); List items = OMCRegistry.SCANNERS.ITEMS.scan(itemsAdderContents); writers.addAll(List.of( new IconWriter(), @@ -56,12 +59,12 @@ public ConverterManager(RiftPlugin plugin) { new IconsWriter(itemsAdderContents), new SymbolWriter(), - new ItemsTextureJsonWriter(items), - new ItemsTextureWriter(items), + new ItemsTextureJsonWriter(items, resolver), + new ItemsTextureWriter(items, resolver), new ItemsMappingWriter(items), - new TerrainTextureJsonWriter(items), - new BlocksMappingWriter(items) + new TerrainTextureJsonWriter(identity, items, resolver), + new BlocksMappingWriter(items, resolver) )); } catch (Exception e) { diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/PackWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/PackWriter.java index 952f76f..6cbdc80 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/PackWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/PackWriter.java @@ -1,8 +1,15 @@ package fr.openmc.riftengine.core.converter.writers; -import java.io.IOException; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + import java.nio.file.Path; public interface PackWriter { + Gson GSON = new GsonBuilder() + .setPrettyPrinting() + .disableHtmlEscaping() // fix des = qui était en caractere unicode + .create(); + void write(Path bedrockRootPath, Path javaRootPath) throws Exception; } diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/BlocksMappingWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/BlocksMappingWriter.java index 971d65f..fff1cbd 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/BlocksMappingWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/BlocksMappingWriter.java @@ -1,7 +1,5 @@ package fr.openmc.riftengine.core.converter.writers.blocks; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import fr.openmc.riftengine.api.scanner.blocks.BlockStateScanner; import fr.openmc.riftengine.api.scanner.items.ItemEntry; @@ -9,6 +7,8 @@ import fr.openmc.riftengine.api.scanner.items.entry.behaviours.block.BlocksBehaviour; import fr.openmc.riftengine.core.RiftPlugin; import fr.openmc.riftengine.core.converter.writers.PackWriter; +import fr.openmc.riftengine.core.resolvers.items.ItemResourceResolver; +import fr.openmc.riftengine.core.resolvers.items.ResolvedItemResource; import fr.openmc.riftengine.core.utils.IdentifierUtils; import fr.openmc.riftengine.core.utils.PathUtils; @@ -18,15 +18,14 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; public class BlocksMappingWriter implements PackWriter { - private static final Gson GSON = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create(); - private final List items; + private final ItemResourceResolver resolver; - public BlocksMappingWriter(List items) { + public BlocksMappingWriter(List items, ItemResourceResolver resolver) { this.items = items; + this.resolver = resolver; } @Override @@ -40,20 +39,18 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws Exception { IABehaviour behaviour = item.getBehaviour(); if (!behaviour.isBlock()) continue; if (!(behaviour instanceof BlocksBehaviour blockBehaviour)) continue; - Map resources = item.getBestResourcesId(); - if (resources == null) continue; + List resources = resolver.resolve(javaRootPath, item); BlockStateScanner.CustomBlockState state = blockBehaviour.blockState(); - JsonObject def = new JsonObject(); + JsonObject def = new JsonObject(); def.addProperty("name", item.getKey()); def.addProperty("geometry", "minecraft:geometry.full_block"); - def.add("material_instances", createMaterialInstance(item, resources.keySet())); + def.add("material_instances", createMaterialInstance(resources)); blockStatesByBlock.computeIfAbsent(state.javaBlock(), _ -> new JsonObject()) .add(state.state(), def); - } JsonObject blocksSetter = new JsonObject(); @@ -68,25 +65,29 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws Exception { Path outputFile = PathUtils.getGeyserPath(RiftPlugin.getInstance().getDataPath()) .resolve("custom_mappings").resolve("ia-blocks-injected.json"); + Files.deleteIfExists(outputFile); Files.createDirectories(outputFile.getParent()); Files.writeString(outputFile, GSON.toJson(root), StandardCharsets.UTF_8); } - private JsonObject createMaterialInstance(ItemEntry item, Set faceResources) { + private JsonObject createMaterialInstance(List faceResources) { JsonObject materialInstance = new JsonObject(); - String fallback = faceResources.stream() - .filter(face -> !face.equals("all")).findFirst() - .orElse(faceResources.stream().findFirst().orElse(null)); + + ResolvedItemResource fallback = faceResources.stream() + .filter(resourceFace -> !resourceFace.state().equals("all")) + .findFirst() + .orElse(null); + if (fallback == null) return materialInstance; - materialInstance.add("*", material(textureKey(item, fallback))); + materialInstance.add("*", materialObj(fallback.bedrockIdentifier())); faceResources.forEach(face -> { - switch (face) { + switch (face.state()) { case "side" -> List.of("north", "south", "east", "west") - .forEach(f -> materialInstance.add(f, material(textureKey(item, f)))); - case "up", "down", "north", "south", "east", "west" -> materialInstance.add(face, material(textureKey(item, face))); + .forEach(f -> materialInstance.add(f, materialObj(face.bedrockIdWithState(f)))); + case "up", "down", "north", "south", "east", "west" -> materialInstance.add(face.state(), materialObj(face.bedrockIdentifier())); default -> {} } }); @@ -94,11 +95,7 @@ private JsonObject createMaterialInstance(ItemEntry item, Set faceResour return materialInstance; } - public static String textureKey(ItemEntry item, String state) { - return state.equals(ItemEntry.DEFAULT_STATE) ? item.getKey() : (item.getKey() + "_" + state); - } - - private JsonObject material(String texture) { + private JsonObject materialObj(String texture) { JsonObject m = new JsonObject(); m.addProperty("texture", texture); m.addProperty("render_method", "alpha_test"); diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/TerrainTextureJsonWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/TerrainTextureJsonWriter.java index e8ce110..53b546e 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/TerrainTextureJsonWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/TerrainTextureJsonWriter.java @@ -1,39 +1,37 @@ package fr.openmc.riftengine.core.converter.writers.blocks; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import fr.openmc.core.bootstrap.integration.OMCLogger; import fr.openmc.riftengine.api.scanner.items.ItemEntry; import fr.openmc.riftengine.api.scanner.items.entry.behaviours.IABehaviour; import fr.openmc.riftengine.core.converter.writers.PackWriter; -import fr.openmc.riftengine.core.converter.writers.manifest.ManifestWriter; -import fr.openmc.riftengine.core.utils.IdentifierUtils; -import fr.openmc.riftengine.core.utils.PathUtils; +import fr.openmc.riftengine.core.converter.writers.manifest.PackIdentity; +import fr.openmc.riftengine.core.resolvers.items.ItemResourceResolver; +import fr.openmc.riftengine.core.resolvers.items.ResolvedItemResource; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; -import java.util.Map; /** * Ecrit le terrain_texture.json qui sert grosso modo a relier les textures aux items (une ref = une resource) */ public class TerrainTextureJsonWriter implements PackWriter { + private final PackIdentity packIdentity; private final List items; + private final ItemResourceResolver resolver; - private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); - - public TerrainTextureJsonWriter(List items) { + public TerrainTextureJsonWriter(PackIdentity packIdentity, List items, ItemResourceResolver resolver) { + this.packIdentity = packIdentity; this.items = items; + this.resolver = resolver; } @Override public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { JsonObject root = new JsonObject(); - JsonObject textureData = new JsonObject(); for (ItemEntry itemEntry : items) { @@ -42,29 +40,17 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { OMCLogger.warn("Item {} : n'a pas block", itemEntry.namespacedId()); continue; } - System.out.println("Item : " + itemEntry.namespacedId()); - - Map bestResources = itemEntry.getBestResourcesId(); - if (bestResources == null) { - OMCLogger.warn("Item {} : n'a pas de best resources", itemEntry.namespacedId()); - continue; - } - for (var entry : bestResources.entrySet()) { - String[] textureDataStr = getTextureData(itemEntry, entry.getKey(), entry.getValue(), javaRootPath); - - if (textureDataStr == null) { - OMCLogger.warn("Item {} : textureDataStr n'a pas de contenu", itemEntry.namespacedId()); - continue; - } + List resolvedItemResources = resolver.resolve(javaRootPath, itemEntry); + for (ResolvedItemResource resource : resolvedItemResources) { JsonObject itemData = new JsonObject(); - itemData.addProperty("textures", textureDataStr[1]); - textureData.add(textureDataStr[0], itemData); + itemData.addProperty("textures", resource.bedrockTexturePath()); + textureData.add(resource.bedrockIdentifier(), itemData); } } - root.addProperty("resource_pack_name", ManifestWriter.PACK_NAME); + root.addProperty("resource_pack_name", packIdentity.getPackName()); root.addProperty("texture_name", "atlas.terrain"); root.addProperty("padding", 8); root.addProperty("num_mip_levels", 4); @@ -74,55 +60,4 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { Files.createDirectories(outputFile.getParent()); Files.writeString(outputFile, GSON.toJson(root), StandardCharsets.UTF_8); } - - /** - * Retourne les id du namespace et de la resource - * (en fonction de si y'a des textures multiples ect fishing rod) - * Note a moi meme: - * - le state normal est skip, a ma vue c'est le state par défaut - */ - public String[] getTextureData(ItemEntry itemEntry, String stateResource, String resourceId, Path javaRootPath) { - String texture = null; - String namespace = itemEntry.getKey(); - - if (resourceId.isEmpty()) { - texture = "textures/blocks/" + itemEntry.getMaterial().name().toLowerCase(); - } else if (resourceId.startsWith("minecraft:")) { - String path = IdentifierUtils.normalizeId(resourceId).split(":", 2)[1]; - texture = IdentifierUtils.toBedrockTexturePath("textures/" + path); - } else { - Map resources = itemEntry.getResourcePath().apply(javaRootPath); - if (resources == null) { - OMCLogger.warn("Item {} : impossible de déterminer la texture", itemEntry.namespacedId()); - return null; - } - - if (resources.isEmpty()) { - OMCLogger.warn("Item {} : impossible de déterminer la texture", itemEntry.namespacedId()); - return null; - } - - Path resourcePath; - if (resources.size() > 1) { - resourcePath = resources.get(stateResource); - if (!stateResource.equals(ItemEntry.DEFAULT_STATE)) - namespace = itemEntry.getKey() + "_" + stateResource; - } else { - resourcePath = resources.values().stream().findFirst().get(); - } - - Path reducedPath = PathUtils.getPathFromRoot(resourcePath, "textures"); - if (reducedPath != null) { - texture = IdentifierUtils.toBedrockTexturePath(reducedPath.toString()) - .replaceFirst("\\.[^/.]+$", ""); - } - } - - if (texture == null) { - OMCLogger.warn("Item {} : impossible de déterminer la texture", itemEntry.namespacedId()); - return null; - } - - return new String[] {namespace, texture}; - } } diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsMappingWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsMappingWriter.java index 10e393b..b170b6f 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsMappingWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsMappingWriter.java @@ -1,7 +1,5 @@ package fr.openmc.riftengine.core.converter.writers.items; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import fr.openmc.core.bootstrap.integration.OMCLogger; @@ -19,8 +17,6 @@ import java.util.Map; public class ItemsMappingWriter implements PackWriter { - private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); - private final List items; public ItemsMappingWriter(List items) { diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsTextureJsonWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsTextureJsonWriter.java index 6a50e15..c6af0d5 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsTextureJsonWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsTextureJsonWriter.java @@ -1,57 +1,41 @@ package fr.openmc.riftengine.core.converter.writers.items; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; -import fr.openmc.core.bootstrap.integration.OMCLogger; import fr.openmc.riftengine.api.scanner.items.ItemEntry; import fr.openmc.riftengine.core.converter.writers.PackWriter; -import fr.openmc.riftengine.core.utils.IdentifierUtils; -import fr.openmc.riftengine.core.utils.PathUtils; +import fr.openmc.riftengine.core.resolvers.items.ItemResourceResolver; +import fr.openmc.riftengine.core.resolvers.items.ResolvedItemResource; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; -import java.util.Map; /** * Ecrit le item_texture.json qui sert grosso modo a relier les textures aux items (une ref = une resource) */ public class ItemsTextureJsonWriter implements PackWriter { private final List items; + private final ItemResourceResolver resolver; - private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); - - public ItemsTextureJsonWriter(List items) { + public ItemsTextureJsonWriter(List items, ItemResourceResolver resolver) { this.items = items; + this.resolver = resolver; } @Override public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { JsonObject root = new JsonObject(); - JsonObject textureData = new JsonObject(); for (ItemEntry itemEntry : items) { - Map bestResources = itemEntry.getBestResourcesId(); - if (bestResources == null) { - OMCLogger.warn("Item {} : n'a pas de best resources", itemEntry.namespacedId()); - continue; - } - - for (var entry : bestResources.entrySet()) { - String[] textureDataStr = getTextureData(itemEntry, entry.getKey(), entry.getValue(), javaRootPath); - - if (textureDataStr == null) { - OMCLogger.warn("Item {} : textureDataStr n'a pas de contenu", itemEntry.namespacedId()); - continue; - } + List resolvedItemResources = resolver.resolve(javaRootPath, itemEntry); + for (ResolvedItemResource resource : resolvedItemResources) { JsonObject itemData = new JsonObject(); - itemData.addProperty("textures", textureDataStr[1]); - textureData.add(textureDataStr[0], itemData); + itemData.addProperty("textures", resource.bedrockTexturePath()); + textureData.add(resource.bedrockIdentifier(), itemData); } } @@ -62,55 +46,4 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { Files.createDirectories(outputFile.getParent()); Files.writeString(outputFile, GSON.toJson(root), StandardCharsets.UTF_8); } - - /** - * Retourne les id du namespace et de la resource - * (en fonction de si y'a des textures multiples ect fishing rod) - * Note a moi meme: - * - le state normal est skip, a ma vue c'est le state par défaut - */ - public String[] getTextureData(ItemEntry itemEntry, String stateResource, String resourceId, Path javaRootPath) { - String texture = null; - String namespace = itemEntry.getKey(); - - if (resourceId.isEmpty()) { - texture = "textures/items/" + itemEntry.getMaterial().name().toLowerCase();; - } else if (resourceId.startsWith("minecraft:")) { - String path = IdentifierUtils.normalizeId(resourceId).split(":", 2)[1]; - texture = IdentifierUtils.toBedrockTexturePath("textures/" + path); - } else { - Map resources = itemEntry.getResourcePath().apply(javaRootPath); - if (resources == null) { - OMCLogger.warn("Item {} : impossible de déterminer la texture", itemEntry.namespacedId()); - return null; - } - - if (resources.isEmpty()) { - OMCLogger.warn("Item {} : impossible de déterminer la texture", itemEntry.namespacedId()); - return null; - } - - Path resourcePath; - if (resources.size() > 1) { - resourcePath = resources.get(stateResource); - if (!stateResource.equals(ItemEntry.DEFAULT_STATE)) - namespace = itemEntry.getKey() + "_" + stateResource; - } else { - resourcePath = resources.values().stream().findFirst().get(); - } - - Path reducedPath = PathUtils.getPathFromRoot(resourcePath, "textures"); - if (reducedPath != null) { - texture = IdentifierUtils.toBedrockTexturePath(reducedPath.toString()) - .replaceFirst("\\.[^/.]+$", ""); - } - } - - if (texture == null) { - OMCLogger.warn("Item {} : impossible de déterminer la texture", itemEntry.namespacedId()); - return null; - } - - return new String[] {namespace, texture}; - } } diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsTextureWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsTextureWriter.java index edbdf4b..d4302eb 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsTextureWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsTextureWriter.java @@ -1,67 +1,38 @@ package fr.openmc.riftengine.core.converter.writers.items; -import fr.openmc.core.bootstrap.integration.OMCLogger; import fr.openmc.riftengine.api.scanner.items.ItemEntry; import fr.openmc.riftengine.core.converter.writers.PackWriter; +import fr.openmc.riftengine.core.resolvers.items.ItemResourceResolver; +import fr.openmc.riftengine.core.resolvers.items.ResolvedItemResource; import fr.openmc.riftengine.core.utils.IdentifierUtils; -import fr.openmc.riftengine.core.utils.PathUtils; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.util.List; -import java.util.Map; public class ItemsTextureWriter implements PackWriter { private final List items; + private final ItemResourceResolver resolver; - public ItemsTextureWriter(List items) { + public ItemsTextureWriter(List items, ItemResourceResolver resolver) { this.items = items; + this.resolver = resolver; } @Override public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { for (ItemEntry itemEntry : items) { - Map bestResources = itemEntry.getBestResourcesId(); - if (bestResources == null) { - OMCLogger.warn("Item {} : n'a pas de best resources", itemEntry.namespacedId()); - continue; - } - - for (var entry : bestResources.entrySet()) { - String stateResource = entry.getKey(); - String resourceId = entry.getValue(); - - if (resourceId.isEmpty()) { - OMCLogger.warn("Item {} a pas de resource id", itemEntry.namespacedId()); - continue; - } - - if (resourceId.split(":")[0].equals("minecraft")) continue; - - Map resources = itemEntry.getResourcePath().apply(javaRootPath); - if (resources == null) { - OMCLogger.warn("Item {} a aucune resource (Model ou texture)", itemEntry.namespacedId()); - continue; - } - - Path resourcePath = resources.get(stateResource); - if (resourcePath == null) { - OMCLogger.warn("Item {} a aucune resource (Model ou texture)", itemEntry.namespacedId()); - continue; - } + List resources = resolver.resolve(javaRootPath, itemEntry); - Path reducedPath = PathUtils.getPathFromRoot(resourcePath, "textures"); - if (reducedPath == null) { - OMCLogger.warn("Item {} a un Path impossible a réduire {}", itemEntry.namespacedId(), resourcePath.toString()); - continue; - } + for (ResolvedItemResource resource : resources) { + if (resource.isVanilla()) continue; Path outputFile = bedrockRootPath.resolve( - IdentifierUtils.toBedrockTexturePath(reducedPath.toString())); + IdentifierUtils.toBedrockTexturePath(resource.bedrockTexturePath())); Files.createDirectories(outputFile.getParent()); - Files.copy(resourcePath, outputFile, StandardCopyOption.REPLACE_EXISTING); + Files.copy(resource.sourcePath(), outputFile, StandardCopyOption.REPLACE_EXISTING); } } } diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/ManifestWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/ManifestWriter.java index 54d659e..42e0292 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/ManifestWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/ManifestWriter.java @@ -8,8 +8,6 @@ import java.nio.file.Path; public class ManifestWriter implements PackWriter { - public static final String PACK_NAME = "RiftPack"; - private final PackIdentity identity; public ManifestWriter(PackIdentity identity) { @@ -18,7 +16,7 @@ public ManifestWriter(PackIdentity identity) { @Override public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { - int[] v = identity.version(); + int[] v = identity.getVersion(); String versionJson = "[" + v[0] + ", " + v[1] + ", " + v[2] + "]"; String manifest = """ { @@ -38,7 +36,7 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { } ] } - """.formatted(PACK_NAME, identity.headerUuid(), versionJson, identity.moduleUuid(), versionJson); + """.formatted(identity.getPackName(), identity.getHeaderUuid(), versionJson, identity.getModuleUuid(), versionJson); Files.writeString(bedrockRootPath.resolve("manifest.json"), manifest, StandardCharsets.UTF_8); diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/PackIdentity.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/PackIdentity.java index 6736c72..d7adde8 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/PackIdentity.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/PackIdentity.java @@ -1,5 +1,6 @@ package fr.openmc.riftengine.core.converter.writers.manifest; +import lombok.Getter; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.plugin.java.JavaPlugin; @@ -9,30 +10,21 @@ import static fr.openmc.riftengine.core.RiftPlugin.RP_VERSION; +@Getter public class PackIdentity { + private final String packName; private final UUID headerUuid; private final UUID moduleUuid; private final int[] version; // * [major, minor, patch] - private PackIdentity(UUID headerUuid, UUID moduleUuid, int[] version) { + private PackIdentity(String packName, UUID headerUuid, UUID moduleUuid, int[] version) { + this.packName = packName; this.headerUuid = headerUuid; this.moduleUuid = moduleUuid; this.version = version; } - public UUID headerUuid() { - return headerUuid; - } - - public UUID moduleUuid() { - return moduleUuid; - } - - public int[] version() { - return version; - } - public static PackIdentity loadOrCreate(JavaPlugin plugin) throws IOException { File file = new File(plugin.getDataFolder(), "pack-identity.yml"); YamlConfiguration config = YamlConfiguration.loadConfiguration(file); @@ -56,6 +48,7 @@ public static PackIdentity loadOrCreate(JavaPlugin plugin) throws IOException { config.save(file); return new PackIdentity( + "RiftPack", UUID.fromString(config.getString("header-uuid")), UUID.fromString(config.getString("module-uuid")), new int[]{major, minor, patch} diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/ui/ScoreboardUiWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/ui/ScoreboardUiWriter.java index 2059f49..b7fcf90 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/ui/ScoreboardUiWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/ui/ScoreboardUiWriter.java @@ -1,7 +1,5 @@ package fr.openmc.riftengine.core.converter.writers.ui; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import fr.openmc.riftengine.core.converter.writers.PackWriter; @@ -13,8 +11,6 @@ public class ScoreboardUiWriter implements PackWriter { private final boolean hideScoreboardNumberBedrock; - private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); - public ScoreboardUiWriter(boolean hideScoreboardNumberBedrock) { this.hideScoreboardNumberBedrock = hideScoreboardNumberBedrock; } diff --git a/src/main/java/fr/openmc/riftengine/core/registry/resolver/AbstractResolver.java b/src/main/java/fr/openmc/riftengine/core/registry/resolver/AbstractResolver.java new file mode 100644 index 0000000..f787605 --- /dev/null +++ b/src/main/java/fr/openmc/riftengine/core/registry/resolver/AbstractResolver.java @@ -0,0 +1,7 @@ +package fr.openmc.riftengine.core.registry.resolver; + +import java.nio.file.Path; + +public abstract class AbstractResolver { + public abstract O resolve(Path javaRootPath, I input); +} diff --git a/src/main/java/fr/openmc/riftengine/core/registry/resolver/ResolverRegistry.java b/src/main/java/fr/openmc/riftengine/core/registry/resolver/ResolverRegistry.java new file mode 100644 index 0000000..9fe82af --- /dev/null +++ b/src/main/java/fr/openmc/riftengine/core/registry/resolver/ResolverRegistry.java @@ -0,0 +1,16 @@ +package fr.openmc.riftengine.core.registry.resolver; + +import fr.openmc.core.bootstrap.registries.KeyedRegistry; +import fr.openmc.core.bootstrap.registries.Registry; +import fr.openmc.riftengine.core.resolvers.items.ItemResourceResolver; + +public class ResolverRegistry extends Registry> + implements KeyedRegistry> { + + public final ItemResourceResolver ITEM_RESOURCE_RESOLVER = register(new ItemResourceResolver()); + + @Override + public String key(AbstractResolver resolver) { + return resolver.getClass().getSimpleName(); + } +} \ No newline at end of file diff --git a/src/main/java/fr/openmc/riftengine/core/resolvers/items/ItemResourceResolver.java b/src/main/java/fr/openmc/riftengine/core/resolvers/items/ItemResourceResolver.java new file mode 100644 index 0000000..13e8c3b --- /dev/null +++ b/src/main/java/fr/openmc/riftengine/core/resolvers/items/ItemResourceResolver.java @@ -0,0 +1,72 @@ +package fr.openmc.riftengine.core.resolvers.items; + +import fr.openmc.riftengine.api.scanner.items.ItemEntry; +import fr.openmc.riftengine.core.RiftError; +import fr.openmc.riftengine.core.registry.resolver.AbstractResolver; +import fr.openmc.riftengine.core.utils.IdentifierUtils; +import fr.openmc.riftengine.core.utils.PathUtils; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class ItemResourceResolver extends AbstractResolver> { + + @Override + public List resolve(Path javaRootPath, ItemEntry item) { + Map resources = item.getBestResourcesId(); + + if (resources == null || resources.isEmpty()) { + RiftError.ITEM_NOT_RESOURCE.send(item.namespacedId()); + return List.of(); + } + + Map bedrockTexturePaths = item.getResourcePath().apply(javaRootPath); + + List resolved = new ArrayList<>(); + for (Map.Entry entry : resources.entrySet()) { + String state = entry.getKey(); + String resourceId = entry.getValue(); + Path bedrockTexturePath = bedrockTexturePaths.get(state); + String bedrockIdentifier = state.equals(ItemEntry.DEFAULT_STATE) ? item.getKey() : item.getKey() + "_" + state; + String bedrockTextureValue = null; + + if (resourceId.isEmpty()) { + String folder = item.getBehaviour().isItem() ? "items" : "blocks"; + bedrockTextureValue = "textures/" + folder + "/" + item.getMaterial().name().toLowerCase(); + } else if (resourceId.startsWith("minecraft:")) { + String path = IdentifierUtils.normalizeId(resourceId).split(":", 2)[1]; + bedrockTextureValue = IdentifierUtils.toBedrockTexturePath("textures/" + path); + } else { + Path resourcePath; + if (bedrockTexturePaths.size() > 1) { + resourcePath = bedrockTexturePaths.get(state); + } else if (bedrockTexturePaths.size() == 1) { + resourcePath = bedrockTexturePaths.values().stream() + .findFirst().get(); + } else { + RiftError.RESOURCE_NOT_FOUND.send(item.getKey()); + return List.of(); + } + + Path reducedPath = PathUtils.getPathFromRoot(resourcePath, "textures"); + if (reducedPath != null) { + bedrockTextureValue = IdentifierUtils.toBedrockTexturePath(reducedPath.toString()) + .replaceFirst("\\.[^/.]+$", ""); + } + } + + if (bedrockTextureValue == null) { + RiftError.RESOURCE_NOT_FOUND.send(item.getKey()); + return List.of(); + } + + resolved.add(new ResolvedItemResource( + item, state, resourceId, + bedrockIdentifier, bedrockTexturePath, bedrockTextureValue)); + } + + return resolved; + } +} diff --git a/src/main/java/fr/openmc/riftengine/core/resolvers/items/ResolvedItemResource.java b/src/main/java/fr/openmc/riftengine/core/resolvers/items/ResolvedItemResource.java new file mode 100644 index 0000000..9bb7b24 --- /dev/null +++ b/src/main/java/fr/openmc/riftengine/core/resolvers/items/ResolvedItemResource.java @@ -0,0 +1,21 @@ +package fr.openmc.riftengine.core.resolvers.items; + +import fr.openmc.riftengine.api.scanner.items.ItemEntry; + +import java.nio.file.Path; + +public record ResolvedItemResource(ItemEntry item, + String state, // bottom, top, side + String resourceId, // ex aywenite (sans le namespace devant), cloud_fishing_rod_cast + String bedrockIdentifier, // + Path sourcePath, + String bedrockTexturePath// ex textures/aywenite + ) { + public String bedrockIdWithState(String state) { + return state.equals(ItemEntry.DEFAULT_STATE) ? item.getKey() : (item.getKey() + "_" + state); + } + + public boolean isVanilla() { + return resourceId.startsWith("minecraft:"); + } +} From 547f1b3ec210b41de997592516c166ded0113708 Mon Sep 17 00:00:00 2001 From: iambibi <89582596+iambibi@users.noreply.github.com> Date: Mon, 19 Oct 2026 16:42:37 +0200 Subject: [PATCH 3/5] chore: reduce duplication at end of write() --- .../core/converter/writers/PackWriter.java | 19 +++++++++++++++++++ .../writers/blocks/BlocksMappingWriter.java | 10 +++++----- .../blocks/TerrainTextureJsonWriter.java | 9 ++++----- .../writers/glyph/font/FontWriter.java | 4 +--- .../writers/items/ItemsMappingWriter.java | 7 +++---- .../writers/items/ItemsTextureJsonWriter.java | 5 +---- .../writers/items/ItemsTextureWriter.java | 8 ++------ .../writers/manifest/ManifestWriter.java | 5 +---- .../writers/ui/ScoreboardUiWriter.java | 9 ++++----- 9 files changed, 40 insertions(+), 36 deletions(-) diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/PackWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/PackWriter.java index 6cbdc80..09195d1 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/PackWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/PackWriter.java @@ -2,8 +2,13 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.StandardCopyOption; public interface PackWriter { Gson GSON = new GsonBuilder() @@ -12,4 +17,18 @@ public interface PackWriter { .create(); void write(Path bedrockRootPath, Path javaRootPath) throws Exception; + + default void writeJsonFile(Path outputFile, JsonObject root) throws IOException { + this.writeFile(outputFile, GSON.toJson(root)); + } + + default void writeFile(Path outputFile, String content) throws IOException { + Files.createDirectories(outputFile.getParent()); + Files.writeString(outputFile, content, StandardCharsets.UTF_8); + } + + default void copyFile(Path toCopy, Path where) throws IOException { + Files.createDirectories(where.getParent()); + Files.copy(toCopy, where, StandardCopyOption.REPLACE_EXISTING); + } } diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/BlocksMappingWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/BlocksMappingWriter.java index fff1cbd..f1a9036 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/BlocksMappingWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/BlocksMappingWriter.java @@ -12,7 +12,6 @@ import fr.openmc.riftengine.core.utils.IdentifierUtils; import fr.openmc.riftengine.core.utils.PathUtils; -import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.HashMap; @@ -63,12 +62,13 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws Exception { }); root.add("blocks", blocksSetter); - Path outputFile = PathUtils.getGeyserPath(RiftPlugin.getInstance().getDataPath()) - .resolve("custom_mappings").resolve("ia-blocks-injected.json"); + Path outputFile = PathUtils + .getGeyserPath(RiftPlugin.getInstance().getDataPath()) + .resolve("custom_mappings") + .resolve("ia-blocks-injected.json"); Files.deleteIfExists(outputFile); - Files.createDirectories(outputFile.getParent()); - Files.writeString(outputFile, GSON.toJson(root), StandardCharsets.UTF_8); + this.writeJsonFile(outputFile, root); } private JsonObject createMaterialInstance(List faceResources) { diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/TerrainTextureJsonWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/TerrainTextureJsonWriter.java index 53b546e..bafce1d 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/TerrainTextureJsonWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/TerrainTextureJsonWriter.java @@ -10,8 +10,6 @@ import fr.openmc.riftengine.core.resolvers.items.ResolvedItemResource; import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; import java.nio.file.Path; import java.util.List; @@ -56,8 +54,9 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { root.addProperty("num_mip_levels", 4); root.add("texture_data", textureData); - Path outputFile = bedrockRootPath.resolve("textures").resolve("terrain_texture.json"); - Files.createDirectories(outputFile.getParent()); - Files.writeString(outputFile, GSON.toJson(root), StandardCharsets.UTF_8); + Path outputFile = bedrockRootPath + .resolve("textures") + .resolve("terrain_texture.json"); + this.writeJsonFile(outputFile, root); } } diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/glyph/font/FontWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/glyph/font/FontWriter.java index d61bb87..4e21cec 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/glyph/font/FontWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/glyph/font/FontWriter.java @@ -15,7 +15,6 @@ import java.io.Reader; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.StandardCopyOption; import java.util.List; /** @@ -81,8 +80,7 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { String fileName = "glyph_" + page + ".png"; Path glyphPath = bedrockRootPath.resolve("font").resolve(fileName); - Files.createDirectories(glyphPath.getParent()); - Files.copy(fontPng.toPath(), glyphPath, StandardCopyOption.REPLACE_EXISTING); + this.copyFile(fontPng.toPath(), glyphPath); } } diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsMappingWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsMappingWriter.java index b170b6f..33409a5 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsMappingWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsMappingWriter.java @@ -9,7 +9,6 @@ import fr.openmc.riftengine.core.utils.PathUtils; import org.bukkit.Material; -import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.HashMap; @@ -56,10 +55,10 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws Exception { root.add("items", itemsSetter); Path outputFile = PathUtils.getGeyserPath(RiftPlugin.getInstance().getDataPath()) - .resolve("custom_mappings").resolve("ia-items-injected.json"); + .resolve("custom_mappings") + .resolve("ia-items-injected.json"); Files.deleteIfExists(outputFile); - Files.createDirectories(outputFile.getParent()); - Files.writeString(outputFile, GSON.toJson(root), StandardCharsets.UTF_8); + this.writeJsonFile(outputFile, root); } private JsonObject handleUniqueTexture(ItemEntry item) { diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsTextureJsonWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsTextureJsonWriter.java index c6af0d5..6e8f2d7 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsTextureJsonWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsTextureJsonWriter.java @@ -7,8 +7,6 @@ import fr.openmc.riftengine.core.resolvers.items.ResolvedItemResource; import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; import java.nio.file.Path; import java.util.List; @@ -43,7 +41,6 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { root.add("texture_data", textureData); Path outputFile = bedrockRootPath.resolve("textures").resolve("item_texture.json"); - Files.createDirectories(outputFile.getParent()); - Files.writeString(outputFile, GSON.toJson(root), StandardCharsets.UTF_8); + this.writeJsonFile(outputFile, root); } } diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsTextureWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsTextureWriter.java index d4302eb..cd9dffa 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsTextureWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsTextureWriter.java @@ -7,9 +7,7 @@ import fr.openmc.riftengine.core.utils.IdentifierUtils; import java.io.IOException; -import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.StandardCopyOption; import java.util.List; public class ItemsTextureWriter implements PackWriter { @@ -29,10 +27,8 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { for (ResolvedItemResource resource : resources) { if (resource.isVanilla()) continue; - Path outputFile = bedrockRootPath.resolve( - IdentifierUtils.toBedrockTexturePath(resource.bedrockTexturePath())); - Files.createDirectories(outputFile.getParent()); - Files.copy(resource.sourcePath(), outputFile, StandardCopyOption.REPLACE_EXISTING); + Path outputFile = bedrockRootPath.resolve(IdentifierUtils.toBedrockTexturePath(resource.bedrockTexturePath())); + this.copyFile(resource.sourcePath(), outputFile); } } } diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/ManifestWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/ManifestWriter.java index 42e0292..79bb6b1 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/ManifestWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/ManifestWriter.java @@ -3,8 +3,6 @@ import fr.openmc.riftengine.core.converter.writers.PackWriter; import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; import java.nio.file.Path; public class ManifestWriter implements PackWriter { @@ -38,7 +36,6 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { } """.formatted(identity.getPackName(), identity.getHeaderUuid(), versionJson, identity.getModuleUuid(), versionJson); - Files.writeString(bedrockRootPath.resolve("manifest.json"), manifest, StandardCharsets.UTF_8); - + this.writeFile(bedrockRootPath.resolve("manifest.json"), manifest); } } diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/ui/ScoreboardUiWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/ui/ScoreboardUiWriter.java index b7fcf90..f67a786 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/ui/ScoreboardUiWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/ui/ScoreboardUiWriter.java @@ -4,8 +4,6 @@ import fr.openmc.riftengine.core.converter.writers.PackWriter; import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; import java.nio.file.Path; public class ScoreboardUiWriter implements PackWriter { @@ -25,8 +23,9 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { visible.addProperty("visible", false); root.add("scoreboard_sidebar_score", visible); - Path outputFile = bedrockRootPath.resolve("ui").resolve("scoreboards.json"); - Files.createDirectories(outputFile.getParent()); - Files.writeString(outputFile, GSON.toJson(root), StandardCharsets.UTF_8); + Path outputFile = bedrockRootPath + .resolve("ui") + .resolve("scoreboards.json"); + this.writeJsonFile(outputFile, root); } } From 37114c5e932629727d31568894dac50e5974bc97 Mon Sep 17 00:00:00 2001 From: iambibi <89582596+iambibi@users.noreply.github.com> Date: Mon, 19 Oct 2026 17:37:16 +0200 Subject: [PATCH 4/5] chore: RiftLog and banner for loading --- libs/OpenMC.jar | Bin 7007932 -> 7008224 bytes .../fr/openmc/riftengine/core/RiftError.java | 37 ---------- .../fr/openmc/riftengine/core/RiftLog.java | 63 ++++++++++++++++++ .../fr/openmc/riftengine/core/RiftPlugin.java | 48 +++++++++++-- .../openmc/riftengine/core/RiftRegistry.java | 6 +- .../core/converter/ConverterManager.java | 37 +++++----- .../core/converter/RegisteredPackWriter.java | 34 ++++++++++ .../blocks/TerrainTextureJsonWriter.java | 6 +- .../writers/glyph/icons/IconsTypeConfig.java | 4 +- .../writers/glyph/icons/IconsWriter.java | 16 ++--- .../writers/glyph/icons/SymbolWriter.java | 4 +- .../writers/items/ItemsMappingWriter.java | 59 +++++++--------- .../resolvers/items/ItemResourceResolver.java | 11 +-- .../resolvers/items/ResolvedItemResource.java | 3 +- 14 files changed, 206 insertions(+), 122 deletions(-) delete mode 100644 src/main/java/fr/openmc/riftengine/core/RiftError.java create mode 100644 src/main/java/fr/openmc/riftengine/core/RiftLog.java create mode 100644 src/main/java/fr/openmc/riftengine/core/converter/RegisteredPackWriter.java diff --git a/libs/OpenMC.jar b/libs/OpenMC.jar index d5706f655b983d740f4150e9f1dac2adfe2e28ad..84c45a1c7cc31deabedb91039a47c2ddb9ffa02d 100644 GIT binary patch delta 66815 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 delta 65678 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 diff --git a/src/main/java/fr/openmc/riftengine/core/RiftError.java b/src/main/java/fr/openmc/riftengine/core/RiftError.java deleted file mode 100644 index f6628e1..0000000 --- a/src/main/java/fr/openmc/riftengine/core/RiftError.java +++ /dev/null @@ -1,37 +0,0 @@ -package fr.openmc.riftengine.core; - -import fr.openmc.core.bootstrap.integration.OMCLogger; - -public enum RiftError { - ITEM_NOT_RESOURCE("Item {} : n'a pas de best resources", ErrorType.WARN), - RESOURCE_NOT_FOUND("Item {} : a aucune resource", ErrorType.WARN) - - ; - - private enum ErrorType { - WARN, - ERROR, - DEBUG, - INFO - } - - private final String message; - private final ErrorType type; - - RiftError(String message, ErrorType type) { - this.message = message; - this.type = type; - } - - public void send(Object... args) { - if (type == ErrorType.WARN) { - OMCLogger.warn(message, args); - } else if (type == ErrorType.ERROR) { - OMCLogger.error(message, args); - } else if (type == ErrorType.DEBUG) { - OMCLogger.debug(message, args); - } else if (type == ErrorType.INFO) { - OMCLogger.info(message, args); - } - } -} diff --git a/src/main/java/fr/openmc/riftengine/core/RiftLog.java b/src/main/java/fr/openmc/riftengine/core/RiftLog.java new file mode 100644 index 0000000..af7cb33 --- /dev/null +++ b/src/main/java/fr/openmc/riftengine/core/RiftLog.java @@ -0,0 +1,63 @@ +package fr.openmc.riftengine.core; + +import fr.openmc.core.bootstrap.integration.OMCLogger; + +public enum RiftLog { + RIFT_DISABLE("RiftEngine désactivé", LogType.INFO), + RIFT_PACK_INFO("Pack chargé avec succès (pack={})", LogType.INFO), + REGISTRY_LOADED("Registre {} chargé pendant le runtime", LogType.SUCCESS), + REGISTRY_DISABLE("Registre {} stoppé", LogType.SUCCESS), + + IMAGE_NOT_FOUND("Image introuvable pour {} dans le path {} (skip)", LogType.ERROR), + ERROR_READING("Erreur de lecture pour {} (skip) : ", LogType.ERROR), + ICON_TYPE_NOT_RECOGNIZED("Icon type {} : n'est pas reconnu", LogType.ERROR), + DETECTED_AS_MENU_GUI("Glyph {} detécté comme MENU_GUI, il ne sera donc pas en glyph, vu que les menus sont géré autrement", LogType.WARN), + ICON_SKIPPED("Image manquante pour {} emoji(s)/icon(s) sur {}.", LogType.INFO), + DETECTED_AS("{} ({}x{}) détecté comme {}", LogType.INFO), + SYMBOL_KEY_NOT_FOUND("Clé {} introuvable dans {}.", LogType.WARN), + NUMBER_GLYPH_REGISTERED("{}/{} glyphs enregistré", LogType.INFO), + + ITEM_NOT_RESOURCE("Item {} : n'a pas de best resources", LogType.WARN), + RESOURCE_NOT_FOUND("Item {} : a aucune resource", LogType.WARN) + ; + + public static void logBanner(String pluginVersion, String server, String javaVersion) { + OMCLogger.info("\u001B[1;35m██████╗ ██╗███████╗████████╗ \u001B[0;95mRIFT v{}\u001B[0m", pluginVersion); + OMCLogger.info("\u001B[1;35m██╔══██╗██║██╔════╝╚══██╔══╝ \u001B[0;90mPaper {}\u001B[0m", server); + OMCLogger.info("\u001B[1;95m██████╔╝██║█████╗ ██║ \u001B[0;90mJava {}\u001B[0m", javaVersion); + OMCLogger.info("\u001B[1;95m██╔══██╗██║██╔══╝ ██║ \u001B[0m"); + OMCLogger.info("\u001B[1;35m██║ ██║██║██║ ██║ \u001B[0m"); + OMCLogger.info("\u001B[1;95m╚═╝ ╚═╝╚═╝╚═╝ ╚═╝ \u001B[0m"); + OMCLogger.info(""); + } + + private enum LogType { + WARN, + ERROR, + DEBUG, + INFO, + SUCCESS + } + + private final String message; + private final LogType type; + + RiftLog(String message, LogType type) { + this.message = message; + this.type = type; + } + + public void send(Object... args) { + if (type == LogType.WARN) { + OMCLogger.warnFormatted(message, args); + } else if (type == LogType.ERROR) { + OMCLogger.errorFormatted(message, args); + } else if (type == LogType.DEBUG) { + OMCLogger.debug(message, args); + } else if (type == LogType.INFO) { + OMCLogger.infoFormatted(message, args); + } else if (type == LogType.SUCCESS) { + OMCLogger.successFormatted(message, args); + } + } +} diff --git a/src/main/java/fr/openmc/riftengine/core/RiftPlugin.java b/src/main/java/fr/openmc/riftengine/core/RiftPlugin.java index 0c1e098..cc369fe 100644 --- a/src/main/java/fr/openmc/riftengine/core/RiftPlugin.java +++ b/src/main/java/fr/openmc/riftengine/core/RiftPlugin.java @@ -8,7 +8,9 @@ import fr.openmc.riftengine.core.registry.glyphs.GlyphsRegistry; import lombok.Getter; import lombok.Setter; +import org.bukkit.Bukkit; import org.bukkit.event.Listener; +import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; import org.geysermc.event.Event; import org.geysermc.geyser.api.GeyserApi; @@ -47,6 +49,8 @@ public class RiftPlugin extends JavaPlugin implements EventRegistrar { @Override public void onEnable() { instance = this; + logLoadMessage(this); + try { riftConfig = new RiftConfig(this, this.getConfig()); } catch (IOException e) { @@ -72,16 +76,14 @@ public void onEnable() { } GlyphsRegistry glyphsRegistry = RiftRegistry.GLYPHS; - OMCLogger.info("RiftEngine activé!"); - OMCLogger.infoFormatted(glyphsRegistry.size() + "/" + glyphsRegistry.maxSize() + " glyphs enregistré"); - OMCLogger.infoFormatted("Glyphs : " + glyphsRegistry.values()); + RiftLog.NUMBER_GLYPH_REGISTERED.send(glyphsRegistry.size(), glyphsRegistry.maxSize()); } @Override public void onDisable() { RiftRegistry.stopAll(); - OMCLogger.info("RiftEngine désactivé!"); + RiftLog.RIFT_DISABLE.send(); } public void updateBedrockResourcePack() { @@ -96,13 +98,11 @@ public void updateBedrockResourcePack() { public void onLoadResourcePacks(SessionLoadResourcePacksEvent event) { ResourcePack pack = RiftPlugin.getResourcePack(); - OMCLogger.infoFormatted("RiftEngine pack = " + pack); - if (pack == null) return; event.register(pack, PriorityOption.HIGHEST); - OMCLogger.successFormatted("RiftEngine: pack enregistré !"); + RiftLog.RIFT_PACK_INFO.send(pack); } public void registerListener(Listener... listeners) { @@ -113,4 +113,38 @@ public void registerListener(Listener... listeners) { public void registerEvent(Class listenerClass, Consumer handler) { GeyserApi.api().eventBus().subscribe(this, listenerClass, handler); } + + public static void logLoadMessage(RiftPlugin plugin) { + RiftLog.logBanner( + plugin.getPluginMeta().getVersion(), + Bukkit.getName() + " " + Bukkit.getVersion(), + System.getProperty("java.version") + ); + + for (String dependency : plugin.getPluginMeta().getPluginDependencies()) { + logPluginStatus(dependency, false); + } + + for (String dependency : plugin.getPluginMeta().getPluginSoftDependencies()) { + logPluginStatus(dependency, true); + } + } + + /** + * Log l'état d'une dépendance (requise ou optionnelle). + * + * @param name Nom du plugin dépendance + * @param optional True si la dépendance est optionnelle + */ + private static void logPluginStatus(String name, boolean optional) { + Plugin plugin = Bukkit.getPluginManager().getPlugin(name); + boolean enabled = plugin != null && plugin.isEnabled(); + + String icon = enabled ? "✔" : "✘"; + String color = enabled ? "\u001B[32m" : "\u001B[31m"; + String version = enabled ? " v" + plugin.getPluginMeta().getVersion() : ""; + String label = optional ? " (facultatif)" : ""; + + OMCLogger.info(" {}{} {}{}{}\u001B[0m", color, icon, name, version, label); + } } diff --git a/src/main/java/fr/openmc/riftengine/core/RiftRegistry.java b/src/main/java/fr/openmc/riftengine/core/RiftRegistry.java index 3e60598..440fce8 100644 --- a/src/main/java/fr/openmc/riftengine/core/RiftRegistry.java +++ b/src/main/java/fr/openmc/riftengine/core/RiftRegistry.java @@ -1,7 +1,6 @@ package fr.openmc.riftengine.core; -import fr.openmc.core.bootstrap.integration.OMCLogger; import fr.openmc.core.bootstrap.registries.LifecycleRegistry; import fr.openmc.core.bootstrap.registries.RegistryContext; import fr.openmc.core.bootstrap.registries.RegistryLoadingType; @@ -37,14 +36,15 @@ public static void initAll() { LifecycleRegistry r = load(ctx); r.init(); - OMCLogger.successFormatted("Registre {} chargé pendant le runtime", r.getClass().getSimpleName()); + + RiftLog.REGISTRY_LOADED.send(r.getClass().getSimpleName()); } } public static void stopAll() { for (LifecycleRegistry r : LOADED) { r.stop(); - OMCLogger.successFormatted("Registre {} stoppé", r.getClass().getSimpleName()); + RiftLog.REGISTRY_DISABLE.send(r.getClass().getSimpleName()); } LOADED.clear(); } diff --git a/src/main/java/fr/openmc/riftengine/core/converter/ConverterManager.java b/src/main/java/fr/openmc/riftengine/core/converter/ConverterManager.java index 484f70b..6cd001f 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/ConverterManager.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/ConverterManager.java @@ -31,7 +31,6 @@ import java.util.ArrayList; import java.util.List; -// todo: faire un converter manager clean, avec des systemes de step, (surtout du coté logger aussi) public class ConverterManager { private final RiftPlugin plugin; @@ -43,35 +42,39 @@ public ConverterManager(RiftPlugin plugin) { RiftConfig config = plugin.getRiftConfig(); Path itemsAdderContents = getItemsAdderContents(plugin); - ItemResourceResolver resolver = RiftRegistry.RESOLVERS.ITEM_RESOURCE_RESOLVER; - try { PackIdentity identity = PackIdentity.loadOrCreate(plugin); List items = OMCRegistry.SCANNERS.ITEMS.scan(itemsAdderContents); - writers.addAll(List.of( - new IconWriter(), - new ManifestWriter(identity), + ItemResourceResolver resolver = RiftRegistry.RESOLVERS.ITEM_RESOURCE_RESOLVER; + + register("Icônes", new IconWriter()); + register("Manifest", new ManifestWriter(identity)); + register("Traductions", new TranslationInjector()); + register("Polices", new FontWriter()); - new TranslationInjector(), - new FontWriter(), - new ScoreboardUiWriter(config.isHideScoreboardNumberBedrock()), + register("Scoreboard", + new ScoreboardUiWriter(config.isHideScoreboardNumberBedrock())); - new IconsWriter(itemsAdderContents), - new SymbolWriter(), + register("Icônes ItemsAdder", new IconsWriter(itemsAdderContents)); + register("Mappings des symboles", new SymbolWriter()); - new ItemsTextureJsonWriter(items, resolver), - new ItemsTextureWriter(items, resolver), - new ItemsMappingWriter(items), + register("Textures des items", new ItemsTextureJsonWriter(items, resolver)); + register("Fichiers de textures", new ItemsTextureWriter(items, resolver)); + register("Mappings des items", new ItemsMappingWriter(items, resolver)); - new TerrainTextureJsonWriter(identity, items, resolver), - new BlocksMappingWriter(items, resolver) + register("Textures des blocs", + new TerrainTextureJsonWriter(identity, items, resolver)); + register("Mappings des blocs", new BlocksMappingWriter(items, resolver)); - )); } catch (Exception e) { throw new RuntimeException("Erreur lors d'initialisation du ConverterManager", e); } } + private void register(String name, PackWriter writer) { + writers.add(new RegisteredPackWriter(name, writer)); + } + /** * Prends un pack java et le convertit en pack bedrock */ diff --git a/src/main/java/fr/openmc/riftengine/core/converter/RegisteredPackWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/RegisteredPackWriter.java new file mode 100644 index 0000000..14c689c --- /dev/null +++ b/src/main/java/fr/openmc/riftengine/core/converter/RegisteredPackWriter.java @@ -0,0 +1,34 @@ +package fr.openmc.riftengine.core.converter; + +import fr.openmc.core.bootstrap.integration.OMCLogger; +import fr.openmc.core.utils.text.DateUtils; +import fr.openmc.riftengine.core.converter.writers.PackWriter; + +import java.nio.file.Path; +import java.time.LocalDateTime; + +public class RegisteredPackWriter implements PackWriter { + private final String name; + private final PackWriter wrapped; + + public RegisteredPackWriter(String name, PackWriter wrapped) { + this.name = name; + this.wrapped = wrapped; + } + + @Override + public void write(Path bedrockRootPath, Path javaRootPath) throws Exception { + LocalDateTime start = DateUtils.getLocalDateTime(); + OMCLogger.infoFormatted("Conversion : " + name); + + try { + wrapped.write(bedrockRootPath, javaRootPath); + + long elapsed = -DateUtils.getDelayBetweenNowMillis(start); + OMCLogger.successFormatted(name + " terminé en " + elapsed + " ms"); + } catch (Exception e) { + OMCLogger.warnFormatted("Échec de " + name + " : " + e.getMessage(), e); + throw e; + } + } +} diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/TerrainTextureJsonWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/TerrainTextureJsonWriter.java index bafce1d..5317f46 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/TerrainTextureJsonWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/TerrainTextureJsonWriter.java @@ -1,7 +1,6 @@ package fr.openmc.riftengine.core.converter.writers.blocks; import com.google.gson.JsonObject; -import fr.openmc.core.bootstrap.integration.OMCLogger; import fr.openmc.riftengine.api.scanner.items.ItemEntry; import fr.openmc.riftengine.api.scanner.items.entry.behaviours.IABehaviour; import fr.openmc.riftengine.core.converter.writers.PackWriter; @@ -34,10 +33,7 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { for (ItemEntry itemEntry : items) { IABehaviour behaviour = itemEntry.getBehaviour(); - if (!behaviour.isBlock()) { - OMCLogger.warn("Item {} : n'a pas block", itemEntry.namespacedId()); - continue; - } + if (!behaviour.isBlock()) continue; List resolvedItemResources = resolver.resolve(javaRootPath, itemEntry); diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/glyph/icons/IconsTypeConfig.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/glyph/icons/IconsTypeConfig.java index 7396d40..034f744 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/glyph/icons/IconsTypeConfig.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/glyph/icons/IconsTypeConfig.java @@ -1,6 +1,6 @@ package fr.openmc.riftengine.core.converter.writers.glyph.icons; -import fr.openmc.core.bootstrap.integration.OMCLogger; +import fr.openmc.riftengine.core.RiftLog; import org.yaml.snakeyaml.Yaml; import java.io.IOException; @@ -38,7 +38,7 @@ public static IconsTypeConfig load(Path configPath) throws IOException { try { overrides.put(namespacedId, IconsType.valueOf(typeName.trim().toUpperCase())); } catch (IllegalArgumentException e) { - OMCLogger.errorFormatted("Type inconnu pour " + namespacedId + " : " + typeName + " (skip)"); + RiftLog.ICON_TYPE_NOT_RECOGNIZED.send(namespacedId, typeName); } } } diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/glyph/icons/IconsWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/glyph/icons/IconsWriter.java index 2a5e844..b864955 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/glyph/icons/IconsWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/glyph/icons/IconsWriter.java @@ -1,9 +1,9 @@ package fr.openmc.riftengine.core.converter.writers.glyph.icons; import fr.openmc.core.OMCRegistry; -import fr.openmc.core.bootstrap.integration.OMCLogger; import fr.openmc.riftengine.api.scanner.icons.IconEntry; import fr.openmc.riftengine.api.scanner.icons.IconScanner; +import fr.openmc.riftengine.core.RiftLog; import fr.openmc.riftengine.core.RiftPlugin; import fr.openmc.riftengine.core.RiftRegistry; import fr.openmc.riftengine.core.converter.writers.PackWriter; @@ -51,7 +51,7 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { Path imagePath = entry.path().apply(javaRootPath); if (!Files.exists(imagePath)) { - OMCLogger.errorFormatted("Image introuvable pour " + entry.namespacedId() + " dans le path " + imagePath + " (skip)"); + RiftLog.IMAGE_NOT_FOUND.send(entry.namespacedId(), imagePath); skipped++; continue; } @@ -60,13 +60,13 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { try { image = ImageIO.read(imagePath.toFile()); } catch (IOException e) { - OMCLogger.errorFormatted("Erreur de lecture pour " + entry.namespacedId() + " (skip) : " + e.getMessage()); + RiftLog.ERROR_READING.send(entry.namespacedId()); skipped++; continue; } if (image == null) { - OMCLogger.errorFormatted("Image non lisible pour " + entry.namespacedId() + " (skip)"); + RiftLog.ERROR_READING.send(entry.namespacedId()); skipped++; continue; } @@ -77,7 +77,7 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { } if (type.equals(IconsType.MENU_GUI)) { - OMCLogger.warnFormatted("Glyph " + entry.namespacedId() + " detécté comme MENU_GUI, il ne sera donc pas en glyph, vu que les menus sont géré autrement"); + RiftLog.DETECTED_AS_MENU_GUI.send(entry.namespacedId()); continue; } @@ -85,7 +85,7 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { } if (skipped > 0) { - OMCLogger.errorFormatted("Image manquante pour " + skipped + " emoji(s)/icon(s) sur " + entries.size() + "."); + RiftLog.ICON_SKIPPED.send(skipped, entries.size()); } if (resolved.isEmpty()) return; @@ -134,9 +134,7 @@ private void writePage(Path bedrockRootPath, Dimension size, List int col = i % GlyphsRegistry.GRID_SIZE; IconsType type = resolvedEmoji.type(); - OMCLogger.infoFormatted(resolvedEmoji.entry().namespacedId() + " (" - + resolvedEmoji.image().getWidth() + "x" + resolvedEmoji.image().getHeight() - + ") détecté comme " + type); + RiftLog.DETECTED_AS.send(resolvedEmoji.entry().namespacedId(), resolvedEmoji.image().getWidth(), resolvedEmoji.image().getHeight(), type); Rectangle placement = centerImage(resolvedEmoji.image(), cellWidth, cellHeight, resolvedEmoji.entry(), type); imageEditable.drawImage( diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/glyph/icons/SymbolWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/glyph/icons/SymbolWriter.java index aed89ea..0ef3826 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/glyph/icons/SymbolWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/glyph/icons/SymbolWriter.java @@ -1,7 +1,7 @@ package fr.openmc.riftengine.core.converter.writers.glyph.icons; -import fr.openmc.core.bootstrap.integration.OMCLogger; import fr.openmc.core.utils.YmlUtils; +import fr.openmc.riftengine.core.RiftLog; import fr.openmc.riftengine.core.RiftPlugin; import fr.openmc.riftengine.core.RiftRegistry; import fr.openmc.riftengine.core.converter.writers.PackWriter; @@ -50,7 +50,7 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { for (IconGlyph icon : icons) { Object entryObj = fontImagesMap.get(icon.getIcon().key()); if (!(entryObj instanceof Map entryMapRaw)) { - OMCLogger.warnFormatted("Clé " + icon.getIcon().key() + " introuvable dans " + ymlFile + "."); + RiftLog.SYMBOL_KEY_NOT_FOUND.send(icon.getIcon().key(), ymlFile); continue; } diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsMappingWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsMappingWriter.java index 33409a5..b15bdc8 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsMappingWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsMappingWriter.java @@ -2,10 +2,11 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import fr.openmc.core.bootstrap.integration.OMCLogger; import fr.openmc.riftengine.api.scanner.items.ItemEntry; import fr.openmc.riftengine.core.RiftPlugin; import fr.openmc.riftengine.core.converter.writers.PackWriter; +import fr.openmc.riftengine.core.resolvers.items.ItemResourceResolver; +import fr.openmc.riftengine.core.resolvers.items.ResolvedItemResource; import fr.openmc.riftengine.core.utils.PathUtils; import org.bukkit.Material; @@ -17,9 +18,11 @@ public class ItemsMappingWriter implements PackWriter { private final List items; + private final ItemResourceResolver resolver; - public ItemsMappingWriter(List items) { + public ItemsMappingWriter(List items, ItemResourceResolver resolver) { this.items = items; + this.resolver = resolver; } @Override @@ -30,23 +33,24 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws Exception { Map byMaterial = new HashMap<>(); for (ItemEntry item : items) { - Map resources = item.getBestResourcesId(); + List resources = resolver.resolve(javaRootPath, item); - if (resources == null) continue; + JsonArray definitions = byMaterial.computeIfAbsent( + item.getMaterial().getKey().asString(), + _ -> new JsonArray() + ); if (resources.size() == 1) { // * Gestion des items a une texture - byMaterial.computeIfAbsent(item.getMaterial().getKey().asString(), _ -> new JsonArray()) - .add(handleUniqueTexture(item)); - } else { + definitions.add(handleUniqueTexture(item, resources.getFirst())); + } else if (resources.size() > 1) { // * Gestion des items a plusieurs textures JsonObject def = new JsonObject(); def.addProperty("type", "group"); - def.addProperty("model", item.getNamespace() + ":ia_auto/" + item.getKey()); - def.add("definitions", handleMultipleTexture(item)); + def.addProperty("model", resources.getFirst().modelResourceId()); + def.add("definitions", handleMultipleTexture(item, resources)); - byMaterial.computeIfAbsent(item.getMaterial().getKey().asString(), _ -> new JsonArray()) - .add(def); + definitions.add(def); } } @@ -61,63 +65,50 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws Exception { this.writeJsonFile(outputFile, root); } - private JsonObject handleUniqueTexture(ItemEntry item) { + private JsonObject handleUniqueTexture(ItemEntry item, ResolvedItemResource resource) { JsonObject def = new JsonObject(); if (item.getCustomModelData() != null) { def.addProperty("type", "legacy"); def.addProperty("custom_model_data", item.getCustomModelData()); } else { def.addProperty("type", "definition"); - def.addProperty("model", item.getNamespace() + ":ia_auto/" + item.getKey()); + def.addProperty("model", resource.modelResourceId()); } - def.addProperty("bedrock_identifier", item.getKey()); + def.addProperty("bedrock_identifier", resource.bedrockIdentifier()); if (item.getBehaviour().isItem()) { JsonObject options = new JsonObject(); - options.addProperty("icon", item.getKey()); + options.addProperty("icon", resource.bedrockIdentifier()); def.add("bedrock_options", options); } return def; } - private JsonArray handleMultipleTexture(ItemEntry item) { + private JsonArray handleMultipleTexture(ItemEntry item, List resources) { JsonArray definitionsArray = new JsonArray(); - Map bestResources = item.getBestResourcesId(); - if (bestResources == null) { - OMCLogger.warn("Item {} : n'a pas de best resources", item.namespacedId()); - return definitionsArray; - } - - for (var entry : bestResources.entrySet()) { - String stateResource = entry.getKey(); - + for (ResolvedItemResource resource : resources) { JsonObject defObject = new JsonObject(); - String namespaceId = item.namespacedId(); - - if (!stateResource.equals(ItemEntry.DEFAULT_STATE)) - namespaceId += "_" + stateResource; - - defObject.addProperty("bedrock_identifier", namespaceId); + defObject.addProperty("bedrock_identifier", resource.bedrockIdentifier()); JsonObject options = new JsonObject(); - options.addProperty("icon", namespaceId); + options.addProperty("icon", resource.bedrockIdentifier()); options.addProperty("display_handheld", true); // y'a 5 types de conditions (broken, damaged, custom_model_data, has_component, fishing_rod_cast), // note pour plus tard si ajout elytra - if (!stateResource.equals(ItemEntry.DEFAULT_STATE) && item.getMaterial().equals(Material.FISHING_ROD)) { + if (!resource.state().equals(ItemEntry.DEFAULT_STATE) && item.getMaterial().equals(Material.FISHING_ROD)) { options.addProperty("display_handheld", true); + JsonObject predicate = new JsonObject(); predicate.addProperty("type", "condition"); predicate.addProperty("property", "fishing_rod_cast"); defObject.add("predicate", predicate); } - defObject.add("bedrock_options", options); definitionsArray.add(defObject); diff --git a/src/main/java/fr/openmc/riftengine/core/resolvers/items/ItemResourceResolver.java b/src/main/java/fr/openmc/riftengine/core/resolvers/items/ItemResourceResolver.java index 13e8c3b..c6138a9 100644 --- a/src/main/java/fr/openmc/riftengine/core/resolvers/items/ItemResourceResolver.java +++ b/src/main/java/fr/openmc/riftengine/core/resolvers/items/ItemResourceResolver.java @@ -1,7 +1,7 @@ package fr.openmc.riftengine.core.resolvers.items; import fr.openmc.riftengine.api.scanner.items.ItemEntry; -import fr.openmc.riftengine.core.RiftError; +import fr.openmc.riftengine.core.RiftLog; import fr.openmc.riftengine.core.registry.resolver.AbstractResolver; import fr.openmc.riftengine.core.utils.IdentifierUtils; import fr.openmc.riftengine.core.utils.PathUtils; @@ -18,7 +18,7 @@ public List resolve(Path javaRootPath, ItemEntry item) { Map resources = item.getBestResourcesId(); if (resources == null || resources.isEmpty()) { - RiftError.ITEM_NOT_RESOURCE.send(item.namespacedId()); + RiftLog.ITEM_NOT_RESOURCE.send(item.namespacedId()); return List.of(); } @@ -31,6 +31,7 @@ public List resolve(Path javaRootPath, ItemEntry item) { Path bedrockTexturePath = bedrockTexturePaths.get(state); String bedrockIdentifier = state.equals(ItemEntry.DEFAULT_STATE) ? item.getKey() : item.getKey() + "_" + state; String bedrockTextureValue = null; + String modelResourceId = item.getNamespace() + ":ia_auto/" + item.getKey(); if (resourceId.isEmpty()) { String folder = item.getBehaviour().isItem() ? "items" : "blocks"; @@ -46,7 +47,7 @@ public List resolve(Path javaRootPath, ItemEntry item) { resourcePath = bedrockTexturePaths.values().stream() .findFirst().get(); } else { - RiftError.RESOURCE_NOT_FOUND.send(item.getKey()); + RiftLog.RESOURCE_NOT_FOUND.send(item.getKey()); return List.of(); } @@ -58,12 +59,12 @@ public List resolve(Path javaRootPath, ItemEntry item) { } if (bedrockTextureValue == null) { - RiftError.RESOURCE_NOT_FOUND.send(item.getKey()); + RiftLog.RESOURCE_NOT_FOUND.send(item.getKey()); return List.of(); } resolved.add(new ResolvedItemResource( - item, state, resourceId, + item, state, resourceId, modelResourceId, bedrockIdentifier, bedrockTexturePath, bedrockTextureValue)); } diff --git a/src/main/java/fr/openmc/riftengine/core/resolvers/items/ResolvedItemResource.java b/src/main/java/fr/openmc/riftengine/core/resolvers/items/ResolvedItemResource.java index 9bb7b24..b8cd587 100644 --- a/src/main/java/fr/openmc/riftengine/core/resolvers/items/ResolvedItemResource.java +++ b/src/main/java/fr/openmc/riftengine/core/resolvers/items/ResolvedItemResource.java @@ -7,9 +7,10 @@ public record ResolvedItemResource(ItemEntry item, String state, // bottom, top, side String resourceId, // ex aywenite (sans le namespace devant), cloud_fishing_rod_cast + String modelResourceId, // ex omc_dream:ia_auto/dream_boot String bedrockIdentifier, // Path sourcePath, - String bedrockTexturePath// ex textures/aywenite + String bedrockTexturePath // ex textures/aywenite ) { public String bedrockIdWithState(String state) { return state.equals(ItemEntry.DEFAULT_STATE) ? item.getKey() : (item.getKey() + "_" + state); From f350ebd73989819039192090c045559ebd321d41 Mon Sep 17 00:00:00 2001 From: iambibi <89582596+iambibi@users.noreply.github.com> Date: Mon, 19 Oct 2026 17:44:04 +0200 Subject: [PATCH 5/5] chore: better Output file --- .../core/converter/writers/blocks/BlocksMappingWriter.java | 4 ++-- .../converter/writers/blocks/TerrainTextureJsonWriter.java | 5 ++--- .../core/converter/writers/items/ItemsMappingWriter.java | 4 ++-- .../core/converter/writers/items/ItemsTextureJsonWriter.java | 4 +++- .../core/converter/writers/manifest/IconWriter.java | 4 +++- .../core/converter/writers/manifest/ManifestWriter.java | 3 ++- .../core/converter/writers/manifest/PackIdentity.java | 3 ++- .../core/converter/writers/ui/ScoreboardUiWriter.java | 5 ++--- 8 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/BlocksMappingWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/BlocksMappingWriter.java index f1a9036..deae140 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/BlocksMappingWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/BlocksMappingWriter.java @@ -21,6 +21,7 @@ public class BlocksMappingWriter implements PackWriter { private final List items; private final ItemResourceResolver resolver; + private static final String OUTPUT_FILE = "custom_mappings/ia-blocks-injected.json"; public BlocksMappingWriter(List items, ItemResourceResolver resolver) { this.items = items; @@ -64,8 +65,7 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws Exception { Path outputFile = PathUtils .getGeyserPath(RiftPlugin.getInstance().getDataPath()) - .resolve("custom_mappings") - .resolve("ia-blocks-injected.json"); + .resolve(OUTPUT_FILE); Files.deleteIfExists(outputFile); this.writeJsonFile(outputFile, root); diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/TerrainTextureJsonWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/TerrainTextureJsonWriter.java index 5317f46..056b8c8 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/TerrainTextureJsonWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/blocks/TerrainTextureJsonWriter.java @@ -19,6 +19,7 @@ public class TerrainTextureJsonWriter implements PackWriter { private final PackIdentity packIdentity; private final List items; private final ItemResourceResolver resolver; + private static final String OUTPUT_FILE = "textures/terrain_texture.json"; public TerrainTextureJsonWriter(PackIdentity packIdentity, List items, ItemResourceResolver resolver) { this.packIdentity = packIdentity; @@ -50,9 +51,7 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { root.addProperty("num_mip_levels", 4); root.add("texture_data", textureData); - Path outputFile = bedrockRootPath - .resolve("textures") - .resolve("terrain_texture.json"); + Path outputFile = bedrockRootPath.resolve(OUTPUT_FILE); this.writeJsonFile(outputFile, root); } } diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsMappingWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsMappingWriter.java index b15bdc8..8354be5 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsMappingWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsMappingWriter.java @@ -19,6 +19,7 @@ public class ItemsMappingWriter implements PackWriter { private final List items; private final ItemResourceResolver resolver; + private static final String OUTPUT_FILE = "custom_mappings/ia-items-injected.json"; public ItemsMappingWriter(List items, ItemResourceResolver resolver) { this.items = items; @@ -59,8 +60,7 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws Exception { root.add("items", itemsSetter); Path outputFile = PathUtils.getGeyserPath(RiftPlugin.getInstance().getDataPath()) - .resolve("custom_mappings") - .resolve("ia-items-injected.json"); + .resolve(OUTPUT_FILE); Files.deleteIfExists(outputFile); this.writeJsonFile(outputFile, root); } diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsTextureJsonWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsTextureJsonWriter.java index 6e8f2d7..1ff34c9 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsTextureJsonWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/items/ItemsTextureJsonWriter.java @@ -16,6 +16,8 @@ public class ItemsTextureJsonWriter implements PackWriter { private final List items; private final ItemResourceResolver resolver; + private static final String OUTPUT_FILE = "textures/item_texture.json"; + public ItemsTextureJsonWriter(List items, ItemResourceResolver resolver) { this.items = items; @@ -40,7 +42,7 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { root.addProperty("texture_name", "atlas.items"); root.add("texture_data", textureData); - Path outputFile = bedrockRootPath.resolve("textures").resolve("item_texture.json"); + Path outputFile = bedrockRootPath.resolve(OUTPUT_FILE); this.writeJsonFile(outputFile, root); } } diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/IconWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/IconWriter.java index 8ba6ddb..2f26dd5 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/IconWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/IconWriter.java @@ -9,12 +9,14 @@ import java.nio.file.StandardCopyOption; public class IconWriter implements PackWriter { + private static final String OUTPUT_FILE = "pack_icon.png"; + @Override public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { try (InputStream is = getClass().getResourceAsStream("/pack_icon.png")) { if (is == null) throw new IOException("Resource introuvable : pack_icon.png"); - Files.copy(is, bedrockRootPath.resolve("pack_icon.png"), StandardCopyOption.REPLACE_EXISTING); + Files.copy(is, bedrockRootPath.resolve(OUTPUT_FILE), StandardCopyOption.REPLACE_EXISTING); } } diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/ManifestWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/ManifestWriter.java index 79bb6b1..01324b9 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/ManifestWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/ManifestWriter.java @@ -6,6 +6,7 @@ import java.nio.file.Path; public class ManifestWriter implements PackWriter { + private static final String OUTPUT_FILE = "manifest.json"; private final PackIdentity identity; public ManifestWriter(PackIdentity identity) { @@ -36,6 +37,6 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { } """.formatted(identity.getPackName(), identity.getHeaderUuid(), versionJson, identity.getModuleUuid(), versionJson); - this.writeFile(bedrockRootPath.resolve("manifest.json"), manifest); + this.writeFile(bedrockRootPath.resolve(OUTPUT_FILE), manifest); } } diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/PackIdentity.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/PackIdentity.java index d7adde8..ff4871b 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/PackIdentity.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/manifest/PackIdentity.java @@ -12,6 +12,7 @@ @Getter public class PackIdentity { + private static final String FILE_NAME = "pack-identity.yml"; private final String packName; private final UUID headerUuid; @@ -26,7 +27,7 @@ private PackIdentity(String packName, UUID headerUuid, UUID moduleUuid, int[] ve } public static PackIdentity loadOrCreate(JavaPlugin plugin) throws IOException { - File file = new File(plugin.getDataFolder(), "pack-identity.yml"); + File file = new File(plugin.getDataFolder(), FILE_NAME); YamlConfiguration config = YamlConfiguration.loadConfiguration(file); if (!config.contains("header-uuid")) { diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/ui/ScoreboardUiWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/ui/ScoreboardUiWriter.java index f67a786..71b3186 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/writers/ui/ScoreboardUiWriter.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/ui/ScoreboardUiWriter.java @@ -7,6 +7,7 @@ import java.nio.file.Path; public class ScoreboardUiWriter implements PackWriter { + private static final String OUTPUT_FILE = "ui/scoreboards.json"; private final boolean hideScoreboardNumberBedrock; public ScoreboardUiWriter(boolean hideScoreboardNumberBedrock) { @@ -23,9 +24,7 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { visible.addProperty("visible", false); root.add("scoreboard_sidebar_score", visible); - Path outputFile = bedrockRootPath - .resolve("ui") - .resolve("scoreboards.json"); + Path outputFile = bedrockRootPath.resolve(OUTPUT_FILE); this.writeJsonFile(outputFile, root); } }