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(); + } +}