2021-02-27 17:42:29 +01:00
|
|
|
package com.minelittlepony.unicopia.item;
|
|
|
|
|
2023-09-10 23:14:27 +02:00
|
|
|
import com.minelittlepony.unicopia.compat.trinkets.TrinketsDelegate;
|
2022-09-20 23:50:15 +02:00
|
|
|
|
2021-02-27 17:42:29 +01: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.*;
|
2021-02-27 17:42:29 +01:00
|
|
|
import net.minecraft.entity.player.PlayerEntity;
|
2022-01-02 22:54:08 +01:00
|
|
|
import net.minecraft.item.ArmorMaterials;
|
2023-06-02 21:20:30 +02:00
|
|
|
import net.minecraft.item.Equipment;
|
2021-02-27 17:42:29 +01:00
|
|
|
import net.minecraft.item.Item;
|
|
|
|
import net.minecraft.item.ItemStack;
|
2022-09-21 18:02:45 +02:00
|
|
|
import net.minecraft.predicate.entity.EntityPredicates;
|
2022-01-02 22:54:08 +01:00
|
|
|
import net.minecraft.sound.SoundEvent;
|
2021-02-27 17:42:29 +01:00
|
|
|
import net.minecraft.util.Hand;
|
|
|
|
import net.minecraft.util.TypedActionResult;
|
2022-09-21 18:02:45 +02:00
|
|
|
import net.minecraft.util.math.*;
|
2021-02-27 17:42:29 +01:00
|
|
|
import net.minecraft.world.World;
|
|
|
|
|
2023-06-02 21:20:30 +02:00
|
|
|
public abstract class WearableItem extends Item implements Equipment {
|
2021-02-27 17:42:29 +01:00
|
|
|
|
|
|
|
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);
|
2022-09-20 23:50:15 +02:00
|
|
|
TrinketsDelegate.getInstance().registerTrinket(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
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));
|
2021-02-27 17:42:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public TypedActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) {
|
|
|
|
ItemStack stack = player.getStackInHand(hand);
|
2022-09-20 23:50:15 +02:00
|
|
|
return TrinketsDelegate.getInstance().getAvailableTrinketSlots(player, TrinketsDelegate.ALL).stream()
|
|
|
|
.filter(slotId -> TrinketsDelegate.getInstance().equipStack(player, slotId, stack))
|
2022-09-25 22:32:38 +02:00
|
|
|
.findAny()
|
2022-09-20 23:50:15 +02:00
|
|
|
.map(slotId -> TypedActionResult.success(stack, world.isClient()))
|
|
|
|
.orElseGet(() -> TypedActionResult.fail(stack));
|
2021-02-27 17:42:29 +01:00
|
|
|
}
|
|
|
|
|
2022-01-02 22:54:08 +01:00
|
|
|
@Override
|
|
|
|
public SoundEvent getEquipSound() {
|
|
|
|
return ArmorMaterials.LEATHER.getEquipSound();
|
|
|
|
}
|
|
|
|
|
2024-01-22 14:48:03 +01:00
|
|
|
@Deprecated
|
2023-06-02 21:20:30 +02:00
|
|
|
@Override
|
|
|
|
public final EquipmentSlot getSlotType() {
|
2023-11-25 21:49:47 +01:00
|
|
|
return getSlotType(getDefaultStack());
|
2021-02-27 17:42:29 +01:00
|
|
|
}
|
2022-09-21 18:02:45 +02:00
|
|
|
|
2023-06-02 21:20:30 +02:00
|
|
|
public EquipmentSlot getSlotType(ItemStack stack) {
|
2023-11-25 21:49:47 +01:00
|
|
|
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))),
|
2022-09-22 13:01:31 +02:00
|
|
|
EntityPredicates.EXCEPT_SPECTATOR
|
2022-09-21 18:02:45 +02:00
|
|
|
)
|
|
|
|
.stream()
|
|
|
|
.flatMap(entity -> TrinketsDelegate.getInstance()
|
|
|
|
.getAvailableTrinketSlots(entity, TrinketsDelegate.ALL)
|
|
|
|
.stream()
|
|
|
|
.filter(slotId -> TrinketsDelegate.getInstance().equipStack(entity, slotId, armor)))
|
|
|
|
.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);
|
|
|
|
}
|
|
|
|
};
|
2021-02-27 17:42:29 +01:00
|
|
|
}
|