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
);
}