From dfa7024e21b60e31801366dcb078ae123490332f Mon Sep 17 00:00:00 2001 From: NotEvil Date: Wed, 15 Apr 2026 02:10:25 +0200 Subject: [PATCH] fix(D-01/D): blindfold ID mismatch + dispenser V2 registration (review) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit KidnapperTheme: fix "mask_blindfold" → "blindfold_mask" across 8 themes. The incorrect ID produced ghost items with no definition. DispenserBehaviors: register GenericBondageDispenseBehavior.forAnyDataDriven() for the V2 DATA_DRIVEN_ITEM singleton. Dispatches by region from the stack's definition. V1 per-variant registrations were deleted but V2 replacement was missing. --- .../remake/dispenser/DispenserBehaviors.java | 15 ++++++++--- .../GenericBondageDispenseBehavior.java | 26 +++++++++++++++++++ .../remake/entities/KidnapperTheme.java | 16 ++++++------ 3 files changed, 46 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/tiedup/remake/dispenser/DispenserBehaviors.java b/src/main/java/com/tiedup/remake/dispenser/DispenserBehaviors.java index e1ce1e3..1fbb23a 100644 --- a/src/main/java/com/tiedup/remake/dispenser/DispenserBehaviors.java +++ b/src/main/java/com/tiedup/remake/dispenser/DispenserBehaviors.java @@ -30,9 +30,7 @@ public class DispenserBehaviors { registerClothesBehaviors(); registerRopeArrowBehavior(); - - // V2 data-driven bondage items register their own dispenser behaviors - // via DataDrivenBondageItem.registerDispenserBehaviors() + registerBondageItemBehavior(); TiedUpMod.LOGGER.info( "[DispenserBehaviors] Dispenser behaviors registered!" @@ -46,6 +44,17 @@ public class DispenserBehaviors { ); } + private static void registerBondageItemBehavior() { + // Single registration for the V2 data-driven item singleton. + // GenericBondageDispenseBehavior inspects the stack's definition to determine behavior. + if (com.tiedup.remake.v2.bondage.V2BondageItems.DATA_DRIVEN_ITEM != null) { + DispenserBlock.registerBehavior( + com.tiedup.remake.v2.bondage.V2BondageItems.DATA_DRIVEN_ITEM.get(), + GenericBondageDispenseBehavior.forAnyDataDriven() + ); + } + } + private static void registerRopeArrowBehavior() { DispenserBlock.registerBehavior( ModItems.ROPE_ARROW.get(), diff --git a/src/main/java/com/tiedup/remake/dispenser/GenericBondageDispenseBehavior.java b/src/main/java/com/tiedup/remake/dispenser/GenericBondageDispenseBehavior.java index ffa536f..f15143f 100644 --- a/src/main/java/com/tiedup/remake/dispenser/GenericBondageDispenseBehavior.java +++ b/src/main/java/com/tiedup/remake/dispenser/GenericBondageDispenseBehavior.java @@ -56,6 +56,32 @@ public class GenericBondageDispenseBehavior // Factory Methods + /** Universal behavior for the V2 data-driven item singleton. Dispatches by region. */ + public static GenericBondageDispenseBehavior forAnyDataDriven() { + return new GenericBondageDispenseBehavior( + stack -> DataDrivenItemRegistry.get(stack) != null, + state -> true, // let equip() handle the check + (state, stack) -> { + DataDrivenItemDefinition def = DataDrivenItemRegistry.get(stack); + if (def == null) return; + java.util.Set regions = def.occupiedRegions(); + if (regions.contains(BodyRegionV2.ARMS) && !state.isTiedUp()) { + state.equip(BodyRegionV2.ARMS, stack); + } else if (regions.contains(BodyRegionV2.MOUTH) && !state.isGagged()) { + state.equip(BodyRegionV2.MOUTH, stack); + } else if (regions.contains(BodyRegionV2.EYES) && !state.isBlindfolded()) { + state.equip(BodyRegionV2.EYES, stack); + } else if (regions.contains(BodyRegionV2.NECK) && !state.hasCollar()) { + state.equip(BodyRegionV2.NECK, stack); + } else if (regions.contains(BodyRegionV2.EARS) && !state.hasEarplugs()) { + state.equip(BodyRegionV2.EARS, stack); + } else if (regions.contains(BodyRegionV2.HANDS) && !state.hasMittens()) { + state.equip(BodyRegionV2.HANDS, stack); + } + } + ); + } + public static GenericBondageDispenseBehavior forBind() { return new GenericBondageDispenseBehavior( BindModeHelper::isBindItem, diff --git a/src/main/java/com/tiedup/remake/entities/KidnapperTheme.java b/src/main/java/com/tiedup/remake/entities/KidnapperTheme.java index a7b72ab..4dcadee 100644 --- a/src/main/java/com/tiedup/remake/entities/KidnapperTheme.java +++ b/src/main/java/com/tiedup/remake/entities/KidnapperTheme.java @@ -37,7 +37,7 @@ public enum KidnapperTheme { TAPE( "duct_tape", new String[] { "tape_gag", "wrap_gag" }, - new String[] { "mask_blindfold" }, + new String[] { "blindfold_mask" }, true, 20 ), @@ -47,7 +47,7 @@ public enum KidnapperTheme { LEATHER( "leather_straps", new String[] { "ball_gag", "ball_gag_strap", "panel_gag" }, - new String[] { "mask_blindfold" }, + new String[] { "blindfold_mask" }, false, 15 ), @@ -57,7 +57,7 @@ public enum KidnapperTheme { CHAIN( "chain", new String[] { "chain_panel_gag", "ball_gag_strap" }, - new String[] { "mask_blindfold" }, + new String[] { "blindfold_mask" }, false, 10 ), @@ -67,7 +67,7 @@ public enum KidnapperTheme { MEDICAL( "medical_straps", new String[] { "tube_gag", "sponge_gag", "ball_gag" }, - new String[] { "mask_blindfold" }, + new String[] { "blindfold_mask" }, false, 8 ), @@ -77,7 +77,7 @@ public enum KidnapperTheme { BEAM( "beam_cuffs", new String[] { "beam_panel_gag", "latex_gag" }, - new String[] { "mask_blindfold" }, + new String[] { "blindfold_mask" }, false, 5 ), @@ -87,7 +87,7 @@ public enum KidnapperTheme { LATEX( "latex_sack", new String[] { "latex_gag", "tube_gag" }, - new String[] { "mask_blindfold" }, + new String[] { "blindfold_mask" }, false, 3 ), @@ -97,7 +97,7 @@ public enum KidnapperTheme { ASYLUM( "straitjacket", new String[] { "bite_gag", "sponge_gag", "ball_gag" }, - new String[] { "mask_blindfold" }, + new String[] { "blindfold_mask" }, false, 5 ), @@ -117,7 +117,7 @@ public enum KidnapperTheme { WRAP( "wrap", new String[] { "wrap_gag", "tape_gag" }, - new String[] { "mask_blindfold" }, + new String[] { "blindfold_mask" }, false, 5 );