Movement
Spawn, homes, warps, TPA, /back, random teleport and /near — the seven modules that move a player.
Seven modules move players. Five of them share the same warmup: a countdown drawn as an action bar and a title, cancelled by moving or by taking damage, with a per-second sound and a permission that skips it entirely. Each module has its own copy of those settings, so a home can be instant while a warp takes five seconds.
A teleport that cannot happen at all says why instead of doing nothing. Spawn, homes, warps, TPA, /back
and portals share four lines in messages.yml: errors.server-unreachable (the place is on a server this
one cannot reach), errors.world-not-loaded, errors.player-not-found and errors.teleport-failed.
Spawn
/spawn teleports to the server spawn. /spawn set stores it, and needs
exyliasurvivalcore.spawn.set.
| Setting | Default | What it does |
|---|---|---|
warmup-seconds | 3 | Countdown before the teleport |
cancel-on-move, cancel-on-damage | true | What stops it |
permission-bypass-warmup | exyliasurvivalcore.spawn.bypass | The node that skips the countdown — the string is yours to change |
blacklisted-worlds | [] | Worlds /spawn refuses from |
teleport-on-join | false | Every join goes to spawn |
teleport-on-first-join | true | A first join goes to spawn |
respawn-at-spawn | true | Death sends them to spawn |
override-bed-spawn | true | Even when they have a bed |
/spawn itself checks no permission. The spawn is also pushed to clients as a waypoint where
Apollo or Feather is installed.
Every server keeps its own spawn. The row is named after the server, so servers sharing one database
no longer overwrite each other with a place in a world the others do not have. A server with no row of
its own reads the single spawn older versions wrote and saves a copy under its own name. If the spawn's
world is not loaded on that server, respawn-at-spawn leaves the respawn point alone.
Homes
Personal named locations. /sethome [name], /home [name], and /homes for the menu — rename,
re-icon, teleport, delete.
| Setting | Default | What it does |
|---|---|---|
max-homes | 3 | The floor for everybody |
default-home-name | home | What /sethome with no name is called |
default-icon | GRASS_BLOCK | The icon a new home gets |
home-name-max-length | 16 | Longest name |
warmup-seconds and friends | 3 | As above |
How many homes a player gets is a permission tier: exyliasurvivalcore.homes.max_homes.<n>, and the
highest node they hold wins. max-homes is only what somebody with no node gets.
Homes store a server alongside the coordinates, so /home works from anywhere on the network. A home
on another server has no local location at all — which is why the API exposes a teleport method rather
than leaving callers to read the coordinates.
/homesadmin delhome <player> <home> and /homesadmin listhomes <player> need
survivalcore.admin.homes, and both run from the console.
Warps
Server-wide named locations, built from /warpadmin. Each one has a display name, an icon, a cost, an
optional permission and a location.
/warp opens the list of the ones a player may use; /warp <id> goes straight there. Warps also cross
the network.
| Bypass node | What it skips |
|---|---|
exyliasurvivalcore.warps.bypass | Both the cost and the cooldown |
exyliasurvivalcore.warps.bypass.cost | The cost |
exyliasurvivalcore.warps.bypass.cooldown | The cooldown |
exyliasurvivalcore.warps.bypass also skips the warp's countdown.
| Setting | Default | What it does |
|---|---|---|
warmup-seconds | 3 | Countdown before the warp |
cancel-on-move, cancel-on-damage | true | What stops it |
cooldown-seconds | 0 | Seconds before the same player may use the same warp again. 0 turns it off |
blacklisted-worlds | [] | Worlds /warp refuses from |
The cooldown is counted per player and per warp, and it is stored in the database (sc_warp_cooldowns),
so a warp that puts the player on another server does not hand them a fresh cooldown there.
The cost is checked before the countdown but charged on arrival. Money and cooldown are only spent once the teleport succeeds: walking out of the countdown, a world that is no longer loaded or a server that cannot be reached costs nothing and starts no cooldown.
modules/warps/menus/warp_setup.yml is an admin editor that lives with the player menus rather than under
menus/admin/, so your edits to it are kept. Everything under menus/admin/ is rewritten from the jar on
every start.
TPA
/tpa <player> asks to go to them; /tpahere <player> asks them to come to you. /tpaccept and
/tpadeny answer, with an optional name to pick which request. With no name they answer the newest one.
/tpacancel [player] takes back a request you sent and have not had answered yet, the newest one when no
name is given. It needs exyliasurvivalcore.tpa.cancel. Tab completion only offers names that mean
something: /tpaccept and /tpadeny suggest the players waiting on you, and /tpacancel suggests the
players you asked.
Across servers
The other player can be on any server of the network. That needs ExyliaLib's cross-server teleports: where
they are not available, a player on another server reads as not found. Whoever moves is handed over to the
other player's server. A tpa moves the sender and a tpahere moves the target, and where the other player
stands is read when the countdown ends, not when the request was accepted.
- Auto-accept is decided by the target's own settings, on the target's server.
- The confirmation screen shows a player on another server by that server's name. Their world, position,
health and food read
—.
Each server keeps its own copy of the requests that involve somebody standing on it. A sender who leaves for a third server while waiting has no copy there. When the target accepts, the target is told it was accepted, but nobody moves. The source comment says such a sender "still gets their answer wherever they are". The code does not do that.
The request itself is a centred prompt with clickable [✔ ACCEPT] and [✘ DENY] buttons.
tpa.request-received and tpa.request-here-received are now lists, one line per entry, and a line may open
with [center]. An existing messages.yml gets the new prompt only where the line was still the old
default. A line you rewrote stays yours.
| Setting | Default | What it does |
|---|---|---|
request-expire-seconds | 60 | How long a request lives |
send-confirm-default | true | Whether a confirmation screen is shown before sending |
tpa-enabled-default | true | Whether players accept requests at all to begin with |
auto-accept-default | false | Whether requests are accepted without asking |
/tpatoggle flips whether they receive requests; /tpatoggle autoaccept and /tpatoggle confirm
flip the other two. /autotpaaccept exists as well and is an exact duplicate of /tpatoggle autoaccept — same behaviour, same node.
All three of these preferences are also on the /settings screen, reading and writing the same rows.
Back
/back returns a player to where they were. Which moments are remembered is configuration:
| Setting | Default |
|---|---|
save-on-death | true |
save-on-teleport | true |
save-on-portal | false |
blacklisted-worlds | [] |
One place is remembered per player, and it is stored in the database (sc_back). It survives a restart,
and it follows the player to another server: the place they left on one server is the one /back offers
on the next. It stops being offered after teleport.back-history-minutes in config.yml, 30 by default.
Homes, /back and a TPA on the same server record the place only when the teleport succeeds, so a
countdown the player walks out of leaves no /back pointing at where they stood. A warp records it after
its countdown, just before the move, and so does a TPA that hands the player to another server. The other
server reads the row as they join, so it is written before they leave.
Random teleport
/rtp opens a world list; /rtp <world> goes straight to one. Worlds come from
modules/rtp/worlds.yml — a world that is not in the file cannot be reached at all.
| Per-world key | What it does |
|---|---|
enabled | Whether it is offered |
display-name, icon | How it appears in the menu |
min-x, max-x, min-z, max-z | The box searched |
price | Charged per teleport |
cooldown | Seconds, or -1 to use the module's own |
biome-blacklist | Biomes a landing spot may not be in |
A pool keeps safe locations ready in advance, so /rtp is instant rather than a search:
pool:
enabled: true
size: 40
max-concurrent-searches: 3
refill-interval: 30Pre-generating the world's chunks — with Chunky, for instance — collapses the time the pool needs to fill.
bypass-cooldown-permission and bypass-price-permission both ship as survivalcore.rtp.bypass —
note the short prefix. They are whatever you write there, not fixed nodes.
/rtpadmin forcertp <player> <world> sends somebody, and /rtpadmin pool reports the pool.
Near
/near lists nearby players with their distance and a compass direction.
| Setting | Default | What it does |
|---|---|---|
display-mode | UI | UI for the menu, CHAT for a chat list |
default-radius | 100 | Searched when nothing else applies |
max-radius | 1000 | The ceiling, permission included |
cooldown-seconds | 3 | Between uses |
distance-type | HORIZONTAL | HORIZONTAL or 3D, for filtering |
exyliasurvivalcore.near.radius.<n> raises a player's radius, highest node winning — but max-radius
still caps it. distance-type only decides who is filtered in; the distance shown is always
horizontal.
The teleport section
config.yml has a teleport section, handed to ExyliaLib on start and again on every /sc reload. It holds
the defaults for any teleport that does not set its own, plus what cross-server handovers share.
teleport:
warmup-seconds: 0.0
cancel-on-move: true
cancel-on-damage: true
safe-search-radius: 5
safe-max-attempts: 32
cross-server-ttl-seconds: 300
cross-server-settle-seconds: 0.5
back-history-size: 3
back-history-minutes: 30
tpa-expiry-seconds: 60
tpa-max-pending: 8
random-max-attempts: 16| Key | Range | What it does here |
|---|---|---|
warmup-seconds | 0 or more | The countdown for a teleport no module times itself. Decimals allowed |
cancel-on-move, cancel-on-damage | — | The same, for that countdown |
cross-server-ttl-seconds | 30–3600 | How long a destination queued for another server stays valid |
cross-server-settle-seconds | 0.05–5 | How long the arriving server waits before moving the player |
back-history-minutes | 1–1440 | How long /back keeps offering its place |
Values outside the range are clamped.
The modules only set a countdown when theirs is above zero and the player has no bypass node. Every other
teleport uses this default instead: a spawn, home or /back for a player holding that module's bypass node,
a warp for a player holding exyliasurvivalcore.warps.bypass, a spawn, home, warp, TPA or /back whose own
warmup-seconds is 0, a portal, and the move a warp makes after its own countdown.
Raising it above 0 adds a second countdown to warps and a plain one, with no title or sound, to the rest.
safe-search-radius, safe-max-attempts, back-history-size, tpa-expiry-seconds, tpa-max-pending
and random-max-attempts belong to ExyliaLib's own safe landings, back history, requests and random
teleports. No module here uses them. TPA requests expire after the tpa module's request-expire-seconds,
/back keeps one place, and /rtp searches with its own pool.
Something missing on this page? Tell us on Discord