AbstractCommand class

Пакет: com.hypixel.hytale.server.core.command.system

Файл: com/hypixel/hytale/server/core/command/system/AbstractCommand.java

Поля (100)

МодификаторыТипИмя
break
break
break
break
break
return
return
return
return
return
return
String var1
Map var1
AbbreviationMap.AbbreviationMapBuilder var1
List var1
var1
HashSet var10
String var10
List var10
Message var10
var10
Message var10
String var11
boolean var11
var11
ObjectIterator var14
AbstractOptionalArg var14
AbstractCommand var19
List var2
var2
String var2
ObjectIterator var2
AbstractCommand var2
PermissionQuery var2
String var2
Message var2
String var2
String var20
Message var20
MatchResult var21
Message var21
var21
MatchResult var22
Message var22
var22
String var23
boolean var23
var23
Message var24
ObjectIterator var25
Message var26
AbstractCommand var27
Message var29
ObjectIterator var3
Entry var3
int var3
String var3
AbstractCommand var3
ArgumentType var3
HashSet var31
ObjectIterator var4
String var4
AbstractCommand var4
int var4
int var4
ObjectBidirectionalIterator var4
String var4
String var4
AbstractCommand var5
String var5
var5
var5
ObjectBooleanPair var5
String var5
java.util.Map.Entry var5
boolean var5
var5
Message var5
CommandContext var6
AbstractCommand var6
int var6
AbstractOptionalArg var6
boolean var6
var6
var6
String var7
AbstractCommand var7
String[] var7
List var7
ObjectIterator var7
String var8
String[] var8
Message var8
var8
AbstractCommand var8
String var9
ParserContext.PreOptionalListContext var9
boolean var9
var9
String var9

Методы (107)

МодификаторыВозвратСигнатура
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Unknown owner type, please use PluginBase or CommandManager")
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Cannot add a subcommand with no name")
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Cannot re-use subcommands. Only one parent command allowed for each subcommand")
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Cannot have multiple subcommands with the same name")
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Command has same name as existing command alias for command: " + var1.name)
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Cannot specify a subcommand alias with the same name as an existing command or alias: " + var3)
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Cannot add a variant command with a name, use the description-only constructor")
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Cannot re-use variant commands. Only one parent command allowed for each variant command")
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Cannot re-use arguments")
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Cannot change permissions when a command has already completed registration")
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Cannot add aliases when a command has already completed registration")
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Cannot add aliases to a command with no name")
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Cannot add new subcommands when a command has already completed registration")
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Cannot add a subcommand to a variant command, can only add subcommands to named commands")
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Cannot add new variants when a command has already completed registration")
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Cannot add a command variant to a variant command, can only add variants to named commands")
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Cannot add new arguments when a command has already completed registration")
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Cannot register additional required arguments after a greedy string argument")
public record SuggestionOverrideEntryrecord SuggestionOverrideEntry(int argStart, int argCount, @Nonnull ArgumentType<?> overrideType)
public void addAliasesvoid addAliases(@Nonnull String... var1)
public void addSubCommandvoid addSubCommand(@Nonnull AbstractCommand var1)
public void addUsageVariantvoid addUsageVariant(@Nonnull AbstractCommand var1)
public String argTypeIdpublic String argTypeId()
private void checkNotRegisteredvoid checkNotRegistered()
public void completeRegistrationvoid completeRegistration()
public int countParentsint countParents()
private void createOptionalArgumentAbbreviationMapvoid createOptionalArgumentAbbreviationMap()
for for(String var4 : var2)
for for(String var6 : this.aliases)
for for(RequiredArg var16 : this.requiredArguments)
for for(String var5 : var1)
for for(String var3 : var1.aliases)
for for(RequiredArg var6 : this.requiredArguments)
for for(RequiredArg var5 : this.requiredArguments)
for for(RequiredArg var4 : this.requiredArguments)
for for(RequiredArg var7 : this.requiredArguments)
for for(RequiredArg var35 : this.requiredArguments)
for for(ArgumentType var37 : var31)
for for(RequiredArg var14 : this.requiredArguments)
abstract for for(int var7 = 0; var7 < var3 && var6 < var2.length()
abstract for for(int var9 = 0; var9 < var7.size()
abstract for for(int var11 = 0; var11 < var10.size()
abstract for for(int var2 = 0; var2 < this.requiredArguments.size()
public boolean hasBeenRegisteredboolean hasBeenRegistered()
public boolean hasPermissionboolean hasPermission(@Nonnull CommandSender var1)
if if(var3)
if if(this.permission == null && !this.openToEveryone)
if if(this.parentCommand != null)
if if(var2 == null && this.parentCommand != null)
if if(var2 != null && this.permission != null)
if if(var4 != null)
if if(this.description != null)
if if(var20 != null)
if if(this.permission != null)
if if(this.permission == null)
if if(var3 instanceof DefaultArg var4)
if if(this.hasBeenRegistered)
if if(this.parentCommand != null)
if if(this.hasBeenRegistered)
if if(this.name == null)
if if(this.hasBeenRegistered)
if if(var1.name == null)
if if(var1.parentCommand != null)
if if(this.hasBeenRegistered)
if if(var1.name != null)
if if(var1.parentCommand != null)
if if(var2 != null)
if if(this instanceof AbstractCommandCollection && var4 != 0)
if if(this.unavailableInSingleplayer && Constants.SINGLEPLAYER)
if if(this.allowsExtraArguments)
if if(var4 < this.totalNumRequiredParameters)
if if(var2 == null)
if if(this.parentCommand == null)
if if(var6 != null)
if if(this.totalNumRequiredParameters != var4 && var7 != null)
if if(var6 == null)
if if(var5)
if if(var23)
if if(var11)
if if(var9)
if if(!var6)
if if(this.hasBeenRegistered)
if if(this.hasGreedyStringArg)
if if(this.hasBeenRegistered)
if if(var3 != null)
if if(var3 != null)
if if(var1 == null)
public boolean isVariantboolean isVariant()
private void processOptionalArgumentsvoid processOptionalArguments(@Nonnull ParserContext var1, @Nonnull ParseResult var2, @Nonnull CommandContext var3)
private void processRequiredArgumentsvoid processRequiredArguments(@Nonnull ParserContext var1, @Nonnull ParseResult var2, @Nonnull CommandContext var3)
public void putRecursivePermissionGroupsvoid putRecursivePermissionGroups(@Nonnull Map<String, Set<String>> var1)
public void requireNoPermissionvoid requireNoPermission()
public void requirePermissionvoid requirePermission(@Nonnull String var1)
public void requirePermissionvoid requirePermission(@Nonnull PermissionQuery var1)
public void setAllowsExtraArgumentsvoid setAllowsExtraArguments(boolean var1)
public void setOwnervoid setOwner(@Nonnull CommandOwner var1)
protected void setPermissionGroupsvoid setPermissionGroups(@Nonnull String... var1)
protected void setUnavailableInSingleplayervoid setUnavailableInSingleplayer(boolean var1)
switch switch(var1)
switch switch(var14)
abstract this this(var1, var2, false)
abstract this this(null, var1)
private void validateDefaultArgumentsvoid validateDefaultArguments(@Nonnull ParseResult var1)
private void validateVariantNumberOfRequiredParametersvoid validateVariantNumberOfRequiredParameters(@Nonnull ParseResult var1)
public <W extends WrappedArg<D>, D> W withDefaultArg<W extends WrappedArg<D>, D> W withDefaultArg(@Nonnull String var1, @Nonnull String var2, @Nonnull ArgWrapper<W, D> var3, D var4, @Nonnull String var5)
public <W extends WrappedArg<D>, D> W withOptionalArg<W extends WrappedArg<D>, D> W withOptionalArg(@Nonnull String var1, @Nonnull String var2, @Nonnull ArgWrapper<W, D> var3)
public <W extends WrappedArg<D>, D> W withRequiredArg<W extends WrappedArg<D>, D> W withRequiredArg(@Nonnull String var1, @Nonnull String var2, @Nonnull ArgWrapper<W, D> var3)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.command.system;

class="kw">import com.hypixel.hytale.common.util.StringUtil;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.protocol.GameMode;
class="kw">import com.hypixel.hytale.server.core.Constants;
class="kw">import com.hypixel.hytale.server.core.Message;
class="kw">import com.hypixel.hytale.server.core.command.system.arguments.system.AbstractOptionalArg;
class="kw">import com.hypixel.hytale.server.core.command.system.arguments.system.ArgWrapper;
class="kw">import com.hypixel.hytale.server.core.command.system.arguments.system.Argument;
class="kw">import com.hypixel.hytale.server.core.command.system.arguments.system.DefaultArg;
class="kw">import com.hypixel.hytale.server.core.command.system.arguments.system.FlagArg;
class="kw">import com.hypixel.hytale.server.core.command.system.arguments.system.OptionalArg;
class="kw">import com.hypixel.hytale.server.core.command.system.arguments.system.RequiredArg;
class="kw">import com.hypixel.hytale.server.core.command.system.arguments.system.WrappedArg;
class="kw">import com.hypixel.hytale.server.core.command.system.arguments.types.ArgumentType;
class="kw">import com.hypixel.hytale.server.core.command.system.arguments.types.ListArgumentType;
class="kw">import com.hypixel.hytale.server.core.command.system.basecommands.AbstractCommandCollection;
class="kw">import com.hypixel.hytale.server.core.command.system.exceptions.GeneralCommandException;
class="kw">import com.hypixel.hytale.server.core.modules.i18n.I18nModule;
class="kw">import com.hypixel.hytale.server.core.permissions.PermissionQuery;
class="kw">import com.hypixel.hytale.server.core.permissions.PermissionsModule;
class="kw">import com.hypixel.hytale.server.core.plugin.PluginBase;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectMap.Entry;
class="kw">import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectBidirectionalIterator;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectBooleanPair;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectIterator;
class="kw">import java.util.ArrayList;
class="kw">import java.util.Arrays;
class="kw">import java.util.Collection;
class="kw">import java.util.HashSet;
class="kw">import java.util.LinkedHashMap;
class="kw">import java.util.List;
class="kw">import java.util.Locale;
class="kw">import java.util.Map;
class="kw">import java.util.Set;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class="kw">abstract class AbstractCommand {
   @Nonnull
   class="kw">public class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">public class="kw">static class="kw">final String[] EMPTY_STRING_ARRAY = new String[0];
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_COMMANDS_HELP_NO_PERMISSIBLE_SUB_COMMAND = Message.translation("server.commands.help.noPermissibleSubCommand");
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_COMMANDS_PARSING_ERROR_NO_PERMISSION_FOR_COMMAND = Message.translation(
      "server.commands.parsing.error.noPermissionForCommand"
   );
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_COMMANDS_PARSING_ERROR_ATTEMPTED_UNSAFE = Message.translation("server.commands.parsing.error.attemptedUnsafe");
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_COMMANDS_PARSING_USAGE_REQUIRES_CONFIRMATION = Message.translation("server.commands.parsing.usage.requiresConfirmation");
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_COMMAND_SINGLEPLAYER = Message.translation("server.commands.parsing.error.unavailableInSingleplayer");
   @Nonnull
   class="kw">static class="kw">final String CONFIRM_ARG_TAG = "confirm";
   @Nonnull
   class="kw">private class="kw">static class="kw">final String COLOR_STRING_ARG_REQUIRED = "#C1E0FF";
   @Nonnull
   class="kw">private class="kw">static class="kw">final String COLOR_STRING_ARG_OPTIONAL = "#7E9EBC";
   class="kw">private AbstractCommand parentCommand;
   @Nullable
   class="kw">private class="kw">final String name;
   @Nonnull
   class="kw">private class="kw">final Set<String> aliases = new HashSet<>();
   @Nullable
   class="kw">private class="kw">final String description;
   @Nonnull
   class="kw">private class="kw">final List<RequiredArg<?>> requiredArguments = new ObjectArrayList();
   @Nonnull
   class="kw">private class="kw">final Map<String, AbstractOptionalArg<?, ?>> optionalArguments = new Object2ObjectOpenHashMap();
   class="kw">private AbbreviationMap<AbstractOptionalArg<?, ?>> argumentAbbreviationMap;
   @Nonnull
   class="kw">private class="kw">final Map<String, AbstractCommand> subCommands = new LinkedHashMap<>();
   @Nonnull
   class="kw">private class="kw">final Map<String, String> subCommandsAliases = new LinkedHashMap<>();
   @Nonnull
   class="kw">private class="kw">final Int2ObjectMap<AbstractCommand> variantCommands = new Int2ObjectOpenHashMap();
   @Nullable
   class="kw">private CommandOwner owner;
   @Nullable
   class="kw">private PermissionQuery permission;
   class="kw">private boolean openToEveryone;
   @Nullable
   class="kw">private List<String> permissionGroups;
   class="kw">private int totalNumRequiredParameters;
   class="kw">private class="kw">final boolean requiresConfirmation;
   class="kw">private boolean unavailableInSingleplayer;
   class="kw">private boolean allowsExtraArguments;
   class="kw">private boolean hasBeenRegistered;
   class="kw">private boolean hasGreedyStringArg;

   class="kw">protected AbstractCommand(@Nullable String var1, @Nullable String var2, boolean var3) {
      this.name = var1 == null ? null : var1.toLowerCase(Locale.ROOT);
      this.description = var2;
      this.requiresConfirmation = var3;
      if (var3) {
         this.registerOptionalArg(new FlagArg(this, "confirm", ""));
      }
   }

   class="kw">protected AbstractCommand(@Nullable String var1, @Nullable String var2) {
      this(var1, var2, false);
   }

   class="kw">protected AbstractCommand(@Nullable String var1) {
      this(null, var1);
   }

   class="kw">public void setOwner(@Nonnull CommandOwner var1) {
      this.owner = var1;
      if (this.permission == null && !this.openToEveryone) {
         this.permission = PermissionQuery.of(this.generatePermission());
      }

      for (AbstractCommand var3 : this.subCommands.values()) {
         var3.setOwner(var1);
      }

      ObjectIterator var4 = this.variantCommands.values().iterator();

      while (var4.hasNext()) {
         AbstractCommand var5 = (AbstractCommand)var4.next();
         var5.setOwner(var1);
      }
   }

   @Nullable
   class="kw">protected String generatePermissionNode() {
      class="kw">return this.name == null ? null : this.name.toLowerCase(Locale.ROOT);
   }

   @Nonnull
   class="kw">private String generatePermission() {
      String var1 = this.generatePermissionNode();
      if (this.parentCommand != null) {
         String var4 = this.parentCommand.permission == null ? this.parentCommand.generatePermission() : this.parentCommand.permission.getId();
         String var5;
         if (var1 != null && !var1.isEmpty()) {
            var5 = var4 + "." + var1;
         } else {
            var5 = var4;
         }

         ((HytaleLogger.Api)LOGGER.atFine()).log("Generated missing permission '%s'.", var5);
         class="kw">return var5;
      } else if (this.owner class="kw">instanceof PluginBase var2) {
         class="kw">return var2.getBasePermission() + ".command." + var1;
      } else if (this.owner class="kw">instanceof CommandManager) {
         class="kw">return "hytale.system.command." + var1;
      } else {
         throw new IllegalArgumentException("Unknown owner type, please use PluginBase or CommandManager");
      }
   }

   @Nullable
   class="kw">public List<String> getPermissionGroups() {
      class="kw">return this.permissionGroups;
   }

   class="kw">protected void setPermissionGroups(@Nonnull String... var1) {
      this.permissionGroups = Arrays.asList(var1);
   }

   @Deprecated(forRemoval = true)
   class="kw">protected void setPermissionGroup(@Nonnull GameMode var1) {
      class="kw">switch (var1) {
         case Adventure:
            this.setPermissionGroups("hytale:Adventurer");
            break;
         case Creative:
            this.setPermissionGroups("hytale:WorldEditor");
      }
   }

   @Nonnull
   class="kw">public Map<String, Set<String>> getPermissionGroupsRecursive() {
      Map var1 = new Object2ObjectOpenHashMap();
      this.putRecursivePermissionGroups(var1);
      class="kw">return var1;
   }

   class="kw">public void putRecursivePermissionGroups(@Nonnull Map<String, Set<String>> var1) {
      List var2 = this.permissionGroups;
      if (var2 == null && this.parentCommand != null) {
         var2 = this.parentCommand.permissionGroups;
      }

      if (var2 != null && this.permission != null) {
         for (String var4 : var2) {
            if (var4 != null) {
               var1.computeIfAbsent(var4, var0 -> new HashSet<>()).add(this.permission.getId());
            }
         }
      }

      for (AbstractCommand var6 : this.subCommands.values()) {
         var6.putRecursivePermissionGroups(var1);
      }
   }

   class="kw">protected void setUnavailableInSingleplayer(boolean var1) {
      this.unavailableInSingleplayer = var1;
   }

   class="kw">public void setAllowsExtraArguments(boolean var1) {
      this.allowsExtraArguments = var1;
   }

   @Nonnull
   class="kw">public MatchResult matches(@Nonnull String var1, @Nonnull String var2, int var3) {
      class="kw">return this.matches(var1, var2, var3, 0);
   }

   @Nonnull
   class="kw">private MatchResult matches(@Nonnull String var1, @Nonnull String var2, int var3, int var4) {
      if (this.name != null && this.name.contains(var2)) {
         class="kw">return MatchResult.of(var3, var4, 0, this.name, var2);
      }

      for (String var6 : this.aliases) {
         if (var6.contains(var2)) {
            class="kw">return MatchResult.of(var3, var4, 1, var6, var2);
         }
      }

      for (AbstractOptionalArg var15 : this.optionalArguments.values()) {
         if (var15.getName().contains(var2)) {
            class="kw">return MatchResult.of(var3, var4, 3, var15.getName(), var2);
         }

         for (String var8 : var15.getAliases()) {
            if (var8.contains(var2)) {
               class="kw">return MatchResult.of(var3, var4, 3, var8, var2);
            }
         }
      }

      for (RequiredArg var16 : this.requiredArguments) {
         if (var16.getName().contains(var2)) {
            class="kw">return MatchResult.of(var3, var4, 3, var16.getName(), var2);
         }
      }

      if (this.description != null) {
         String var11 = I18nModule.get().getMessage(var1, this.description);
         if (var11 != null && var11.contains(var2)) {
            class="kw">return MatchResult.of(var3, var4, 4, var11, var2);
         }
      }

      for (AbstractOptionalArg var17 : this.optionalArguments.values()) {
         String var20 = var17.getDescription();
         if (var20 != null) {
            String var23 = I18nModule.get().getMessage(var1, var20);
            if (var23 != null && var23.contains(var2)) {
               class="kw">return MatchResult.of(var3, var4, 5, var23, var2);
            }
         }
      }

      for (AbstractCommand var18 : this.subCommands.values()) {
         MatchResult var21 = var18.matches(var1, var2, var3, var4 + 1);
         if (!var21.equals(MatchResult.NONE)) {
            class="kw">return var21;
         }
      }

      ObjectIterator var14 = this.variantCommands.values().iterator();

      while (var14.hasNext()) {
         AbstractCommand var19 = (AbstractCommand)var14.next();
         MatchResult var22 = var19.matches(var1, var2, var3, var4 + 1);
         if (!var22.equals(MatchResult.NONE)) {
            class="kw">return var22;
         }
      }

      class="kw">return MatchResult.NONE;
   }

   class="kw">public void completeRegistration() class="kw">throws GeneralCommandException {
      this.hasBeenRegistered = true;
      if (this.permission != null) {
         PermissionsModule.registerPermission(this.permission.getId());
      }

      for (AbstractCommand var2 : this.subCommands.values()) {
         var2.completeRegistration();
      }

      ObjectIterator var3 = this.variantCommands.values().iterator();

      while (var3.hasNext()) {
         AbstractCommand var4 = (AbstractCommand)var3.next();
         var4.completeRegistration();
      }

      this.validateVariantNumberOfRequiredParameters(new ParseResult(true));
      this.validateDefaultArguments(new ParseResult(true));
      this.createOptionalArgumentAbbreviationMap();
   }

   @Nullable
   class="kw">protected PermissionQuery registerExtendedPermission(@Nonnull String var1) {
      if (this.permission == null) {
         class="kw">return null;
      }

      String var2 = this.permission.getId() + "." + var1;
      PermissionsModule.registerPermission(var2);
      class="kw">return PermissionQuery.of(var2);
   }

   class="kw">private void createOptionalArgumentAbbreviationMap() {
      AbbreviationMap.AbbreviationMapBuilder var1 = AbbreviationMap.create();

      for (AbstractOptionalArg var3 : this.optionalArguments.values()) {
         var1.put(var3.getName(), var3);

         for (String var5 : var3.getAliases()) {
            var1.put(var5, var3);
         }
      }

      this.argumentAbbreviationMap = var1.build();
   }

   class="kw">private void validateVariantNumberOfRequiredParameters(@Nonnull ParseResult var1) {
      ObjectIterator var2 = this.variantCommands.int2ObjectEntrySet().iterator();

      while (var2.hasNext()) {
         Entry var3 = (Entry<AbstractCommand>)var2.next();
         if (this.totalNumRequiredParameters == ((AbstractCommand)var3.getValue()).totalNumRequiredParameters) {
            var1.fail(
               Message.raw(
                  "Command '"
                     + this.getFullyQualifiedName()
                     + "' and its variant '"
                     + ((AbstractCommand)var3.getValue()).toString()
                     + "' both have "
                     + this.totalNumRequiredParameters
                     + " required parameters. Variants must have different numbers of required parameters."
               )
            );
            class="kw">return;
         }
      }
   }

   class="kw">private void validateDefaultArguments(@Nonnull ParseResult var1) {
      for (AbstractOptionalArg var3 : this.optionalArguments.values()) {
         if (var3 class="kw">instanceof DefaultArg var4) {
            var4.validateDefaultValue(var1);
         }
      }
   }

   class="kw">public void requirePermission(@Nonnull String var1) {
      this.checkNotRegistered();
      this.permission = PermissionQuery.of(var1);
      this.openToEveryone = false;
   }

   class="kw">public void requirePermission(@Nonnull PermissionQuery var1) {
      this.checkNotRegistered();
      this.permission = var1;
      this.openToEveryone = false;
   }

   class="kw">public void requireNoPermission() {
      this.checkNotRegistered();
      this.permission = null;
      this.openToEveryone = true;
   }

   class="kw">private void checkNotRegistered() {
      if (this.hasBeenRegistered) {
         throw new IllegalStateException("Cannot change permissions when a command has already completed registration");
      }
   }

   @Nullable
   class="kw">public String getFullyQualifiedName() {
      if (this.parentCommand != null) {
         class="kw">return this.isVariant() ? this.parentCommand.getFullyQualifiedName() : this.parentCommand.getFullyQualifiedName() + " " + this.name;
      } else {
         class="kw">return this.name;
      }
   }

   class="kw">public int countParents() {
      class="kw">return this.parentCommand == null ? 0 : this.parentCommand.countParents() + 1;
   }

   class="kw">public void addAliases(@Nonnull String... var1) {
      if (this.hasBeenRegistered) {
         throw new IllegalStateException("Cannot add aliases when a command has already completed registration");
      }

      if (this.name == null) {
         throw new IllegalStateException("Cannot add aliases to a command with no name");
      }

      for (String var5 : var1) {
         this.aliases.add(var5.toLowerCase(Locale.ROOT));
      }
   }

   class="kw">public void addSubCommand(@Nonnull AbstractCommand var1) {
      if (this.hasBeenRegistered) {
         throw new IllegalStateException("Cannot add new subcommands when a command has already completed registration");
      }

      if (this.isVariant()) {
         throw new IllegalStateException("Cannot add a subcommand to a variant command, can only add subcommands to named commands");
      }

      if (var1.name == null) {
         throw new IllegalArgumentException("Cannot add a subcommand with no name");
      }

      if (var1.parentCommand != null) {
         throw new IllegalArgumentException("Cannot re-use subcommands. Only one parent command allowed for each subcommand");
      }

      var1.parentCommand = this;
      if (this.subCommands.containsKey(var1.name)) {
         throw new IllegalArgumentException("Cannot have multiple subcommands with the same name");
      }

      if (this.subCommandsAliases.containsKey(var1.name)) {
         throw new IllegalArgumentException("Command has same name as existing command alias for command: " + var1.name);
      }

      this.subCommands.put(var1.name, var1);

      for (String var3 : var1.aliases) {
         if (this.subCommandsAliases.containsKey(var3) || this.subCommands.containsKey(var3)) {
            throw new IllegalArgumentException("Cannot specify a subcommand alias with the same name as an existing command or alias: " + var3);
         }

         this.subCommandsAliases.put(var3, var1.name);
      }

      var1.hasBeenRegistered = true;
   }

   class="kw">public void addUsageVariant(@Nonnull AbstractCommand var1) {
      if (this.hasBeenRegistered) {
         throw new IllegalStateException("Cannot add new variants when a command has already completed registration");
      }

      if (this.isVariant()) {
         throw new IllegalStateException("Cannot add a command variant to a variant command, can only add variants to named commands");
      }

      if (var1.name != null) {
         throw new IllegalArgumentException("Cannot add a variant command with a name, use the description-only constructor");
      }

      if (var1.parentCommand != null) {
         throw new IllegalArgumentException("Cannot re-use variant commands. Only one parent command allowed for each variant command");
      }

      AbstractCommand var2 = (AbstractCommand)this.variantCommands.put(var1.totalNumRequiredParameters, var1);
      if (var2 != null) {
         throw new IllegalArgumentException(
            "You have already registered a variant command with "
               + var1.totalNumRequiredParameters
               + " required parameters. Command's class name: "
               + var2.getClass().getName()
         );
      }

      var1.parentCommand = this;
      var1.hasBeenRegistered = true;
   }

   @Nullable
   class="kw">public CompletableFuture<Void> acceptCall(@Nonnull CommandSender var1, @Nonnull ParserContext var2, @Nonnull ParseResult var3) {
      var2.convertToSubCommand();
      class="kw">return this.acceptCall0(var1, var2, var3);
   }

   @Nullable
   class="kw">private CompletableFuture<Void> acceptCall0(@Nonnull CommandSender var1, @Nonnull ParserContext var2, @Nonnull ParseResult var3) {
      int var4 = var2.getNumPreOptionalTokens();
      ObjectBooleanPair var5 = this.checkForExecutingSubcommands(var1, var2, var3, var4);
      if (var3.failed()) {
         class="kw">return null;
      }

      if (var5.rightBoolean()) {
         class="kw">return (CompletableFuture<Void>)var5.left();
      }

      if (!this.hasPermission(var1)) {
         var3.fail(MESSAGE_COMMANDS_PARSING_ERROR_NO_PERMISSION_FOR_COMMAND);
         class="kw">return null;
      }

      if (this class="kw">instanceof AbstractCommandCollection && var4 != 0) {
         HashSet var10 = new HashSet<>(this.subCommands.keySet());
         var10.addAll(this.subCommandsAliases.keySet());
         String var7 = var2.getFirstToken();
         String var8 = "\n/" + this.getFullyQualifiedName() + " ";
         String var9 = var8 + String.join(var8, StringUtil.sortByFuzzyDistance(var7, var10, 5));
         var3.fail(
            Message.translation("server.commands.parsing.error.commandCollectionSubcommandNotFound").param("subcommand", var7).param("suggestions", var9)
         );
         class="kw">return null;
      }

      if (var2.isHelpSpecified()) {
         var1.sendMessage(this.getUsageString(var1));
         class="kw">return null;
      }

      if (this.unavailableInSingleplayer && Constants.SINGLEPLAYER) {
         var3.fail(MESSAGE_COMMAND_SINGLEPLAYER);
         class="kw">return null;
      }

      if (this.requiresConfirmation && !var2.isConfirmationSpecified()) {
         var3.fail(MESSAGE_COMMANDS_PARSING_ERROR_ATTEMPTED_UNSAFE);
         class="kw">return null;
      }

      if (this.allowsExtraArguments) {
         if (var4 < this.totalNumRequiredParameters) {
            var3.fail(
               Message.translation("server.commands.parsing.error.wrongNumberRequiredParameters")
                  .param("expected", this.totalNumRequiredParameters)
                  .param("actual", var4)
                  .insert("\n")
                  .insert(Message.translation("server.commands.help.usagecolon").param("usage", this.getUsageShort(var1, true)))
                  .insert("\n")
                  .insert(Message.translation("server.commands.help.useHelpToLearnMore").param("command", this.getFullyQualifiedName()))
            );
            class="kw">return null;
         }
      } else if (this.totalNumRequiredParameters != var4) {
         var3.fail(
            Message.translation("server.commands.parsing.error.wrongNumberRequiredParameters")
               .param("expected", this.totalNumRequiredParameters)
               .param("actual", var4)
               .insert("\n")
               .insert(Message.translation("server.commands.help.usagecolon").param("usage", this.getUsageShort(var1, true)))
               .insert("\n")
               .insert(Message.translation("server.commands.help.useHelpToLearnMore").param("command", this.getFullyQualifiedName()))
         );
         class="kw">return null;
      }

      CommandContext var6 = new CommandContext(this, var1, var2.getInputString());
      this.processRequiredArguments(var2, var3, var6);
      if (var3.failed()) {
         class="kw">return null;
      }

      this.processOptionalArguments(var2, var3, var6);
      class="kw">return var3.failed() ? null : this.execute(var6);
   }

   class="kw">public boolean hasPermission(@Nonnull CommandSender var1) {
      PermissionQuery var2 = this.permission;
      if (var2 == null) {
         class="kw">return true;
      }

      if (var1.hasPermission(var2)) {
         if (this.parentCommand == null) {
            class="kw">return true;
         } else {
            class="kw">return this.permissionGroups != null ? true : this.parentCommand.hasPermission(var1);
         }
      } else {
         class="kw">return false;
      }
   }

   @Nonnull
   class="kw">private ObjectBooleanPair<CompletableFuture<Void>> checkForExecutingSubcommands(
      @Nonnull CommandSender var1, @Nonnull ParserContext var2, @Nonnull ParseResult var3, int var4
   ) {
      if (var2.getNumPreOptSingleValueTokensBeforeListTokens() >= 0) {
         if (!this.subCommands.isEmpty()) {
            String var5 = var2.getPreOptionalSingleValueToken(0);
            AbstractCommand var6 = var5 == null ? null : this.getSubCommand(var5);
            if (var6 != null) {
               var2.convertToSubCommand();
               class="kw">return ObjectBooleanPair.of(var6.acceptCall0(var1, var2, var3), true);
            }
         }

         AbstractCommand var7 = (AbstractCommand)this.variantCommands.get(var4);
         if (this.totalNumRequiredParameters != var4 && var7 != null) {
            class="kw">return ObjectBooleanPair.of(var7.acceptCall0(var1, var2, var3), true);
         }
      }

      class="kw">return ObjectBooleanPair.of(null, false);
   }

   class="kw">private void processRequiredArguments(@Nonnull ParserContext var1, @Nonnull ParseResult var2, @Nonnull CommandContext var3) {
      int var4 = 0;

      for (RequiredArg var6 : this.requiredArguments) {
         if (var6.getArgumentType().isGreedyString()) {
            String var10 = this.extractGreedyRawTail(var1);
            var3.appendArgumentData(var6, new String[]{var10}, false, var2);
            class="kw">return;
         }

         if (var6.getArgumentType().isListArgument() && var1.isListToken(var4)) {
            ParserContext.PreOptionalListContext var9 = var1.getPreOptionalListToken(var4);
            var4++;
            var3.appendArgumentData(var6, var9.getTokens(), true, var2);
         } else {
            String[] var7 = new String[var6.getArgumentType().getNumberOfParameters()];

            for (int var8 = 0; var8 < var6.getArgumentType().getNumberOfParameters(); var8++) {
               if (var1.isListToken(var4)) {
                  var2.fail(Message.translation("server.commands.parsing.error.notAList").param("name", var6.getName()));
                  class="kw">return;
               }

               var7[var8] = var1.getPreOptionalSingleValueToken(var4);
               var4++;
            }

            var3.appendArgumentData(var6, var7, false, var2);
            if (var2.failed()) {
               class="kw">return;
            }
         }
      }
   }

   @Nonnull
   class="kw">private String extractGreedyRawTail(@Nonnull ParserContext var1) {
      String var2 = var1.getRawInput();
      int var3 = var1.getSubCommandIndex();

      for (RequiredArg var5 : this.requiredArguments) {
         if (var5.getArgumentType().isGreedyString()) {
            break;
         }

         var3 += var5.getArgumentType().getNumberOfParameters();
      }

      int var6 = 0;

      for (int var7 = 0; var7 < var3 && var6 < var2.length(); var7++) {
         while (var6 < var2.length() && var2.charAt(var6) == ' ') {
            var6++;
         }

         while (var6 < var2.length() && var2.charAt(var6) != ' ') {
            var6++;
         }
      }

      while (var6 < var2.length() && var2.charAt(var6) == ' ') {
         var6++;
      }

      class="kw">return var2.substring(var6);
   }

   class="kw">private void processOptionalArguments(@Nonnull ParserContext var1, @Nonnull ParseResult var2, @Nonnull CommandContext var3) {
      ObjectBidirectionalIterator var4 = var1.getOptionalArgs().iterator();

      while (var4.hasNext()) {
         java.util.Map.Entry var5 = (java.util.Map.Entry<String, List<List<String>>>)var4.next();
         AbstractOptionalArg var6 = (AbstractOptionalArg<? class="kw">extends Argument<?, ?>, ?>)this.getOptionalArgument(var5.getKey());
         if (var6 == null) {
            var2.fail(Message.translation("server.commands.parsing.error.couldNotFindOptionalArgName").param("input", var5.getKey()));
            class="kw">return;
         }

         if (!var6.hasPermission(var3.sender())) {
            var2.fail(Message.translation("server.commands.parsing.error.noPermissionForOptional").param("argument", var5.getKey()));
            class="kw">return;
         }

         List var7 = var5.getValue();
         if (var6.getArgumentType().isListArgument() && var7.size() > 1) {
            String[] var8 = new String[var7.size() * var7.getFirst().size()];

            for (int var9 = 0; var9 < var7.size(); var9++) {
               List var10 = var7.get(var9);

               for (int var11 = 0; var11 < var10.size(); var11++) {
                  var8[var9 * var10.size() + var11] = var10.get(var11);
               }
            }

            var3.appendArgumentData(var6, var8, true, var2);
         } else {
            var3.appendArgumentData(var6, var7.isEmpty() ? EMPTY_STRING_ARRAY : var7.getFirst().toArray(EMPTY_STRING_ARRAY), false, var2);
         }
      }

      for (AbstractOptionalArg var13 : this.optionalArguments.values()) {
         var13.verifyArgumentDependencies(var3, var2);
      }
   }

   @Nullable
   class="kw">protected class="kw">abstract CompletableFuture<Void> execute(@Nonnull CommandContext var1);

   @Nonnull
   class="kw">public Message getUsageString(@Nonnull CommandSender var1) {
      Message var2 = Message.raw("");

      for (RequiredArg var4 : this.requiredArguments) {
         var2.insert(" ").insert(var4.getUsageMessageWithoutDescription());
         if (var4.getArgumentType().isListArgument()) {
            var2.insert("/...");
         }
      }

      Message var20 = this.requiresConfirmation ? MESSAGE_COMMANDS_PARSING_USAGE_REQUIRES_CONFIRMATION : Message.raw("");
      Message var21 = Message.raw("");
      boolean var5 = false;

      for (RequiredArg var7 : this.requiredArguments) {
         var5 = true;
         var21.insert("\n    ").insert(var7.getUsageMessage());
      }

      Message var22 = Message.raw("");
      boolean var23 = false;
      Message var8 = Message.raw("");
      boolean var9 = false;
      Message var10 = Message.raw("");
      boolean var11 = false;

      for (java.util.Map.Entry var13 : this.optionalArguments.entrySet()) {
         AbstractOptionalArg var14 = (AbstractOptionalArg<? class="kw">extends Argument<?, ?>, ?>)var13.getValue();
         if (var14.hasPermission(var1)) {
            class="kw">switch (var14) {
               case OptionalArg var17:
                  var23 = true;
                  var22.insert("\n    ").insert(var14.getUsageMessage());
                  break;
               case DefaultArg var18:
                  var9 = true;
                  var8.insert("\n    ").insert(var14.getUsageMessage());
                  break;
               case FlagArg var19:
                  var11 = true;
                  var10.insert("\n    ").insert(var14.getUsageMessage());
                  break;
               class="kw">default:
            }
         }
      }

      if (var5) {
         var21 = Message.translation("server.commands.parsing.usage.requiredArgs").param("args", var21);
      }

      if (var23) {
         var22 = Message.translation("server.commands.parsing.usage.optionalArgs").param("args", var22);
      }

      if (var11) {
         var10 = Message.translation("server.commands.parsing.usage.flagArgs").param("args", var10);
      }

      if (var9) {
         var8 = Message.translation("server.commands.parsing.usage.defaultArgs").param("args", var8);
      }

      Message var24 = Message.raw("");
      ObjectIterator var25 = this.variantCommands.values().iterator();

      while (var25.hasNext()) {
         AbstractCommand var27 = (AbstractCommand)var25.next();
         if (var27.hasPermission(var1)) {
            var24.insert(
               Message.translation("server.commands.parsing.usage.subcommands")
                  .param("separator", Message.translation("server.commands.parsing.usage.subcommandSeparator"))
                  .param("usage", var27.getUsageString(var1))
            );
         }
      }

      Message var26 = Message.raw("");

      for (AbstractCommand var30 : this.subCommands.values()) {
         if (var30.hasPermission(var1)) {
            var26.insert(
               Message.translation("server.commands.parsing.usage.subcommands")
                  .param("separator", Message.translation("server.commands.parsing.usage.subcommandSeparator"))
                  .param("usage", var30.getUsageString(var1))
            );
         }
      }

      Message var29 = Message.raw("\nArgument Types:");
      HashSet var31 = new HashSet<>();

      for (RequiredArg var35 : this.requiredArguments) {
         var31.add(var35.getArgumentType());
      }

      for (AbstractOptionalArg var36 : this.optionalArguments.values()) {
         var31.add(var36.getArgumentType());
      }

      for (ArgumentType var37 : var31) {
         var29.insert("\n    ")
            .insert(var37.getName())
            .insert(": ")
            .insert(var37.getArgumentUsage())
            .insert("\n        Examples: ")
            .insert("'")
            .insert(String.join("', '", var37.getExamples()))
            .insert("'.");
      }

      class="kw">return Message.translation("server.commands.parsing.usage.header")
         .param("fullyQualifiedName", this.getFullyQualifiedName())
         .param("description", this.description != null ? Message.translation(this.description) : Message.empty())
         .param("listOfRequiredArgs", var2)
         .param("requiresConfirmation", var20)
         .param("requiredArgs", var21)
         .param("optionalArgs", var22)
         .param("defaultArgs", var8)
         .param("flagArgs", var10)
         .param("argTypes", var29)
         .param("variants", var24)
         .param("subcommands", var26);
   }

   @Nonnull
   class="kw">public Message getUsageShort(@Nonnull CommandSender var1, boolean var2) {
      String var3 = " ".repeat(this.countParents());
      if (this.subCommands.isEmpty() && this.variantCommands.isEmpty()) {
         String var9 = this.getFullyQualifiedName();
         Message var10 = Message.raw(var3).insert(var2 ? (var9 != null ? var9 : "???") : (this.name != null ? this.name : ""));

         for (RequiredArg var14 : this.requiredArguments) {
            var10.insert(" ").insert(var14.getUsageOneLiner().color("#C1E0FF"));
         }

         for (AbstractOptionalArg var15 : this.optionalArguments.values()) {
            if (var15.hasPermission(var1)) {
               var10.insert(" ").insert(var15.getUsageOneLiner().color("#7E9EBC"));
            }
         }

         class="kw">return var10;
      } else {
         String var4 = this.parentCommand == null ? "/" : var3;
         Message var5 = Message.raw(var4).insert(this.name);
         boolean var6 = false;
         ObjectIterator var7 = this.variantCommands.values().iterator();

         while (var7.hasNext()) {
            AbstractCommand var8 = (AbstractCommand)var7.next();
            if (var8.hasPermission(var1)) {
               var5.insert("\n ").insert(var3).insert(var8.getUsageShort(var1, var2));
               var6 = true;
            }
         }

         for (AbstractCommand var16 : this.subCommands.values()) {
            if (var16.hasPermission(var1)) {
               var5.insert("\n ").insert(var3).insert(var16.getUsageShort(var1, var2));
               var6 = true;
            }
         }

         if (!var6) {
            var5.insert("\n ").insert(MESSAGE_COMMANDS_HELP_NO_PERMISSIBLE_SUB_COMMAND);
         }

         class="kw">return var5;
      }
   }

   @Nonnull
   class="kw">private <R class="kw">extends RequiredArg<D>, D> R registerRequiredArg(@Nonnull R var1) {
      if (this.hasBeenRegistered) {
         throw new IllegalStateException("Cannot add new arguments when a command has already completed registration");
      }

      if (!var1.getCommandRegisteredTo().equals(this) || this.requiredArguments.contains(var1)) {
         throw new IllegalArgumentException("Cannot re-use arguments");
      }

      if (this.hasGreedyStringArg) {
         throw new IllegalStateException("Cannot register additional required arguments after a greedy string argument");
      }

      if (var1.getArgumentType().isGreedyString()) {
         this.hasGreedyStringArg = true;
         this.allowsExtraArguments = true;
      }

      this.totalNumRequiredParameters = this.totalNumRequiredParameters + var1.getArgumentType().getNumberOfParameters();
      this.requiredArguments.add(var1);
      class="kw">return var1;
   }

   @Nonnull
   class="kw">private <R class="kw">extends AbstractOptionalArg<?, D>, D> R registerOptionalArg(@Nonnull R var1) {
      if (this.hasBeenRegistered) {
         throw new IllegalStateException("Cannot add new arguments when a command has already completed registration");
      } else if (var1.getCommandRegisteredTo().equals(this) && !this.optionalArguments.containsKey(var1.getName().toLowerCase(Locale.ROOT))) {
         this.optionalArguments.put(var1.getName().toLowerCase(Locale.ROOT), var1);
         class="kw">return var1;
      } else {
         throw new IllegalArgumentException("Cannot re-use arguments");
      }
   }

   @Nonnull
   class="kw">public <D> RequiredArg<D> withRequiredArg(@Nonnull String var1, @Nonnull String var2, @Nonnull ArgumentType<D> var3) {
      class="kw">return this.registerRequiredArg(new RequiredArg<>(this, var1, var2, var3));
   }

   class="kw">public <W class="kw">extends WrappedArg<D>, D> W withRequiredArg(@Nonnull String var1, @Nonnull String var2, @Nonnull ArgWrapper<W, D> var3) {
      class="kw">return var3.wrapArg(this.registerRequiredArg(new RequiredArg<>(this, var1, var2, var3.argumentType())));
   }

   @Nonnull
   class="kw">public <D> RequiredArg<List<D>> withListRequiredArg(@Nonnull String var1, @Nonnull String var2, @Nonnull ArgumentType<D> var3) {
      class="kw">return this.registerRequiredArg(new RequiredArg<>(this, var1, var2, new ListArgumentType<>(var3)));
   }

   @Nonnull
   class="kw">public <D> DefaultArg<D> withDefaultArg(String var1, String var2, ArgumentType<D> var3, @Nullable D var4, String var5) {
      class="kw">return this.registerOptionalArg(new DefaultArg<>(this, var1, var2, var3, var4, var5));
   }

   class="kw">public <W class="kw">extends WrappedArg<D>, D> W withDefaultArg(
      @Nonnull String var1, @Nonnull String var2, @Nonnull ArgWrapper<W, D> var3, D var4, @Nonnull String var5
   ) {
      class="kw">return var3.wrapArg(this.registerOptionalArg(new DefaultArg<>(this, var1, var2, var3.argumentType(), var4, var5)));
   }

   @Nonnull
   class="kw">public <D> DefaultArg<List<D>> withListDefaultArg(
      @Nonnull String var1, @Nonnull String var2, @Nonnull ArgumentType<D> var3, List<D> var4, @Nonnull String var5
   ) {
      class="kw">return this.registerOptionalArg(new DefaultArg<>(this, var1, var2, new ListArgumentType<>(var3), var4, var5));
   }

   @Nonnull
   class="kw">public <D> OptionalArg<D> withOptionalArg(@Nonnull String var1, @Nonnull String var2, @Nonnull ArgumentType<D> var3) {
      class="kw">return this.registerOptionalArg(new OptionalArg<>(this, var1, var2, var3));
   }

   class="kw">public <W class="kw">extends WrappedArg<D>, D> W withOptionalArg(@Nonnull String var1, @Nonnull String var2, @Nonnull ArgWrapper<W, D> var3) {
      class="kw">return var3.wrapArg(this.registerOptionalArg(new OptionalArg<>(this, var1, var2, var3.argumentType())));
   }

   @Nonnull
   class="kw">public <D> OptionalArg<List<D>> withListOptionalArg(@Nonnull String var1, @Nonnull String var2, @Nonnull ArgumentType<D> var3) {
      class="kw">return this.registerOptionalArg(new OptionalArg<>(this, var1, var2, new ListArgumentType<>(var3)));
   }

   @Nonnull
   class="kw">public FlagArg withFlagArg(@Nonnull String var1, @Nonnull String var2) {
      class="kw">return this.registerOptionalArg(new FlagArg(this, var1, var2));
   }

   class="kw">public boolean isVariant() {
      class="kw">return this.name == null;
   }

   @Nullable
   class="kw">public String getName() {
      class="kw">return this.name;
   }

   @Nonnull
   class="kw">public Set<String> getAliases() {
      class="kw">return this.aliases;
   }

   @Nullable
   class="kw">public String getDescription() {
      class="kw">return this.description;
   }

   @Nullable
   class="kw">public CommandOwner getOwner() {
      class="kw">return this.owner;
   }

   @Nullable
   class="kw">public String getPermission() {
      class="kw">return this.permission == null ? null : this.permission.getId();
   }

   @Nonnull
   class="kw">public Map<String, AbstractCommand> getSubCommands() {
      class="kw">return this.subCommands;
   }

   @Nullable
   class="kw">public AbstractCommand getSubCommand(@Nonnull String var1) {
      String var2 = var1.toLowerCase(Locale.ROOT);
      AbstractCommand var3 = this.subCommands.get(var2);
      if (var3 != null) {
         class="kw">return var3;
      }

      String var4 = this.subCommandsAliases.get(var2);
      class="kw">return var4 != null ? this.subCommands.get(var4) : null;
   }

   @Nonnull
   class="kw">public List<RequiredArg<?>> getRequiredArguments() {
      class="kw">return this.requiredArguments;
   }

   @Nonnull
   class="kw">public Map<String, AbstractOptionalArg<?, ?>> getOptionalArguments() {
      class="kw">return this.optionalArguments;
   }

   @Nullable
   class="kw">public AbstractOptionalArg<?, ?> getOptionalArgument(@Nonnull String var1) {
      class="kw">return this.argumentAbbreviationMap == null ? null : this.argumentAbbreviationMap.get(var1.toLowerCase(Locale.ROOT));
   }

   @Nonnull
   class="kw">public Collection<AbstractCommand> getVariantCommands() {
      class="kw">return this.variantCommands.values();
   }

   @Nullable
   class="kw">public AbstractCommand getVariantByArgCount(int var1) {
      class="kw">return (AbstractCommand)this.variantCommands.get(var1);
   }

   @Nullable
   class="kw">public List<AbstractCommand.SuggestionOverrideEntry> getSuggestionOverrides() {
      List var1 = null;

      for (int var2 = 0; var2 < this.requiredArguments.size(); var2++) {
         ArgumentType var3 = this.requiredArguments.get(var2).getSuggestionOverrideType();
         if (var3 != null) {
            if (var1 == null) {
               var1 = new ArrayList<>();
            }

            var1.add(new AbstractCommand.SuggestionOverrideEntry(var2, var3.getNumberOfParameters(), var3));
         }
      }

      class="kw">return var1;
   }

   class="kw">public boolean hasBeenRegistered() {
      class="kw">return this.hasBeenRegistered;
   }

   class="kw">public record SuggestionOverrideEntry(int argStart, int argCount, @Nonnull ArgumentType<?> overrideType) {
      class="kw">public SuggestionOverrideEntry {
      }

      @Nonnull
      class="kw">public String argTypeId() {
         class="kw">return this.overrideType.getSuggestionTypeId();
      }
   }
}