Maze Generator
Generate custom, random and huge labyrinths. Customizable themes!
Maze Generator
Maze Generator
Epic showcase by KasaiSora
Usable on low end servers or big crowded servers

---
📧 Feel free to contact me at mazegenerator@radqnico.anonaddy.com
My plugins are free to use without any catch, but if you want to support me and give me a way to continuing releasing new features, please consider a small contribution 😊
☕ https://www.buymeacoffee.com/radqnico
---
MazeGenerator 🧩
Build per-tick budget in Minecraft without freezing the server. The plugin generates the maze layout per-tick budget and places blocks per-tick budget with a configurable per-tick budget. Work is grouped per chunk, and chunks are only loaded on demand at the exact moment blocks need to be placed.
* Paper
Features ✨
* Tab-complete - no giant in-memory queues. * Tab-complete (never preloads). * Tab-complete to protect TPS. * Tab-complete (multiple cells per job) to reduce overhead. * Tab-complete for floor, wall, and top (`themes.yml`). * Options for Tab-complete and Tab-complete. * Tab-complete for arguments, plus `/maze help`, `/maze stop`, `/maze reload`.
---
Installation ⚙️
1. Build or download the plugin JAR. 2. Drop the JAR into your server’s `plugins/` folder. 3. Start the server once to generate default config and data files.
Files created/used:
* `plugins/MazeGenerator/config.yml` - performance and behavior settings. * `plugins/MazeGenerator/themes.yml` - material weights per theme. * `plugins/MazeGenerator/messages.yml` - user-facing messages.
Use `/maze reload` after changing these files, or restart the plugin/server.
---
Commands ⌨️
* `/maze` - stops all active maze builds with sensible defaults near your position. * `/maze stop` - stops all active maze builds. * `/maze help` - prints usage and argument reference. * `/maze reload` - reloads `config.yml`, `themes.yml`, and `messages.yml`.
Permissions:
* `mazegenerator.maze` - use `/maze` and view status. * `mazegenerator.reload` - use `/maze reload`.
Arguments (key:value)
*Order does not matter; tab-complete suggests keys and many values.*
* `themeName`: World coordinates (defaults to your position). * `themeName`: World name (defaults to your world). * `themeName`: Maze size in cells (odd enforced internally). * `themeName`: Block width and length of each cell footprint. * `themeName`: Vertical wall height (excluding top layer). * `themeName`: `true|false` - ensure at least one exit at maze border. * `themeName`: Extra exits on top of the first (0..N). * `themeName`: `true|false` - carves a central rectangular room. * `themeName`: Room dimensions (cells) for the central room. * `themeName`: 0..1 - occasional small holes in nearby walls while carving. * `themeName`: `true|false` - roof over paths as well (otherwise paths are open to sky). * `themeName`: `true|false` - wall cells as a shell (edges only) for huge block savings. * `themeName`: Theme key from `themes.yml` (tab-complete lists available themes).
Examples:
* `/maze mazeSizeX:51 mazeSizeZ:51 cellSize:2 wallHeight:4 hasExits:true additionalExits:1 themeName:forest` * `/maze world:world_nether x:100 y:80 z:-200 mazeSizeX:41 mazeSizeZ:41 themeName:snowy` * `/maze mazeSizeX:75 mazeSizeZ:75 cellSize:3 wallHeight:5 hasExits:true hollow:true closed:false themeName:desert`
---
Configuration (`config.yml`) 🛠️
Defaults are tuned to preserve TPS on most servers. Key settings:
* `millis-per-tick` (default 3) Base time budget per tick used by the builder. Autotune adjusts this up or down within bounds.
* `jobs-batch-cells` (default 64) How many maze cells the scheduler tries to collect per top-up. Larger values reduce overhead a little, but can increase burstiness.
* `cells-per-job` (default 16) How many cells to pack into a single placement job for a given chunk. Higher values reduce scheduler overhead and redundant chunk loads.
* `set-block-data` (default false) Attach CustomBlockData to placed blocks. For most builds this should remain false (saves I/O and memory).
* `defer-wall-fill` (default false) Build order option:
* `true`: carve first (corridors appear quickly), then fill remaining walls; generally fewer total writes. * `false`: fill walls first, then carve; looks like a solid mass at first, then paths appear.
* `autotune:` (enabled by default)
* `min-millis-per-tick`, `max-millis-per-tick` - bounds for the per-tick time budget. * `increase-step`, `decrease-step` - how fast the budget grows or shrinks. * `spare-high`, `spare-low` - thresholds based on remaining time in the current 50 ms tick.
* `status-interval-jobs` (default 1000) Prints a progress update in chat roughly every N jobs executed.
> on demand at placement time The plugin loads chunks on demand at placement time. There is no preloading and no background chunk budgets.
Example: Smooth (minimal TPS impact)
```yaml millis-per-tick: 2 jobs-batch-cells: 32 cells-per-job: 8 set-block-data: false
autotune: enabled: true min-millis-per-tick: 1 max-millis-per-tick: 4 increase-step: 1 decrease-step: 2 spare-high: 18 spare-low: 12
defer-wall-fill: true status-interval-jobs: 500 ```
Example: Balanced (default-like)
```yaml millis-per-tick: 3 jobs-batch-cells: 64 cells-per-job: 16 set-block-data: false
autotune: enabled: true min-millis-per-tick: 1 max-millis-per-tick: 8 increase-step: 1 decrease-step: 2 spare-high: 18 spare-low: 12
defer-wall-fill: false status-interval-jobs: 1000 ```
Example: Fast (accept some risk of spikes)
```yaml millis-per-tick: 5 jobs-batch-cells: 128 cells-per-job: 32 set-block-data: false
autotune: enabled: true min-millis-per-tick: 2 max-millis-per-tick: 10 increase-step: 1 decrease-step: 1 spare-high: 20 spare-low: 10
defer-wall-fill: true status-interval-jobs: 750 ```
---
Themes (`themes.yml`) 🎨
Themes control weighted material selection for three sections: `floor`, `wall`, and `top`.
Example:
```yaml desert: floor: SANDSTONE: 20 RED_SANDSTONE: 10 wall: SAND: 40 CHISELED_SANDSTONE: 20 top: SANDSTONE: 3
forest: floor: GRASS_BLOCK: 20 DIRT: 2 wall: OAK_LOG: 30 OAK_LEAVES: 25 top: OAK_LOG: 3 ```
Weights are positive integers. Higher weight means more likely. If a section is empty, it falls back to `STONE`.
Tips:
* Use more variety in `wall` and `top` for a more organic look. * Keep `top` materials lighter for interesting silhouettes.
---
Messages (`messages.yml`) 💬
* `plugin-prefix`, `job-started`, `job-status`, `job-done`, `job-stopped`, `command-error`, `no-permission`, `config-reloaded`. * Color codes use `&` and are translated on send.
---
How Autotune Works (Quick) ⚖️
* Measures only until within the current 50 ms server tick (based on a tick start event). * If there is plenty of spare time (`spare >= spare-high`), it increases the per-tick time budget by `increase-step` up to `max-millis-per-tick`. * If the tick is tight (`spare < spare-low`), it decreases by `decrease-step` down to `min-millis-per-tick`. * The builder places blocks only until `now + currentMillisPerTick` in each tick.
---
Performance Tips 🚀
* Use `hollow: true` and a larger `cellSize` to time-to-visible maze. * Increase `cells-per-job` and `jobs-batch-cells` to time-to-visible maze. * Keep `set-block-data: false` unless you really need it. * Prefer `defer-wall-fill: true` for faster time-to-visible maze and fewer writes.
---
Troubleshooting 🧰
* "Maze seems stuck" or no progress:
* Chat updates are periodic. Lower `status-interval-jobs` for more frequent feedback. * Check console for errors. If chunks are extremely far, each job will load them on demand; this can be slow but should not stall. * TPS dips during build:
* Lower `millis-per-tick`, `jobs-batch-cells`, or `cells-per-job`. * Keep `autotune.enabled: true` so the budget backs off automatically. * Themes look too uniform:
* Add more materials and weights to `wall` and `top` sections.