blocks_mined
Requirements
A voucher’s requirements: list holds checks that all must pass before the code is
redeemable. When a redeem fails, Claimo prints the whole checklist — met lines and unmet
lines — so the player knows exactly what’s left to do.
requirements: - type: playtime seconds: 3600 - type: account_age days: 7Built-in types
Section titled “Built-in types”playtime
messages_sent
account_age
permission
rank
custom
blocks_mined
Section titled “blocks_mined”Player has broken at least amount blocks — tracked by Claimo, persisting across
restarts.
| Parameter | Required | Meaning |
|---|---|---|
amount |
✅ | Minimum blocks broken. |
whitelist |
optional | Only these material types are counted. |
blacklist |
optional | These material types are never counted. |
- type: blocks_mined amount: 100 # Only diamond ore counts toward this one. whitelist: - DIAMOND_ORE - DEEPSLATE_DIAMOND_ORE # blacklist: # - STONEMaterial names are Bukkit constants (e.g. DIAMOND_ORE).
playtime
Section titled “playtime”Player’s total time on the server is at least duration (the vanilla play-time statistic).
duration accepts a friendly string such as 1h 30m, 5d or 2w; a bare number is read as
seconds. The legacy seconds key still works.
- type: playtime duration: 1h 30mmessages_sent
Section titled “messages_sent”Player has sent at least amount qualifying chat messages.
| Parameter | Default | Meaning |
|---|---|---|
amount |
— | Minimum qualifying messages. |
min-length |
10 |
A message must be at least this many characters. |
delay-seconds |
20 |
At least this long must pass since the last counted message. |
- type: messages_sent amount: 25 min-length: 10 delay-seconds: 20account_age
Section titled “account_age”Player’s account first joined the server at least duration ago — gates rewards away
from brand-new accounts and alts. duration accepts a friendly string such as 7d or
2w; the legacy days number still works.
- type: account_age duration: 7dpermission
Section titled “permission”Player must hold at least one of permissions and none of denied-permissions.
- type: permission permissions: [claimo.vip, claimo.mvp] # must have at least one denied-permissions: [claimo.redeemed] # must have none- Omit
permissionsfor no positive requirement. - Use
denied-permissionsto lock a code away from players who already hold a node. - Both accept a YAML list or a comma-separated string; the singular
permission/denied-permissionkeys also work.
Same shape as permission, but for permission groups resolved via Vault.
- type: rank denied-ranks: [admin, owner] # staff can't redeem this onecustom
Section titled “custom”Resolves a placeholder via PlaceholderAPI and compares it to value. Lets you gate
on anything PAPI exposes — economy, level, stats — without a dedicated requirement.
| Parameter | Meaning |
|---|---|
placeholder |
The left-hand side — resolved through PlaceholderAPI for the player. |
operator |
One of == != contains regex >= <= > <. |
value |
The right-hand side — also resolved through PlaceholderAPI, so a literal (1000, true) and another placeholder both work. |
- type: custom placeholder: "%vault_eco_balance%" operator: ">=" value: "1000"
# Both sides accept placeholders — literals and placeholders mix freely:- type: custom placeholder: "%superiorskyblock_has_island%" operator: "==" value: "true"- type: custom placeholder: "%player_level%" operator: ">=" value: "%someplugin_required_level%"Its requirement-custom message (in messages.yml) can use these placeholders, so you
can phrase the checklist line however you like:
| Placeholder | Value |
|---|---|
<placeholder> |
The raw placeholder string as configured, e.g. %vault_eco_balance%. |
<placeholder_pretty> |
The placeholder with % stripped and _ turned into spaces, e.g. vault eco balance. |
<placeholder_parsed> |
The placeholder resolved to the player’s current value. |
<operator> |
The configured operator. |
<value> |
The raw value string as configured. |
<value_parsed> |
The value resolved to the player’s current value (same as <value> for literals). |
requirement-custom: "<placeholder_pretty>: <placeholder_parsed> (need <operator> <value>)"Logical groups: any, all, not
Section titled “Logical groups: any, all, not”By default every entry in requirements: must pass. Group entries let you express OR and
NOT logic — a group counts as a single requirement whose children decide its outcome:
any:— satisfied when at least one child passes.all:— satisfied when every child passes (useful insideany).not:— satisfied when no child passes.
requirements: - any: - type: permission permission: claimo.vip - type: rank rank: premium - type: playtime duration: 2hGroups nest freely — an any can contain an all, and so on. In the redeem checklist a
group prints as one line built from the requirement-group-any / -all / -not message,
with <requirements> holding the children’s descriptions.
The redeem checklist
Section titled “The redeem checklist”When a redeem fails, the whole requirement checklist is printed. Met lines use the
requirement-met message, unmet lines use requirement-unmet, each wrapping the
requirement’s own <description>. Customise those in
messages.yml.
Adding your own
Section titled “Adding your own”None of these fit? Requirement types are a public API — register your own (e.g. a social-media follow check) from an addon. See Custom requirements.