From 3a1f401ccfaa29c3ca60c7dae979daeb0046dd82 Mon Sep 17 00:00:00 2001 From: NotEvil Date: Tue, 14 Apr 2026 01:47:19 +0200 Subject: [PATCH] feat(D-01): delegate DataDrivenBondageItem lifecycle to components Override onEquipped(), onUnequipped(), and canUnequip() in DataDrivenBondageItem to delegate to the item's ComponentHolder. The canUnequip() override preserves the existing lock check from AbstractV2BondageItem via super.canUnequip(). Add a static getComponent() helper for external code to retrieve a typed component from any data-driven item stack. --- .../datadriven/DataDrivenBondageItem.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) 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 9f215a2..743bd8e 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 @@ -4,6 +4,9 @@ import com.tiedup.remake.v2.BodyRegionV2; import com.tiedup.remake.v2.bondage.IV2BondageEquipment; import com.tiedup.remake.v2.bondage.V2BondageItems; import com.tiedup.remake.v2.bondage.capability.V2EquipmentHelper; +import com.tiedup.remake.v2.bondage.component.ComponentHolder; +import com.tiedup.remake.v2.bondage.component.ComponentType; +import com.tiedup.remake.v2.bondage.component.IItemComponent; import com.tiedup.remake.v2.bondage.items.AbstractV2BondageItem; import java.util.List; import java.util.Map; @@ -257,6 +260,53 @@ public class DataDrivenBondageItem extends AbstractV2BondageItem { return Component.literal(def.displayName()); } + // ===== COMPONENT LIFECYCLE DELEGATION ===== + + @Override + public void onEquipped(ItemStack stack, LivingEntity entity) { + ComponentHolder holder = DataDrivenItemRegistry.getComponents(stack); + if (holder != null) { + holder.onEquipped(stack, entity); + } + } + + @Override + public void onUnequipped(ItemStack stack, LivingEntity entity) { + ComponentHolder holder = DataDrivenItemRegistry.getComponents(stack); + if (holder != null) { + holder.onUnequipped(stack, entity); + } + } + + @Override + public boolean canUnequip(ItemStack stack, LivingEntity entity) { + ComponentHolder holder = DataDrivenItemRegistry.getComponents(stack); + if (holder != null && holder.blocksUnequip(stack, entity)) { + return false; + } + return super.canUnequip(stack, entity); + } + + /** + * Get a specific component from a data-driven item stack. + * + * @param stack the ItemStack to inspect + * @param type the component type to look up + * @param clazz the expected component class + * @param the component type + * @return the component, or null if the item is not data-driven or lacks this component + */ + @Nullable + public static T getComponent( + ItemStack stack, + ComponentType type, + Class clazz + ) { + ComponentHolder holder = DataDrivenItemRegistry.getComponents(stack); + if (holder == null) return null; + return holder.get(type, clazz); + } + // ===== FACTORY ===== /**