Build an Advanced SMP Server

The full walkthrough from an empty server to a production survival community: Paper or Purpur, custom terrain, a vetted plugin stack, LuckPerms ranks with exact commands, claims, economy, skills, anti-xray, anti-cheat, Bedrock, voice, Discord, maps, tuned configs, backups, launch and long-term operation

Minecraft Game Modes

35 min readAdvancedLast updated Oct 31, 2026

An advanced SMP keeps vanilla survival at its heart and adds the systems that make a community last: protected land, an economy with player shops, ranks, skills, a live map, voice chat, Bedrock players, a Discord bridge, staff tools, and backups you can trust. This is our flagship guide. Follow it top to bottom on a fresh server and you'll finish with a world that's fast, fair and ready for its first hundred players.

What you'll build: a Paper (or Purpur) server with custom terrain pre-generated inside a world border, about 20 carefully chosen plugins, a seven-rank LuckPerms design, tuned performance settings, automatic backups and restarts, and a written plan for updates and seasons.

Time: a full day of setup spread over two or three sessions, plus an overnight pre-generation.

You need: a Minecraft server on our panel at game.crashcrafts.com, at least one database on your plan for the bigger plugins, a couple of extra ports (for voice chat and the web map; we add them for you), and about an hour to read this first. New to the panel? Do the new server checklist first.

1

Plan before you install

Write down your answers to these before touching the server. Changing them later is painful.

Decision Options Our advice
Server software Paper or Purpur Paper unless you want Purpur's extra gameplay toggles. Plugins are the same and you can switch later. Paper and Purpur
Minecraft version Newest, or one release behind The newest version that every plugin in step 6 supports. Check each plugin's page before you pick.
Access Public, or whitelist with applications Whitelisted communities have far less griefing. See step 18.
Bedrock players Java only, or Geyser crossplay Decide now: Bedrock names get a prefix that affects ranks and whitelists.
Seasons One permanent world, or a reset every few months Either works. Decide what carries over (ranks, money, claims).
Size Expected players at once Sets memory and the world border.

Memory

Players online Plugins Memory
Up to 10 Full stack 6 GB
10–30 Full stack + web map 8 GB
30–60 Full stack + map + voice 10–12 GB
60+ Consider a Velocity network 12 GB+ per server

More memory than the server uses doesn't make it faster. Ask us to set Aikar's flags (Paper's recommended garbage-collection settings) on plans of 4 GB and up.

2

Install Paper or Purpur and pin the version

  1. Open your server → Startup. Set the server type to Paper (or Purpur) and Minecraft Version to an exact version, not latest. Change version
  2. Pick the matching Java image. Newer Minecraft versions need newer Java; the version guide lists which.
  3. Start once on the Console, accept the EULA when asked, let it finish starting, then Stop. First start
  4. Turn on two-factor authentication on your panel account and add co-owners as sub-users, never by sharing your password. Sub-users

Don't let players in yet. The world you see now will be replaced in step 4.

3

Core server.properties

With the server stopped, open Files → server.properties and set:

motd=My SMP - survival, claims, economy
difficulty=hard
gamemode=survival
pvp=true
max-players=60
white-list=true
enforce-whitelist=true
online-mode=true
spawn-protection=0
view-distance=8
simulation-distance=6
enable-query=true
enable-rcon=false
sync-chunk-writes=true
allow-flight=false
Setting Why
white-list / enforce-whitelist Keeps strangers out while you build. Turn off later only if you go public.
online-mode=true Every player is a real, paid Java account (Bedrock players come through Floodgate). Only false on back-ends behind Velocity.
spawn-protection=0 Your claims plugin and WorldGuard protect spawn instead; vanilla spawn protection blocks non-ops confusingly.
view-distance=8 How far players see. 8 is a good balance; Distant Horizons players get far views another way.
simulation-distance=6 How far crops grow and mobs move. The biggest single performance setting.
enable-query=true Lets the panel's Players page work.
enable-rcon=false The panel console does the same job without another open port.

Every setting is explained in server.properties. pvp=true is fine because claims can switch PvP off inside them.

4

Choose terrain and pre-generate the world

Terrain is the first thing players notice and the one thing you can't change later without a new world. Terrain datapacks only affect chunks generated after they're installed, so this comes before anything else touches the world.

  1. Pick the terrain. Popular, maintained choices that run on Paper as datapacks:
    • Terralith for almost 100 new biomes, vanilla blocks only.
    • Tectonic for huge mountains and valleys. To combine it with Terralith, use Terratonic, not both separately.
    • Incendium (Nether) and Nullscape (End).
    • Iris is a full world engine plugin, but it's paid and very heavy to generate.
  2. Delete the test world, put the datapacks in world/datapacks/ (or install them from the CurseForge page, which puts them there), set level-seed, then start and check datapack list.
  3. Set the border to fit your community (radius 5,000 suits 10–40 players): worldborder center 0 0, worldborder set 10000.
  4. Install Chunky and pre-generate overnight with the server empty: chunky world world, chunky worldborder, chunky start. Then the Nether (radius ÷ 8) and the End.
  5. Far views: if players use Distant Horizons or Voxy, use Chunksmith instead of Chunky to build their far-view data in the same pass. It needs an extra port; ask us.

Each of these is walked through in full, with border maths, disk and time estimates, in Better pre-generated worlds. Do that guide now, then come back.

5

Create the databases

LuckPerms, CoreProtect and the economy store a lot of data. On a busy SMP, CoreProtect alone writes millions of rows; a MariaDB database stays fast where its built-in file slows down.

On Databases, create one database per plugin (the panel adds your server's prefix):

Database name For
luckperms Ranks and permissions.
coreprotect Block logging.
economy (optional) Shops or jobs plugins that support MySQL.

Click the eye on each to copy the host, username and password. The full steps and the exact config for LuckPerms and CoreProtect are in Databases. Connect each plugin as you install it in the next step.

6

Install the plugin stack

Install from Minecraft Plugins (one click from Modrinth), Plugins (CurseForge and Modrinth) or by uploading the jar to plugins/ on Files. Install plugins

The stack, and why each one

Job Our pick Alternatives Why this one
Permissions LuckPerms none worth it The standard. Groups, tracks, contexts, a web editor and database storage.
Core commands EssentialsX (+ EssentialsX Chat) HuskHomes for homes and warps Homes, warps, /tpa, random teleport, kits, mail, nicknames, chat format and a built-in economy in one well-maintained plugin.
Economy bridge Vault or VaultUnlocked Lets every plugin talk to one economy. VaultUnlocked is a maintained drop-in fork of Vault. Install one.
Grief logging CoreProtect Prism Logs every block, container and chat event; rolls back griefing in seconds. Free on Modrinth.
Land claims GriefPrevention HuskClaims (paid on SpigotMC), Lands (paid, adds nations and wars) Golden-shovel claims players learn in a minute, claim blocks earned by playing, inactive-claim expiry. Free.
Region protection WorldGuard (needs WorldEdit or FAWE) Protects spawn and event areas, which claims plugins don't handle well.
Player shops QuickShop-Hikari ChestShop (signs) Chest shops without commands. ChestShop is simpler and sign-based.
Progression AuraSkills mcMMO (paid on SpigotMC), Jobs Reborn (money for work, needs CMILib) Free, modern RPG skills with stats and abilities. Pick one skills plugin; they overlap. Jobs Reborn can run alongside as the money system.
Chat & tab TAB + PlaceholderAPI Ranks, ping and stats in the tab list and above heads.
Anti-cheat Grim Vulcan, Polar (paid) Free, open source, simulates movement exactly. Exempts Bedrock players when Floodgate is on the same server.
Bedrock players Geyser + Floodgate Phones and consoles join your Java server.
Voice Simple Voice Chat Plasmo Voice Proximity voice; players install the matching mod.
Discord DiscordSRV Chat bridge, console channel, account linking.
Web map BlueMap (3D) squaremap, Pl3xMap (light, 2D), Dynmap A live map in the browser. BlueMap looks best; squaremap is lightest.
Moderation LibertyBans LiteBans (paid), EssentialsX's built-in bans Bans, mutes and warnings with history.
Inventory tools OpenInv EssentialsX /invsee Look into offline players' inventories and ender chests.
Pre-generation Chunky or Chunksmith See step 4.
Profiler spark Built into Paper already: spark profiler.

"Paid" means the plugin is sold on SpigotMC or a similar store, even where its source code is public. Everything else in the table is free.

Install order

Install, restart and check the console after each line:

  1. LuckPerms (connect the database first time), then Vault or VaultUnlocked.
  2. EssentialsX, EssentialsX Chat.
  3. CoreProtect (connect the database).
  4. FastAsyncWorldEdit (for staff and WorldGuard), WorldGuard.
  5. GriefPrevention.
  6. QuickShop-Hikari.
  7. AuraSkills (and Jobs Reborn + CMILib if you use it).
  8. PlaceholderAPI, TAB.
  9. Grim.
  10. Floodgate, Geyser.
  11. Simple Voice Chat.
  12. DiscordSRV.
  13. BlueMap.
  14. LibertyBans, OpenInv.

After the last one, run plugins in the console. Every name should be green. A red name failed to load; scroll up in the console to see why (usually a version mismatch or a missing dependency).

7

Design ranks with LuckPerms

Good rank design means you never use op for anyone but the owner, and every permission has one obvious home.

The design

Group Weight Track Who Gets
default 0 players Everyone on join Spawn, rules, chat, one home, /tpa, claims, shops, skills.
member 10 players Whitelisted and played a few hours 2 homes, /back on death, warps, nickname.
trusted 20 players Long-standing community members 4 homes, /hat, /workbench, more claim blocks.
vip 30 (extra parent) Supporters Cosmetic perks: chat colour, 6 homes, a VIP kit.
helper 50 staff Junior staff Mute, kick, inspect grief, see claims, anti-cheat alerts.
mod 70 staff Moderators Bans, rollbacks, vanish, teleport, claim overrides.
admin 100 staff Owners and senior staff Everything.
  • Inheritance: member → default; trusted → member; helper → trusted; mod → helper; admin → mod. Each group only adds what's new.
  • VIP is an extra parent, not a step on the ladder, so a trusted player who supports you keeps trusted and also gets vip. Its weight (30) puts its prefix above trusted but below staff.
  • Weights decide which group wins when two disagree, and order the prefixes.

Create the groups

Run these in the Console (in-game, put / in front):

lp creategroup member
lp creategroup trusted
lp creategroup vip
lp creategroup helper
lp creategroup mod
lp creategroup admin

lp group member parent add default
lp group trusted parent add member
lp group vip parent add default
lp group helper parent add trusted
lp group mod parent add helper
lp group admin parent add mod

lp group default setweight 0
lp group member setweight 10
lp group trusted setweight 20
lp group vip setweight 30
lp group helper setweight 50
lp group mod setweight 70
lp group admin setweight 100

lp group member meta setprefix 10 "&7[Member] "
lp group trusted meta setprefix 20 "&a[Trusted] "
lp group vip meta setprefix 30 "&6[VIP] "
lp group helper meta setprefix 50 "&b[Helper] "
lp group mod meta setprefix 70 "&9[Mod] "
lp group admin meta setprefix 100 "&c[Admin] "

lp createtrack players
lp track players append default
lp track players append member
lp track players append trusted

lp createtrack staff
lp track staff append helper
lp track staff append mod
lp track staff append admin

Check with lp listgroups and lp listtracks.

Permissions for each group

EssentialsX permissions are essentials.<command>. Grant only what each rank needs.

default

lp group default permission set essentials.spawn true
lp group default permission set essentials.rules true
lp group default permission set essentials.helpop true
lp group default permission set essentials.list true
lp group default permission set essentials.motd true
lp group default permission set essentials.msg true
lp group default permission set essentials.r true
lp group default permission set essentials.mail true
lp group default permission set essentials.mail.send true
lp group default permission set essentials.ignore true
lp group default permission set essentials.afk true
lp group default permission set essentials.home true
lp group default permission set essentials.sethome true
lp group default permission set essentials.delhome true
lp group default permission set essentials.tpa true
lp group default permission set essentials.tpaccept true
lp group default permission set essentials.tpdeny true
lp group default permission set essentials.tpr true
lp group default permission set essentials.balance true
lp group default permission set essentials.pay true
lp group default permission set essentials.baltop true
lp group default permission set essentials.kit true
lp group default permission set essentials.kits.starter true
lp group default permission set griefprevention.claims true
lp group default permission set griefprevention.createclaims true
lp group default permission set quickshop.player true

member

lp group member permission set essentials.sethome.multiple true
lp group member permission set essentials.back true
lp group member permission set essentials.back.ondeath true
lp group member permission set essentials.warp true
lp group member permission set essentials.warp.list true
lp group member permission set essentials.nick true

trusted

lp group trusted permission set essentials.sethome.multiple.trusted true
lp group trusted permission set essentials.hat true
lp group trusted permission set essentials.workbench true
lp group trusted permission set essentials.kits.trusted true

vip

lp group vip permission set essentials.sethome.multiple true
lp group vip permission set essentials.sethome.multiple.vip true
lp group vip permission set essentials.chat.color true
lp group vip permission set essentials.kits.vip true

helper

lp group helper permission set essentials.mute true
lp group helper permission set essentials.kick true
lp group helper permission set essentials.seen true
lp group helper permission set essentials.socialspy true
lp group helper permission set coreprotect.inspect true
lp group helper permission set coreprotect.lookup true
lp group helper permission set griefprevention.claimslistother true
lp group helper permission set grim.alerts true

mod

lp group mod permission set essentials.tempban true
lp group mod permission set essentials.ban true
lp group mod permission set essentials.unban true
lp group mod permission set essentials.vanish true
lp group mod permission set essentials.tp true
lp group mod permission set essentials.tphere true
lp group mod permission set essentials.invsee true
lp group mod permission set essentials.fly true
lp group mod permission set coreprotect.rollback true
lp group mod permission set coreprotect.restore true
lp group mod permission set coreprotect.teleport true
lp group mod permission set griefprevention.ignoreclaims true
lp group mod permission set griefprevention.deleteclaims true
lp group mod permission set griefprevention.transferclaim true

admin

lp group admin permission set * true

If you use LibertyBans instead of EssentialsX for bans, give staff its permissions instead (they're listed on its wiki), and don't give both plugins' ban commands, or staff will use two different ban lists.

Promoting players

Task Command
Promote along the player track lp user Steve promote players
Demote lp user Steve demote players
Make someone staff lp user Alex parent add helper
Give VIP for 30 days lp user Steve parent addtemp vip 30d
See a player's groups lp user Steve info
Bedrock player (Floodgate prefix) lp user .Steve parent add member

Testing and troubleshooting ranks

  • Test from a normal account. Staff with * never notice missing permissions.
  • lp verbose on, have the player run the command, then lp verbose off: LuckPerms prints every permission checked and whether it passed.
  • lp editor gives a link to a web editor for bulk changes.
  • Back up ranks with lp export ranks-backup before big changes.
8

Set up EssentialsX

Open plugins/Essentials/config.yml with the server stopped.

Homes per rank

sethome-multiple:
  default: 2
  trusted: 4
  vip: 6

Players without essentials.sethome.multiple get one home. With it, they get the default number (2). With essentials.sethome.multiple.trusted as well, 4; with .vip, 6.

Teleport rules

teleport-cooldown: 30
teleport-delay: 3
tpa-accept-cancellation: 120

A short delay stops players teleporting out of fights; the cooldown stops spam.

Chat format with rank prefixes

Install EssentialsX Chat (same download as EssentialsX), then in config.yml:

chat:
  format: '{DISPLAYNAME}&7: &r{MESSAGE}'

{DISPLAYNAME} already includes the LuckPerms prefix (EssentialsX reads it through Vault).

Spawn, warps and random teleport

  1. Build your spawn, stand in the middle and run /setspawn. Players join and respawn there.
  2. /setwarp shops at the market, /setwarp nether at a Nether hub and so on.
  3. Random teleport (/tpr) spreads new players out. Set its range from the spawn with /settpr center, /settpr minrange 500 and /settpr maxrange 4500, kept inside your border.

Starter kit

Hold the items you want in your inventory and run /createkit starter 86400 (once a day). Players get it with /kit starter. Create trusted and vip kits the same way.

9

Land claims with GriefPrevention

Players claim land with a golden shovel: right-click one corner, then the opposite corner. A stick shows claims nearby. They earn claim blocks by playing.

Player commands to put on your rules board

Command What it does
/claim Claims a small area around you (when allowed).
/trust <player> Full building access to your claim.
/containertrust <player> Chests, furnaces, farms and animals, but no building.
/accesstrust <player> Buttons, levers, doors and beds only.
/managetrust <player> Lets them trust others in your claim.
/untrust <player> Removes their access.
/trustlist Who's trusted here.
/subdivideclaims Shovel mode for sub-areas with their own trust.
/abandonclaim Deletes the claim you're standing in.
/claimslist Your claims and claim blocks.
/trapped Gets you out of someone else's claim.

Configure it

Stop the server and open plugins/GriefPreventionData/config.yml. The keys sit under GriefPrevention: → Claims::

GriefPrevention:
  Claims:
    InitialBlocks: 1000
    BlocksAccruedPerHour: 100
    MaxAccruedBlocks: 80000
    MinimumWidth: 5
    MinimumArea: 100
    AutomaticNewPlayerClaimsRadius: 4
    Expiration:
      ChestClaimDays: 7
      AllClaims:
        DaysInactive: 60
Key Default Our value Why
InitialBlocks 100 1000 100 is a 10 × 10 area, too small for a real starter base.
BlocksAccruedPerHour 100 100 Rewards active players steadily.
MaxAccruedBlocks 80000 80000 Caps what idle time can earn.
AutomaticNewPlayerClaimsRadius 4 4 The first chest a new player places claims a small area around it automatically.
Expiration.AllClaims.DaysInactive 60 60–90 Claims of players who haven't logged in for this long are deleted, freeing land.

Claims mode is set per world with GriefPrevention.Claims.Mode.<world name> (Survival for normal worlds). Check the generated file for your world names.

Staff commands

Command What it does
/ignoreclaims Toggle building in any claim (for repairs).
/adminclaims Shovel mode for server-owned claims (spawn, markets).
/deleteclaim Deletes the claim you're in.
/claimslist <player> A player's claims.
/adjustbonusclaimblocks <player> <amount> Give or take claim blocks (vote rewards, events).
/transferclaim <player> Hands a claim to someone else.

Protect spawn with WorldGuard instead: select it with the FAWE wand (//wand), then rg define spawn and rg flag spawn pvp deny.

10

Economy and player shops

Money

EssentialsX's economy is enough for most SMPs. Set it in plugins/Essentials/config.yml:

starting-balance: 100
currency-symbol: '$'

Check it works: /balance shows the starting balance, and /eco give Steve 50 (admin) adds money.

Where money comes from matters more than any setting. Pick one or two sources and keep them small:

  • Jobs Reborn: players earn for mining, farming, building and so on. Lower its payouts in its config if prices inflate.
  • Selling to the server: a small admin shop at spawn buying common items sets a price floor.
  • Voting rewards and events.

Where money goes (sinks) stops inflation: claim block purchases, cosmetic shops, server-run auctions, taxes on shops.

Player shops with QuickShop-Hikari

  1. Players place a chest, hold the item they want to sell, and left-click the chest.
  2. They type the price in chat. A sign appears on the chest.
  3. Buyers click the shop and type how many they want.

The quickshop.player permission (given to default in step 7) covers everything players need. Build a market district at spawn, protect it with an admin claim, and let players rent stalls.

11

Progression: skills and jobs

AuraSkills gives players skills (farming, mining, fighting and more) that level as they play, with stats and abilities. It works out of the box; check /skills in-game.

  • Keep one skills plugin. AuraSkills and mcMMO overlap and fight over the same actions.
  • mcMMO is the classic, but it's paid on SpigotMC.
  • Jobs Reborn is different: it pays money for work rather than giving abilities, so it runs fine alongside AuraSkills.
  • Show skills in the tab list or scoreboard with PlaceholderAPI placeholders.
12

Grief logging with CoreProtect

CoreProtect records every block placed and broken, every container change and chat. It's how you undo griefing without a full restore.

Connect it to the coreprotect database (Databases), then learn these:

Command What it does
/co i Toggle the inspector. Click a block to see who changed it.
/co lookup u:Steve t:1d a:-block Blocks Steve broke in the last day.
/co lookup r:20 t:3d a:container Who took from chests within 20 blocks, past 3 days.
/co rollback u:Steve t:2h r:50 #preview Preview undoing Steve's last 2 hours within 50 blocks.
/co rollback u:Steve t:2h r:50 Do it.
/co restore u:Steve t:2h r:50 Undo the rollback.
/co near Lookup within 5 blocks.

Always #preview first, and always give a radius or a world (r:#world) unless you mean everything.

13

Anti-xray (built into Paper)

Paper hides ores from x-ray clients itself. It's off by default. Turn it on in config/paper-world-defaults.yml under anticheat.anti-xray, with the server stopped.

Engine modes

engine-mode What it does Use when
1 Replaces hidden ores with stone, deepslate, netherrack or end stone. Only ores fully surrounded by solid blocks are hidden. Lowest CPU, least protection.
2 Replaces hidden blocks with randomly chosen fake ores, so x-ray shows noise everywhere. Best protection. Our default.
3 Like 2, but picks the fake block per layer of each chunk instead of per block. Roughly halves the extra network data on join. Busy servers or players with slow connections.

Overworld (modes 2 and 3)

Paper's recommended values:

anticheat:
  anti-xray:
    enabled: true
    engine-mode: 2
    max-block-height: 64
    update-radius: 2
    lava-obscures: false
    use-permission: false
    hidden-blocks:
      - air
      - copper_ore
      - deepslate_copper_ore
      - raw_copper_block
      - diamond_ore
      - deepslate_diamond_ore
      - gold_ore
      - deepslate_gold_ore
      - iron_ore
      - deepslate_iron_ore
      - raw_iron_block
      - lapis_ore
      - deepslate_lapis_ore
      - redstone_ore
      - deepslate_redstone_ore
    replacement-blocks:
      - chest
      - amethyst_block
      - andesite
      - budding_amethyst
      - calcite
      - coal_ore
      - deepslate_coal_ore
      - deepslate
      - diorite
      - dirt
      - emerald_ore
      - deepslate_emerald_ore
      - granite
      - gravel
      - oak_planks
      - smooth_basalt
      - stone
      - tuff
  • air in hidden-blocks also hides ores exposed to air in caves. Paper notes it can drop FPS for some players; remove it if people complain.
  • Chests can't go in hidden-blocks in mode 2 (they're block entities), which is why Paper puts chest in replacement-blocks.
  • max-block-height is rounded to a multiple of 16. Some ores generate higher than 64 since 1.18; raise it if you like, at some CPU cost.
  • use-permission: true lets ops and players with paper.antixray.bypass see real ores. Leave it false.

Nether and End

Each dimension has its own paper-world.yml: on Minecraft before 26.1, world_nether/paper-world.yml and world_the_end/paper-world.yml; on 26.1 and newer, world/dimensions/minecraft/the_nether/paper-world.yml and .../the_end/paper-world.yml. Put only the changed keys there. For the Nether:

anticheat:
  anti-xray:
    enabled: true
    engine-mode: 2
    max-block-height: 128
    hidden-blocks:
      - air
      - ancient_debris
      - bone_block
      - glowstone
      - magma_block
      - nether_bricks
      - nether_gold_ore
      - nether_quartz_ore
      - polished_blackstone_bricks
    replacement-blocks:
      - basalt
      - blackstone
      - gravel
      - netherrack
      - soul_sand
      - soul_soil

For the End, Paper's guide simply sets enabled: false.

Restart (not /reload) to apply. To check, ask a friend with an x-ray resource pack to look underground, or look yourself from a test account in spectator mode: you should see scattered fake ores.

Leave the exploit fixes alone

config/paper-global.yml has an unsupported-settings section that can re-enable headless pistons, permanent block breaking, piston duplication (TNT, carpets, rails) and unsafe End portal teleportation. Paper doesn't support them and may remove them. Leave every one at its default on an SMP. Duplication glitches wreck economies overnight.

14

Anti-cheat with Grim

Paper already stops many cheats (flying kicks, packet spam limits). Grim adds a full movement simulation that catches speed, fly, reach, timer and more.

  1. Install Grim (Grim Anticheat on Minecraft Plugins) and restart.
  2. Put Floodgate on the same server (it is, from step 6), so Grim can exempt Bedrock players. Put ViaVersion on this server too if you use it.
  3. Staff with grim.alerts see alerts; toggle them with /grim alerts.
  4. Watch for a week before you punish. Lag, Elytra edge cases and some plugins cause false flags. Grim's config is in plugins/GrimAC/; its wiki explains each check.

Treat anti-cheat alerts as a reason to watch a player (vanish and spectate), not as proof. Back decisions with CoreProtect logs and recordings.

15

Performance configuration

Make these changes with the server stopped. Each file is on Files. Change one file at a time and run the server for a day before the next, so you can tell what helped.

config/paper-world-defaults.yml

chunks:
  max-auto-save-chunks-per-tick: 8
  prevent-moving-into-unloaded-chunks: true
  entity-per-chunk-save-limit:
    arrow: 16
    experience_orb: 16
    snowball: 8
    ender_pearl: 8
    egg: 8
    fireball: 8
    small_fireball: 8
collisions:
  max-entity-collisions: 2
entities:
  armor-stands:
    do-collision-entity-lookups: false
environment:
  optimize-explosions: true
fixes:
  fix-items-merging-through-walls: true
misc:
  redstone-implementation: ALTERNATE_CURRENT
tick-rates:
  grass-spread: 4
  mob-spawner: 2
  behavior:
    villager:
      validatenearbypoi: 60
  sensor:
    villager:
      secondarypoisensor: 80
Setting Default Ours Why
chunks.max-auto-save-chunks-per-tick 24 8 Spreads autosaves out, avoiding lag spikes on big worlds.
chunks.prevent-moving-into-unloaded-chunks false true Stops fast Elytra and boats outrunning chunk loading.
chunks.entity-per-chunk-save-limit none as above Stops chunks saving thousands of arrows or orbs.
collisions.max-entity-collisions 8 2 Much cheaper crowded farms and pens.
entities.armor-stands.do-collision-entity-lookups true false Decorative armor stands stop checking collisions.
environment.optimize-explosions false true Far cheaper TNT and creeper explosions, same result.
fixes.fix-items-merging-through-walls false true Items no longer merge through walls.
misc.redstone-implementation VANILLA ALTERNATE_CURRENT Much faster redstone. Rarely, timing differs; test big contraptions.
tick-rates.grass-spread 1 4 Grass spreads a bit slower; nobody notices.
tick-rates.mob-spawner 1 2 Spawners check half as often; farms still work, at half the cost.
tick-rates.behavior.villager.validatenearbypoi -1 60 Villagers re-check job sites less often. Big trading halls cost much less.
tick-rates.sensor.villager.secondarypoisensor 40 80 Same idea for a villager sensor.

Optional: hopper.disable-move-event: true makes hoppers much cheaper, but claims and shop plugins use that event to stop hoppers stealing from protected chests. Leave it false on an SMP with claims.

spigot.yml

Under world-settings: → default::

world-settings:
  default:
    view-distance: default
    nerf-spawner-mobs: true
    entity-activation-range:
      animals: 16
      monsters: 24
      raiders: 48
      misc: 8
      water: 8
      villagers: 16
      flying-monsters: 48
  • view-distance: default lets server.properties control it. A number here silently overrides it.
  • nerf-spawner-mobs: true gives mobs from spawners no AI. They still drop loot and get pushed by water, so mob grinders keep working, but they cost far less.
  • entity-activation-range is how close a player must be for mobs to run their full AI. Lower values save CPU; mobs farther away tick less.

bukkit.yml

spawn-limits:
  monsters: 50
  animals: 8
  water-animals: 3
  water-ambient: 3
  water-underground-creature: 3
  axolotls: 3
  ambient: 3

These are per-player mob caps (Paper counts them per player by default). The defaults (70 monsters, 10 animals) are fine for small servers; lower them as you grow.

purpur.yml (Purpur only)

Purpur adds hundreds of toggles in purpur.yml. A useful one for SMPs: world-settings → default → mobs → villager → lobotomize → enabled: true. Villagers locked in trading cells stop running pathfinding but still trade. Purpur's documentation lists every option; with nothing changed, Purpur plays like Paper.

Check it worked

Restart, play for an hour with players on, then run spark profiler start, wait 5 minutes, spark profiler stop, and open the link. spark tps should show close to 20 and MSPT under 50. Fix lag

16

Bedrock crossplay, voice chat and Discord

Bedrock (Geyser + Floodgate)

The full walkthrough is in Let Bedrock players join. The short version for one server:

  1. With Geyser and Floodgate installed, start once and stop.
  2. In plugins/Geyser-Spigot/config.yml, set bedrock.clone-remote-port: true (Bedrock players use your Java port) and remote.auth-type: floodgate.
  3. Start. Bedrock players add your address and port under Servers.
  4. Bedrock names start with .. Whitelist them with fwhitelist add PlayerName, and use .PlayerName in LuckPerms commands.

Voice chat (Simple Voice Chat)

Voice uses its own UDP port, which must be allocated to your server. The full steps are in Set up Simple Voice Chat:

  1. Ask us for an extra port; it appears on Network.
  2. In plugins/voicechat/voicechat-server.properties, set port= to that number.
  3. Restart. Players with the mod press V to check it's connected.

Bedrock players can't use Simple Voice Chat; tell them so in your FAQ.

Discord (DiscordSRV)

  1. Create a bot in the Discord Developer Portal, copy its token, turn on the Server Members and Message Content intents, and invite it to your Discord server.

  2. Turn on Developer Mode in Discord, then right-click your chat channel and console channel to copy their IDs.

  3. In plugins/DiscordSRV/config.yml:

    BotToken: "your-bot-token"
    Channels: {"global": "123456789012345678"}
    DiscordConsoleChannelId: "234567890123456789"
    
  4. Restart. Chat now flows both ways.

17

Live web map

A web map lets players plan journeys and show off builds. It needs its own TCP port: ask us for one, and it appears on Network.

BlueMap (3D):

  1. Install BlueMap, start once, stop.
  2. In plugins/BlueMap/core.conf, set accept-download: true. BlueMap downloads Minecraft's client resources to draw textures, and this setting is you agreeing to that.
  3. In plugins/BlueMap/webserver.conf, set port: to your extra port (default is 8100).
  4. Start. Open http://gameprod1.crashcrafts.com:<port> in a browser.

squaremap (2D, lightest): set settings.internal-webserver.port in plugins/squaremap/config.yml. Dynmap: set webserver-port in plugins/dynmap/configuration.txt. Check Dynmap supports your Minecraft version first; it often lags behind.

Render the whole map once, overnight, after pre-generation. To hide the Nether or areas around bases, every map plugin can disable worlds and add hidden regions; see its docs.

18

Whitelist and applications

A whitelisted SMP with a short application gets better players and far less griefing.

  1. Keep white-list=true (from step 3).
  2. Applications: a Discord channel with a form or a pinned template is enough. Ask for their Minecraft name, age range, how they found you, what they like to build, and that they've read the rules.
  3. Approve: a helper runs whitelist add Name (Java) or fwhitelist add Name (Bedrock) and welcomes them.
  4. Link accounts (optional): DiscordSRV's plugins/DiscordSRV/linking.yml has a Require linked account to play option, so only players who linked their Discord can join. Easy bans and contact across both.
  5. Promote from default to member after a few hours of good play: lp user Name promote players.

Write your rules once, short and specific (no griefing, no stealing in or out of claims, no x-ray or hacked clients, no lag machines, be kind in chat), and show them with /rules (edit plugins/Essentials/rules.txt).

19

Staff tools and moderation workflow

Tools

Need Tool
Who broke this? /co i and /co lookup
Undo grief /co rollback ... #preview then without #preview
Watch quietly /vanish, then spectate
Check inventories /invsee or OpenInv's /openinv
Private messages /socialspy (helpers and up)
Mute, kick, ban LibertyBans (or EssentialsX): mute, kick, tempban, ban
Claims /ignoreclaims, /claimslist <player>
Anti-cheat /grim alerts
Panel access Sub-users with only the permissions each staff member needs

Workflow

  1. Report comes in (Discord ticket, /helpop or in-game).
  2. Investigate: a helper checks CoreProtect, chat logs and alerts. Screenshot or copy the evidence into a staff channel.
  3. Act with a published ladder: warning → mute (1 hour) → temporary ban (1–7 days) → permanent ban. Severe cases (x-ray, hacked clients, big griefs) can skip steps.
  4. Repair: roll back the damage with CoreProtect and return stolen items.
  5. Record: note what happened, who acted and why in a staff log channel.
  6. Appeals: one channel or form, reviewed by someone who didn't make the ban.

Give staff the smallest rank that does their job, and review the staff list monthly.

20

Backups on a schedule and off-site

A backup only helps if it exists, is recent, and restores. Backup schedules has every screen; here's the SMP plan.

Panel backups

  1. Schedules → Create Schedule, name Backup every 6 hours, Minute 0, Hour */6, Only when Server is Online? off.
  2. Tasks: Send Command save-all, then Create Backup with Time Offset 10 seconds. In Ignored Files, add logs, cache and crash-reports, and BlueMap's render folder (bluemap) if you have one, since it can be rebuilt.
  3. Run now once, then check Backups: it should appear and turn Successful.

With 4 unlocked slots and a backup every 6 hours, you can go back 24 hours. Keep at least one slot unlocked, or scheduled backups fail.

Locked and off-site copies

  • Lock a backup before every update and at each milestone (launch day, season start).
  • Download a backup weekly to your own computer or cloud storage. Backups live on our servers; deleting the server deletes them too.
  • Databases aren't in panel backups. Export LuckPerms with lp export weekly (it writes a file in plugins/LuckPerms/, which the next backup picks up), and ask us for database dumps of CoreProtect and the economy before big changes.
  • Test a restore once, on a quiet evening, so you know the process works before you need it.
21

Restart schedule

A daily restart clears memory, applies plugin updates waiting in plugins/update/, and keeps the server snappy.

On Schedules, create Daily restart with Only when Server is Online? on, timed 10 minutes after a backup. For a backup at 08:00 UTC (4:00 am EDT), restart at Minute 10, Hour 8. Tasks:

# Action Value Time Offset
1 Send Command say Server restarting in 5 minutes. 0
2 Send Command say Server restarting in 1 minute. Find a safe spot! 240
3 Send Command say Restarting now. Back in a minute! 50
4 Send Power Action Restart 10

Times are UTC; see cron times. Busy servers sometimes restart twice a day.

22

Test, then launch

Run through this as a normal player, not staff:

  1. Join from a non-staff account (and a Bedrock device if you use Geyser).
  2. Check /spawn, /sethome, /home, /tpa, /tpr, /kit starter, /balance, /rules.
  3. Claim land with a golden shovel; have a friend try to break blocks there.
  4. Create a shop, and buy from it on another account.
  5. Check skills level up (/skills).
  6. Talk on voice chat; check Discord chat both ways; open the web map.
  7. Ask a friend with x-ray to look underground (or check in spectator yourself).
  8. Run spark profiler for 5 minutes with a few people on. Fix anything that stands out.
  9. Make a locked backup called Launch day.

Launch checklist

  • [ ] Paper or Purpur, Minecraft version pinned, matching Java.
  • [ ] Two-factor on the panel account; staff added as sub-users.
  • [ ] server.properties set (whitelist, view 8, simulation 6, RCON off).
  • [ ] Terrain datapacks installed before world creation; seed chosen.
  • [ ] World border set; Overworld, Nether and End pre-generated.
  • [ ] Databases created and connected (LuckPerms, CoreProtect).
  • [ ] All plugins green in plugins; one per job.
  • [ ] LuckPerms groups, tracks, weights and prefixes; tested from a normal account.
  • [ ] EssentialsX homes, spawn, warps, random teleport and starter kit.
  • [ ] GriefPrevention claim blocks and expiry set; spawn protected by WorldGuard.
  • [ ] Economy sources and sinks decided; market district built.
  • [ ] Anti-xray on in Overworld and Nether; unsupported-settings untouched.
  • [ ] Grim installed; staff know alerts aren't proof.
  • [ ] Performance settings applied and profiled with spark.
  • [ ] Geyser, voice chat and web map ports allocated and working.
  • [ ] DiscordSRV bridge working; console channel admin-only.
  • [ ] Rules written; application process ready.
  • [ ] Backup schedule every 6 hours, checked on Backups the next day.
  • [ ] Daily restart with warnings, 10 minutes after a backup.
  • [ ] Locked Launch day backup and a downloaded copy.

Running it long-term

Updating safely (test server first)

Updates are where most SMPs break. Never update the live server first.

  1. Wait a week or two after a new Minecraft version. Let Paper builds settle and your key plugins (Geyser, claims, skills, map) release support.
  2. Make a test copy. Ask us for a small test server, then Download a recent backup of the live server and restore it there (or upload it on Files).
  3. On the test server, change the version on Startup and update plugins one at a time (drop new jars in plugins/update/, restart). Check the console after each.
  4. Test the launch steps again on the test server.
  5. On the live server: announce downtime, make a locked backup, download it, then repeat exactly what worked on test.
  6. Watch the console and spark tps for the first hours.

Minecraft worlds can't be downgraded. Once the live world opens on the new version, the locked backup is your only way back. Moving to Minecraft 26.1 also changes Paper's world folder layout, and Paper warns there's no going back.

Plugin-only updates follow the same pattern on a smaller scale: one plugin at a time, a locked backup first.

Data retention

Data grows forever unless you trim it:

Data How to keep it in check
CoreProtect logs From the console, co purge t:90d removes logs older than 90 days (in-game, the minimum is 30 days). Run it monthly.
Old claims GriefPrevention's DaysInactive removes inactive players' claims automatically.
Server logs A monthly schedule with Delete Files on old logs/*.log.gz.
World size Trim unused chunks outside the border. Trimming
Personal data Only collect what applications need. Delete applications and linked accounts of players who ask, and of long-gone players.

Monthly routine

  • Check Backups has recent successful backups; download one.
  • Run spark profiler at peak time and look for new hot spots (usually a big farm).
  • Update plugins with security or bug fixes, one at a time.
  • Review staff, ranks and the ban list.
  • Check disk use on the Console page.
  • Purge CoreProtect.

Seasonal events

Events keep a community coming back. Ideas that work on any SMP:

  • Build competitions with a theme and a deadline, judged by players. Prizes: in-game money, claim blocks (/adjustbonusclaimblocks), or a temporary VIP rank (lp user <name> parent addtemp vip 30d).
  • Dragon night: everyone fights the Ender Dragon together on a set evening.
  • Market day: a weekend with no shop tax and a server-run auction.
  • Border growth: grow the world border by a ring and announce new land to explore. Pre-generate it first.
  • Holiday decorations at spawn and a scavenger hunt with signs and chests.

Announce them in Discord and with an hourly Send Command say schedule during the event.

Season resets

If you run seasons:

  1. Announce the end date weeks ahead.
  2. Make a locked backup of the final world, and offer players a download of it.
  3. Stop the server. Rename the old world folder (for example world_season1) or delete it after the backup.
  4. Decide what resets: economy (EssentialsX's /eco reset <player>, or delete plugins/Essentials/userdata/ with the server stopped, which also clears homes), claims (GriefPrevention data), CoreProtect logs (co purge or a fresh database), and skills. Ranks usually stay.
  5. Install new terrain if you want a change, pick a new seed, and pre-generate before opening. Pre-generate
  6. Make a fresh Season start locked backup.

Common problems

Problem Fix
Economy flooded overnight A duplication glitch or a money exploit. Check unsupported-settings are all off, update Paper, find the source with CoreProtect, and roll back. Check Jobs Reborn payouts.
A plugin is red in plugins Wrong Minecraft version or a missing dependency (Jobs Reborn needs CMILib; WorldGuard needs WorldEdit or FAWE). The console names it.
Players can't use /home or /tpa Missing EssentialsX permission. Test with lp verbose on.
Rank prefix not shown in chat EssentialsX Chat isn't installed, Vault/VaultUnlocked is missing, or the chat format doesn't include {DISPLAYNAME}.
Two claim systems fighting Only one of GriefPrevention, HuskClaims or Lands should be installed.
Hoppers steal from claimed chests hopper.disable-move-event was set to true. Set it back to false.
Bedrock players can't join Geyser's port isn't reachable, or auth-type isn't floodgate. See Bedrock crossplay.
Bedrock players flagged by Grim Floodgate isn't on the same server as Grim.
Voice chat not connected The voice port isn't allocated or doesn't match port=. See Voice chat.
Web map shows nothing Its port isn't allocated, port doesn't match, or BlueMap's accept-download is still false.
X-ray still works enabled: false, the wrong file (each dimension has its own paper-world.yml), or the server was /reloaded instead of restarted.
Lag as the world grows Players exploring outside the pre-generated area, or a huge farm. Pre-generate more, check spark, lower spawn limits.
Villager trading halls lag Lower validatenearbypoi tick rate, or on Purpur turn on villager lobotomize.
Staff ban lists disagree Two ban plugins in use. Pick one and give staff only its commands.
Discord bridge silent Wrong channel ID, missing Message Content intent, or the bot isn't in the channel.

Going further