Click actions
A clicks map binds click types to lists of actions.
clicks:
left:
- type: select
shift-left:
- type: select
- type: command
command: "warp <entry_id>"
cooldown-ticks: 60
cooldown-message: "<red>Wait a moment before warping again."
shift-right:
- type: clear-selection
The four click types are left, right, shift-left and shift-right.
Actions run as a chain
The list runs in order and stops at the first failure. That is what makes click-to-confirm work: the confirmation returns a denial, so the actions after it do not fire on the arming click, and do fire on the second one.
Add continue-on-failure: true to an action to carry on regardless.
Guards every action accepts
These are checked by the dispatcher before the action itself runs, so no action has to remember them.
permissionnodeRefuse unless the clicker holds the node. Use this when a control should be visible but refuse; use
visible-ifwhen it should not be there at all.denied-messageMiniMessageShown when
permissionrefuses. Defaults to a red "You cannot use that."cooldown-ticksticksdefault0Per player, per action, per entry. Only a successful run starts the cooldown.
cooldown-messageMiniMessageShown while the cooldown is running.
confirm-messageMiniMessageTurns the action into click-to-confirm. The first click stores an expiry on the session and returns a denial; a second click within the window runs it.
confirm-secondsnumberdefault5How long the armed confirmation lasts.
continue-on-failurebooleandefaultfalseCarry on down the chain even if this action fails or is denied.
Navigation
selectactionSelect the clicked entry.
panel:names which panel's selection to set; without it, the panel that was clicked.clear-selectionactionDrop the selection. Takes the same optional
panel:.open-viewactionMove this board, for this viewer only, to another view. Takes
view: <namespace:id>.next-pageactionAdvance a
listpanel.panel:names which one, since without it a pager would try to page itself.previous-pageactionThe other direction, same
panel:argument.set-pageactionJump to
page: <n>, counted from 1. Takes the samepanel:.resetactionReturn the board to its
root-viewand clear this player's selection, paging and state.refreshactionRedraw, dropping cached provider content so a provider is asked again.
closeactionStop rendering this board for this viewer.
Telling the player something
messageactionSend
message:to chat. Templated.action-baractionThe same, on the action bar.
titleactiontitle:andsubtitle:, withfade-in-ms(250),stay-ms(2000) andfade-out-ms(250).linkactionOffer
url:as a clickable chat link, labelled withmessage:. A link can only be handed to a player, never opened for them.
Doing something
commandactionRun
command:.executor: consoleruns it from console rather than as the player, which is how you grant something the player has no permission to grant themselves.teleportactionTakes
world,x,y,z,yawandpitch. Anything omitted keeps the player's current value, soyon its own lifts them where they stand.set-stateactionWrite
key:=value:(defaulttrue) on this viewer's session. Read it back with<state:key>in any templated string, or gate on it with asession-statecondition.toggle-stateactionFlip
key:between true and false. This is what a tab strip is built from.customactionHand off to an
ActionHandleranother plugin registered, named byid:. Every other key on the action is passed through to it as an argument.
A worked example: click to confirm
- id: claim
text: "<dark_gray>[ <green>Claim kit</green> <dark_gray>]"
clicks:
left:
- type: command
executor: console
command: "kit starter <player>"
permission: example.kits.starter
denied-message: "<red>You have not unlocked this kit."
confirm-message: "<yellow>Click again to claim."
confirm-seconds: 4
cooldown-ticks: 1200
cooldown-message: "<red>You have already claimed this."
- type: title
title: "<green>Kit claimed"
The title never fires on the arming click, because the confirmation returned a denial and the chain stopped there.
Test an action safely
- Use a non-destructive
messageaction first to confirm the click type and hit region. - Add the action's permission and denial text, then test with an allowed and denied account.
- Add confirmation and cooldown guards before a console command, teleport or external custom action.
- Run
/holopanels validate, reload, and test both the success and failure path.
For commands with irreversible effects, keep the confirm-message after testing. Confirmation and
cooldown state is scoped to the viewer, board, view, panel, action type and selected entry.