69 lines
2.3 KiB
Java
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;
|
|
}
|
|
}
|
|
}
|