File size: 2,701 Bytes
d46f4a3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package net.minecraft.world.entity;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;
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;

public interface EquipmentUser {
    void setItemSlot(EquipmentSlot p_333752_, ItemStack p_331668_);

    ItemStack getItemBySlot(EquipmentSlot p_329199_);

    void setDropChance(EquipmentSlot p_331517_, float p_334697_);

    default void equip(EquipmentTable p_331159_, LootParams p_332346_) {
        this.equip(p_331159_.lootTable(), p_332346_, p_331159_.slotDropChances());
    }

    default void equip(ResourceKey<LootTable> p_329232_, LootParams p_330675_, Map<EquipmentSlot, Float> p_328003_) {
        this.equip(p_329232_, p_330675_, 0L, p_328003_);
    }

    default void equip(ResourceKey<LootTable> p_331471_, LootParams p_333826_, long p_331881_, Map<EquipmentSlot, Float> p_328541_) {
        LootTable loottable = p_333826_.getLevel().getServer().reloadableRegistries().getLootTable(p_331471_);
        if (loottable != LootTable.EMPTY) {
            List<ItemStack> list = loottable.getRandomItems(p_333826_, p_331881_);
            List<EquipmentSlot> list1 = new ArrayList<>();

            for (ItemStack itemstack : list) {
                EquipmentSlot equipmentslot = this.resolveSlot(itemstack, list1);
                if (equipmentslot != null) {
                    ItemStack itemstack1 = equipmentslot.limit(itemstack);
                    this.setItemSlot(equipmentslot, itemstack1);
                    Float f = p_328541_.get(equipmentslot);
                    if (f != null) {
                        this.setDropChance(equipmentslot, f);
                    }

                    list1.add(equipmentslot);
                }
            }
        }
    }

    @Nullable
    default EquipmentSlot resolveSlot(ItemStack p_329649_, List<EquipmentSlot> p_334449_) {
        if (p_329649_.isEmpty()) {
            return null;
        } else {
            Equippable equippable = p_329649_.get(DataComponents.EQUIPPABLE);
            if (equippable != null) {
                EquipmentSlot equipmentslot = equippable.slot();
                if (!p_334449_.contains(equipmentslot)) {
                    return equipmentslot;
                }
            } else if (!p_334449_.contains(EquipmentSlot.MAINHAND)) {
                return EquipmentSlot.MAINHAND;
            }

            return null;
        }
    }
}