package net.minecraft.advancements.critereon; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.function.Predicate; import net.minecraft.advancements.CriterionTrigger; import net.minecraft.advancements.CriterionTriggerInstance; import net.minecraft.server.PlayerAdvancements; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.storage.loot.LootContext; public abstract class SimpleCriterionTrigger implements CriterionTrigger { private final Map>> players = Maps.>>newIdentityHashMap(); @Override public final void addPlayerListener(PlayerAdvancements playerAdvancements, CriterionTrigger.Listener listener) { ((Set)this.players.computeIfAbsent(playerAdvancements, playerAdvancementsx -> Sets.newHashSet())).add(listener); } @Override public final void removePlayerListener(PlayerAdvancements playerAdvancements, CriterionTrigger.Listener listener) { Set> set = (Set>)this.players.get(playerAdvancements); if (set != null) { set.remove(listener); if (set.isEmpty()) { this.players.remove(playerAdvancements); } } } @Override public final void removePlayerListeners(PlayerAdvancements playerAdvancements) { this.players.remove(playerAdvancements); } protected void trigger(ServerPlayer player, Predicate testTrigger) { PlayerAdvancements playerAdvancements = player.getAdvancements(); Set> set = (Set>)this.players.get(playerAdvancements); if (set != null && !set.isEmpty()) { LootContext lootContext = EntityPredicate.createContext(player, player); List> list = null; for (CriterionTrigger.Listener listener : set) { T simpleInstance = listener.trigger(); if (testTrigger.test(simpleInstance)) { Optional optional = simpleInstance.player(); if (optional.isEmpty() || ((ContextAwarePredicate)optional.get()).matches(lootContext)) { if (list == null) { list = Lists.>newArrayList(); } list.add(listener); } } } if (list != null) { for (CriterionTrigger.Listener listenerx : list) { listenerx.run(playerAdvancements); } } } } public interface SimpleInstance extends CriterionTriggerInstance { @Override default void validate(CriterionValidator validator) { validator.validateEntity(this.player(), ".player"); } Optional player(); } }