Эти примеры доступны по лицензии “CC Attribution-Noncommercial-Share Alike 4.0 International”, которая является текущей лицензией других статей вики.
public final class BroadCastCommand { public static void register(CommandDispatcher<ServerCommandSource> dispatcher){ dispatcher.register(literal("broadcast") .requires(source -> source.hasPermissionLevel(2)) // Команда не будет отображаться в подсказках и не будет работать, если вы не оператор или оператор с уровнем разрешения 1. .then(argument("color", ColorArgumentType.color()) .then(argument("message", greedyString()) .executes(ctx -> broadcast(ctx.getSource(), getColor(ctx, "color"), getString(ctx, "message")))))); // Вы можете обработать аргументы здесь и передать их в команду. } final Text text = Text.literal(message).formatted(formatting); source.getMinecraftServer().getPlayerManager().broadcastChatMessage(text, MessageType.CHAT, source.getPlayer().getUuid()); return Command.SINGLE_SUCCESS; // Успех } }
В вашем инициализаторе:
public class ExampleMod implements ModInitializer{ @Override public void onInitialize() { ... CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> register(dispatcher)); } }
В приведенных ниже примерах регистрации в обратных вызовах опущены.
Сначала основной код, где мы регистрируем “giveMeDiamond” как литерал, а затем блок executes
, чтобы сообщить диспетчеру, какой метод следует запустить.
public static LiteralCommandNode register(CommandDispatcher<ServerCommandSource> dispatcher) { // Вы также можете вернуть LiteralCommandNode для использования с возможными перенаправлениями return dispatcher.register(literal("giveMeDiamond") .executes(ctx -> giveDiamond(ctx))); }
Затем, поскольку мы хотим отдавать команды только игрокам, мы проверяем, является ли CommandSource
игроком. Но мы можем использовать getPlayer
и сделать оба действия одновременно, и выдать ошибку, если источник не является игроком.
public static int giveDiamond(CommandContext<ServerCommandSource> ctx) throws CommandSyntaxException { final ServerCommandSource source = ctx.getSource(); final PlayerEntity self = source.getPlayer(); // Если игрок не является игроком, то команда завершается
Затем мы добавляем в инвентарь игрока алмаз, проверяя, заполнен ли инвентарь:
if(!player.inventory.insertStack(new ItemStack(Items.DIAMOND))){ throw new SimpleCommandExceptionType(Text.translatable("inventory.isfull")).create(); } return 1; }
…lobbest thou thy Holy Hand Grenade of Antioch towards thy foe. who being naughty in My sight, shall snuff it. (англ. шутка)
Кроме шуток, эта команда вызывает заряженную тротиловую шашку в указанное место или в местоположение курсора отправителя.
Сначала создайте запись в CommandDispatcher
, которая принимает литерал antioch
с необязательным аргументом местоположения для вызова сущности.
public static void register(CommandDispatcher<ServerCommandSource> dispatcher) { dispatcher.register(literal("antioch") .then(required("location", BlockPosArgumentType.blockPos() .executes(ctx -> antioch(ctx.getSource(), BlockPosArgument.getBlockPos(ctx, "location"))))) .executes(ctx -> antioch(ctx.getSource(), null))); }
Затем создание и показ сообщения c шуткой.
public static int antioch(ServerCommandSource source, BlockPos blockPos) throws CommandSyntaxException { if(blockPos == null) { // В случае отсутствия введенного аргумента мы вычисляем позицию курсора игрока или выдаем ошибку, если ближайшая позиция слишком далека или находится за пределами мира. // Этот класс используется в качестве примера и на самом деле пока не существует. blockPos = LocationUtil.calculateCursorOrThrow(source, source.getRotation()); } final TntEntity tnt = new TntEntity(source.getWorld(), blockPos.getX(), blockPos.getY(), blockPos.getZ(), null); tnt.setFuse(3); 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); source.getServer().getPlayerManager().broadcastChatMessage(Text.literal("who being naughty in My sight, shall snuff it.", MessageType.CHAT, UUID.randomUUID()).formatted(Formatting.RED), false); source.getWorld().spawnEntity(tnt); return 1; }