minecraft-src/net/minecraft/world/entity/ai/behavior/StartAttacking.java
2025-07-04 02:49:36 +03:00

49 lines
1.7 KiB
Java

package net.minecraft.world.entity.ai.behavior;
import java.util.Optional;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.Mob;
import net.minecraft.world.entity.ai.behavior.declarative.BehaviorBuilder;
import net.minecraft.world.entity.ai.memory.MemoryModuleType;
public class StartAttacking {
public static <E extends Mob> BehaviorControl<E> create(StartAttacking.TargetFinder<E> targetFinder) {
return create((serverLevel, mob) -> true, targetFinder);
}
public static <E extends Mob> BehaviorControl<E> create(StartAttacking.StartAttackingCondition<E> condition, StartAttacking.TargetFinder<E> targetFinder) {
return BehaviorBuilder.create(
instance -> instance.group(instance.absent(MemoryModuleType.ATTACK_TARGET), instance.registered(MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE))
.apply(instance, (memoryAccessor, memoryAccessor2) -> (serverLevel, mob, l) -> {
if (!condition.test(serverLevel, (E)mob)) {
return false;
} else {
Optional<? extends LivingEntity> optional = targetFinder.get(serverLevel, (E)mob);
if (optional.isEmpty()) {
return false;
} else {
LivingEntity livingEntity = (LivingEntity)optional.get();
if (!mob.canAttack(livingEntity)) {
return false;
} else {
memoryAccessor.set(livingEntity);
memoryAccessor2.erase();
return true;
}
}
}
})
);
}
@FunctionalInterface
public interface StartAttackingCondition<E> {
boolean test(ServerLevel serverLevel, E object);
}
@FunctionalInterface
public interface TargetFinder<E> {
Optional<? extends LivingEntity> get(ServerLevel serverLevel, E object);
}
}