A truly enjoyable pathfinding experience.
Detailed project page
Problem Definition
Using simple randwalks or A* for platforming paths in a voxel environment led to unenjoyable or boring routes that didn't respect player engagement constraints.Solution and Outcome
I simulated player jump constraints in sampled environments and used that state to generate procedural platforming paths in an efficient way. The resulting algorithm produced more interesting routes that respected jump feasibility and engagement considerations.Overview of Initial Knowledge and Procedure
In essence, it is a server side plugin to generate procedural parkour. This is done by Utilizing the property of a minecraft jump that the player can travel 4 blocks horizontally from 1 block of space and 1.25 vertically to create parabola with an extra term to make it 3D. From this we obtain a volume that contains all possible jump points. We then pre calculate all possible jump points into a list for fast access so that we do not need to recalculate every time. When picking a new jump, we just sample from the list and add its local position to the last jump.
Generating and visualizing the jumps
Project OverviewThis project is a 1.21 spigot plugin which runs on a spigot server and is made using their API. It was developed using a custom IntelliJ run configuration so the server could run inside the IDE, and a hotswap agent dynamically rebuilt classes without restarting the server. This dramatically improved iteration speed and made implementing pathfinding behavior much faster. |
CommandsPlayer-run commands in game.
|
Class Overviews
|
|
What I Learned
General Concepts
- Organizing large projects into sensible packages and ownership boundaries.
- Planning features and controlling scope creep.
- Breaking complex systems into smaller, testable components.
- Debugging across multiple classes and async workflows.
- Singletons, static vs non-static objects, and why object cloning matters.
- IntelliJ run configs and hotswap workflow for rapid iteration.
- Core linear algebra concepts including
atan2. - JSON import, arrays, hashes, iterators, enhanced loops, and package design.
- Input streams and try/catch error handling patterns.
API Specific
- Building a Spigot plugin and registering commands.
- Using interfaces and command contracts.
- Using sound and block enums effectively.
- Using Spigot scheduler tasks for asynchronous behavior.
- Working with
World,Player,Location,Block, andChunk.