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

Версия Minecraft
1.19.4
API
Fabric
Как отправить команду или сообщение от имени меня или любого другого игрока? Интересно будет узнать реализацию на серверной и на клиентской части, узнал только как отправить от самого сервера, буду благодарен если поможете
 
7,099
324
1,510
узнал только как отправить от самого сервера,
Если на 1.19 кардинально не переделали эту часть, то там при вызове команды от имени сервера указывается сервер в качестве отправителя команды. В этот аргумент просто игрока подставляй.
Чтобы отправлять комануд с клиента достаточно просто отправить сообщение чата, начинающееся на '/', посмотри код гуи чата, там есть отправка.
 
7,099
324
1,510
434
41
110
Хм.. странно, отображает как отправка от сервера, у меня только такой вариант, если есть возможность покажи как сделать для сервера и как отправлять команды как команды а не как сообщение
Решение для 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,371
112
241
Entity exucator = MinecraftClient.getInstance().player;
Игрок клиентский. Все взаимодействия сервера происходят с серверными сущностями. Иначе говоря, используй игрока, который дан тебе в аргументах.
И больше не мешай код серверный и код клиентский.

Весь код твой в методе надо обернуть в !world.isRemote, иначе краш/полная неработоспособность на серверах. Также добавь проверку на руку - код будет вызываться отдельно для каждой руки.
 
63
4
31
Для 1.19
Java:
player.getServer().getCommands().performPrefixedCommand(player.createCommandSourceStack(), "/say hello");

UPD: комманда say требует permissionLevel 2 так что если у игрока нету этого разрешения то она не выполнится. Или можно создать кастомный соурс стек и указать там нужный уровень вручную
 
Последнее редактирование:
А вообще если тебе нужно транслировать сообщение от имени игрока то вот:
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 так что если у игрока нету этого разрешения то она не выполнится. Или можно создать кастомный соурс стек и указать там нужный уровень вручную
 
Сверху