A* Pathfinding
Minecraft Pathfinder for Entities
A* Pathfinding
Please also contribute to this project. I don't have infinite time on my hands 🥺
✅ Features
- Function to find the path to a destination
📖 Usage
Call the `astar:` function and use the remaining markers tagged `astar` to guide anything The starting position of the path will be located at the current entity, with the end position being the current position in the context E.g. `execute as @s at @p[distance=1..] run function astar:` Note that floating destinations & unreached targets will result in failure
I recommend setting the `maxCommandChainLength` gamerule high enough for your terrain, or restrict the path to a maximum of ~10 blocks — otherwise, temporary markers may stay once the limit is reached
Config
The configuration is stored in the `astar.config` scoreboard objective. `scoreboard players set maxDistance astar.config <maxDistance>` — negative value — max distance the pathfinder may travel till finalizing the path. `scoreboard players set maxStepHeight astar.config <maxStepHeight>` — negative value — how many blocks it may walk up at once. `scoreboard players set maxFallDistance astar.config -<maxFallDistance>` — negative value — negative value, how many blocks it may fall each step. To avoid conflicts with others' usage, run `function astar:default_config` or `scoreboard players reset * astar.config` before your logic
Block Tags
`#astar:climbable` — climbable `#astar:obstructs_floor` — traversable, no descent `#astar:impassable_floor` — impassable floor `#astar:impassable_wall` — impassable wall
Penalty Block Tags
`#astar:penalty/damage` 160 — nearby `#astar:penalty/danger` 80 — nearby `#astar:penalty/disliked` 80
You may add a function to the `#astar:eval_node` tag to modify costs — `return <any>` results in only `impassable` being effective — impassable via `kill @s` — add/remove cost via `scoreboard players add/remove @s astar.f <amount>`
Penalties increase the cost of a path segment, so the algorithm prefers other routes.
Example code
``` #code:loop.mcfunction:
data modify storage code:pathfinding points append from entity @s Pos kill @s execute as @n[type=marker,tag=astar] at @s run function code:loop
#code:main.mcfunction:
execute store success score found my_score at @n[tag=target] if function astar:_ as @n[type=marker,tag=astar,sort=furthest] at @s run function code:loop execute unless score found my_score matches 1 run function code:set_direct_target # Walk directly towards target if no path is found ```