Farmstead Mods
RU

Teleportation

Homes, warps, /tpa, /back, random teleport and the spawn point.

On this page

Commands 37#

CommandSyntaxAliasesPermissionDescription
/back/back—neoessentials.teleport.backReturn to previous locationThe point is recorded before home/warp/spawn/tpa and before /tp|/tphere|/tpall|/tppos|/top|/jump|/jumpto. /tpo and /tpoffline from ServerAdminCommands do not record /back. Death — backSettings.enableDeathBack; the point is saved without a chat notification. Its own warmup: backSettings.teleportDelay, not generalSettings. enableBackSafety is false by default. A return into a Farmstead Claims (or original RegionGuard) region with teleport-escape deny is cancelled.
/deletehome/deletehome <name> | /deletehome confirm | /deletehome deny—neoessentials.teleport.home.deleteDelete your home (alias)The same Brigadier node as /delhome: registerDelHomeCommandWithName("deletehome"), if the literal is still free. Same permission: neoessentials.teleport.home.delete.
/delhome/delhome <name> | /delhome confirm | /delhome deny—neoessentials.teleport.home.deleteDelete your homeWith homeSettings.requireConfirmationForDelete (true by default) deletion goes only through /delhome confirm. The chat buttons send /delhome confirm and /delhome deny — the name is read from the pending map. The removehome and rhome aliases are skipped on conflict with FTB/Essentials.
/delpwarp/delpwarp <name>—neoessentials.teleport.pwarp.deleteDelete a player warpDeletes only your own player warp. Others' points are not affected by this command (there is REST DELETE /api/warps/players/{uuid}/{name} for that).
/delwarp/delwarp <name>—neoessentials.teleport.warp.deleteDelete a warpSame literals: deletewarp, removewarp, rwarp. From the console (OP 3) it calls deleteWarpByAdmin, from the game — deleteWarp. Suggestions — current warp names.
/home/home [<name>]—neoessentials.teleport.homeTeleport to your homeWithout a name: the home key, otherwise the first key of a ConcurrentHashMap — not alphabetical. The /h alias is not set if ftbessentials / ftb_essentials / essentials is loaded. In jail with preventJailEscape the command stays silent. Cooldown homeTeleportCooldown, warmup — generalSettings.teleportDelay.
/homes/homes—neoessentials.teleport.home.listList your homesAliases listhomes, homelist. The family is registered only if commands.listhomes=true; the commands.homes key does not affect the tree. The console does not pass requires().
/jump/jump—neoessentials.teleport.jumpJump through wallsThe same execute as /jumpto: a 100-block ray, landing on the block above the hitbox. It does not "jump" through walls: if the ray hits an opaque block, you are teleported on top of it.
/jumpto/jumpto—neoessentials.teleport.jumptoTeleport to block you're looking atIdentical to /jump (both register* call jumpToTargetBlock). If there are not two blocks of air above the target — jumpto_failed.
/pwarp/pwarp <name>—neoessentials.teleport.pwarpTeleport to your player warpname is required; there is no bare /pwarp. The command family is not registered if warpSettings.allowPlayerWarps=false. After checking your own player warp the handler calls teleportToWarp — i.e. the server warp with the same name, not the player's point.
/pwarps/pwarps—neoessentials.teleport.pwarp.listList your player warpsA list of only your own names plus a counter against your personal maximum (∞ with unlimited). Does not show others' warps.
/renamehome/renamehome <oldname> <newname>—neoessentials.renamehome by conventionRename a homeA second branch with the same two-word pattern and the permission neoessentials.renamehome.others parses the first argument as <player>:<old>, but only among online players. HomeCommands lowercases both names before calling the manager, whereas /sethome stores the key as typed.
/sethome/sethome <name> | /sethome confirm | /sethome deny—neoessentials.teleport.home.setSet your home locationThere is no bare /sethome; the name is required. confirm and deny are sibling literals of the root; the name lives in a pending map, not on the command line. Overwriting an existing home always asks for confirmation (this is not the requireConfirmationForDelete key). The createhome alias — only without a conflicting mod. Name: ^[a-zA-Z0-9_-]+$, up to 20 characters, case as typed. With the Farmstead Claims (or original RegionGuard) flag teleport-escape deny, a home cannot be created in such a zone.
/setpwarp/setpwarp <name>—neoessentials.teleport.pwarp.createCreate a player warpLimit: meta neoessentials.warps, then neoessentials.warp.limit.<1..100>, otherwise warpSettings.maxPlayerWarps (3 by default). neoessentials.warp.limit.unlimited removes the cap. Repeating the same name does not overwrite but replies already_exists. The warpSetCooldown is not spent if creation is rejected.
/setspawn/setspawn [<pos>]—neoessentials.teleport.spawn.setSet spawn locationWithout pos — your current feet. pos — BlockPosArgument, loaded chunk. Not registered if spawnSettings.allowSpawnSet=false. Permission neoessentials.teleport.spawn.set.
/setwarp/setwarp <name> [<pos>]—neoessentials.teleport.warp.createCreate a warpWithout pos it places the warp at your feet. pos — BlockPosArgument (integers, ~ allowed, the chunk must be loaded). The point is saved and used strictly at these coordinates: the safety check does not look for a replacement and does not change the warp. Same literals: createwarp, addwarp. The server warp cap is the maxWarps=50 field in a DataStore record of the warps collection, not a config.json key. Player only.
/spawn/spawn—neoessentials.teleport.spawnTeleport to spawnThere is no <player> argument — you cannot send someone else to spawn with this command. The spawnSettings.spawnCooldown is written to lastSpawnUsage before teleportToSpawn: a failed teleport still burns the wait. spawninfo/spawni are not in this page's inventory.
/top/top—neoessentials.teleport.topTeleport to highest blockScans the column from maxBuildHeight down, only above the current Y: from a cave it takes you to the surface above you; it does not search below you. Without solid+air — error no_solid_block.
/tp/tp <target> | /tp <player> <target> | /tp <x> <y> <z>—neoessentials.teleport.tpTeleport to a player or locationPlayers — EntityArgument.player() (online only). Coordinates — three DoubleArgumentType, no ~ and no world. The tree has no /tp <player> <x> <y> <z> branch. Rejects yourself to yourself. Records /back and calls player.teleportTo directly, bypassing the TeleportUtil warmup.
/tpa/tpa <player>—neoessentials.teleport.request.tpaRequest to teleport to a playerplayer — EntityArgument.player(), online only. Rejects yourself. A target with tptoggle off is unreachable unless the sender has neoessentials.teleport.tpo. For a target with tpauto no request is created — the teleport happens immediately. After /tpaccept the request also teleports immediately, exactly to the target's current position: no warmup and no search for a nearby "safe" point. If the landing falls into a Farmstead Claims (or original RegionGuard) region with teleport-escape deny, the teleport is cancelled. One outgoing request at a time (sentRequests).
/tpaall/tpaall [<target>]—neoessentials.tpaall by conventionSend tpa-here to all online playersWithout an argument the hub is the sender; <target> (online, word) requires neoessentials.tpaall.others. Every online player except the hub is sent a TPAHERE, skipping those with tptoggle off. Because of sentRequests on the sender's UUID only the first successful request actually goes out.
/tpaccept/tpaccept—neoessentials.teleport.request.acceptAccept a teleport requestNo player name: the single incoming request is accepted (the pendingRequests key is the target's UUID). You cannot pick from a queue.
/tpahere/tpahere <player>—neoessentials.teleport.request.tpahereRequest a player to teleport to youThe same instant scheme as /tpa, type TPAHERE: on accept the target moves, not the sender, exactly to the sender's current position. /back is recorded for whoever is actually moved.
/tpall/tpall—neoessentials.teleport.admin.tpallTeleport all players to youEveryone online except you to your feet. Permission neoessentials.teleport.admin.tpall. The console does not pass: a player is needed. /back is recorded for each.
/tpauto/tpauto | /tpauto on|off | /tpauto <target> | /tpauto <target> on|off—neoessentials.tpauto by conventionAuto-accept all teleport requestsA bare call toggles yourself. The on/off literals take precedence over a name: you cannot select a player named on with this command. Another target — neoessentials.tpauto.others. State is in a ConcurrentHashMap; after a restart everyone is off again. Does not bypass tptoggle: enabling it with toggle off gives a warning.
/tpcancel/tpcancel—neoessentials.teleport.request.cancelCancel your teleport requestCancels your outgoing request. No arguments.
/tpdeny/tpdeny—neoessentials.teleport.request.denyDeny a teleport requestDenies the same single incoming request. No arguments.
/tphere/tphere <player>—neoessentials.teleport.tphereTeleport a player to youEntityArgument.player(), online only. /back is recorded for the target. The executor must be a player (getPlayerOrException).
/tpo/tpo <player>—neoessentials.teleport.tpoTeleport override (bypass tptoggle)ServerAdminCommands: word, online only via getPlayerByName, bypasses tptoggle, permission neoessentials.teleport.tpo, /back is not recorded. DirectTeleportCommands with commands.tpo registers a second child tpo → argument("player") with permission neoessentials.teleport.admin.tpo and calls teleportToOfflinePlayer (lastLocation from PlayerData). Which node takes the line /tpo Steve — see knownIssues.
/tpoffline/tpoffline <player>—neoessentials.teleport.tpofflineTeleport to offline player's last positionword, not EntityArgument: an offline player's name passes. If they are online — a normal teleportTo to the live entity. Offline — vanilla playerdata NBT (Pos, Rotation, Dimension) via usercache; no profile or no Pos — not_found / no_data. /back is not recorded. World from Dimension, otherwise overworld.
/tpohere/tpohere <player>—neoessentials.teleport.tpohereBring player here overrideword + online getPlayerByName. Brings the target, ignoring tptoggle. /back is not recorded for the target. The console is rejected (player_only).
/tppos/tppos <coordinates>—neoessentials.teleport.tpposTeleport to coordinatesVec3Argument.vec3(): ~ ~ ~ and relative offsets are allowed, unlike /tp's three doubles. The world does not change. Records /back.
/tpr/tpr [<locationName>]randomtp, randomteleportneoessentials.teleport.tprRandom teleportationWithout a name randomTeleportSettings.defaultLocation is used (template {world}). With mode=gui bare /tpr opens the biome GUI, while /tpr <locationName> bypasses the GUI. The aliases rtp, randomtp, randomteleport are the same trees. Under /neoe and /neoessentials hang bare tpr|rtp|randomtp|randomteleport without locationName (that is the /neoe catalog, not this page). A named centre is set with /settpr <locationName> (not listed here). Cooldown randomTeleportSettings.cooldown, warmup — the same teleportDelay.
/tptoggle/tptoggle | /tptoggle on|off | /tptoggle <target> | /tptoggle <target> on|off—neoessentials.tptoggle by conventionToggle teleport request acceptanceAccepting is on by default (no record = true). Another target — neoessentials.tptoggle.others. Also memory-only. Blocks /tpa, /tpahere and /tpaall; does not block /tp, /tphere, /tpall, /tpo, /tpohere.
/warp/warp | /warp <name> | /warp <name> <target>—neoessentials.teleport.warpTeleport to a warpBare /warp prints the first page of the list (20 names). The name argument is StringArgumentType.word(); there is no separate <page> branch: /warp 2 looks for a warp named 2, not page 2. Sending another player (online only, getPlayerByName) is a node requiring neoessentials.teleport.warp.others. The root admits both neoessentials.teleport.warp and neoessentials.teleport.warp.list; the teleport itself still requires teleport.warp. With perWarpPermission you also need neoessentials.warps.<name>.
/warpinfo/warpinfo <warp>—neoessentials.warpinfo by conventionShow info about a warpPrints the name, world and coordinates of a server warp (getLocationString). Does not show player warps. Permission neoessentials.warpinfo. Registered separately (registerWarpInfoCommand), not inside WarpCommands.register.
/warps/warps [<page>]—neoessentials.teleport.warp.listList all warpspage — IntegerArgumentType.integer(1). Registration depends on commands.listwarps, not commands.warps. Aliases: warplist, listwarps. Permission neoessentials.teleport.warp.list.

Examples#

Spawn and three warps for a new world#

Set the spawn point and public warps without editing JSON by hand, and check that a player can be sent to a warp by command.

/setspawn
/setwarp spawn
/setwarp market
/warps
/warpinfo market
/warp market Steve

setspawn replies with success and remembers your feet + facing. Each setwarp without coordinates places the warp where you stand. /warps prints spawn, market (up to 20 per page). /warpinfo market shows the world and coordinates. /warp market Steve requires neoessentials.teleport.warp.others and an online Steve: he is taken to market with the generalSettings.teleportDelay warmup (3 s by default), and you get warped_other. Bare /warp without a name is the same list as /warps, page 1.

Homes with a limit and renaming#

Give a player several points and rename one, hitting maxHomes if there are already five homes.

/sethome home
/sethome farm
/homes
/renamehome farm barn
/home barn
/home

The first sethome creates the home key — exactly what bare /home uses later. The second — farm. /homes shows the counter against maxHomes (5, or meta neoessentials.homes / neoessentials.home.). renamehome farm barn works only if the key in storage is farm in lowercase: the command lowercases both arguments itself. /home barn — warmup and, if enabled, the safety check. A sixth /sethome new with five homes replies limit_exceeded and does not create the home; overwriting with /sethome home does not take a slot but asks for /sethome confirm.

A TPA request and bypassing a refusal#

Test the normal /tpa cycle and the admin bypass when a player has closed requests.

/tptoggle off
/tpa Steve
/tptoggle on
/tpa Steve
/tpaccept
/tpo Steve

After tptoggle off, any /tpa to that player (except from a sender with neoessentials.teleport.tpo) gets tptoggle_off and no request is created. With accepting turned back on, /tpa Steve sends a clickable request for requestTimeout seconds (60). Steve clicks [Accept] or types /tpaccept without a name: the sender instantly lands at his current position, with no warmup and no substitution of the nearest "safe" place. /tpo Steve ignores tptoggle and creates no request: it is a direct teleportTo. Do not confuse it with /tpoffline: /tpo from ServerAdminCommands will not find an offline name (player_not_found).

Reach an offline player, and a random point#

Teleport to the last vanilla position of a player who left, and test a named RTP around the current coordinates.

/tpoffline Steve
/settpr wild
/tpr wild

tpoffline reads world/playerdata: if Steve is in usercache and the NBT has Pos, you end up there (including another dimension from Dimension). No data — no_data, and /back is not recorded. /settpr wild (not a command from this page; its tree is next to /tpr) writes the centre to randomTeleportSettings.locations.wild and clears the slot cache; a new entry has maxRange 10000 by default, not defaultMaxRange 5000. /tpr wild looks for a safe point within that radius, then the same warmup: moving more than 1.5 blocks with cancelOnMovement cancels it.

Gather everyone to you and send one back#

An event at spawn: pull everyone online in, then move one back using tilde coordinates.

/tpall
/tppos ~ ~10 ~
/tphere Steve
/back

tpall moves everyone except you and records /back for each; if you are alone on the server — tpall.no_players. /tppos ~ ~10 ~ raises you 10 blocks in the same world (/tp 100 64 200 has no tildes — only absolute doubles). /tphere Steve pulls him to you and records his /back. Your /back returns you to the point before tppos, not Steve.

Edge cases#

Shared warmup, separate cooldowns, cancellation on movement and damage#

generalSettings.teleportDelay (3 s) is read by home, warp, spawn and /tpr. /tpa and /tpahere are instant after acceptance. /back uses its own backSettings.teleportDelay. Cooldowns are separate: homeTeleportCooldown / homeSetCooldown / homeDeleteCooldown, warpCooldown / warpSetCooldown, spawnCooldown, randomTeleportSettings.cooldown, cooldownBetweenRequests. Bypass: neoessentials.teleport.bypass.warmup (or .home / .warp) and …bypass.cooldown. With cancelOnMovement the threshold is 1.5 blocks. cancelOnDamage is false by default; if enabled, a second warmup on top of the first is rejected (already_in_progress) — the damage handler keeps one pending per player. /tp, /tphere, /tpall, /tpo, /tpohere go through player.teleportTo and do not see this warmup.

What to do: For an "instant /home" grant bypass.warmup rather than zeroing teleportDelay for everyone. Combat blocks only the TeleportUtil path with allowTeleportInCombat: false (5 s CombatTracker) — an admin /tp still takes you out of combat.

Safety check and forced chunk loading#

Home/spawn call TeleportUtil.preloadChunksForTeleport (a 3×3 grid, FORCED) before scanning. Flags: enableHomeTeleportSafety, enableSpawnSafety, for /back — enableBackSafety (false in the shipped config: an unloaded origin chunk was treated as "lava"). /tpa and /tpahere do not scan blocks around a live target player: an accepted request teleports exactly to their current position. Dangerous blocks for the other safe teleports: lava, fire, soul fire, magma, cactus, sweet berries, wither rose, nether portal, campfire, powder snow. No support underfoot or a ceiling at head level — findSafeLocation; if nothing is found, the teleport is cancelled. Server warps are an exception the other way: they are always saved and used at exactly the given coordinates, without looking for a safe replacement and without changing the record. RTP loads only the landing chunk, not 3×3.

What to do: For a server warp check the spot before /setwarp: after creation the mod never moves this point. You can check the saved coordinates with /warpinfo <name>.

Offline /tpoffline reads vanilla NBT, not the mod's lastLocation#

/tpoffline takes the profile from usercache, then playerdata/<uuid>.dat: the Pos list and Dimension. An online namesake short-circuits to a live teleportTo. The parallel /tpo node from DirectTeleportCommands calls DirectTeleportManager.teleportToOfflinePlayer — that is NeoEssentials' PlayerData.getLastLocation() string, a different source. No lastLocation record — offline_player_not_found, even if the vanilla dat is present. None of the ServerAdmin paths /tpo / /tpoffline / /tpohere call saveBackLocation.

What to do: To reach a player who left — /tpoffline, not /tpo. If tpoffline.no_data — the player has never been saved in this world (or the name is not in usercache). /back will not take you back after these commands; no point was recorded.

Home limit: config, meta, nodes, confirmation#

getMaxHomesForPlayer: if the meta neoessentials.homes is set (LuckPerms meta set neoessentials.homes N), it is used (even if lower than the config; 0 = no homes allowed). Otherwise max(config maxHomes=5, the highest granted neoessentials.home.1…neoessentials.home.100). Overwriting an existing name does not consume the limit but always goes through pending + /sethome confirm. Deletion — only if requireConfirmationForDelete, via /delhome confirm. The set/delete cooldown is not spent on a rejected attempt. allowCrossDimensionHomes: false forbids sethome outside the overworld (check worldName.contains("overworld")).

What to do: To raise a group's limit use meta or neoessentials.home.10; do not edit maxHomes if some players should stay at five. Overwrite: clicking [Confirm] sends /sethome confirm; delete — /delhome confirm.

Player warps — separate storage and limit, shared teleport#

The player_warps collection, not warps. /pwarp / /setpwarp / /delpwarp / /pwarps appear only with allowPlayerWarps at startup. Player limit: the unlimited node, meta neoessentials.warps, otherwise max(neoessentials.warp.limit.N, maxPlayerWarps). WarpManager.teleportToPlayerWarp exists, but no playable command calls it: /pwarp after getPlayerWarp calls teleportToWarp (server warps). A name match takes you to the server warp; without a server one — not_found, although /pwarps shows the name. Brigadier has no /pwarp <player> <name> branch.

What to do: While the bug is alive, make public points with /setwarp. Personal "homes" — /sethome. Do not promise players a showcase of others' pwarps.

A per-warp permission shows in the list but does not let you in#

With perWarpPermission: true the /warp|/warps list shows a warp if you have neoessentials.teleport.warp or neoessentials.warps.<name>. The teleport itself in executeWarp requires both: teleport.warp and warps.. The teleport.warp.list permission is enough to open bare /warp as a list, but not to travel.

What to do: For each public warp grant neoessentials.warps. to those who should use it. Do not count on teleport.warp alone being enough once the flag is on.

The server warp cap does not come from config.json#

maxWarps defaults to 50 and is read from a service record of the warps collection in DataStore (loadWarps). WarpManager.loadConfig() does not look at the warpSettings.maxWarps key — and the shipped config does not have it. Editing "Teleportation → maxWarps" in config.json on the dashboard does not affect the limit. Warp names are case-insensitive by default (lowercase), unlike home keys.

What to do: The 50 limit can be changed only via the storage record / setMaxWarps in code, not via config.json. For players use maxPlayerWarps — it is read from the config.

TPA: one incoming, one outgoing; the maxPendingRequests queue is fictitious#

sentRequests — one request per sender. pendingRequests — a Map by target UUID, putIfAbsent: a second incoming request is always target_busy, even if maxPendingRequests = 5. allowMultipleRequests checks for a duplicate of the same pair, but the target still has one slot. /tpaccept takes no argument. Timeout requestTimeout (60 s); the sender cooldown cooldownBetweenRequests (10 s) is not spent on a refusal (busy / tptoggle / already_sent). Friends autoAcceptFromFriends — an isFriend stub.

What to do: Do not promise a queue of five /tpa requests. Several targets at once — only once sentRequests is fixed (it currently breaks /tpaall too).

Jail, the console and /homes via a different commands key#

preventJailEscape: /home, /warp, /spawn, /pwarp refuse a jailed player. /tp and /tpo do not check. Almost all trees require a ServerPlayer: the console passes requires() for setwarp/delwarp/spawn (OP), but executeSetWarpHere/executeSpawn cast getEntity() to a player. The exception is /delwarp from the console. The /homes family is attached by commands.listhomes, /warps — by commands.listwarps. Turn off listhomes and /homes disappears even if commands.homes=true.

What to do: To change the command set, edit listhomes/listwarps specifically. From the console delete warps with /delwarp; set spawn and homes from the game.

Known issues#

/pwarp does not teleport to the player warp#

Issues_Discovered.md: "Player Warps having issues". In PwarpCommands.executePwarp, after a successful getPlayerWarp, warpManager.teleportToWarp(player, warpName) is called — a lookup in the server warp map. The code comment: "Reuse teleport logic (may need adjustment)". The teleportToPlayerWarp method exists and is marked admin-only (OP 4), but neither /pwarp nor /warp calls it. Symptom: /setpwarp shop + /pwarps show shop, /pwarp shop replies not_found or takes you to the server /warp shop if the name matches.

What to do: Do not use pwarps as players' public points. For a working teleport — /home or /warp. Fix: in executePwarp teleport by the TeleportLocation from getPlayerWarp, not teleportToWarp.

Two different /tpo under one literal#

DirectTeleportCommands.registerTpoCommand (if the teleportation module and commands.tpo are on) attaches /tpo <player> → teleportToOfflinePlayer (PlayerData.lastLocation), permission neoessentials.teleport.admin.tpo. Later ServerAdminCommands.registerTpo attaches /tpo <target> → online teleportTo bypassing tptoggle, permission neoessentials.teleport.tpo. The argument names differ (player vs target), both are word: the tpo root has two children. Which execute /tpo Steve reaches on a particular Brigadier version cannot be determined unambiguously from the source.

What to do: For online bypassing toggle, rely on /tpo only if commands.tpo is off (then the ServerAdmin node remains). Offline — always /tpoffline. Do not document /tpo as an "offline teleport".

/tpaall sends a request only to the first player#

WorldInteractionCommands.executeTpaAll calls sendTeleportRequest(hub, online, TPAHERE) in a loop. The manager keeps one outgoing request per UUID (sentRequests): the second iteration replies already_sent and rolls back. Result: "sent N" is almost always 1 (or 0 if the only candidate has tptoggle off). This is not the maxPendingRequests queue.

What to do: To gather everyone — /tpall (forced) or send /tpahere by hand. /tpaall in its current form is not a mass invitation.

Permissions 61#

NodeIn registryWhat it grants
neoessentials.renamehomeregistry: yesRename own homes
neoessentials.renamehome.othersregistry: noRename another player's homes
neoessentials.teleport.adminregistry: noAdministrative teleportation
neoessentials.teleport.admin.tpregistry: noTeleport players
neoessentials.teleport.admin.tpallregistry: noTeleport all players
neoessentials.teleport.admin.tphereregistry: noTeleport players to you
neoessentials.teleport.admin.tporegistry: noTeleport other players to locations
neoessentials.teleport.admin.tpposregistry: noTeleport to coordinates
neoessentials.teleport.backregistry: yesUse back teleportation
neoessentials.teleport.back.bypass.cooldownregistry: noBypass /back cooldown
neoessentials.teleport.back.bypass.warmupregistry: noBypass /back warmup delay (instant teleport)
neoessentials.teleport.bypass.cooldownregistry: noBypass ALL teleport cooldowns
neoessentials.teleport.bypass.warmupregistry: noBypass ALL teleport warmups (instant teleport)
neoessentials.teleport.compassregistry: noUse the staff compass teleport
neoessentials.teleport.deathregistry: yesTeleport to death location
neoessentials.teleport.homeregistry: yesUse home system
neoessentials.teleport.home.bypass.cooldownregistry: noBypass /home teleport & set cooldowns
neoessentials.teleport.home.bypass.warmupregistry: noBypass /home warmup delay (instant teleport)
neoessentials.teleport.home.deleteregistry: yesDelete home locations
neoessentials.teleport.home.listregistry: yesList home locations
neoessentials.teleport.home.othersregistry: noAccess others' homes
neoessentials.teleport.home.setregistry: yesSet home locations
neoessentials.teleport.jumpregistry: yesTeleport through walls
neoessentials.teleport.jumptoregistry: yesTeleport to looking at
neoessentials.teleport.pwarpregistry: yesUse player warps
neoessentials.teleport.pwarp.createregistry: yesCreate player warps
neoessentials.teleport.pwarp.deleteregistry: yesDelete player warps
neoessentials.teleport.pwarp.listregistry: yesList player warps
neoessentials.teleport.request.acceptregistry: yesAccept teleport requests
neoessentials.teleport.request.cancelregistry: yesCancel sent teleport requests
neoessentials.teleport.request.denyregistry: yesDeny teleport requests
neoessentials.teleport.request.tparegistry: yesSend teleport requests
neoessentials.teleport.request.tpahereregistry: yesRequest players teleport to you
neoessentials.teleport.settprregistry: noSet random teleport centre
neoessentials.teleport.spawnregistry: yesUse spawn teleportation
neoessentials.teleport.spawn.bypass.cooldownregistry: noBypass /spawn cooldown
neoessentials.teleport.spawn.bypass.warmupregistry: noBypass /spawn warmup delay (instant teleport)
neoessentials.teleport.spawn.clearregistry: noClear spawn location
neoessentials.teleport.spawn.inforegistry: noView spawn information
neoessentials.teleport.spawn.setregistry: noSet spawn location
neoessentials.teleport.topregistry: yesTeleport to highest block
neoessentials.teleport.tpregistry: noTeleport self (alias)
neoessentials.teleport.tphereregistry: noTeleport others to self (alias)
neoessentials.teleport.tporegistry: noTeleport to player ignoring tptoggle
neoessentials.teleport.tpofflineregistry: noTeleport to offline player's last location
neoessentials.teleport.tpohereregistry: noBring player here ignoring tptoggle
neoessentials.teleport.tpposregistry: noTeleport to coordinates (alias)
neoessentials.teleport.tprregistry: yesRandom teleportation
neoessentials.teleport.warpregistry: yesUse warp system
neoessentials.teleport.warp.bypass.cooldownregistry: noBypass /warp use cooldown
neoessentials.teleport.warp.bypass.warmupregistry: noBypass /warp warmup delay (instant teleport)
neoessentials.teleport.warp.createregistry: noCreate warps
neoessentials.teleport.warp.deleteregistry: noDelete warps
neoessentials.teleport.warp.listregistry: yesList all available warps
neoessentials.teleport.warp.othersregistry: noWarp another player to a warp (/warp <name> <player>)
neoessentials.tpaallregistry: noSend tpa-here to all online players
neoessentials.tpaall.othersregistry: noSend tpaall on behalf of another player
neoessentials.tpautoregistry: yesAuto-accept all incoming teleport requests
neoessentials.tpauto.othersregistry: noToggle tpauto for another player
neoessentials.tptoggleregistry: yesToggle teleport request acceptance
neoessentials.tptoggle.othersregistry: noToggle tptoggle for another player

Detailed guide#

The section below is the project's original documentation (docs/Wiki/TeleportationSystem.md). Links to other wiki pages are rewritten to this site; the guides themselves are not edited, so upstream syncs stay conflict-free.

Version: 1.0.5+build.54 · Config: config.json → teleportation / generalSettings sections


Overview#

Full teleportation suite — homes, warps, player warps, spawn, TPA requests, random teleport, direct TP commands, and utility teleports. All with safe-location detection, delay/warmup, and /back support.


Safe Location Detection#

All teleport destinations are checked for safety: - Feet block must have a solid collision shape (correctly handles slabs, stairs, glass, trapdoors) - Head block must be passable (air, non-solid) - Dangerous blocks are rejected: lava, fire, soul fire, magma, cactus, sweet berry bush, wither rose, nether portal, campfire, soul campfire, powder snow - A top-down column scan finds the surface first, then an expanding XZ radius search as fallback - Safety can be disabled per feature in config


Chunk Loading & Safety Interaction#

Before any teleport fires, NeoEssentials force-loads the destination chunks to ensure the target location is fully loaded in memory. This happens regardless of whether safety checks are enabled.

How it works#

  1. A 3×3 grid of chunks centred on the destination is loaded via ServerLevel.getChunkSource().addRegionTicket() using the FORCED ticket type.
  2. Safety validation (if enabled) runs after chunk loading, so the safety scanner always has valid block data to work with.
  3. Once the teleport completes the forced-load tickets are released; normal chunk unloading resumes.

Disabling safety checks#

Setting enableHomeTeleportSafety, enableWarpSafety, or enableSpawnSafety to false in config.json completely bypasses the block-level validation step. The chunks are still preloaded, but the player is teleported directly to the stored coordinates without any safe-location search.

Warning: Disabling safety can land players inside blocks or above the void if the destination has changed since the location was saved.

When teleport fails due to unloaded chunks#

If chunk loading itself fails (e.g., the target dimension is unavailable or the world is being unloaded), the teleport is cancelled with a descriptive error message that includes the world name and coordinates so the player knows exactly where the failed destination was.

Configuration quick-reference#

Config key Section Effect on chunk loading
enableHomeTeleportSafety homeSettings Disables safety scan; chunks still preloaded
enableWarpSafety warpSettings Disables safety scan; chunks still preloaded
enableSpawnSafety spawnSettings Disables safety scan; chunks still preloaded
teleportDelay (generalSettings) generalSettings Chunks are preloaded at warmup start, not at fire time

Homes#

Commands#

Command Syntax Permission Description
/home /home [name] neoessentials.teleport.home Teleport to a home
/sethome /sethome [name] neoessentials.teleport.home.set Set home at current location
/delhome /delhome [name] neoessentials.teleport.home.delete Delete a home
/deletehome alias same Alias
/homes /homes neoessentials.teleport.home.list List all homes
/renamehome /renamehome <old> <new> neoessentials.renamehome Rename a home

Aliases: /h for /home · /createhome for /sethome · /deletehome, /removehome, /rhome for /delhome · /homelist//listhomes for /homes. /h, /createhome, /removehome, /rhome are skipped automatically if a conflicting mod (FTB Essentials, Essentials) is detected.

Overwriting an existing home with /sethome <name> requires confirmation, same as /delhome — you'll be prompted with clickable /sethome confirm//sethome deny buttons.

Config (teleportation.homeSettings)#

Key Default Description
maxHomes 5 Max homes per player
allowCrossDimensionHomes true Allow homes in other dimensions
homeSetCooldown 30 Seconds between /sethome uses (0 = disabled)
homeTeleportCooldown 5 Seconds a player must wait between /home uses (0 = disabled)
homeDeleteCooldown 10 Seconds between /delhome uses (0 = disabled)
requireConfirmationForDelete true Require a confirmation dialog before deleting a home
enableHomeTeleportSafety true Check safe location on home TP
logHomeActions true Log home set/delete/teleport actions

teleportDelay (warmup before the teleport fires) and cancelOnMovement (cancel if the player moves during warm-up) are global settings under generalSettings, not per-feature — see the table below.


Warmup & Cooldown Behaviour#

Setting Config key Section Description
Warmup delay generalSettings.teleportDelay config.json Seconds to wait before any teleport completes. 0 = instant.
Warmup countdown generalSettings.enableTeleportWarmup config.json Show a countdown message to the player during the warmup.
Cancel on move teleportation.generalSettings.cancelOnMovement config.json Cancel teleport if the player moves during warmup (applies to all teleport types).
Home cooldown teleportation.homeSettings.homeTeleportCooldown config.json Seconds between successive /home uses. 0 = no cooldown.
Warp cooldown teleportation.warpSettings.warpCooldown config.json Seconds between successive /warp uses. 0 = no cooldown.
Spawn cooldown teleportation.spawnSettings.spawnCooldown config.json Seconds between successive /spawn uses. 0 = no cooldown.

Warps#

Commands#

Command Syntax Permission Description
/warp /warp [name] [player] neoessentials.teleport.warp Teleport to a warp (or warp another player)
/warp /warp or /warp <page> same List all warps (paginated)
/setwarp /setwarp <name> neoessentials.teleport.warp.create Create a warp
/delwarp /delwarp <name> neoessentials.teleport.warp.delete Delete a warp
/warps /warps [page] neoessentials.teleport.warp.list List warps (20 per page)
/warpinfo /warpinfo <name> neoessentials.warpinfo Show warp coordinates and world
/pwarp /pwarp [name] neoessentials.teleport.pwarp Teleport to your player warp
/setpwarp /setpwarp <name> neoessentials.teleport.pwarp.create Create a player warp
/delpwarp /delpwarp <name> neoessentials.teleport.pwarp.delete Delete a player warp
/pwarps /pwarps neoessentials.teleport.pwarp.list List your player warps

Aliases: /createwarp//addwarp for /setwarp · /deletewarp, /removewarp, /rwarp for /delwarp · /warplist//listwarps for /warps.

Set perWarpPermission: true in config to require neoessentials.warps.<name> per warp.

Warp cooldown is configured via teleportation.warpSettings.warpCooldown in config.json (seconds; 0 = no cooldown).

Server-wide warp limit defaults to 50 total warps and, unlike the per-feature settings above, is not currently read from config.json at runtime — it's tracked in the warp data store's own internal record. The dashboard's Teleportation settings page shows/edits a warpSettings.maxWarps value in config.json, but changing it there has no effect on the actual enforced limit.


Spawn#

Command Syntax Permission Description
/spawn /spawn [player] neoessentials.teleport.spawn Teleport to server spawn
/setspawn /setspawn neoessentials.teleport.spawn.set Set spawn at current location

Spawn cooldown is configured via teleportation.spawnSettings.spawnCooldown in config.json (seconds; 0 = no cooldown). Warmup is controlled globally by generalSettings.teleportDelay + generalSettings.enableTeleportWarmup.


Teleport Requests (TPA)#

Command Syntax Permission Description
/tpa /tpa <player> neoessentials.teleport.request.tpa Request to TP to a player
/tpahere /tpahere <player> neoessentials.teleport.request.tpahere Request player TP to you
/tpaccept /tpaccept neoessentials.teleport.request.accept Accept incoming request
/tpdeny /tpdeny neoessentials.teleport.request.deny Deny incoming request
/tpcancel /tpcancel neoessentials.teleport.request.cancel Cancel your outgoing request
/tptoggle /tptoggle [on\|off] neoessentials.tptoggle Toggle accepting TP requests
/tpauto /tpauto [on\|off] neoessentials.tpauto Auto-accept all incoming TPA requests
/tpaall /tpaall [player] neoessentials.tpaall Send TPA-here to all online players

Random Teleport#

Command Syntax Permission Description
/tpr /tpr [location] neoessentials.teleport.tpr Teleport to a random location
/rtp alias same Alias
/randomtp alias same Alias
/randomteleport alias same Alias
/settpr /settpr <name> neoessentials.teleport.settpr Set a named RTP centre point

Config (teleportation.randomTeleportSettings)#

Key Default Description
defaultMinRange 0 Minimum distance from centre (global default)
defaultMaxRange 5000 Maximum distance from centre (-1 = half the world border). See Performance below before raising this much on a server without pre-generated terrain
findAttempts 6 Attempts to find a safe spot before giving up
cooldown 60 Seconds between uses per player
cacheThreshold 5 Pre-computed location cache size to maintain per named location
prewarmBatchSize 2 Max NEW cache slots one /tpr use may force-generate in the background right after teleporting — see Performance
excludedBiomes [] Biomes excluded globally (empty by default)
mode "command" "command" = /tpr teleports instantly (unchanged default behavior). "gui" = bare /tpr (no location argument) opens a chest-GUI biome picker instead — see below
biomeSearchRadius 6400 GUI-only — search radius in blocks for a biome-targeted teleport, same engine /locate biome uses
biomeSearchStep 32 GUI-only — horizontal search step; larger = faster but coarser
biomeMenuItems [] GUI-only — pin specific biomes to fixed slots and/or override their icon, see below

The built-in "default" named location under randomTeleportSettings.locations additionally excludes all ocean variants and minecraft:the_void — configure per-location via /settpr <name>.

Biome-Select GUI (mode: "gui")#

When enabled, bare /tpr//rtp opens a paginated chest GUI instead of teleporting instantly:

  • One slot per biome the current dimension can actually generate — this is read live from the dimension's own generator (BiomeSource.possibleBiomes()), so modded biomes appear automatically with no configuration needed. 45 biomes per page, with prev/close/next nav buttons.
  • A dedicated "Random — Any Biome" button (bottom-right) behaves exactly like plain /tpr — no biome constraint, uses the normal cached random-teleport path.
  • Clicking a specific biome closes the GUI and searches for that biome using the same engine /locate biome uses (ServerLevel.findClosestBiome3d) from a jittered center within the configured range, then finds a safe Y the same way plain RTP does. If no match turns up within biomeSearchRadius blocks or the match falls outside the world border, the player gets a clear "could not find that biome within the server border" error instead of being teleported somewhere unexpected.
  • /tpr <locationName> (an explicit location argument) always bypasses the GUI, even in "gui" mode — the GUI only intercepts the bare, no-argument form.
  • Same neoessentials.teleport.tpr permission gates both the plain command and the GUI — no separate permission node.

Biome icons

Every biome gets a default icon — a wooded biome shows its own sapling/propagule/fungus (the "growable" item, not the log), and biomes with no tree of their own show a block unique to that biome (sand for desert, water bucket for ocean, netherrack for nether wastes, etc.). Anything not in that built-in table (every biome from a mod that isn't specifically supported) falls back to a generic minecraft:grass_block icon.

biomeMenuItems — pinning and icon overrides

"biomeMenuItems": [
  // Pin to a fixed slot (0 = top-left box, 1 = next box, ... 44 = last box on page 1),
  // keep the default icon (spruce_sapling, from the built-in table):
  { "slot": 0, "biome": "minecraft:taiga" },

  // Pin to a slot AND override the icon:
  { "slot": 1, "biome": "minecraft:desert", "item": "minecraft:cactus" },

  // Icon-only override, no slot — stays auto-positioned like any other biome,
  // just with a custom icon (this is also how to support a biome mod's own
  // saplings, since this mod can't auto-detect a modded biome's tree species):
  { "biome": "biomesoplenty:redwood_forest", "item": "biomesoplenty:redwood_sapling" }
]

Both slot and item are independently optional. A pin only reserves its slot on page 1; pinned biomes are removed from the auto-listed pool (shown once, at their pinned position) — every other biome, including unrecognized/modded ones, still fills the remaining slots automatically in alphabetical order, continuing onto later pages exactly as if no pins existed. A pin referencing a biome that doesn't exist in the current dimension, or a slot outside 0-44, is silently skipped — it can't break the GUI.

Cancelling an in-progress /tpr#

/tpr runs through the same warmup as /home//warp//tpa (teleportation.generalSettings. teleportDelay, 3 seconds by default) — just move and it cancels, same as any other teleport (generalSettings.cancelOnMovement, on by default). /tpr now announces this ("Teleporting in 3 second(s) — move to cancel.") when the warmup starts, so it's actually visible instead of a silent delay with no indication it could be interrupted. There's no separate /tpr cancel command — moving during the warmup already is the cancel.

Performance — why RTP could lag or crash a server#

Every teleport into terrain that hasn't been visited/generated before forces a real, main- thread-blocking chunk generation — there's no way around this for a genuinely random destination, but a naive implementation can force far more of these per /tpr than actually necessary, which is exactly what was happening before this was fixed:

  • The safety-preload step used to force-generate a 3×3 grid (9 chunks) around every teleport destination unconditionally, even for RTP, which already verifies its own landing spot and never reads the 8 neighbour chunks at all. Fixed — RTP now only force-loads the one chunk it actually lands in.
  • Refilling the background location cache after a successful teleport used to fire the entire gap up to cacheThreshold (up to 10 forced generations) as one burst immediately after the teleport — a second lag spike stacked right on top of the teleport's own cost. Fixed via prewarmBatchSize — now only a couple of new slots are force-generated per use, and the cache tops back up gradually across several /tpr calls instead of all at once.
  • defaultMaxRange/findAttempts/cacheThreshold defaults were lowered (10000→5000, 10→6, 10→5) — smaller/fewer attempts by default means less chance of repeatedly pushing into brand-new, ungenerated territory on a server that hasn't pre-generated terrain around itself.

If /tpr is still causing lag/crashes after updating: pre-generate terrain out to your players' expected roaming radius (a chunk pre-generator mod, or just having players explore normally, both work — subsequent /tpr uses landing in already-generated terrain are cheap). Lowering defaultMaxRange further, or findAttempts, reduces worst-case cost at the expense of a higher "no safe location found" retry rate.


Admin Teleport Commands#

Command Syntax Permission Description
/tp /tp <player> or /tp <x y z> neoessentials.teleport.tp Teleport to player or coords
/tphere /tphere <player> neoessentials.teleport.tphere Bring player to you
/tpall /tpall neoessentials.teleport.admin.tpall Bring all players to you
/tppos /tppos <x> <y> <z> neoessentials.teleport.tppos Teleport to exact coordinates
/tpo /tpo <player> neoessentials.teleport.admin.tpo TP to player, bypasses tptoggle
/tpohere /tpohere <player> neoessentials.teleport.tpohere Bring player, bypasses tptoggle
/tpoffline /tpoffline <player> neoessentials.teleport.tpoffline TP to offline player's last position
/world /world [dimension] [player] neoessentials.world Teleport to a world/dimension

Utility Teleports#

Command Syntax Permission Description
/back /back neoessentials.teleport.back Return to previous location
/top /top neoessentials.teleport.top Teleport to highest block above you
/jump /jump neoessentials.teleport.jump Jump through walls (short-range teleport in the direction you're facing)
/jumpto /jumpto neoessentials.teleport.jumpto Teleport to the block you're looking at
/bottom /bottom neoessentials.bottom Teleport to bottom of world at your X/Z

Data Files#

All teleportation data is persisted through the pluggable DataStore backend (JSON by default — see Storage Backend), not dedicated bespoke files:

Collection Contents
playerdata_homes Per-player named home locations (one record per player, id = UUID)
playerdata_back_locations Per-player /back return location
warps Server warp locations
player_warps Player-created warp locations
spawn Spawn location (coordinates & world)

Legacy files: neoessentials/playerdata/homes/<uuid>.json, neoessentials/homes.json, neoessentials/warps.json, playerwarps.json, and neoessentials/spawn.json are the pre-DataStore on-disk formats. They are only read once, automatically, to migrate their contents into the DataStore collections above — they are never written to again afterward.


Back to Wiki Home