60 lines
2.4 KiB
Java
60 lines
2.4 KiB
Java
package net.minecraft.server.commands;
|
|
|
|
import com.mojang.brigadier.CommandDispatcher;
|
|
import com.mojang.brigadier.tree.LiteralCommandNode;
|
|
import java.util.Collection;
|
|
import net.minecraft.commands.CommandSourceStack;
|
|
import net.minecraft.commands.Commands;
|
|
import net.minecraft.commands.arguments.EntityArgument;
|
|
import net.minecraft.commands.arguments.MessageArgument;
|
|
import net.minecraft.network.chat.ChatType;
|
|
import net.minecraft.network.chat.OutgoingChatMessage;
|
|
import net.minecraft.network.chat.PlayerChatMessage;
|
|
import net.minecraft.server.level.ServerPlayer;
|
|
import net.minecraft.server.players.PlayerList;
|
|
|
|
public class MsgCommand {
|
|
public static void register(CommandDispatcher<CommandSourceStack> dispatcher) {
|
|
LiteralCommandNode<CommandSourceStack> literalCommandNode = dispatcher.register(
|
|
Commands.literal("msg")
|
|
.then(
|
|
Commands.argument("targets", EntityArgument.players())
|
|
.then(
|
|
Commands.argument("message", MessageArgument.message())
|
|
.executes(
|
|
commandContext -> {
|
|
Collection<ServerPlayer> collection = EntityArgument.getPlayers(commandContext, "targets");
|
|
if (!collection.isEmpty()) {
|
|
MessageArgument.resolveChatMessage(
|
|
commandContext, "message", playerChatMessage -> sendMessage(commandContext.getSource(), collection, playerChatMessage)
|
|
);
|
|
}
|
|
|
|
return collection.size();
|
|
}
|
|
)
|
|
)
|
|
)
|
|
);
|
|
dispatcher.register(Commands.literal("tell").redirect(literalCommandNode));
|
|
dispatcher.register(Commands.literal("w").redirect(literalCommandNode));
|
|
}
|
|
|
|
private static void sendMessage(CommandSourceStack source, Collection<ServerPlayer> targets, PlayerChatMessage message) {
|
|
ChatType.Bound bound = ChatType.bind(ChatType.MSG_COMMAND_INCOMING, source);
|
|
OutgoingChatMessage outgoingChatMessage = OutgoingChatMessage.create(message);
|
|
boolean bl = false;
|
|
|
|
for (ServerPlayer serverPlayer : targets) {
|
|
ChatType.Bound bound2 = ChatType.bind(ChatType.MSG_COMMAND_OUTGOING, source).withTargetName(serverPlayer.getDisplayName());
|
|
source.sendChatMessage(outgoingChatMessage, false, bound2);
|
|
boolean bl2 = source.shouldFilterMessageTo(serverPlayer);
|
|
serverPlayer.sendChatMessage(outgoingChatMessage, bl2, bound);
|
|
bl |= bl2 && message.isFullyFiltered();
|
|
}
|
|
|
|
if (bl) {
|
|
source.sendSystemMessage(PlayerList.CHAT_FILTERED_FULL);
|
|
}
|
|
}
|
|
}
|