Pathfinding can fail with `IllegalStateException` when sneaking off a block
ZacSharp opened this issue ยท 7 comments
Some information
Operating system: Linux
Java version: 21
Minecraft version: 1.20.6
Baritone version: fd8af9b
Other mods (if used): Litematica 1.18.1 + Malilib 1.19.0
(i.e. the workspace I used to test #4527)
Exception, error or logs
[16:31:28] [Render thread/INFO]: [CHAT] [Baritone] > path
[16:31:28] [Render thread/INFO]: [CHAT] [Baritone] Now pathing
[16:31:28] [pool-6-thread-3/INFO]: [STDERR]: java.lang.IllegalStateException: Path doubles back on itself, making a loop
[16:31:28] [pool-6-thread-3/INFO]: [STDERR]: at baritone.api.pathing.calc.IPath.sanityCheck(IPath.java:174)
[16:31:28] [pool-6-thread-3/INFO]: [STDERR]: at baritone.pathing.calc.Path.postProcess(Path.java:156)
[16:31:28] [pool-6-thread-3/INFO]: [STDERR]: at java.base/java.util.Optional.map(Optional.java:260)
[16:31:28] [pool-6-thread-3/INFO]: [STDERR]: at baritone.pathing.calc.AbstractNodeCostSearch.calculate(AbstractNodeCostSearch.java:106)
[16:31:28] [pool-6-thread-3/INFO]: [STDERR]: at baritone.behavior.PathingBehavior.lambda$findPathInNewThread$2(PathingBehavior.java:506)
[16:31:28] [pool-6-thread-3/INFO]: [STDERR]: at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
[16:31:28] [pool-6-thread-3/INFO]: [STDERR]: at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
[16:31:28] [pool-6-thread-3/INFO]: [STDERR]: at java.base/java.lang.Thread.run(Thread.java:1583)
How to reproduce
Sneak off of an edge and set a goal such that the shortest path from the supporting block to the goal leads through your current position, then start the pathfinder.
E.g. like this:
Modified settings
None
Final checklist
- I know how to properly use check boxes
- I have included the version of Minecraft I'm running, baritone's version and forge mods (if used).
- I have included logs, exceptions and / or steps to reproduce the issue.
- I have not inserted any OwO's or UwU's into this issue.
Couldn't reproduce. Do you have baritone somehow configured so that it walks over the hole? I don't get an error if it parkours over the hole or falls into it.
Yes, I used default settings (i.e. no parkour) and had a dirt block in my hand so it would scaffold back over the hole.
This is indeed a tricky case because the "correct" path here does indeed double back on itself!
It would just make it walk onto the supporting block(pathStart()) which should be the goal if A* returned nothing
I think we can either fix the sanity check so it runs before we add the new node or only add the node if A* returned nothing (should be equal to checking if pathStart = goal like in the original solution)
only add the node if A* returned nothing
not sure if that works, wouldn't that make it fall into the hole in this example without placing the block? or no?