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
- Drop
SimplyTheBasics.jarinto your server'splugins/folder. - Restart the server, or run
/reload. - That's it —
config.yml,homes.yml, andwarps.ymlgenerate 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.
Player warps
Admin · OP only
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>-enabledControls whether random teleport commands are allowed within specific dimensions.
rtp.overworld-radiusHow far from world spawn /rtp is allowed to drop someone in the Overworld.
rtp.nether-radiusSame idea, scaled down for the Nether's tighter coordinate ratio.
rtp.cooldown-secondsTracked per player in memory, so it resets cleanly whenever the plugin reloads.
tpa.timeout-secondsAfter this many seconds, a pending /tpa or /tpahere request just expires.
home.max-homesCap 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-warpsCap how many warps one player can create. Three by default, zero means no cap.
sleep.percent-requiredThe 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-messagesCustomize 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.
Player warps
Other
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
sleepconfiguration 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-messagesconfiguration block to customize announcements when players log in. - Provides separate configuration lines for
first-join(new players) and standardjoin(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()andHomeManager.setHome/deleteHomewrites are now forced smoothly back to the server main thread usingBukkit.getScheduler().runTask(). - RTP Cooldown Memory Leaks: Refactored the
/rtpcooldown tracking architecture from astaticmap 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
dimensionsconfig layer supportingallow-netherandallow-endto selectively disable entry portals altogether. - Granular Dimension RTP: Expanded config logic to include specific
overworld-enabled,nether-enabled, andend-enabledswitches for explicit context mapping. - Source Toggles: Migrated utility commands like
afkandinvdirectly to the master core commands toggle map withinconfig.yml.