minecraft-src/net/minecraft/world/level/pathfinder/NodeEvaluator.java
2025-07-04 03:15:13 +03:00

112 lines
3.3 KiB
Java

package net.minecraft.world.level.pathfinder;
import it.unimi.dsi.fastutil.ints.Int2ObjectFunction;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import net.minecraft.core.BlockPos;
import net.minecraft.tags.BlockTags;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.Mob;
import net.minecraft.world.level.PathNavigationRegion;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.CampfireBlock;
import net.minecraft.world.level.block.state.BlockState;
public abstract class NodeEvaluator {
protected PathfindingContext currentContext;
protected Mob mob;
protected final Int2ObjectMap<Node> nodes = new Int2ObjectOpenHashMap<>();
protected int entityWidth;
protected int entityHeight;
protected int entityDepth;
protected boolean canPassDoors = true;
protected boolean canOpenDoors;
protected boolean canFloat;
protected boolean canWalkOverFences;
public void prepare(PathNavigationRegion level, Mob mob) {
this.currentContext = new PathfindingContext(level, mob);
this.mob = mob;
this.nodes.clear();
this.entityWidth = Mth.floor(mob.getBbWidth() + 1.0F);
this.entityHeight = Mth.floor(mob.getBbHeight() + 1.0F);
this.entityDepth = Mth.floor(mob.getBbWidth() + 1.0F);
}
/**
* This method is called when all nodes have been processed and PathEntity is created.
*/
public void done() {
this.currentContext = null;
this.mob = null;
}
protected Node getNode(BlockPos pos) {
return this.getNode(pos.getX(), pos.getY(), pos.getZ());
}
/**
* Returns a mapped point or creates and adds one
*/
protected Node getNode(int x, int y, int z) {
return this.nodes.computeIfAbsent(Node.createHash(x, y, z), (Int2ObjectFunction<? extends Node>)(l -> new Node(x, y, z)));
}
public abstract Node getStart();
public abstract Target getTarget(double x, double y, double z);
protected Target getTargetNodeAt(double x, double y, double z) {
return new Target(this.getNode(Mth.floor(x), Mth.floor(y), Mth.floor(z)));
}
public abstract int getNeighbors(Node[] outputArray, Node node);
public abstract PathType getPathTypeOfMob(PathfindingContext context, int x, int y, int z, Mob mob);
public abstract PathType getPathType(PathfindingContext context, int x, int y, int z);
public PathType getPathType(Mob mob, BlockPos pos) {
return this.getPathType(new PathfindingContext(mob.level(), mob), pos.getX(), pos.getY(), pos.getZ());
}
public void setCanPassDoors(boolean canEnterDoors) {
this.canPassDoors = canEnterDoors;
}
public void setCanOpenDoors(boolean canOpenDoors) {
this.canOpenDoors = canOpenDoors;
}
public void setCanFloat(boolean canFloat) {
this.canFloat = canFloat;
}
public void setCanWalkOverFences(boolean canWalkOverFences) {
this.canWalkOverFences = canWalkOverFences;
}
public boolean canPassDoors() {
return this.canPassDoors;
}
public boolean canOpenDoors() {
return this.canOpenDoors;
}
public boolean canFloat() {
return this.canFloat;
}
public boolean canWalkOverFences() {
return this.canWalkOverFences;
}
public static boolean isBurningBlock(BlockState state) {
return state.is(BlockTags.FIRE)
|| state.is(Blocks.LAVA)
|| state.is(Blocks.MAGMA_BLOCK)
|| CampfireBlock.isLitCampfire(state)
|| state.is(Blocks.LAVA_CAULDRON);
}
}