package net.minecraft.world.entity.ai.behavior; import java.util.Optional; import java.util.function.Predicate; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.behavior.declarative.BehaviorBuilder; import net.minecraft.world.entity.ai.memory.MemoryModuleType; import net.minecraft.world.entity.ai.memory.NearestVisibleLivingEntities; import net.minecraft.world.entity.ai.memory.WalkTarget; public class InteractWith { public static BehaviorControl of( EntityType type, int interactionRange, MemoryModuleType interactMemory, float speedModifier, int maxDist ) { return of(type, interactionRange, livingEntity -> true, livingEntity -> true, interactMemory, speedModifier, maxDist); } public static BehaviorControl of( EntityType type, int interactionRange, Predicate selfFilter, Predicate targetFilter, MemoryModuleType memory, float speedModifier, int maxDist ) { int i = interactionRange * interactionRange; Predicate predicate = livingEntity -> type.equals(livingEntity.getType()) && targetFilter.test(livingEntity); return BehaviorBuilder.create( instance -> instance.group( instance.registered(memory), instance.registered(MemoryModuleType.LOOK_TARGET), instance.absent(MemoryModuleType.WALK_TARGET), instance.present(MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES) ) .apply( instance, (memoryAccessor, memoryAccessor2, memoryAccessor3, memoryAccessor4) -> (serverLevel, livingEntity, l) -> { NearestVisibleLivingEntities nearestVisibleLivingEntities = instance.get(memoryAccessor4); if (selfFilter.test(livingEntity) && nearestVisibleLivingEntities.contains(predicate)) { Optional optional = nearestVisibleLivingEntities.findClosest( livingEntity2 -> livingEntity2.distanceToSqr(livingEntity) <= i && predicate.test(livingEntity2) ); optional.ifPresent(livingEntityx -> { memoryAccessor.set(livingEntityx); memoryAccessor2.set(new EntityTracker(livingEntityx, true)); memoryAccessor3.set(new WalkTarget(new EntityTracker(livingEntityx, false), speedModifier, maxDist)); }); return true; } else { return false; } } ) ); } }