Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

[1.16.5] Custom command with custom attribute type - Expected whitespace to end one argument, but found trailing data [RESOLVED]


Soft-fur dragon
 Share

Recommended Posts

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

image.thumb.png.0f788d5d987a992eb80c2ad425ba6c1c.png

image.thumb.png.da60d8273c7913138a7a20c9ac1df769.png

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 by Soft-fur dragon
Link to comment
Share on other sites

  • Soft-fur dragon changed the title to [1.16.5] Custom command with custom attribute type - Expected whitespace to end one argument, but found trailing data

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!

Link to comment
Share on other sites

  • Soft-fur dragon changed the title to [1.16.5] Custom command with custom attribute type - Expected whitespace to end one argument, but found trailing data [RESOLVED]

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.