minecraft-src/net/minecraft/world/entity/EquipmentUser.java
2025-07-04 02:00:41 +03:00

69 lines
2.3 KiB
Java

package net.minecraft.world.entity;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import net.minecraft.core.component.DataComponents;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.equipment.Equippable;
import net.minecraft.world.level.storage.loot.LootParams;
import net.minecraft.world.level.storage.loot.LootTable;
import org.jetbrains.annotations.Nullable;
public interface EquipmentUser {
void setItemSlot(EquipmentSlot slot, ItemStack stack);
ItemStack getItemBySlot(EquipmentSlot slot);
void setDropChance(EquipmentSlot slot, float dropChance);
default void equip(EquipmentTable equipmentTable, LootParams params) {
this.equip(equipmentTable.lootTable(), params, equipmentTable.slotDropChances());
}
default void equip(ResourceKey<LootTable> equipmentLootTable, LootParams params, Map<EquipmentSlot, Float> slotDropChances) {
this.equip(equipmentLootTable, params, 0L, slotDropChances);
}
default void equip(ResourceKey<LootTable> equipmentLootTable, LootParams params, long seed, Map<EquipmentSlot, Float> slotDropChances) {
LootTable lootTable = params.getLevel().getServer().reloadableRegistries().getLootTable(equipmentLootTable);
if (lootTable != LootTable.EMPTY) {
List<ItemStack> list = lootTable.getRandomItems(params, seed);
List<EquipmentSlot> list2 = new ArrayList();
for (ItemStack itemStack : list) {
EquipmentSlot equipmentSlot = this.resolveSlot(itemStack, list2);
if (equipmentSlot != null) {
ItemStack itemStack2 = equipmentSlot.limit(itemStack);
this.setItemSlot(equipmentSlot, itemStack2);
Float float_ = (Float)slotDropChances.get(equipmentSlot);
if (float_ != null) {
this.setDropChance(equipmentSlot, float_);
}
list2.add(equipmentSlot);
}
}
}
}
@Nullable
default EquipmentSlot resolveSlot(ItemStack stack, List<EquipmentSlot> excludedSlots) {
if (stack.isEmpty()) {
return null;
} else {
Equippable equippable = stack.get(DataComponents.EQUIPPABLE);
if (equippable != null) {
EquipmentSlot equipmentSlot = equippable.slot();
if (!excludedSlots.contains(equipmentSlot)) {
return equipmentSlot;
}
} else if (!excludedSlots.contains(EquipmentSlot.MAINHAND)) {
return EquipmentSlot.MAINHAND;
}
return null;
}
}
}