CommandListPage class

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

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

extends: InteractiveCustomUIPage<CommandListPage.CommandListPageEventData>

Поля (119)

МодификаторыТипИмя
final Value<String> BUTTON_LABEL_STYLE
public static final BuilderCodec<CommandListPage.CommandListPageEventData> CODEC
public static final Comparator<CommandListPage.SearchResult> COMPARATOR
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
break
private String command
private MatchResult match
private final String name
private String navigateUp
return
return
return
return
return
return
private String searchQuery
private String sendToChat
private String subcommand
StringBuilder var1
UICommandBuilder var10
String var10
PlayerRef var10
AbstractCommand var10
PlayerRef var10
AbstractCommand var10
Field var10
UICommandBuilder var11
Map var11
String var11
AbstractCommand var11
int var11
Map var11
UIEventBuilder var12
CommandListPage.SearchResult var12
AbstractCommand var12
PlayerRef var12
String var12
Object var12
int var12
UIEventBuilder var13
AbstractCommand var13
PlayerRef var13
UIEventBuilder var14
MatchResult var14
var14
var14
Field var14
Map var14
Field var14
UIEventBuilder var15
Int2ObjectMap var15
String[] var16
Map var16
String var17
String[] var17
Field var18
Map var19
StringBuilder var2
StringBuilder var2
int var20
int var21
Player var3
Set var3
String var3
Message var3
UICommandBuilder var4
String var4
Field var4
boolean var4
var4
var4
HashSet var4
String var5
var5
UIEventBuilder var5
Map var5
Map var5
AbstractCommand var5
var5
Map var5
Field var5
String var5
Field var5
Field var5
int var6
AbstractCommand var6
var6
PlayerRef var6
AbstractCommand var6
AbstractCommand var6
var6
AbstractCommand var6
var6
int var6
Int2ObjectMap var6
List var6
ObjectArrayList var7
PlayerRef var7
int var7
int var7
UICommandBuilder var8
Map var8
int var8
var8
ObjectIterator var8
RequiredArg var8
UICommandBuilder var9
Map var9
Map var9
AbstractCommand var9
var9
it.unimi.dsi.fastutil.ints.Int2ObjectMap.Entry var9
int var9
private String variantIndex

Методы (59)

МодификаторыВозвратСигнатура
public CommandListPageEventDatapublic CommandListPageEventData()
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Unknown command: " + var2)
public SearchResultpublic SearchResult(String var1, MatchResult var2)
private void buildAliasesSectionvoid buildAliasesSection(@Nonnull AbstractCommand var1, @Nonnull UICommandBuilder var2)
private void buildArgumentTypesSectionvoid buildArgumentTypesSection(@Nonnull AbstractCommand var1, @Nonnull PlayerRef var2, @Nonnull UICommandBuilder var3)
private void buildCommandListvoid buildCommandList(@Nonnull Ref<EntityStore> var1, @Nonnull UICommandBuilder var2, @Nonnull UIEventBuilder var3, @Nonnull ComponentAccessor<EntityStore> var4)
private void buildParametersSectionvoid buildParametersSection(@Nonnull AbstractCommand var1, @Nonnull PlayerRef var2, @Nonnull UICommandBuilder var3)
private void buildPermissionSectionvoid buildPermissionSection(@Nonnull AbstractCommand var1, @Nonnull UICommandBuilder var2)
private void buildSubcommandTabsvoid buildSubcommandTabs(@Nonnull AbstractCommand var1, @Nonnull PlayerRef var2, @Nonnull UICommandBuilder var3, @Nonnull UIEventBuilder var4)
private void buildVariantsSectionvoid buildVariantsSection(@Nonnull AbstractCommand var1, @Nonnull PlayerRef var2, @Nonnull UICommandBuilder var3, @Nonnull UIEventBuilder var4)
private void displayCommandInfovoid displayCommandInfo(@Nonnull AbstractCommand var1, @Nonnull PlayerRef var2, @Nonnull UICommandBuilder var3, @Nonnull UIEventBuilder var4)
for for(String var3 : this.subcommandBreadcrumb)
for for(String var4 : this.subcommandBreadcrumb)
for for(int var18 = 0; var18 < var16.length; var18++)
for for(String var8 : this.subcommandBreadcrumb)
for for(String var8 : this.subcommandBreadcrumb)
for for(String var13 : this.subcommandBreadcrumb)
for for(String var7 : this.subcommandBreadcrumb)
for for(String var4 : this.subcommandBreadcrumb)
for for(String var4 : this.subcommandBreadcrumb)
for for(ArgumentType var15 : var4)
abstract for for(int var19 = 0; var19 < var7.size()
abstract for for(int var15 = 0; var15 < this.visibleCommands.size()
abstract for for(int var7 = 0; var7 < var6.size()
private Message getSimplifiedUsageMessage getSimplifiedUsage(@Nonnull AbstractCommand var1, @Nonnull PlayerRef var2)
public void handleDataEventvoid handleDataEvent(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, @Nonnull CommandListPage.CommandListPageEventData var3)
private void handleSendToChatvoid handleSendToChat(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2)
if if(var3.searchQuery != null)
if if(var3 != null)
if if(var6 != null)
if if(var6 == null)
if if(var6 != null)
if if(var13 != null)
if if(var6 == null)
if if(var6 != null)
if if(var6 == null)
if if(var10 != null)
if if(var12 != null)
if if(var6 != null)
if if(var6 == null)
if if(this.selectedVariantIndex != null)
if if(var9 != null)
if if(var9 == null)
if if(var5 != null)
if if(var5 == null)
if if(var8 == 0)
if if(var8 >= 3)
if if(var7 == 0)
if if(var12 instanceof OptionalArg var13)
if if(var10 instanceof OptionalArg)
if if(var17 != null && var17.length > 0)
private void navigateUpvoid navigateUp(@Nonnull Ref<EntityStore> var1, @Nonnull UICommandBuilder var2, @Nonnull UIEventBuilder var3, @Nonnull ComponentAccessor<EntityStore> var4)
private void selectCommandvoid selectCommand(@Nonnull Ref<EntityStore> var1, @Nonnull String var2, @Nonnull UICommandBuilder var3, @Nonnull UIEventBuilder var4, @Nonnull ComponentAccessor<EntityStore> var5)
private void selectSubcommandvoid selectSubcommand(@Nonnull Ref<EntityStore> var1, @Nonnull String var2, @Nonnull UICommandBuilder var3, @Nonnull UIEventBuilder var4, @Nonnull ComponentAccessor<EntityStore> var5)
private void selectVariantvoid selectVariant(@Nonnull Ref<EntityStore> var1, int var2, @Nonnull UICommandBuilder var3, @Nonnull UIEventBuilder var4, @Nonnull ComponentAccessor<EntityStore> var5)
abstract super super(var1, CustomPageLifetime.CanDismiss, CommandListPage.CommandListPageEventData.CODEC)
abstract this this(var1, null)
private void updateTitleWithBreadcrumbvoid updateTitleWithBreadcrumb(@Nonnull UICommandBuilder var1)
private void updateTitleWithVariantSuffixvoid updateTitleWithVariantSuffix(@Nonnull UICommandBuilder var1)

Исходный код

Показать/скрыть
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;
      }
   }
}