fix(D-01/D): blindfold ID mismatch + dispenser V2 registration (review)

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.
This commit is contained in:
NotEvil
2026-04-15 02:10:25 +02:00
parent 9302b6ccaf
commit dfa7024e21
3 changed files with 46 additions and 11 deletions

View File

@@ -30,9 +30,7 @@ public class DispenserBehaviors {
registerClothesBehaviors(); registerClothesBehaviors();
registerRopeArrowBehavior(); registerRopeArrowBehavior();
registerBondageItemBehavior();
// V2 data-driven bondage items register their own dispenser behaviors
// via DataDrivenBondageItem.registerDispenserBehaviors()
TiedUpMod.LOGGER.info( TiedUpMod.LOGGER.info(
"[DispenserBehaviors] Dispenser behaviors registered!" "[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() { private static void registerRopeArrowBehavior() {
DispenserBlock.registerBehavior( DispenserBlock.registerBehavior(
ModItems.ROPE_ARROW.get(), ModItems.ROPE_ARROW.get(),

View File

@@ -56,6 +56,32 @@ public class GenericBondageDispenseBehavior
// Factory Methods // 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<BodyRegionV2> 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() { public static GenericBondageDispenseBehavior forBind() {
return new GenericBondageDispenseBehavior( return new GenericBondageDispenseBehavior(
BindModeHelper::isBindItem, BindModeHelper::isBindItem,

View File

@@ -37,7 +37,7 @@ public enum KidnapperTheme {
TAPE( TAPE(
"duct_tape", "duct_tape",
new String[] { "tape_gag", "wrap_gag" }, new String[] { "tape_gag", "wrap_gag" },
new String[] { "mask_blindfold" }, new String[] { "blindfold_mask" },
true, true,
20 20
), ),
@@ -47,7 +47,7 @@ public enum KidnapperTheme {
LEATHER( LEATHER(
"leather_straps", "leather_straps",
new String[] { "ball_gag", "ball_gag_strap", "panel_gag" }, new String[] { "ball_gag", "ball_gag_strap", "panel_gag" },
new String[] { "mask_blindfold" }, new String[] { "blindfold_mask" },
false, false,
15 15
), ),
@@ -57,7 +57,7 @@ public enum KidnapperTheme {
CHAIN( CHAIN(
"chain", "chain",
new String[] { "chain_panel_gag", "ball_gag_strap" }, new String[] { "chain_panel_gag", "ball_gag_strap" },
new String[] { "mask_blindfold" }, new String[] { "blindfold_mask" },
false, false,
10 10
), ),
@@ -67,7 +67,7 @@ public enum KidnapperTheme {
MEDICAL( MEDICAL(
"medical_straps", "medical_straps",
new String[] { "tube_gag", "sponge_gag", "ball_gag" }, new String[] { "tube_gag", "sponge_gag", "ball_gag" },
new String[] { "mask_blindfold" }, new String[] { "blindfold_mask" },
false, false,
8 8
), ),
@@ -77,7 +77,7 @@ public enum KidnapperTheme {
BEAM( BEAM(
"beam_cuffs", "beam_cuffs",
new String[] { "beam_panel_gag", "latex_gag" }, new String[] { "beam_panel_gag", "latex_gag" },
new String[] { "mask_blindfold" }, new String[] { "blindfold_mask" },
false, false,
5 5
), ),
@@ -87,7 +87,7 @@ public enum KidnapperTheme {
LATEX( LATEX(
"latex_sack", "latex_sack",
new String[] { "latex_gag", "tube_gag" }, new String[] { "latex_gag", "tube_gag" },
new String[] { "mask_blindfold" }, new String[] { "blindfold_mask" },
false, false,
3 3
), ),
@@ -97,7 +97,7 @@ public enum KidnapperTheme {
ASYLUM( ASYLUM(
"straitjacket", "straitjacket",
new String[] { "bite_gag", "sponge_gag", "ball_gag" }, new String[] { "bite_gag", "sponge_gag", "ball_gag" },
new String[] { "mask_blindfold" }, new String[] { "blindfold_mask" },
false, false,
5 5
), ),
@@ -117,7 +117,7 @@ public enum KidnapperTheme {
WRAP( WRAP(
"wrap", "wrap",
new String[] { "wrap_gag", "tape_gag" }, new String[] { "wrap_gag", "tape_gag" },
new String[] { "mask_blindfold" }, new String[] { "blindfold_mask" },
false, false,
5 5
); );