From b193c77021a36fddcdf189e7e7c27549999296ff Mon Sep 17 00:00:00 2001 From: NotEvil Date: Tue, 14 Apr 2026 17:47:32 +0200 Subject: [PATCH] feat(D-01/B): add can_attach_padlock field to data-driven items (B0) - DataDrivenItemDefinition: add canAttachPadlock boolean (default true) - DataDrivenItemParser: parse "can_attach_padlock" from JSON - DataDrivenBondageItem: add static canAttachPadlockTo(stack) method - AnvilEventHandler: check V2 definition before allowing padlock attach --- .../remake/events/system/AnvilEventHandler.java | 6 +++++- .../bondage/datadriven/DataDrivenBondageItem.java | 13 +++++++++++++ .../datadriven/DataDrivenItemDefinition.java | 3 +++ .../v2/bondage/datadriven/DataDrivenItemParser.java | 4 ++++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/tiedup/remake/events/system/AnvilEventHandler.java b/src/main/java/com/tiedup/remake/events/system/AnvilEventHandler.java index 68e9a88..d7050b3 100644 --- a/src/main/java/com/tiedup/remake/events/system/AnvilEventHandler.java +++ b/src/main/java/com/tiedup/remake/events/system/AnvilEventHandler.java @@ -40,7 +40,11 @@ public class AnvilEventHandler { // Check if item can have a padlock attached (tape, slime, vine, web cannot) if (!lockable.canAttachPadlock()) { - return; // Item type cannot have padlock + return; // Item type cannot have padlock (V1) + } + // V2 data-driven items: check definition's can_attach_padlock field + if (!com.tiedup.remake.v2.bondage.datadriven.DataDrivenBondageItem.canAttachPadlockTo(left)) { + return; } // Item must not already have a padlock attached diff --git a/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenBondageItem.java b/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenBondageItem.java index 3bf2e04..f73ecf4 100644 --- a/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenBondageItem.java +++ b/src/main/java/com/tiedup/remake/v2/bondage/datadriven/DataDrivenBondageItem.java @@ -436,6 +436,19 @@ public class DataDrivenBondageItem extends AbstractV2BondageItem { ); } + /** + * Stack-aware padlock attachment check for data-driven items. + * Returns false for organic items (slime, vine, web, tape) that have + * {@code can_attach_padlock: false} in their JSON definition. + */ + public static boolean canAttachPadlockTo(ItemStack stack) { + DataDrivenItemDefinition def = DataDrivenItemRegistry.get(stack); + if (def != null) { + return def.canAttachPadlock(); + } + return true; + } + // ===== FACTORY ===== /** 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 fa5d9e4..ce1a4db 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 @@ -58,6 +58,9 @@ public record DataDrivenItemDefinition( /** Whether this item can be locked with a padlock. */ boolean lockable, + /** Whether a padlock can be attached to this item. False for organic items (slime, vine, web, tape). */ + boolean canAttachPadlock, + /** Whether this item supports color variants. */ boolean supportsColor, 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 9c4dd1c..91f5d91 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 @@ -200,6 +200,9 @@ public final class DataDrivenItemParser { // Optional: lockable (default true) boolean lockable = getBooleanOrDefault(root, "lockable", true); + // Optional: can_attach_padlock (default true). False for organic items. + boolean canAttachPadlock = getBooleanOrDefault(root, "can_attach_padlock", true); + // Optional: supports_color (default false) boolean supportsColor = getBooleanOrDefault( root, @@ -335,6 +338,7 @@ public final class DataDrivenItemParser { posePriority, escapeDifficulty, lockable, + canAttachPadlock, supportsColor, tintChannels, icon,