Farmstead Mods
EN

Телепортация

Дома, варпы, /tpa, /back, случайная телепортация и точка спавна.

На этой странице

Команды 37#

КомандаСинтаксисАлиасыПравоОписание
/back/back—neoessentials.teleport.backReturn to previous locationТочка пишется перед home/warp/spawn/tpa и перед /tp|/tphere|/tpall|/tppos|/top|/jump|/jumpto. /tpo и /tpoffline из ServerAdminCommands /back не пишут. Смерть — backSettings.enableDeathBack; точка сохраняется без уведомления в чат. Свой warmup: backSettings.teleportDelay, не generalSettings. enableBackSafety по умолчанию false. Возврат в приват Farmstead Claims (или исходного RegionGuard) с teleport-escape deny отменяется.
/deletehome/deletehome <name> | /deletehome confirm | /deletehome deny—neoessentials.teleport.home.deleteDelete your home (alias)Тот же Brigadier-узел, что /delhome: registerDelHomeCommandWithName("deletehome"), если литерал ещё свободен. Право то же: neoessentials.teleport.home.delete.
/delhome/delhome <name> | /delhome confirm | /delhome deny—neoessentials.teleport.home.deleteDelete your homeПри homeSettings.requireConfirmationForDelete (по умолчанию true) удаление идёт только через /delhome confirm. Кнопки в чате шлют /delhome confirm и /delhome deny — имя читается из pending-map. Алиасы removehome и rhome пропускаются при конфликте с FTB/Essentials.
/delpwarp/delpwarp <name>—neoessentials.teleport.pwarp.deleteDelete a player warpУдаляет только свой player warp. Чужие точки этой командой не трогаются (для этого есть REST DELETE /api/warps/players/{uuid}/{name}).
/delwarp/delwarp <name>—neoessentials.teleport.warp.deleteDelete a warpТе же литералы: deletewarp, removewarp, rwarp. С консоли (OP 3) зовёт deleteWarpByAdmin, из игры — deleteWarp. Подсказки — текущие имена варпов.
/home/home [<name>]—neoessentials.teleport.homeTeleport to your homeБез имени: ключ home, иначе первый ключ ConcurrentHashMap — не алфавит. Алиас /h не ставится, если загружен ftbessentials / ftb_essentials / essentials. В тюрьме при preventJailEscape команда молчит. Кулдаун homeTeleportCooldown, warmup — generalSettings.teleportDelay.
/homes/homes—neoessentials.teleport.home.listList your homesАлиасы listhomes, homelist. Семья регистрируется только если commands.listhomes=true, ключ commands.homes на дерево не влияет. Консоль не проходит requires().
/jump/jump—neoessentials.teleport.jumpJump through wallsТот же execute, что /jumpto: луч 100 блоков, посадка на блок над хитбоксом. Сквозь стены «не прыгает», если луч упёрся в непрозрачный блок — телепорт на него сверху.
/jumpto/jumpto—neoessentials.teleport.jumptoTeleport to block you're looking atИдентичен /jump (оба register* зовут jumpToTargetBlock). Если над целью нет двух блоков воздуха — jumpto_failed.
/pwarp/pwarp <name>—neoessentials.teleport.pwarpTeleport to your player warpname обязателен, голого /pwarp нет. Семья команд не регистрируется, если warpSettings.allowPlayerWarps=false. После проверки своего player warp обработчик зовёт teleportToWarp — то есть серверный варп с тем же именем, не точку игрока.
/pwarps/pwarps—neoessentials.teleport.pwarp.listList your player warpsСписок только своих имён плюс счётчик к личному максимуму (∞ при unlimited). Чужие варпы не показывает.
/renamehome/renamehome <oldname> <newname>—neoessentials.renamehome по соглашениюRename a homeВторая ветка с тем же шаблоном двух word и правом neoessentials.renamehome.others разбирает первый аргумент как <player>:<old>, но только среди онлайн. HomeCommands перед вызовом менеджера делает toLowerCase обоим именам, тогда как /sethome кладёт ключ как ввели.
/sethome/sethome <name> | /sethome confirm | /sethome deny—neoessentials.teleport.home.setSet your home locationГолого /sethome нет, имя обязательно. confirm и deny — соседние литералы корня, имя живёт в pending-map, не в командной строке. Перезапись существующего дома всегда спрашивает подтверждение (это не ключ requireConfirmationForDelete). Алиас createhome — только без конфликтующего мода. Имя: ^[a-zA-Z0-9_-]+$, до 20 символов, регистр как ввели. При флаге teleport-escape deny в Farmstead Claims (или исходном RegionGuard) дом в такой зоне не создаётся.
/setpwarp/setpwarp <name>—neoessentials.teleport.pwarp.createCreate a player warpЛимит: meta neoessentials.warps, затем neoessentials.warp.limit.<1..100>, иначе warpSettings.maxPlayerWarps (по умолчанию 3). neoessentials.warp.limit.unlimited снимает потолок. Повтор того же имени не перезаписывает, а отвечает already_exists. Кулдаун warpSetCooldown не тратится, если создание отвергнуто.
/setspawn/setspawn [<pos>]—neoessentials.teleport.spawn.setSet spawn locationБез pos — текущие ноги. pos — BlockPosArgument, загруженный чанк. Не регистрируется, если spawnSettings.allowSpawnSet=false. Право neoessentials.teleport.spawn.set.
/setwarp/setwarp <name> [<pos>]—neoessentials.teleport.warp.createCreate a warpБез pos ставит варп в ногах. pos — BlockPosArgument (целые, ~ допустимы, чанк должен быть загружен). Точка сохраняется и используется строго в этих координатах: проверка безопасности не ищет замену и не меняет варп. Те же литералы: createwarp, addwarp. Потолок серверных варпов — поле maxWarps=50 в записи DataStore коллекции warps, не ключ config.json. Игрок-only.
/spawn/spawn—neoessentials.teleport.spawnTeleport to spawnАргумента <player> нет — чужого на спавн этой командой не увезти. Кулдаун spawnSettings.spawnCooldown пишется в lastSpawnUsage до teleportToSpawn: неудачный телепорт всё равно сжигает ожидание. spawninfo/spawni в инвентарь этой страницы не входят.
/top/top—neoessentials.teleport.topTeleport to highest blockСканирует столбец от maxBuildHeight вниз только выше текущей Y: из пещеры вынесет на поверхность над собой, ниже себя не ищет. Без solid+air — ошибка no_solid_block.
/tp/tp <target> | /tp <player> <target> | /tp <x> <y> <z>—neoessentials.teleport.tpTeleport to a player or locationИгроки — EntityArgument.player() (только онлайн). Координаты — три DoubleArgumentType, без ~ и без мира. Ветки /tp <player> <x> <y> <z> в дереве нет. Себя к себе отклоняет. Пишет /back и зовёт player.teleportTo напрямую, минуя warmup TeleportUtil.
/tpa/tpa <player>—neoessentials.teleport.request.tpaRequest to teleport to a playerplayer — EntityArgument.player(), только онлайн. Себя отклоняет. Цель с выключенным tptoggle недоступна, если у отправителя нет neoessentials.teleport.tpo. У цели с tpauto запрос не создаётся — телепорт сразу. После /tpaccept запрос тоже переносит сразу, точно к текущей позиции цели: без warmup и без поиска соседней «безопасной» точки. Если посадка попадает в приват Farmstead Claims (или исходного RegionGuard) с teleport-escape deny, перенос отменяется. Одновременно одна исходящая заявка (sentRequests).
/tpaall/tpaall [<target>]—neoessentials.tpaall по соглашениюSend tpa-here to all online playersБез аргумента хаб — отправитель; <target> (онлайн, word) требует neoessentials.tpaall.others. Каждому онлайн кроме хаба шлётся TPAHERE, пропуская тех, у кого tptoggle выключен. Из-за sentRequests на UUID отправителя реально уходит только первый успешный запрос.
/tpaccept/tpaccept—neoessentials.teleport.request.acceptAccept a teleport requestБез имени игрока: принимается единственная входящая заявка (pendingRequests ключ — UUID цели). Выбрать из очереди нельзя.
/tpahere/tpahere <player>—neoessentials.teleport.request.tpahereRequest a player to teleport to youТа же мгновенная схема, что /tpa, тип TPAHERE: при accept едет цель, не отправитель, точно к текущей позиции отправителя. Назад (/back) пишется тому, кого реально двигают.
/tpall/tpall—neoessentials.teleport.admin.tpallTeleport all players to youВсех онлайн кроме себя к ногам. Право neoessentials.teleport.admin.tpall. Консоль не проходит: нужен игрок. Каждому пишется /back.
/tpauto/tpauto | /tpauto on|off | /tpauto <target> | /tpauto <target> on|off—neoessentials.tpauto по соглашениюAuto-accept all teleport requestsГолый вызов переключает себя. Литералы on/off важнее ника: игрока on этой командой не выбрать. Чужой target — neoessentials.tpauto.others. Состояние в ConcurrentHashMap, после рестарта все снова выключены. Не обходит tptoggle: при включении на выключенный toggle приходит предупреждение.
/tpcancel/tpcancel—neoessentials.teleport.request.cancelCancel your teleport requestСнимает свою исходящую заявку. Аргументов нет.
/tpdeny/tpdeny—neoessentials.teleport.request.denyDeny a teleport requestОтклоняет ту же единственную входящую заявку. Аргументов нет.
/tphere/tphere <player>—neoessentials.teleport.tphereTeleport a player to youEntityArgument.player(), только онлайн. /back пишется цели. Исполнитель обязан быть игроком (getPlayerOrException).
/tpo/tpo <player>—neoessentials.teleport.tpoTeleport override (bypass tptoggle)ServerAdminCommands: word, только онлайн через getPlayerByName, обход tptoggle, право neoessentials.teleport.tpo, /back не пишется. DirectTeleportCommands при commands.tpo регистрирует второй ребёнок tpo → argument("player") с правом neoessentials.teleport.admin.tpo и зовёт teleportToOfflinePlayer (lastLocation из PlayerData). Какой узел съест строку /tpo Steve — см. knownIssues.
/tpoffline/tpoffline <player>—neoessentials.teleport.tpofflineTeleport to offline player's last positionword, не EntityArgument: ник офлайн-игрока проходит. Если он онлайн — обычный teleportTo на живую сущность. Офлайн — ванильный playerdata NBT (Pos, Rotation, Dimension) через usercache; нет профиля или нет Pos — not_found / no_data. /back не пишется. Мир из Dimension, иначе overworld.
/tpohere/tpohere <player>—neoessentials.teleport.tpohereBring player here overrideword + онлайн getPlayerByName. Привозит цель, игнорируя tptoggle. /back цели не пишется. Консоль отвергается (player_only).
/tppos/tppos <coordinates>—neoessentials.teleport.tpposTeleport to coordinatesVec3Argument.vec3(): можно ~ ~ ~ и относительные смещения, в отличие от тройки double у /tp. Мир не меняется. Пишет /back.
/tpr/tpr [<locationName>]randomtp, randomteleportneoessentials.teleport.tprRandom teleportationБез имени берётся randomTeleportSettings.defaultLocation (шаблон {world}). При mode=gui голый /tpr открывает биом-GUI, а /tpr <locationName> GUI обходит. Алиасы rtp, randomtp, randomteleport — те же деревья. Под /neoe и /neoessentials висят голые tpr|rtp|randomtp|randomteleport без locationName (это каталог /neoe, не эта страница). Именованный центр ставит /settpr <locationName> (сюда не заявлена). Кулдаун randomTeleportSettings.cooldown, warmup тот же teleportDelay.
/tptoggle/tptoggle | /tptoggle on|off | /tptoggle <target> | /tptoggle <target> on|off—neoessentials.tptoggle по соглашениюToggle teleport request acceptanceПо умолчанию приём включён (нет записи = true). Чужой target — neoessentials.tptoggle.others. Тоже только в памяти. Закрывает /tpa, /tpahere и /tpaall, не закрывает /tp, /tphere, /tpall, /tpo, /tpohere.
/warp/warp | /warp <name> | /warp <name> <target>—neoessentials.teleport.warpTeleport to a warpГолый /warp печатает первую страницу списка (20 имён). Аргумент name — StringArgumentType.word(), отдельной ветки <page> нет: /warp 2 ищет варп с именем 2, а не страницу 2. Чужого игрока (только онлайн, getPlayerByName) везёт узел с правом neoessentials.teleport.warp.others. Корень пропускает и neoessentials.teleport.warp, и neoessentials.teleport.warp.list; сам телепорт всё равно требует teleport.warp. При perWarpPermission нужен ещё neoessentials.warps.<name>.
/warpinfo/warpinfo <warp>—neoessentials.warpinfo по соглашениюShow info about a warpПечатает имя, мир и координаты серверного варпа (getLocationString). Player warps не показывает. Право neoessentials.warpinfo. Регистрируется отдельно (registerWarpInfoCommand), не внутри WarpCommands.register.
/warps/warps [<page>]—neoessentials.teleport.warp.listList all warpspage — IntegerArgumentType.integer(1). Регистрация завязана на commands.listwarps, не на commands.warps. Алиасы: warplist, listwarps. Право neoessentials.teleport.warp.list.

Примеры#

Спавн и три варпа для нового мира#

Поставить точку спавна и публичные варпы, не правя JSON руками, и проверить, что игрока можно отправить на варп командой.

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

setspawn отвечает успехом и запоминает ноги + взгляд. Каждый setwarp без координат ставит варп там же, где стоите. /warps печатает spawn, market (до 20 на страницу). /warpinfo market показывает мир и координаты. /warp market Steve требует neoessentials.teleport.warp.others и онлайн-Steve: его унесёт на market с warmup generalSettings.teleportDelay (по умолчанию 3 с), вам придёт warped_other. Голый /warp без имени — тот же список, что /warps, страница 1.

Дома с лимитом и переименованием#

Выдать игроку несколько точек и переименовать одну, уперевшись в maxHomes, если домов уже пять.

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

Первый sethome создаёт ключ home — именно его потом берёт голый /home. Второй — farm. /homes показывает счётчик к maxHomes (5, либо meta neoessentials.homes / neoessentials.home.). renamehome farm barn сработает, только если ключ в хранилище farm в нижнем регистре: команда сама lower-case'ит оба аргумента. /home barn — warmup и, если включено, проверка безопасности. Шестой /sethome new при пяти домах ответит limit_exceeded и дом не создаст; перезапись /sethome home не занимает слот, но попросит /sethome confirm.

Запрос TPA и обход отказа#

Проверить обычный цикл /tpa и админский обход, когда игрок закрыл запросы.

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

После tptoggle off любой /tpa на этого игрока (кроме отправителя с neoessentials.teleport.tpo) получит tptoggle_off и заявки не будет. Включили приём — /tpa Steve шлёт кликабельный запрос на requestTimeout секунд (60). Steve нажимает [Принять] или пишет /tpaccept без ника: отправитель сразу оказывается в его текущей позиции, без warmup и без подмены точки ближайшим «безопасным» местом. /tpo Steve не смотрит tptoggle и не создаёт заявку: это прямой teleportTo. Не путайте с /tpoffline: офлайн-ник /tpo из ServerAdminCommands не найдёт (player_not_found).

Достать офлайн-игрока и случайная точка#

Телепорт к последней ванильной позиции вышедшего игрока и проверка именованного RTP вокруг текущих координат.

/tpoffline Steve
/settpr wild
/tpr wild

tpoffline читает world/playerdata: если Steve в usercache и в NBT есть Pos — вы окажетесь там (в т.ч. в другом измерении из Dimension). Нет данных — no_data, /back при этом не записан. /settpr wild (команда не с этой страницы, дерево рядом с /tpr) пишет центр в randomTeleportSettings.locations.wild и чистит кэш слота; у новой записи maxRange по умолчанию 10000, не defaultMaxRange 5000. /tpr wild ищет безопасную точку в этом радиусе, затем тот же warmup: сдвинулись больше чем на 1.5 блока при cancelOnMovement — отмена.

Собрать всех к себе и откатить одного#

Событие на спавне: подтянуть онлайн, потом вернуть одного координатами с тильдами.

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

tpall переносит всех кроме вас, каждому пишется /back; если вы одни на сервере — tpall.no_players. /tppos ~ ~10 ~ поднимает вас на 10 блоков в том же мире (у /tp 100 64 200 тильд нет — только абсолютные double). /tphere Steve притягивает его к вам и пишет ему /back. Ваш /back вернёт вас на точку до tppos, не Steve.

Тонкие места#

Warmup общий, кулдауны разные, отмена по движению и урону#

generalSettings.teleportDelay (3 с) читают home, warp, spawn и /tpr. /tpa и /tpahere после принятия мгновенные. /back берёт свой backSettings.teleportDelay. Кулдауны раздельные: homeTeleportCooldown / homeSetCooldown / homeDeleteCooldown, warpCooldown / warpSetCooldown, spawnCooldown, randomTeleportSettings.cooldown, cooldownBetweenRequests. Обход: neoessentials.teleport.bypass.warmup (или .home / .warp) и …bypass.cooldown. При cancelOnMovement порог 1.5 блока. cancelOnDamage по умолчанию false; если включить, второй warmup поверх первого отвергается (already_in_progress) — у обработчика урона один pending на игрока. /tp, /tphere, /tpall, /tpo, /tpohere идут через player.teleportTo и этот warmup не видят.

Что делать: Для «мгновенного /home» выдайте bypass.warmup, не обнуляйте teleportDelay всем. Бой закрывает только путь через TeleportUtil при allowTeleportInCombat: false (5 с CombatTracker) — админский /tp из боя всё равно унесёт.

Проверка безопасности и принудительная загрузка чанков#

Home/spawn перед сканом зовут TeleportUtil.preloadChunksForTeleport (сетка 3×3, FORCED). Флаги: enableHomeTeleportSafety, enableSpawnSafety, у /back — enableBackSafety (в поставке false: выгруженный чанк происхождения считался «лава»). /tpa и /tpahere не сканируют блоки у живого игрока-цели: принятый запрос переносит точно в его текущую позицию. Опасные блоки для остальных безопасных телепортов: лава, огонь, soul fire, магма, кактус, сладкие ягоды, wither rose, nether portal, костёр, powder snow. Нет опоры под ногами или потолок в голове — findSafeLocation; если пусто — телепорт отменяется. Серверные варпы — исключение в другую сторону: они всегда сохраняются и используются ровно в заданных координатах, без поиска безопасной замены и без изменения записи. RTP грузит только чанк посадки, не 3×3.

Что делать: Для серверного варпа проверяйте площадку до /setwarp: после создания мод никогда не сдвигает эту точку. Проверить сохранённые координаты можно через /warpinfo <имя>.

Офлайн /tpoffline читает ванильный NBT, не lastLocation мода#

/tpoffline берёт профиль из usercache, затем playerdata/<uuid>.dat: список Pos и Dimension. Онлайн-тёзка коротко замыкается в живой teleportTo. Параллельный узел /tpo из DirectTeleportCommands зовёт DirectTeleportManager.teleportToOfflinePlayer — это строка PlayerData.getLastLocation() NeoEssentials, другой источник. Нет записи lastLocation — offline_player_not_found, даже если ванильный dat на месте. Ни один из путей ServerAdmin /tpo / /tpoffline / /tpohere не вызывает saveBackLocation.

Что делать: К вышедшему — /tpoffline, не /tpo. Если tpoffline.no_data — игрок ни разу не сохранялся в этом мире (или ник не в usercache). Вернуться назад после этих команд /back не поможет, точку не писали.

Лимит домов: config, meta, ноды, подтверждение#

getMaxHomesForPlayer: если задана meta neoessentials.homes (LuckPerms meta set neoessentials.homes N) — берётся она (в т.ч. ниже config, 0 = домов нельзя). Иначе max(config maxHomes=5, высшая выданная neoessentials.home.1…neoessentials.home.100). Перезапись существующего имени лимит не ест, но всегда идёт через pending + /sethome confirm. Удаление — только если requireConfirmationForDelete, через /delhome confirm. Кулдаун set/delete не тратится на отклонённую попытку. allowCrossDimensionHomes: false запрещает sethome вне overworld (проверка worldName.contains("overworld")).

Что делать: Поднять лимит группе — meta или neoessentials.home.10, не правьте maxHomes, если часть игроков должна остаться на пяти. Перезапись: клик [Подтвердить] шлёт /sethome confirm; удаление — /delhome confirm.

Player warps — отдельные хранилище и лимит, общий телепорт#

Коллекция player_warps, не warps. /pwarp / /setpwarp / /delpwarp / /pwarps появляются только при allowPlayerWarps на старте. Лимит игрока: unlimited-нода, meta neoessentials.warps, иначе max(neoessentials.warp.limit.N, maxPlayerWarps). WarpManager.teleportToPlayerWarp есть, но ни одна играбельная команда его не зовёт: /pwarp после getPlayerWarp вызывает teleportToWarp (серверные варпы). Совпадение имён увезёт на серверный варп; без серверного — not_found, хотя /pwarps имя показывает. Ветки /pwarp <player> <name> в Brigadier нет.

Что делать: Пока баг жив, публичные точки делайте /setwarp. Личные «дома» — /sethome. Не обещайте игрокам витрину чужих pwarp.

Пер-варп право видно в списке, но не пускает#

При perWarpPermission: true список /warp|/warps показывает варп, если есть neoessentials.teleport.warp или neoessentials.warps.<name>. Сам телепорт в executeWarp требует оба: teleport.warp и warps.. Право teleport.warp.list хватает, чтобы открыть голый /warp как список, но не чтобы уехать.

Что делать: На каждый публичный варп выдайте neoessentials.warps.<имя> тем, кто должен им пользоваться. Не рассчитывайте, что одного teleport.warp достаточно, если флаг включили.

Потолок серверных варпов не из config.json#

maxWarps по умолчанию 50 и читается из служебной записи коллекции warps в DataStore (loadWarps). WarpManager.loadConfig() ключ warpSettings.maxWarps не смотрит — в поставке его там и нет. Правка на дашборде «Teleportation → maxWarps» в config.json на лимит не действует. Имена варпов по умолчанию case-insensitive (нижний регистр), в отличие от ключей домов.

Что делать: Лимит 50 меняется только через запись хранилища / setMaxWarps в коде, не через config.json. Для игроков используйте maxPlayerWarps — он из конфига читается.

TPA: одна входящая, одна исходящая, очередь maxPendingRequests фиктивна#

sentRequests — одна заявка на отправителя. pendingRequests — Map по UUID цели, putIfAbsent: вторая входящая всегда target_busy, даже если maxPendingRequests = 5. allowMultipleRequests проверяет дубль той же пары, но слот цели всё равно один. /tpaccept без аргумента. Таймаут requestTimeout (60 с), кулдаун отправителя cooldownBetweenRequests (10 с) не тратится на отказ (busy / tptoggle / already_sent). Друзья autoAcceptFromFriends — заглушка isFriend.

Что делать: Не обещайте очередь из пяти /tpa. Нужно несколько целей сразу — только если починят sentRequests (сейчас ломает и /tpaall).

Тюрьма, консоль и /homes через другой ключ commands#

preventJailEscape: /home, /warp, /spawn, /pwarp отказывают jailed игроку. /tp и /tpo не проверяют. Почти все деревья требуют ServerPlayer: консоль проходит requires() у setwarp/delwarp/spawn (OP), но executeSetWarpHere/executeSpawn кастуют getEntity() к игроку. Исключение — /delwarp с консоли. Семья /homes сажается по commands.listhomes, /warps — по commands.listwarps. Выключить listhomes — /homes пропадёт, даже если commands.homes=true.

Что делать: Менять набор команд — правьте именно listhomes/listwarps. С консоли варп удаляйте /delwarp, спавн и дома ставьте из игры.

Известные проблемы#

/pwarp не телепортирует на player warp#

Issues_Discovered.md: «Player Warps having issues». В PwarpCommands.executePwarp после успешного getPlayerWarp вызывается warpManager.teleportToWarp(player, warpName) — поиск в карте серверных варпов. Комментарий в коде: «Reuse teleport logic (may need adjustment)». Метод teleportToPlayerWarp существует и помечен admin-only (OP 4), но ни /pwarp, ни /warp его не вызывают. Симптом: /setpwarp shop + /pwarps показывают shop, /pwarp shop отвечает not_found либо уносит на серверный /warp shop, если имя совпало.

Что делать: Не используйте pwarp как публичные точки игроков. Нужен рабочий телепорт — /home или /warp. Починить: в executePwarp вызывать телепорт по TeleportLocation из getPlayerWarp, не teleportToWarp.

Два разных /tpo в одном литерале#

DirectTeleportCommands.registerTpoCommand (если modules телепортации и commands.tpo) вешает /tpo <player> → teleportToOfflinePlayer (PlayerData.lastLocation), право neoessentials.teleport.admin.tpo. Позже ServerAdminCommands.registerTpo вешает /tpo <target> → онлайн teleportTo с обходом tptoggle, право neoessentials.teleport.tpo. Имена аргументов разные (player vs target), оба word: у корня tpo два ребёнка. Какой execute получит /tpo Steve на конкретной версии Brigadier, из исходника не следует однозначно.

Что делать: Онлайн в обход toggle — рассчитывайте на /tpo только если commands.tpo выключен (тогда останется узел ServerAdmin). Офлайн — всегда /tpoffline. Не документируйте /tpo как «офлайн-телепорт».

/tpaall отправляет заявку только первому игроку#

WorldInteractionCommands.executeTpaAll в цикле зовёт sendTeleportRequest(hub, online, TPAHERE). Менеджер держит одну исходящую заявку на UUID (sentRequests): вторая итерация отвечает already_sent и откатывается. Итог: «sent N» почти всегда 1 (или 0, если единственный кандидат с выключенным tptoggle). Это не очередь maxPendingRequests.

Что делать: Собрать всех — /tpall (принудительно) или разослать /tpahere руками. /tpaall в текущем виде массовым приглашением не является.

Права 61#

УзелВ реестреЧто даёт
neoessentials.renamehomeреестр: даRename own homes
neoessentials.renamehome.othersреестр: нетRename another player's homes
neoessentials.teleport.adminреестр: нетAdministrative teleportation
neoessentials.teleport.admin.tpреестр: нетTeleport players
neoessentials.teleport.admin.tpallреестр: нетTeleport all players
neoessentials.teleport.admin.tphereреестр: нетTeleport players to you
neoessentials.teleport.admin.tpoреестр: нетTeleport other players to locations
neoessentials.teleport.admin.tpposреестр: нетTeleport to coordinates
neoessentials.teleport.backреестр: даUse back teleportation
neoessentials.teleport.back.bypass.cooldownреестр: нетBypass /back cooldown
neoessentials.teleport.back.bypass.warmupреестр: нетBypass /back warmup delay (instant teleport)
neoessentials.teleport.bypass.cooldownреестр: нетBypass ALL teleport cooldowns
neoessentials.teleport.bypass.warmupреестр: нетBypass ALL teleport warmups (instant teleport)
neoessentials.teleport.compassреестр: нетUse the staff compass teleport
neoessentials.teleport.deathреестр: даTeleport to death location
neoessentials.teleport.homeреестр: даUse home system
neoessentials.teleport.home.bypass.cooldownреестр: нетBypass /home teleport & set cooldowns
neoessentials.teleport.home.bypass.warmupреестр: нетBypass /home warmup delay (instant teleport)
neoessentials.teleport.home.deleteреестр: даDelete home locations
neoessentials.teleport.home.listреестр: даList home locations
neoessentials.teleport.home.othersреестр: нетAccess others' homes
neoessentials.teleport.home.setреестр: даSet home locations
neoessentials.teleport.jumpреестр: даTeleport through walls
neoessentials.teleport.jumptoреестр: даTeleport to looking at
neoessentials.teleport.pwarpреестр: даUse player warps
neoessentials.teleport.pwarp.createреестр: даCreate player warps
neoessentials.teleport.pwarp.deleteреестр: даDelete player warps
neoessentials.teleport.pwarp.listреестр: даList player warps
neoessentials.teleport.request.acceptреестр: даAccept teleport requests
neoessentials.teleport.request.cancelреестр: даCancel sent teleport requests
neoessentials.teleport.request.denyреестр: даDeny teleport requests
neoessentials.teleport.request.tpaреестр: даSend teleport requests
neoessentials.teleport.request.tpahereреестр: даRequest players teleport to you
neoessentials.teleport.settprреестр: нетSet random teleport centre
neoessentials.teleport.spawnреестр: даUse spawn teleportation
neoessentials.teleport.spawn.bypass.cooldownреестр: нетBypass /spawn cooldown
neoessentials.teleport.spawn.bypass.warmupреестр: нетBypass /spawn warmup delay (instant teleport)
neoessentials.teleport.spawn.clearреестр: нетClear spawn location
neoessentials.teleport.spawn.infoреестр: нетView spawn information
neoessentials.teleport.spawn.setреестр: нетSet spawn location
neoessentials.teleport.topреестр: даTeleport to highest block
neoessentials.teleport.tpреестр: нетTeleport self (alias)
neoessentials.teleport.tphereреестр: нетTeleport others to self (alias)
neoessentials.teleport.tpoреестр: нетTeleport to player ignoring tptoggle
neoessentials.teleport.tpofflineреестр: нетTeleport to offline player's last location
neoessentials.teleport.tpohereреестр: нетBring player here ignoring tptoggle
neoessentials.teleport.tpposреестр: нетTeleport to coordinates (alias)
neoessentials.teleport.tprреестр: даRandom teleportation
neoessentials.teleport.warpреестр: даUse warp system
neoessentials.teleport.warp.bypass.cooldownреестр: нетBypass /warp use cooldown
neoessentials.teleport.warp.bypass.warmupреестр: нетBypass /warp warmup delay (instant teleport)
neoessentials.teleport.warp.createреестр: нетCreate warps
neoessentials.teleport.warp.deleteреестр: нетDelete warps
neoessentials.teleport.warp.listреестр: даList all available warps
neoessentials.teleport.warp.othersреестр: нетWarp another player to a warp (/warp <name> <player>)
neoessentials.tpaallреестр: нетSend tpa-here to all online players
neoessentials.tpaall.othersреестр: нетSend tpaall on behalf of another player
neoessentials.tpautoреестр: даAuto-accept all incoming teleport requests
neoessentials.tpauto.othersреестр: нетToggle tpauto for another player
neoessentials.tptoggleреестр: даToggle teleport request acceptance
neoessentials.tptoggle.othersреестр: нетToggle tptoggle for another player

Подробное руководство#

Раздел ниже — исходная документация проекта (docs/Wiki/TeleportationSystem.md). Ссылки на другие страницы вики переписаны на этот сайт; текст самих руководств не редактируется, чтобы синк с апстримом не давал конфликтов.

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