HoloPanels
Interactive in-world panels for Paper servers. Text displays you can click, driven by config and extended by other plugins.
- Minecraft
- 1.19.4+
- Server
- Paper
- Java
- 17+
- Needs
- packetevents
- Licence
- LGPL-3.0
What you place is a view made of panels, rendered per viewer, with its own conditions, pagination, selection state and click regions. Two players looking at the same board can see different things.
Choose your path
| Goal | Start here |
|---|---|
| Put a supplied example on a wall | Getting started |
| Build a board and lay out its panels | Boards then Views and panels |
| Add protected or conditional controls | Conditions and Click actions |
| Tune refreshes, distances or rendering limits | Server configuration |
| Supply content from another plugin | The API |
| Diagnose a board that is missing or unclickable | Troubleshooting |
The two halves
Configuration is split along the line between where a panel is and what it says.
| File | Holds |
|---|---|
boards.yml | where a panel is, how far it is visible, who may see it |
views/*.yml | what it shows: panels, lines, buttons, click actions |
A board is a position in the world. A view is what it shows. Views are global by id, so several boards can point at one view and you have the same panel in several places, each with its own per-viewer session.
Inside a view are panels, of type list, text or buttons, each with its own offset, style and visibility condition. Lines are MiniMessage and support PlaceholderAPI.
Nothing is stored as a real display entity. PacketEvents sends each viewer the display and click metadata appropriate to that viewer, and leaving visibility range removes it from that client.
Ideas worth knowing up front
Everything is per viewer
Selection, page, session state and which view a board is currently showing all live on a (player, board) session. Two players at one board can be on different pages of different views. Nothing is global, so nothing has to be locked.
Conditions gate rendering, not appearance
A panel or button that fails its visible-if is not drawn and has no click region. Hiding a staff button is a real restriction rather than a cosmetic one. Per-action permission: is the complement, for when a control should be visible but refuse.
Content can come from another plugin
A panel's rows or lines can be supplied by a provider registered by another plugin. That is what makes a leaderboard, a shop or a queue display possible without HoloPanels knowing what any of those are. See the API.
A reload is all-or-nothing
Reload builds the whole configuration first and swaps it in only if it parsed. A bad edit costs you a log message rather than the plugin: the running boards keep working with the previous configuration until a valid one replaces it.
Where to go next
- Getting started: install it and place your first board.
- Boards:
boards.yml, placement and visibility. - Views and panels: the panel types, styles and offsets.
- Server configuration: refresh timing, limits and global style defaults.
- Click actions: every built-in action and its arguments.
- Troubleshooting: a symptom-by-symptom diagnostic path.