Paper plugin · Java 25

Homes, warps,
no bloat.

Homes, teleport requests, private messages, random teleport, player-run warps, AFK status, and an admin inventory viewer — bundled into one plugin instead of seven.

Paper 26.1 / 26.1.1 / 26.1.2 Java 25 MIT licensed

What it does

SimplyTheBasics covers the things people ask for in the first month of running a server: a place to call home, a way to reach a friend, a way to message them, a way to get lost on purpose, player-run warps, an AFK status, and OP tools to keep all of it in check. Nothing else.

Homes

/sethome, /home, /delhome. Reads come from an in-memory cache, while saves and deletes route safely through the main thread. Names are case-insensitive and validated.

Teleport requests

/tpa, /tpahere, /tpaccept, /tpdeny. Requests time out after 60 seconds by default and get swept by a cleanup task every 5 seconds.

Messaging

/msg, /tell, /w, plus /reply. Colored private messages through Adventure, with the last conversation tracked per player so /reply always knows who you mean.

Random teleport

/rtp drops you near dimension spawn, not world origin, after checking up to 100 candidate spots for solid ground and breathing room.

Player warps

/pw opens a real inventory GUI of every warp you can reach. Players set their own, with icons, descriptions, and Public, Private, or Whitelisted access.

AFK status

/afk toggles away mode with a broadcast to the server. Move or run it again and you're back, automatically — no second command to return.

Smart sleep

Skip the night without waiting for everyone. Set a custom percentage, and AFK players are automatically ignored from the math.

Admin tools

/sethome admin (or /homeadmin) lets OPs list, teleport to, or delete any player's homes. /pwadmin does the same for warps, and /inv opens a live, editable view of any player's inventory — online or offline, ender chest included.

Join messages

Customizable broadcast announcements for first-time joins and returning players. Fully supports modern MiniMessage color formatting.

Setting it up

  1. Drop SimplyTheBasics.jar into your server's plugins/ folder.
  2. Restart the server, or run /reload.
  3. That's it — config.yml, homes.yml, and warps.yml generate themselves on first run.

Commands

Most permission nodes below default to true, so commands work out of the box. The admin tools default to OP-only instead. Lock individual ones down through your permissions plugin if that doesn't suit your server.

/sethome [name]set a home
Saves a home at your current location. Leave the name off and it's just called "home".
simplythebasics.sethome
/home [name]go to a home
Teleports you to a saved home, defaulting to "home" if you don't name one.
simplythebasics.home
/delhome <name>remove a home
Deletes a saved home by name.
simplythebasics.delhome
/tpa <player>request to teleport
Asks another player if you can teleport to them.
simplythebasics.tpa
/tpahere <player>request them to come
Asks another player to teleport to you instead.
simplythebasics.tpa
/tpacceptaliases: /tpyes
Accepts whichever teleport request is currently pending.
simplythebasics.tpa
/tpdenyaliases: /tpno
Turns down a pending teleport request.
simplythebasics.tpa
/msg <player> <msg>aliases: /tell, /w
Sends a private message, formatted as [PM] You -> Player: message.
simplythebasics.msg
/reply <msg>alias: /r
Replies to whoever last messaged you, without retyping their name.
simplythebasics.msg
/rtprandom teleport
Sends you somewhere safe and random in your current dimension. 30-second cooldown by default.
simplythebasics.rtp
/afktoggle AFK
Marks you as away with a broadcast to the server. Move or run it again and you're back — no second command needed.
simplythebasics.afk

Player warps

/pwopen the warp browser
Opens a GUI of every warp you can currently reach — public, your own, and anything you're whitelisted into.
simplythebasics.pw
/pw <warp>teleport to a warp
Jumps straight to a warp by name, skipping the menu.
simplythebasics.pw.teleport
/pw set <name>create a warp
Creates a warp at your current location, or moves one you already own.
simplythebasics.pw.set
/pw delete <name>remove a warp
Deletes a warp you own.
simplythebasics.pw.delete
/pw rename <old> <new>rename a warp
Renames a warp you own. Tab-complete suggests the current name as a starting point.
simplythebasics.pw.rename
/pw seticon <warp>set the icon
Sets a warp's icon to whatever item is in your main hand.
simplythebasics.pw.seticon
/pw desc <warp> <text>set the description
Gives a warp a short description, shown in the browser.
simplythebasics.pw.desc
/pw managewarp management menu
Opens your own warps in a menu — click one to teleport, edit, move, change visibility, or delete it.
simplythebasics.pw.manage

Admin · OP only

/sethome admin <list|tp|delete>alias: /homeadmin
List, teleport to, or delete any player's saved homes. Takes just a home name, or a player plus a home name.
simplythebasics.homeadmin
/pwadminwarp admin menu
Opens an OP-only menu to configure or delete any player's warps.
simplythebasics.pwadmin
/inv <player>view inventory
Opens a live, editable view of a player's inventory — main slots, armor, offhand, plus an Ender Chest button. Works online or offline.
simplythebasics.inv
/inv guiplayer picker
Opens a menu of every player who's ever joined, online or offline, by head and name. Click one to manage their inventory.
simplythebasics.inv

config.yml

Generated automatically the first time the plugin loads. Edit it, then reload or restart to apply changes.

# Command Toggles — set any command to false to disable it
commands:
  sethome: true
  home: true
  delhome: true
  tpa: true
  tpahere: true
  tpaccept: true
  tpdeny: true
  msg: true
  reply: true
  rtp: true
  homeadmin: true
  pw: true
  pwadmin: true
  afk: true
  inv: true

# RTP (Random Teleport) Settings
rtp:
  # Enable/disable RTP per dimension
  overworld-enabled: true
  nether-enabled: true
  end-enabled: true
  # Maximum radius from world spawn for random teleport in each dimension
  overworld-radius: 15000   # max blocks from spawn in the Overworld
  nether-radius: 1500     # max blocks from spawn in the Nether
  end-radius: 5000        # max blocks from spawn in the End
  cooldown-seconds: 30    # wait time between uses of /rtp

# TPA (Teleport Request) Settings
tpa:
  timeout-seconds: 60     # how long a request stays open

# Home Settings
home:
  max-homes: 0           # 0 = unlimited, enforced on /sethome

# Player Warp Settings
player-warps:
  max-warps: 3          # 0 = unlimited warps per player

# Sleep Settings
sleep:
  # Percentage of non-AFK players that must be in bed to skip the night
  percent-required: 50

# Dimension Settings
dimensions:
  allow-nether: true    # Set to false to disable the Nether (portal blocked)
  allow-end: true       # Set to false to disable the End (portal blocked)

# Join Messages
join-messages:
  first-join: "<gold>{player} <gray>has joined the server for the first time! Welcome <gold>{player} <gray>to the server!"
  join: "<gold>{player} <gray>has joined the server. Welcome back <gold>{player}!"
commands.<name>

Switches a command off at the source — set one to false and it stops running, instead of just hiding behind a permission.

rtp.<dimension>-enabled

Controls whether random teleport commands are allowed within specific dimensions.

rtp.overworld-radius

How far from world spawn /rtp is allowed to drop someone in the Overworld.

rtp.nether-radius

Same idea, scaled down for the Nether's tighter coordinate ratio.

rtp.cooldown-seconds

Tracked per player in memory, so it resets cleanly whenever the plugin reloads.

tpa.timeout-seconds

After this many seconds, a pending /tpa or /tpahere request just expires.

home.max-homes

Cap how many homes one player can hold onto. Zero means no cap, and the limit is checked when a new home gets saved.

player-warps.max-warps

Cap how many warps one player can create. Three by default, zero means no cap.

sleep.percent-required

The percentage of active (non-AFK) players in a world that must be in a bed to skip to morning.

dimensions.allow-<dimension>

Toggled to false, this blocks access to dimensional portals entirely.

join-messages

Customize the broadcast messages for new and returning players. Supports MiniMessage styling tags and the {player} placeholder.

Permissions

Permissions control granular execution access. If your server runs LuckPerms or similar, these are the nodes to target when you want to restrict something.

simplythebasics.sethome
Lets a player set homes.
default: true
simplythebasics.home
Lets a player teleport to a saved home.
default: true
simplythebasics.delhome
Lets a player delete a saved home.
default: true
simplythebasics.homeadmin
Covers /sethome admin and /homeadmin — listing, teleporting to, or deleting any player's homes.
default: op
simplythebasics.tpa
Covers /tpa, /tpahere, /tpaccept, and /tpdeny.
default: true
simplythebasics.msg
Covers /msg, /tell, /w, and /reply.
default: true
simplythebasics.rtp
Lets a player use /rtp.
default: true

Player warps

simplythebasics.pw
Lets a player open the /pw warp browser.
default: true
simplythebasics.pw.teleport
Lets a player teleport to a warp they can access.
default: true
simplythebasics.pw.set
Lets a player create a warp, or move one they already own.
default: true
simplythebasics.pw.delete
Lets a player delete a warp they own.
default: true
simplythebasics.pw.rename
Lets a player rename a warp they own.
default: true
simplythebasics.pw.seticon
Lets a player set a warp's icon from their held item.
default: true
simplythebasics.pw.desc
Lets a player set a warp's description.
default: true
simplythebasics.pw.manage
Lets a player open the management menu and change a warp's access settings.
default: true
simplythebasics.pwadmin
Lets an OP configure or delete any player's warps.
default: op

Other

simplythebasics.afk
Lets a player toggle AFK mode.
default: true
simplythebasics.inv
Lets an OP view and edit a player's inventory, including the player picker and ender chest views.
default: op

How it works

Java 25, built against Paper API 26.1.2.build.72-stable, compiled with Maven. Packages are split by job, not by command.

com.simplythebasics
├── SimplyTheBasics.java          main class — registers commands, loads config
├── commands/
│   ├── HomeCommand.java          /sethome, /home, /delhome + admin bridge
│   ├── HomeAdminCommand.java     /sethome admin, /homeadmin — OP only
│   ├── TpaCommand.java           /tpa, /tpahere, /tpaccept, /tpdeny + tab complete
│   ├── MsgCommand.java           /msg, /tell, /w + reply tracking
│   ├── ReplyCommand.java         /reply, /r
│   ├── PlayerWarpCommand.java    /pw and its subcommands + tab complete
│   ├── PlayerWarpAdminCommand.java /pwadmin — OP only
│   └── RtpCommand.java           /rtp — dimension-aware, spawn-based, world-checked
├── data/
│   ├── HomeManager.java          YAML home storage, async I/O, max-homes enforcement
│   ├── PlayerWarpManager.java    YAML warp storage, access control, limits
│   └── TpaManager.java           request lifecycle, configurable timeout
├── gui/
│   └── PlayerWarpMenus.java      inventory + anvil UI for warp management
└── resources/
    ├── plugin.yml                 api-version: '26.1'
    └── config.yml                 all configurable values

sleepNight skipping

  • Calculates required sleepers based on online players minus those currently marked AFK.
  • Broadcasts a real-time status message (e.g., "1/3 players are sleeping (1 AFK)").
  • Clears storms, sets the world to dawn, and broadcasts a morning greeting when the threshold is met.

/rtpRandom teleport

  • Picks a point relative to the dimension's spawn, not world origin (0,0).
  • Radius per dimension is configurable — 15k / 1.5k / 5k blocks by default.
  • Tries up to 100 candidate spots before giving up.
  • Checks the block underfoot is solid and that head + feet are clear air.
  • Confirms the target world is actually loaded before attempting the jump.
  • Cooldown lives in an instance-level map, so it resets cleanly on reload instead of lingering in memory.

homesStorage

  • Loaded into an in-memory cache on startup, so reads are instant.
  • Saves and deletes route through the main thread via Bukkit's scheduler, so the YAML file is never touched from two threads at once.
  • Names are case-insensitive: letters, numbers, underscores, hyphens, max 32 characters.
  • home.max-homes is checked at save time, so the cap actually holds.
  • Teleports use Paper's Player.teleportAsync().

tpaRequests

  • Held in memory with a configurable timeout, 60 seconds by default.
  • A cleanup task sweeps expired requests every 5 seconds, safely, even if a player has already disconnected.
  • /tpahere just flips the direction — the target moves instead of the requester.

msgMessaging

  • Colored output through Adventure: [PM] You -> Player: message.
  • A static map tracks each player's last conversation for /reply.

homeadminAdmin home tools

  • /sethome admin list, tp, and delete work on any player's homes. List optionally takes a player name; tp and delete take just a home name, or a player plus a home name.
  • The same actions are available through /homeadmin.
  • Gated behind simplythebasics.homeadmin, OP-only by default.

/pwPlayer warps

  • Stored in warps.yml — owner, location, icon, description, visibility, and a whitelist all live with the warp.
  • /pw opens an inventory GUI of every warp you can currently reach: public, your own, and anything you're whitelisted into.
  • /pw manage opens the owner menu — teleport, change icon, rename, edit description, move to your location, cycle visibility, or delete.
  • Icons are set by clicking "Set Icon" then an item in your own inventory; renames, descriptions, and whitelist entries go through an anvil screen.
  • Visibility is Public, Private, or Whitelisted, and player-warps.max-warps caps how many warps one player can hold.
  • /pwadmin gives OPs a menu to configure or delete anyone's warps.

/afkAFK status

  • Toggling on broadcasts to the whole server that you've gone AFK.
  • Moving to a different block, or running /afk again, brings you back automatically — no separate command to return.
  • Disconnecting clears you from the AFK list, so it never gets stuck on.

/invInventory viewer

  • /inv <player> opens a 45-slot view — 36 main slots, 4 armor, 1 offhand — with labeled borders and placeholders for empty armor slots.
  • /inv gui opens a 54-slot player picker showing everyone who's ever joined, online or offline, by head and name.
  • An Ender Chest button swaps in a 27-slot ender chest view, saved separately, with a button back to the main inventory.
  • Everything's editable — pull items out, drag your own in, rearrange freely — and closing the menu writes it all back.
  • Offline edits queue in pending-inv-changes.yml and apply the moment the player logs back in, with a heads-up message for them.
  • Online inventories are cached on startup and on join, so an admin can open anyone's inventory, online or off.

commandsToggles

  • Every top-level command checks its commands.<name> flag in config.yml before it runs — including afk, inv, homeadmin, pw, and pwadmin.
  • Set one to false and it's actually disabled, not just hidden behind a permission node.

Changelog

What's shipped, newest first.

Latest

addedSmart Sleep / Night Skipping

  • Added a new sleep configuration block to customize the percentage of players required to skip the night.
  • AFK Integration: Players currently marked as AFK are automatically subtracted from the required sleeping total.
  • Includes built-in status broadcasts (e.g., "1/3 players are sleeping (1 AFK)") to let the server know how many more players need to get in bed.

Earlier Updates

addedCustom Join Messages

  • Added a new join-messages configuration block to customize announcements when players log in.
  • Provides separate configuration lines for first-join (new players) and standard join (returning players).
  • Fully supports modern MiniMessage color and formatting tags (e.g., <gold>, <gray>) and a dynamic {player} placeholder.

fixedBug Fixes & Core Stability Improvements

  • Thread-Safe Operations: Eliminated critical race condition opportunities during data storage. PlayerWarpManager.saveAllWarps() and HomeManager.setHome/deleteHome writes are now forced smoothly back to the server main thread using Bukkit.getScheduler().runTask().
  • RTP Cooldown Memory Leaks: Refactored the /rtp cooldown tracking architecture from a static map to an instance-level layout, ensuring maps clear properly on reloads.
  • GUI Icon Selection Priority: Fixed a flow blocker where item clicks inside a player's private inventory were canceled before the custom warp interface could register icon selections.

addedInfrastructure Controls & Dimensions

  • Dimension Gateway Control: Integrated a fresh dimensions config layer supporting allow-nether and allow-end to selectively disable entry portals altogether.
  • Granular Dimension RTP: Expanded config logic to include specific overworld-enabled, nether-enabled, and end-enabled switches for explicit context mapping.
  • Source Toggles: Migrated utility commands like afk and inv directly to the master core commands toggle map within config.yml.
Updating from an older version? Delete your old config.yml. Updates change the layout — new sections are added regularly — so a config from an earlier version will be missing the new options. Let the plugin generate a fresh one on next startup.