Thhis is mostly a bug fix and API related update.
## Release Highlights
* 🔲 **Dialog grid layout** — `DialogBuilder` can now lay buttons out in a configurable number of columns with per-button widths, enabling grids, maps, and pickers without leaving the API. Used in the latest ChunkBlock.
* ⚙️ **bStats metrics opt-out** — new `general.metrics` toggle lets server owners disable BentoBox's anonymous usage statistics independently of the global bStats switch.
* 🛡️ **Paper 26.2 & Adventure 5** — BentoBox now compiles and runs against Paper 26.2, bringing Adventure 5 API changes that addon authors should be aware of.
* 🐛 **Player head 429 spam fixed** — heads with missing textures no longer trigger repeated Mojang session-server lookups that flood the console with rate-limit errors.
* 🐛 **YAML numeric type widening** — config values like `20` written without a decimal point now correctly load into `double`, `float`, and `long` fields instead of throwing `ClassCastException`.
### Compatibility
✔️ Paper Minecraft 1.21.x – 1.21.11 (26.2)
✔️ Java 21+
### Upgrading
1. **As always, take backups just in case.** (Make a copy of everything!)
2. Stop the server.
3. Replace the BentoBox jar with this one.
4. Restart the server.
5. You should be good to go!
> ⚙️ **New config option:** `general.metrics` has been added to `config.yml` (default `true`). Set it to `false` and restart to disable BentoBox's bStats telemetry. The global switch in `plugins/bStats/config.yml` still works as before.
> 🔺 **Addon authors — Adventure 5 changes:** Paper 26.2 ships Adventure 5, which seals `Component` (Mockito can no longer mock it) and replaces `ClickEvent.value()` with `payload()`. See [PR #3067](https://github.com/BentoBoxWorld/BentoBox/pull/3067) for the full removal list and migration notes. Addons already deployed against a 26.2 server may already be affected at runtime; recompiling against BentoBox 3.22.3 will surface any issues at compile time.
### Legend
- ⚙️ config options have been removed, renamed, or added.
- 🔺 special attention needed.
---
## New Features
### 🔲 Dialog Grid Layout
[[PR #3066](https://github.com/BentoBoxWorld/BentoBox/pull/3066)]
`DialogBuilder#columns(int)` lays a multi-action dialog's buttons out in a grid instead of the default two-wide list. `DialogButton` gains a width parameter (1–1024) matching Paper's `ActionButton` sizing, plus `withWidth(int)` for resizing existing buttons. Existing callers are unaffected — omitting columns and width preserves the client's default behaviour.
### ⚙️ bStats Metrics Opt-Out
[[PR #3065](https://github.com/BentoBoxWorld/BentoBox/pull/3065)]
A new `general.metrics` setting (default `true`) in `config.yml` lets server owners disable BentoBox's bStats telemetry without touching the global bStats config. When set to `false`, no metrics collector is registered and no data is submitted. Changing this setting requires a server restart.
---
## Bug Fixes
### Player Head Texture-Less Profile Spam
[[PR #3063](https://github.com/BentoBoxWorld/BentoBox/pull/3063)]
Opening a panel with player heads (e.g. a top-ten list) could flood the console with HTTP 429 errors from `sessionserver.mojang.com`. This happened because `HeadGetter` delivered profiles without texture data, causing the server to re-resolve them on every panel open. Now, heads without a usable texture degrade to a plain head instead of triggering repeated lookups, and a failed fetch no longer evicts a cached head that already has a working texture.
### YAML Numeric Type Widening
[[PR #3068](https://github.com/BentoBoxWorld/BentoBox/pull/3068)]
YAML types a number by how it is written: `20` loads as `Integer` regardless of the declared field type. A `double` config field written without a decimal point reached the setter as an `Integer`, and inside collections, generic erasure hid the mismatch until the first read threw `ClassCastException`. A new `widen()` helper now correctly promotes `Integer` to `Double`, `Float`, or `Long` as needed, while deliberately refusing to silently narrow `Double` to `Integer` or `Long`.
### Literal Color Names in Panels
A previous refactor replaced deprecated `ChatColor` constants with `NamedTextColor` in string concatenations, but `NamedTextColor.WHITE.toString()` returns the word `"white"`, not a color code — so the Management panel showed addon names like `"whiteChallenges"`. Fixed by using MiniMessage tags instead.
---
## Other Improvements
* 🔺 **Paper 26.2 & Adventure 5** — Compiled against Paper 26.2 (`build.111-stable`) with MockBukkit 4.116.1. See the addon author note above for API removals. [[PR #3067](https://github.com/BentoBoxWorld/BentoBox/pull/3067)]
* Removed workarounds for 26.2 symbols that were missing at compile time — `SULFUR_CUBE` is now `static final` again, and tests use the real entity type directly (−87 lines). [[PR #2994](https://github.com/BentoBoxWorld/BentoBox/pull/2994)]
* Published JSON Schemas (draft 2020-12) for the `.blueprint` and blueprint-bundle file formats, covering blocks, spawners, entities, display entities, and item frames.
* Referenced the new org-wide privacy policy, AI policy, and contributing guidelines from the README.
---
## What's Changed
* 🔲 Lay dialog buttons out in a grid: columns and button width by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3066
* ⚙️ Add general.metrics config toggle to opt out of bStats by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3065
* Do not put texture-less profiles on player heads by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3063
* Fix: widen YAML-loaded numbers to the declared numeric field type by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3068
* 🔺 Compile against Paper 26.2 now that MockBukkit supports it by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/3067
* Drop the workarounds for 26.2 symbols missing at compile time by @tastybento in https://github.com/BentoBoxWorld/BentoBox/pull/2994
**Full Changelog**: https://github.com/BentoBoxWorld/BentoBox/compare/3.22.2...3.22.3
Developer information
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle.
maven { name = "Modrinth"; url = "https://api.modrinth.com/maven" }