34 lines
1.4 KiB
Java
34 lines
1.4 KiB
Java
package net.minecraft.world.entity.ai.sensing;
|
|
|
|
import com.google.common.collect.ImmutableSet;
|
|
import java.util.Optional;
|
|
import java.util.Set;
|
|
import net.minecraft.server.level.ServerLevel;
|
|
import net.minecraft.world.entity.LivingEntity;
|
|
import net.minecraft.world.entity.ai.memory.MemoryModuleType;
|
|
import net.minecraft.world.entity.ai.memory.NearestVisibleLivingEntities;
|
|
|
|
public abstract class NearestVisibleLivingEntitySensor extends Sensor<LivingEntity> {
|
|
protected abstract boolean isMatchingEntity(ServerLevel level, LivingEntity entity, LivingEntity target);
|
|
|
|
protected abstract MemoryModuleType<LivingEntity> getMemory();
|
|
|
|
@Override
|
|
public Set<MemoryModuleType<?>> requires() {
|
|
return ImmutableSet.of(this.getMemory());
|
|
}
|
|
|
|
@Override
|
|
protected void doTick(ServerLevel level, LivingEntity entity) {
|
|
entity.getBrain().setMemory(this.getMemory(), this.getNearestEntity(level, entity));
|
|
}
|
|
|
|
private Optional<LivingEntity> getNearestEntity(ServerLevel level, LivingEntity enttiy) {
|
|
return this.getVisibleEntities(enttiy)
|
|
.flatMap(nearestVisibleLivingEntities -> nearestVisibleLivingEntities.findClosest(livingEntity2 -> this.isMatchingEntity(level, enttiy, livingEntity2)));
|
|
}
|
|
|
|
protected Optional<NearestVisibleLivingEntities> getVisibleEntities(LivingEntity entity) {
|
|
return entity.getBrain().getMemory(MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES);
|
|
}
|
|
}
|