SimpleCriterionTrigger.java

net.minecraft.advancements.criterion.SimpleCriterionTrigger

信息

  • 全限定名:net.minecraft.advancements.criterion.SimpleCriterionTrigger
  • 类型:public abstract class
  • 包:net.minecraft.advancements.criterion
  • 源码路径:src/main/java/net/minecraft/advancements/criterion/SimpleCriterionTrigger.java
  • 起始行号:L19
  • 实现:CriterionTrigger
  • 职责:

    TODO

字段/常量

  • players
    • 类型: Map<PlayerAdvancements,Set<CriterionTrigger.Listener<T>>>
    • 修饰符: private final
    • 源码定位: L20
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.advancements.criterion.SimpleCriterionTrigger.SimpleInstance
    • 类型: interface
    • 修饰符: public
    • 源码定位: L72
    • 说明:

      TODO

构造器

方法

下面的方法块按源码顺序生成。

public final void addPlayerListener(PlayerAdvancements player, CriterionTrigger.Listener<T> listener) @ L22

  • 方法名:addPlayerListener
  • 源码定位:L22
  • 返回类型:void
  • 修饰符:public final

参数:

  • player: PlayerAdvancements
  • listener: CriterionTrigger.Listener

说明:

TODO

public final void removePlayerListener(PlayerAdvancements player, CriterionTrigger.Listener<T> listener) @ L27

  • 方法名:removePlayerListener
  • 源码定位:L27
  • 返回类型:void
  • 修饰符:public final

参数:

  • player: PlayerAdvancements
  • listener: CriterionTrigger.Listener

说明:

TODO

public final void removePlayerListeners(PlayerAdvancements player) @ L38

  • 方法名:removePlayerListeners
  • 源码定位:L38
  • 返回类型:void
  • 修饰符:public final

参数:

  • player: PlayerAdvancements

说明:

TODO

protected void trigger(ServerPlayer player, Predicate<T> matcher) @ L43

  • 方法名:trigger
  • 源码定位:L43
  • 返回类型:void
  • 修饰符:protected

参数:

  • player: ServerPlayer
  • matcher: Predicate

说明:

TODO

代码

public abstract class SimpleCriterionTrigger<T extends SimpleCriterionTrigger.SimpleInstance> implements CriterionTrigger<T> {
    private final Map<PlayerAdvancements, Set<CriterionTrigger.Listener<T>>> players = Maps.newIdentityHashMap();
 
    @Override
    public final void addPlayerListener(PlayerAdvancements player, CriterionTrigger.Listener<T> listener) {
        this.players.computeIfAbsent(player, k -> Sets.newHashSet()).add(listener);
    }
 
    @Override
    public final void removePlayerListener(PlayerAdvancements player, CriterionTrigger.Listener<T> listener) {
        Set<CriterionTrigger.Listener<T>> listeners = this.players.get(player);
        if (listeners != null) {
            listeners.remove(listener);
            if (listeners.isEmpty()) {
                this.players.remove(player);
            }
        }
    }
 
    @Override
    public final void removePlayerListeners(PlayerAdvancements player) {
        this.players.remove(player);
    }
 
    protected void trigger(ServerPlayer player, Predicate<T> matcher) {
        PlayerAdvancements advancements = player.getAdvancements();
        Set<CriterionTrigger.Listener<T>> allListeners = this.players.get(advancements);
        if (allListeners != null && !allListeners.isEmpty()) {
            LootContext playerContext = EntityPredicate.createContext(player, player);
            List<CriterionTrigger.Listener<T>> listeners = null;
 
            for (CriterionTrigger.Listener<T> listener : allListeners) {
                T triggerInstance = listener.trigger();
                if (matcher.test(triggerInstance)) {
                    Optional<ContextAwarePredicate> predicate = triggerInstance.player();
                    if (predicate.isEmpty() || predicate.get().matches(playerContext)) {
                        if (listeners == null) {
                            listeners = Lists.newArrayList();
                        }
 
                        listeners.add(listener);
                    }
                }
            }
 
            if (listeners != null) {
                for (CriterionTrigger.Listener<T> listenerx : listeners) {
                    listenerx.run(advancements);
                }
            }
        }
    }
 
    public interface SimpleInstance extends CriterionTriggerInstance {
        @Override
        default void validate(ValidationContextSource validator) {
            Validatable.validate(validator.entityContext(), "player", this.player());
        }
 
        Optional<ContextAwarePredicate> player();
    }
}

引用的其他类