AssetPackSaveBrowser class

Пакет: com.hypixel.hytale.server.core.ui.browser

Файл: com/hypixel/hytale/server/core/ui/browser/AssetPackSaveBrowser.java

Поля (65)

МодификаторыТипИмя
final HytaleLogger LOGGER
continue
continue
ObjectArrayList var1
List var1
AssetPack var1
List var1
Map var1
PluginManifest var1
UICommandBuilder var10
String var10
String var10
UICommandBuilder var11
Path var11
Comparator var11
UIEventBuilder var12
List var12
UICommandBuilder var13
Path var13
AssetPackSaveBrowser.CreatePackResult var14
String var14
AssetPackSaveBrowser.PackEntry var14
UICommandBuilder var15
UICommandBuilder var16
UICommandBuilder var17
UICommandBuilder var18
UICommandBuilder var19
Path var2
List var2
List var2
AssetPack var2
String var2
String var2
List var2
UIEventBuilder var20
ObjectArrayList var3
ObjectArrayList var3
List var3
String var3
HytaleServerConfig var3
String var3
boolean var3
var3
int var4
PluginManifest var4
String var4
boolean var4
AuthorInfo var5
AssetPackSaveBrowser.PackEntry var5
UICommandBuilder var6
String var6
String var6
String var7
UIEventBuilder var7
Path var7
Path var7
boolean var7
UIEventBuilder var8
var8
Path var8
int var8
String var9
var9
Path var9
String var9

Методы (40)

МодификаторыВозвратСигнатура
public record ActionResultrecord ActionResult(@Nonnull UICommandBuilder commandBuilder, @Nullable UIEventBuilder eventBuilder, @Nullable String errorKey, boolean packConfirmed)
public record CreatePackResultrecord CreatePackResult(boolean success, @Nullable String errorKey)
public record ModsDirectoryrecord ModsDirectory(@Nonnull String langKey, @Nonnull String filterLangKey, @Nonnull Path path)
private record PackEntryrecord PackEntry(@Nonnull String key, @Nonnull String displayName, boolean immutable)
private record PendingPackrecord PendingPack(@Nonnull String key, @Nonnull String displayName)
public void buildCreateFormValidationvoid buildCreateFormValidation(@Nonnull UICommandBuilder var1, @Nullable String var2, @Nullable String var3)
public void buildEventBindingsvoid buildEventBindings(@Nonnull UIEventBuilder var1, @Nonnull String var2)
public void buildPackListvoid buildPackList(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2)
private void buildSearchInputvoid buildSearchInput(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2)
public void buildUIvoid buildUI(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2)
public boolean checkDuplicatePackboolean checkDuplicatePack(@Nullable String var1, @Nullable String var2)
private List<AssetPackSaveBrowser.PackEntry> collectPackEntriesList<AssetPackSaveBrowser.PackEntry> collectPackEntries()
static void disambiguateDisplayNamesvoid disambiguateDisplayNames(@Nonnull List<AssetPackSaveBrowser.PackEntry> var0)
abstract disambiguateDisplayNames disambiguateDisplayNames(var1)
abstract disambiguateDisplayNames disambiguateDisplayNames(var2)
for for(AssetPackSaveBrowser.ModsDirectory var5 : var2)
for for(AssetPackSaveBrowser.ModsDirectory var5 : var2)
for for(AssetPackSaveBrowser.PackEntry var6 : var3)
for for(AssetPackSaveBrowser.PackEntry var3 : var0)
abstract for for(int var4 = 0; var4 < var0.size()
public boolean handleEventboolean handleEvent(@Nonnull AssetPackSaveBrowserEventData var1)
public boolean hasSelectedPackboolean hasSelectedPack()
if if(Constants.SINGLEPLAYER)
if if(Constants.SINGLEPLAYER)
if if(var1 == null)
if if(var6.immutable)
if if(!var6.immutable)
if if(var1 == null)
if if(this.selectedPackKey == null)
if if(var1 == null)
if if(var7 == null)
if if(var8 == null)
if if(var4)
if if(var8 <= 0)
if if(var7)
if if(var3)
private void populateDirectoryFilterDropdownvoid populateDirectoryFilterDropdown(@Nonnull UICommandBuilder var1)
private void populateTargetDirectoryDropdownvoid populateTargetDirectoryDropdown(@Nonnull UICommandBuilder var1)
public void setSelectedPackKeyvoid setSelectedPackKey(@Nullable String var1)
return switchreturn switch(var1)

Исходный код

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

class="kw">import com.hypixel.hytale.assetstore.AssetPack;
class="kw">import com.hypixel.hytale.common.plugin.AuthorInfo;
class="kw">import com.hypixel.hytale.common.plugin.PluginIdentifier;
class="kw">import com.hypixel.hytale.common.plugin.PluginManifest;
class="kw">import com.hypixel.hytale.common.semver.Semver;
class="kw">import com.hypixel.hytale.common.util.PathUtil;
class="kw">import com.hypixel.hytale.common.util.StringCompareUtil;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.protocol.packets.interface_.CustomUIEventBindingType;
class="kw">import com.hypixel.hytale.server.core.Constants;
class="kw">import com.hypixel.hytale.server.core.HytaleServer;
class="kw">import com.hypixel.hytale.server.core.HytaleServerConfig;
class="kw">import com.hypixel.hytale.server.core.Message;
class="kw">import com.hypixel.hytale.server.core.Options;
class="kw">import com.hypixel.hytale.server.core.asset.AssetModule;
class="kw">import com.hypixel.hytale.server.core.plugin.PluginManager;
class="kw">import com.hypixel.hytale.server.core.ui.DropdownEntryInfo;
class="kw">import com.hypixel.hytale.server.core.ui.LocalizableString;
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.util.BsonUtil;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.io.IOException;
class="kw">import java.nio.file.Files;
class="kw">import java.nio.file.Path;
class="kw">import java.util.Comparator;
class="kw">import java.util.HashMap;
class="kw">import java.util.List;
class="kw">import java.util.Locale;
class="kw">import java.util.Map;
class="kw">import java.util.regex.Pattern;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class AssetPackSaveBrowser {
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">private class="kw">static class="kw">final Value<String> BUTTON_SELECTED = Value.ref("Pages/BasicTextButton.ui", "SelectedLabelStyle");
   class="kw">private class="kw">static class="kw">final Value<String> TOOLTIP_STYLE = Value.ref("Common.ui", "DefaultTextTooltipStyle");
   class="kw">private class="kw">static class="kw">final Pattern INVALID_FILENAME_CHARS = Pattern.compile("[<>:\"/\\\\|?*\\x00-\\x1F]");
   class="kw">private class="kw">static class="kw">final String DIRECTORY_FILTER_ALL = "";
   @Nonnull
   class="kw">private class="kw">final AssetPackSaveBrowserConfig config;
   @Nonnull
   class="kw">private String searchQuery = "";
   @Nullable
   class="kw">private String selectedPackKey;
   @Nullable
   class="kw">private AssetPackSaveBrowser.PendingPack pendingPack;
   @Nonnull
   class="kw">private String selectedDirectoryFilter = "";
   class="kw">public class="kw">static class="kw">final String ACTION_OPEN_PACK_BROWSER = "OpenPackBrowser";
   class="kw">public class="kw">static class="kw">final String ACTION_CONFIRM_PACK_BROWSER = "ConfirmPackBrowser";
   class="kw">public class="kw">static class="kw">final String ACTION_CANCEL_PACK_BROWSER = "CancelPackBrowser";
   class="kw">public class="kw">static class="kw">final String ACTION_OPEN_CREATE_PACK = "OpenCreatePack";
   class="kw">public class="kw">static class="kw">final String ACTION_CREATE_PACK = "CreatePack";
   class="kw">public class="kw">static class="kw">final String ACTION_CANCEL_CREATE_PACK = "CancelCreatePack";
   class="kw">public class="kw">static class="kw">final String ACTION_PACK_SEARCH = "PackSearch";
   class="kw">public class="kw">static class="kw">final String ACTION_PACK_SELECT = "PackSelect";

   class="kw">public AssetPackSaveBrowser(@Nonnull AssetPackSaveBrowserConfig var1) {
      this.config = var1;
   }

   @Nonnull
   class="kw">private List<AssetPackSaveBrowser.ModsDirectory> collectModsDirectories() {
      ObjectArrayList var1 = new ObjectArrayList();
      if (Constants.SINGLEPLAYER) {
         var1.add(
            new AssetPackSaveBrowser.ModsDirectory(
               "server.customUI.assetPackBrowser.create.targetDir.world", "server.customUI.assetPackBrowser.filter.world", PluginManager.MODS_PATH
            )
         );

         for (Path var3 : Options.getOptionSet().valuesOf(Options.MODS_DIRECTORIES)) {
            var1.add(
               new AssetPackSaveBrowser.ModsDirectory(
                  "server.customUI.assetPackBrowser.create.targetDir.global", "server.customUI.assetPackBrowser.filter.global", var3
               )
            );
         }
      } else {
         var1.add(
            new AssetPackSaveBrowser.ModsDirectory(
               "server.customUI.assetPackBrowser.create.targetDir.server", "server.customUI.assetPackBrowser.filter.server", PluginManager.MODS_PATH
            )
         );

         for (Path var5 : Options.getOptionSet().valuesOf(Options.MODS_DIRECTORIES)) {
            var1.add(
               new AssetPackSaveBrowser.ModsDirectory(
                  "server.customUI.assetPackBrowser.create.targetDir.server", "server.customUI.assetPackBrowser.filter.server", var5
               )
            );
         }
      }

      class="kw">return var1;
   }

   @Nonnull
   class="kw">private Path getDefaultTargetDirectory() {
      if (Constants.SINGLEPLAYER) {
         List var1 = Options.getOptionSet().valuesOf(Options.MODS_DIRECTORIES);
         if (!var1.isEmpty()) {
            class="kw">return var1.getFirst();
         }
      }

      class="kw">return PluginManager.MODS_PATH;
   }

   @Nullable
   class="kw">private Path resolveTargetDirectory(@Nullable String var1) {
      if (var1 != null && !var1.isBlank()) {
         Path var2 = Path.of(var1).normalize();

         for (AssetPackSaveBrowser.ModsDirectory var4 : this.collectModsDirectories()) {
            if (var4.path().normalize().equals(var2)) {
               class="kw">return var4.path();
            }
         }

         class="kw">return null;
      } else {
         class="kw">return this.getDefaultTargetDirectory();
      }
   }

   class="kw">private void populateTargetDirectoryDropdown(@Nonnull UICommandBuilder var1) {
      List var2 = this.collectModsDirectories();
      if (var2.size() <= 1) {
         var1.set("#CreatePackPage #TargetDirectory.Visible", false);
      } else {
         var1.set("#CreatePackPage #TargetDirectory.Visible", true);
         ObjectArrayList var3 = new ObjectArrayList();

         for (AssetPackSaveBrowser.ModsDirectory var5 : var2) {
            var3.add(new DropdownEntryInfo(LocalizableString.fromMessageId(var5.langKey()), var5.path().toString()));
         }

         var1.set("#CreatePackPage #TargetDirDropdown.Entries", var3);
         var1.set("#CreatePackPage #TargetDirDropdown.Value", this.getDefaultTargetDirectory().toString());
      }
   }

   class="kw">private void populateDirectoryFilterDropdown(@Nonnull UICommandBuilder var1) {
      List var2 = this.collectModsDirectories();
      if (var2.size() <= 1) {
         var1.set("#PackBrowserPage #DirectoryFilter.Visible", false);
      } else {
         var1.set("#PackBrowserPage #DirectoryFilter.Visible", true);
         ObjectArrayList var3 = new ObjectArrayList();
         var3.add(new DropdownEntryInfo(LocalizableString.fromMessageId("server.customUI.assetPackBrowser.filter.all"), ""));

         for (AssetPackSaveBrowser.ModsDirectory var5 : var2) {
            var3.add(new DropdownEntryInfo(LocalizableString.fromMessageId(var5.filterLangKey()), var5.path().toString()));
         }

         var1.set("#PackBrowserPage #DirectoryFilter.Entries", var3);
         var1.set("#PackBrowserPage #DirectoryFilter.Value", this.selectedDirectoryFilter);
      }
   }

   class="kw">public void setSelectedPackKey(@Nullable String var1) {
      if (var1 == null) {
         this.selectedPackKey = null;
      } else {
         AssetPack var2 = AssetModule.get().getAssetPack(var1);
         if (var2 != null && !var2.isImmutable() && AssetModule.get().validatePackExistsOnDisk(var2)) {
            this.selectedPackKey = var1;
         }
      }
   }

   class="kw">public void buildUI(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2) {
      this.buildSearchInput(var1, var2);
      this.buildPackList(var1, var2);
   }

   class="kw">public void buildEventBindings(@Nonnull UIEventBuilder var1, @Nonnull String var2) {
      var1.addEventBinding(CustomUIEventBindingType.Activating, var2, new EventData().append("Action", "OpenPackBrowser"));
      var1.addEventBinding(CustomUIEventBindingType.Activating, "#PackBrowserPage #SelectButton", new EventData().append("Action", "ConfirmPackBrowser"));
      var1.addEventBinding(CustomUIEventBindingType.Activating, "#PackBrowserPage #CancelButton", new EventData().append("Action", "CancelPackBrowser"));
      var1.addEventBinding(CustomUIEventBindingType.Activating, "#PackBrowserPage #CreateNewPackButton", new EventData().append("Action", "OpenCreatePack"));
      var1.addEventBinding(
         CustomUIEventBindingType.Activating,
         "#CreatePackPage #CreateButton",
         new EventData()
            .append("Action", "CreatePack")
            .append("@CreateName", "#CreatePackPage #PackName #Input.Value")
            .append("@CreateGroup", "#CreatePackPage #PackGroup #Input.Value")
            .append("@CreateDescription", "#CreatePackPage #PackDescription #Input.Value")
            .append("@CreateVersion", "#CreatePackPage #PackVersion #Input.Value")
            .append("@CreateWebsite", "#CreatePackPage #PackWebsite #Input.Value")
            .append("@CreateAuthorName", "#CreatePackPage #PackAuthorName #Input.Value")
            .append("@CreateTargetDir", "#CreatePackPage #TargetDirDropdown.Value")
      );
      var1.addEventBinding(CustomUIEventBindingType.Activating, "#CreatePackPage #CancelCreateButton", new EventData().append("Action", "CancelCreatePack"));
      var1.addEventBinding(
         CustomUIEventBindingType.ValueChanged,
         "#CreatePackPage #PackName #Input",
         new EventData()
            .append("ValidateCreate", "1")
            .append("@CreateName", "#CreatePackPage #PackName #Input.Value")
            .append("@CreateGroup", "#CreatePackPage #PackGroup #Input.Value"),
         false
      );
      var1.addEventBinding(
         CustomUIEventBindingType.ValueChanged,
         "#CreatePackPage #PackGroup #Input",
         new EventData()
            .append("ValidateCreate", "1")
            .append("@CreateName", "#CreatePackPage #PackName #Input.Value")
            .append("@CreateGroup", "#CreatePackPage #PackGroup #Input.Value"),
         false
      );
      var1.addEventBinding(
         CustomUIEventBindingType.ValueChanged,
         "#PackBrowserPage #DirectoryFilter",
         new EventData().append("@DirectoryFilter", "#PackBrowserPage #DirectoryFilter.Value"),
         false
      );
   }

   class="kw">private void buildSearchInput(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2) {
      if (this.config.searchInputId() != null) {
         if (!this.searchQuery.isEmpty()) {
            var1.set(this.config.searchInputId() + ".Value", this.searchQuery);
         }

         var2.addEventBinding(
            CustomUIEventBindingType.ValueChanged, this.config.searchInputId(), EventData.of("@PackSearch", this.config.searchInputId() + ".Value"), false
         );
      }
   }

   class="kw">public void buildPackList(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2) {
      var1.clear(this.config.listElementId());
      List var3 = this.collectPackEntries();
      int var4 = 0;

      for (AssetPackSaveBrowser.PackEntry var6 : var3) {
         var1.append(this.config.listElementId(), "Pages/BasicTextButton.ui");
         String var7 = this.config.listElementId() + "[" + var4 + "]";
         if (var6.immutable) {
            var1.set(var7 + ".TextSpans", Message.raw(var6.displayName + " ").insert(Message.translation("server.customUI.assetPackBrowser.readOnly")));
            var1.set(var7 + ".Disabled", true);
            var1.set(var7 + ".Style.Default.LabelStyle.TextColor", "#6e7da1");
            var1.set(var7 + ".TextTooltipStyle", TOOLTIP_STYLE);
            var1.set(var7 + ".TooltipTextSpans", Message.translation("server.customUI.assetPackBrowser.readOnlyTooltip"));
         } else {
            var1.set(var7 + ".Text", var6.displayName);
         }

         if (var6.key.equals(this.selectedPackKey)) {
            var1.set(var7 + ".Style", BUTTON_SELECTED);
         }

         if (!var6.immutable) {
            var2.addEventBinding(CustomUIEventBindingType.Activating, var7, EventData.of("Pack", var6.key));
         }

         var4++;
      }
   }

   class="kw">public boolean handleEvent(@Nonnull AssetPackSaveBrowserEventData var1) {
      if (var1.getSearch() != null) {
         this.searchQuery = var1.getSearch().trim().toLowerCase(Locale.ROOT);
         class="kw">return true;
      } else if (var1.getPack() != null) {
         this.selectedPackKey = var1.getPack();
         class="kw">return true;
      } else if (var1.getDirectoryFilter() != null) {
         this.selectedDirectoryFilter = var1.getDirectoryFilter();
         class="kw">return true;
      } else {
         class="kw">return var1.getValidateCreate() != null;
      }
   }

   @Nullable
   class="kw">public AssetPackSaveBrowser.ActionResult handleAction(@Nullable String var1, @Nonnull AssetPackSaveBrowserEventData var2, @Nonnull String var3) {
      if (var1 == null) {
         if (var2.getValidateCreate() != null) {
            UICommandBuilder var11 = new UICommandBuilder();
            this.buildCreateFormValidation(var11, var2.getCreateName(), var2.getCreateGroup());
            class="kw">return new AssetPackSaveBrowser.ActionResult(var11, null, null, false);
         } else if (this.handleEvent(var2)) {
            UICommandBuilder var10 = new UICommandBuilder();
            UIEventBuilder var12 = new UIEventBuilder();
            this.buildPackList(var10, var12);
            class="kw">return new AssetPackSaveBrowser.ActionResult(var10, var12, null, false);
         } else {
            class="kw">return null;
         }
      } else {
         class="kw">return class="kw">switch (var1) {
            case "OpenPackBrowser" -> {
               UICommandBuilder var18 = new UICommandBuilder();
               UIEventBuilder var20 = new UIEventBuilder();
               var18.set("#PackBrowserPage.Visible", true);
               this.populateDirectoryFilterDropdown(var18);
               this.buildPackList(var18, var20);
               yield new AssetPackSaveBrowser.ActionResult(var18, var20, null, false);
            }
            case "ConfirmPackBrowser" -> {
               UICommandBuilder var17 = new UICommandBuilder();
               var17.set("#PackBrowserPage.Visible", false);
               if (this.hasSelectedPack()) {
                  var17.set(var3 + ".Text", this.getSelectedPackDisplayName());
               }

               yield new AssetPackSaveBrowser.ActionResult(var17, null, null, this.hasSelectedPack());
            }
            case "CancelPackBrowser" -> {
               UICommandBuilder var16 = new UICommandBuilder();
               var16.set("#PackBrowserPage.Visible", false);
               yield new AssetPackSaveBrowser.ActionResult(var16, null, null, false);
            }
            case "OpenCreatePack" -> {
               UICommandBuilder var15 = new UICommandBuilder();
               var15.set("#PackBrowserPage.Visible", false);
               var15.set("#CreatePackPage.Visible", true);
               var15.set("#CreatePackPage #PackName #Input.Value", "");
               var15.set("#CreatePackPage #PackGroup #Input.Value", "");
               var15.set("#CreatePackPage #PackDescription #Input.Value", "");
               var15.set("#CreatePackPage #PackVersion #Input.Value", "");
               var15.set("#CreatePackPage #PackWebsite #Input.Value", "");
               var15.set("#CreatePackPage #PackAuthorName #Input.Value", "");
               var15.set("#CreatePackPage #CreateErrorText.Visible", false);
               var15.set("#CreatePackPage #CreateButton.Disabled", false);
               this.populateTargetDirectoryDropdown(var15);
               yield new AssetPackSaveBrowser.ActionResult(var15, null, null, false);
            }
            case "CreatePack" -> {
               AssetPackSaveBrowser.CreatePackResult var14 = this.createPack(var2);
               UICommandBuilder var19 = new UICommandBuilder();
               UIEventBuilder var8 = null;
               String var9 = null;
               if (var14.success()) {
                  var8 = new UIEventBuilder();
                  var19.set("#CreatePackPage.Visible", false);
                  var19.set("#PackBrowserPage.Visible", true);
                  this.buildPackList(var19, var8);
               } else {
                  var9 = var14.errorKey();
               }

               yield new AssetPackSaveBrowser.ActionResult(var19, var8, var9, false);
            }
            case "CancelCreatePack" -> {
               UICommandBuilder var13 = new UICommandBuilder();
               var13.set("#CreatePackPage.Visible", false);
               var13.set("#PackBrowserPage.Visible", true);
               yield new AssetPackSaveBrowser.ActionResult(var13, null, null, false);
            }
            case "PackSearch", "PackSelect" -> {
               this.handleEvent(var2);
               UICommandBuilder var6 = new UICommandBuilder();
               UIEventBuilder var7 = new UIEventBuilder();
               this.buildPackList(var6, var7);
               yield new AssetPackSaveBrowser.ActionResult(var6, var7, null, false);
            }
            class="kw">default -> null;
         };
      }
   }

   @Nullable
   class="kw">public AssetPack getSelectedPack() {
      class="kw">return this.selectedPackKey == null ? null : AssetModule.get().getAssetPack(this.selectedPackKey);
   }

   class="kw">public boolean hasSelectedPack() {
      class="kw">return this.selectedPackKey != null && AssetModule.get().getAssetPack(this.selectedPackKey) != null;
   }

   @Nonnull
   class="kw">public String getSelectedPackDisplayName() {
      if (this.selectedPackKey == null) {
         class="kw">return "";
      }

      AssetPack var1 = AssetModule.get().getAssetPack(this.selectedPackKey);
      if (var1 == null) {
         class="kw">return this.selectedPackKey;
      }

      String var2 = getPackDisplayName(var1);

      for (AssetPack var4 : AssetModule.get().getAssetPacks()) {
         if (var4 != var1 && var2.equalsIgnoreCase(getPackDisplayName(var4))) {
            class="kw">return var1.getName();
         }
      }

      class="kw">return var2;
   }

   @Nonnull
   class="kw">public AssetPackSaveBrowser.CreatePackResult createPack(@Nonnull AssetPackSaveBrowserEventData var1) {
      String var2 = var1.getCreateName();
      String var3 = var1.getCreateGroup();
      if (var2 == null || var2.isBlank()) {
         class="kw">return new AssetPackSaveBrowser.CreatePackResult(false, "server.customUI.assetPackBrowser.create.nameRequired");
      }

      if (var3 != null && !var3.isBlank()) {
         PluginManifest var4 = new PluginManifest();
         var4.setName(var2.trim());
         var4.setGroup(var3.trim());
         if (var1.getCreateDescription() != null && !var1.getCreateDescription().isBlank()) {
            var4.setDescription(var1.getCreateDescription().trim());
         }

         if (var1.getCreateVersion() != null && !var1.getCreateVersion().isBlank()) {
            try {
               var4.setVersion(Semver.fromString(var1.getCreateVersion().trim()));
            } catch (IllegalArgumentException var13) {
            }
         }

         if (var1.getCreateWebsite() != null && !var1.getCreateWebsite().isBlank()) {
            var4.setWebsite(var1.getCreateWebsite().trim());
         }

         if (var1.getCreateAuthorName() != null && !var1.getCreateAuthorName().isBlank()) {
            AuthorInfo var5 = new AuthorInfo();
            var5.setName(var1.getCreateAuthorName().trim());
            var4.setAuthors(List.of(var5));
         }

         String var14 = new PluginIdentifier(var4).toString();
         if (AssetModule.get().getAssetPack(var14) != null) {
            class="kw">return new AssetPackSaveBrowser.CreatePackResult(false, "server.customUI.assetPackBrowser.create.alreadyExists");
         }

         String var6 = INVALID_FILENAME_CHARS.matcher(var3.trim() + "." + var2.trim()).replaceAll("");
         Path var7 = this.resolveTargetDirectory(var1.getCreateTargetDir());
         if (var7 == null) {
            class="kw">return new AssetPackSaveBrowser.CreatePackResult(false, "server.customUI.assetPackBrowser.create.failed");
         }

         Path var8 = PathUtil.resolveName(var7, var6);
         if (var8 == null) {
            class="kw">return new AssetPackSaveBrowser.CreatePackResult(false, "server.customUI.assetPackBrowser.create.nameRequired");
         }

         if (Files.exists(var8)) {
            class="kw">return new AssetPackSaveBrowser.CreatePackResult(false, "server.customUI.assetPackBrowser.create.alreadyExists");
         }

         try {
            Files.createDirectories(var8);
            Path var9 = var8.resolve("manifest.json");
            BsonUtil.writeSync(var9, PluginManifest.CODEC, var4, LOGGER);
            String var10 = var14;
            Path var11 = var8;
            HytaleServer.SCHEDULED_EXECUTOR.execute(() -> {
               HytaleServerConfig var3 = HytaleServer.get().getConfig();
               HytaleServerConfig.setBoot(var3, new PluginIdentifier(var4), true);
               var3.markChanged();
               if (var3.consumeHasChanged()) {
                  HytaleServerConfig.save(var3).join();
               }

               if (!AssetModule.get().registerPack(var10, var11, var4, AssetPack.PackSource.RUNTIME)) {
                  ((HytaleLogger.Api)LOGGER.atSevere()).log("Failed to register asset pack: %s at %s", var10, var11);
               } else {
                  ((HytaleLogger.Api)LOGGER.atInfo()).log("Created new asset pack: %s at %s", var10, var11);
               }
            });
            this.selectedPackKey = var14;
            this.pendingPack = new AssetPackSaveBrowser.PendingPack(var14, var2.trim());
            class="kw">return new AssetPackSaveBrowser.CreatePackResult(true, null);
         } catch (IOException var12) {
            ((HytaleLogger.Api)((HytaleLogger.Api)LOGGER.atSevere()).withCause(var12)).log("Failed to create asset pack %s", var14);
            class="kw">return new AssetPackSaveBrowser.CreatePackResult(false, "server.customUI.assetPackBrowser.create.failed");
         }
      } else {
         class="kw">return new AssetPackSaveBrowser.CreatePackResult(false, "server.customUI.assetPackBrowser.create.groupRequired");
      }
   }

   class="kw">public boolean checkDuplicatePack(@Nullable String var1, @Nullable String var2) {
      if (var1 != null && !var1.isBlank() && var2 != null && !var2.isBlank()) {
         String var3 = var2.trim() + ":" + var1.trim();
         if (AssetModule.get().getAssetPack(var3) != null) {
            class="kw">return true;
         }

         String var4 = INVALID_FILENAME_CHARS.matcher(var2.trim() + "." + var1.trim()).replaceAll("");

         for (AssetPackSaveBrowser.ModsDirectory var6 : this.collectModsDirectories()) {
            Path var7 = PathUtil.resolveName(var6.path(), var4);
            if (var7 != null && Files.exists(var7)) {
               class="kw">return true;
            }
         }

         class="kw">return false;
      } else {
         class="kw">return false;
      }
   }

   class="kw">public void buildCreateFormValidation(@Nonnull UICommandBuilder var1, @Nullable String var2, @Nullable String var3) {
      boolean var4 = this.checkDuplicatePack(var2, var3);
      var1.set("#CreatePackPage #CreateErrorText.Visible", var4);
      if (var4) {
         var1.set("#CreatePackPage #CreateErrorText.Text", Message.translation("server.customUI.assetPackBrowser.create.alreadyExists"));
      }

      var1.set("#CreatePackPage #CreateButton.Disabled", var4);
   }

   class="kw">private List<AssetPackSaveBrowser.PackEntry> collectPackEntries() {
      List var1 = new ObjectArrayList();
      List var2 = new ObjectArrayList();
      boolean var3 = false;

      for (AssetPack var5 : AssetModule.get().getAssetPacks()) {
         if (AssetModule.get().validatePackExistsOnDisk(var5)) {
            String var6 = getPackDisplayName(var5);
            boolean var7 = var5.isImmutable();
            if (this.pendingPack != null && var5.getName().equals(this.pendingPack.key)) {
               var3 = true;
            }

            if (!this.searchQuery.isEmpty()) {
               int var8 = StringCompareUtil.getFuzzyDistance(var6.toLowerCase(Locale.ROOT), this.searchQuery, Locale.ENGLISH);
               if (var8 <= 0) {
                  class="kw">continue;
               }
            }

            if (!this.selectedDirectoryFilter.isEmpty()) {
               Path var13 = Path.of(this.selectedDirectoryFilter);
               if (!PathUtil.isChildOf(var13, var5.getPackLocation())) {
                  class="kw">continue;
               }
            }

            AssetPackSaveBrowser.PackEntry var14 = new AssetPackSaveBrowser.PackEntry(var5.getName(), var6, var7);
            if (var7) {
               var2.add(var14);
            } else {
               var1.add(var14);
            }
         }
      }

      if (var3) {
         this.pendingPack = null;
      } else if (this.pendingPack != null) {
         String var9 = this.pendingPack.displayName;
         if (this.searchQuery.isEmpty() || StringCompareUtil.getFuzzyDistance(var9.toLowerCase(Locale.ROOT), this.searchQuery, Locale.ENGLISH) > 0) {
            var1.add(new AssetPackSaveBrowser.PackEntry(this.pendingPack.key, var9, false));
         }
      }

      disambiguateDisplayNames(var1);
      disambiguateDisplayNames(var2);
      String var10 = AssetModule.get().getBaseAssetPack().getName();
      Comparator var11 = Comparator.<AssetPackSaveBrowser.PackEntry, Boolean>comparing(var1x -> !var1x.key.equals(var10))
         .thenComparing(var0 -> var0.displayName.toLowerCase(Locale.ROOT));
      var1.sort(var11);
      var2.sort(var11);
      List var12 = new ObjectArrayList(var1.size() + var2.size());
      var12.addAll(var1);
      var12.addAll(var2);
      class="kw">return var12;
   }

   class="kw">private class="kw">static void disambiguateDisplayNames(@Nonnull List<AssetPackSaveBrowser.PackEntry> var0) {
      Map var1 = new HashMap<>();

      for (AssetPackSaveBrowser.PackEntry var3 : var0) {
         var1.merge(var3.displayName.toLowerCase(Locale.ROOT), 1, Integer::sum);
      }

      for (int var4 = 0; var4 < var0.size(); var4++) {
         AssetPackSaveBrowser.PackEntry var5 = var0.get(var4);
         if (var1.getOrDefault(var5.displayName.toLowerCase(Locale.ROOT), 0) > 1) {
            var0.set(var4, new AssetPackSaveBrowser.PackEntry(var5.key, var5.key, var5.immutable));
         }
      }
   }

   @Nonnull
   class="kw">private class="kw">static String getPackDisplayName(@Nonnull AssetPack var0) {
      if (var0.equals(AssetModule.get().getBaseAssetPack())) {
         class="kw">return "HytaleAssets";
      }

      PluginManifest var1 = var0.getManifest();
      class="kw">return var1 != null ? var1.getName() : var0.getName();
   }

   class="kw">public record ActionResult(@Nonnull UICommandBuilder commandBuilder, @Nullable UIEventBuilder eventBuilder, @Nullable String errorKey, boolean packConfirmed) {
      class="kw">public ActionResult {
      }
   }

   class="kw">public record CreatePackResult(boolean success, @Nullable String errorKey) {
      class="kw">public CreatePackResult {
      }
   }

   class="kw">public record ModsDirectory(@Nonnull String langKey, @Nonnull String filterLangKey, @Nonnull Path path) {
      class="kw">public ModsDirectory {
      }
   }

   class="kw">private record PackEntry(@Nonnull String key, @Nonnull String displayName, boolean immutable) {
      class="kw">private PackEntry {
      }
   }

   class="kw">private record PendingPack(@Nonnull String key, @Nonnull String displayName) {
      class="kw">private PendingPack {
      }
   }
}