Introduction

DonaDrops is a Minecraft plugin (Paper 1.20 to 26.3) created by zDonatier and Santiago Rivers that turns any chest into a "drop chest": a chest with its own name and color, a star rarity, a category, a floating hologram, a list of rewards that gets rolled when it's opened, and non-removable decorative panels around the loot.

Requirements

Server versionJava required
1.20 to 1.20.4Java 17 or higher
1.20.5 to 1.21.xJava 21 or higher (required by Minecraft itself; the plugin works the same)
26.1 to 26.3Java 25 or higher (required by Paper on these versions; the plugin works the same)

The plugin is compiled against the Paper 1.20.4 API. So it also works on newer versions, everything Minecraft has renamed or changed over time (particle names, sounds, the enchantment glow, inventories) is resolved at runtime on your server, not at compile time. If a name doesn't exist on your version, a safe fallback is used instead of throwing an error.

Versions before 1.20 are not supported. If someone installs it on one, the server won't load the plugin and will print a console warning like Unsupported API version 1.20; nothing else breaks. Minecraft 26.3 is supported. Anything newer is expected to work, but it's still worth testing it on your server before using it in production.

Commands

CommandDescription
/dd create <name> [rarity 1-5] [category]Creates a chest from the container you're looking at.
/dd spawn <name>Spawns that chest at your current location.
/dd editor <name>Opens the editor GUI for an existing chest.
/topsOpens the leaderboard category selector.
/dd topsInternal alias that opens the same leaderboard selector.
/dd reloadReloads config.yml, categories.yml, languages and drops.
/dd authorShows the plugin's info and author.
/dd helpLists every command.
/dd locate <name>Lists every location where that chest is currently spawned in the world.
/dd give <player> <name>Gives that chest's contents directly to a player, without spawning the block.
/dd copy <source> <new-name>Duplicates an existing chest (rarity, category, rewards, commands, block type...) under a new name.
/dd list [page]Lists registered chests with their rarity and how many are currently spawned, 6 at a time.
/dd respawnallRefreshes the hologram of every chest currently spawned.
/dd despawnallRemoves every chest that's currently spawned.
/dd delete <name>Deletes the registered drop and removes its active spawns.
/dd zonewandGives you the DonaDrops iron axe to select Pos1 and Pos2.
/dd pos1 <x> <y> <z> [world]Sets the first position of a zone.
/dd pos2 <x> <y> <z> [world]Sets the second position of a zone.
/dd createzone <name>Creates a zone from the current selection and shows a clickable confirmation before saving it.
/dd confirmzone <name>Confirms the zone creation. It is run automatically when you click the confirmation message.
/dd setzonemax <name> <value>Changes the maximum number of active chests of an existing zone; 0 means no limit.
/dd deletezone <name>Deletes a zone; its boundaries stop restricting spawns.
/dd createspawn <spawnName> <chestName>Creates a fixed spawn point for that chest at your current location (see Fixed spawn points).
/dd deletespawn <file>Deletes a fixed spawn point (the file name is <chest>_<spawnName>).
/dd listspawns [chestName]Lists saved fixed spawn points, optionally filtered by chest.
/dd event start <name>Manually starts a drop event defined in /events.
/dd event stop [name]Stops the running drop event.
/dd event listLists every drop event and its current status.

Alias: /donadrops. Every argument has tab-completion (chest names, categories, 1-5, online players).

Besides /dd spawn <name>, DonaDrops ships an automatic, probability-based spawner (see Automatic spawning): on every attempt, the plugin individually rolls each chest's spawn-chance (or the global value if it doesn't define one) to build a list of that cycle's "candidates", then picks one at random among them. A chest with spawn-chance: 100 ALWAYS enters that list, so if it's the only one at 100% it will almost always be the one chosen (unless its own cooldown or the global one haven't elapsed yet). A chest with spawn: true in its file never uses this random picker at all: it only appears at the fixed points created with /dd createspawn, and in the worlds listed in spawn-world (see above).

Permissions

NodeDefaultDescription
donadrops.*opGrants every permission.
donadrops.createopCreate chests, including /dd copy.
donadrops.spawnopSpawn chests, break them, use /dd locate, /dd give, /dd list and /dd despawnall.
donadrops.editoropOpen the editor.
donadrops.reloadopReload the plugin and refresh holograms.
donadrops.topstrueView the leaderboard menu.
donadrops.authortrueView /dd author.
donadrops.helptrueView /dd help.
donadrops.notifyopReceive startup notices, YAML errors and new version alerts.
donadrops.opentrueAllows opening spawned chests.
donadrops.eventopAllows starting, stopping and listing drop events with /dd event.
Every category in categories.yml automatically gets its own donadrops.opendrop.<category> permission (default op), including any new category you add. It only applies to chests that have the permission-required flag — see Chest Flags.

Creating a chest step by step

  1. Place any container block (chest, trapped chest, barrel, shulker box...).
  2. Fill it with the items you want that chest to be able to give.
  3. Look directly at the chest.
  4. Run /dd create &6Legendary Chest 5 legendary
The name accepts legacy (&6), hex (&#FFAA00) and MiniMessage (<gradient:red:gold>Text</gradient>). The color shows up in the title, hologram and GUI, but it never shows up in commands or tab-completion — there you'll always see the plain name.

If you skip the rarity, 1 star is used by default. If you skip the category, common is used.

Editor GUI

Creating a chest (or running /dd editor <name>) opens a menu to edit its properties. Changes made from the GUI are saved to that drop's file. The whole editor (buttons, submenus and the messages it asks for in chat) shows up in the language set in config.yml → language.

ButtonWhat it does
Edit NameType the new colored name in chat (cancel to cancel). Renaming a chest now also updates its internal identifier: the one used by /dd editor, tab-completion and the drop's .yml file name always match the current name, and any fixed spawn points created for that chest are moved over automatically. If another chest already resolves to the same plain name, the rename is refused and you're told so in chat.
Edit RarityLeft-click +1 star, right-click -1 star.
Edit CategoryCycles through the categories in categories.yml.
Edit RewardsOpens a real 54-slot inventory where you can take out existing items and place new ones. Whatever is left inside when you close it is saved as that chest's rewards.
Commands on OpenAdds commands that run every time the chest is opened. You can use %player% and PlaceholderAPI placeholders.
Plugin LanguageShows every language and, when you pick one, changes and saves config.yml → language for the whole plugin.
Chest Type / Inventory TypeOpens the block type and inventory type selectors (see Block/inventory type).
Chest FlagsToggles each special chest flag with a click. See Chest Flags.
Inventory SizeSets that chest's own inventory size (9 to 54 slots).
Pre-spawn ParticlesOpens the selector for the particles seen before the chest appears. See Pre-spawn particles.
Spawn AnimationOpens the selector for the animation played when the chest appears. See Spawn animation.
Persistent ParticlesOpens the selector for the particles that stay around the chest. See Persistent particles.
CloseCloses the editor.

Effect selectors

The three effect buttons open a menu with the same layout as Chest Flags:

The particle lists only show the ones your Minecraft version recognizes, and leave out the ones that need extra data (like BLOCK, ITEM or DUST). Values that can only be typed by hand, like the amount or the seconds, are edited in the drop's file.

The GUI's buttons can be customized through the files in /gui: material, name, lore, slot, head/texture, sounds, actions and decorations, depending on the menu.

Block and inventory type

The editor includes a separate inventory to change each chest's block type and InventoryType. The selection is saved as an individual type-override once enabled.

The selector can offer chests, trapped chests, barrels, ender chests, colored shulker boxes, dispensers, droppers and hoppers, plus their compatible inventory types.

type-override:
  enabled: true
  block-type: CHEST
  inventory-type: CHEST
The global type is set in config.yml → chest.block-type and chest.inventory-type. The override only changes a single drop.

Custom inventory size

Independent of the inventory type, each drop can define inventory-size (in slots) to use a size different from the global chest.rows:

inventory-size: 54   # -1 = use the global chest.rows value

This only applies when the resolved inventory type is CHEST (other types like BARREL, SHULKER_BOX or ENDER_CHEST have a fixed size set by Minecraft). Any value is automatically rounded up to the nearest valid multiple of 9 between 9 and 54 — for example, 32 becomes 36, and 52 becomes 54. Also editable from the editor's Inventory Size button.

Chest Flags

DonaDrops has two independent flag levels, always using the same identifiers (lowercase, kebab-case):

A flag is active for a chest if it's in global-flags, or if it's in that drop's own chest-flags (or both). You don't need to repeat a flag on every drop if it's already active globally.

Global flags (config.yml)

By default, config.yml ships with only these two enabled, since they're meant to be necessary on practically any server:

global-flags:
  - "explosion-protect"
  - "solid-ground-only"

It's a free-form list: you can add any other flag from the table below so it applies to every chest, or remove the ones already there (even leave it empty). The tolerance for solid-ground-only is still set in spawn-restrictions.solid-ground-tolerance, whether the flag comes from here or from an individual chest-flags list.

Per-chest flags (chest-flags)

Every new drop is created with this flag enabled by default, so a freshly-created chest stays permission-protected until an admin deliberately turns it off:

chest-flags:
  - "permission-required"

It can be freely edited from the editor's Chest Flags button (which now also warns when a flag is already forced globally), or directly in the drop's file.

Currently implemented flags

These 8 flags already work in the plugin and can be used today, in both global-flags and chest-flags:

FlagEffect
solid-ground-onlyAutomatic spawning only picks solid, natural, reachable ground. It checks against Minecraft's native heightmap that ignores leaves (MOTION_BLOCKING_NO_LEAVES), and discards any position that sits well above the natural terrain (tolerance in spawn-restrictions.solid-ground-tolerance). This is what keeps chests from spawning in treetops or random roofs. Doesn't affect manual /dd spawn. Enabled globally by default.
explosion-protectThe chest block is immune to explosions (TNT, creepers, beds, etc.). Enabled globally by default.
fire-protectThe block never catches fire or is destroyed by nearby fire.
permission-requiredAlso requires donadrops.opendrop.<category> to open it (see Permissions). Enabled by default on every new chest.
unbreakableThe block can never be broken/mined, not even by staff with donadrops.spawn. It only disappears via appear-seconds or by command.
piston-immunePistons can't push or pull the chest block.
silent-spawnNo chat message, title or sound is sent to the server when that chest spawns automatically.
no-hologramNo floating hologram is shown above that chest.

Other flags that could be added

Besides the 8 that already ship, here's a list of ideas for a reward-chest plugin — things that sound good for later on. None of the ones marked "Suggested" do anything yet; they're here so you can pick which ones you'd like to request in a future update.

FlagStatusEffect (proposed)
solid-ground-onlyAvailableOnly spawns on natural, reachable ground, never in treetops or roofs.
explosion-protectAvailableImmune to explosions (TNT, creepers, beds).
fire-protectAvailableImmune to nearby fire, never burns.
permission-requiredAvailableRequires a category permission to be opened.
unbreakableAvailableCan't be broken/mined by anyone.
piston-immuneAvailablePistons can't move it.
silent-spawnAvailableDoesn't announce its spawn with chat/title/sound.
no-hologramAvailableDoesn't show a floating hologram.
no-mob-spawn-nearbySuggestedPrevents hostile mobs from naturally spawning near the chest while it's active.
no-water-flowSuggestedNearby water can't flow over the chest block or push it.
no-lava-flowSuggestedNearby lava can't flow over the chest block.
hopper-immuneSuggestedHoppers can't pull items out of the chest before a player "really" opens it.
no-block-place-aboveSuggestedPrevents placing blocks above the chest while it's active, so it stays reachable.
anti-grief-radiusSuggestedBlocks breaking/placing blocks within a configurable radius around the chest.
no-redstone-triggerSuggestedIgnores nearby redstone signals (pistons are already covered separately; this would be for other mechanisms).
glowing-outlineSuggestedThe block glows with an outline (Glowing effect) so it's visible through walls.
beam-particleSuggestedA vertical column of particles above the chest, visible from far away.
compass-trackingSuggestedNearby players get a compass pointing to the chest while it's active.
boss-bar-timerSuggestedShows a boss bar with the time left until despawn, instead of (or alongside) the hologram.
action-bar-proximitySuggestedShows an action-bar notice to players who get close enough.
require-empty-handSuggestedCan only be opened with an empty hand, to avoid accidental openings while building.
require-item-to-openSuggestedRequires a specific item (a "key") in the inventory to open it.
consume-key-on-openSuggestedPaired with the previous one: consumes one unit of that key when the chest is opened.
one-per-playerSuggestedEach player can only open/claim that drop once (per session, per day, or forever, depending on configuration).
one-opener-onlySuggestedThe first player to interact keeps the chest; everyone else sees it as already claimed.
party-shared-lootSuggestedWhen opened, hands out a copy of the loot to every nearby player, not just whoever interacted.
no-despawnSuggestedIgnores appear-seconds: the chest never disappears on its own, until it's opened or removed by command.
respawn-on-openSuggestedOnce opened and claimed, automatically respawns at another valid location.
max-one-active-per-worldSuggestedNever lets more than one copy of that drop be active at the same time in the same world.
vip-onlySuggestedCan only be opened by someone with a configurable VIP permission, in addition to donadrops.open.
staff-onlySuggestedFully restricted to players with staff permissions.
require-daytimeSuggestedCan only be opened during the day in that world.
require-nighttimeSuggestedCan only be opened at night in that world.
require-clear-weatherSuggestedCan only be opened if it isn't raining/storming.
require-stormSuggestedCan only be opened during a storm, for themed events.
restrict-y-levelSuggestedAutomatic spawning only picks Y heights within a range of its own for that drop (different from the global one).
restrict-biomeSuggestedAutomatic spawning only picks points within a list of allowed biomes.
underwater-onlySuggestedOnly spawns at positions submerged in water, for ocean-themed drops.
cave-onlySuggestedOnly spawns at underground positions, without a direct view of the sky.
double-loot-weekendsSuggestedDoubles reward amounts when the spawn happens on a weekend.
notify-nearby-onlySuggestedThe spawn notice (chat/title/sound) only reaches players within a radius, not the whole server.
broadcast-serverwideSuggestedForces the spawn notice to the whole server even if the world has a different default setting.
silent-openSuggestedDoesn't play a sound/particles when opened or claimed, only when it spawns.
no-particlesSuggestedDisables both the spawn particles and the claimed-loot particles for that chest.
reveal-on-proximitySuggestedThe block stays invisible/hidden until a player enters a configurable radius.
auto-relocate-if-blockedSuggestedIf the block ends up covered or unreachable after spawning, it automatically looks for a new valid position.
cooldown-bypassSuggestedIgnores spawn-system's global cooldown, useful for special event drops.
priority-spawnSuggestedGets priority over other drops when choosing what to spawn when they compete for the same spawn attempt.
no-fall-damage-nearSuggestedCancels fall damage for players who land right on top of the chest.
webhook-notifySuggestedSends a notice to an external webhook (e.g. Discord) when the chest spawns or is claimed.
log-claimsSuggestedLogs every time that drop is claimed to a file/console, with the player and coordinates.

Per-chest flags are toggled from the editor's Chest Flags button, which shows each flag's status, whether it's already forced globally, and a short description. Global ones are edited directly in config.yml.

Spawn zones

DonaDrops lets you define regions where chests are allowed to spawn. Zones are automatically saved in the /zones folder, one .yml file per zone.

Selecting Pos1 and Pos2

  1. Run /dd zonewand to get the DonaDrops iron axe.
  2. Left-click a block: Pos1.
  3. Right-click a block: Pos2.

You can also use /dd pos1 <x> <y> <z> [world] and /dd pos2 <x> <y> <z> [world].

Creating and confirming

With both positions selected, run /dd createzone <name>. DonaDrops will show Click to confirm; clicking it creates the zone. Enabled zones can't overlap with another enabled zone.

Zone file

enabled: true
world: "world"
pos1:
  world: "world"
  x: 100
  y: 60
  z: 100
pos2:
  world: "world"
  x: 200
  y: 100
  z: 200
max-chests: 5
allow-manual-spawn: true

If a world has at least one enabled zone, DonaDrops's spawns in that world must land inside an enabled zone. If no zones are enabled in that world, the world keeps its normal behavior.

/dd deletezone <name> deletes the zone's file and removes any active chests that were inside it; afterwards, that world is free of that restriction again.

Automatic spawning

Controlled in config.yml → spawn-system: global cooldown, per-drop cooldown, maximum active chests, search attempts and height (Y) range.

spawn-system:
  enabled: true
  global-cooldown-seconds: 60
  max-active-chests: 10
  search-attempts: 40
  min-y: -64
  max-y: 320
  near-players: true
  near-players-radius: 60

min-y and max-y never exceed the world's real height: on 1.20 and newer the overworld goes from -64 to 320, but the Nether and the End go from 0 to 256, so there the default -64 simply gets clamped to 0.

If the world has an enabled zone, DonaDrops always tries to spawn chests inside that zone. If there's no enabled zone, near-players is used: a connected player is picked at random and the chest appears within near-players-radius blocks of them.

DonaDrops never loads or generates a chunk just to check a possible spawn point: if the candidate position falls in a chunk that isn't loaded, it's simply discarded and another one is tried.

Min/max amount per item

Each reward stores min-amount and max-amount in its .yml file inside /drops. When the chest is opened, that item's final amount is rolled at random between those two numbers. If you don't edit them, both stay equal to the amount of the item you added (no variation). Edit them directly in the drop's file:

rewards:
  0:
    item: ...
    chance: 100.0
    min-amount: 1
    max-amount: 4

Reward lore

The additional description (lore) for the reward is automatically displayed on the items while they are in the chest's loot inventory; once the reward is retrieved, the item retains the lore.

reward-lore:
  enabled: true
  lines:
    - "&7Rarity: &f{rarity-name}"
    - "&7Probability: &f{rarity-probability}%"

Lines respect the colors exactly as you write them: & codes, exact hex (&#FFD700) and MiniMessage tags, gradients included.

The lore is stored internally along with a marker so that items sharing the same lore configuration stay compatible with each other. As soon as the item actually leaves the chest, DonaDrops removes the marker and the lines it added: this is checked on every click and drag while the loot GUI is open, again the moment it's closed, and once more on whatever gets dropped to the ground - including pressing the drop key (Q) directly on a slot inside the chest, which sends the item straight to the ground without ever passing through the player's own inventory. That last case used to be missed, leaving the lore stuck on a dropped item; it's covered now too.

config.yml

Controls global behavior: baseline spawn probability, seconds to wait before it can be opened, star symbol, default title (automatically centered), global block/inventory type, global flags (see Chest Flags), spawning outside the world border, per-action sounds, messages/titles with %x% %y% %z% %world% %name%, reward lore, visibility distance, each GUI's decorative panels and reusable textured heads.

SectionWhat it controls
generalBaseline probability, lock time, star symbols, star colors and default title.
global-flagsList of flags automatically applied to every chest (see Chest Flags). Default: explosion-protect and solid-ground-only.
zonesDefault values for new zones, like max-chests and allow-manual-spawn.
chestBlock and inventory used by chests without their own type-override.
reward-loreEnables/disables and customizes, line by line, the lore shown on rewards inside the chest.
visibility-distanceMaximum visibility distance of the chest and its hologram. Default: 50.
hologramEnabled, height, lines ({name}/{stars}), text shadow and scale.
soundsSound per action: spawn, open, locked, loot claimed, GUI click.
pre-spawn-particlesParticles seen a few seconds before the chest appears (see Pre-spawn particles). Default: type: none.
spawn-particlesParticles that stay around the chest while it's in the world (see Persistent particles). Default: type: none.
particlesParticles played when all the loot is claimed (see Sounds, titles and particles). Default: EXPLOSION_LARGE.
(animation)spawn-animation isn't in config.yml: it's set on each drop (see Spawn animation).
messagesTitle, subtitle and chat messages when a chest spawns and when it's claimed.
gui-fillersEach menu's decorative panel: material, name and which slots it fills (border, a comma-separated list of slots, e.g. "0,1,7,8", or ranges like "0-8,25-26").
spawn-systemAutomatic spawning: global cooldown, max chests, search attempts, Y range and near-players (see Automatic spawning).
spawn-restrictionssolid-ground-tolerance: how many blocks above natural terrain the ground is still accepted when the solid-ground-only flag is active.
worldguard-compatibilityWith enabled: true, players need USE permission in the WorldGuard region to open a chest. Defaults to false.
leaderboardsLeaderboard inventory size, player slots and the back-button slot.
leaderboardplayer: material, head/texture, name and lore for positions already taken by a player, shared across every leaderboard. The item for empty positions (empty) no longer lives here: it's configured separately in each /gui file (see GUI and ranking files).
custom-headsBase64 textures reusable across the /gui menus.

categories.yml

By default: common, rare, epic, elite, legendary, each with its own weight. You can add, remove or rename categories freely; the plugin reads them dynamically. The weight is available for any category-based rolling system you want to build on top of this data.

The same file also has a separate section, drop-items:, for the rarity of individual items inside a chest. See Item rarity.

/drops/<name>.yml files

Each chest has an editable file with its name, rarity, category, language, timings, commands on open, rewards, amounts, spawn effects and block/inventory type settings.

open-delay-seconds: 3
appear-seconds: 300

commands:
  - "give %player% diamond 1"

type-override:
  enabled: true
  block-type: CHEST
  inventory-type: CHEST

inventory-size: 54

# Spawn effects (see "Chest spawn effects").
# -1 = use config.yml, none = no effect.
pre-spawn-particles:
  type: -1
  seconds: -1
  count: -1

spawn-animation:
  type: none
  duration-ticks: 30

spawn-particles:
  type: -1
  count: -1
  interval-ticks: -1

# TIP: false (default) = this chest can spawn wherever the automatic
# spawner picks. true = it ONLY spawns at the fixed points created with
# /dd createspawn <spawnName> this_chest (see "Fixed spawn points").
spawn: false

chest-flags:
  - permission-required
  # No need to repeat solid-ground-only or explosion-protect here: they're
  # already active for every chest via config.yml -> global-flags. You can
  # add any other flag from the full list in the "Chest Flags" section.

rewards:
  0:
    item: DIAMOND
    chance: 100.0
    min-amount: 1
    max-amount: 4
    # rarity: a key from categories.yml -> drop-items: (see "Item rarity").
    # That rarity's probability gets multiplied with "chance" above.
    rarity: common

Commands can be added from the GUI or edited directly in the YAML.

The chest stays in the world until ALL the items in its loot inventory are taken out, or until appear-seconds elapses (whichever comes first). While it still has unclaimed loot, anyone can right-click it again to see what's left — it isn't re-rolled, it's the same loot generated the first time.

Item rarity

Besides the chest's own star rarity (1-5) and its category (common, rare...), each individual item among the rewards can have its own rarity. It's defined in categories.yml, under drop-items::

drop-items:
  common:
    display-name: "&7Common"
    probability: 100.0
  rare:
    display-name: "&9Rare"
    probability: 50.0
  epic:
    display-name: "&5Epic"
    probability: 25.0
  elite:
    display-name: "&6Elite"
    probability: 10.0
  legendary:
    display-name: "&e&lLegendary"
    probability: 3.0

You can create, delete or rename these categories freely. By default every new item is set to common with 100% probability (i.e., no extra penalty at all). The lower the assigned rarity's probability, the less likely that item is to appear: its own chance (set in the chest's file) gets multiplied by probability / 100.

It's edited in two ways:

The Edit Rewards screen now has an arrow (last slot) to return to the editor's main menu without losing your changes.

Drop Events

A Drop Event is a temporary wave of chests that appear much faster than normal. Each event is a separate file inside the /events folder (it's created on its own the first time, with an example called drop-event.yml). You can have as many events as you want: copy the file under another name and that name becomes the key used in /dd event start <name>.

# events/drop-event.yml
enable: false

auto-start: true
auto-interval-minutes: 60

spawn-interval-seconds: 5
total-chests: 20

groups:
  main:
    weight: 100
    drops:
      - "donadrops"

messages:
  start-chat: "&6&lDrops Event &fhas started! Keep an eye out for chests."
  start-title: "&6&lDrops Event"
  start-subtitle: "&7Special chests are spawning across the map!"
  finish-chat: "&6&lDrops Event &ffinished."
  finish-title: "&6&lDrops Event"
  finish-subtitle: "&7The event has ended. See you next time!"
  next-event-title: "&eNext Drops Event"
  next-event-subtitle: "&7Starts in &f%time%"
FieldWhat it controls
enableShips as false on purpose: review the event and turn it on when it's ready. It's the first option in the file.
auto-start / auto-interval-minutesIf true, the event fires on its own every so many minutes (every 1 hour by default) as long as enable is also true.
spawn-interval-secondsWhile the event is active, a new chest appears every so many seconds (5 by default).
total-chestsThe event ends on its own as soon as this many chests have spawned.
groupsEach group has a weight (relative to the other groups) and a drops list of chest names from your /drops folder. On every tick the plugin first rolls the group, then a random chest within that group. The factory example already points at the default donadrops chest: if you delete it or rename it, update these groups too.
messagesChat and title/subtitle messages when it starts and ends, plus the next-event notice (%time% is replaced with the remaining time, e.g. "1h 0m 0s").

Managed with /dd event start <name>, /dd event stop [name] and /dd event list. Only one event can be active at a time. While the event is running, every connected player sees a boss bar showing how many chests have spawned out of the total (it updates itself and disappears when the event ends).

To see how long until the next event (or the next random automatic chest), use the placeholders %donadrops_next_event_time% and %donadrops_next_chest_time% — see Placeholders.

Fixed spawn points

With /dd createspawn <spawnName> <chestName> you create a fixed spawn point, at your current location, tied to a specific chest. It's saved as a file inside the /Spawners folder, named <chest>_<spawnName>.yml:

# Spawners/donadrops_spawnroom.yml
spawn-name: "spawnroom"
chest: "donadrops"
world: "world"
x: 120
y: 68
z: -34

You can create as many points as you want for the same chest: you just need each one to have a different spawnName (that's why the file name combines chest + point name, so they never overwrite each other).

These points alone don't change anything yet: a chest still uses the normal random spawner until you set spawn: true in its own file inside /drops (see /drops files). Once set to true, that chest stops appearing anywhere random and only appears — automatically or manually — at one of its free fixed points.

Management: /dd listspawns [chestName] to see saved points, /dd deletespawn <file> to delete one.

Chest decoration

Each chest can show decorative panels around its rewards when a player opens it. These panels are purely visual: they can't be taken out, moved, or collected in any way (click, shift-click, drag or double-click to collect), no matter what material is used.

Configured per chest, inside its file in /drops, under the decoration section:

decoration:
  enabled: true
  material: GRAY_STAINED_GLASS_PANE
  name: " "
  lore: []
  slots: "border"
  glow: false
FieldWhat it controls
enabledTurns decoration on or off for that particular chest.
materialAny valid Bukkit Material, not just glass panes.
nameThe decorative item's display name (supports colors with &).
loreOptional lore, line by line.
slots"border" (automatically adapts to the inventory's size) or a comma-separated list of slots, e.g. "0,1,7,8,9,17".
glowAdds an enchantment glow without showing any enchantment on the item.
Every new chest created with /dd create includes this section automatically, with a basic border template (GRAY_STAINED_GLASS_PANE) ready to use. Rolled rewards are always placed in the remaining free slots: they never land on a decorative slot.

Languages

The /lang folder contains the available languages. Currently supported: en, es, pt, fr, de, it, ru, zh, ja and ko.

The language is global for the whole plugin. The editor's language selector shows every language row by row and clearly marks the one selected. Picking one, DonaDrops immediately changes config.yml → language (e.g., en becomes es) and saves the file. There's no separate language saved per drop/chest.

Translations cover chat messages, titles and notices, and every menu the plugin builds itself: the editor, Chest Flags (including each flag's description), chest type, inventory type, language selector, reward editor, the three effect selectors and the messages the editor asks for in chat. When the language changes, menus show in the new language as soon as they're reopened. Text you customize directly in the /gui files stays exactly as you wrote it.

Each file in /lang has these main sections:

SectionContent
general, create, spawn, help, notify, messagesCommand, notice and chat messages.
editorName and lore for each editor button (edit-name / edit-name-lore, and so on for each one, including edit-prespawn, edit-animation and edit-particles).
topsLeaderboard menu.
menusShared buttons (back, pages, selected), Chest Flags, chest type, inventory type, language, rewards, chat messages and the effect selectors.

If a text is missing in a language, the English one is used instead. To fix or add a translation, edit that language's file in /lang and run /dd reload. Text accepts &, hex and MiniMessage, and \n separates lore lines.

Visibility distance

The global visibility-distance option controls the maximum visibility distance of spawned chests and their holograms. The default value is 50.

visibility-distance: 50

Players outside that distance won't visually receive the chest block or its hologram; getting closer makes the chest show up again. The distance is measured from the chest's location.

Holograms

Every spawned chest has a hologram built with Display Entities (TextDisplay), without depending on any other hologram plugin. Configurable in config.yml → hologram: lines, height, scale and text-shadow. The hologram stays upright and rotates horizontally to face the player from any side, without tilting up or down.

Besides {name} and {stars}, the hologram can show the time left until despawn through the time variable set up for it.

If for some reason the hologram can't be created on your server, the plugin disables holograms without crashing and warns once in the console. The rest of the plugin keeps working normally.

Textured heads

To use a custom-textured head, set PLAYER_HEAD as the material and put the texture value in the texture field.

material: PLAYER_HEAD
texture: "TEXTURE_VALUE"

The texture value corresponds to the texture/Base64 value provided by the service or resource used for the head. This lets you set up custom heads without depending on the player being online.

If you're going to reuse the same head across several menus, it's more convenient to save the texture once in config.yml → custom-heads and reference it with head instead of texture:

# config.yml
custom-heads:
  empty-slot:
    texture: "TEXTURE_VALUE"
# gui/<file>.yml
material: PLAYER_HEAD
head: empty-slot

Player heads can also use the corresponding player's own skin whenever the menu needs to show a dynamic head.

Leaderboards (/dd tops)

The leaderboard system supports configurable inventories and positions with player heads, names, stats and lore.

Leaderboard data is stored in stats.yml. The available stats depend on the metrics the plugin implements.

GUI and ranking files

The gui folder uses a separate system for leaderboards. The main menu is stored in gui/categories.yml. Each ranking has its own YAML file so it can be designed independently.

Included files

gui/
├── categories.yml
├── most-opened.yml
├── rarity-ranking.yml
├── rarest-opened.yml
├── best-reward.yml
└── most-rewards.yml

/tops opens categories.yml directly. That selector's buttons use actions formatted as [opengui] menu-name. For example:

actions:
  - "[opengui] most-opened"

The names used in [opengui] match the file name without .yml. So [opengui] rarity-ranking opens gui/rarity-ranking.yml.

Designing each ranking

Each ranking file can have its own title, row count, player slots, back button, decoration and the item that fills positions still without a player. This lets you build a 27-slot, 36-slot, 45-slot or 54-slot menu without touching Java.

title: "&#C77DFF&lRarity Ranking"
rows: 4
fill-border: false
stat: rarity-score
player-slots: [10, 11, 12, 13, 14, 15, 16, 19, 20, 21]
back-slot: 31
items:
  border:
    slots: "0-8,27-30,32-35"
    material: GRAY_STAINED_GLASS_PANE
    name: " "
    lore: []
    actions: []
  empty:
    material: PLAYER_HEAD
    head: empty-slot
    name: "&#C77DFFAvailable Position"
    lore:
      - "&7Position: &f#%rank%"
      - "&7No player has reached this spot yet."
      - "&7Increase your rarity score to climb here."
    actions: []
  back:
    slot: 31
    material: ARROW
    name: "&#C77DFF&l« Back"
    lore:
      - "&7Return to the top categories."
    actions:
      - "[opengui] categories"

Decorations

Decorations are added like any other items.<name>. You can use glass, blocks, heads, decorative items, names, lore and actions. Decoration slots don't have to relate to the player slots in any way.

Instead of writing one item per slot, a single item can fill several at once with the slots field (instead of slot): it accepts "border", a comma-separated list ("0,1,7,8"), ranges ("0-8,25-26"), or a mix of both ("0-8,17,25-26"). A single glass pane plus a slot pattern is enough to decorate the whole border of the menu. If another item (like back) uses a slot that falls inside that pattern, that item is drawn afterward and sits on top of the decorative glass — it doesn't matter which order they're written in the file.

Positions without a player (items.empty)

Each ranking file can define its own items.empty: the item shown at any player-slots position that doesn't have a player assigned yet. It accepts material, texture or head (see Textured heads), name and lore, and the %rank% placeholder is replaced by that position's number. As soon as a player reaches that position, this item is automatically replaced by their head. If a ranking file doesn't define items.empty, DonaDrops falls back to a generic BARRIER.

Player slots

player-slots determines exactly where player heads will appear. The number of positions also determines how many players are shown in that menu. Want a Top 5? Put five slots. Want a Top 10? Put ten.

Menu size

rows controls the inventory's size. Chest-style menus support 1 to 6 rows, i.e. 9, 18, 27, 36, 45 or 54 slots. To apply a custom size, the inventory must be of type CHEST; the physical block used by the drops doesn't change this rule. Other inventory types keep their own fixed sizes and don't accept arbitrary sizes.

Returning to categories

items.back.slot is what actually decides where the back button shows up: to move it, change that slot. The old top-level back-slot is kept only as a fallback for when items.back isn't defined, but if both exist, items.back.slot always wins. Clicking the button returns to the menu defined by categories.yml.

Chest spawn effects

A chest can show three different effects when it spawns. They're independent: each one has its own section, its own options and its own list of values. In the order players see them:

#EffectWhen it's seenWhere it's configuredKey
1Pre-spawn particlesA few seconds before the chest appears.config.yml and each droppre-spawn-particles
2Spawn animationThe moment the chest appears.Only on each dropspawn-animation
3Persistent particlesWhile the chest is in the world.config.yml and each dropspawn-particles

All three ship disabled: type: none means there's no effect. To enable one, just change none to whichever name you want, without adding lines or touching indentation, or pick it from the Editor GUI's buttons. In a drop's file, -1 means "use the value from config.yml".

There are also the particles played when the last item is taken out of the chest (particles), which ship enabled: see Sounds, titles and particles.

1. Pre-spawn particles (before the chest appears)

These are the particles seen at the spot where a chest is about to appear, a few seconds before it spawns (3 by default). During that time the block isn't placed yet; once it ends, the chest appears and only then are the spawn message, title and sound sent. Works the same with automatic spawning, drop events and /dd spawn.

Ships disabled: in config.yml the type is none. To enable them, just change none to a particle's name.

# config.yml
pre-spawn-particles:
  type: none
  seconds: 3
  count: 12
  offset-x: 0.4
  offset-y: 0.6
  offset-z: 0.4

Each drop can have its own in its /drops file. On a new drop everything is -1, which means "use the same values from config.yml":

# drops/donadrops.yml
pre-spawn-particles:
  type: -1
  seconds: -1
  count: -1

For example, to make only that drop show flames for 5 seconds:

pre-spawn-particles:
  type: FLAME
  seconds: 5
  count: -1
FieldWhat it controls
typeThe particle's name. none = no particles (on a drop, this also turns them off even if config.yml has them enabled). -1 (drop only) = use config.yml's.
secondsHow many seconds they're shown before the chest appears. 0 = the chest appears immediately. -1 = use config.yml.
countHow many particles are emitted each time (every 5 ticks). -1 = use config.yml.
offset-x / offset-y / offset-zHow far the particles spread around the point. Only set in config.yml.
While the particles are playing, that position counts as occupied and also counts toward max-active-chests. If the chunk unloads or the spot gets occupied before it finishes, the chest doesn't appear. If the particle's name doesn't exist, END_ROD is used instead; if the particle needs extra data (like BLOCK or ITEM), a console warning is shown and the chest appears without waiting.

Particles available for pre-spawn-particles

These particles can be used in pre-spawn-particles.type. The second column gives a plain-language description of what each one produces.

ParticleWhat it does
ASHSmall ash particles that float through the air.
BLOCKShows block fragments/particles.
BUBBLECreates small floating bubbles.
CAMPFIRE_COSY_SMOKEProduces a soft campfire smoke.
CAMPFIRE_SIGNAL_SMOKEProduces a taller, denser campfire smoke.
CLOUDCreates soft cloud-like particles.
CRITCreates sharp critical-hit particles.
DAMAGE_INDICATORShows red damage particles.
DOLPHINCreates the watery particles associated with dolphins.
DRAGON_BREATHCreates a purple dragon's-breath cloud.
DRIPPING_HONEYCreates dripping honey particles.
DRIPPING_LAVACreates dripping lava particles.
DRIPPING_OBSIDIAN_TEARCreates dripping crying-obsidian tear particles.
DRIPPING_WATERCreates dripping water particles.
DUSTCreates colored dust particles.
DUST_COLOR_TRANSITIONCreates dust with a color transition.
ELECTRIC_SPARKCreates small electric sparks.
ENCHANTCreates the purple enchantment particle effect.
ENCHANTED_HITCreates particles similar to an enchanted hit.
END_RODCreates bright white End Rod particles.
ENTITY_EFFECTCreates colored entity-effect particles.
EXPLOSIONCreates a small explosion effect.
EXPLOSION_EMITTERCreates a larger explosion-emitter effect.
FALLING_DUSTCreates falling dust/block particles.
FIREWORKCreates firework-style particles.
FLAMECreates bright fire particles.
FLASHCreates a brief bright flash.
GLOWCreates glowing particles.
GLOW_SQUID_INKCreates glowing squid ink particles.
HEARTCreates heart particles.
INSTANT_EFFECTCreates instant-effect-style particles.
ITEMShows item-based particles.
ITEM_SLIMECreates slimeball item particles.
ITEM_SNOWBALLCreates snowball item particles.
LANDING_HONEYCreates honey particles on landing.
LANDING_LAVACreates lava particles on landing.
LANDING_OBSIDIAN_TEARCreates crying-obsidian tear particles on landing.
LARGE_SMOKECreates large smoke particles.
LAVACreates floating lava particles.
MYCELIUMCreates mycelium-like particles.
NAUTILUSCreates nautilus-related particles.
NOTECreates colorful musical note particles.
POOFCreates a small puff of particles.
PORTALCreates purple portal particles.
RAINCreates rain/water particles.
REVERSE_PORTALCreates reverse-portal-style particles.
SCULK_CHARGECreates sculk charge particles.
SCULK_SOULCreates sculk soul particles.
SHRIEKCreates the sculk shrieker particle effect.
SMALL_FLAMECreates small fire particles.
SMOKECreates regular smoke particles.
SNEEZECreates sneeze particles.
SNOWFLAKECreates snowflake particles.
SOULCreates blue soul particles.
SOUL_FIRE_FLAMECreates blue soul fire flames.
SPLASHCreates water splash particles.
SQUID_INKCreates dark squid ink particles.
SWEEP_ATTACKCreates the sweep-attack particle.
TOTEM_OF_UNDYINGCreates the Totem of Undying particle effect. TOTEM is also accepted as an alias.
TRIAL_SPAWNER_DETECTIONCreates the trial spawner detection effect.
VIBRATIONCreates a vibration particle effect.
WITCHCreates purple witch magic particles.

Particle names have changed between Minecraft versions. If you write one your server doesn't recognize, DonaDrops automatically tries its equivalent (e.g. TOTEM_OF_UNDYING and TOTEM, or DUST and REDSTONE). If a name doesn't exist on your version or is misspelled, a default particle is shown instead of stopping the spawn.

2. Spawn animation

This is a particle-based animation played the moment the chest appears (after the pre-spawn particles, if you have them enabled). Unlike the others, it's only ever set in each drop's file (or from the editor's button): it doesn't exist in config.yml.

Ships disabled. On a new drop the section is already written and ready to use; type: none means there's no animation. To enable it, just change none to an animation's name:

# drops/donadrops.yml
spawn-animation:
  type: none
  duration-ticks: 30

For example, changing none to meteor:

spawn-animation:
  type: meteor
  duration-ticks: 30
FieldWhat it controls
typeThe animation played when the drop appears. none = no animation.
duration-ticksHow long the animation lasts, in ticks. 20 ticks are roughly 1 second.

Each animation draws with its own particles, which is why it doesn't have a particle option. The particles you choose go in the other two sections: Pre-spawn particles and Persistent particles. Older drop files with particle and particle-count inside spawn-animation still load fine; those two lines are ignored and disappear the next time the drop is saved. An old spawn-animation: [] is equivalent to "no animation".

Available animations

Each drop can use one of the following values in spawn-animation.type.

AnimationWhat it does
noneNo animation.
rainCreates a rain of particles over the drop.
fallingCreates particles falling toward the drop.
sky-dropMakes particles descend from the sky toward the drop.
meteorCreates a meteor-style fall with fire and smoke.
spiralForms a spinning spiral around the drop.
vortexCreates a spinning, portal-like vortex.
circleCreates a ring of particles spinning around the drop.
helixCreates two spiral paths moving around the drop.
pulseExpands and contracts a ring of particles like a pulse.
burstForms a ring and ends with a burst effect.
implosionMakes the ring of particles collapse toward the drop.
fountainShoots particles up and outward like a fountain.
flame-pillarCreates a rising pillar of flame over the drop.
smoke-pillarCreates a rising pillar of smoke over the drop.
totemSurrounds the drop with Totem of Undying particles.
enchantCreates a dense aura of enchantment particles.
soulCreates a soul-flame aura around the drop.
portalCreates a portal-like particle aura.
end-rodCreates an End Rod particle aura.
lightningCreates an electric spark effect near the end of the animation.
fireworkCreates a firework-style particle effect.
snowCreates a snowflake effect.
descendMoves a ring of particles downward onto the drop.
liftMoves a ring of particles upward away from the drop.
spiral-downCreates a spiral moving downward.
spiral-upCreates a spiral moving upward.
expanding-ringStarts small and expands a ring of particles outward.
contracting-ringStarts large and contracts a ring of particles inward.
double-ringShows two spinning rings of different sizes.
orbitMakes particles orbit around the drop.
crossCreates a cross-shaped particle formation.
x-crossCreates an X-shaped particle formation.
starCreates a spinning five-pointed star.
waveCreates a moving wave of particles.
sweepMoves particles around the drop in a circular sweep.
beaconCreates a vertical beam of particles rising up.
rainburstCreates lots of particles falling from above around the drop.
ground-ringExpands a ring of particles at ground level.
shockwaveCreates a fast shockwave expanding from the drop.
haloCreates a spinning halo above the drop.
twinkleCreates sparkling particles at random positions around the drop.
constellationCreates a spinning particle formation similar to a constellation.

3. Persistent particles

These are the particles that stay around the chest while it's in the world, until the loot is claimed or the chest disappears. They aren't the spawn particles: those are seen before the chest appears, these afterward.

Ships disabled: in config.yml the type is none. To enable them, change none to a particle's name:

# config.yml
spawn-particles:
  enabled: true
  persistent: true
  interval-ticks: 10
  type: none
  count: 30
  offset-x: 0.4
  offset-y: 0.6
  offset-z: 0.4

Each drop can have its own. On a new drop everything is -1, which means "use the values from config.yml":

# drops/donadrops.yml
spawn-particles:
  type: -1
  count: -1
  interval-ticks: -1

For example, to make only that drop use totems (you can also add enabled, persistent and the offset-* fields to override them):

spawn-particles:
  type: TOTEM_OF_UNDYING
  count: 30
  interval-ticks: 10
FieldWhat it controls
enabledTurns persistent particles on or off.
persistenttrue = repeats every interval-ticks as long as the chest stays unclaimed. false = a single burst when it spawns.
interval-ticksHow many ticks between each re-emission of particles. -1 = use config.yml.
typeThe particle's name. none = no particles (on a drop, this also turns them off even if config.yml has them enabled). -1 (drop only) = use config.yml's.
countHow many particles are emitted each time. -1 = use config.yml.
offset-x / offset-y / offset-zHow far the particles spread on each axis. Optional on a drop: if you don't set them, config.yml's are used.

Drop files created with older versions that have spawn-particles: [] still work fine: [] is equivalent to "no particles".

Particles available for spawn-particles

These particles can be used in spawn-particles.type. The second column gives a plain-language description of what each one produces.

ParticleWhat it does
ASHSmall ash particles that float through the air.
BLOCKShows block fragments/particles.
BUBBLECreates small floating bubbles.
CAMPFIRE_COSY_SMOKEProduces a soft campfire smoke.
CAMPFIRE_SIGNAL_SMOKEProduces a taller, denser campfire smoke.
CLOUDCreates soft cloud-like particles.
CRITCreates sharp critical-hit particles.
DAMAGE_INDICATORShows red damage particles.
DOLPHINCreates the watery particles associated with dolphins.
DRAGON_BREATHCreates a purple dragon's-breath cloud.
DRIPPING_HONEYCreates dripping honey particles.
DRIPPING_LAVACreates dripping lava particles.
DRIPPING_OBSIDIAN_TEARCreates dripping crying-obsidian tear particles.
DRIPPING_WATERCreates dripping water particles.
DUSTCreates colored dust particles.
DUST_COLOR_TRANSITIONCreates dust with a color transition.
ELECTRIC_SPARKCreates small electric sparks.
ENCHANTCreates the purple enchantment particle effect.
ENCHANTED_HITCreates particles similar to an enchanted hit.
END_RODCreates bright white End Rod particles.
ENTITY_EFFECTCreates colored entity-effect particles.
EXPLOSIONCreates a small explosion effect.
EXPLOSION_EMITTERCreates a larger explosion-emitter effect.
FALLING_DUSTCreates falling dust/block particles.
FIREWORKCreates firework-style particles.
FLAMECreates bright fire particles.
FLASHCreates a brief bright flash.
GLOWCreates glowing particles.
GLOW_SQUID_INKCreates glowing squid ink particles.
HEARTCreates heart particles.
INSTANT_EFFECTCreates instant-effect-style particles.
ITEMShows item-based particles.
ITEM_SLIMECreates slimeball item particles.
ITEM_SNOWBALLCreates snowball item particles.
LANDING_HONEYCreates honey particles on landing.
LANDING_LAVACreates lava particles on landing.
LANDING_OBSIDIAN_TEARCreates crying-obsidian tear particles on landing.
LARGE_SMOKECreates large smoke particles.
LAVACreates floating lava particles.
MYCELIUMCreates mycelium-like particles.
NAUTILUSCreates nautilus-related particles.
NOTECreates colorful musical note particles.
POOFCreates a small puff of particles.
PORTALCreates purple portal particles.
RAINCreates rain/water particles.
REVERSE_PORTALCreates reverse-portal-style particles.
SCULK_CHARGECreates sculk charge particles.
SCULK_SOULCreates sculk soul particles.
SHRIEKCreates the sculk shrieker particle effect.
SMALL_FLAMECreates small fire particles.
SMOKECreates regular smoke particles.
SNEEZECreates sneeze particles.
SNOWFLAKECreates snowflake particles.
SOULCreates blue soul particles.
SOUL_FIRE_FLAMECreates blue soul fire flames.
SPLASHCreates water splash particles.
SQUID_INKCreates dark squid ink particles.
SWEEP_ATTACKCreates the sweep-attack particle.
TOTEM_OF_UNDYINGCreates the Totem of Undying particle effect. TOTEM is also accepted as an alias.
TRIAL_SPAWNER_DETECTIONCreates the trial spawner detection effect.
VIBRATIONCreates a vibration particle effect.
WITCHCreates purple witch magic particles.

Particle names have changed between Minecraft versions. If you write one your server doesn't recognize, DonaDrops automatically tries its equivalent (e.g. TOTEM_OF_UNDYING and TOTEM, or DUST and REDSTONE). If a name doesn't exist on your version or is misspelled, a default particle is shown instead of stopping the spawn.

Security and configuration

PLAYER_COMMAND runs with the permissions of the player who clicks the button, and CONSOLE_COMMAND runs as console. DonaDrops never turns player-typed data into commands on its own. Console actions should be limited to commands the administrator has configured and authorized.

Particles and animations are resolved against the installed Paper API. If a particle doesn't exist or is misspelled, a safe fallback is used instead of stopping the spawn. The production build also strips the compiler's debug metadata to reduce development information left in the bytecode. This doesn't replace server permissions, nor does it make reverse-engineering a Java plugin impossible.

RGB colors

All of the plugin's text and menus use RGB hex colors, e.g. &#FFF9B1. Bold is kept separate with &l: &#FFF9B1&lTitle. The classic color syntax (&0-&f) still works if you use it in your own configuration, but it no longer appears in any text the plugin ships by default.

GUI system (/gui folder)

Menu item names and lore respect whatever colors you write (&, hex and MiniMessage) and no longer render in purple italics by default. For italics, use &o.

Configurable inventories live in /gui/*.yml. The configuration lets you set the inventory's size, title, buttons, positions, materials, names, lore, heads/textures, decorations, sounds and actions.

items:
  close:
    slot: 34
    material: BARRIER
    name: "&cClose"
    lore:
      - "&7Closes this menu."
    actions:
      - "sound:UI_BUTTON_CLICK"
      - "close"
ActionFormatWhat it does
closecloseCloses the inventory.
messagemessage:&aTextSends a message to the player.
broadcastbroadcast:&6TextSends a message to the whole server.
titletitle:Title|SubtitleShows a title.
soundsound:UI_BUTTON_CLICKPlays a sound.
openguiopengui:topsOpens another menu.
player[player] commandRuns a command with the permissions of the player who clicked the button.
console[console] commandRuns a command from the console (see Security).

The editor's special buttons keep their behavior even if their visual properties are changed. Generic buttons can use any of the configurable actions.

The GUI system is built to allow broad customization: size, title, slots, materials, lore, heads, decorations, sounds and actions.

Sounds, titles and particles

Chest sounds and effects can be configured for different events: spawn, open, locked, reward, GUI click and other events supported by the configuration.

Particles when claiming the loot

When the last item is taken out of the chest, the particles from config.yml → particles are played (defaults to EXPLOSION_LARGE). Each drop can change these in its own particles section. They're different from the three spawn effects (see Chest spawn effects).

Persistent particles keep playing as long as the chest remains unclaimed and stop once all the loot is taken out.

Stars

Rarity stars have two independent colors: one for the earned stars and another for the remaining ones. Set in config.yml → general.star-color-filled and general.star-color-empty.

The same concept applies to how stars are shown in the GUI and in the hologram, so a 3-star chest can show its 3 filled stars in one color and the rest in another.

Time remaining

The time left before a chest disappears can be shown in the hologram. The remaining opening time can also be included in the cooldown message when a player tries to open a chest that's still locked.

Placeholders

DonaDrops registers its own PlaceholderAPI expansion automatically on startup (you need PlaceholderAPI installed, since it's already a required plugin). They all start with %donadrops_...% and work in any plugin compatible with PlaceholderAPI (scoreboards, tab list, other plugins' holograms, chat, etc.).

PlaceholderReturns
%donadrops_version%The plugin's installed version.
%donadrops_language%The currently configured language.
%donadrops_total_chests%Total number of chests registered in /drops.
%donadrops_active_chests%Number of chests currently spawned in the world.
%donadrops_chest_<name>_active%How many instances of that particular chest are spawned right now.
%donadrops_chest_<name>_rarity%That chest's rarity (1-5).
%donadrops_chest_<name>_category%That chest's category name (with colors).
%donadrops_event_active%yes/no, whether a drop event is currently running.
%donadrops_event_name%The active drop event's name (empty if there isn't one).
%donadrops_event_chests_spawned%Chests spawned so far during the active event.
%donadrops_event_chests_total%The active event's total-chests.
%donadrops_next_event_time%Formatted time (e.g. 45m 12s) until the next automatic event, across every configured event.
%donadrops_next_chest_time%Time left on the global cooldown before the automatic spawner can try to spawn another random chest.
%donadrops_next_event_seconds%The same, but in total seconds (useful for progress bars).
%donadrops_event_<name>_next_time%Time until THAT particular event's next automatic trigger.
%donadrops_player_opened%How many chests the player has fully claimed.
%donadrops_player_rarity_score%The player's accumulated rarity score (used in /dd tops).
%donadrops_player_rarest%The highest rarity that player has ever claimed.
%donadrops_player_rewards_total%Total number of items received from chests.
%donadrops_player_best_reward%The single biggest delivery (amount of the same item) they've received.

Inside the plugin itself (chat messages, titles, commands on open, holograms), you still use the same internal variables as always: %player%, %name%, %world%, %x%, %y%, %z%, {name}/{stars} in holograms, and %time% in a Drop Event's next-event-* messages.

Troubleshooting

The plugin doesn't start: check that PlaceholderAPI is installed. It's a required dependency of DonaDrops. Also check that the server runs a supported Java version (17 on 1.20 to 1.20.4, 21 on 1.20.5 to 1.21.x, 25 on 26.x) and that it's Paper 1.20 or newer, up to 26.3.

The Edit Rewards button doesn't do anything: as of v1.3.0 it should open a 54-slot editing inventory. You can remove existing rewards and place new items; changes are saved when you close it.

Empty positions in /dd tops don't show anything: check items.empty in that ranking's file inside /gui (see GUI and ranking files). Every position without a player is automatically filled with that item, and as soon as a player reaches it, it's replaced by their head and stats. If the file doesn't define items.empty, a generic BARRIER is used as a fallback.

I want to choose which worlds a drop spawns in: edit spawn-world in the drop's file. You can list several worlds separated by commas, e.g. spawn-world: worldcustom, world, world_nether.

I want a zone: use /dd zonewand or /dd pos1 + /dd pos2, then /dd createzone <name> and click the confirmation. To remove it, use /dd deletezone <name>.

/dd reload reports a YAML error: if a YAML file is broken, the reload should be treated as failed and the console should show the file and the line the problem is on, instead of falsely reporting that the reload finished successfully.

I can't open a chest that just spawned: check the time set in open-delay-seconds. The cooldown message can show how much time is left.

I want to change the chest's type: use the editor's Inventory Type selector, or set type-override on the drop.

I want a textured head: use material: PLAYER_HEAD and texture: "TEXTURE_VALUE".

Particles disappear before the chest opens: check the spawn particle settings; they should stay active as long as the chest hasn't been opened.

I don't see particles before the chest appears: they ship disabled. In config.yml → pre-spawn-particles, change type: none to a particle's name (and check that the drop doesn't have none in its own pre-spawn-particles.type). See Pre-spawn particles.

I don't see the animation or the particles around the chest: those ship disabled too. The animation is set on the drop (spawn-animation.type) and the persistent particles in spawn-particles.type. See Chest spawn effects.

Menus don't show up in my language: the language is changed in config.yml → language or from the editor's language button, and it's global. Any /gui menus you've edited keep the text you wrote. See Languages.

A sound or particle isn't working: check that the name matches the Minecraft/Paper version you're using.

A dropped reward still shows Rarity/Probability lore after I take it out of the chest: fixed in 2.0.10. Update the plugin - the lore is now removed the moment the item leaves the chest, including when it's dropped straight to the ground with the drop key (Q).

Renaming a chest makes /dd editor say it doesn't exist: fixed in 2.0.10. Renaming a chest now updates its internal identifier (and its .yml file) to match, so the name shown by tab-completion always works.

Edit Rewards shows Rarity/Probability more than once, or lines keep piling up: fixed in 2.0.10. The editor now shows a single, self-updating line for each.

Does it work on Minecraft 26.3? Yes. v2.1.0 is compatible with Paper 26.3. Remember that Minecraft 26.x requires Java 25 or higher.

The server freezes/crashes when a chest spawns: update to the latest version of the plugin; automatic spawning no longer forces chunks to load.