diff --git a/pom.xml b/pom.xml index cc4404323..175df5e03 100644 --- a/pom.xml +++ b/pom.xml @@ -125,7 +125,7 @@ com.mojang brigadier - 1.0.14 + 1.0.18 compile diff --git a/src/main/java/com/massivecraft/factions/cmd/BrigadierManager.java b/src/main/java/com/massivecraft/factions/cmd/BrigadierManager.java index bf9718c4d..196aae9a8 100644 --- a/src/main/java/com/massivecraft/factions/cmd/BrigadierManager.java +++ b/src/main/java/com/massivecraft/factions/cmd/BrigadierManager.java @@ -1,11 +1,10 @@ package com.massivecraft.factions.cmd; -import com.massivecraft.factions.Conf; import com.massivecraft.factions.FactionsPlugin; import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.builder.ArgumentBuilder; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.builder.RequiredArgumentBuilder; -import com.mojang.brigadier.tree.CommandNode; import me.lucko.commodore.Commodore; import me.lucko.commodore.CommodoreProvider; @@ -14,56 +13,62 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; public class BrigadierManager { private final Commodore commodore; - private final LiteralArgumentBuilder brigadier; public BrigadierManager() { commodore = CommodoreProvider.getCommodore(FactionsPlugin.getInstance()); - brigadier = LiteralArgumentBuilder.literal("factions"); } public void build() { - commodore.register(brigadier.build()); - - // Register aliases with all children of 'factions' - for (String alias : Conf.baseCommandAliases) { - LiteralArgumentBuilder aliasLiteral = LiteralArgumentBuilder.literal(alias); - for (CommandNode node : brigadier.getArguments()) { - aliasLiteral.then(node); - } - commodore.register(aliasLiteral.build()); + FCmdRoot cmdBase = FCmdRoot.instance; + LiteralArgumentBuilder factionsBrigadier = LiteralArgumentBuilder.literal("factions"); + LiteralArgumentBuilder fBrigadier = LiteralArgumentBuilder.literal("f"); + + for (FCommand command : cmdBase.getSubCommands()) { + List> aliases = addCommand(command); + aliases.forEach(alias -> { + factionsBrigadier.then(alias); + fBrigadier.then(alias); + }); } - } - public void addSubCommand(FCommand subCommand) { - for (String alias : subCommand.getAliases()) { - LiteralArgumentBuilder literal = LiteralArgumentBuilder.literal(alias); - - if (subCommand.getRequirements().getBrigadier() != null) { - registerUsingProvider(subCommand, literal); - } else { - registerGeneratedBrigadier(subCommand, literal); - } - } + commodore.register(factionsBrigadier.build()); + commodore.register(fBrigadier.build()); } - private void registerUsingProvider(FCommand subCommand, LiteralArgumentBuilder literal) { - Class brigadierProvider = subCommand.getRequirements().getBrigadier(); - try { - Constructor constructor = brigadierProvider.getDeclaredConstructor(); - brigadier.then(constructor.newInstance().get(literal)); - } catch (NoSuchMethodException | InstantiationException | IllegalAccessException | - InvocationTargetException exception) { - exception.printStackTrace(); - } + private List> addCommand(FCommand command) { + List> aliases = command.getAliases().stream() + .map(alias -> createCommandAliasLiteral(command, alias)) + .collect(Collectors.toList()); + + aliases.forEach(literal -> { + // Add subcommands to the current command + List subCommands = command.getSubCommands(); + subCommands.stream().map(this::addCommand).forEach(subLiterals -> subLiterals.forEach(literal::then)); + }); + return aliases; } - private void registerGeneratedBrigadier(FCommand subCommand, LiteralArgumentBuilder literal) { - List> argsStack = generateArgsStack(subCommand); + private ArgumentBuilder createCommandAliasLiteral(FCommand command, String alias) { + LiteralArgumentBuilder literal = LiteralArgumentBuilder.literal(alias); + Class brigadier = command.getRequirements().getBrigadier(); + if (brigadier != null) { + // Command has it's own brigadier provider + try { + Constructor constructor = brigadier.getDeclaredConstructor(); + return constructor.newInstance().get(literal); + } catch (NoSuchMethodException | InstantiationException | IllegalAccessException | + InvocationTargetException exception) { + exception.printStackTrace(); + } + } + // Add the arguments to the command + List> argsStack = generateArgsStack(command); RequiredArgumentBuilder previous = null; for (int i = argsStack.size() - 1; i >= 0; i--) { if (previous == null) { @@ -72,12 +77,11 @@ private void registerGeneratedBrigadier(FCommand subCommand, LiteralArgumentBuil previous = argsStack.get(i).then(previous); } } - - if (previous == null) { - brigadier.then(literal); - } else { - brigadier.then(literal.then(previous)); + if (previous != null) { + literal.then(previous); } + + return literal; } private List> generateArgsStack(FCommand subCommand) { diff --git a/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java b/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java index ddc7820a9..c8c2dd433 100644 --- a/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java +++ b/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java @@ -434,10 +434,6 @@ public boolean onCommand(CommandSender sender, Command command, String label, St @Override public void addSubCommand(FCommand subCommand) { super.addSubCommand(subCommand); - // People were getting NPE's as somehow CommodoreProvider#isSupported returned true on legacy versions. - if (CommodoreProvider.isSupported()) { - brigadierManager.addSubCommand(subCommand); - } } @Override