Posted March 22, 20214 yr I want to create custom command with custom attribute. That attribute represents String from some collection. Which options this command should support: /research clear /research clear <player> /research clear <player> <research> /research add <research> /research add <research> <player> I used class ParticleCommand as example Almost everything works fine, but minecraft doesn't want to recognize my argument input as valid, while suggestion list works fine. I keep getting that error in chat when trying to execute my command with that argument My code: ResearchCommand package arcanacraft.commands; import arcanacraft.capabilities.ResearchCapability; import arcanacraft.capabilities.ResearchCapabilityProvider; import arcanacraft.network.PacketHandler; import arcanacraft.network.PacketProperties; import arcanacraft.research.Research; import com.mojang.brigadier.CommandDispatcher; import net.minecraft.command.CommandSource; import net.minecraft.command.Commands; import net.minecraft.command.arguments.EntityArgument; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.util.text.TranslationTextComponent; import net.minecraftforge.common.util.LazyOptional; public class ResearchCommand { public static void register(CommandDispatcher<CommandSource> dispatcher) { dispatcher.register(Commands.literal("research").requires(commandSource -> commandSource.hasPermissionLevel(2)) .then(Commands.literal("clear") .executes(context -> clearAll(context.getSource(), context.getSource().asPlayer())) .then(Commands.argument("target", EntityArgument.player()) .executes(context -> clearAll(context.getSource(), EntityArgument.getPlayer(context, "target"))) .then(Commands.argument("research", ResearchArgument.research()) .executes(context -> clear(context.getSource(), ResearchArgument.getResearch(context, "research"), EntityArgument.getPlayer(context, "target"))) ) ) ).then(Commands.literal("add") .then(Commands.argument("research", ResearchArgument.research()) .executes(context -> add(context.getSource(), ResearchArgument.getResearch(context, "research"), context.getSource().asPlayer())) .then(Commands.argument("target", EntityArgument.player()) .executes(context -> add(context.getSource(), ResearchArgument.getResearch(context, "research"), EntityArgument.getPlayer(context, "target"))) ) ) ) ); } private static int clearAll(CommandSource source, PlayerEntity player) { LazyOptional<ResearchCapability> capability = player.getCapability(ResearchCapabilityProvider.RESEARCH_CAPABILITY); capability.ifPresent(researchCapability -> { researchCapability.clearAll(); PacketHandler.SendMessage(ResearchCapabilityProvider.INFO, player, ResearchCapability.SIGNAL_SYNC, new PacketProperties().NBT(researchCapability.write()).ToPlayer((ServerPlayerEntity) player)); }); source.sendFeedback(new TranslationTextComponent("commands.research.clear.all", player.getDisplayName()), true); return 1; } private static int clear(CommandSource source, Research research, PlayerEntity player) { LazyOptional<ResearchCapability> capability = player.getCapability(ResearchCapabilityProvider.RESEARCH_CAPABILITY); capability.ifPresent(researchCapability -> { researchCapability.clear(research); PacketHandler.SendMessage(ResearchCapabilityProvider.INFO, player, ResearchCapability.SIGNAL_SYNC, new PacketProperties().NBT(researchCapability.write()).ToPlayer((ServerPlayerEntity) player)); }); source.sendFeedback(new TranslationTextComponent("commands.research.clear.specific", new TranslationTextComponent(research.name), player.getDisplayName()), true); return 1; } private static int add(CommandSource source, Research research, PlayerEntity player) { LazyOptional<ResearchCapability> capability = player.getCapability(ResearchCapabilityProvider.RESEARCH_CAPABILITY); capability.ifPresent(researchCapability -> { researchCapability.advance(research); PacketHandler.SendMessage(ResearchCapabilityProvider.INFO, player, ResearchCapability.SIGNAL_SYNC, new PacketProperties().NBT(researchCapability.write()).ToPlayer((ServerPlayerEntity) player)); }); source.sendFeedback(new TranslationTextComponent("commands.research.add", new TranslationTextComponent(research.name), player.getDisplayName()), true); return 1; } } ResearchArgument package arcanacraft.commands; import arcanacraft.research.Research; import arcanacraft.research.ResearchRegistry; import com.google.common.collect.ImmutableList; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; import net.minecraft.command.ISuggestionProvider; import net.minecraft.util.text.TranslationTextComponent; import java.util.Collection; import java.util.concurrent.CompletableFuture; public class ResearchArgument implements ArgumentType<Research> { public static final DynamicCommandExceptionType RESEARCH_NOT_FOUND = new DynamicCommandExceptionType((research) -> new TranslationTextComponent("commands.research.notFound", research) ); @Override public Research parse(StringReader reader) throws CommandSyntaxException { String name = reader.getString().substring(reader.getCursor()); Research research = ResearchRegistry.INSTANCE.getResearch(name); if (research != null) { return research; } else { throw RESEARCH_NOT_FOUND.create(name); } } public static <S> Research getResearch(CommandContext<S> context, String name) { return context.getArgument(name, Research.class); } public static ResearchArgument research() { return new ResearchArgument(); } @Override public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> context, SuggestionsBuilder builder) { return ISuggestionProvider.suggest(ResearchRegistry.INSTANCE.getKeys(), builder); } @Override public Collection<String> getExamples() { return ImmutableList.of(ResearchRegistry.INSTANCE.getKeys().stream().findFirst().get()); } } Edited March 23, 20214 yr by Soft-fur dragon
March 22, 20214 yr Author I found it. This is how my register function looks now: @SubscribeEvent public void registerCommands(final RegisterCommandsEvent event) { ArgumentTypes.register("research", ResearchArgument.class, new ArgumentSerializer<>(ResearchArgument::research)); ResearchCommand.register(event.getDispatcher()); } But now I'm getting datapack loading error and cannot open world java.lang.IllegalArgumentException: Class arcanacraft.commands.ResearchArgument already has a serializer!
March 22, 20214 yr Author Moved argument registration to Setup block. Now I can enter world, but still getting error as in first post
March 22, 20214 yr Author Thank you a lot! I replaced first line in parse with String name = reader.readString(); and it works just fine now However, there is also little problem. /help research doesn't tell you that /research clear <target> <research> is available
March 23, 20214 yr Author I guess, this is a minecraft bug, since same happens even with built-in commands, such as particle
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.