diff --git a/docs/bluemap.md b/docs/bluemap.md
deleted file mode 100644
index 9b52d5d..0000000
--- a/docs/bluemap.md
+++ /dev/null
@@ -1,76 +0,0 @@
-# BlueMap: the 3D map
-
-SCOPENET uses [BlueMap](https://bluemap.bluecolored.de/) for the 3D world map. BlueMap runs on each Minecraft server as a plugin or mod and serves the map on its own web address. SCOPENET adds to it, and the launcher shows it inside the app exactly as a browser would.
-
-## What you get
-
-| On the map | Where it comes from |
-|---|---|
-| **Guild claims** as coloured regions with the guild's icon and name (one colour per guild, outlines follow the real shape, holes included) | the claim index |
-| **Spawn, warps and guild homes** as pins | the server |
-| **Homes** as pins (off by default, see privacy) | the server |
-| **Markets and shops** as pins that list what is for sale | shop points + the panel's market |
-| **Players** with BlueMap's own live markers; **click one** for a side panel | BlueMap + SCOPENET |
-
-The player panel shows level, guild, rank, title, playtime and server level. Inside the launcher it also offers **Send teleport request**, **Send message** and **Invite to my guild** (you need to be signed in with a SCOPENET account, and the other player must be online on that server; inviting needs a leader or officer role). In a plain browser it shows the info and points you to the launcher for the actions.
-
-## Set it up
-
-1. **Install BlueMap** on the server: the Paper plugin, or the Fabric/Forge mod, from . Start the server once. BlueMap asks you to accept a download of the Minecraft client files in its config (`core.conf`: `accept-download: true`), then renders the world.
-2. **Make its web address reachable.** BlueMap serves on port 8100 by default. Put it behind HTTPS with a reverse proxy (recommended; see below) or open the port.
-3. **Install the SCOPENET plugin or Fabric mod** (Paper, or Fabric 1.20.1). It finds BlueMap by itself and adds its markers and script. Nothing else to configure.
-4. **Tell the panel the address:** *Servers → your server → Settings → Map address (BlueMap)*, for example `https://map.example.com`. Players then see a **Live Map** button for that server in the launcher.
-
-`bluemap.enabled` (Paper `config.yml`, Fabric `scopenet.properties`) turns the addon off. `bluemap.show-homes` / `bluemap.show_homes` shows every player's homes.
-
-## Shop points (physical shops)
-
-A shop point is a block that opens the market or the server shop when right-clicked. It works with the normal windows (chest window on Paper; the client mod's shop and market windows where installed) and appears as a pin on the map.
-
-```
-/market point add [market|shop] (look at a block; needs scopenet.command.market.point, default op)
-/market point remove
-/market point list
-```
-
-`market` opens the player market and lists recent listings on the map pin; `shop` opens the server shop.
-
-## Inside the launcher
-
-The launcher loads your map address in a frame, so everything BlueMap does in a browser works there too. SCOPENET's script on the map page passes player clicks to the launcher, which shows the side panel. A few things make it work or not:
-
-* **Use HTTPS.** Loading an `http://` map inside an HTTPS page can be blocked as mixed content on some systems.
-* **Don't forbid framing.** If your reverse proxy sends `X-Frame-Options: DENY` or a `Content-Security-Policy: frame-ancestors` that excludes the launcher, the map won't load in the app. Remove that header for the map address. The launcher's **Browser** button opens the same map in your browser either way.
-* The map address is checked by the panel (web address only, no credentials).
-
-## Privacy
-
-* The map is public to anyone who knows its address, like any BlueMap. **Homes are off by default** for that reason. Claims and guild names are visible by design.
-* `players.json`, which drives the browser panel, holds only public facts (name, level, title, guild, rank, playtime). Never balances.
-* Actions from the map go through the panel, are rate-limited, and need a signed-in account. A message or teleport request reaches only players who are online on that server.
-
-## Reverse proxy example (nginx)
-
-```nginx
-server {
- server_name map.example.com;
- listen 443 ssl;
- location / {
- proxy_pass http://127.0.0.1:8100;
- proxy_set_header Host $host;
- proxy_http_version 1.1;
- proxy_set_header Connection ""; # BlueMap uses server-sent events for live updates
- proxy_buffering off;
- }
-}
-```
-
-## How it works (for developers)
-
-* `net.scopenet.core.map` builds the map data without any map software: `ChunkRegions` turns chunks into outlines (tested with an area-conservation check), `MapModel` builds pins and regions and escapes every name, `MapService` gathers it from any thread.
-* `integrations/bluemap` (`MapAddon`) is the only code that touches BlueMap's API. It copies `scopenet.js`, `scopenet.css` and the icons into BlueMap's web root, registers them, and refreshes the marker sets every 10 seconds.
-* Map actions are queued in the panel (`server_actions`); the server collects them every 3 seconds (`ActionPoller`) and carries them out with its normal rules. Guild invitations are real invitations (`guild_invites`) that the other player accepts in the launcher or with `/guild accept`.
-
-## Not verified yet
-
-The BlueMap addon, the Paper and Fabric wiring, and the launcher's map view have not been compiled or run against a real BlueMap and Minecraft: the build environment cannot download them. The geometry, map model, shop points, action poller and guild-invite commands are unit-tested, and so are the panel endpoints. Build it, and report what BlueMap says in its log and what the map shows.
diff --git a/docs/deployment.md b/docs/deployment.md
index 81d2ab4..799e0d8 100644
--- a/docs/deployment.md
+++ b/docs/deployment.md
@@ -23,9 +23,8 @@ The panel listens on `PANEL_PORT` (default `8080`). Docker checks
`docker compose ps` before directing players to it. If `ADMIN_PASSWORD` is
blank on first start, the generated password appears in the panel logs.
-To show a 2D world map and claim land in the launcher, install BlueMap on the
-game server and configure its public web address in the panel. See
-[Live map setup](live-map.md).
+Servers draw their own world map and send it to the panel; nothing extra to
+install or host. See [The SCOPENET Map](map.md).
The named `panel-data` volume holds the database, uploads, hosted launcher
downloads, and the generated JWT signing key. Preserve that volume when
diff --git a/docs/live-map.md b/docs/live-map.md
deleted file mode 100644
index 38970a1..0000000
--- a/docs/live-map.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# Live map and land claims
-
-SCOPENET uses [BlueMap](https://bluemap.bluecolored.de/) for terrain. Install BlueMap on the Minecraft server and make its web app reachable from players' computers. In the panel's **Servers → server settings**, enter the BlueMap **Map address**. The launcher opens the same map in its Live Map window and reads BlueMap's low resolution 2D tile images for the Guilds territory view.
-
-The terrain address must serve BlueMap's `settings.json`, per-map `settings.json`, and low resolution PNG tiles from the same URL path. A URL such as `https://maps.example.com/` works. If BlueMap is hosted below a path, include the trailing slash, for example `https://example.com/bluemap/`.
-
-## Center on the player
-
-Turn on **Live player positions** in the server settings and leave `livemap.enabled: true` in the SCOPENET plugin or mod configuration. The game server sends current positions to the panel. The panel returns each signed-in player only their own position to the launcher. The **Find me** button centers the territory view on it; the blue dot marks their position. Positions expire when the server stops sending updates.
-
-The BlueMap map itself remains available when position relay is off. In that case, players can pan manually, but **Find me** is unavailable.
-
-## Claim controls
-
-In **Guilds & Territories**, select the game server and dimension. Left click a chunk to claim it for your guild, or drag across chunks to claim an area. Right click or right drag unclaims your guild's chunks. Alt drag pans; the wheel zooms. The overlay shows your guild's claims in green and other guilds' claims in red. The panel checks membership and claim limits for every request; only successful claims appear in the final map state.
-
-BlueMap must have rendered the area to show terrain. Claims can still be managed by the in-game `/claim` and `/unclaim` commands when the web map is unavailable.
-
-## Existing world mirror
-
-Older SCOPENET game integrations uploaded region chunks to the panel under `/api/server/v1/livemap`. The panel retains those ingest endpoints for compatibility with existing servers, but the launcher terrain comes from BlueMap. Current integrations send player positions only.
diff --git a/docs/map.md b/docs/map.md
new file mode 100644
index 0000000..27bc0c4
--- /dev/null
+++ b/docs/map.md
@@ -0,0 +1,44 @@
+# The SCOPENET Map
+
+Every server draws its own world map. There is nothing to install, host or configure besides the plugin or mod you already run: the game server renders its world to small tiles in the background, sends only what changed to the panel, and the launcher and admin panel show them in a fast native map.
+
+What's on it:
+
+- **Terrain** in the look of a Minecraft map, coloured from the real block textures (modded blocks get a matching colour). The Nether is drawn below its ceiling, so you see caves and lava lakes, not bedrock.
+- **Guild land** as coloured outlines with the guild's icon and name, holes and all.
+- **Spawn, warps, guild homes, markets and shop points** as pins you can click.
+- **Players online**, with their head and facing direction. Click one to open the player panel (profile, teleport request, message in game, invite to your guild).
+- **Dimensions**: Overworld, Nether and End tabs appear as soon as the server has drawn them.
+
+## Turn it on
+
+It is on by default for every server. To change it:
+
+1. In the admin panel open **Servers → your server → Settings** and use the **SCOPENET Map** switch.
+2. In the plugin/mod config: `map.enabled` (Paper `config.yml`) or `map.enabled=true` (Fabric `scopenet.properties`). The old `livemap.enabled` key is still read.
+
+The first tiles appear a minute or two after the server starts. The server draws the regions closest to players first, then works through the rest quietly in the background at low priority.
+
+## In the launcher
+
+Players with a linked server get a **Live Map** button on the Home screen. Pan by dragging, zoom with the wheel or the + and − buttons, double click to zoom in. Use the toggles to hide claims, places or players, **Online** to jump to a player, the crosshair to find yourself and the star to go to spawn. The **Guilds → Territory** claim painter uses the same tiles.
+
+## In the admin panel
+
+**Servers → your server** shows a map card with the number of tiles, how much space they use, when the server last sent something and the live map itself. **Redraw world** deletes the stored tiles; the server notices and draws everything again (useful after a world reset or a renderer update).
+
+## How it works
+
+- The game server reads its region files (`region/*.mca`), works out the top block of every column, and writes 256 × 256 pixel tiles at one pixel per block. Zoomed-out levels are built from them, keeping real map colours so coastlines and roads stay sharp.
+- Tiles are palette PNGs, so a typical tile is a few kilobytes. Only tiles that changed are uploaded, and a region is redrawn at most every 90 seconds while players are building.
+- The panel stores tiles under its data folder (`map//…`) and serves them to signed-in players only, with a short-lived key on every address and ETag caching.
+- Player positions go up about every two seconds; claims and pins whenever they change.
+- A local cache lives next to the plugin (`plugins/SCOPENET/map`) or mod (`config/scopenet/map`) so a restart doesn't redraw anything.
+
+Disk use is small: a world of 500 explored regions is roughly 50–150 MB on the panel. Servers using region files compressed with LZ4 (an opt-in setting in recent Minecraft versions) are not drawn; leave `region-file-compression` on its default.
+
+## Troubleshooting
+
+- **"Drawing the world…" never ends.** The server has to be connected to the panel with a valid token, have `map.enabled` on, and have its world folder readable by the Minecraft process. The server log says `SCOPENET Map is on` when it starts drawing.
+- **A flat grey or missing area.** The chunk was never generated, or is saved in an older world format (before Minecraft 1.18).
+- **Colours look off for a modded block.** Unknown blocks get a colour from their name; vanilla blocks use their texture colour.
diff --git a/docs/ranks-guilds-and-warps.md b/docs/ranks-guilds-and-warps.md
index 97a9df9..77ca413 100644
--- a/docs/ranks-guilds-and-warps.md
+++ b/docs/ranks-guilds-and-warps.md
@@ -12,7 +12,7 @@ Paper chat shows `[Guild tag] [Level title] [LuckPerms group display] nickname:
Players can request to join a guild from the launcher directory. Leaders and officers review those requests from the guild roster. Leaders can edit the guild description, message of the day, icon and banner from **Guild settings**. They can create and assign custom roles with permissions for invites, kicks, claims, posts and guild details. Deleting a role returns its members to `member`.
-The in-app territory view uses the configured BlueMap 2D tile address for each server. It centers on the player's last position when position relay is enabled. Left click or drag to claim; right click or drag to unclaim. On Paper, `/autoclaim on` claims each new unclaimed chunk entered while walking; `/autoclaim off` stops it. Auto-claim stops on a failed claim so it does not repeatedly send requests at the claim limit or in another guild's territory.
+The in-app territory view draws on the server's SCOPENET Map tiles (see [map.md](map.md)). It centers on the player's last position while they are in game. Left click or drag to claim; right click or drag to unclaim. On Paper, `/autoclaim on` claims each new unclaimed chunk entered while walking; `/autoclaim off` stops it. Auto-claim stops on a failed claim so it does not repeatedly send requests at the claim limit or in another guild's territory.
## Warps and item sharing on Paper
diff --git a/docs/rewards-and-limits.md b/docs/rewards-and-limits.md
new file mode 100644
index 0000000..ff25ccf
--- /dev/null
+++ b/docs/rewards-and-limits.md
@@ -0,0 +1,70 @@
+# Rewards, limits and permission nodes
+
+## Rewards beyond XP
+
+Quests, achievements and rank milestones (level rewards) can hand out more than XP and a title. In the admin panel, open any quest, achievement or milestone and use **Extra rewards**:
+
+| Reward | What happens | Where it happens |
+|---|---|---|
+| **Money** | Credits the balance, once per economy group (or one chosen server) | Panel, instantly |
+| **Claim chunks** | Raises the land limit of the player's guild while they are a member | Panel, instantly |
+| **Badge** | Shows a badge on their profile | Panel, instantly |
+| **Item** | Puts the item in their inventory (anything that doesn't fit drops at their feet). Vanilla ids such as `diamond` or `modid:item` | Game server, when they are online |
+| **Permission** | Grants a permission node, permanently or for a number of days | Game server (LuckPerms by default) |
+| **Group** | Adds them to a permission group | Game server (LuckPerms by default) |
+| **Message** | Sends a chat message | Game server |
+| **Command** | Runs a console command with `{player}` and `{uuid}` filled in | Game server, only if the server allows it |
+
+Players see short summaries ("$250.00", "Diamond x3", "+4 claim chunks") next to each quest and achievement in the launcher. Commands are shown only as "A special reward".
+
+Items, permissions, groups and messages are queued in the panel and handed to the game server once the player is online there. Anything that fails (an unknown item, LuckPerms missing) is retried a few times and then kept in the delivery log with the reason. A reward earned on one server can be delivered by whichever server the player is on, unless you pin it to a server.
+
+### Server settings
+
+Paper `config.yml` / Fabric `scopenet.properties`:
+
+```yaml
+rewards:
+ enabled: true
+ allow-commands: false # let the panel run its own console commands. Leave off unless every panel admin is trusted.
+ permission-command: "lp user {player} permission set {node} true"
+ permission-temp-command: "lp user {player} permission settemp {node} {value} {duration}"
+ group-command: "lp user {player} parent add {group}"
+```
+
+Using another permissions plugin? Change the command templates. Placeholders: `{player}`, `{uuid}`, `{node}`, `{value}`, `{duration}`, `{group}`.
+
+## What you can configure
+
+### Per server (plugin/mod config)
+
+| Setting | Meaning |
+|---|---|
+| `essentials.max-homes` | Homes every player can set |
+| `essentials.home-name-max-length` | Longest home name |
+| `essentials.max-warps` | Most warps the server may have (0 = no limit) |
+| `essentials.tpa-timeout-seconds` | How long a `/tpa` request stays open |
+| `essentials.rtp-radius`, `rtp-min-radius`, `rtp-attempts` | Where `/rtp` sends players, and how hard it tries |
+| `essentials.cooldowns.` | Seconds between uses of `spawn`, `home`, `back`, `tpa`, `rtp`, `warp` |
+| `map.enabled`, `map.show-homes` | The SCOPENET Map and whether homes appear on it |
+| `economy.currency-symbol` | The symbol shown next to money |
+| `rewards.*` | See above |
+| Feature switches | `leveling`, `quests`, `achievements`, `guilds`, `social`, `essentials`, `economy` |
+
+### Network-wide (admin panel → Progression → Economy & guild rules)
+
+Starting balance, chunks a new guild may claim, extra claims per member and per guild level, guild member limit, and market listings per player. These apply on every server and take effect immediately.
+
+## Permission nodes that change limits
+
+Give these with LuckPerms (or any permissions plugin) to ranks:
+
+| Node | Effect |
+|---|---|
+| `scopenet.homes.` | Homes limit for the player, e.g. `scopenet.homes.10`. The highest one a player has wins and never lowers the base `max-homes` |
+| `scopenet.homes.unlimited` | No home limit |
+| `scopenet.cooldown.bypass` | Skip every command cooldown |
+
+Operators and anyone with `*` get the top tier on Paper. On Fabric these nodes are off for everyone until a permissions system (such as the LuckPerms mod) grants them; operators still skip cooldowns.
+
+Claim chunks are a guild limit, so they are changed with the network rules above or with **Claim chunks** rewards, not with a permission node.
diff --git a/examples/fabric-server/scopenet.properties b/examples/fabric-server/scopenet.properties
index 5ba77dd..7890a1e 100644
--- a/examples/fabric-server/scopenet.properties
+++ b/examples/fabric-server/scopenet.properties
@@ -21,15 +21,31 @@ social.chat_prefixes=true
essentials.enabled=true
economy.enabled=true
-# Send world chunks and player positions to the panel's Live Map
-# (also needs Live Map switched on for this server in the panel).
-livemap.enabled=true
+# Draw this world on the SCOPENET Map: tiles, player positions, guild land and pins go to the panel
+# (also needs the map switched on for this server in the panel, which it is by default).
+map.enabled=true
# --- Essentials (1.20.1) -----------------------------------------------------
# /spawn /home /sethome /delhome /back /tpa /tpaccept /tpdeny /rtp /warp /playtime
+# Homes every player can set. Raise it for a rank with a permission node: scopenet.homes.10 gives 10 homes,
+# scopenet.homes.25 gives 25 (highest wins), scopenet.homes.unlimited removes the limit.
essentials.max_homes=5
-essentials.rtp_radius=2500
+essentials.home_name_max_length=32
+# Most warps the server may have (0 = no limit).
+essentials.max_warps=0
essentials.tpa_timeout_seconds=60
+# /rtp picks a random safe spot between rtp_min_radius and rtp_radius blocks from 0,0.
+essentials.rtp_radius=2500
+essentials.rtp_min_radius=0
+essentials.rtp_attempts=15
+# Seconds between uses (0 = none). Starts when the command actually teleports.
+# Players with scopenet.cooldown.bypass skip all of these.
+essentials.cooldown.spawn=0
+essentials.cooldown.home=0
+essentials.cooldown.back=0
+essentials.cooldown.tpa=0
+essentials.cooldown.rtp=0
+essentials.cooldown.warp=0
# --- Economy (1.20.1) --------------------------------------------------------
# Shown next to amounts.
@@ -53,9 +69,15 @@ placeholders.enabled=true
# Send balance, level, guild and claim info to players who have the SCOPENET client mod.
clientlink.enabled=true
-# --- BlueMap (1.20.1) --------------------------------------------------------
-# With the BlueMap mod installed, adds guild claims, spawn, warps, guild homes, markets and shops to the 3D map, and a
-# player panel when you click someone. Set the map's web address in the panel (Servers -> this server -> Map address).
-bluemap.enabled=true
-# Show every player's homes as pins. Off by default: homes are private and the map is public to anyone with the link.
-bluemap.show_homes=false
+# --- Map pins ----------------------------------------------------------------
+# Show every player's homes as pins on the map. Off by default: homes are private.
+map.show_homes=false
+
+# --- Rewards -----------------------------------------------------------------
+# Quests, achievements and rank milestones can give items, permissions, groups, messages... (set in the admin panel).
+rewards.enabled=true
+# Let the panel run its own console commands as rewards. Leave off unless you trust every panel admin.
+rewards.allow_commands=false
+rewards.permission_command=lp user {player} permission set {node} true
+rewards.permission_temp_command=lp user {player} permission settemp {node} {value} {duration}
+rewards.group_command=lp user {player} parent add {group}
diff --git a/examples/paper/config.yml b/examples/paper/config.yml
index 600a84d..dc106e4 100644
--- a/examples/paper/config.yml
+++ b/examples/paper/config.yml
@@ -58,15 +58,38 @@ social:
essentials:
# /spawn /home /sethome /delhome /back /tpa /tpaccept /tpdeny /rtp /warp /playtime
enabled: true
- # Homes per player.
+ # Homes every player can set. Raise it for a rank with a permission node:
+ # scopenet.homes.10 gives 10 homes, scopenet.homes.25 gives 25 (highest wins),
+ # scopenet.homes.unlimited removes the limit. Operators and "*" get the top tier.
max-homes: 5
- # /rtp picks a random safe spot within this many blocks of 0,0.
+ # Longest allowed home name.
+ home-name-max-length: 32
+ # Most warps the server may have (0 = no limit).
+ max-warps: 0
+ # How long a /tpa request stays open.
+ tpa-timeout-seconds: 60
+ # /rtp picks a random safe spot between rtp-min-radius and rtp-radius blocks from 0,0.
rtp-radius: 2500
+ rtp-min-radius: 0
+ # Random spots tried before /rtp gives up.
+ rtp-attempts: 15
+ # Seconds between uses (0 = none). Starts when the command actually teleports.
+ # Players with scopenet.cooldown.bypass skip all of these.
+ cooldowns:
+ spawn: 0
+ home: 0
+ back: 0
+ tpa: 0
+ rtp: 0
+ warp: 0
-livemap:
- # Send live player positions to the panel so the launcher can center its
- # BlueMap territory view. Configure BlueMap's public address in the panel.
+map:
+ # The SCOPENET Map: this server draws its world to map tiles in the background and
+ # sends only what changed, with players, guild land and pins, to the panel.
+ # It also needs the map switched on for this server in the panel (on by default).
enabled: true
+ # Show every player's homes as pins. Off by default: homes are private.
+ show-homes: false
economy:
# /balance /pay /baltop /shop /sell /market /orders /trade /transactions
@@ -113,15 +136,21 @@ integrations:
report-interval-seconds: 30
# ==============================================================================
-# BlueMap
-# With BlueMap installed, SCOPENET adds guild claims (coloured, with the guild's icon and name), spawn, warps, guild
-# homes, markets and shops to the 3D map, and a player panel when you click someone. Put the map's web address in the
-# panel (Servers -> this server -> Map address) and players get a Live Map button in the launcher.
+# Rewards
+# Quests, achievements and rank milestones can give more than XP: money, items, permissions, groups, claim
+# chunks, badges and messages (set them in the admin panel). The panel hands items, permissions and commands
+# to this server when the player is online. Permissions and groups use console commands, so any permissions
+# plugin works; the defaults are LuckPerms'. Placeholders: {player} {uuid} {node} {value} {duration} {group}.
# ==============================================================================
-bluemap:
+rewards:
enabled: true
- # Show every player's homes as pins. Off by default: homes are private, and the map is public to anyone with the link.
- show-homes: false
+ # Let the panel run its own console commands as rewards. Off by default: anyone who can edit rewards in the
+ # panel could otherwise run commands on this server. Only switch it on if you trust every panel admin.
+ allow-commands: false
+ permission-command: "lp user {player} permission set {node} true"
+ permission-deny-command: "lp user {player} permission set {node} false"
+ permission-temp-command: "lp user {player} permission settemp {node} {value} {duration}"
+ group-command: "lp user {player} parent add {group}"
# ==============================================================================
# Client mod link