D1: ThreadLocal alert suppression moved from ItemCollar to CollarHelper.
onCollarRemoved() logic (kidnapper alert) moved to CollarHelper.
D2+D3: Deleted 17 V1 item classes + 4 V1-only interfaces:
ItemBind, ItemGag, ItemBlindfold, ItemCollar, ItemEarplugs, ItemMittens,
ItemColor, ItemClassicCollar, ItemShockCollar, ItemShockCollarAuto,
ItemGpsCollar, ItemChokeCollar, ItemHood, ItemMedicalGag,
IBondageItem, IHasGaggingEffect, IHasBlindingEffect, IAdjustable
D4: KidnapperTheme/KidnapperItemSelector/DispenserBehaviors migrated
from variant enums to string-based DataDrivenItemRegistry IDs.
D5: Deleted 11 variant enums + Generic* factories + ItemBallGag3D:
BindVariant, GagVariant, BlindfoldVariant, EarplugsVariant, MittensVariant,
GenericBind, GenericGag, GenericBlindfold, GenericEarplugs, GenericMittens
D6: ModItems cleaned — all V1 bondage registrations removed.
D7: ModCreativeTabs rewritten — iterates DataDrivenItemRegistry.
D8+D9: All V2 helpers cleaned (V1 fallbacks removed), orphan imports removed.
Zero V1 bondage code references remain (only Javadoc comments).
All bondage items are now data-driven via 47 JSON definitions.
105 lines
3.6 KiB
Java
105 lines
3.6 KiB
Java
package com.tiedup.remake.dispenser;
|
|
|
|
import com.tiedup.remake.state.IBondageState;
|
|
import com.tiedup.remake.v2.BodyRegionV2;
|
|
import com.tiedup.remake.v2.bondage.BindModeHelper;
|
|
import com.tiedup.remake.v2.bondage.CollarHelper;
|
|
import com.tiedup.remake.v2.bondage.component.ComponentType;
|
|
import com.tiedup.remake.v2.bondage.component.GaggingComponent;
|
|
import com.tiedup.remake.v2.bondage.datadriven.DataDrivenBondageItem;
|
|
import com.tiedup.remake.v2.bondage.datadriven.DataDrivenItemDefinition;
|
|
import com.tiedup.remake.v2.bondage.datadriven.DataDrivenItemRegistry;
|
|
import java.util.function.BiConsumer;
|
|
import java.util.function.Predicate;
|
|
import net.minecraft.world.item.ItemStack;
|
|
|
|
/**
|
|
* Generic dispenser behavior for equipping bondage items.
|
|
* Uses V2 data-driven item detection instead of V1 class checks.
|
|
*
|
|
* Use factory methods to create instances for each bondage type.
|
|
*/
|
|
public class GenericBondageDispenseBehavior
|
|
extends EquipBondageDispenseBehavior
|
|
{
|
|
|
|
private final Predicate<ItemStack> itemCheck;
|
|
private final Predicate<IBondageState> canEquipCheck;
|
|
private final BiConsumer<IBondageState, ItemStack> equipAction;
|
|
|
|
private GenericBondageDispenseBehavior(
|
|
Predicate<ItemStack> itemCheck,
|
|
Predicate<IBondageState> canEquipCheck,
|
|
BiConsumer<IBondageState, ItemStack> equipAction
|
|
) {
|
|
this.itemCheck = itemCheck;
|
|
this.canEquipCheck = canEquipCheck;
|
|
this.equipAction = equipAction;
|
|
}
|
|
|
|
@Override
|
|
protected boolean isValidItem(ItemStack stack) {
|
|
return !stack.isEmpty() && itemCheck.test(stack);
|
|
}
|
|
|
|
@Override
|
|
protected boolean canEquip(IBondageState state) {
|
|
return state != null && canEquipCheck.test(state);
|
|
}
|
|
|
|
@Override
|
|
protected void equip(IBondageState state, ItemStack stack) {
|
|
if (state != null) {
|
|
equipAction.accept(state, stack);
|
|
}
|
|
}
|
|
|
|
// Factory Methods
|
|
|
|
public static GenericBondageDispenseBehavior forBind() {
|
|
return new GenericBondageDispenseBehavior(
|
|
BindModeHelper::isBindItem,
|
|
state -> !state.isTiedUp(),
|
|
(s, i) -> s.equip(BodyRegionV2.ARMS, i)
|
|
);
|
|
}
|
|
|
|
public static GenericBondageDispenseBehavior forGag() {
|
|
return new GenericBondageDispenseBehavior(
|
|
stack -> DataDrivenBondageItem.getComponent(stack, ComponentType.GAGGING, GaggingComponent.class) != null,
|
|
state -> !state.isGagged(),
|
|
(s, i) -> s.equip(BodyRegionV2.MOUTH, i)
|
|
);
|
|
}
|
|
|
|
public static GenericBondageDispenseBehavior forBlindfold() {
|
|
return new GenericBondageDispenseBehavior(
|
|
stack -> {
|
|
DataDrivenItemDefinition def = DataDrivenItemRegistry.get(stack);
|
|
return def != null && def.occupiedRegions().contains(BodyRegionV2.EYES);
|
|
},
|
|
state -> !state.isBlindfolded(),
|
|
(s, i) -> s.equip(BodyRegionV2.EYES, i)
|
|
);
|
|
}
|
|
|
|
public static GenericBondageDispenseBehavior forCollar() {
|
|
return new GenericBondageDispenseBehavior(
|
|
CollarHelper::isCollar,
|
|
state -> !state.hasCollar(),
|
|
(s, i) -> s.equip(BodyRegionV2.NECK, i)
|
|
);
|
|
}
|
|
|
|
public static GenericBondageDispenseBehavior forEarplugs() {
|
|
return new GenericBondageDispenseBehavior(
|
|
stack -> {
|
|
DataDrivenItemDefinition def = DataDrivenItemRegistry.get(stack);
|
|
return def != null && def.occupiedRegions().contains(BodyRegionV2.EARS);
|
|
},
|
|
state -> !state.hasEarplugs(),
|
|
(s, i) -> s.equip(BodyRegionV2.EARS, i)
|
|
);
|
|
}
|
|
}
|