package net.minecraft.advancements.triggers; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Map.Entry; import java.util.function.Predicate; import net.minecraft.advancements.CriterionTriggerInstance; import net.minecraft.advancements.predicates.ContextAwarePredicate; import net.minecraft.advancements.predicates.entity.EntityPredicate; import net.minecraft.server.PlayerAdvancements; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.Validatable; import net.minecraft.world.level.storage.loot.ValidationContextSource; public abstract class SimpleCriterionTrigger implements CriterionTrigger { protected void trigger(final ServerPlayer player, final Predicate matcher) { PlayerAdvancements advancements = player.getAdvancements(); Map listenersForType = advancements.getTriggerMapForType(this); if (listenersForType != null && !listenersForType.isEmpty()) { LootContext playerContext = EntityPredicate.createContext(player, player); List matchedConditions = null; for (Entry entry : listenersForType.entrySet()) { T value = (T)entry.getValue(); if (matcher.test(value)) { Optional predicate = value.player(); if (!predicate.isPresent() || ((ContextAwarePredicate)predicate.get()).matches(playerContext)) { if (matchedConditions == null) { matchedConditions = new ArrayList(); } matchedConditions.add((PlayerAdvancements.TriggerInstanceKey)entry.getKey()); } } } if (matchedConditions != null) { for (PlayerAdvancements.TriggerInstanceKey criterion : matchedConditions) { advancements.award(criterion.advancement(), criterion.criterion()); } } } } public interface SimpleInstance extends CriterionTriggerInstance { @Override default void validate(final ValidationContextSource validator) { Validatable.validate(validator.entityContext(), "player", this.player()); } Optional player(); } }