Documentation

Configuring the plugin (config.yml)

The plugin generates plugins/TunnelVision/config.yml on its first start. This page walks through every key, in the order they appear in the file. Nothing is computed inside the plugin itself: every command queries the analysis service (analysis-api.url) — the gateway (gateway.*) only feeds that service, it is not what makes the commands work.

In short

Two blocks really matter to get started: analysis-api.url + analysis-api.api-key (given to you when your access is created) so the commands work, and gateway.token so your CoreProtect history reaches the service. Everything else ships with defaults that suit most servers.

i

The comments below are translated for this page. The config.yml the plugin generates currently ships with French comments — the keys and values are of course identical.

1First run

  1. Drop the plugin (the .jar) into plugins/, with CoreProtect already installed and running. Start the server once: config.yml is generated with its default values.
  2. Fill in analysis-api.url and analysis-api.api-key with your service URL and the key handed over when your access was created (during the beta: via Discord or email — see API authentication).
  3. Generate a random gateway.token (replace CHANGE_ME) and pass it to the TunnelVision team along with the address to reach your server, so the central service can synchronise your history — how to connect securely (SSH tunnel or VPN, never a directly open port) is covered during onboarding.
  4. Restart the server. This plugin does not hot-reload its configuration (there is no reload subcommand) — any change to config.yml requires a restart.
  5. Check it with /tunnelvision status (in game): it should return the head of your CoreProtect history without an error.
!

The gateway token travels in clear over the network if you do not protect it: never expose it directly on the internet (gateway.bind: 0.0.0.0 without a firewall). An SSH tunnel or a VPN between your server and the central service is the only recommended route.

2CoreProtect database

Leave as is unless you use a custom schema. The database is only ever opened strictly read-only — the plugin never creates, modifies or deletes anything in it.

# Path to the CoreProtect database, relative to the server folder.
coreprotect-db-path: "plugins/CoreProtect/database.db"

# CoreProtect table names — only change these if your schema differs.
table:
  block: "co_block"
  user: "co_user"
  material-map: "co_material_map"
  world: "co_world"

3Local gateway (gateway)

A small read-only HTTP server, local to your machine, that serves slices of your CoreProtect history to the central service so it can keep its mirror up to date. It plays no part in any command (score, suspects, render, menu): those talk only to analysis-api.url. Without a valid token the plugin still starts — it simply disables the gateway and the daily sync, and says so in the logs.

gateway:
  bind: "127.0.0.1"       # local access only — recommended
  port: 8787
  backlog: 0
  threads: 4              # requests served in parallel
  token: "CHANGE_ME"     # required to enable the gateway
  max-page-size: 50000

4Analysis service (analysis-api / sync)

Required: nothing is computed in the plugin, every command queries this URL. The plugin disables itself on startup if it is empty.

analysis-api:
  url: "http://127.0.0.1:8000"   # your service URL (see the API docs)
  api-key: ""                  # tenant key, handed over once

# Automatic daily synchronisation to the central service (pure JVM, no external
# dependency): reuses gateway.token + analysis-api above, and catches up on the
# next start if the server was offline at the scheduled time.
sync:
  enabled: true

5Filters (scoring)

The default scope of /tunnelvision score, suspects and render — which sessions are relevant enough to be analysed, not how they are scored.

scoring:
  default-ore: "diamond"     # target ore when --ore is not given
  min-ore-blocks: -1        # -1 = internal default (1) · 0 = filter disabled
  ore-families: ""           # "" = diamond,ancient_debris · see below

ore-families: the families counted by min-ore-blocks, comma-separated — additive (a session is kept as soon as any single family reaches its threshold). Grammar: all (all ten families), -family (removes one), family:N (its own threshold). Coal is out of scope by default — it is the ore nobody ever investigates.

ExampleEffect
""Plugin default: diamond + ancient debris.
all,-coalEverything except coal.
diamond:1,emerald:3A threshold per ore.
all,coal:0A zero threshold removes the family (same as -coal).

6Reports (report)

Settings for /tunnelvision render and the in-game menu — delegated to analysis-api.url, and reusing the scoring.* filters above to decide which sessions show up.

report:
  output-subdir: ""          # subfolder of plugins/TunnelVision/figures/
  max-page-size-mb: 0        # 0 = the API applies its own default
  identify-by-default: true  # real names/coordinates by default

identify-by-default: true means /tunnelvision render produces identified renders unless you pass --anonymize to the command; set it to false to invert that behaviour (--identify stays available case by case).

7Commands and permission

A single permission controls everything: tunnelvision.admin (no access by default, not even for operators). Grant it to your moderators and above with a permissions plugin such as LuckPerms: /lp group moderator permission set tunnelvision.admin true.

CommandPurpose
/tunnelvision statusHead of your CoreProtect history (confirms everything is wired up).
/tunnelvision score <player> [window] [--ore family]A player's suspicion score over a period.
/tunnelvision suspects [window] [--min-score N] [--ore family]Sorted list of the most suspicious sessions.
/tunnelvision render <start> <end> [--identify|--anonymize] [--annotate|--no-annotate]Generates the 3D HTML rebuild.
/tunnelvision menuIn-game graphical interface (see the menu demo).

Need help

A question about a specific setting, or behaviour that does not match this page: Discord · contact@tunnelvision.fr.