Как отправить команду от имени игрока?

Версия Minecraft
1.19.4
API
Fabric
Как отправить команду или сообщение от имени меня или любого другого игрока? Интересно будет узнать реализацию на серверной и на клиентской части, узнал только как отправить от самого сервера, буду благодарен если поможете
 
63
4
31
Для 1.19
Java:
player.getServer().getCommands().performPrefixedCommand(player.createCommandSourceStack(), "/say hello");

UPD: комманда say требует permissionLevel 2 так что если у игрока нету этого разрешения то она не выполнится. Или можно создать кастомный соурс стек и указать там нужный уровень вручную
 
Последнее редактирование:
7,099
324
1,510
узнал только как отправить от самого сервера,
Если на 1.19 кардинально не переделали эту часть, то там при вызове команды от имени сервера указывается сервер в качестве отправителя команды. В этот аргумент просто игрока подставляй.
Чтобы отправлять комануд с клиента достаточно просто отправить сообщение чата, начинающееся на '/', посмотри код гуи чата, там есть отправка.
 
7,099
324
1,510
445
42
117
Хм.. странно, отображает как отправка от сервера, у меня только такой вариант, если есть возможность покажи как сделать для сервера и как отправлять команды как команды а не как сообщение
Решение для 1.12 (на версиях выше полагаю код будет эквивалентным)
Java:
MinecraftServer server = ...
Entity exucator = ... //или любой другой обьект который implements ICommandSender
server.getCommandManager().executeCommand(exucator, "raw-command-line");
Надеюсь, сам разберешься, как получить сервер и нужную сущность
 
Почему это не работает и как это исправить?

Java:
@Inject(at = @At("HEAD"), method = "onUse")

public void onUse1(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit, CallbackInfoReturnable<ActionResult> cir) {

    String str = "say test";
    MinecraftServer server = player.getServer();
    Entity exucator = MinecraftClient.getInstance().player;
    server.execute(exucator, str);

 }
}
 
Последнее редактирование:
1,383
115
244
Entity exucator = MinecraftClient.getInstance().player;
Игрок клиентский. Все взаимодействия сервера происходят с серверными сущностями. Иначе говоря, используй игрока, который дан тебе в аргументах.
И больше не мешай код серверный и код клиентский.

Весь код твой в методе надо обернуть в !world.isRemote, иначе краш/полная неработоспособность на серверах. Также добавь проверку на руку - код будет вызываться отдельно для каждой руки.
 
А вообще если тебе нужно транслировать сообщение от имени игрока то вот:
Java:
player.getServer().getPlayerList().broadcastChatMessage(PlayerChatMessage.unsigned(player.getUUID(),
"Some Message"), player, ChatType.bind(ChatType.CHAT, player));
Это на Fabric? У меня по какой то причине не работает
 
Видимо вместо getCommands нужно изменить на getCommandSource иначе он просто найти этот элемент не может но опять токи, когда я запускаю мне выдаёт ошибку что в элементе player ожидается 1 значение а их там два, хотя это весь код и я всё остальное закоментировал
Для 1.19


Java:
player.getServer().getCommands().performPrefixedCommand(player.createCommandSourceStack(), "/say hello");

UPD: комманда say требует permissionLevel 2 так что если у игрока нету этого разрешения то она не выполнится. Или можно создать кастомный соурс стек и указать там нужный уровень вручную
 
Сверху