Table of Contents

Примеры команд

Эти примеры доступны по лицензии “CC Attribution-Noncommercial-Share Alike 4.0 International”, которая является текущей лицензией других статей вики.

Объявление

  1. public final class BroadCastCommand {
  2. public static void register(CommandDispatcher<ServerCommandSource> dispatcher){
  3. dispatcher.register(literal("broadcast")
  4. .requires(source -> source.hasPermissionLevel(2)) // Команда не будет отображаться в подсказках и не будет работать, если вы не оператор или оператор с уровнем разрешения 1.
  5. .then(argument("color", ColorArgumentType.color())
  6. .then(argument("message", greedyString())
  7. .executes(ctx -> broadcast(ctx.getSource(), getColor(ctx, "color"), getString(ctx, "message")))))); // Вы можете обработать аргументы здесь и передать их в команду.
  8. }
  9.  
  10. public static int broadcast(ServerCommandSource source, Formatting formatting, String message) {
  11. final Text text = Text.literal(message).formatted(formatting);
  12.  
  13. source.getMinecraftServer().getPlayerManager().broadcastChatMessage(text, MessageType.CHAT, source.getPlayer().getUuid());
  14. return Command.SINGLE_SUCCESS; // Успех
  15. }
  16. }

В вашем инициализаторе:

  1. public class ExampleMod implements ModInitializer{
  2. @Override
  3. public void onInitialize() {
  4. ...
  5.  
  6. CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> register(dispatcher));
  7. }
  8. }

В приведенных ниже примерах регистрации в обратных вызовах опущены.

/giveMeDiamond (Выдача алмаза)

Сначала основной код, где мы регистрируем “giveMeDiamond” как литерал, а затем блок executes, чтобы сообщить диспетчеру, какой метод следует запустить.

  1. public static LiteralCommandNode register(CommandDispatcher<ServerCommandSource> dispatcher) { // Вы также можете вернуть LiteralCommandNode для использования с возможными перенаправлениями
  2. return dispatcher.register(literal("giveMeDiamond")
  3. .executes(ctx -> giveDiamond(ctx)));
  4. }

Затем, поскольку мы хотим отдавать команды только игрокам, мы проверяем, является ли CommandSource игроком. Но мы можем использовать getPlayer и сделать оба действия одновременно, и выдать ошибку, если источник не является игроком.

  1. public static int giveDiamond(CommandContext<ServerCommandSource> ctx) throws CommandSyntaxException {
  2. final ServerCommandSource source = ctx.getSource();
  3.  
  4. final PlayerEntity self = source.getPlayer(); // Если игрок не является игроком, то команда завершается

Затем мы добавляем в инвентарь игрока алмаз, проверяя, заполнен ли инвентарь:

  1. if(!player.inventory.insertStack(new ItemStack(Items.DIAMOND))){
  2. throw new SimpleCommandExceptionType(Text.translatable("inventory.isfull")).create();
  3. }
  4.  
  5. return 1;
  6. }

Antioch (Взрыв)

…lobbest thou thy Holy Hand Grenade of Antioch towards thy foe. who being naughty in My sight, shall snuff it. (англ. шутка)

Кроме шуток, эта команда вызывает заряженную тротиловую шашку в указанное место или в местоположение курсора отправителя.

Сначала создайте запись в CommandDispatcher, которая принимает литерал antioch с необязательным аргументом местоположения для вызова сущности.

  1. public static void register(CommandDispatcher<ServerCommandSource> dispatcher) {
  2. dispatcher.register(literal("antioch")
  3. .then(required("location", BlockPosArgumentType.blockPos()
  4. .executes(ctx -> antioch(ctx.getSource(), BlockPosArgument.getBlockPos(ctx, "location")))))
  5. .executes(ctx -> antioch(ctx.getSource(), null)));
  6. }

Затем создание и показ сообщения c шуткой.

  1. public static int antioch(ServerCommandSource source, BlockPos blockPos) throws CommandSyntaxException {
  2. if(blockPos == null) {
  3. // В случае отсутствия введенного аргумента мы вычисляем позицию курсора игрока или выдаем ошибку, если ближайшая позиция слишком далека или находится за пределами мира.
  4. // Этот класс используется в качестве примера и на самом деле пока не существует.
  5. blockPos = LocationUtil.calculateCursorOrThrow(source, source.getRotation());
  6. }
  7.  
  8. final TntEntity tnt = new TntEntity(source.getWorld(), blockPos.getX(), blockPos.getY(), blockPos.getZ(), null);
  9. tnt.setFuse(3);
  10.  
  11. source.getServer().getPlayerManager().broadcastChatMessage(Text.literal("...lobbest thou thy Holy Hand Grenade of Antioch towards thy foe", MessageType.CHAT, UUID.randomUUID()).formatted(Formatting.RED), false);
  12. source.getServer().getPlayerManager().broadcastChatMessage(Text.literal("who being naughty in My sight, shall snuff it.", MessageType.CHAT, UUID.randomUUID()).formatted(Formatting.RED), false);
  13. source.getWorld().spawnEntity(tnt);
  14. return 1;
  15. }