RE:NODE

Minecraft12 мин чтения

Команды сервера Minecraft: шпаргалка по консоли и операторам

Команды оператора, селекторы целей, execute и gamerule, которые стоит менять, а также правила консоли и четыре команды, способные стоить вам мира.

0 прочтений

Для управления сервером Minecraft нужно около двадцати команд, и в консоли сервера они ведут себя немного иначе, чем в чате: без ведущего слеша, без позиции игрока и с уровнем прав, который всегда максимален. Это справочник по этим двадцати командам, плюс селекторы целей, превращающие одну команду в сотню, синтаксис execute, на котором построено всё современное, и gamerule с их настоящими значениями по умолчанию. Он относится к ванильному серверу и к Paper, на котором работает линейка Minecraft у RE:NODE; там, где Paper добавляет что-то полезное, это отмечено.

Консоль - это не окно чата#

Консоль панели - это стандартный ввод процесса сервера. Всё, что вы набираете, передаётся серверу как команда напрямую, поэтому ведущий /, который игрок вводит в чате, не нужен, а в большинстве сборок вызывает ошибку. Набирайте list, а не /list.

Отсюда следуют ещё три вещи:

  • Консоль имеет уровень прав 4, и его нельзя понизить. Это не игрок, поэтому права плагинов на неё тоже не распространяются. Всё, что запрещает группа LuckPerms, консоль всё равно может сделать. Поэтому она - способ вернуться, если вы заперли себя за собственным деревом прав; дерево, которое к этому приводит, описано в руководстве по LuckPerms.
  • У консоли есть позиция, и это не то место, где находитесь вы. Команды из консоли выполняются в точке появления в верхнем мире. Поэтому @p означает «игрок, ближайший к точке появления», а не «ближайший ко мне», а @s недопустим, потому что консоль не сущность. Назовите игрока по имени или используйте execute as @a at @s run ....
  • Вывод команды - это вывод консоли. Ошибки появляются в том же потоке, что и всё остальное, поэтому неудавшаяся команда пролетает среди болтовни плагинов. Как это отфильтровать, описано в статье чтение консоли.

Когда команда неверна, сервер печатает введённое обратно с меткой, показывающей, где он остановился:

code
Unknown or incomplete command, see below for errorgamemode creativ<--[HERE]

Метка точна. Если она указывает на имя игрока, то игрок не в сети или имя написано с ошибкой; если на пробел после вроде бы полной команды, не хватает аргумента.

Уровни оператора и кто что может запускать#

op <player> по умолчанию выдаёт уровень 4, то есть всё. Уровни всё равно существуют, хранятся для каждого оператора отдельно, и ими стоит пользоваться.

УровеньЧто даёт
1Обход защиты точки появления
2Команды-читы: gamemode, give, tp, setblock, summon, effect, командные блоки
3Управление игроками: kick, ban, pardon, op, deop, whitelist
4Управление сервером: stop, save-all, save-off, save-on

Операторы хранятся в ops.json в корне сервера, и уровень можно менять там напрямую, пока сервер остановлен:

ops.json
[  {    "uuid": "069a79f4-44e9-4726-a5be-fca90e38aaf5",    "name": "Notch",    "level": 3,    "bypassesPlayerLimit": false  }]

Значения по умолчанию задают два ключа server.properties: op-permission-level (по умолчанию 4) - уровень, который выдаёт /op, а function-permission-level (по умолчанию 2) - уровень, с которым выполняются функции датапаков и командные блоки. enable-command-block по умолчанию false, и оставить так - разумное решение по безопасности на публичном сервере, потому что командный блок - это исполнитель команд уровня 2, который может поставить любой строитель с нужным правом. Каждый ключ этого файла описан в статье server.properties: подробный разбор.

На сервере с плагинами статус оператора - грубый инструмент, который к тому же обходит проверки прав плагинов. Работает такой приём: снять op со всех и вместо этого выдавать узлы minecraft.command.<name> - minecraft.command.gamemode, minecraft.command.time и так далее, - а это как раз та детализация, которой уровни оператора не дают.

Команды, которыми вы действительно будете пользоваться#

КомандаПримечания
listКто в сети. list uuids добавляет их UUID
kick <player> [reason]Причина показывается на экране отключения
ban <player> [reason], pardon <player>Пишет в banned-players.json
ban-ip <address>, pardon-ip <address>Пишет в banned-ips.json
banlist players, banlist ipsВыводит списки
whitelist on/off/add/remove/list/reloadДля действия также нужен white-list=true
op <player>, deop <player>
say <message>Рассылка от имени сервера
tell <player> <message>Личное сообщение. msg и w - псевдонимы
tellraw <targets> <component>Единственный способ отправить форматированный текст
gamemode <mode> [targets]survival, creative, adventure, spectator
defaultgamemode <mode>Применяется к игрокам, заходящим впервые
difficulty <level>peaceful, easy, normal, hard
time set day/noon/night/midnightИли номер тика. time add 1000
weather clear/rain/thunder [seconds]Без длительности - случайно
seedSeed мира
setworldspawn [x y z]Где появляются новые игроки
worldborder set <blocks> [seconds]Сжимается или растёт со временем
setidletimeout <minutes>Кикает простаивающих игроков. 0 отключает
kill @e[type=item]Убирает выброшенные предметы в загруженных чанках
save-all flush, save-off, save-onСм. раздел о сохранении ниже
stopЕдинственное чистое выключение

Ещё несколько команд, о существовании которых полезно знать: spreadplayers разбрасывает группу случайным образом в пределах радиуса, forceload add держит чанк загруженным без игрока, datapack list/enable/disable управляет датапаками во время работы (подробности в руководстве по датапакам), а transfer <host> [port] в версиях 1.20.5 и новее переносит клиента на другой сервер, не выкидывая его из игры. В версиях 1.20.3 и новее tick freeze, tick step и tick rate <n> управляют самим циклом тиков; это инструмент отладки, а не то, что стоит оставлять включённым.

Селекторы целей#

Селектор заменяет имя игрока и раскрывается в ноль или более целей.

СелекторОзначает
@pБлижайший игрок
@aВсе игроки, включая наблюдателей и пограничные случаи с игроками не в сети, но загруженными
@rОдин случайный игрок
@eВсе сущности, включая игроков
@sИсполнитель. Из консоли недопустим
@nБлижайшая сущность любого типа, добавлено в 1.21

Аргументы пишутся в квадратных скобках через запятую и являются фильтрами, применяемыми по порядку:

code
$ kill @e[type=minecraft:zombie,distance=..100]$ gamemode adventure @a[gamemode=survival]$ tp @a[tag=lobby] 0 70 0$ give @a[limit=1,sort=nearest,distance=..20] minecraft:bread 16$ effect give @a[scores={deaths=5..}] minecraft:weakness 60 0
АргументПримерЗначение
typetype=minecraft:creeperТип сущности. type=!player - исключить
distancedistance=..64, distance=10..Диапазон в блоках от точки выполнения
limit, sortlimit=3,sort=nearestОграничение и порядок
tagtag=vip, tag=!afkТеги scoreboard, заданные через tag add
teamteam=red
scoresscores={kills=10..}Диапазоны целей
gamemodegamemode=!creative
levellevel=30..Уровень опыта, только для игроков
namename=SteveТочное совпадение
nbtnbt={Invulnerable:1b}Медленно. Сначала фильтруйте по type
x,y,z,dx,dy,dzx=0,y=64,z=0,dx=32Параллелепипед, а не сфера

Диапазоны записываются через .. и включают границы: 1..5 - от одного до пяти, ..64 - до 64, 10.. - десять и больше. ! отрицает большинство аргументов, а некоторые аргументы можно повторять для условия И (tag=a,tag=b), тогда как type и gamemode можно повторять только в отрицании.

Координаты бывают трёх видов. Абсолютные (100 64 -200), относительные к точке выполнения (~ ~5 ~, то есть на пять блоков выше) и локальные по направлению взгляда исполнителя (^ ^ ^5, то есть на пять блоков вперёд). Локальным координатам нужна сущность, которая куда-то смотрит, поэтому из консоли от них мало толку.

execute: команда, запускающая другие команды#

execute меняет то, кто выполняет команду, где она выполняется и выполняется ли вообще. Современное администрирование Minecraft - это по большей части эта одна команда, и она выстраивается в цепочку: каждая часть меняет контекст для следующей.

code
$ execute as @a at @s run playsound minecraft:entity.experience_orb.pickup master @s$ execute in minecraft:the_nether run kill @e[type=item]$ execute as @a[gamemode=survival] at @s if block ~ ~-1 ~ minecraft:magma_block run effect give @s minecraft:fire_resistance 10 0 true$ execute store result score Steve health run data get entity Steve Health

Части, которые стоит выучить:

  • as <targets> меняет исполнителя, поэтому @s в остальной части команды означает каждого из них по очереди. Точку выполнения он не перемещает.
  • at <targets> переносит точку выполнения к ним. as @a at @s - пара, нужная почти всегда: выполнить это по разу для каждого игрока, в его позиции.
  • positioned, rotated, facing, align, anchored тонко настраивают точку.
  • in <dimension> переключает на minecraft:overworld, minecraft:the_nether или minecraft:the_end.
  • if и unless проверяют условие и прерывают цепочку, если оно не выполнено: if block, if blocks, if entity, if score, if data, if predicate, if dimension, if loaded, if biome.
  • store result|success записывает числовой результат команды в счёт, NBT сущности, блок, bossbar или хранилище данных.
  • run всегда стоит последним и принимает выполняемую команду.

Поскольку as @a перебирает всех, один execute может быть дорогим. execute as @a at @s run fill ~-50 ~-50 ~-50 ~50 ~50 ~50 air на загруженном сервере - хороший способ его заморозить.

Gamerule, которые стоит менять#

gamerule без значения выводит текущую настройку. Значения хранятся в мире, а не в server.properties, поэтому они переживают переустановку jar сервера и не переживают создание нового мира.

GameruleПо умолчаниюЧто делает
keepInventoryfalseСохранять предметы после смерти
doDaylightCycletrueВремя идёт
doWeatherCycletrueПогода меняется сама
doFireTicktrueОгонь распространяется. На строительном сервере поставьте false
mobGriefingtrueКриперы, эндермены и иссушители меняют блоки
doMobSpawningtrueЕстественное появление мобов вообще
doInsomniatrueФантомы
doPatrolSpawningtrueПатрули разбойников
doTraderSpawningtrueСтранствующие торговцы
randomTickSpeed3Рост культур и разрушение блоков. Увеличение стоит CPU
maxEntityCramming24Сущностей в одном блоке до урона. 0 отключает
playersSleepingPercentage100Процент игроков, нужный для пропуска ночи
announceAdvancementstrueСообщения о достижениях в чате
showDeathMessagestrue
sendCommandFeedbacktrueОтвет команд в чат
commandBlockOutputtrueВывод командных блоков операторам. Выключите, чтобы не было спама
logAdminCommandstrueКоманды администратора пишутся в лог
spawnRadius10Разброс вокруг точки появления мира
naturalRegenerationtrueЗдоровье восстанавливается от сытости
reducedDebugInfofalseСкрывает координаты в F3
disableRaidsfalse
spectatorsGenerateChunkstrueПоставьте false, чтобы наблюдатель не мог загружать новую местность

В новых версиях добавлены ещё правила, а несколько записей выше появились в 1.19 или позже, так что gamerule с автодополнением на вашем собственном сервере - окончательный список для вашей версии.

У трёх из них есть реальное влияние на производительность. randomTickSpeed умножает работу на чанк за тик, и люди повышают его ради быстрых ферм, не связывая это с падением TPS, которое следует за этим. maxEntityCramming со значением 0 убирает единственное, что не даёт мобовой ферме складывать тысячи сущностей в одном блоке. А spectatorsGenerateChunks со значением false не даёт наблюдателю улететь в неисследованную местность и сгенерировать чанки, которые серверу потом придётся держать. Если вы уже гоняетесь за лагами, более широкий разбор - в статье почему падает TPS и что с этим делать.

Собственные команды Paper#

Paper и Spigot добавляют несколько команд, которых нет в ванили, и именно к ним вы потянетесь, когда что-то не так.

  • tps выводит частоту тиков за последнюю, пять и пятнадцать минут. Максимум - двадцать; всё, что ниже примерно 19, заметно.
  • mspt выводит, сколько на самом деле длится тик, в среднем и в худшем случае. Это более честное число, потому что TPS ограничен 20 независимо от того, сколько запаса осталось. Меньше 50 мс означает, что у сервера есть запас.
  • plugins (или pl) перечисляет плагины, зелёным - включённые. version <plugin> показывает точную сборку.
  • paper entity list считает сущности по типам в каждом мире, а paper mobcaps показывает, насколько каждая категория близка к своему лимиту появления. Обе отвечают на вопрос «что на этом сервере есть такого, чего быть не должно».
  • paper heap выгружает использование памяти по классам, а paper dumpplugins записывает JSON-описание каждого загруженного плагина.
  • spark profiler start и spark profiler stop создают профиль, которым можно поделиться. Timings удалён в Paper 1.21, и его заменил spark; недавние сборки Paper его включают. Чтение вывода - отдельная тема, она разобрана в статье диагностика лагов через spark.

Одна деталь Bukkit, которая избавляет от споров: плагины могут регистрировать команды с тем же именем, что и у ванильных, и побеждает плагин. Префикс с пространством имён принудительно вызывает оригинал: minecraft:tp - всегда ванильная телепортация, что бы EssentialsX ни сделал с /tp. Псевдонимы живут в commands.yml в корне сервера, если хотите навсегда изменить, кто побеждает.

Сохранение, остановка и backup#

Мир хранится в памяти и периодически записывается на диск. Всё, что завершает процесс без сохранения, отбрасывает содержимое памяти, поэтому эти четыре команды важнее, чем можно судить по их длине.

code
$ save-off$ save-all flush... copy the world folder ...$ save-on

save-off останавливает автоматическое сохранение и велит серверу удерживать запись; save-all flush принудительно сбрасывает всё на диск и ждёт этого, а не возвращается сразу; save-on возобновляет. Эта последовательность даёт согласованную копию. Забыть save-on - классика: сервер продолжает работать и больше не пишет на диск до перезапуска, а тогда записывает сразу очень много.

stop - единственное чистое выключение. Он сохраняет каждый мир, отключает игроков с нормальным сообщением и позволяет плагинам записать свои данные, а это важно, потому что плагин экономики, сбрасывающий данные при выключении, теряет балансы, если вы вместо этого убьёте процесс.

В RE:NODE кнопки Stop и Restart отправляют именно такую чистую остановку. Вкладка Schedules выполняет упорядоченные задачи с задержками по выражению cron, чего достаточно, чтобы построить безопасное окно для backup: задача с консольной командой save-off, затем save-all flush, короткая задержка, задача backup, потом консольная команда save-on. Слоты для backup есть на каждом тарифе, копии хранятся вне той машины, которую защищают, а восстановление - это кнопка. Важна вторая половина этого предложения: backup, который никто не восстанавливал, - это гипотеза, и подробно об этом говорится в статье backup, которые действительно восстанавливаются.

Стоит знать об одном поведении: если сервер достигает лимита памяти, контейнер останавливается и перезапускается начисто, а не уходит в swap. Это быстрое восстановление, но остановка нечистая, поэтому всё несохранённое теряется. На большом мире короткий интервал автосохранения и еженедельный плановый перезапуск - дешёвая страховка.

Для запуска команд извне панели есть RCON, он включается через enable-rcon=true, rcon.password и rcon.port (по умолчанию 25575) в server.properties. Это протокол с открытым текстом и ограничением частоты, о котором и говорить-то не стоит, поэтому его нельзя выставлять в интернет; что делать вместо этого, описано в статье безопасное использование RCON.

FAQ#

Почему команда работает в чате, но не работает в консоли?

Обычно дело в селекторе. @s и @p зависят от позиции исполнителя, а консоль выполняет команды в точке появления верхнего мира и не имеет собственной сущности. Перепишите как execute as @a at @s run ... или назовите игрока по имени. Вторая частая причина - ведущий слеш, которого консоль не хочет.

Как запустить команду от имени игрока, не будучи этим игроком?

execute as <player> run <command> меняет исполнителя, но не уровень прав: команда всё равно выполняется с уровнем 4 консоли. В этом и смысл: так вы телепортируете кого-то или запускаете команду плагина в его контексте, не делая его оператором.

Где хранятся gamerule и переживают ли они обновление?

В level.dat внутри папки мира, поэтому они принадлежат миру. Обновление jar сервера их сохраняет; создание нового мира сбрасывает каждое в значение по умолчанию. Если у вас есть набор, которым вы всегда пользуетесь, держите строки gamerule в текстовом файле рядом со своими заметками.

Можно ли запланировать команду на каждую ночь?

Да, через вкладку Schedules в панели: выражение cron и задача с консольной командой. Обычная схема - ежедневный say Restarting in 60 seconds, затем задержка и действие перезапуска, и это намного лучше, чем тихий перезапуск. Внутри игры отложенную работу могут делать и функции датапаков через schedule function.

В чём разница между /kill @e и /kill @e[type=item]?

kill @e убивает все сущности в загруженных чанках, включая игроков, а это почти никогда не то, что имеют в виду. Всегда фильтруйте по типу. kill @e[type=item] убирает выброшенные предметы, а kill @e[type=item,nbt={Item:{id:"minecraft:cobblestone"}}] убирает один вид, но медленно.


Комментарии

Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000