minecraft-src/net/minecraft/advancements/critereon/SlotsPredicate.java
2025-07-04 01:41:11 +03:00

36 lines
1.1 KiB
Java

package net.minecraft.advancements.critereon;
import com.mojang.serialization.Codec;
import it.unimi.dsi.fastutil.ints.IntList;
import java.util.Map;
import java.util.Map.Entry;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.SlotAccess;
import net.minecraft.world.inventory.SlotRange;
import net.minecraft.world.inventory.SlotRanges;
public record SlotsPredicate(Map<SlotRange, ItemPredicate> slots) {
public static final Codec<SlotsPredicate> CODEC = Codec.unboundedMap(SlotRanges.CODEC, ItemPredicate.CODEC).xmap(SlotsPredicate::new, SlotsPredicate::slots);
public boolean matches(Entity entity) {
for (Entry<SlotRange, ItemPredicate> entry : this.slots.entrySet()) {
if (!matchSlots(entity, (ItemPredicate)entry.getValue(), ((SlotRange)entry.getKey()).slots())) {
return false;
}
}
return true;
}
private static boolean matchSlots(Entity entity, ItemPredicate predicate, IntList slots) {
for (int i = 0; i < slots.size(); i++) {
int j = slots.getInt(i);
SlotAccess slotAccess = entity.getSlot(j);
if (predicate.test(slotAccess.get())) {
return true;
}
}
return false;
}
}