package net.minecraft.world.entity.ai.sensing; import java.util.List; import java.util.Optional; import java.util.Set; import java.util.function.BiPredicate; import java.util.function.Predicate; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.memory.MemoryModuleType; public class MobSensor extends Sensor { private final BiPredicate mobTest; private final Predicate readyTest; private final MemoryModuleType toSet; private final int memoryTimeToLive; public MobSensor(int p_333366_, BiPredicate p_329126_, Predicate p_334546_, MemoryModuleType p_334716_, int p_331675_) { super(p_333366_); this.mobTest = p_329126_; this.readyTest = p_334546_; this.toSet = p_334716_; this.memoryTimeToLive = p_331675_; } @Override protected void doTick(ServerLevel p_332587_, T p_336316_) { if (!this.readyTest.test(p_336316_)) { this.clearMemory(p_336316_); } else { this.checkForMobsNearby(p_336316_); } } @Override public Set> requires() { return Set.of(MemoryModuleType.NEAREST_LIVING_ENTITIES); } public void checkForMobsNearby(T p_333520_) { Optional> optional = p_333520_.getBrain().getMemory(MemoryModuleType.NEAREST_LIVING_ENTITIES); if (!optional.isEmpty()) { boolean flag = optional.get().stream().anyMatch(p_329312_ -> this.mobTest.test(p_333520_, p_329312_)); if (flag) { this.mobDetected(p_333520_); } } } public void mobDetected(T p_332120_) { p_332120_.getBrain().setMemoryWithExpiry(this.toSet, true, this.memoryTimeToLive); } public void clearMemory(T p_336340_) { p_336340_.getBrain().eraseMemory(this.toSet); } }