From 1b70041c36f59c0eef5ccd0e222902606aa40870 Mon Sep 17 00:00:00 2001 From: NotEvil Date: Tue, 14 Apr 2026 01:38:09 +0200 Subject: [PATCH] feat(D-01): add ComponentHolder container for item components --- .../v2/bondage/component/ComponentHolder.java | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/main/java/com/tiedup/remake/v2/bondage/component/ComponentHolder.java diff --git a/src/main/java/com/tiedup/remake/v2/bondage/component/ComponentHolder.java b/src/main/java/com/tiedup/remake/v2/bondage/component/ComponentHolder.java new file mode 100644 index 0000000..982841e --- /dev/null +++ b/src/main/java/com/tiedup/remake/v2/bondage/component/ComponentHolder.java @@ -0,0 +1,70 @@ +package com.tiedup.remake.v2.bondage.component; + +import java.util.Collections; +import java.util.EnumMap; +import java.util.Map; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; + +public final class ComponentHolder { + + public static final ComponentHolder EMPTY = new ComponentHolder(Map.of()); + + private final Map components; + + public ComponentHolder(Map components) { + this.components = components.isEmpty() + ? Map.of() + : Collections.unmodifiableMap(new EnumMap<>(components)); + } + + @Nullable + public IItemComponent get(ComponentType type) { + return components.get(type); + } + + @Nullable + @SuppressWarnings("unchecked") + public T get( + ComponentType type, + Class clazz + ) { + IItemComponent component = components.get(type); + if (clazz.isInstance(component)) return (T) component; + return null; + } + + public boolean has(ComponentType type) { + return components.containsKey(type); + } + + public void onEquipped(ItemStack stack, LivingEntity entity) { + for (IItemComponent c : components.values()) { + c.onEquipped(stack, entity); + } + } + + public void onUnequipped(ItemStack stack, LivingEntity entity) { + for (IItemComponent c : components.values()) { + c.onUnequipped(stack, entity); + } + } + + public void onWornTick(ItemStack stack, LivingEntity entity) { + for (IItemComponent c : components.values()) { + c.onWornTick(stack, entity); + } + } + + public boolean blocksUnequip(ItemStack stack, LivingEntity entity) { + for (IItemComponent c : components.values()) { + if (c.blocksUnequip(stack, entity)) return true; + } + return false; + } + + public boolean isEmpty() { + return components.isEmpty(); + } +}