Deterministic server-side ore obfuscation and seed-resilient world integrity for Minecraft servers.
Created by soymods.
Oreveil is a server-side Minecraft plugin that prevents x-ray and seed-assisted resource discovery by ensuring unrevealed ore data is never sent to the client in the first place.
Instead of trusting the client to ignore hidden blocks, Oreveil keeps the server authoritative and rewrites block updates before they reach players. Hidden ores are replaced with contextually valid host blocks such as stone, deepslate, or netherrack until normal gameplay legitimately exposes them. With ProtocolLib, cached hidden ore and salt positions are also rewritten in outgoing chunk data before delivery when the server runtime exposes compatible block-state IDs.
- Intercept outgoing chunk and block update traffic.
- Rewrite hidden ore states per-player before transmission.
- Prevent transient packet leakage that traditional x-ray tools depend on.
- Reveal ore only when it becomes legitimately exposed.
- Avoid proximity-based disclosure and similar side channels.
- Preserve vanilla-consistent behavior for ordinary mining and exploration.
- Maintain a server-authoritative record of protected ore positions.
- Support salted or non-vanilla ore placement strategies using a server-private salt so fake ore signals do not derive from the public world seed alone.
- Reduce the value of seed-cracking pipelines and pathing heuristics.
- Replace hidden ores with believable host blocks on a per-player basis.
- Keep legitimate exposed ores visible without globally revealing underground data.
- Support different host material behavior across the Overworld, Nether, and End.
- Define exactly which ore blocks are protected.
- Control what counts as exposure, including air, fluids, transparent blocks, and non-occluding neighbors.
- Reload rules in-game without forcing server owners to hand-edit config for every change.
- React to mining, explosions, fluids, pistons, placement, teleportation, and player movement.
- Keep the client view aligned with current reveal state as the world changes.
- Prime newly viewed areas so players do not gain value from stale underground information.
- Rewrite outbound single-block and multi-block update traffic on a per-player basis.
- Support ProtocolLib-backed transport when available, with a fallback sync path for compatibility.
- Rewrite cached hidden ore and salt positions in newly delivered chunks when the runtime exposes a compatible chunk format, then prime those chunks from a cached protected-ore index so exposed ores can be revealed correctly.
- Preserve a clean transport boundary for deeper packet integrations.
Oreveil is intended to neutralize or materially weaken:
- classic x-ray clients
- resource pack transparency exploits
- Baritone-assisted ore hunting strategies
- seed-cracking workflows that rely on predictable underground distribution
- packet leakage from naive server-side reveal implementations
The goal is to reduce adversarial clients back to standard survival constraints rather than trying to detect every cheat directly.
Oreveil is designed to be manageable from config files, an in-game admin GUI, and advanced commands.
- Use
/oreveilto open the admin GUI. Console users can use/oreveil help. - Use the GUI for the common setup flow: runtime toggles, protected ores, exposure rules, host blocks, xray profile, sync settings, diagnostics, and managed-world actions.
- Use commands for precise edits, diagnostics, console administration, and workflows that are easier to script.
- Use
/oreveil help <topic>for focused command examples. Topics includesettings,exposure,host,ores,profile,world, anddiagnostics. - Use
/oreveil inspectto inspect how a targeted block is currently classified and presented to the client. - Use
/oreveil diagnosticsto inspect packet rewrite counters, chunk priming counters, and cached ore/salt index sizes. - Use
/oreveil reset confirmto restore bundled defaults. Oreveil backs up the currentconfig.ymlfirst.
Run /oreveil in game as an operator or a player with oreveil.admin.
The GUI includes:
- runtime controls for obfuscation, reveal behavior, salted distribution, world generation, and transport mode
- protected ore toggles
- xray profile selection
- sync radius controls with plus/minus buttons and exact sign input
- exposure material selectors with paging
- dimension host block defaults and per-ore host overrides
- diagnostics refresh
- managed-world controls with confirmation screens for create, regenerate, delete, and default-world changes
- config reload
Compact status, inspection, and diagnostics:
/oreveil status
/oreveil inspect
/oreveil diagnostics
/oreveil reload
/oreveil reset confirmEditable scalar settings:
/oreveil
/oreveil settings
/oreveil settings controls
/oreveil get live_sync_radius
/oreveil explain salt_density
/oreveil set live_sync_radius 96
/oreveil toggle reveal_on_exposureProtected ores:
/oreveil
/oreveil ores
/oreveil ore add DIAMOND_ORE
/oreveil ore remove COPPER_ORE
/oreveil ore toggle ANCIENT_DEBRISExposure rules:
/oreveil
/oreveil exposure
/oreveil exposure adjacent add WATER
/oreveil exposure adjacent remove LAVA
/oreveil exposure transparent toggle GLASSHost block mapping:
/oreveil
/oreveil host
/oreveil host default NORMAL STONE
/oreveil host default NETHER NETHERRACK
/oreveil host override ANCIENT_DEBRIS NETHERRACK
/oreveil host override DIAMOND_ORE clearManaged world tools:
/oreveil
/oreveil world status
/oreveil world target oreveil
/oreveil world seed random
/oreveil world create
/oreveil world regenerate confirm- Built as separate Paper target jars for Minecraft
1.16.x,1.17.x,1.18.x,1.19.x,1.20.0-1.20.4,1.20.5-1.20.6,1.21.x, and26.x. - Runtime Java depends on the target jar: Java 16 for
1.16.x/1.17.x, Java 17+ for1.18.x-1.20.4, Java 21+ for1.20.5-1.21.x, and Java 25+ for26.x. - Integrates with ProtocolLib when installed. Runtime-incompatible chunk packet rewriting disables itself and falls back to chunk priming plus block update sync;
26.xcurrently uses that fallback path for full chunk delivery.
Use RELEASE_GATE.md before promoting a build.
This project is distributed under the custom Oreveil License (All Rights Reserved) in LICENSE.txt.
In short:
- Redistribution, modification, or re-uploading is not allowed without explicit written permission.
- Videos featuring the plugin are allowed, including monetized videos.
- Modpack and server-pack inclusion is allowed under the limits described in the license.
- The plugin is provided as-is without warranty.
git clone https://github.com/soymods/oreveil.git
cd oreveil
./gradlew buildArtifacts are written to build/libs/. Current versioned targets are:
oreveil-paper-26.x-<version>.jaroreveil-paper-1.21-<version>.jaroreveil-paper-1.20.5-1.20.6-<version>.jaroreveil-paper-1.20.0-1.20.4-<version>.jaroreveil-paper-1.19.x-<version>.jaroreveil-paper-1.18.x-<version>.jaroreveil-paper-1.17.x-<version>.jaroreveil-paper-1.16.x-<version>.jar
Use the dev-server script to build Oreveil, provision a disposable Paper server under build/dev-server/, install ProtocolLib, copy the plugin jar, accept the EULA, and start the server:
node scripts/dev-server.mjsTo run a specific target, set PAPER_VERSION; the script picks the matching Oreveil jar target automatically:
PAPER_VERSION=1.18.2 node scripts/dev-server.mjs
PAPER_VERSION=1.21.4 node scripts/dev-server.mjsIf 25565 is already in use, the script automatically picks the next available port and prints the join address. Use SERVER_PORT to pin a specific port:
PAPER_VERSION=1.18.2 SERVER_PORT=25566 node scripts/dev-server.mjsThen join the printed localhost:<port> from a client matching the Paper version under test. To auto-op your offline-mode test player on first setup:
MC_USERNAME=YourName node scripts/dev-server.mjsFor edit/test loops, use watch mode. It rebuilds, redeploys, stops the current dev server, and starts it again when source files change:
node scripts/dev-server.mjs --watchUseful options:
--reset-world: delete the disposableworld,world_nether, andworld_the_endfolders before starting.--no-build: skip Gradle build and deploy the existingbuild/libs/jar. Run./gradlew build -qfirst if you need fresh code in the jar.--prepare-only: download/provision the dev server and deploy the jar, then exit without starting Paper.PAPER_VERSION=<version>: run a different Paper/Minecraft version thangradle.properties; versions1.16.x,1.17.x,1.18.x,1.19.x,1.20.x,1.21.x, and26.xmap to matching published jar targets.PAPER_URL=<url>: use a specific Paper server jar URL instead of the Paper downloads API.PROTOCOLLIB_URL=<url>: override the default ProtocolLib download URL. By default the dev script uses ProtocolLib4.8.0for1.16.x/1.17.xand5.4.0for newer targets.OREVEIL_TARGET=<target>: deploy a specific versioned artifact target instead of inferring it fromPAPER_VERSION.SERVER_PORT=<port>: write a specific dev server port; when omitted, the script starts at25565and picks the next available port.JAVA_BIN=<path>orJAVA16_HOME/JAVA17_HOME/JAVA21_HOME/JAVA25_HOME: choose the Java runtime used to start Paper. The script requires exact Java 16 for1.16.x/1.17.x, Java 17 or newer for1.18.x-1.20.4, Java 21 or newer for1.20.5+, and Java 25 or newer for26.x.
In game, run /oreveil to open the admin GUI, then use Diagnostics after joining and moving around. For chunk-packet testing, confirm that chunk rewrite packet/entry counters increase and failures stay at 0, or that Oreveil logs one chunk rewrite disablement and continues using chunk priming on runtimes where full chunk rewriting is disabled.
src/main/java/com/soymods/oreveil/bootstrap/: plugin bootstrapsrc/main/java/com/soymods/oreveil/world/: server-authoritative world modelsrc/main/java/com/soymods/oreveil/exposure/: reveal and exposure logicsrc/main/java/com/soymods/oreveil/obfuscation/: packet rewrite pipelinesrc/main/java/com/soymods/oreveil/compat/: version-neutral compatibility contracts and adapter loadingsrc/compatModern/java/: modern compatibility adapter included in thepaper-1.21andpaper-26.xjarssrc/compatCaves/java/: shared compatibility adapter used by thepaper-1.16.x,paper-1.17.x,paper-1.18.x,paper-1.19.x,paper-1.20.0-1.20.4, andpaper-1.20.5-1.20.6jarssrc/main/java/com/soymods/oreveil/listener/: world and player event synchronizationsrc/main/java/com/soymods/oreveil/ui/: in-game admin GUIsrc/main/resources/: plugin metadata and configuration
| Component | Version |
|---|---|
| Plugin Version | 0.1.0 |
| Target Minecraft Version | 1.16.x-1.21.x, 26.x |
| Java | Versioned by target jar |
- Oreveil builds separate Paper target jars. The
paper-26.xjar uses Java 25 bytecode; thepaper-1.21andpaper-1.20.5-1.20.6jars use Java 21 bytecode; thepaper-1.16.xandpaper-1.17.xjars use Java 16 bytecode; thepaper-1.18.x,paper-1.19.x, andpaper-1.20.0-1.20.4jars use Java 17 bytecode. Paper1.16.xmust be started with Java 16 because the Paper patcher rejects Java 21. - The
paper-1.16.xjar falls back to pre-Caves-and-Cliffs materials where newer materials such as deepslate, copper, amethyst, and spyglass do not exist. - ProtocolLib transport is used automatically when available, depending on
transport.mode. - ProtocolLib chunk packet rewriting is best-effort. If the server or ProtocolLib exposes an incompatible chunk packet shape, Oreveil disables that rewrite path for the runtime and keeps the sync fallback active. The
paper-26.xjar disables full chunk packet rewriting by default and uses chunk priming plus block update sync.