======= Примеры команд =======
Эти примеры доступны по лицензии "CC Attribution-Noncommercial-Share Alike 4.0 International", которая является текущей лицензией других статей вики.
===== Объявление =====
public final class BroadCastCommand {
public static void register(CommandDispatcher 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")))))); // Вы можете обработать аргументы здесь и передать их в команду.
}
public static int broadcast(ServerCommandSource source, Formatting formatting, String 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 (Выдача алмаза) =====
Сначала основной код, где мы регистрируем "giveMeDiamond" как литерал, а затем блок ''executes'', чтобы сообщить диспетчеру, какой метод следует запустить.
public static LiteralCommandNode register(CommandDispatcher dispatcher) { // Вы также можете вернуть LiteralCommandNode для использования с возможными перенаправлениями
return dispatcher.register(literal("giveMeDiamond")
.executes(ctx -> giveDiamond(ctx)));
}
Затем, поскольку мы хотим отдавать команды только игрокам, мы проверяем, является ли ''CommandSource'' игроком. Но мы можем использовать ''getPlayer'' и сделать оба действия одновременно, и выдать ошибку, если источник не является игроком.
public static int giveDiamond(CommandContext 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;
}
===== Antioch (Взрыв) =====
...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 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;
}