From 750be66d80f1d490a70f821acb87e7769003c800 Mon Sep 17 00:00:00 2001 From: NotEvil Date: Tue, 14 Apr 2026 01:44:19 +0200 Subject: [PATCH] feat(D-01): parse component configs from item JSON definitions Add componentConfigs field (Map) to DataDrivenItemDefinition record. The parser now reads an optional "components" JSON block, resolves each key via ComponentType.fromKey(), and stores the raw JsonObject configs for later instantiation. --- .../datadriven/DataDrivenItemDefinition.java | 15 ++++++++-- .../datadriven/DataDrivenItemParser.java | 30 ++++++++++++++++++- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemDefinition.java b/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemDefinition.java index 0c5f5f4..a9af8af 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemDefinition.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemDefinition.java @@ -1,6 +1,8 @@ package com.tiedup.remake.v2.bondage.datadriven; +import com.google.gson.JsonObject; import com.tiedup.remake.v2.BodyRegionV2; +import com.tiedup.remake.v2.bondage.component.ComponentType; import java.util.Map; import java.util.Set; import net.minecraft.resources.ResourceLocation; @@ -97,5 +99,14 @@ public record DataDrivenItemDefinition( * *

This field is required in the JSON definition. Never null, never empty.

*/ - Map> animationBones -) {} + Map> animationBones, + + /** Raw component configs from JSON, keyed by ComponentType. */ + Map componentConfigs +) { + + /** Check whether this definition declares a given component type. */ + public boolean hasComponent(ComponentType type) { + return componentConfigs != null && componentConfigs.containsKey(type); + } +} diff --git a/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemParser.java b/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemParser.java index ff9e9fb..f0da6eb 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemParser.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenItemParser.java @@ -5,12 +5,14 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.tiedup.remake.v2.BodyRegionV2; +import com.tiedup.remake.v2.bondage.component.ComponentType; import com.tiedup.remake.v2.bondage.movement.MovementModifier; import com.tiedup.remake.v2.bondage.movement.MovementStyle; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.Collections; +import java.util.EnumMap; import java.util.EnumSet; import java.util.HashSet; import java.util.LinkedHashMap; @@ -266,6 +268,31 @@ public final class DataDrivenItemParser { return null; } + // Optional: components (per-component JSON configs) + Map componentConfigs = + new EnumMap<>(ComponentType.class); + if (root.has("components")) { + JsonObject componentsObj = root.getAsJsonObject("components"); + for (Map.Entry entry : + componentsObj.entrySet()) { + ComponentType compType = ComponentType.fromKey( + entry.getKey() + ); + if (compType != null) { + JsonObject config = entry.getValue().isJsonObject() + ? entry.getValue().getAsJsonObject() + : new JsonObject(); + componentConfigs.put(compType, config); + } else { + LOGGER.warn( + "[DataDrivenItemParser] Unknown component type '{}' in item '{}'", + entry.getKey(), + fileId + ); + } + } + } + // Build the item ID from the file path // fileId is like "tiedup:tiedup_items/leather_armbinder.json" // We want "tiedup:leather_armbinder" @@ -302,7 +329,8 @@ public final class DataDrivenItemParser { movementStyle, movementModifier, creator, - animationBones + animationBones, + componentConfigs ); }