/* * Decompiled with CFR 0.152. * * Could not load the following classes: * com.google.common.collect.ImmutableMap * com.google.common.collect.ImmutableMap$Builder * com.mojang.datafixers.kinds.App * com.mojang.datafixers.kinds.Applicative * com.mojang.serialization.MapCodec * com.mojang.serialization.codecs.RecordCodecBuilder */ package net.minecraft.advancements.criterion; import com.google.common.collect.ImmutableMap; import com.mojang.datafixers.kinds.App; import com.mojang.datafixers.kinds.Applicative; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import java.util.Map; import java.util.function.Predicate; import net.minecraft.core.component.DataComponentExactPredicate; import net.minecraft.core.component.DataComponentGetter; import net.minecraft.core.component.DataComponentType; import net.minecraft.core.component.predicates.DataComponentPredicate; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; public record DataComponentMatchers(DataComponentExactPredicate exact, Map, DataComponentPredicate> partial) implements Predicate { public static final DataComponentMatchers ANY = new DataComponentMatchers(DataComponentExactPredicate.EMPTY, Map.of()); public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(i -> i.group((App)DataComponentExactPredicate.CODEC.optionalFieldOf("components", (Object)DataComponentExactPredicate.EMPTY).forGetter(DataComponentMatchers::exact), (App)DataComponentPredicate.CODEC.optionalFieldOf("predicates", Map.of()).forGetter(DataComponentMatchers::partial)).apply((Applicative)i, DataComponentMatchers::new)); public static final StreamCodec STREAM_CODEC = StreamCodec.composite(DataComponentExactPredicate.STREAM_CODEC, DataComponentMatchers::exact, DataComponentPredicate.STREAM_CODEC, DataComponentMatchers::partial, DataComponentMatchers::new); @Override public boolean test(DataComponentGetter values) { if (!this.exact.test(values)) { return false; } for (DataComponentPredicate predicate : this.partial.values()) { if (predicate.matches(values)) continue; return false; } return true; } public boolean isEmpty() { return this.exact.isEmpty() && this.partial.isEmpty(); } public static class Builder { private DataComponentExactPredicate exact = DataComponentExactPredicate.EMPTY; private final ImmutableMap.Builder, DataComponentPredicate> partial = ImmutableMap.builder(); private Builder() { } public static Builder components() { return new Builder(); } public > Builder any(DataComponentType type) { DataComponentPredicate.AnyValueType predicateType = DataComponentPredicate.AnyValueType.create(type); this.partial.put((Object)predicateType, (Object)predicateType.predicate()); return this; } public Builder partial(DataComponentPredicate.Type type, T predicate) { this.partial.put(type, predicate); return this; } public Builder exact(DataComponentExactPredicate exact) { this.exact = exact; return this; } public DataComponentMatchers build() { return new DataComponentMatchers(this.exact, (Map, DataComponentPredicate>)this.partial.buildOrThrow()); } } }