minecraft-src/net/minecraft/world/entity/ai/behavior/GoToWantedItem.java
2025-07-04 02:00:41 +03:00

50 lines
2.1 KiB
Java

package net.minecraft.world.entity.ai.behavior;
import com.mojang.datafixers.kinds.K1;
import java.util.function.Predicate;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.ai.behavior.declarative.BehaviorBuilder;
import net.minecraft.world.entity.ai.behavior.declarative.MemoryAccessor;
import net.minecraft.world.entity.ai.memory.MemoryModuleType;
import net.minecraft.world.entity.ai.memory.WalkTarget;
import net.minecraft.world.entity.item.ItemEntity;
public class GoToWantedItem {
public static BehaviorControl<LivingEntity> create(float speedModifier, boolean hasTarget, int maxDistToWalk) {
return create(livingEntity -> true, speedModifier, hasTarget, maxDistToWalk);
}
public static <E extends LivingEntity> BehaviorControl<E> create(Predicate<E> canWalkToItem, float speedModifier, boolean hasTarget, int maxDistToWalk) {
return BehaviorBuilder.create(
instance -> {
BehaviorBuilder<E, ? extends MemoryAccessor<? extends K1, WalkTarget>> behaviorBuilder = hasTarget
? instance.registered(MemoryModuleType.WALK_TARGET)
: instance.absent(MemoryModuleType.WALK_TARGET);
return instance.group(
instance.registered(MemoryModuleType.LOOK_TARGET),
behaviorBuilder,
instance.present(MemoryModuleType.NEAREST_VISIBLE_WANTED_ITEM),
instance.registered(MemoryModuleType.ITEM_PICKUP_COOLDOWN_TICKS)
)
.apply(
instance,
(memoryAccessor, memoryAccessor2, memoryAccessor3, memoryAccessor4) -> (serverLevel, livingEntity, l) -> {
ItemEntity itemEntity = instance.get(memoryAccessor3);
if (instance.tryGet(memoryAccessor4).isEmpty()
&& canWalkToItem.test(livingEntity)
&& itemEntity.closerThan(livingEntity, maxDistToWalk)
&& livingEntity.level().getWorldBorder().isWithinBounds(itemEntity.blockPosition())
&& livingEntity.canPickUpLoot()) {
WalkTarget walkTarget = new WalkTarget(new EntityTracker(itemEntity, false), speedModifier, 0);
memoryAccessor.set(new EntityTracker(itemEntity, true));
memoryAccessor2.set(walkTarget);
return true;
} else {
return false;
}
}
);
}
);
}
}