
HiddenOre - Mining Drop Control
GITHUB • DOCUMENTATION • DISCORD
Overview - what HiddenOre does
Ore is normally a block sitting in your world, which means anyone with an x-ray client can see where it is. HiddenOre moves the value into ordinary stone instead: any managed block break can pay out an item, experience, or a command, decided based on what is configured the moment the block is broken.
Hidden rewards Stone and deepslate are managed by default. A break rolls your rules and pays at most one item reward.
Two discovery models Seeded veins sit at fixed positions derived from the world seed, so other plugins can detect them. Pure random rolls fresh on every break with nothing pre-placed.
Items, experience and commands Any rule can hand over items, grant experience, or run commands via the player or the console.
Optional ore removal Strip configured vanilla ores out of terrain as it generates.
Placement aware Player-placed blocks are tracked in chunk data and are not counted.
Integration surface A public service, a cancellable break event and a mutable drop event.
It is a mining economy first Ore removal is what makes it an anti-xray measure, and it is off until you turn it on. Out of the box it is already a working economy for coal, copper, iron, gold, redstone, lapis, diamond and emerald.
Compatibility - runtimes and Java
One jar covers all six runtimes, Minecraft 26.x+
Paper loads through the server's public PluginManager
Purpur same Paper-family load and unload paths
Leaf Paper-family fork, treated like Paper
Folia regionized scheduling, HiddenOre declares folia-supported
Canvas Folia fork, same regionized rules
Spigot loads through plugin.yml; jars that ship only paper-plugin.yml are refused
Commands and permissions
/hiddenore Paginated hover-and-click help menu
/hiddenore reload Validate and reload config.yml and language.yml
/hiddenore debug Toggle per-player reward-roll diagnosticsOne permission covers the whole tree:
hiddenore.admin Gives access to HiddenOre default: op
No subcommand takes arguments. debug requires a player, so the console cannot run it, it prints what each of your breaks is rolling, which is the fastest way to tune a config.
Configuration - default config.yml
auto_pickup_drops: false
suppress_block_drop_on_custom_drop: true
ore-removal:
# If disabled, no changes will be made to the world generation
enabled: false
# Global settings for all worlds excluding exceptions
global:
# If true, by default all ores will be removed from the world generation
default: true
# Exceptions for a specific ore from the default value
# accepted keys are:
# COAL_ORE, COPPER_ORE, IRON_ORE, GOLD_ORE, DIAMOND_ORE, REDSTONE_ORE, LAPIS_ORE, EMERALD_ORE
# DEEPSLATE_COAL_ORE, DEEPSLATE_COPPER_ORE, DEEPSLATE_IRON_ORE, DEEPSLATE_GOLD_ORE, DEEPSLATE_DIAMOND_ORE, DEEPSLATE_REDSTONE_ORE, DEEPSLATE_LAPIS_ORE, DEEPSLATE_EMERALD_ORE
# NETHER_GOLD_ORE, NETHER_QUARTZ_ORE, ANCIENT_DEBRIS
NETHER_GOLD_ORE: false
NETHER_QUARTZ_ORE: false
ANCIENT_DEBRIS: false
# Exceptions for specific worlds, keyed by their fully qualified world key
exceptions:
"minecraft:the_end":
default: false
"minecraft:the_nether":
default: false
NETHER_GOLD_ORE: true
NETHER_QUARTZ_ORE: true
ANCIENT_DEBRIS: true
blocks:
stone:
drop: cobblestone
deepslate:
drop: cobbled_deepslate
# In seeded mode, hidden veins are derived from the world seed: every position in the
# world either holds a vein block or it doesn't, deterministically, and mining a vein
# position pays out exactly once, ever.
# NOTE: in seeded mode vein placement is derived from the order of the drops list below.
# Reordering, inserting, or removing entries reshuffles all undiscovered veins.
veins:
# seeded - veins exist at fixed positions before being mined, so other plugins
# can detect and outline them, and each position pays out once, ever.
# pure_random - nothing is pre-placed; every eligible block break rolls fresh odds
# tuned to the same per-chunk statistics (veins_per_chunk and vein
# sizes below). Vein detection always comes up empty in this mode.
generation: seeded
# Whether blocks placed by players can yield hidden drops. When false, player-placed
# blocks are tracked (surviving pistons and restarts) and never pay out, closing the
# place-and-remine exploit.
allow_placed_blocks: false
discovery_sound:
sound: "BLOCK_BEACON_POWER_SELECT"
volume: 1.0
pitch: 1.0
# Safety limits: up to 64 veins per chunk and 256 blocks per vein for one rule,
# up to 1,024 worst-case target blocks across all item rules, and exp_drop up to 1,000.
drops:
- item: coal
veins_per_chunk: 2.2
vein_min_size: 5
vein_max_size: 20
min_y: 0
max_y: 320
fortune_multiplier: true
tool_tiers: [ WOODEN_PICKAXE, STONE_PICKAXE, COPPER_PICKAXE, IRON_PICKAXE, GOLDEN_PICKAXE, DIAMOND_PICKAXE, NETHERITE_PICKAXE ]
exp_drop: 2
- item: raw_copper
veins_per_chunk: 1.6
vein_min_size: 4
vein_max_size: 12
min_y: -16
max_y: 112
fortune_multiplier: true
tool_tiers: [ COPPER_PICKAXE, IRON_PICKAXE, GOLDEN_PICKAXE, DIAMOND_PICKAXE, NETHERITE_PICKAXE ]
exp_drop: 2
- item: raw_iron
veins_per_chunk: 1.8
vein_min_size: 4
vein_max_size: 12
min_y: -64
max_y: 320
fortune_multiplier: false
tool_tiers: [ COPPER_PICKAXE, IRON_PICKAXE, GOLDEN_PICKAXE, DIAMOND_PICKAXE, NETHERITE_PICKAXE ]
exp_drop: 0
- item: raw_gold
veins_per_chunk: 0.6
vein_min_size: 3
vein_max_size: 8
min_y: -64
max_y: 32
fortune_multiplier: false
tool_tiers: [ IRON_PICKAXE, GOLDEN_PICKAXE, DIAMOND_PICKAXE, NETHERITE_PICKAXE ]
exp_drop: 0
- item: redstone
veins_per_chunk: 0.9
vein_min_size: 4
vein_max_size: 8
min_y: -64
max_y: 16
fortune_multiplier: true
tool_tiers: [ IRON_PICKAXE, GOLDEN_PICKAXE, DIAMOND_PICKAXE, NETHERITE_PICKAXE ]
exp_drop: 1
- item: lapis_lazuli
veins_per_chunk: 0.5
vein_min_size: 3
vein_max_size: 6
min_y: -64
max_y: 64
fortune_multiplier: true
tool_tiers: [ COPPER_PICKAXE, IRON_PICKAXE, GOLDEN_PICKAXE, DIAMOND_PICKAXE, NETHERITE_PICKAXE ]
exp_drop: 5
- item: diamond
veins_per_chunk: 0.5
vein_min_size: 3
vein_max_size: 8
min_y: -64
max_y: 16
fortune_multiplier: true
tool_tiers: [ IRON_PICKAXE, GOLDEN_PICKAXE, DIAMOND_PICKAXE, NETHERITE_PICKAXE ]
exp_drop: 7
- item: emerald
veins_per_chunk: 0.35
vein_min_size: 1
vein_max_size: 2
min_y: -16
max_y: 320
fortune_multiplier: true
tool_tiers: [ IRON_PICKAXE, GOLDEN_PICKAXE, DIAMOND_PICKAXE, NETHERITE_PICKAXE ]
exp_drop: 7
# Example command drop (percentage chance only, rolled at break time)
# You can specify whether you want the command to be executed by the player, or console using "player:" and "console:"
# If you don't specify what it will run as, it will default to what you have execute_as set to
- type: command
commands:
- "player:say I rolled a player-level bonus!"
- "console:say %player% rolled a server-level bonus!"
- "give %player% diamond 1"
chance: 0.0005
min_y: -64
max_y: 320
execute_as: consoleCommands can use %player% %uuid% %world% %x% %y% %z%, plus PlaceholderAPI placeholders when it is installed. The configuration is hot reloaded on file save.
drops:
- item: itemname # Lowercase whatever follows minecraft:raw_iron
chance: 0.0069 # Maximum 6 decimal accuracy. Take the per chunk percentage spawn chance converted to a decimal between 0 and 1, and then divide by 19,816. This is going to make the drop feel really rare, but it makes mining result in the same amount of material on average given the same amount of time spent mining. However this assumes a player mining blind, but they search for ore, and have an instinct for where and how it spawns, meaning actual discovery is sometimes as much as 10 times the calculated drop chance, and if you are not super concerned about your interplayer economy, you can multiply the calculated chance by up to 10.
min_y: 0 # Supports a negative Y value
max_y: 320
fortune_multiplier: true
tool_tiers: [WOODEN_PICKAXE, STONE_PICKAXE, COPPER_PICKAXE, IRON_PICKAXE, GOLDEN_PICKAXE, DIAMOND_PICKAXE, NETHERITE_PICKAXE] # Remove the tiers you don't want to be able to mine this drop.
vein_max_size: 20 # Max possible size of a vein
exp_drop: 2You can also add commands as drops, for example if you want there to be a rare chance to mine a custom item that needs to be given via a command. Simply add the following into the drops object like an item:
# Example command drop (percentage chance only, not affected by enchantments/veins/XP)
# You can specify whether you want the command to be executed by the player, or console using "player:" and "console:"
# If you don't specify what it will run as, it will default to what you have execute_as set to
- type: command
commands:
- "player:say I rolled a player-level bonus!"
- "console:say %player% rolled a server-level bonus!"
- "give %player% diamond 1"
chance: 0.0005
min_y: -64
max_y: 320
execute_as: consoleOre removal, and what it is not
Hiding rewards in stone does not help if the real diamond ore is still in the wall. Set ore-removal.enabled: true and HiddenOre replaces configured ores with stone, deepslate or netherrack as terrain generates.
Off by default. Turn it on deliberately.
New chunks only. Existing terrain is never touched, and turning it back off does not restore anything already removed.
Per world. The defaults leave the End alone and keep Nether ores intact. World keys must be fully qualified, such as minecraft:the_nether a name-only key fails validation.
Iris dimensions can strip their own ores with hideOresForHiddenOre.
This is not packet obfuscation. HiddenOre does not disguise blocks on their way to the client, it removes them from the world. A smarter x-ray client cannot defeat that and equally, any ore you leave enabled stays fully visible to one.
Placeholders
Optional: PlaceholderAPI for placeholders in reward commands. Below are the placeholders HiddenOre ships with by default.
%hiddenore_available% : true or false, whether HiddenOre's runtime is published and serving.
%hiddenore_seeded% : true or false, whether veins.generation is set to seeded.
%hiddenore_drop-rules% : a plain number, the total entries under drops: in config.yml, item rules and command rules together.
Languages all 17 locale codes
English is selected by default. To switch, set locale in plugins/HiddenOre/language.yml:
locale: en_US
de_DE German (Germany)
es_ES Spanish (Spain)
fi_FI Finnish (Finland)
fr_FR French (France)
he_IL Hebrew (Israel)
it_IT Italian (Italy)
ja-JP Japanese (Japan)
ko_KR Korean (South Korea)
lt_LT Lithuanian (Lithuania)
nl_NL Dutch (Netherlands)
pl_PL Polish (Poland)
pt_PT Portuguese (Portugal)
ru_RU Russian (Russia)
tr_TR Turkish (Turkey)
vi_VI Vietnamese (Vietnam)
zh_CN Chinese (Simplified)
zh_TW Chinese (Traditional)Ready to create something amazing?
Join the MCModels community and start building your dream projects today.



