CommandListPageEventData class

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

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

Поля (13)

МодификаторыТипИмя
public static final BuilderCodec<CommandListPage.CommandListPageEventData> CODEC
static final String KEY_COMMAND
static final String KEY_NAVIGATE_UP
static final String KEY_SEARCH_QUERY
static final String KEY_SEND_TO_CHAT
static final String KEY_SUBCOMMAND
static final String KEY_VARIANT
private String command
private String navigateUp
private String searchQuery
private String sendToChat
private String subcommand
private String variantIndex

Исходный код

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

class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.protocol.packets.interface_.CustomPageLifetime;
class="kw">import com.hypixel.hytale.protocol.packets.interface_.CustomUIEventBindingType;
class="kw">import com.hypixel.hytale.protocol.packets.interface_.OpenChatWithCommand;
class="kw">import com.hypixel.hytale.protocol.packets.interface_.Page;
class="kw">import com.hypixel.hytale.server.core.Message;
class="kw">import com.hypixel.hytale.server.core.command.system.AbstractCommand;
class="kw">import com.hypixel.hytale.server.core.command.system.CommandManager;
class="kw">import com.hypixel.hytale.server.core.command.system.MatchResult;
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.types.ArgumentType;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.entity.entities.player.pages.InteractiveCustomUIPage;
class="kw">import com.hypixel.hytale.server.core.ui.Value;
class="kw">import com.hypixel.hytale.server.core.ui.builder.EventData;
class="kw">import com.hypixel.hytale.server.core.ui.builder.UICommandBuilder;
class="kw">import com.hypixel.hytale.server.core.ui.builder.UIEventBuilder;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
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.ObjectIterator;
class="kw">import java.lang.reflect.Field;
class="kw">import java.util.Collections;
class="kw">import java.util.Comparator;
class="kw">import java.util.HashSet;
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.Map.Entry;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class CommandListPage class="kw">extends InteractiveCustomUIPage<CommandListPage.CommandListPageEventData> {
   class="kw">private class="kw">static class="kw">final Value<String> BUTTON_LABEL_STYLE = Value.ref("Pages/BasicTextButton.ui", "LabelStyle");
   class="kw">private class="kw">static class="kw">final Value<String> BUTTON_LABEL_STYLE_SELECTED = Value.ref("Pages/BasicTextButton.ui", "SelectedLabelStyle");
   class="kw">private class="kw">final List<String> visibleCommands = new ObjectArrayList();
   @Nonnull
   class="kw">private String searchQuery = "";
   class="kw">private String selectedCommand;
   @Nullable
   class="kw">private String selectedSubcommand;
   @Nullable
   class="kw">private Integer selectedVariantIndex;
   class="kw">private class="kw">final List<String> subcommandBreadcrumb = new ObjectArrayList();
   @Nullable
   class="kw">private class="kw">final String initialCommand;

   class="kw">public CommandListPage(@Nonnull PlayerRef var1) {
      this(var1, null);
   }

   class="kw">public CommandListPage(@Nonnull PlayerRef var1, @Nullable String var2) {
      super(var1, CustomPageLifetime.CanDismiss, CommandListPage.CommandListPageEventData.CODEC);
      this.initialCommand = var2;
   }

   @Override
   class="kw">public void build(@Nonnull Ref<EntityStore> var1, @Nonnull UICommandBuilder var2, @Nonnull UIEventBuilder var3, @Nonnull Store<EntityStore> var4) {
      var2.append("Pages/CommandListPage.ui");
      var3.addEventBinding(CustomUIEventBindingType.ValueChanged, "#SearchInput", EventData.of("@SearchQuery", "#SearchInput.Value"), false);
      var3.addEventBinding(CustomUIEventBindingType.Activating, "#BackButton", EventData.of("NavigateUp", "true"));
      var3.addEventBinding(CustomUIEventBindingType.Activating, "#SendToChatButton", EventData.of("SendToChat", "true"));
      this.buildCommandList(var1, var2, var3, var4);
      String var5 = this.visibleCommands.getFirst();
      if (this.initialCommand != null && this.visibleCommands.contains(this.initialCommand)) {
         var5 = this.initialCommand;
      }

      this.selectCommand(var1, var5, var2, var3, var4);
   }

   class="kw">public void handleDataEvent(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, @Nonnull CommandListPage.CommandListPageEventData var3) {
      if (var3.searchQuery != null) {
         this.searchQuery = var3.searchQuery.trim().toLowerCase(Locale.ROOT);
         UICommandBuilder var4 = new UICommandBuilder();
         UIEventBuilder var5 = new UIEventBuilder();
         this.buildCommandList(var1, var4, var5, var2);
         this.sendUpdate(var4, var5, false);
      } else if (var3.command != null) {
         UICommandBuilder var8 = new UICommandBuilder();
         UIEventBuilder var12 = new UIEventBuilder();
         this.selectCommand(var1, var3.command, var8, var12, var2);
         this.sendUpdate(var8, var12, false);
      } else if (var3.navigateUp != null) {
         UICommandBuilder var9 = new UICommandBuilder();
         UIEventBuilder var13 = new UIEventBuilder();
         this.navigateUp(var1, var9, var13, var2);
         this.sendUpdate(var9, var13, false);
      } else if (var3.subcommand != null) {
         UICommandBuilder var10 = new UICommandBuilder();
         UIEventBuilder var14 = new UIEventBuilder();
         this.selectSubcommand(var1, var3.subcommand, var10, var14, var2);
         this.sendUpdate(var10, var14, false);
      } else if (var3.variantIndex != null) {
         UICommandBuilder var11 = new UICommandBuilder();
         UIEventBuilder var15 = new UIEventBuilder();

         try {
            int var6 = Integer.parseInt(var3.variantIndex);
            this.selectVariant(var1, var6, var11, var15, var2);
            this.sendUpdate(var11, var15, false);
         } catch (NumberFormatException var7) {
         }
      } else if (var3.sendToChat != null) {
         this.handleSendToChat(var1, var2);
      }
   }

   class="kw">private void handleSendToChat(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2) {
      Player var3 = var2.getComponent(var1, Player.getComponentType());
      if (var3 != null) {
         String var4 = this.buildCurrentCommandString();
         var3.getPageManager().setPage(var1, var2, Page.None);
         this.playerRef.getPacketHandler().write(new OpenChatWithCommand(var4));
      }
   }

   @Nonnull
   class="kw">private String buildCurrentCommandString() {
      StringBuilder var1 = new StringBuilder("/");
      var1.append(this.selectedCommand);

      for (String var3 : this.subcommandBreadcrumb) {
         var1.append(" ").append(var3);
      }

      AbstractCommand var6 = CommandManager.get().getCommandRegistration().get(this.selectedCommand);
      if (var6 != null) {
         for (String var4 : this.subcommandBreadcrumb) {
            Map var5 = var6.getSubCommands();
            var6 = var5.get(var4);
            if (var6 == null) {
               break;
            }
         }

         if (var6 != null) {
            for (RequiredArg var9 : var6.getRequiredArguments()) {
               var1.append(" <").append(var9.getName()).append(">");
            }
         }
      }

      class="kw">return var1.toString();
   }

   class="kw">private void buildCommandList(
      @Nonnull Ref<EntityStore> var1, @Nonnull UICommandBuilder var2, @Nonnull UIEventBuilder var3, @Nonnull ComponentAccessor<EntityStore> var4
   ) {
      var2.clear("#CommandList");
      Map var5 = new Object2ObjectOpenHashMap(CommandManager.get().getCommandRegistration());
      PlayerRef var6 = var4.getComponent(var1, PlayerRef.getComponentType());
      assert var6 != null;
      var5.values().removeIf(var1x -> !var1x.hasPermission(var6));
      if (this.searchQuery.isEmpty()) {
         this.visibleCommands.clear();
         this.visibleCommands.addAll(var5.keySet());
         Collections.sort(this.visibleCommands);
      } else {
         ObjectArrayList var7 = new ObjectArrayList();

         for (Entry var9 : var5.entrySet()) {
            if (var9.getValue() != null) {
               var7.add(new CommandListPage.SearchResult(var9.getKey(), MatchResult.EXACT));
            }
         }

         String[] var16 = this.searchQuery.split(" ", 0);

         for (int var18 = 0; var18 < var16.length; var18++) {
            String var10 = var16[var18];

            for (int var11 = var7.size() - 1; var11 >= 0; var11--) {
               CommandListPage.SearchResult var12 = (CommandListPage.SearchResult)var7.get(var11);
               AbstractCommand var13 = var5.get(var12.name);
               MatchResult var14;
               if (var13 != null) {
                  var14 = var13.matches(this.playerRef.getLanguage(), var10, var18);
               } else {
                  var14 = MatchResult.NONE;
               }

               if (var14.equals(MatchResult.NONE)) {
                  var7.remove(var11);
               } else {
                  var12.match = var12.match.min(var14);
               }
            }
         }

         var7.sort(CommandListPage.SearchResult.COMPARATOR);
         this.visibleCommands.clear();

         for (int var19 = 0; var19 < var7.size(); var19++) {
            this.visibleCommands.add(((CommandListPage.SearchResult)var7.get(var19)).name);
         }
      }

      for (int var15 = 0; var15 < this.visibleCommands.size(); var15++) {
         String var17 = this.visibleCommands.get(var15);
         var2.append("#CommandList", "Pages/BasicTextButton.ui");
         var2.set("#CommandList[" + var15 + "].TextSpans", Message.raw(var17));
         var3.addEventBinding(CustomUIEventBindingType.Activating, "#CommandList[" + var15 + "]", EventData.of("Command", var17));
         if (var17.equals(this.selectedCommand)) {
            var2.set("#CommandList[" + var15 + "].Style", BUTTON_LABEL_STYLE_SELECTED);
         }
      }
   }

   class="kw">private void selectCommand(
      @Nonnull Ref<EntityStore> var1,
      @Nonnull String var2,
      @Nonnull UICommandBuilder var3,
      @Nonnull UIEventBuilder var4,
      @Nonnull ComponentAccessor<EntityStore> var5
   ) {
      AbstractCommand var6 = CommandManager.get().getCommandRegistration().get(var2);
      if (var6 == null) {
         throw new IllegalArgumentException("Unknown command: " + var2);
      }

      var3.set("#CommandName.TextSpans", Message.raw(var2));
      PlayerRef var7 = var5.getComponent(var1, PlayerRef.getComponentType());
      this.selectedSubcommand = null;
      this.selectedVariantIndex = null;
      this.subcommandBreadcrumb.clear();
      this.buildSubcommandTabs(var6, var7, var3, var4);
      this.displayCommandInfo(var6, var7, var3, var4);
      if (this.selectedCommand != null && this.visibleCommands.contains(this.selectedCommand)) {
         var3.set("#CommandList[" + this.visibleCommands.indexOf(this.selectedCommand) + "].Style", BUTTON_LABEL_STYLE);
      }

      var3.set("#CommandList[" + this.visibleCommands.indexOf(var2) + "].Style", BUTTON_LABEL_STYLE_SELECTED);
      this.selectedCommand = var2;
   }

   class="kw">private void selectSubcommand(
      @Nonnull Ref<EntityStore> var1,
      @Nonnull String var2,
      @Nonnull UICommandBuilder var3,
      @Nonnull UIEventBuilder var4,
      @Nonnull ComponentAccessor<EntityStore> var5
   ) {
      AbstractCommand var6 = CommandManager.get().getCommandRegistration().get(this.selectedCommand);
      if (var6 != null) {
         for (String var8 : this.subcommandBreadcrumb) {
            Map var9 = var6.getSubCommands();
            var6 = var9.get(var8);
            if (var6 == null) {
               class="kw">return;
            }
         }

         PlayerRef var10 = var5.getComponent(var1, PlayerRef.getComponentType());
         if (var10 != null) {
            Map var11 = var6.getSubCommands();
            AbstractCommand var12 = var11.get(var2);
            if (var12 != null) {
               this.subcommandBreadcrumb.add(var2);
               this.selectedSubcommand = var2;
               this.selectedVariantIndex = null;
               this.updateTitleWithBreadcrumb(var3);
               this.buildSubcommandTabs(var12, var10, var3, var4);
               var3.set("#BackButton.Visible", true);
               this.displayCommandInfo(var12, var10, var3, var4);
            }
         }
      }
   }

   class="kw">private void selectVariant(
      @Nonnull Ref<EntityStore> var1, int var2, @Nonnull UICommandBuilder var3, @Nonnull UIEventBuilder var4, @Nonnull ComponentAccessor<EntityStore> var5
   ) {
      AbstractCommand var6 = CommandManager.get().getCommandRegistration().get(this.selectedCommand);
      if (var6 != null) {
         for (String var8 : this.subcommandBreadcrumb) {
            Map var9 = var6.getSubCommands();
            var6 = var9.get(var8);
            if (var6 == null) {
               class="kw">return;
            }
         }

         PlayerRef var13 = var5.getComponent(var1, PlayerRef.getComponentType());

         try {
            Field var14 = AbstractCommand.class.getDeclaredField("variantCommands");
            var14.setAccessible(true);
            Int2ObjectMap var15 = (Int2ObjectMap<AbstractCommand>)var14.get(var6);
            AbstractCommand var10 = (AbstractCommand)var15.get(var2);
            if (var10 == null || !var10.hasPermission(var13)) {
               class="kw">return;
            }

            this.selectedVariantIndex = var2;
            this.updateTitleWithVariantSuffix(var3);
            var3.set("#VariantsSection.Visible", false);
            var3.set("#BackButton.Visible", true);
            String var11 = var10.getDescription();
            var3.set("#CommandDescription.TextSpans", var11 != null ? Message.translation(var11) : Message.empty());
            var3.set("#CommandUsageLabel.TextSpans", this.getSimplifiedUsage(var10, var13));
            this.buildParametersSection(var10, var13, var3);
            this.buildArgumentTypesSection(var10, var13, var3);
         } catch (Exception var12) {
         }
      }
   }

   class="kw">private void navigateUp(
      @Nonnull Ref<EntityStore> var1, @Nonnull UICommandBuilder var2, @Nonnull UIEventBuilder var3, @Nonnull ComponentAccessor<EntityStore> var4
   ) {
      if (this.selectedVariantIndex != null) {
         this.selectedVariantIndex = null;
         AbstractCommand var9 = CommandManager.get().getCommandRegistration().get(this.selectedCommand);
         if (var9 != null) {
            for (String var13 : this.subcommandBreadcrumb) {
               Map var14 = var9.getSubCommands();
               var9 = var14.get(var13);
               if (var9 == null) {
                  class="kw">return;
               }
            }

            PlayerRef var12 = var4.getComponent(var1, PlayerRef.getComponentType());
            this.updateTitleWithBreadcrumb(var2);
            this.displayCommandInfo(var9, var12, var2, var3);
            var2.set("#BackButton.Visible", !this.subcommandBreadcrumb.isEmpty());
         }
      } else if (!this.subcommandBreadcrumb.isEmpty()) {
         this.subcommandBreadcrumb.remove(this.subcommandBreadcrumb.size() - 1);
         AbstractCommand var5 = CommandManager.get().getCommandRegistration().get(this.selectedCommand);
         if (var5 != null) {
            for (String var7 : this.subcommandBreadcrumb) {
               Map var8 = var5.getSubCommands();
               var5 = var8.get(var7);
               if (var5 == null) {
                  class="kw">return;
               }
            }

            PlayerRef var10 = var4.getComponent(var1, PlayerRef.getComponentType());
            this.selectedSubcommand = this.subcommandBreadcrumb.isEmpty() ? null : this.subcommandBreadcrumb.get(this.subcommandBreadcrumb.size() - 1);
            this.updateTitleWithBreadcrumb(var2);
            this.buildSubcommandTabs(var5, var10, var2, var3);
            this.displayCommandInfo(var5, var10, var2, var3);
         }
      }
   }

   class="kw">private void buildSubcommandTabs(@Nonnull AbstractCommand var1, @Nonnull PlayerRef var2, @Nonnull UICommandBuilder var3, @Nonnull UIEventBuilder var4) {
      var3.clear("#SubcommandCards");
      Map var5 = var1.getSubCommands();
      if (var5.isEmpty()) {
         var3.set("#SubcommandSection.Visible", false);
      } else {
         var3.set("#SubcommandSection.Visible", true);
         int var6 = 0;
         int var7 = 0;
         int var8 = 0;

         for (Entry var10 : var5.entrySet()) {
            AbstractCommand var11 = var10.getValue();
            if (var11.hasPermission(var2)) {
               if (var8 == 0) {
                  var3.appendInline("#SubcommandCards", "Group { LayoutMode: Left; Anchor: (Bottom: 0); }");
               }

               var3.append("#SubcommandCards[" + var7 + "]", "Pages/SubcommandCard.ui");
               String var12 = var11.getDescription();
               var3.set("#SubcommandCards[" + var7 + "][" + var8 + "] #SubcommandName.TextSpans", Message.raw(var10.getKey()));
               var3.set("#SubcommandCards[" + var7 + "][" + var8 + "] #SubcommandUsage.TextSpans", this.getSimplifiedUsage(var11, var2));
               var3.set(
                  "#SubcommandCards[" + var7 + "][" + var8 + "] #SubcommandDescription.TextSpans", var12 != null ? Message.translation(var12) : Message.empty()
               );
               var4.addEventBinding(
                  CustomUIEventBindingType.Activating, "#SubcommandCards[" + var7 + "][" + var8 + "]", EventData.of("Subcommand", var10.getKey())
               );
               var8++;
               var6++;
               if (var8 >= 3) {
                  var8 = 0;
                  var7++;
               }
            }
         }
      }

      var3.set("#BackButton.Visible", !this.subcommandBreadcrumb.isEmpty());
   }

   class="kw">private void updateTitleWithBreadcrumb(@Nonnull UICommandBuilder var1) {
      StringBuilder var2 = new StringBuilder(this.selectedCommand);

      for (String var4 : this.subcommandBreadcrumb) {
         var2.append(" > ").append(var4);
      }

      var1.set("#CommandName.TextSpans", Message.raw(var2.toString()));
   }

   class="kw">private void updateTitleWithVariantSuffix(@Nonnull UICommandBuilder var1) {
      StringBuilder var2 = new StringBuilder(this.selectedCommand);

      for (String var4 : this.subcommandBreadcrumb) {
         var2.append(" > ").append(var4);
      }

      var1.set("#CommandName.TextSpans", Message.raw(var2.toString()).insert(" ").insert(Message.translation("server.customUI.commandListPage.variantSuffix")));
   }

   class="kw">private void buildAliasesSection(@Nonnull AbstractCommand var1, @Nonnull UICommandBuilder var2) {
      Set var3 = var1.getAliases();
      if (var3 != null && !var3.isEmpty()) {
         var2.set("#AliasesSection.Visible", true);
         var2.set("#AliasesList.TextSpans", Message.raw(String.join(", ", var3)));
      } else {
         var2.set("#AliasesSection.Visible", false);
      }
   }

   class="kw">private void buildPermissionSection(@Nonnull AbstractCommand var1, @Nonnull UICommandBuilder var2) {
      String var3 = var1.getPermission();
      if (var3 != null && !var3.isEmpty()) {
         var2.set("#PermissionSection.Visible", true);
         var2.set("#PermissionLabel.TextSpans", Message.raw(var3));
      } else {
         var2.set("#PermissionSection.Visible", false);
      }
   }

   class="kw">private void buildVariantsSection(@Nonnull AbstractCommand var1, @Nonnull PlayerRef var2, @Nonnull UICommandBuilder var3, @Nonnull UIEventBuilder var4) {
      var3.clear("#VariantsList");

      try {
         Field var5 = AbstractCommand.class.getDeclaredField("variantCommands");
         var5.setAccessible(true);
         Int2ObjectMap var6 = (Int2ObjectMap<AbstractCommand>)var5.get(var1);
         if (var6.isEmpty()) {
            var3.set("#VariantsSection.Visible", false);
            class="kw">return;
         }

         var3.set("#VariantsSection.Visible", true);
         int var7 = 0;
         ObjectIterator var8 = var6.int2ObjectEntrySet().iterator();

         while (var8.hasNext()) {
            it.unimi.dsi.fastutil.ints.Int2ObjectMap.Entry var9 = (it.unimi.dsi.fastutil.ints.Int2ObjectMap.Entry<AbstractCommand>)var8.next();
            AbstractCommand var10 = (AbstractCommand)var9.getValue();
            int var11 = var9.getIntKey();
            if (var10.hasPermission(var2)) {
               var3.append("#VariantsList", "Pages/VariantCard.ui");
               var3.set("#VariantsList[" + var7 + "] #VariantUsage.TextSpans", this.getSimplifiedUsage(var10, var2));
               var4.addEventBinding(CustomUIEventBindingType.Activating, "#VariantsList[" + var7 + "]", EventData.of("Variant", String.valueOf(var11)));
               var7++;
            }
         }

         if (var7 == 0) {
            var3.set("#VariantsSection.Visible", false);
         }
      } catch (Exception var12) {
         var3.set("#VariantsSection.Visible", false);
      }
   }

   class="kw">private void displayCommandInfo(@Nonnull AbstractCommand var1, @Nonnull PlayerRef var2, @Nonnull UICommandBuilder var3, @Nonnull UIEventBuilder var4) {
      String var5 = var1.getDescription();
      var3.set("#CommandDescription.TextSpans", var5 != null ? Message.translation(var5) : Message.empty());
      this.buildVariantsSection(var1, var2, var3, var4);
      this.buildAliasesSection(var1, var3);
      this.buildPermissionSection(var1, var3);
      var3.set("#CommandUsageLabel.TextSpans", this.getSimplifiedUsage(var1, var2));
      this.buildParametersSection(var1, var2, var3);
      this.buildArgumentTypesSection(var1, var2, var3);
   }

   class="kw">private Message getSimplifiedUsage(@Nonnull AbstractCommand var1, @Nonnull PlayerRef var2) {
      Message var3 = Message.raw("/").insert(var1.getFullyQualifiedName());

      try {
         Field var4 = AbstractCommand.class.getDeclaredField("requiredArguments");
         var4.setAccessible(true);

         for (RequiredArg var7 : (List)var4.get(var1)) {
            var3.insert(" <").insert(Message.translation(var7.getName())).insert(">");
         }
      } catch (Exception var9) {
      }

      try {
         Field var10 = AbstractCommand.class.getDeclaredField("optionalArguments");
         var10.setAccessible(true);
         Map var11 = (Map<String, ?>)var10.get(var1);
         if (!var11.isEmpty()) {
            var3.insert(" [").insert(Message.translation("server.customUI.commandListPage.optionsIndicator")).insert("]");
         }
      } catch (Exception var8) {
      }

      class="kw">return var3;
   }

   class="kw">private void buildParametersSection(@Nonnull AbstractCommand var1, @Nonnull PlayerRef var2, @Nonnull UICommandBuilder var3) {
      var3.clear("#RequiredArgumentsList");
      var3.clear("#OptionalArgumentsList");
      var3.clear("#DefaultArgumentsList");
      var3.clear("#FlagArgumentsList");
      boolean var4 = false;

      try {
         Field var5 = AbstractCommand.class.getDeclaredField("requiredArguments");
         var5.setAccessible(true);
         List var6 = (List<RequiredArg<?>>)var5.get(var1);
         if (!var6.isEmpty()) {
            var4 = true;

            for (int var7 = 0; var7 < var6.size(); var7++) {
               RequiredArg var8 = var6.get(var7);
               var3.append("#RequiredArgumentsList", "Pages/ParameterItem.ui");
               var3.set("#RequiredArgumentsList[" + var7 + "] #ParamName.TextSpans", Message.raw(var8.getName()));
               var3.set("#RequiredArgumentsList[" + var7 + "] #ParamTag.TextSpans", Message.translation("server.customUI.commandListPage.required"));
               var3.set(
                  "#RequiredArgumentsList[" + var7 + "] #ParamType.TextSpans",
                  Message.translation("server.customUI.commandListPage.paramType").param("type", var8.getArgumentType().getName())
               );
               var3.set(
                  "#RequiredArgumentsList[" + var7 + "] #ParamDescription.TextSpans",
                  var8.getDescription() != null
                     ? Message.translation(var8.getDescription())
                     : Message.translation("server.customUI.commandListPage.noDescription")
               );
            }
         }
      } catch (Exception var17) {
      }

      try {
         Field var18 = AbstractCommand.class.getDeclaredField("optionalArguments");
         var18.setAccessible(true);
         Map var19 = (Map<String, ?>)var18.get(var1);
         if (!var19.isEmpty()) {
            var4 = true;
         }

         int var20 = 0;
         int var21 = 0;
         int var9 = 0;

         for (Entry var11 : var19.entrySet()) {
            Object var12 = var11.getValue();
            if (var12 class="kw">instanceof OptionalArg var13) {
               if (var13.hasPermission(var2)) {
                  var3.append("#OptionalArgumentsList", "Pages/ParameterItem.ui");
                  var3.set("#OptionalArgumentsList[" + var20 + "] #ParamName.TextSpans", Message.raw("--" + var13.getName() + " <" + var13.getName() + ">"));
                  var3.set("#OptionalArgumentsList[" + var20 + "] #ParamTag.TextSpans", Message.translation("server.customUI.commandListPage.optional"));
                  var3.set(
                     "#OptionalArgumentsList[" + var20 + "] #ParamType.TextSpans",
                     Message.translation("server.customUI.commandListPage.paramType").param("type", var13.getArgumentType().getName())
                  );
                  var3.set(
                     "#OptionalArgumentsList[" + var20 + "] #ParamDescription.TextSpans",
                     var13.getDescription() != null
                        ? Message.translation(var13.getDescription())
                        : Message.translation("server.customUI.commandListPage.noDescription")
                  );
                  var20++;
               }
            } else if (var12 class="kw">instanceof DefaultArg var14) {
               if (var14.hasPermission(var2)) {
                  var3.append("#DefaultArgumentsList", "Pages/ParameterItem.ui");
                  var3.set("#DefaultArgumentsList[" + var21 + "] #ParamName.TextSpans", Message.raw("--" + var14.getName() + " <" + var14.getName() + ">"));
                  var3.set("#DefaultArgumentsList[" + var21 + "] #ParamTag.TextSpans", Message.translation("server.customUI.commandListPage.class="kw">default"));
                  var3.set(
                     "#DefaultArgumentsList[" + var21 + "] #ParamType.TextSpans",
                     Message.translation("server.customUI.commandListPage.paramTypeDefault")
                        .param("type", var14.getArgumentType().getName())
                        .param("class="kw">default", Message.translation(var14.getDefaultValueDescription()))
                  );
                  var3.set(
                     "#DefaultArgumentsList[" + var21 + "] #ParamDescription.TextSpans",
                     var14.getDescription() != null
                        ? Message.translation(var14.getDescription())
                        : Message.translation("server.customUI.commandListPage.noDescription")
                  );
                  var21++;
               }
            } else if (var12 class="kw">instanceof FlagArg var15 && var15.hasPermission(var2)) {
               var3.append("#FlagArgumentsList", "Pages/ParameterItem.ui");
               var3.set("#FlagArgumentsList[" + var9 + "] #ParamName.TextSpans", Message.raw("--" + var15.getName()));
               var3.set("#FlagArgumentsList[" + var9 + "] #ParamTag.TextSpans", Message.translation("server.customUI.commandListPage.flag"));
               var3.set("#FlagArgumentsList[" + var9 + "] #ParamType.TextSpans", Message.translation("server.customUI.commandListPage.paramTypeFlag"));
               var3.set(
                  "#FlagArgumentsList[" + var9 + "] #ParamDescription.TextSpans",
                  var15.getDescription() != null
                     ? Message.translation(var15.getDescription())
                     : Message.translation("server.customUI.commandListPage.noDescription")
               );
               var9++;
            }
         }
      } catch (Exception var16) {
      }

      var3.set("#ParametersSection.Visible", var4);
   }

   class="kw">private void buildArgumentTypesSection(@Nonnull AbstractCommand var1, @Nonnull PlayerRef var2, @Nonnull UICommandBuilder var3) {
      var3.clear("#ArgumentTypesList");
      HashSet var4 = new HashSet<>();

      try {
         Field var5 = AbstractCommand.class.getDeclaredField("requiredArguments");
         var5.setAccessible(true);

         for (RequiredArg var8 : (List)var5.get(var1)) {
            var4.add(var8.getArgumentType());
         }

         Field var14 = AbstractCommand.class.getDeclaredField("optionalArguments");
         var14.setAccessible(true);
         Map var16 = (Map<String, ?>)var14.get(var1);

         for (Object var10 : var16.values()) {
            if (var10 class="kw">instanceof OptionalArg) {
               var4.add(((OptionalArg)var10).getArgumentType());
            } else if (var10 class="kw">instanceof DefaultArg) {
               var4.add(((DefaultArg)var10).getArgumentType());
            }
         }
      } catch (Exception var11) {
      }

      if (var4.isEmpty()) {
         var3.set("#ArgumentTypesSection.Visible", false);
      } else {
         var3.set("#ArgumentTypesSection.Visible", true);
         int var12 = 0;

         for (ArgumentType var15 : var4) {
            var3.append("#ArgumentTypesList", "Pages/ArgumentTypeItem.ui");
            var3.set("#ArgumentTypesList[" + var12 + "] #TypeName.TextSpans", var15.getName());
            var3.set("#ArgumentTypesList[" + var12 + "] #TypeDescription.TextSpans", var15.getArgumentUsage());
            String[] var17 = var15.getExamples();
            if (var17 != null && var17.length > 0) {
               var3.set(
                  "#ArgumentTypesList[" + var12 + "] #TypeExamples.TextSpans",
                  Message.translation("server.customUI.commandListPage.examples").param("examples", String.join("', '", var17))
               );
            } else {
               var3.set("#ArgumentTypesList[" + var12 + "] #TypeExamples.Visible", false);
            }

            var12++;
         }
      }
   }

   class="kw">public class="kw">static class CommandListPageEventData {
      class="kw">static class="kw">final String KEY_COMMAND = "Command";
      class="kw">static class="kw">final String KEY_SUBCOMMAND = "Subcommand";
      class="kw">static class="kw">final String KEY_SEARCH_QUERY = "@SearchQuery";
      class="kw">static class="kw">final String KEY_NAVIGATE_UP = "NavigateUp";
      class="kw">static class="kw">final String KEY_VARIANT = "Variant";
      class="kw">static class="kw">final String KEY_SEND_TO_CHAT = "SendToChat";
      class="kw">public class="kw">static class="kw">final BuilderCodec<CommandListPage.CommandListPageEventData> CODEC = BuilderCodec.builder(
            CommandListPage.CommandListPageEventData.class, CommandListPage.CommandListPageEventData::new
         )
         .addField(new KeyedCodec<>("Command", Codec.STRING), (var0, var1) -> var0.command = var1, var0 -> var0.command)
         .addField(new KeyedCodec<>("Subcommand", Codec.STRING), (var0, var1) -> var0.subcommand = var1, var0 -> var0.subcommand)
         .addField(new KeyedCodec<>("@SearchQuery", Codec.STRING), (var0, var1) -> var0.searchQuery = var1, var0 -> var0.searchQuery)
         .addField(new KeyedCodec<>("NavigateUp", Codec.STRING), (var0, var1) -> var0.navigateUp = var1, var0 -> var0.navigateUp)
         .addField(new KeyedCodec<>("Variant", Codec.STRING), (var0, var1) -> var0.variantIndex = var1, var0 -> var0.variantIndex)
         .addField(new KeyedCodec<>("SendToChat", Codec.STRING), (var0, var1) -> var0.sendToChat = var1, var0 -> var0.sendToChat)
         .build();
      class="kw">private String command;
      class="kw">private String subcommand;
      class="kw">private String searchQuery;
      class="kw">private String navigateUp;
      class="kw">private String variantIndex;
      class="kw">private String sendToChat;

      class="kw">public CommandListPageEventData() {
      }
   }

   class="kw">private class="kw">static class SearchResult {
      class="kw">public class="kw">static class="kw">final Comparator<CommandListPage.SearchResult> COMPARATOR = Comparator.comparing(var0 -> var0.match);
      class="kw">private class="kw">final String name;
      class="kw">private MatchResult match;

      class="kw">public SearchResult(String var1, MatchResult var2) {
         this.name = var1;
         this.match = var2;
      }
   }
}