Unicopia/src/main/java/com/minelittlepony/unicopia/item/WearableItem.java

84 lines
3.3 KiB
Java
Raw Normal View History

package com.minelittlepony.unicopia.item;
import com.minelittlepony.unicopia.compat.trinkets.TrinketsDelegate;
2022-09-20 23:50:15 +02:00
import net.fabricmc.fabric.api.item.v1.FabricItemSettings;
import net.minecraft.block.DispenserBlock;
2022-09-21 18:02:45 +02:00
import net.minecraft.block.dispenser.DispenserBehavior;
import net.minecraft.block.dispenser.ItemDispenserBehavior;
import net.minecraft.entity.*;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ArmorMaterials;
2023-06-02 21:20:30 +02:00
import net.minecraft.item.Equipment;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
2022-09-21 18:02:45 +02:00
import net.minecraft.predicate.entity.EntityPredicates;
import net.minecraft.sound.SoundEvent;
import net.minecraft.util.Hand;
import net.minecraft.util.TypedActionResult;
2022-09-21 18:02:45 +02:00
import net.minecraft.util.math.*;
import net.minecraft.world.World;
2023-06-02 21:20:30 +02:00
public abstract class WearableItem extends Item implements Equipment {
public WearableItem(FabricItemSettings settings) {
2022-09-20 23:50:15 +02:00
super(configureEquipmentSlotSupplier(settings));
2022-09-21 18:02:45 +02:00
DispenserBlock.registerBehavior(this, DISPENSER_BEHAVIOR);
TrinketsDelegate.getInstance(null).registerTrinket(this);
2022-09-20 23:50:15 +02:00
}
private static FabricItemSettings configureEquipmentSlotSupplier(FabricItemSettings settings) {
if (TrinketsDelegate.hasTrinkets()) {
return settings;
}
2023-06-02 21:20:30 +02:00
return settings.equipmentSlot(s -> ((WearableItem)s.getItem()).getSlotType(s));
}
@Override
public TypedActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) {
ItemStack stack = player.getStackInHand(hand);
return TrinketsDelegate.getInstance(player).getAvailableTrinketSlots(player, TrinketsDelegate.ALL).stream()
.filter(slotId -> TrinketsDelegate.getInstance(player).equipStack(player, slotId, stack))
.findAny()
2022-09-20 23:50:15 +02:00
.map(slotId -> TypedActionResult.success(stack, world.isClient()))
.orElseGet(() -> TypedActionResult.fail(stack));
}
@Override
public SoundEvent getEquipSound() {
return ArmorMaterials.LEATHER.getEquipSound();
}
@Deprecated
2023-06-02 21:20:30 +02:00
@Override
public final EquipmentSlot getSlotType() {
return getSlotType(getDefaultStack());
}
2022-09-21 18:02:45 +02:00
2023-06-02 21:20:30 +02:00
public EquipmentSlot getSlotType(ItemStack stack) {
return EquipmentSlot.OFFHAND;
2023-06-02 21:20:30 +02:00
}
2022-09-21 18:02:45 +02:00
public static boolean dispenseArmor(BlockPointer pointer, ItemStack armor) {
return pointer.getWorld().getEntitiesByClass(
LivingEntity.class,
new Box(pointer.getPos().offset(pointer.getBlockState().get(DispenserBlock.FACING))),
EntityPredicates.EXCEPT_SPECTATOR
2022-09-21 18:02:45 +02:00
)
.stream()
.flatMap(entity -> TrinketsDelegate.getInstance(entity)
2022-09-21 18:02:45 +02:00
.getAvailableTrinketSlots(entity, TrinketsDelegate.ALL)
.stream()
.filter(slotId -> TrinketsDelegate.getInstance(entity).equipStack(entity, slotId, armor)))
2022-09-21 18:02:45 +02:00
.findFirst()
.isPresent();
}
private static final DispenserBehavior DISPENSER_BEHAVIOR = new ItemDispenserBehavior(){
@Override
protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) {
return dispenseArmor(pointer, stack) ? stack : super.dispenseSilently(pointer, stack);
}
};
}