ajdnikov Dashboard

AnziLook Documentation

State Unreleased · 0.1.0Platform Paper · Folia 26.1 – 26.3Java 25Requires PacketEvents 2.14.0+

AnziLook is an anti-freecam and anti-ESP plugin for Paper and Folia 26.1 – 26.3. Freecam, x-ray and ESP run on the client, so the server can't detect them. AnziLook stops them a different way: it never sends a player what they couldn't legitimately see. Every player gets their own copy of the world, built from where they are.

AnziLook (anti-freecam) and AnziLock (the licensing system) are separate things with similar names.

Overview

  • Caves are sent as solid rock. Underground open space far from the player is filled in, so a freecam flying through the ground sees stone.
  • Ores, chests and spawners are hidden until the player is close, or (in the line-of-sight modes) until they can actually see them.
  • Structures disappear. Ancient cities, strongholds, trial chambers, mineshafts and buried treasure are disguised as terrain from far away.
  • Mobs and players underground are hidden from anyone too far away to see them, which stops ESP and tracers.
  • Sounds, particles and other effects from deep, distant positions are dropped, so they can't give away a base or a spawner.
  • Render distance drops underground, so a freecam can't fly out over a full view distance of caves.
  • Everything is editable in-game from a GUI. Edits save to config.yml (comments kept) and apply straight away, with no restart.
  • One jar for Paper and Folia, 26.1 to 26.3. It uses no server internals.

Requirements

  • Paper or Folia 26.1, 26.2 or 26.3 (the plugin declares api-version: '26.1' and folia-supported: true)
  • Java 25
  • PacketEvents 2.14.0 or newer, installed as its own plugin (it is not bundled)

Installation

  1. Install PacketEvents 2.14.0 or newer.
  2. Put AnziLook-0.1.0.jar in the plugins/ folder and start the server.
  3. The defaults protect the overworld right away. Run /anzilook in-game to look through the settings.
  4. If Paper's built-in anti-xray is on, turn it off (anticheat.anti-xray.enabled in config/paper-world-defaults.yml). AnziLook warns at startup when both are on, because they do the same work twice.

A noise-salt is written to the config on first start. It keeps fake-ore placement stable but unpredictable. Don't share it.

How It Works

Chunk data, block changes, light updates and effect packets are rewritten for each player as they are sent. Hidden blocks are replaced with a filler block (stone, deepslate below Y 0, netherrack in the Nether). As the player moves, AnziLook sends the real blocks around them, so to the player nothing looks different.

  • Reveal by distance. Anything inside a feature's reveal radius is sent as it really is.
  • Reveal by line of sight (BALANCED and STRICT modes). Ores, hidden blocks and entities are sent only when a ray from the player's eye reaches them. A chest behind a wall stays hidden even when it's close.
  • Mining reveals at once. When a block is broken, any hidden blocks it exposes are sent in the same moment, in every mode.
  • Block-entity data is held back for hidden blocks, so a chest or spawner can't be found from its contents or its mob.
  • Light is masked in deep sections, because torch and lava light outline caves and bases.
  • cave_air is always sent as plain air. The client can't tell the two apart; only "cave finder" cheats can.

Line-of-sight checks run on AnziLook's own worker threads against a shared snapshot of which blocks are solid, never on the main or region threads. Packet rewriting runs on the network threads. Settings are an immutable snapshot that is swapped in one step, so a change never applies halfway.

Performance Modes

Set with performance.mode, in the GUI, or with /anzilook mode <mode>. Changing the mode re-sends players' chunks. Caves and structures are revealed by distance in every mode.

ModeRevealUpdate rate and budgetCost
LIGHTDistance only (each feature's reveal-radius)Every 10 ticks; 256 blocks and 2,048 cave blocks per checkLowest
BALANCEDLine of sight, 3 rays per block and 2 per entity. Always shown within 2 blocks (entities 8)Every 5 ticks; 512 blocks, 4,096 cave blocks, 3,000 rays per checkMedium (default)
STRICTLine of sight, 9 rays per block and 4 per entity. Always shown within 1 block (entities 4)Every 2 ticks; 1,024 blocks, 8,192 cave blocks, 12,000 rays per checkHighest
CUSTOMUses the values under performance.custom: update-interval-ticks, max-reveals-per-update, max-cave-reveals-per-update, raytrace, rays-per-block, rays-per-entity, ray-budget, block-near-radius, entity-near-radiusYou choose
KeyDefaultDescription
performance.worker-threadsa quarter of the CPU coresThreads for line-of-sight work.
performance.live-apply-chunks-per-tick40After an edit or reload, chunks are re-sent at this rate, server-wide, so they don't all go out in one tick.
debugfalseExtra logging.

A player's check is skipped when they haven't moved and nothing in range has changed.

Config Layers

Each world reads its settings in layers. A key set in a more specific layer replaces the same key below it. Lists are replaced, not merged.

worlds.<world folder name>  →  environments.<NORMAL|NETHER|THE_END>  →  defaults

Out of the box:

  • Overworld: every feature on, using defaults.
  • Nether: netherrack filler; Nether ores (gold, quartz, ancient debris) and spawners/chests hidden up to Y 128; fortresses and bastions removed (replaced with air, since caves aren't masked there). Cave masking, light masking, view distance bands, entity hiding and effect dropping are off, because the Nether is one big open cave.
  • The End: off (enabled: false).

Block lists take block names, with or without minecraft:, and * wildcards such as *_shulker_box. Unknown names are logged on load. Example per-world override:

worlds:
  mining_world:
    ores:
      mode: NOISE
    view-distance:
      bands:
        - below-y: 20
          distance: 3

View Distance

Lowers a player's chunk send distance while they are deep underground. Players are never raised above the distance they normally have.

KeyDefaultDescription
view-distance.enabledtrueTurn height bands on.
view-distance.bandsbelow Y 0 → 4, below Y 40 → 6Below this Y, the send distance becomes this many chunks.
view-distance.hysteresis4Blocks a player must climb above a band's limit before it is lifted, so it doesn't flip back and forth at the edge.
view-distance.require-covertrueOnly lower the distance while something solid is above the player. Off: divers in deep oceans and players in open ravines get the cave distance too.

Ores and Hidden Blocks

Ores

Ores fully enclosed by solid blocks are sent as filler until the player is close enough.

KeyDefaultDescription
ores.modeHIDEOFF sends ores as they are. HIDE hides enclosed ores. NOISE also sends some enclosed stone as fake ores, so x-ray sees ores everywhere.
ores.max-y64Only ores at or below this Y are hidden.
ores.reveal-radius6LIGHT mode: ores this close are revealed.
ores.los-distance24BALANCED / STRICT: ores this close are revealed when the player can see them.
ores.blocksall overworld ores, raw iron and raw copper blocksBlocks treated as ores.
ores.noise.density0.02NOISE: fraction of enclosed host blocks sent as a fake ore (0.0 – 1.0).
ores.noise.host-blocksstone, deepslate, tuff, andesite, diorite, graniteNOISE: blocks that can be swapped for a fake ore.
ores.noise.fake-blocksdiamond, gold, iron, redstone, lapis, emerald oresNOISE: ores to fake.

Hidden blocks

Blocks that give away structures, dungeons and bases. They are sent as filler, with their block-entity data held back, until the player is close enough.

KeyDefaultDescription
hidden-blocks.enabledtrueTurn hidden blocks on.
hidden-blocks.max-y50Only blocks at or below this Y are hidden.
hidden-blocks.reveal-radius16LIGHT mode: revealed within this distance.
hidden-blocks.los-distance48BALANCED / STRICT: revealed within this distance when visible.
hidden-blocks.require-occludedfalseOnly hide blocks that are fully enclosed. Weaker, but never hides something in plain sight.
hidden-blocks.blockssee belowBlocks to hide.

Default list: spawner, trial_spawner, vault, chest, trapped_chest, barrel, ender_chest, *shulker_box, sculk_shrieker, sculk_catalyst, reinforced_deepslate, end_portal_frame, budding_amethyst, suspicious_sand, suspicious_gravel.

Filler and light

KeyDefaultDescription
filler.defaultstoneWhat masked blocks are disguised as.
filler.layersbelow Y 0 → deepslateDifferent filler by depth.
light.mask-block-lighttrueSend block light as dark in deep sections.
light.max-y0Sections at or below this Y are masked.
light.reveal-chunk-radius2Real light is sent within this many chunks.

Caves

The core anti-freecam layer. Underground open space is sent as solid filler until the player is within the reveal radius, so a freecam sees solid rock. A block counts as cave space when it isn't solid, gets no sky light, and has a solid block somewhere above it. Ravines and oceans open to the sky are left alone. Chests, signs and other block entities inside masked caves are held back too.

KeyDefaultDescription
caves.enabledtrueTurn cave masking on.
caves.max-y40Only caves at or below this Y are masked. Raise it if caves between Y 40 and the surface matter on your server.
caves.reveal-radius24Real caves are sent within this distance.
caves.disguise-enclosedtrueAlso disguise fully enclosed solid blocks that aren't plain rock: moss and rooted dirt in lush caves, sculk, dungeon cobblestone, dripstone, geode shells, buried bases. Without this, the linings outline every cave to x-ray and "base finder" cheats.
caves.plain-blockscommon rock, dirt, sand, terracotta, bedrock…Solid blocks left alone when enclosed, because they give nothing away.

Block changes far away underground stay masked too, so a base being built out of sight stays disguised.

Structures

Inside the pieces of the listed structures, every block that isn't natural terrain (bricks, planks, rails, wool…) is sent as filler until the player is close. Combined with cave masking, a freecam sees plain rock. Structure pieces are padded by 2 blocks, so things like mineshaft supports just outside a piece are covered too.

KeyDefaultDescription
structures.enabledtrueTurn structure hiding on.
structures.max-y50Only structure blocks at or below this Y are hidden.
structures.reveal-radius20Real blocks are sent within this distance.
structures.replace-withfillerfiller disguises as the depth filler. air removes the blocks (better where caves aren't masked, like the Nether).
structures.hideancient_city, stronghold, trial_chambers, mineshaft*, buried_treasureStructure keys to hide. * works, and datapack structures work too.
structures.natural-blocksair, water, lava, stone types, ores, dirt, amethyst, moss, sculk…Generated terrain that the structure rule never masks.

Entities

Anti-ESP for mobs, players, items, minecarts, item frames and so on. An entity at or below max-y is not sent to players further away than reveal-radius. In BALANCED and STRICT, an entity is shown up to los-distance only when the player can see it, and one behind a wall stays hidden even when it's closer than reveal-radius.

Always shown: glowing entities, anything the player is riding with, and anything the player fought in the last combat-seconds.

KeyDefaultDescription
entities.enabledtrueTurn entity hiding on.
entities.max-y40Only entities at or below this Y are hidden.
entities.reveal-radius32LIGHT mode: shown within this distance.
entities.los-distance64BALANCED / STRICT: visible entities are shown this far.
entities.types["*"]Entity types to hide.
entities.show-glowingtrueGlowing entities are always shown.
entities.combat-seconds10Entities you fought stay visible this long.

Hiding a player this way briefly removes and re-adds their tab-list entry.

Sounds and Effects

Effects at or below leaks.max-y are not sent to players further than leaks.radius blocks away. Entity sounds are dropped when the entity isn't on the player's client. Explosions that push the player are always sent.

KeyDefaultCovers
leaks.enabledtrueTurn effect dropping on.
leaks.max-y / leaks.radius40 / 32Depth and distance limits.
leaks.soundstrueSounds and entity sounds
leaks.particlestrueParticles
leaks.block-breakingtrueMining cracks
leaks.level-eventstrueDoors, spawner flames, block breaking (global events are always sent)
leaks.block-eventstrueChest lids, pistons, note blocks
leaks.explosionstrueExplosions

In-game Editor

/anzilook (or /al) as a player opens the editor. The main menu has:

  • Performance — mode, custom values, worker threads, re-send rate, debug.
  • Defaults, Overworld, Nether, End — one layer each.
  • Single worlds — overrides for one world.
  • Live stats and Reload from disk.

Each layer has General, View distance, Filler, Ores, Hidden blocks, Light, Caves, Structures, Entities and Leaks.

Controls

  • Left / right click changes a value.
  • Shift-left click opens a dialog to type an exact value.
  • Shift-right click or Q clears the value from this layer, so it inherits from the layer below again.
  • Block lists accept the block in your hand, or a typed name or pattern. Height bands and filler layers have their own editor. Structure keys and entity types are checked against the server's registries.

Every edit saves config.yml with its comments kept and applies at once. Edits that change masking re-send the chunks around affected players, debounced by one second and spread out by performance.live-apply-chunks-per-tick.

Spectators can't use the editor, because the game ignores inventory clicks in spectator mode. Switch game mode first.

Commands

Base command /anzilook, alias /al. All need anzilook.admin.

CommandDescription
/anzilookOpens the editor for a player; shows version and mode in the console.
/anzilook guiOpens the editor.
/anzilook infoVersion, mode and update interval.
/anzilook reloadRe-reads config.yml and re-sends everyone's chunks. If the file has an error, the previous settings are kept.
/anzilook mode <LIGHT|BALANCED|STRICT|CUSTOM>Changes the performance mode, saves it and re-sends chunks.
/anzilook statsChunks processed and average time per chunk, blocks masked (cave and structure), effects dropped, entity tracks blocked, blocks revealed, rays cast, and players and chunks tracked.

Permissions

PermissionDefaultEffect
anzilook.adminopAll /anzilook commands and the editor
anzilook.bypassnobodyReceives the real, unmasked world. Give it to staff who need to see everything.

Performance

Measured on Paper and Folia 26.3 test servers with the default settings:

  • Ore and block masking alone: about 0.4–0.7 ms per chunk.
  • With cave masking: about 1 ms per chunk.
  • With caves and structures: about 1.7–1.9 ms per chunk.

The work happens when a chunk is sent, not every tick. Sections with nothing to mask are skipped. Line-of-sight checks run off the main thread, have a ray budget per check, and are skipped for players who haven't moved.

What the tests showed

  • 95% of ores at or below Y 64 and 100% of hidden-list blocks were withheld from far away; nearby ones arrived with their block-entity data.
  • No structure blocks were visible beyond 20 blocks of a mineshaft (unmasked: several thousand), and no deep entities beyond 32 blocks.
  • In BALANCED and STRICT, a chest and zombie in view were sent; a chest behind stone, a buried ore and a sealed-in zombie were not. Mining toward the ore revealed it at once.
  • Against Wurst's CaveFinder and BaseFinder in a lush cave, hits beyond 24 blocks dropped from 6,148 to 0 and from 58,767 to 5.

Known Limits

  • Very fast movement (elytra, ender pearls, riptide) can outrun the reveal radius and briefly show filler before the real blocks arrive.
  • Caves above caves.max-y (Y 40 by default) are sent as they are. Raise the value if you need more cover.
  • Chunks a player already has keep the old rules until they are sent again. Edits in the GUI, /anzilook reload and mode changes re-send them for you; hand edits to config.yml need a reload.
  • Surface structures are not hidden by default. Add their keys to structures.hide and raise structures.max-y if you want them covered.

Getting a Build

AnziLook is not released. Ask for a build in the Discord server, and tell us your server software, version and Java version. See Projects for the other plugins on the bench.