package net.minecraft.server.commands; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.builder.RequiredArgumentBuilder; 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.ResourceLocationArgument; import net.minecraft.commands.arguments.selector.EntitySelector; import net.minecraft.commands.synchronization.SuggestionProviders; import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundStopSoundPacket; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundSource; import org.jetbrains.annotations.Nullable; public class StopSoundCommand { public static void register(CommandDispatcher dispatcher) { RequiredArgumentBuilder requiredArgumentBuilder = Commands.argument("targets", EntityArgument.players()) .executes(commandContext -> stopSound(commandContext.getSource(), EntityArgument.getPlayers(commandContext, "targets"), null, null)) .then( Commands.literal("*") .then( Commands.argument("sound", ResourceLocationArgument.id()) .suggests(SuggestionProviders.AVAILABLE_SOUNDS) .executes( commandContext -> stopSound( commandContext.getSource(), EntityArgument.getPlayers(commandContext, "targets"), null, ResourceLocationArgument.getId(commandContext, "sound") ) ) ) ); for (SoundSource soundSource : SoundSource.values()) { requiredArgumentBuilder.then( Commands.literal(soundSource.getName()) .executes(commandContext -> stopSound(commandContext.getSource(), EntityArgument.getPlayers(commandContext, "targets"), soundSource, null)) .then( Commands.argument("sound", ResourceLocationArgument.id()) .suggests(SuggestionProviders.AVAILABLE_SOUNDS) .executes( commandContext -> stopSound( commandContext.getSource(), EntityArgument.getPlayers(commandContext, "targets"), soundSource, ResourceLocationArgument.getId(commandContext, "sound") ) ) ) ); } dispatcher.register(Commands.literal("stopsound").requires(commandSourceStack -> commandSourceStack.hasPermission(2)).then(requiredArgumentBuilder)); } private static int stopSound(CommandSourceStack source, Collection targets, @Nullable SoundSource category, @Nullable ResourceLocation sound) { ClientboundStopSoundPacket clientboundStopSoundPacket = new ClientboundStopSoundPacket(sound, category); for (ServerPlayer serverPlayer : targets) { serverPlayer.connection.send(clientboundStopSoundPacket); } if (category != null) { if (sound != null) { source.sendSuccess(() -> Component.translatable("commands.stopsound.success.source.sound", Component.translationArg(sound), category.getName()), true); } else { source.sendSuccess(() -> Component.translatable("commands.stopsound.success.source.any", category.getName()), true); } } else if (sound != null) { source.sendSuccess(() -> Component.translatable("commands.stopsound.success.sourceless.sound", Component.translationArg(sound)), true); } else { source.sendSuccess(() -> Component.translatable("commands.stopsound.success.sourceless.any"), true); } return targets.size(); } }