package com.minelittlepony.unicopia.trinkets; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.mob.MobEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.screen.slot.Slot; import net.minecraft.util.Identifier; public interface TrinketsDelegate { Identifier MAINHAND = new Identifier("hand:glove"); Identifier OFFHAND = new Identifier("offhand:glove"); Identifier NECKLACE = new Identifier("chest:necklace"); Identifier FACE = new Identifier("head:face"); Set ALL = new TreeSet<>(List.of(MAINHAND, OFFHAND, NECKLACE, FACE)); TrinketsDelegate EMPTY = new TrinketsDelegate() {}; static TrinketsDelegate getInstance() { if (!hasTrinkets()) { return EMPTY; } return TrinketsDelegateImpl.INSTANCE; } static boolean hasTrinkets() { return FabricLoader.getInstance().isModLoaded("trinkets"); } default boolean equipStack(LivingEntity entity, Identifier slot, ItemStack stack) { EquipmentSlot eq = MobEntity.getPreferredEquipmentSlot(stack); if (!entity.getEquippedStack(eq).isEmpty()) { return false; } entity.equipStack(eq, stack.split(1)); if (entity instanceof MobEntity mob) { mob.setEquipmentDropChance(eq, 2.0f); mob.setPersistent(); } return true; } default void setEquippedStack(LivingEntity entity, Identifier slot, ItemStack stack) { EquipmentSlot eq = slot == FACE ? EquipmentSlot.HEAD : slot == NECKLACE ? EquipmentSlot.CHEST : slot == MAINHAND ? EquipmentSlot.CHEST : slot == OFFHAND ? EquipmentSlot.OFFHAND : null; if (eq != null) { entity.equipStack(eq, stack); } } default Set getAvailableTrinketSlots(LivingEntity entity, Set probedSlots) { return probedSlots.stream().filter(slot -> getEquipped(entity, slot).count() == 0).collect(Collectors.toSet()); } default Stream getEquipped(LivingEntity entity, Identifier slot) { if (slot == FACE) { return Stream.of(entity.getEquippedStack(EquipmentSlot.HEAD)); } if (slot == NECKLACE || slot == MAINHAND) { return Stream.of(entity.getEquippedStack(EquipmentSlot.CHEST)); } if (slot == OFFHAND) { return Stream.of(entity.getOffHandStack()); } return Stream.empty(); } default void registerTrinket(Item item) { } default boolean isTrinketSlot(Slot slot) { return false; } }