From 2372024efe0280dba0f42b42f929d5fc973e2a82 Mon Sep 17 00:00:00 2001 From: iambibi <89582596+iambibi@users.noreply.github.com> Date: Tue, 20 Oct 2026 21:39:48 +0200 Subject: [PATCH 1/3] feat: item tooltips --- libs/OpenMC.jar | Bin 7008224 -> 7009754 bytes .../fr/openmc/riftengine/core/RiftLog.java | 8 +- .../core/converter/ConverterManager.java | 38 +- .../core/converter/writers/PackWriter.java | 6 +- .../writers/glyph/icons/SymbolWriter.java | 10 +- .../writers/manifest/IconWriter.java | 1 - .../tooltip/UiCommonTooltipWriter.java | 444 ++++++++++++++++++ .../glyph/TooltipGlyphApplicatorWriter.java | 113 +++++ .../glyph/TooltipGlyphAssignatorWriter.java | 52 ++ .../textures/FrameTextureConverter.java | 54 +++ .../textures/TooltipTextureWriter.java | 81 ++++ .../LoadAfterItemsAdderListener.java | 15 +- .../core/registry/glyphs/Glyph.java | 5 + .../core/registry/glyphs/GlyphsRegistry.java | 3 +- .../registry/glyphs/types/TooltipGlyph.java | 16 + .../registry/resolver/ResolverRegistry.java | 8 + .../resolvers/items/ItemResourceResolver.java | 2 +- .../animation/AnimationMcMetaResolver.java | 13 + .../animation/ResolvedAnimationMcMeta.java | 61 +++ .../mcmeta/gui/GuiMcMetaResolver.java | 12 + .../mcmeta/gui/ResolvedGuiMcMeta.java | 70 +++ .../tooltip/ResolvedTooltipResource.java | 117 +++++ .../tooltip/TooltipResourceResolver.java | 17 + 23 files changed, 1118 insertions(+), 28 deletions(-) create mode 100644 src/main/java/fr/openmc/riftengine/core/converter/writers/tooltip/UiCommonTooltipWriter.java create mode 100644 src/main/java/fr/openmc/riftengine/core/converter/writers/tooltip/glyph/TooltipGlyphApplicatorWriter.java create mode 100644 src/main/java/fr/openmc/riftengine/core/converter/writers/tooltip/glyph/TooltipGlyphAssignatorWriter.java create mode 100644 src/main/java/fr/openmc/riftengine/core/converter/writers/tooltip/textures/FrameTextureConverter.java create mode 100644 src/main/java/fr/openmc/riftengine/core/converter/writers/tooltip/textures/TooltipTextureWriter.java create mode 100644 src/main/java/fr/openmc/riftengine/core/registry/glyphs/types/TooltipGlyph.java create mode 100644 src/main/java/fr/openmc/riftengine/core/resolvers/mcmeta/animation/AnimationMcMetaResolver.java create mode 100644 src/main/java/fr/openmc/riftengine/core/resolvers/mcmeta/animation/ResolvedAnimationMcMeta.java create mode 100644 src/main/java/fr/openmc/riftengine/core/resolvers/mcmeta/gui/GuiMcMetaResolver.java create mode 100644 src/main/java/fr/openmc/riftengine/core/resolvers/mcmeta/gui/ResolvedGuiMcMeta.java create mode 100644 src/main/java/fr/openmc/riftengine/core/resolvers/tooltip/ResolvedTooltipResource.java create mode 100644 src/main/java/fr/openmc/riftengine/core/resolvers/tooltip/TooltipResourceResolver.java diff --git a/libs/OpenMC.jar b/libs/OpenMC.jar index 84c45a1c7cc31deabedb91039a47c2ddb9ffa02d..4a1eba93e055ac3d12cfd68d8ae5427f9a1a9398 100644 GIT binary patch delta 62163 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˥vMZ^R*cQxSv44#d#9t=_Y>Z>G{ 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

X*6TWs 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 P_-t?Ma@W0goRIzp0}sjG diff --git a/src/main/java/fr/openmc/riftengine/core/RiftLog.java b/src/main/java/fr/openmc/riftengine/core/RiftLog.java index af7cb33..610f10c 100644 --- a/src/main/java/fr/openmc/riftengine/core/RiftLog.java +++ b/src/main/java/fr/openmc/riftengine/core/RiftLog.java @@ -18,7 +18,13 @@ public enum RiftLog { 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) + RESOURCE_NOT_FOUND("Item {} : a aucune resource", LogType.WARN), + NUMBER_TOOLTIP_REGISTERED("{}/{} tooltip enregistrĂ©", LogType.INFO), + GLYPH_NOT_FOUND("Glyph {} introuvable", LogType.WARN), + FLIPBOOK_NULL("Flipbook est null pour ce tooltip {}", LogType.WARN), + NULL("{} est null", LogType.WARN), + + PATH_CANT_REDUCED_TO_TEXTURES("resource {} ne peut pas etre rĂ©duite Ă  un chemin de texture", LogType.WARN), ; public static void logBanner(String pluginVersion, String server, String javaVersion) { 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 6cd001f..3539fb8 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/ConverterManager.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/ConverterManager.java @@ -20,9 +20,16 @@ import fr.openmc.riftengine.core.converter.writers.manifest.IconWriter; import fr.openmc.riftengine.core.converter.writers.manifest.ManifestWriter; import fr.openmc.riftengine.core.converter.writers.manifest.PackIdentity; +import fr.openmc.riftengine.core.converter.writers.tooltip.UiCommonTooltipWriter; +import fr.openmc.riftengine.core.converter.writers.tooltip.glyph.TooltipGlyphApplicatorWriter; +import fr.openmc.riftengine.core.converter.writers.tooltip.glyph.TooltipGlyphAssignatorWriter; +import fr.openmc.riftengine.core.converter.writers.tooltip.textures.TooltipTextureWriter; 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 fr.openmc.riftengine.core.resolvers.mcmeta.animation.AnimationMcMetaResolver; +import fr.openmc.riftengine.core.resolvers.mcmeta.gui.GuiMcMetaResolver; +import fr.openmc.riftengine.core.resolvers.tooltip.TooltipResourceResolver; import org.bukkit.plugin.java.JavaPlugin; import java.io.File; @@ -45,7 +52,10 @@ public ConverterManager(RiftPlugin plugin) { try { PackIdentity identity = PackIdentity.loadOrCreate(plugin); List items = OMCRegistry.SCANNERS.ITEMS.scan(itemsAdderContents); - ItemResourceResolver resolver = RiftRegistry.RESOLVERS.ITEM_RESOURCE_RESOLVER; + ItemResourceResolver itemResolver = RiftRegistry.RESOLVERS.ITEM_RESOURCE_RESOLVER; + TooltipResourceResolver tooltipResolver = RiftRegistry.RESOLVERS.TOOLTIP_RESOURCE_RESOLVER; + GuiMcMetaResolver guiResolver = RiftRegistry.RESOLVERS.GUI_MCMETA_RESOLVER; + AnimationMcMetaResolver animResolver = RiftRegistry.RESOLVERS.ANIMATION_MCMETA_RESOLVER; register("IcĂ´nes", new IconWriter()); register("Manifest", new ManifestWriter(identity)); @@ -58,13 +68,21 @@ public ConverterManager(RiftPlugin plugin) { register("IcĂ´nes ItemsAdder", new IconsWriter(itemsAdderContents)); register("Mappings des symboles", new SymbolWriter()); - register("Textures des items", new ItemsTextureJsonWriter(items, resolver)); - register("Fichiers de textures", new ItemsTextureWriter(items, resolver)); - register("Mappings des items", new ItemsMappingWriter(items, resolver)); + register("Textures des items", new ItemsTextureJsonWriter(items, itemResolver)); + register("Fichiers de textures", new ItemsTextureWriter(items, itemResolver)); + register("Mappings des items", new ItemsMappingWriter(items, itemResolver)); + + register("Textures des tooltips", new TooltipTextureWriter(items, guiResolver, tooltipResolver)); + register("Assignations des glyphs pour les tooltips", + new TooltipGlyphAssignatorWriter(items, tooltipResolver)); + register("Application des glyphs sur les items", + new TooltipGlyphApplicatorWriter(items, itemsAdderContents)); + register("GĂ©nĂ©ration du JSON UI pour les tooltips", + new UiCommonTooltipWriter(items, tooltipResolver, guiResolver, animResolver)); register("Textures des blocs", - new TerrainTextureJsonWriter(identity, items, resolver)); - register("Mappings des blocs", new BlocksMappingWriter(items, resolver)); + new TerrainTextureJsonWriter(identity, items, itemResolver)); + register("Mappings des blocs", new BlocksMappingWriter(items, itemResolver)); } catch (Exception e) { throw new RuntimeException("Erreur lors d'initialisation du ConverterManager", e); @@ -108,9 +126,13 @@ public static Path getJavaPackPath(JavaPlugin plugin) { File pluginsDir = plugin.getDataFolder().getParentFile(); // * root/plugins/ File itemsAdderDir = new File(pluginsDir, "ItemsAdder"); // * root/plugins/ItemsAdder File outputDir = new File(itemsAdderDir, "output"); // * root/plugins/ItemsAdder/output - File generatedDir = new File(outputDir, "generated.zip"); // * root/plugins/ItemsAdder/output/generated.zip + File clientPacksDir = new File(outputDir, "client_packs"); // * root/plugins/ItemsAdder/output/client_packs/ - return generatedDir.toPath(); + return FilesUtils.listFileNames(clientPacksDir.toPath().toAbsolutePath().toString()).stream() + .filter(name -> name.contains(".zip") && name.contains("26_3") && name.contains("fast_compression")) + .findFirst() + .map(name -> clientPacksDir.toPath().resolve(name)) + .orElse(null); } public static Path getItemsAdderContents(JavaPlugin plugin) { 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 09195d1..10ec7ce 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 @@ -19,7 +19,11 @@ public interface PackWriter { void write(Path bedrockRootPath, Path javaRootPath) throws Exception; default void writeJsonFile(Path outputFile, JsonObject root) throws IOException { - this.writeFile(outputFile, GSON.toJson(root)); + this.writeJsonFile(outputFile, root, GSON); + } + + default void writeJsonFile(Path outputFile, JsonObject root, Gson gson) throws IOException { + this.writeFile(outputFile, gson.toJson(root)); } default void writeFile(Path outputFile, String content) throws IOException { 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 0ef3826..15494e1 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 @@ -2,13 +2,11 @@ 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; import fr.openmc.riftengine.core.listeners.LoadAfterItemsAdderListener; import fr.openmc.riftengine.core.registry.glyphs.Glyph; import fr.openmc.riftengine.core.registry.glyphs.types.IconGlyph; -import org.bukkit.Bukkit; import org.yaml.snakeyaml.Yaml; import java.io.IOException; @@ -67,12 +65,6 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { } } - LoadAfterItemsAdderListener.actionToLaunch.add(this::reloadItemsAdder); - } - - private void reloadItemsAdder() { - Bukkit.getScheduler().runTask(RiftPlugin.getInstance(), () -> - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "iazip") - ); + LoadAfterItemsAdderListener.reloadToLaunch = true; } } 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 2f26dd5..47ae12f 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 @@ -18,6 +18,5 @@ public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { Files.copy(is, bedrockRootPath.resolve(OUTPUT_FILE), StandardCopyOption.REPLACE_EXISTING); } - } } diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/tooltip/UiCommonTooltipWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/tooltip/UiCommonTooltipWriter.java new file mode 100644 index 0000000..6dafc88 --- /dev/null +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/tooltip/UiCommonTooltipWriter.java @@ -0,0 +1,444 @@ +package fr.openmc.riftengine.core.converter.writers.tooltip; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import fr.openmc.core.utils.JsonUtils; +import fr.openmc.riftengine.api.scanner.items.ItemEntry; +import fr.openmc.riftengine.core.RiftLog; +import fr.openmc.riftengine.core.RiftRegistry; +import fr.openmc.riftengine.core.converter.writers.PackWriter; +import fr.openmc.riftengine.core.registry.glyphs.Glyph; +import fr.openmc.riftengine.core.resolvers.mcmeta.animation.AnimationMcMetaResolver; +import fr.openmc.riftengine.core.resolvers.mcmeta.gui.GuiMcMetaResolver; +import fr.openmc.riftengine.core.resolvers.mcmeta.gui.ResolvedGuiMcMeta; +import fr.openmc.riftengine.core.resolvers.tooltip.ResolvedTooltipResource; +import fr.openmc.riftengine.core.resolvers.tooltip.TooltipResourceResolver; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class UiCommonTooltipWriter implements PackWriter { + private final List items; + private final TooltipResourceResolver tooltipResolver; + private final GuiMcMetaResolver guiMcMetaResolver; + private final AnimationMcMetaResolver animationMcMetaResolver; + private static final String OUTPUT_FILE = "ui/ui_common.json"; + + public UiCommonTooltipWriter(List items, + TooltipResourceResolver tooltipResolver, + GuiMcMetaResolver guiMcMetaResolver, + AnimationMcMetaResolver animationMcMetaResolver) { + this.items = items; + this.tooltipResolver = tooltipResolver; + this.animationMcMetaResolver = animationMcMetaResolver; + this.guiMcMetaResolver = guiMcMetaResolver; + } + + @Override + public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { + // todo: faire un TooltipScanner quand OpenMC sera divisĂ© en module + Map tooltipResources = new HashMap<>(); + for (ItemEntry itemEntry : items) { + ResolvedTooltipResource resource = tooltipResolver.resolve(javaRootPath, itemEntry); + if (resource == null) continue; + + tooltipResources.put(resource.resourceId(), resource); + } + + String namespace = "common"; + String element = "omc_hover_text"; + + JsonObject root = new JsonObject(); + root.addProperty("namespace", namespace); + + // * gĂ©nĂ©ration des animations des frames des tooltips + handleTooltipAnimation(javaRootPath, root, tooltipResources); + + tooltipResources.put("default", new ResolvedTooltipResource("default")); + + // * gĂ©nĂ©ration des tooltips cotĂ© JSON UI + handleTooltipDetection(javaRootPath, tooltipResources, root, namespace, element); + + // * on mets la template pour "injecter" notre tooltip + handleTooltipInjection(root, namespace, element); + + + Path outputFile = bedrockRootPath.resolve(OUTPUT_FILE); + this.writeJsonFile(outputFile, root); + } + + private void handleTooltipAnimation(Path javaRootPath, JsonObject root, Map tooltipResources) throws IOException { + for (ResolvedTooltipResource resource : tooltipResources.values()) { + String animationKey = resource.getKey() + "_frame" + "_flipbook"; + ResolvedTooltipResource.FlipbookAnimation flipbookAnimation = resource.getFrameFlipbookAnimation( + animationMcMetaResolver, guiMcMetaResolver, javaRootPath); + + // * Ă©crit le jsonobject pour les animations + ResolvedGuiMcMeta guiMeta = guiMcMetaResolver.resolve(javaRootPath, resource.frameMCMetaPath(javaRootPath)); + if (guiMeta != null && flipbookAnimation != null) { + JsonObject animation = writeAnimation(flipbookAnimation, animationKey, guiMeta); + root.add(animationKey, animation); + } + } + } + + private final String TEMPLATE_TOOLTIP = """ + { + "$hover_text_binding_name|default": "#hover_text", + "type": "panel", + "size": ["100%c", "100%c"], + "layer": 5, + "follows_cursor": true, + "offset": [12, -12], + "bindings": [ + { + "binding_name": "$hover_text_binding_name", + "binding_name_override": "#hover_text", + "binding_type": "collection", + "binding_collection_name": "$item_collection_name" + }, + { + "binding_type": "view", + "source_property_name": "(not (#hover_text = ''))", + "target_property_name": "#visible" + } + ] + }"""; + + private final String TEMPLATE_BASE_TOOLTIP = """ + { + "type": "panel", + "size": ["100%c", "100%c"], + "anchor_from": "top_left", + "anchor_to": "top_left" + }"""; + + private final String TEMPLATE_BINDINGS = """ + [ + { + "binding_name": "$hover_text_binding_name", + "binding_name_override": "#hover_text", + "binding_type": "collection", + "binding_collection_name": "$item_collection_name" + }, + { + "binding_type": "view", + "source_property_name": "", + "target_property_name": "#visible" + } + ] + """; + + private final String TEMPLATE_DEFAULT_CONTROLS = """ + [ + { + "border": { + "type": "image", + "texture": "textures/ui/tooltip_default_background", + "color": [0.3, 0.0, 1.0], + "layer": 0, + "anchor_from": "top_left", + "anchor_to": "top_left", + "size": ["100%sm", "100%sm"], + "controls": [ + { + "fill": { + "type": "image", + "texture": "textures/ui/tooltip_default_background", + "color": [0.235, 0.0, 0.235], + "alpha": 0.94, + "layer": 1, + "anchor_from": "center", + "anchor_to": "center", + "size": ["100% - 6px", "100% - 6px"] + } + } + ] + } + }, + { + "content": { + "type": "panel", + "layer": 3, + "size": ["100%c + 12px", "100%c + 8px"], + "anchor_from": "top_left", + "anchor_to": "top_left", + "controls": [ + { + "tooltip_text": { + "type": "label", + "text": "#text", + "size": ["default", "default"], + "anchor_from": "top_left", + "anchor_to": "top_left", + "offset": [6, 4], + "bindings": [ + { + "binding_name": "$hover_text_binding_name", + "binding_name_override": "#hover_text", + "binding_type": "collection", + "binding_collection_name": "$item_collection_name" + }, + { + "binding_type": "view", + "source_property_name": "", + "target_property_name": "#text" + } + ] + } + } + ] + } + } + ] + """; + + private final String TEMPLATE_CONTROLS_BACKGROUND_TOOLTIP = """ + { + "type": "image", + "texture": "", + "nineslice_size": [9, 23, 9, 18], + "layer": 0, + "anchor_from": "top_left", + "anchor_to": "top_left", + "size": ["100%sm + 10px", "100%sm + 14px"] + } + """; + + private final String TEMPLATE_CONTROLS_FRAME_TOOLTIP = """ + { + "type": "image", + "texture": "", + "uv": [0, 0], + "uv_size": [, ], + "nineslice_size": 20, + "layer": 1, + "anchor_from": "center", + "anchor_to": "center", + "size": ["100%", "100%"] + } + """; + + private final String TEMPLATE_CONTROLS_CONTENT = """ + { + "type": "panel", + "layer": 3, + "size": ["100%c + 12px", "100%c + 8px"], + "offset": [5, 7], + "anchor_from": "top_left", + "anchor_to": "top_left", + "controls": [ + { + "tooltip_text": { + "type": "label", + "text": "#text", + "size": ["default", "default"], + "anchor_from": "top_left", + "anchor_to": "top_left", + "offset": [6, 4], + "bindings": [ + { + "binding_name": "$hover_text_binding_name", + "binding_name_override": "#hover_text", + "binding_type": "collection", + "binding_collection_name": "$item_collection_name" + }, + { + "binding_type": "view", + "source_property_name": "(#hover_text - '')", + "target_property_name": "#text" + } + ] + } + } + ] + } + """; + + private void handleTooltipDetection(Path javaRootPath, + Map tooltipResources, + JsonObject root, + String namespace, + String element) throws IOException { + JsonObject elementTooltip = JsonUtils.parseJson(TEMPLATE_TOOLTIP); + JsonArray controls = new JsonArray(); + + for (ResolvedTooltipResource resource : tooltipResources.values()) { + Optional glyph = RiftRegistry.GLYPHS.get(resource.resourceId()); + + if (glyph.isEmpty() && !resource.resourceId().equals("default")) { + RiftLog.GLYPH_NOT_FOUND.send(resource.resourceId()); + continue; + } + + JsonObject tooltip = JsonUtils.parseJson(TEMPLATE_BASE_TOOLTIP); + + // * crĂ©ation de l'object binding + if (resource.getKey().equals("default")) { + String condition = "(#hover_text = #hover_text)"; + + for (ResolvedTooltipResource resourceCondition : tooltipResources.values()) { + Optional glyphCondition = RiftRegistry.GLYPHS.get(resourceCondition.resourceId()); + + if (glyphCondition.isEmpty()) { + RiftLog.GLYPH_NOT_FOUND.send(resourceCondition.resourceId()); + continue; + } + + String character = glyphCondition.get().getBedrockCharString(); + String marker = "'" + character + "'"; + condition = "(" + condition + + " and ((#hover_text - " + marker + + ") = #hover_text))"; + } + + tooltip.add("bindings", JsonUtils.parseJsonArray( + TEMPLATE_BINDINGS.replace("", condition))); + } else { + tooltip.add("bindings", JsonUtils.parseJsonArray(TEMPLATE_BINDINGS.replace("", + "(not ((#hover_text - '" + glyph.get().getBedrockCharString() + "') = #hover_text))"))); + } + + // * crĂ©ation de l'object controls + if (resource.getKey().equals("default")) { + String expression = "#hover_text"; + + for (ResolvedTooltipResource resourceCondition : tooltipResources.values()) { + Optional glyphCondition = RiftRegistry.GLYPHS.get(resourceCondition.resourceId()); + + if (glyphCondition.isEmpty()) { + RiftLog.GLYPH_NOT_FOUND.send(resourceCondition.resourceId()); + continue; + } + + String character = glyphCondition.get().getBedrockCharString(); + + expression = "(" + expression + " - '" + + character + "')"; + + tooltip.add("controls", JsonUtils.parseJsonArray(TEMPLATE_DEFAULT_CONTROLS.replace("", + expression))); + } + } else { + ResolvedTooltipResource.FlipbookAnimation animation = resource.getFrameFlipbookAnimation(animationMcMetaResolver, guiMcMetaResolver, javaRootPath); + JsonArray controlsTooltip = new JsonArray(); + + // * Ă©criture du background + JsonObject backgroundResource = new JsonObject(); + JsonObject inBackgroundResource = JsonUtils.parseJson(TEMPLATE_CONTROLS_BACKGROUND_TOOLTIP + .replace("", resource.backgroundImageBedrockPath(javaRootPath).toString())); + + String width = "0"; + String height = "0"; + if (animation != null) { + width = String.valueOf(animation.widthFrame()); + height = String.valueOf(animation.heightFrame()); + } else { + RiftLog.FLIPBOOK_NULL.send(resource.resourceId()); + } + + JsonArray backgroundControls = new JsonArray(); + JsonObject frame = JsonUtils.parseJson(TEMPLATE_CONTROLS_FRAME_TOOLTIP + .replace("", resource.frameImageBedrockPath(javaRootPath).toString()) + .replace("", width) + .replace("", height)); + + if (animation != null) { + frame.add("anims", JsonUtils.parseJsonArray("[@"+ namespace +"." + resource.getKey() + "_frame_flipbook]")); + } + + JsonObject frameObj = new JsonObject(); + frameObj.add(resource.getKey() + "_frame", frame); + backgroundControls.add(frameObj); + inBackgroundResource.add("controls", backgroundControls); + backgroundResource.add("bg_" + resource.getKey(), inBackgroundResource); + controlsTooltip.add(backgroundResource); + + // * Ă©criture du content + JsonObject contentResource = new JsonObject(); + JsonObject inContentResource = JsonUtils.parseJson(TEMPLATE_CONTROLS_CONTENT + .replace("", glyph.get().getBedrockCharString())); + + contentResource.add("content", inContentResource); + + controlsTooltip.add(contentResource); + + tooltip.add("controls", controlsTooltip); + } + + JsonObject control = new JsonObject(); + control.add("varient_" + resource.getKey(), tooltip); + controls.add(control); + } + + elementTooltip.add("controls", controls); + + root.add(element, elementTooltip); + } + + private final String TEMPLATE_HIGHLIGHT_SLOT_PANEL = """ + { + "type": "panel", + "controls": [ + { + "highlight@common.highlight_slot": { + "controls": [ + { + "hover_text@%s": { + "layer": 29 + } + } + ], + "bindings": [ + { + "binding_name": "#show_persistent_bundle_hover_text", + "binding_name_override": "#visible" + } + ] + } + }, + { + "white_border@common.white_border_slot": { + "bindings": [ + { + "binding_name": "#show_persistent_bundle_hover_text", + "binding_name_override": "#visible" + } + ] + } + } + ] + } + """; + + private void handleTooltipInjection(JsonObject root, String namespace, String element) { + JsonObject highlightSlotPanel = JsonUtils.parseJson( + TEMPLATE_HIGHLIGHT_SLOT_PANEL.formatted(namespace + "." + element)); + root.add("highlight_slot_panel", highlightSlotPanel); + } + + /** + * "anim_type": "flip_book", + * "frame_count": 15, + * "frame_step": 100, + * "fps": 6.67, + * "reversible": false, + * "easing": "linear", + * "next": "@common.legendary_frame_flipbook" + */ + private JsonObject writeAnimation(ResolvedTooltipResource.FlipbookAnimation flipbookAnim, String animationKey, ResolvedGuiMcMeta guiMeta) { + JsonObject flipbook = new JsonObject(); + flipbook.addProperty("anim_type", "flip_book"); + flipbook.addProperty("frame_count", flipbookAnim.frameCount()); + flipbook.addProperty("frame_step", guiMeta.widthFrame()); + flipbook.addProperty("fps", flipbookAnim.fps()); + flipbook.addProperty("reversible", false); + flipbook.addProperty("easing", "linear"); + flipbook.addProperty("next", "@common." + animationKey); + return flipbook; + } +} diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/tooltip/glyph/TooltipGlyphApplicatorWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/tooltip/glyph/TooltipGlyphApplicatorWriter.java new file mode 100644 index 0000000..1c558db --- /dev/null +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/tooltip/glyph/TooltipGlyphApplicatorWriter.java @@ -0,0 +1,113 @@ +package fr.openmc.riftengine.core.converter.writers.tooltip.glyph; + +import fr.openmc.core.utils.YmlUtils; +import fr.openmc.riftengine.api.scanner.items.ItemEntry; +import fr.openmc.riftengine.core.RiftRegistry; +import fr.openmc.riftengine.core.converter.writers.PackWriter; +import fr.openmc.riftengine.core.registry.glyphs.Glyph; +import fr.openmc.riftengine.core.registry.glyphs.types.TooltipGlyph; +import org.yaml.snakeyaml.DumperOptions; +import org.yaml.snakeyaml.Yaml; + +import java.io.IOException; +import java.io.Writer; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; + +/** + /** + * Suite logique de TooltipGlyphAssignatorWriter. + * On applique le glyph sur l'item qui doit avoir un tooltip. + */ +public class TooltipGlyphApplicatorWriter implements PackWriter { + + private final List items; + private final Path itemsAdderContents; + + public TooltipGlyphApplicatorWriter(List items, Path itemsAdderContents) { + this.items = items; + this.itemsAdderContents = itemsAdderContents; + } + + @Override + public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { + DumperOptions options = new DumperOptions(); + options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + options.setDefaultScalarStyle(DumperOptions.ScalarStyle.DOUBLE_QUOTED); + options.setSplitLines(false); + options.setWidth(Integer.MAX_VALUE); + + Yaml yaml = new Yaml(options); + + Map> itemsByFile = new LinkedHashMap<>(); + + for (ItemEntry itemEntry : items) { + String sourceYml = itemEntry.getSourceYml().toString() + .replaceFirst("^plugins/ItemsAdder/contents/", ""); + + Path ymlPath = itemsAdderContents.resolve(sourceYml).normalize(); + itemsByFile.computeIfAbsent(ymlPath, _ -> new ArrayList<>()).add(itemEntry); + } + + for (Map.Entry> fileEntry : itemsByFile.entrySet()) { + Path ymlPath = fileEntry.getKey(); + + if (!Files.isRegularFile(ymlPath)) continue; + + Map root = YmlUtils.loadYml(ymlPath); + if (root == null) continue; + + Map itemsSection = YmlUtils.getMap(root, "items"); + if (itemsSection == null) continue; + + boolean modified = false; + + for (ItemEntry itemEntry : fileEntry.getValue()) { + Optional glyph = RiftRegistry.GLYPHS.get( + itemEntry.getTooltipResourceId() + ); + + if (glyph.isEmpty() || !(glyph.get() instanceof TooltipGlyph tooltipGlyph)) continue; + + Object itemObject = itemsSection.get(itemEntry.getKey()); + if (!(itemObject instanceof Map)) continue; + + Map itemMap = (Map) itemObject; + + String key = itemMap.containsKey("display_name") ? "display_name" : "name"; + + String name = YmlUtils.getString(itemMap, key, null); + if (name == null) continue; + + String glyphStr = tooltipGlyph.getBedrockCharString(); + + if (name.contains(glyphStr) || name.contains(String.valueOf(tooltipGlyph.getBedrockChar()))) continue; + + itemMap.put(key, name + glyphStr); + modified = true; + } + + if (!modified) continue; + + try (Writer writer = Files.newBufferedWriter(ymlPath)) { + yaml.dump(root, writer); + } + + String content = Files.readString(ymlPath); + + for (ItemEntry itemEntry : fileEntry.getValue()) { + Optional glyph = RiftRegistry.GLYPHS.get( + itemEntry.getTooltipResourceId() + ); + + if (glyph.isEmpty() + || !(glyph.get() instanceof TooltipGlyph)) continue; + + content = content.replaceAll("\\\\\\\\(uF[0-9A-Fa-f]{3})", "\\\\$1"); + } + + Files.writeString(ymlPath, content); + } + } +} \ No newline at end of file diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/tooltip/glyph/TooltipGlyphAssignatorWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/tooltip/glyph/TooltipGlyphAssignatorWriter.java new file mode 100644 index 0000000..5dfeb45 --- /dev/null +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/tooltip/glyph/TooltipGlyphAssignatorWriter.java @@ -0,0 +1,52 @@ +package fr.openmc.riftengine.core.converter.writers.tooltip.glyph; + +import fr.openmc.riftengine.api.scanner.items.ItemEntry; +import fr.openmc.riftengine.core.RiftLog; +import fr.openmc.riftengine.core.RiftRegistry; +import fr.openmc.riftengine.core.converter.writers.PackWriter; +import fr.openmc.riftengine.core.registry.glyphs.types.TooltipGlyph; +import fr.openmc.riftengine.core.resolvers.tooltip.ResolvedTooltipResource; +import fr.openmc.riftengine.core.resolvers.tooltip.TooltipResourceResolver; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Cette classe doit ĂŞtre justifiĂ©e. + * Afin de detecter le tooltip sur un item dans JSON UI, il faut impĂ©rativement mettre un glyph dans l'item name + * de l'item qui doit avoir un tooltip. + */ +public class TooltipGlyphAssignatorWriter implements PackWriter { + private final List items; + private final TooltipResourceResolver resolver; + + public TooltipGlyphAssignatorWriter(List items, TooltipResourceResolver resolver) { + this.items = items; + this.resolver = resolver; + } + + @Override + public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { + // todo: faire un TooltipScanner quand OpenMC sera divisĂ© en module + Map tooltipResources = new HashMap<>(); + for (ItemEntry itemEntry : items) { + ResolvedTooltipResource resource = resolver.resolve(javaRootPath, itemEntry); + if (resource == null) continue; + + tooltipResources.put(resource.resourceId(), resource); + } + + int indexPage = 0; + for (ResolvedTooltipResource resource : tooltipResources.values()) { + int row = indexPage / 16; + int col = indexPage % 16; + RiftRegistry.GLYPHS.register(new TooltipGlyph(resource.resourceId(), row, col, resource)); + indexPage++; + } + + RiftLog.NUMBER_GLYPH_REGISTERED.send(indexPage + 1, 16*16); + } +} \ No newline at end of file diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/tooltip/textures/FrameTextureConverter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/tooltip/textures/FrameTextureConverter.java new file mode 100644 index 0000000..c81e5f1 --- /dev/null +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/tooltip/textures/FrameTextureConverter.java @@ -0,0 +1,54 @@ +package fr.openmc.riftengine.core.converter.writers.tooltip.textures; + +import fr.openmc.riftengine.core.resolvers.mcmeta.gui.ResolvedGuiMcMeta; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +/** + * Compense un problème, les animations de frames, doit etre en horizontal au lieu de vertical, on change d'orientation puis + * on copie la texture ou elle doit etre + */ +public class FrameTextureConverter { + public static void convert(ResolvedGuiMcMeta gui, + Path source, + Path destination) throws IOException { + BufferedImage src = ImageIO.read(source.toFile()); + + int width = src.getWidth(); + int height = src.getHeight(); + + int realWidth = gui.widthFrame() != null ? gui.widthFrame() : + (gui.heightFrame() != null ? gui.heightFrame() : Math.min(width, height)); + int realHeight = gui.heightFrame() != null ? gui.heightFrame() : + (gui.widthFrame() != null ? gui.widthFrame() : Math.min(width, height)); + + int cols = width / realWidth; + int numberFrame = cols * (height / realHeight); + + BufferedImage out = new BufferedImage(realWidth * numberFrame, realHeight, BufferedImage.TYPE_INT_ARGB); + Graphics2D graphics = out.createGraphics(); + try { + for (int i = 0; i < numberFrame; i++) { + graphics.drawImage(src.getSubimage( + (i % cols) * realWidth, + (i / cols) * realHeight, + realWidth, + realHeight), + i * realWidth, + 0, + null); + } + } finally { + graphics.dispose(); + } + + if (destination.getParent() != null) + Files.createDirectories(destination.getParent()); + ImageIO.write(out, "png", destination.toFile()); + } +} diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/tooltip/textures/TooltipTextureWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/tooltip/textures/TooltipTextureWriter.java new file mode 100644 index 0000000..b53c515 --- /dev/null +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/tooltip/textures/TooltipTextureWriter.java @@ -0,0 +1,81 @@ +package fr.openmc.riftengine.core.converter.writers.tooltip.textures; + +import fr.openmc.riftengine.api.scanner.items.ItemEntry; +import fr.openmc.riftengine.core.RiftLog; +import fr.openmc.riftengine.core.converter.writers.PackWriter; +import fr.openmc.riftengine.core.resolvers.mcmeta.gui.GuiMcMetaResolver; +import fr.openmc.riftengine.core.resolvers.mcmeta.gui.ResolvedGuiMcMeta; +import fr.openmc.riftengine.core.resolvers.tooltip.ResolvedTooltipResource; +import fr.openmc.riftengine.core.resolvers.tooltip.TooltipResourceResolver; +import fr.openmc.riftengine.core.utils.IdentifierUtils; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +// - ecrire les textures dans le resourcepack bedrock +// * faire un scanner pour savoir les frames, fps, et tt chose qui sont reliĂ© entre les textures et ui_common.json +// - allouer un glyph pour chaque "type" de tooltip + le mettre dans l'item name + demander reload ia +// - ecrire le ui/ui_common.json (une giga template que j'adapte en fonction des textures) +public class TooltipTextureWriter implements PackWriter { + private final List items; + private final GuiMcMetaResolver guiResolver; + private final TooltipResourceResolver resolver; + + public TooltipTextureWriter(List items, + GuiMcMetaResolver guiResolver, + TooltipResourceResolver resolver) { + this.items = items; + this.guiResolver = guiResolver; + this.resolver = resolver; + } + + @Override + public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { + // todo: faire un TooltipScanner quand OpenMC sera divisĂ© en module + Map tooltipResources = new HashMap<>(); + for (ItemEntry itemEntry : items) { + ResolvedTooltipResource resource = resolver.resolve(javaRootPath, itemEntry); + if (resource == null) continue; + + tooltipResources.put(resource.resourceId(), resource); + } + + for (ResolvedTooltipResource resource : tooltipResources.values()) { + Path backgroundImagePath = resource.backgroundImagePath(javaRootPath); + Path frameImagePath = resource.frameImagePath(javaRootPath); + + Path reducedBackgroundImagePath = resource.backgroundImageBedrockPath(javaRootPath); + Path reducedFrameImagePath = resource.frameImageBedrockPath(javaRootPath); + + if (reducedBackgroundImagePath == null) { + RiftLog.PATH_CANT_REDUCED_TO_TEXTURES.send(backgroundImagePath.toString()); + return; + } + + this.handleTextureUnanimated(bedrockRootPath, backgroundImagePath, reducedBackgroundImagePath); + + ResolvedGuiMcMeta resolvedGuiMcMeta = guiResolver.resolve(javaRootPath, resource.frameMCMetaPath(javaRootPath)); + if (resolvedGuiMcMeta == null) { + this.handleTextureUnanimated(bedrockRootPath, frameImagePath, reducedFrameImagePath); + } else { + this.handleTextureAnimated(bedrockRootPath, resolvedGuiMcMeta, frameImagePath, reducedFrameImagePath); + } + } + } + + private void handleTextureUnanimated(Path bedrockRootPath, Path imagePath, Path reducedImagePath) throws IOException { + this.copyFile(imagePath, bedrockRootPath.resolve(IdentifierUtils.toBedrockTexturePath(reducedImagePath.toString()))); + } + + private void handleTextureAnimated(Path bedrockRootPath, ResolvedGuiMcMeta resolvedGuiMcMeta, Path imagePath, Path reducedImagePath) throws IOException { + FrameTextureConverter.convert( + resolvedGuiMcMeta, + imagePath, + bedrockRootPath.resolve( IdentifierUtils.toBedrockTexturePath(reducedImagePath.toString())) + ); + } +} \ No newline at end of file diff --git a/src/main/java/fr/openmc/riftengine/core/listeners/LoadAfterItemsAdderListener.java b/src/main/java/fr/openmc/riftengine/core/listeners/LoadAfterItemsAdderListener.java index 5e762a1..ee7d4b0 100644 --- a/src/main/java/fr/openmc/riftengine/core/listeners/LoadAfterItemsAdderListener.java +++ b/src/main/java/fr/openmc/riftengine/core/listeners/LoadAfterItemsAdderListener.java @@ -1,19 +1,22 @@ package fr.openmc.riftengine.core.listeners; import dev.lone.itemsadder.api.Events.ItemsAdderLoadDataEvent; +import fr.openmc.riftengine.core.RiftPlugin; +import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -import java.util.ArrayList; -import java.util.List; - public class LoadAfterItemsAdderListener implements Listener { - public static List actionToLaunch = new ArrayList<>(); + public static boolean reloadToLaunch = false; @EventHandler public void onItemsAdderLoadFinish(ItemsAdderLoadDataEvent event) { - actionToLaunch.forEach(Runnable::run); - actionToLaunch.clear(); + if (reloadToLaunch) { + Bukkit.getScheduler().runTask(RiftPlugin.getInstance(), () -> + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "iazip") + ); + reloadToLaunch = false; + } } } diff --git a/src/main/java/fr/openmc/riftengine/core/registry/glyphs/Glyph.java b/src/main/java/fr/openmc/riftengine/core/registry/glyphs/Glyph.java index e4fd784..10cdfcf 100644 --- a/src/main/java/fr/openmc/riftengine/core/registry/glyphs/Glyph.java +++ b/src/main/java/fr/openmc/riftengine/core/registry/glyphs/Glyph.java @@ -19,6 +19,11 @@ public Glyph(String namespacedId, String page, int row, int col) { this.bedrockChar = buildBedrockChar(); } + public String getBedrockCharString() { + return String.format("\\u%04X", + (int) this.getBedrockChar()); + } + private char buildBedrockChar() { int page = Integer.parseInt(this.page, 16); return (char) ((page << 8) | (row * 16 + col)); diff --git a/src/main/java/fr/openmc/riftengine/core/registry/glyphs/GlyphsRegistry.java b/src/main/java/fr/openmc/riftengine/core/registry/glyphs/GlyphsRegistry.java index f6de6d5..56e82fb 100644 --- a/src/main/java/fr/openmc/riftengine/core/registry/glyphs/GlyphsRegistry.java +++ b/src/main/java/fr/openmc/riftengine/core/registry/glyphs/GlyphsRegistry.java @@ -13,7 +13,8 @@ public class GlyphsRegistry extends Registry private final List SLOT_GLYPH = new ArrayList<>(List.of( "E2", "E3", "E4", "E5", "E6", "E7", "E8", "E9", "EA", "EB", "EC", "ED", "EE", "EF", - "F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8")); + "F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7")); + public static final String TOOLTIP_PAGE = "F8"; private int nextPageIndex = 0; public String nextGlyphPage() { diff --git a/src/main/java/fr/openmc/riftengine/core/registry/glyphs/types/TooltipGlyph.java b/src/main/java/fr/openmc/riftengine/core/registry/glyphs/types/TooltipGlyph.java new file mode 100644 index 0000000..25b12e8 --- /dev/null +++ b/src/main/java/fr/openmc/riftengine/core/registry/glyphs/types/TooltipGlyph.java @@ -0,0 +1,16 @@ +package fr.openmc.riftengine.core.registry.glyphs.types; + +import fr.openmc.riftengine.core.registry.glyphs.Glyph; +import fr.openmc.riftengine.core.registry.glyphs.GlyphsRegistry; +import fr.openmc.riftengine.core.resolvers.tooltip.ResolvedTooltipResource; +import lombok.Getter; + +@Getter +public class TooltipGlyph extends Glyph { + private final ResolvedTooltipResource tooltipResource; + + public TooltipGlyph(String namespacedId, int row, int col, ResolvedTooltipResource tooltipResource) { + super(namespacedId, GlyphsRegistry.TOOLTIP_PAGE, row, col); + this.tooltipResource = tooltipResource; + } +} \ No newline at end of file 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 index 9fe82af..218e814 100644 --- a/src/main/java/fr/openmc/riftengine/core/registry/resolver/ResolverRegistry.java +++ b/src/main/java/fr/openmc/riftengine/core/registry/resolver/ResolverRegistry.java @@ -3,12 +3,20 @@ import fr.openmc.core.bootstrap.registries.KeyedRegistry; import fr.openmc.core.bootstrap.registries.Registry; import fr.openmc.riftengine.core.resolvers.items.ItemResourceResolver; +import fr.openmc.riftengine.core.resolvers.mcmeta.animation.AnimationMcMetaResolver; +import fr.openmc.riftengine.core.resolvers.mcmeta.gui.GuiMcMetaResolver; +import fr.openmc.riftengine.core.resolvers.tooltip.TooltipResourceResolver; public class ResolverRegistry extends Registry> implements KeyedRegistry> { public final ItemResourceResolver ITEM_RESOURCE_RESOLVER = register(new ItemResourceResolver()); + public final TooltipResourceResolver TOOLTIP_RESOURCE_RESOLVER = register(new TooltipResourceResolver()); + // todo: https://minecraft.wiki/w/Mcmeta faire les autres types de mcmeta si nĂ©cessaire + public final AnimationMcMetaResolver ANIMATION_MCMETA_RESOLVER = register(new AnimationMcMetaResolver()); + public final GuiMcMetaResolver GUI_MCMETA_RESOLVER = register(new GuiMcMetaResolver()); + @Override public String key(AbstractResolver resolver) { return resolver.getClass().getSimpleName(); 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 c6138a9..01078be 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 @@ -53,7 +53,7 @@ public List resolve(Path javaRootPath, ItemEntry item) { Path reducedPath = PathUtils.getPathFromRoot(resourcePath, "textures"); if (reducedPath != null) { - bedrockTextureValue = IdentifierUtils.toBedrockTexturePath(reducedPath.toString()) + bedrockTextureValue = IdentifierUtils.toBedrockTexturePath(reducedPath.toString()).toString() .replaceFirst("\\.[^/.]+$", ""); } } diff --git a/src/main/java/fr/openmc/riftengine/core/resolvers/mcmeta/animation/AnimationMcMetaResolver.java b/src/main/java/fr/openmc/riftengine/core/resolvers/mcmeta/animation/AnimationMcMetaResolver.java new file mode 100644 index 0000000..3b0660a --- /dev/null +++ b/src/main/java/fr/openmc/riftengine/core/resolvers/mcmeta/animation/AnimationMcMetaResolver.java @@ -0,0 +1,13 @@ +package fr.openmc.riftengine.core.resolvers.mcmeta.animation; + +import fr.openmc.riftengine.core.registry.resolver.AbstractResolver; + +import java.nio.file.Path; + + +public class AnimationMcMetaResolver extends AbstractResolver { + @Override + public ResolvedAnimationMcMeta resolve(Path javaRootPath, Path mcmeta) { + return ResolvedAnimationMcMeta.read(mcmeta); + } +} \ No newline at end of file diff --git a/src/main/java/fr/openmc/riftengine/core/resolvers/mcmeta/animation/ResolvedAnimationMcMeta.java b/src/main/java/fr/openmc/riftengine/core/resolvers/mcmeta/animation/ResolvedAnimationMcMeta.java new file mode 100644 index 0000000..56f4cab --- /dev/null +++ b/src/main/java/fr/openmc/riftengine/core/resolvers/mcmeta/animation/ResolvedAnimationMcMeta.java @@ -0,0 +1,61 @@ +package fr.openmc.riftengine.core.resolvers.mcmeta.animation; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import fr.openmc.core.utils.JsonUtils; +import fr.openmc.riftengine.core.RiftLog; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +/** + * basĂ© sur ... + */ +public record ResolvedAnimationMcMeta( + boolean interpolate, + Integer widthFrame, // taille en px d'une frame + Integer heightFrame, // hauteur en px d'une frame + int frameTime, // en ticks + List frames, + List frameTimes +) { + public static ResolvedAnimationMcMeta read(Path mcmetaPath) { + JsonObject root = JsonUtils.loadJson(mcmetaPath); + + if (root == null) { + RiftLog.ERROR_READING.send(mcmetaPath); + return null; + } + + JsonElement animation = root.get("animation"); + if (animation == null || !animation.isJsonObject()) { + RiftLog.NULL.send("animation"); + return null; + } + + JsonObject anim = root.getAsJsonObject("animation"); + + int frametime = Math.max(1, JsonUtils.getInt(anim, "frametime", 1)); + + List frames = new ArrayList<>(); + List frameTimes = new ArrayList<>(); + if (anim.has("frames") && anim.get("frames").isJsonArray()) { + for (JsonElement element : anim.getAsJsonArray("frames")) { + if (element.isJsonObject()) { + JsonObject f = element.getAsJsonObject(); + frames.add(JsonUtils.getInt(f, "index", 0)); + frameTimes.add(Math.max(1, JsonUtils.getInt(f, "time", frametime))); + } + } + } + + return new ResolvedAnimationMcMeta( + anim.has("interpolate") && anim.get("interpolate").getAsBoolean(), + JsonUtils.getInt(anim, "width", 0), + JsonUtils.getInt(anim, "height", 0), + frametime, + frames, + frameTimes); + } +} diff --git a/src/main/java/fr/openmc/riftengine/core/resolvers/mcmeta/gui/GuiMcMetaResolver.java b/src/main/java/fr/openmc/riftengine/core/resolvers/mcmeta/gui/GuiMcMetaResolver.java new file mode 100644 index 0000000..74f7eba --- /dev/null +++ b/src/main/java/fr/openmc/riftengine/core/resolvers/mcmeta/gui/GuiMcMetaResolver.java @@ -0,0 +1,12 @@ +package fr.openmc.riftengine.core.resolvers.mcmeta.gui; + +import fr.openmc.riftengine.core.registry.resolver.AbstractResolver; + +import java.nio.file.Path; + +public class GuiMcMetaResolver extends AbstractResolver { + @Override + public ResolvedGuiMcMeta resolve(Path javaRootPath, Path mcmeta) { + return ResolvedGuiMcMeta.read(mcmeta); + } +} \ No newline at end of file diff --git a/src/main/java/fr/openmc/riftengine/core/resolvers/mcmeta/gui/ResolvedGuiMcMeta.java b/src/main/java/fr/openmc/riftengine/core/resolvers/mcmeta/gui/ResolvedGuiMcMeta.java new file mode 100644 index 0000000..dfa2585 --- /dev/null +++ b/src/main/java/fr/openmc/riftengine/core/resolvers/mcmeta/gui/ResolvedGuiMcMeta.java @@ -0,0 +1,70 @@ +package fr.openmc.riftengine.core.resolvers.mcmeta.gui; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import fr.openmc.core.utils.JsonUtils; +import fr.openmc.riftengine.core.RiftLog; + +import java.nio.file.Path; + +/** + * basĂ© sur ... + */ +public record ResolvedGuiMcMeta( + String scallingType, // entre stretch (default), tile, ou nine_slice + Integer widthFrame, // taille en px d'une frame + Integer heightFrame, // hauteur en px d'une frame + boolean stretchInner, + Border border +) { + private record Border(Integer left, Integer right, Integer top, Integer bottom) { + public Border(Integer border) { + this(border, border, border, border); + } + } + public static ResolvedGuiMcMeta read(Path mcmetaPath) { + JsonObject root = JsonUtils.loadJson(mcmetaPath); + + if (root == null) { + RiftLog.ERROR_READING.send(mcmetaPath); + return null; + } + + JsonElement gui = root.get("gui"); + if (gui == null || !gui.isJsonObject()) { + RiftLog.NULL.send("gui"); + return null; + } + + JsonElement scaling = gui.getAsJsonObject().get("scaling"); + if (scaling == null || !scaling.isJsonObject()) { + RiftLog.NULL.send("scaling"); + return null; + } + + JsonObject scalingObj = scaling.getAsJsonObject(); + + Border border = null; + + JsonElement borderElt = scalingObj.get("border"); + if (borderElt.isJsonObject()) { + JsonObject borderObj = borderElt.getAsJsonObject(); + border = new Border( + JsonUtils.getInt(borderObj, "left", null), + JsonUtils.getInt(borderObj, "right", null), + JsonUtils.getInt(borderObj, "top", null), + JsonUtils.getInt(borderObj, "bottom", null) + ); + } else if (borderElt.isJsonPrimitive()) { + border = new Border(JsonUtils.getInt(scalingObj, "border", null)); + } + + return new ResolvedGuiMcMeta( + JsonUtils.getString(scalingObj, "type", "stretch"), + JsonUtils.getInt(scalingObj, "width", null), + JsonUtils.getInt(scalingObj, "height", null), + JsonUtils.getBool(scalingObj, "stretch_inner", false), + border + ); + } +} diff --git a/src/main/java/fr/openmc/riftengine/core/resolvers/tooltip/ResolvedTooltipResource.java b/src/main/java/fr/openmc/riftengine/core/resolvers/tooltip/ResolvedTooltipResource.java new file mode 100644 index 0000000..eae388a --- /dev/null +++ b/src/main/java/fr/openmc/riftengine/core/resolvers/tooltip/ResolvedTooltipResource.java @@ -0,0 +1,117 @@ +package fr.openmc.riftengine.core.resolvers.tooltip; + +import fr.openmc.riftengine.api.utils.IdentifierUtils; +import fr.openmc.riftengine.core.resolvers.mcmeta.animation.AnimationMcMetaResolver; +import fr.openmc.riftengine.core.resolvers.mcmeta.animation.ResolvedAnimationMcMeta; +import fr.openmc.riftengine.core.resolvers.mcmeta.gui.GuiMcMetaResolver; +import fr.openmc.riftengine.core.resolvers.mcmeta.gui.ResolvedGuiMcMeta; +import fr.openmc.riftengine.core.utils.PathUtils; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.nio.file.Path; + +public record ResolvedTooltipResource( + String resourceId // ex omc_tooltips:tooltip/legendary +) { + public String getKey() { + String keySplit = IdentifierUtils.normalizeId(resourceId).split(":")[1]; + String[] keySplit2 = keySplit.split("/"); + return keySplit2[keySplit2.length - 1]; + } + + public String backgroundResourceId() { + return resourceId + "_background"; + } + + public String frameResourceId() { + return resourceId + "_frame"; + } + + private String normalizeTooltipId(String id) { + String normalized = IdentifierUtils.normalizeId(id); + String[] keySplit = normalized.split(":"); + String key = "gui/sprites/tooltip/" + keySplit[1]; + + return keySplit[0] + ":" + key; + } + + public Path backgroundImagePath(Path javaRoot) { + Path path = IdentifierUtils.resolveTextureId(javaRoot, IdentifierUtils.normalizeId(backgroundResourceId())); + + if (path.toFile().exists()) + return path; + + return IdentifierUtils.resolveTextureId(javaRoot, normalizeTooltipId(backgroundResourceId())); + } + + public Path frameImagePath(Path javaRoot) { + Path path = IdentifierUtils.resolveTextureId(javaRoot, IdentifierUtils.normalizeId(frameResourceId())); + + if (path.toFile().exists()) + return path; + + return IdentifierUtils.resolveTextureId(javaRoot, normalizeTooltipId(frameResourceId())); + } + + public Path backgroundMCMetaPath(Path javaRoot) { + Path path = IdentifierUtils.resolveMetaId(javaRoot, IdentifierUtils.normalizeId(backgroundResourceId()), ".png"); + + if (path.toFile().exists()) + return path; + + return IdentifierUtils.resolveMetaId(javaRoot, normalizeTooltipId(backgroundResourceId()), ".png"); + } + + public Path frameMCMetaPath(Path javaRoot) { + Path path = IdentifierUtils.resolveMetaId(javaRoot, IdentifierUtils.normalizeId(frameResourceId()), ".png"); + + if (path.toFile().exists()) + return path; + + return IdentifierUtils.resolveMetaId(javaRoot, normalizeTooltipId(frameResourceId()), ".png"); + } + + public Path backgroundImageBedrockPath(Path javaRootPath) { + return PathUtils.getPathFromRoot(backgroundImagePath(javaRootPath), "textures"); + } + + public Path frameImageBedrockPath(Path javaRootPath) { + return PathUtils.getPathFromRoot(frameImagePath(javaRootPath), "textures"); + } + + + // todo: sacrĂ© bordel, surement faier un record Animationinfo nn? + public int numberFrame(Path javaRootPath, ResolvedGuiMcMeta gui) throws IOException { + Path frameImagePath = this.frameImagePath(javaRootPath); + BufferedImage src = ImageIO.read(frameImagePath.toFile()); + + int width = src.getWidth(); + int height = src.getHeight(); + + int realWidth = gui.widthFrame() != null ? gui.widthFrame() : + (gui.heightFrame() != null ? gui.heightFrame() : Math.min(width, height)); + int realHeight = gui.heightFrame() != null ? gui.heightFrame() : + (gui.widthFrame() != null ? gui.widthFrame() : Math.min(width, height)); + + int cols = width / realWidth; + return cols * (height / realHeight); + } + + public FlipbookAnimation getFrameFlipbookAnimation(AnimationMcMetaResolver animationMcMetaResolver, GuiMcMetaResolver guiMcMetaResolver, Path javaRootPath) throws IOException { + ResolvedGuiMcMeta guiMeta = guiMcMetaResolver.resolve(javaRootPath, frameMCMetaPath(javaRootPath)); + ResolvedAnimationMcMeta animationMeta = animationMcMetaResolver.resolve(javaRootPath, frameMCMetaPath(javaRootPath)); + + if (guiMeta == null) + return null; + + Double fps = animationMeta == null ? null : (20d / animationMeta.frameTime()); + return new FlipbookAnimation(this.numberFrame(javaRootPath, guiMeta), + guiMeta.heightFrame(), + guiMeta.widthFrame(), + fps); + } + + public record FlipbookAnimation(int frameCount, int heightFrame, int widthFrame, Double fps) {} +} diff --git a/src/main/java/fr/openmc/riftengine/core/resolvers/tooltip/TooltipResourceResolver.java b/src/main/java/fr/openmc/riftengine/core/resolvers/tooltip/TooltipResourceResolver.java new file mode 100644 index 0000000..3ff0178 --- /dev/null +++ b/src/main/java/fr/openmc/riftengine/core/resolvers/tooltip/TooltipResourceResolver.java @@ -0,0 +1,17 @@ +package fr.openmc.riftengine.core.resolvers.tooltip; + +import fr.openmc.riftengine.api.scanner.items.ItemEntry; +import fr.openmc.riftengine.core.registry.resolver.AbstractResolver; + +import java.nio.file.Path; + +public class TooltipResourceResolver extends AbstractResolver { + @Override + public ResolvedTooltipResource resolve(Path javaRootPath, ItemEntry item) { + String tooltipStyle = item.getTooltipResourceId(); + + if (tooltipStyle == null) return null; + + return new ResolvedTooltipResource(tooltipStyle); + } +} From 97bfd29a4d19528d75a33d01b8481f029f8e66f3 Mon Sep 17 00:00:00 2001 From: iambibi <89582596+iambibi@users.noreply.github.com> Date: Tue, 20 Oct 2026 21:43:21 +0200 Subject: [PATCH 2/3] bump to 0.5-SNAPSHOT --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ef23d02..ef50236 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group = 'fr.openmc.riftengine' -version = '0.4-SNAPSHOT' +version = '0.5-SNAPSHOT' repositories { mavenCentral() From 44bfb12f3f7be5592e16cf9e511f1035fa64fb87 Mon Sep 17 00:00:00 2001 From: iambibi <89582596+iambibi@users.noreply.github.com> Date: Tue, 20 Oct 2026 22:55:23 +0200 Subject: [PATCH 3/3] feat: convert sounds --- libs/OpenMC.jar | Bin 7009754 -> 7013915 bytes .../core/converter/ConverterManager.java | 6 +++ .../sounds/SoundsDefinitionsJsonWriter.java | 45 ++++++++++++++++++ .../writers/sounds/SoundsFileWriter.java | 25 ++++++++++ 4 files changed, 76 insertions(+) create mode 100644 src/main/java/fr/openmc/riftengine/core/converter/writers/sounds/SoundsDefinitionsJsonWriter.java create mode 100644 src/main/java/fr/openmc/riftengine/core/converter/writers/sounds/SoundsFileWriter.java diff --git a/libs/OpenMC.jar b/libs/OpenMC.jar index 4a1eba93e055ac3d12cfd68d8ae5427f9a1a9398..18216070dbe1229914ae8a9fd9a136512f8c549e 100644 GIT binary patch delta 58025 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�yIoLjf3mSd@y- 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 QDlOgL=>PWECJWO414BELlK=n! delta 53074 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≶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'EYC5Er*aIg}^J! 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


U5mZmmRTBBR22c3DoY75@;I4eMS9G{B{w4pKl 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 Rd~Lq=b*=daCrtAo{U46fA8G&q 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 3539fb8..6443402 100644 --- a/src/main/java/fr/openmc/riftengine/core/converter/ConverterManager.java +++ b/src/main/java/fr/openmc/riftengine/core/converter/ConverterManager.java @@ -20,6 +20,8 @@ import fr.openmc.riftengine.core.converter.writers.manifest.IconWriter; import fr.openmc.riftengine.core.converter.writers.manifest.ManifestWriter; import fr.openmc.riftengine.core.converter.writers.manifest.PackIdentity; +import fr.openmc.riftengine.core.converter.writers.sounds.SoundsDefinitionsJsonWriter; +import fr.openmc.riftengine.core.converter.writers.sounds.SoundsFileWriter; import fr.openmc.riftengine.core.converter.writers.tooltip.UiCommonTooltipWriter; import fr.openmc.riftengine.core.converter.writers.tooltip.glyph.TooltipGlyphApplicatorWriter; import fr.openmc.riftengine.core.converter.writers.tooltip.glyph.TooltipGlyphAssignatorWriter; @@ -52,6 +54,7 @@ public ConverterManager(RiftPlugin plugin) { try { PackIdentity identity = PackIdentity.loadOrCreate(plugin); List items = OMCRegistry.SCANNERS.ITEMS.scan(itemsAdderContents); + ItemResourceResolver itemResolver = RiftRegistry.RESOLVERS.ITEM_RESOURCE_RESOLVER; TooltipResourceResolver tooltipResolver = RiftRegistry.RESOLVERS.TOOLTIP_RESOURCE_RESOLVER; GuiMcMetaResolver guiResolver = RiftRegistry.RESOLVERS.GUI_MCMETA_RESOLVER; @@ -65,6 +68,9 @@ public ConverterManager(RiftPlugin plugin) { register("Scoreboard", new ScoreboardUiWriter(config.isHideScoreboardNumberBedrock())); + register("Sounds Definitions Json", new SoundsDefinitionsJsonWriter()); + register("Sounds File", new SoundsFileWriter()); + register("IcĂ´nes ItemsAdder", new IconsWriter(itemsAdderContents)); register("Mappings des symboles", new SymbolWriter()); diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/sounds/SoundsDefinitionsJsonWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/sounds/SoundsDefinitionsJsonWriter.java new file mode 100644 index 0000000..e2abc75 --- /dev/null +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/sounds/SoundsDefinitionsJsonWriter.java @@ -0,0 +1,45 @@ +package fr.openmc.riftengine.core.converter.writers.sounds; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import fr.openmc.core.OMCRegistry; +import fr.openmc.riftengine.api.scanner.sounds.SoundEntry; +import fr.openmc.riftengine.core.converter.writers.PackWriter; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.List; + +/** + * Ecrit le sounds_definitions.json qui sert grosso modo a relier les textures aux items (une ref = une resource) + */ +public class SoundsDefinitionsJsonWriter implements PackWriter { + private static final String OUTPUT_FILE = "sounds/sound_definitions.json"; + + @Override + public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { + List sounds = OMCRegistry.SCANNERS.SOUNDS.scan(javaRootPath); + JsonObject definitions = new JsonObject(); + + for (SoundEntry entry : sounds) { + JsonArray array = new JsonArray(); + for (String resourceId : entry.soundResourcesId()) { + if (resourceId == null) continue; + array.add(entry.toBedrockPath("minecraft", resourceId)); + } + if (array.isEmpty()) continue; + + JsonObject def = new JsonObject(); + def.addProperty("category", "player"); + def.add("sounds", array); + definitions.add(entry.toBedrockEventId(), def); + } + + JsonObject root = new JsonObject(); + root.addProperty("format_version", "1.21.50"); + root.add("sound_definitions", definitions); + + Path outputFile = bedrockRootPath.resolve(OUTPUT_FILE); + this.writeJsonFile(outputFile, root); + } +} diff --git a/src/main/java/fr/openmc/riftengine/core/converter/writers/sounds/SoundsFileWriter.java b/src/main/java/fr/openmc/riftengine/core/converter/writers/sounds/SoundsFileWriter.java new file mode 100644 index 0000000..344661b --- /dev/null +++ b/src/main/java/fr/openmc/riftengine/core/converter/writers/sounds/SoundsFileWriter.java @@ -0,0 +1,25 @@ +package fr.openmc.riftengine.core.converter.writers.sounds; + +import fr.openmc.core.OMCRegistry; +import fr.openmc.riftengine.api.scanner.sounds.SoundEntry; +import fr.openmc.riftengine.core.converter.writers.PackWriter; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.List; + +public class SoundsFileWriter implements PackWriter { + @Override + public void write(Path bedrockRootPath, Path javaRootPath) throws IOException { + List sounds = OMCRegistry.SCANNERS.SOUNDS.scan(javaRootPath); + + for (SoundEntry soundEntry : sounds) { + for (String soundResourceId : soundEntry.soundResourcesId()) { + Path soundsPath = javaRootPath.resolve(soundEntry.toJavaPath("minecraft", soundResourceId) + ".ogg"); + Path dest = bedrockRootPath.resolve(soundEntry.toBedrockPath("minecraft", soundResourceId) + ".ogg"); + + this.copyFile(soundsPath, dest); + } + } + } +}