Как создавать команды для майнкрафта

Команды#

Помимо всего прочего, имеется возможность добавлять новые консольные команды. Команды являются одним из способов взаимодействия с игрой. Чаще всего команды используются для реализации чит-возможностей (например, мгновенное получение прогресса, ресурсов и др. что полезно при тестировании мода). Также команды используются администраторами серверов.

Работать с командами предельно просто: необходимо всего-лишь создать класс, описывающий логику работы команды и зарегистрировать его в обработчике. Класс команды должен реализовывать интерфейс ICommand . В примере мы будем наследоваться от каркаса команды CommandBase , уже содержащего реализацию большинства методов интерфейса, что потребует меньшего написания кода.

Создание команды#

Для примеры мы создадим команду ping, которая будет отвечать сообщением «Pong!» в ответ.

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

Интерфейс ICommand#

Метод Описание
getCommandName() Возвращает имя команды, которое будет вводиться в чате/консоли.
getCommandUsage(ICommandSender) Возвращает ключ локализации, представляющий собой шаблон использования команды (строка вида: /command [args. ] ).
Используется командой help.
getCommandAliases() Возвращает список List дополнительных имён команды (синонимов).
processCommand(ICommandSender, String[]) Основной метод, срабатывающий при вызове команды.
canCommandSenderUseCommand(ICommandSender) Отвечает за возможность использования команды указанным отправителем. В основном, это проверка прав доступа.
addTabCompletionOptions(ICommandSender, String[]) Возвращает список List вариантов подстановки слов при нажатии клавиши Tab
Рекомендуем использовать CommandBase#getListOfStringsMatchingLastWord для реализации автоматической фильтрации предлагаемых вариантов.
isUsernameIndex(String[], int) Проверяет, является ли аргумент команды (по индексу) никнеймом игрока. Используется для автоматического исправления регистра и подстановки полного ника игрока при вызове команды.
  • Аргументы – это массив строк, разделённых пробелом, введённых после имени команды.
  • ICommandSender – отправитель команды. Это может быть игрок, консоль, командный блок, RCON и любые другие объекты, реализующие данный интерфейс.

Регистрация команды#

Теперь нужно зарегистрировать команду. Делается это во время специального события FMLServerStartingEvent , можно сказать, являющегося одним иэ этапов инициализации мода. Данное событие вызывается только на стороне сервера, потому использование Sided Proxy здесь не требуется.

Добавим в главный класс мода новый метод:

Клиентский обработчик команд#

Помимо стандартной обработки команд сервером Minecraft, Forge представляет возможность обработки команд на стороне клиента. Работает это методом перехвата сообщений, вводимых в чат: при обнаружении ввода имени команды, зарегистрированной на клиентской стороне, сообщение будет передано в клиентский обработчик команд, вместо отправки на сервер. Потому важно уделить внимание придумыванию уникальных названий команд, так чтобы они не перекрывали серверные.

Ограничения обработки команд на клиентской стороне

  • Такие команды можно вызвать исключительно из GUI игрового чата, потому отправителем команды всегда будет являться игрок. Или программно вызовом метода ClientCommandHandler#executeCommand
  • Следует понимать, что возможности взаимодействия с миром на стороне клиента сильно ограничены, поскольку мир управляется сервером. Не рекомендуется пробовать что-либо изменять, так как это будет приводить к багам рассинхронизации.

Сам процесс создания класса команды для клиента ничем не отличается от, рассмотренного выше, способа создания команды сервера, отличие заключается только в способе регистрации: вместо FMLServerStartingEvent , надо использовать в ClientCommandHandler#instance .

Добавьте следующий код в ClientProxy чтобы зарегистрировать команду:

Источник

Команды

Всем доброго времени суток. В этом туториале я расскажу о том, как добавлять собственные команды в игру. Исходники доступны на GitHub: 1.7.10 и 1.12.2. Они содержат по три примера команд, а в этой статье я расскажу как создавать одну из них.

Все доступные в игре команды предназначены для сервера, однако они работают и в одиночной игре. В чём же секрет? Всё дело в том, что даже в одиночной игре присутствует сервер, но только логический, поэтому нам доступны все серверные объекты. Команды создаются для сервера и регистрируются в процессе его загрузки и его наличие в одиночной игре даёт нам возможность их использовать, конечно только если при создании мира вы разрешили использование команд (cheats).

Так как выполнение команд происходит на сервере, то вся активность не должна использовать объекты клиента. Если требуется что то синхронизировать с клиентом — придётся использовать пакеты. Кроме того в любом случае вам потребуется настроить прокси.

Для начала в главном классе вашего проекта создайте метод, который будет выполнятся при загрузке сервера:

В CommonProxy создаёте такой же, но без аннотации. Вызовите его из метода в главном классе:

В нём то и будем регистрировать команды через вызов FMLServerStartingEvent#registerServerCommand()

Начнём. Создадим команду для ремонта предмета в руке, класс CommandRepair:

Есть два пути: унаследовать CommandBase или реализовать ICommand. Я выбрал первый вариант, так как CommandBase содержит базовую реализацию интерфейса и добавляет множество полезных методов для парсинга команд (аргументов команд). Настоятельно рекомендую ознакомится с их содержимым, а также с классами в пакете net.minecraft.command для получения исчерпывающего представления об использовании на примерах ванильных команд.

Рассмотрим методы, которые обязательно требуется переопределить.

getCommandName() отвечает за имя, которое используется при вызове. Кроме имени мы ещё можем передавать множество аргументов при вызове. Этот пример не будет использовать аргументы.

getCommandUsage() возвращает шаблон использования. Он выводится при выбрасывании исключения WrongUsageException, а так же при просмотре доступных команд при вызове /help .

Теперь перейдём к processCommand() — этот метод выполняется при вызове команды. Как я уже писал, выполняется он только на сервере. В качестве аргументов у нас есть сам сервер, объект, вызвавший команду (игрок или консоль) и аргументы, с которыми она вызвана. Тут необходимо определить исполняемую активность.

Реализация. Для getCommandName() и getCommandUsage() созданы две строковые константы в начале класса для удобства. В getCommandUsage() добавлена необходимая активность:

Впринципе всё, команда будет работать. Осталось зарегистрировать её в CommonProxy в методе serverStarting() :

Вы можете зайти и проверить её работоспособность. По умолчанию она будет доступна только для миров, в которых разрешены команды (читы) или для опнутых игроков на сервере.

В первую очередь хотелось бы обратить внимание на права использования. По умолчанию команда может быть использована опами на сервере или в одиночной игре при разрешённых командах (читах). Конечно вы можете добавить проверки в метод processCommand() , однако для этого уже есть специализированный метод canCommandSenderUseCommand() :

Он вызывается до processCommand() . К примеру просто вернув в нём true вы разрешите использование команды кем угодно и где угодно.

Дополнительно: варианты вызова

Для большего удобства каждая команда может быть дополнена набором вариантов вызова. Распространённое применение этой возможности заключается в добавлении укороченных вариантов. Добиться этого можно переопределив getCommandAliases() :

Большинство команд при вызове выводят в чат некоторые сообщения с результатами. Сообщения могут выводится для игрока, вызвавшего команду, всех игроков на сервере или кого то конкретного.

Для вывода сообщения игроку, вызвавшему команду:
CommandBase#getCommandSenderAsPlayer().addChatMessage()

Для всех игроков на сервере:
MinecraftServer#getServer()#getConfigurationManager()#sendChatMsg()

Для игрока по нику, переданному как аргумент при вызове команды:
CommandBase#getPlayer().sendMessage()

Для вывода таких сообщений строго рекомендуется использовать ChatComponentTranslation, такое сообщение будет автоматически локализовано при выводе в чат в зависимости от выбранного языка клиента.

Дополнительно: команда исключительно для клиента

Что бы команда работала только на клиенте, вам надо зарегистрировать её через ClientCommandHandler.instance.registerCommand() в ClientProxy в процессе преинициализации (например). С ледует учесть, что такая команда не имеет возможности влиять на данные сервера (физического или логического). Метод processCommand() в данном случае может ссылаться на клиентские классы.

Вот как выглядит класс команды после внесения дополнений:

Для начала в главном классе вашего проекта создайте метод, который будет выполнятся при загрузке сервера:

В CommonProxy создаёте такой же, но без аннотации. Вызовите его из метода в главном классе:

В нём то и будем регистрировать команды через вызов FMLServerStartingEvent#registerServerCommand()

Начнём. Создадим команду для ремонта предмета в руке, класс CommandRepair:

Есть два пути: унаследовать CommandBase или реализовать ICommand. Я выбрал первый вариант, так как CommandBase содержит базовую реализацию интерфейса и добавляет множество полезных методов для парсинга команд (аргументов команд). Настоятельно рекомендую ознакомится с их содержимым, а также с классами в пакете net.minecraft.command для получения исчерпывающего представления об использовании на примерах ванильных команд.

Рассмотрим методы, которые обязательно требуется переопределить.

getName() отвечает за имя, которое используется при вызове. Кроме имени мы ещё можем передавать множество аргументов при вызове. Этот пример не будет использовать аргументы.

getUsage() возвращает шаблон использования. Он выводится при выбрасывании исключения WrongUsageException, а так же при просмотре доступных команд при вызове /help .

Теперь перейдём к execute() — этот метод выполняется при вызове команды. Как я уже писал, выполняется он только на сервере. В качестве аргументов у нас есть сам сервер, объект, вызвавший команду (игрок или консоль) и аргументы, с которыми она вызвана. Тут необходимо определить исполняемую активность.

Реализация. Для getName() и getUsage() созданы две строковые константы в начале класса для удобства. В execute() добавлена необходимая активность:

Впринципе всё, команда будет работать. Осталось зарегистрировать её в CommonProxy в методе serverStarting() :

Вы можете зайти и проверить её работоспособность. По умолчанию она будет доступна только для миров, в которых разрешены команды (читы) или для опнутых игроков на сервере.

В первую очередь хотелось бы обратить внимание на права использования. По умолчанию команда может быть использована опами на сервере или в одиночной игре при разрешённых командах (читах). Конечно вы можете добавить проверки в метод execute() , однако для этого уже есть специализированный метод checkPermission() :

Он вызывается до execute() . К примеру просто вернув в нём true вы разрешите использование команды кем угодно и где угодно.

Дополнительно: варианты вызова

Для большего удобства каждая команда может быть дополнена набором вариантов вызова. Распространённое применение этой возможности заключается в добавлении укороченных вариантов. Добиться этого можно переопределив getAliases() :

Большинство команд при вызове выводят в чат некоторые сообщения с результатами. Сообщения могут выводится для игрока, вызвавшего команду, всех игроков на сервере или кого то конкретного.

Для вывода сообщения игроку, вызвавшему команду:
CommandBase#getCommandSenderAsPlayer().sendMessage()

Для всех игроков на сервере:
MinecraftServer#getPlayerList().sendMessage()

Для игрока по нику, переданному как аргумент при вызове команды:
CommandBase#getPlayer().sendMessage()

Для вывода таких сообщений строго рекомендуется использовать TextComponentTranslation, такое сообщение будет автоматически локализовано при выводе в чат в зависимости от выбранного языка клиента.

Дополнительно: команда исключительно для клиента

Что бы команда работала только на клиенте, вам надо зарегистрировать её через ClientCommandHandler.instance.registerCommand() в ClientProxy в процессе преинициализации (например). С ледует учесть, что такая команда не имеет возможности влиять на данные сервера (физического или логического). Метод execute() в данном случае может ссылаться на клиентские классы.

Клиентскую команду можно выполнять просто вводя в чат её имя, не предваряя её «/». Если уж очень хочется этого избежать, то реализуйте IClientCommand в классе вашей команды, переопределите allowUsageWithoutPrefix() и верните в нём false (без реализации этого интерфейса и переопределения по умолчанию будет возвращаться true ). Таким образом для использования команды вам придётся вводить её вместе со слешем.

Вот как выглядит класс команды после внесения дополнений:

Источник

Гайд: Все команды для Майнкрафт

Команды для Майнкрафт помогут игроку осуществить грамотную и тонкую настройку игры. С их помощью можно переключить игровой режим, изменить погоду и время, настроить правила, заспавнить мобов и предметы. Но это лишь малая часть возможностей.

Все команды для Майнкрафт [Список]

  • /ban — забанит игрока по его никнейму.
  • /ban-ip — бан игрока по его айпи адресу.
  • /banlist — вызывает список забанененых людей.
  • /bossbar — изменяет некоторые настройки боссов.
  • /clear — отчищает инвентарь игрока.
  • /clone — дублирует блоки из определенной локации в другую.
  • /data — заменяет некоторые данные для определенных функций и предметов.
  • /datapack — помогает установить датапаки.
  • /debug — команда, которая помогает справиться с багами.
  • /defaultgamemode — установить игровой режим, который был в настройках мира.
  • /deop — при игре на сервере, у игрока забираются права администратора.
  • /difficulty — сменит сложность.
  • /execute — универсальная функция для командных блоков. Позволяет выполнять другие операции.
  • /fill — заполняет область блоками или жидкостями.
  • /function — запускает набор функций.
  • /forceload — определенный чанк в Майнкрафт всегда будет загружен.
  • /gamerule — добавление, изменение и удаление игровых правил.
  • /give — выдача блоков, предметов, инструментов, оружий и многого другого.
  • /kick — нужна, чтобы выгнать героя с сервера.
  • /kill — убийство мобов, сущностей и игрока.
  • /list — вызывает список активных игроков.
  • /me — поможет узнать исполнителя команды.
  • /op — активирует режим «администратора» на сервере.
  • /pardon — удалит никнейм из забаненных.
  • /particle — создание некоторых частиц.
  • /playsound — запускает определенные звуки.
  • /publish — открытые порты для локальной игры.
  • /recipe — добавит или удалит необходимый рецепт.
  • /reload — быстрая перезагрузка функциональных возможностей, датапаков и прочего.
  • /replaceitem — заменяет блоки и предметы.
  • /save-all — быстрое сохранение.
  • /save-off — отключает автоматическое сохранение.
  • /save-on — включает автоматическое сохранение.
  • /say — быстрая отправка сообщение для всех.
  • /schedule — поможет выполнить функцию, но только спустя некоторое время.
  • /scoreboard — отображение списка игроков с их показателями.
  • /seed — поможет узнать сид заданного мира.
  • /setblock — установит определенный блок.
  • /setidletimeout — кикает АФК-игроков.
  • /setworldspawn — установит точку начала мира.
  • /spawnpoint — изменяет точку спавна. Аналогичную функцию выполняет кровать.
  • /spreadplayers — переместит сущность в случайную локацию.
  • /stop — остановка работы сервера.
  • /stopsound — остановка играющих звуков.
  • /tag — изменяет набор текста, который отображается при наведении на предмет.
  • /team — создает команды.
  • /teleport — быстрый телепорт в нужное место.
  • /tell — создаст личный чат.
  • /tellraw — сообщение для чата в уникальном формате с кодировкой.
  • /testfor — подсчет мобов с определенными характеристиками.
  • /testforblock — поиск блока по его локации.
  • /testforblocks — поиск блоков по заданным параметрам.
  • /time — изменяет время в мире.
  • /title — отключает титры.
  • /toggledownfall — вторая команда для изменения погоды.
  • /trigger — создание триггеров.
  • /weather — изменение погоды в мире.
  • /whitelist — добавление игроков в белый список.
  • /worldborder — границы игрового мира.

/ helpкоманда-справочник. Поможет узнать необходимую информацию про любую из команд. К примеру, «/help gamemode».

Чит-команды для Майнкрафт

  • / advancement — моможет игроку получить или удалить какое-либо достижение.
  • / gamemode — смена игрового режима.
  • / xp — добавление или удаление опыта.
  • / tp — телепорт не только для игроков, но и для мобов. У нас есть подробный гайд про использование команды.
  • / summon — заспавнит определенных мобов.
  • / effect — нанесет определенный эффект на главного героя.
  • / enchant — добавит чары к инструменту, броню или оружия.
  • / locate — поможет узнать координаты ближайшей структуры.
  • / loot — нужна, чтобы получить дроп от мобов или сундука.

Команды только для Bedrock Edition

  • / ride — позволяет оседлать определенных сущностей.
  • / setmaxplayers — задает параметр максимального количества игроков.
  • / structure — создает структуры.
  • / playanimation — начинает проигрывание анимаций.

Интересные варианты применения

  • / summon giant — можно получить Гиганта.
  • / give @p minecraft:diamond 64 — получение стака алмазов.
  • / give [НИКНЕЙМ ИГРОКА] diamond_sword]> — выдача меча, который зачарован на остроту 1000 уровня.

А какие интересные команды знаешь ты? Поделись в комментариях.

Обрати внимание!

Источник

Читайте также:  Джон питкэрн ассасин крид
Adblock
detector