A server-side Anti-ESP plugin for Paper servers that prevents players from using X-ray, ESP hacks, or texture pack exploits to see ores, containers, and other protected blocks through walls.
Built for the Zelthr server ecosystem.
Source: github.com/ZeWinny/zelthrSeeYou
zelthrSeeYou uses a chunk-level block substitution approach:
- For each online player, the plugin scans protected blocks within a configurable chunk radius.
- For each block, it performs a line-of-sight raycast (
rayTraceBlocks) from the player's eye position. - Blocks that are not directly visible are replaced with fake block data sent via
sendMultiBlockChange()— the actual world is never modified. - When the player gains line-of-sight, the real block data is restored transparently.
- When a new chunk is sent to the player, protected blocks in that chunk are immediately hidden via packet interception.
- Server-side only — no client mod required
- Chunk-based line-of-sight detection using
rayTraceBlocks - Fake block packet injection — the world is never modified
- Configurable protected block list (ores, containers, spawners, etc.)
- Per-world enable/disable
- Fake material substitution per environment (Overworld above/below y=0, Nether, End)
- Automatic variant expansion — listing
CHESTcovers all chest types;SHULKER_BOXcovers all colors; copper blocks cover all weathering stages - Supports both ProtocolLib and PacketEvents — uses whichever is available, disables itself if neither is found
- Block updates (place/break) trigger immediate re-evaluation for nearby players
| Dependency | Version |
|---|---|
| Paper API | 26.1.2 |
| Java | 25 |
| ProtocolLib or PacketEvents | ProtocolLib 5.4.0 / PacketEvents 2.12.1 |
At least one of ProtocolLib or PacketEvents must be installed. The plugin will disable itself on startup if neither is found.
- Build the plugin jar (see Building) or download a release.
- Place the jar in your server's
plugins/folder. - Ensure ProtocolLib or PacketEvents is also installed.
- Start the server —
config.ymlwill be generated automatically.
git clone https://github.com/ZeWinny/zelthrSeeYou.git
cd zelthrSeeYou
./gradlew buildOutput jar will be in build/libs/. Requires Java 25. Uses paperweight-userdev for NMS access.
# Enable or disable the plugin globally
enabled: true
# Worlds where Anti-ESP is active
enabled-worlds:
- world
- world_nether
- world_the_end
# Blocks that will be hidden when not in line-of-sight
protected-blocks:
- CHEST
- TRAPPED_CHEST
- BARREL
- ENDER_CHEST
- SHULKER_BOX
- SPAWNER
- TRIAL_SPAWNER
- VAULT
- COAL_ORE
- DEEPSLATE_COAL_ORE
- COPPER_ORE
- DEEPSLATE_COPPER_ORE
- DIAMOND_ORE
- DEEPSLATE_DIAMOND_ORE
- ANCIENT_DEBRIS
- GOLD_ORE
- DEEPSLATE_GOLD_ORE
- IRON_ORE
- DEEPSLATE_IRON_ORE
- REDSTONE_ORE
- DEEPSLATE_REDSTONE_ORE
- LAPIS_ORE
- DEEPSLATE_LAPIS_ORE
- EMERALD_ORE
- DEEPSLATE_EMERALD_ORE
- NETHER_GOLD_ORE
- NETHER_QUARTZ_ORE
- GILDED_BLACKSTONE
# Radius in chunks around the player where blocks are always evaluated
reveal-chunk-radius: 3
# How often in ticks to recalculate line-of-sight per player (minimum: 1)
update-interval-ticks: 4
# Maximum block changes sent to a player per update cycle (minimum: 16)
max-changes-per-update: 256
# What material to substitute for hidden blocks, per environment
fake-materials:
overworld-above-zero: STONE
overworld-below-zero: DEEPSLATE
nether: NETHERRACK
end: END_STONErayTraceBlocks is CPU-intensive and runs every update-interval-ticks ticks for every online player. Tuning update-interval-ticks (default: 4) is the most effective way to reduce overhead. max-changes-per-update caps how many block changes are sent per cycle if a player has many blocks entering or leaving line-of-sight at once.
See a real-world spark profiler report for a performance sample.