Для управления сервером Minecraft нужно около двадцати команд, и в консоли сервера они ведут себя немного иначе, чем в чате: без ведущего слеша, без позиции игрока и с уровнем прав, который всегда максимален. Это справочник по этим двадцати командам, плюс селекторы целей, превращающие одну команду в сотню, синтаксис execute, на котором построено всё современное, и gamerule с их настоящими значениями по умолчанию. Он относится к ванильному серверу и к Paper, на котором работает линейка Minecraft у RE:NODE; там, где Paper добавляет что-то полезное, это отмечено.
Консоль - это не окно чата#
Консоль панели - это стандартный ввод процесса сервера. Всё, что вы набираете, передаётся серверу как команда напрямую, поэтому ведущий /, который игрок вводит в чате, не нужен, а в большинстве сборок вызывает ошибку. Набирайте list, а не /list.
Отсюда следуют ещё три вещи:
- Консоль имеет уровень прав 4, и его нельзя понизить. Это не игрок, поэтому права плагинов на неё тоже не распространяются. Всё, что запрещает группа LuckPerms, консоль всё равно может сделать. Поэтому она - способ вернуться, если вы заперли себя за собственным деревом прав; дерево, которое к этому приводит, описано в руководстве по LuckPerms.
- У консоли есть позиция, и это не то место, где находитесь вы. Команды из консоли выполняются в точке появления в верхнем мире. Поэтому
@pозначает «игрок, ближайший к точке появления», а не «ближайший ко мне», а@sнедопустим, потому что консоль не сущность. Назовите игрока по имени или используйтеexecute as @a at @s run .... - Вывод команды - это вывод консоли. Ошибки появляются в том же потоке, что и всё остальное, поэтому неудавшаяся команда пролетает среди болтовни плагинов. Как это отфильтровать, описано в статье чтение консоли.
Когда команда неверна, сервер печатает введённое обратно с меткой, показывающей, где он остановился:
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 в корне сервера, и уровень можно менять там напрямую, пока сервер остановлен:
[ { "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] | Без длительности - случайно |
seed | Seed мира |
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 |
Аргументы пишутся в квадратных скобках через запятую и являются фильтрами, применяемыми по порядку:
$ 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| Аргумент | Пример | Значение |
|---|---|---|
type | type=minecraft:creeper | Тип сущности. type=!player - исключить |
distance | distance=..64, distance=10.. | Диапазон в блоках от точки выполнения |
limit, sort | limit=3,sort=nearest | Ограничение и порядок |
tag | tag=vip, tag=!afk | Теги scoreboard, заданные через tag add |
team | team=red | |
scores | scores={kills=10..} | Диапазоны целей |
gamemode | gamemode=!creative | |
level | level=30.. | Уровень опыта, только для игроков |
name | name=Steve | Точное совпадение |
nbt | nbt={Invulnerable:1b} | Медленно. Сначала фильтруйте по type |
x,y,z,dx,dy,dz | x=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 - это по большей части эта одна команда, и она выстраивается в цепочку: каждая часть меняет контекст для следующей.
$ 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 | По умолчанию | Что делает |
|---|---|---|
keepInventory | false | Сохранять предметы после смерти |
doDaylightCycle | true | Время идёт |
doWeatherCycle | true | Погода меняется сама |
doFireTick | true | Огонь распространяется. На строительном сервере поставьте false |
mobGriefing | true | Криперы, эндермены и иссушители меняют блоки |
doMobSpawning | true | Естественное появление мобов вообще |
doInsomnia | true | Фантомы |
doPatrolSpawning | true | Патрули разбойников |
doTraderSpawning | true | Странствующие торговцы |
randomTickSpeed | 3 | Рост культур и разрушение блоков. Увеличение стоит CPU |
maxEntityCramming | 24 | Сущностей в одном блоке до урона. 0 отключает |
playersSleepingPercentage | 100 | Процент игроков, нужный для пропуска ночи |
announceAdvancements | true | Сообщения о достижениях в чате |
showDeathMessages | true | |
sendCommandFeedback | true | Ответ команд в чат |
commandBlockOutput | true | Вывод командных блоков операторам. Выключите, чтобы не было спама |
logAdminCommands | true | Команды администратора пишутся в лог |
spawnRadius | 10 | Разброс вокруг точки появления мира |
naturalRegeneration | true | Здоровье восстанавливается от сытости |
reducedDebugInfo | false | Скрывает координаты в F3 |
disableRaids | false | |
spectatorsGenerateChunks | true | Поставьте 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#
Мир хранится в памяти и периодически записывается на диск. Всё, что завершает процесс без сохранения, отбрасывает содержимое памяти, поэтому эти четыре команды важнее, чем можно судить по их длине.
$ save-off$ save-all flush... copy the world folder ...$ save-onsave-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. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.