KilledByArrowTrigger.java
net.minecraft.advancements.criterion.KilledByArrowTrigger
信息
- 全限定名:net.minecraft.advancements.criterion.KilledByArrowTrigger
- 类型:public class
- 包:net.minecraft.advancements.criterion
- 源码路径:src/main/java/net/minecraft/advancements/criterion/KilledByArrowTrigger.java
- 起始行号:L27
- 继承:SimpleCriterionTrigger<KilledByArrowTrigger.TriggerInstance>
- 职责:
TODO
字段/常量
- 无
内部类/嵌套类型
net.minecraft.advancements.criterion.KilledByArrowTrigger.TriggerInstance- 类型:
record - 修饰符:
public - 源码定位:
L45 - 说明:
TODO
- 类型:
构造器
- 无
方法
下面的方法块按源码顺序生成。
public Codec<KilledByArrowTrigger.TriggerInstance> codec() @ L28
- 方法名:codec
- 源码定位:L28
- 返回类型:Codec<KilledByArrowTrigger.TriggerInstance>
- 修饰符:public
参数:
- 无
说明:
TODO
public void trigger(ServerPlayer player, Collection<Entity> victims, ItemStack firedByWeapon) @ L33
- 方法名:trigger
- 源码定位:L33
- 返回类型:void
- 修饰符:public
参数:
- player: ServerPlayer
- victims: Collection
- firedByWeapon: ItemStack
说明:
TODO
代码
public class KilledByArrowTrigger extends SimpleCriterionTrigger<KilledByArrowTrigger.TriggerInstance> {
@Override
public Codec<KilledByArrowTrigger.TriggerInstance> codec() {
return KilledByArrowTrigger.TriggerInstance.CODEC;
}
public void trigger(ServerPlayer player, Collection<Entity> victims, @Nullable ItemStack firedByWeapon) {
List<LootContext> victimContexts = Lists.newArrayList();
Set<EntityType<?>> entityTypes = Sets.newHashSet();
for (Entity victim : victims) {
entityTypes.add(victim.getType());
victimContexts.add(EntityPredicate.createContext(player, victim));
}
this.trigger(player, t -> t.matches(victimContexts, entityTypes.size(), firedByWeapon));
}
public record TriggerInstance(
Optional<ContextAwarePredicate> player,
List<ContextAwarePredicate> victims,
MinMaxBounds.Ints uniqueEntityTypes,
Optional<ItemPredicate> firedFromWeapon
) implements SimpleCriterionTrigger.SimpleInstance {
public static final Codec<KilledByArrowTrigger.TriggerInstance> CODEC = RecordCodecBuilder.create(
i -> i.group(
EntityPredicate.ADVANCEMENT_CODEC.optionalFieldOf("player").forGetter(KilledByArrowTrigger.TriggerInstance::player),
EntityPredicate.ADVANCEMENT_CODEC.listOf().optionalFieldOf("victims", List.of()).forGetter(KilledByArrowTrigger.TriggerInstance::victims),
MinMaxBounds.Ints.CODEC
.optionalFieldOf("unique_entity_types", MinMaxBounds.Ints.ANY)
.forGetter(KilledByArrowTrigger.TriggerInstance::uniqueEntityTypes),
ItemPredicate.CODEC.optionalFieldOf("fired_from_weapon").forGetter(KilledByArrowTrigger.TriggerInstance::firedFromWeapon)
)
.apply(i, KilledByArrowTrigger.TriggerInstance::new)
);
public static Criterion<KilledByArrowTrigger.TriggerInstance> crossbowKilled(HolderGetter<Item> items, EntityPredicate.Builder... victims) {
return CriteriaTriggers.KILLED_BY_ARROW
.createCriterion(
new KilledByArrowTrigger.TriggerInstance(
Optional.empty(),
EntityPredicate.wrap(victims),
MinMaxBounds.Ints.ANY,
Optional.of(ItemPredicate.Builder.item().of(items, Items.CROSSBOW).build())
)
);
}
public static Criterion<KilledByArrowTrigger.TriggerInstance> crossbowKilled(HolderGetter<Item> items, MinMaxBounds.Ints uniqueEntityTypes) {
return CriteriaTriggers.KILLED_BY_ARROW
.createCriterion(
new KilledByArrowTrigger.TriggerInstance(
Optional.empty(), List.of(), uniqueEntityTypes, Optional.of(ItemPredicate.Builder.item().of(items, Items.CROSSBOW).build())
)
);
}
public boolean matches(Collection<LootContext> victims, int uniqueEntityTypes, @Nullable ItemStack firedFromWeapon) {
if (!this.firedFromWeapon.isPresent() || firedFromWeapon != null && this.firedFromWeapon.get().test((ItemInstance)firedFromWeapon)) {
if (!this.victims.isEmpty()) {
List<LootContext> victimsCopy = Lists.newArrayList(victims);
for (ContextAwarePredicate predicate : this.victims) {
boolean found = false;
Iterator<LootContext> iterator = victimsCopy.iterator();
while (iterator.hasNext()) {
LootContext entity = iterator.next();
if (predicate.matches(entity)) {
iterator.remove();
found = true;
break;
}
}
if (!found) {
return false;
}
}
}
return this.uniqueEntityTypes.matches(uniqueEntityTypes);
} else {
return false;
}
}
@Override
public void validate(ValidationContextSource validator) {
SimpleCriterionTrigger.SimpleInstance.super.validate(validator);
Validatable.validate(validator.entityContext(), "victims", this.victims);
}
}
}引用的其他类
-
- 引用位置:
方法调用 - 关联成员:
EntityPredicate.createContext(), EntityPredicate.wrap()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
ItemPredicate.Builder.item()
- 引用位置:
-
- 引用位置:
继承
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Validatable.validate()
- 引用位置: