PageData class

Пакет: com.hypixel.hytale.builtin.buildertools.prefabeditor.ui

Файл: com/hypixel/hytale/builtin/buildertools/prefabeditor/ui/PrefabEditorLoadSettingsPage.java

Поля (43)

МодификаторыТипИмя
public static final String ALIGNMENT_METHOD
public static final String BLOCKS_BETWEEN_PREFABS
public static final String BROWSER_FILE
public static final String BROWSER_ROOT
public static final String BROWSER_SEARCH
public static final String CHILDREN
public static final BuilderCodec<PrefabEditorLoadSettingsPage.PageData> CODEC
public static final String CONFIG_NAME
public static final String DESIRED_Y_LEVEL
public static final String ENABLE_WORLD_TICKING
public static final String ENTITIES
public static final String ENVIRONMENT
public static final String GRASS_TINT
public static final String NUM_AIR_BEFORE_GROUND
public static final String PASTE_AXIS
public static final String PREFAB_PATHS
public static final String RECURSIVE
public static final String ROOT_DIR
public static final String ROW_SPLIT_MODE
public static final String WORLD_GEN_TYPE
public PrefabAlignment alignment
public int blocksAboveSurface
public int blocksBetweenEachPrefab
public String browserFile
public String browserRootStr
public String browserSearchStr
public String configName
public boolean enableWorldTicking
public String environment
public String grassTint
public boolean loadChildren
public boolean loadEntities
public final AssetPackSaveBrowserEventData packBrowserData
public int pasteYLevelGoal
public PrefabRootDirectory prefabRootDirectory
public boolean recursive
public PrefabRowSplitMode rowSplitMode
public PrefabStackingAxis stackingAxis
public PrefabEditorLoadSettingsPage.Action uiAction
public String unprocessedPrefabPaths
String var1
var1
public WorldGenType worldGenType

Методы (1)

МодификаторыВозвратСигнатура
public PrefabEditorCreationSettings toCreationSettingspublic PrefabEditorCreationSettings toCreationSettings()

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.buildertools.prefabeditor.ui;

class="kw">import com.hypixel.hytale.assetstore.AssetPack;
class="kw">import com.hypixel.hytale.builtin.buildertools.BuilderToolsPlugin;
class="kw">import com.hypixel.hytale.builtin.buildertools.BuilderToolsUserData;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.PrefabEditSessionManager;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.PrefabEditorCreationSettings;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.PrefabLoadingState;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.commands.PrefabEditLoadCommand;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.enums.PrefabAlignment;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.enums.PrefabRootDirectory;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.enums.PrefabRowSplitMode;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.enums.PrefabStackingAxis;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.enums.WorldGenType;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefablist.AssetPrefabFileProvider;
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.codec.codecs.EnumCodec;
class="kw">import com.hypixel.hytale.common.util.PathUtil;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.protocol.Color;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolPrefabPreview;
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_.EditorBlocksChange;
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.asset.AssetModule;
class="kw">import com.hypixel.hytale.server.core.asset.type.environment.config.Environment;
class="kw">import com.hypixel.hytale.server.core.asset.util.ColorParseUtil;
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.modules.singleplayer.SingleplayerModule;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabLoadException;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabStore;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.standard.BlockSelection;
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.browser.AssetPackSaveBrowser;
class="kw">import com.hypixel.hytale.server.core.ui.browser.AssetPackSaveBrowserConfig;
class="kw">import com.hypixel.hytale.server.core.ui.browser.AssetPackSaveBrowserEventData;
class="kw">import com.hypixel.hytale.server.core.ui.browser.FileListProvider;
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.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.WorldChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.io.File;
class="kw">import java.io.IOException;
class="kw">import java.nio.file.DirectoryStream;
class="kw">import java.nio.file.Files;
class="kw">import java.nio.file.Path;
class="kw">import java.nio.file.Paths;
class="kw">import java.util.List;
class="kw">import java.util.Locale;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;

class="kw">public class PrefabEditorLoadSettingsPage class="kw">extends InteractiveCustomUIPage<PrefabEditorLoadSettingsPage.PageData> {
   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_HIGHLIGHTED = Value.ref("Pages/BasicTextButton.ui", "SelectedLabelStyle");
   class="kw">private class="kw">static class="kw">final String ASSETS_ROOT_KEY = "Assets";
   class="kw">private class="kw">static class="kw">final String BASE_PACK_KEY = "HytaleAssets";
   class="kw">private class="kw">final AssetPackSaveBrowser packBrowser = new AssetPackSaveBrowser(AssetPackSaveBrowserConfig.defaults());
   class="kw">private class="kw">final List<DropdownEntryInfo> savedConfigsDropdown = new ObjectArrayList();
   class="kw">private class="kw">volatile boolean isLoading;
   class="kw">private class="kw">volatile boolean loadingCancelled;
   class="kw">private class="kw">volatile boolean isShuttingDown;
   class="kw">private PrefabLoadingState currentLoadingState;
   class="kw">private String loadingWorldName;
   class="kw">private Path browserRoot;
   class="kw">private Path browserCurrent;
   class="kw">private String selectedPath;
   @Nonnull
   class="kw">private String browserSearchQuery = "";
   class="kw">private class="kw">final List<String> selectedItems = new ObjectArrayList();
   @Nonnull
   class="kw">private class="kw">final AssetPrefabFileProvider assetProvider = new AssetPrefabFileProvider();
   class="kw">private class="kw">static class="kw">final int PREVIEW_TILT = 23;
   class="kw">private class="kw">static class="kw">final int PREVIEW_SPIN_SPEED = 27;
   class="kw">private class="kw">static class="kw">final int PREVIEW_MAX_SIZE = 100;
   class="kw">private class="kw">static class="kw">final int DEFAULT_BIOME_TINT = ColorParseUtil.colorToARGBInt(PrefabEditSessionManager.DEFAULT_TINT) & 16777215;
   class="kw">private class="kw">static class="kw">final int DEFAULT_WATER_TINT = ColorParseUtil.colorToARGBInt(Environment.getUnknownFor("").getWaterTint()) & 16777215;
   @Nullable
   class="kw">private Path previewedBrowserPath;
   @Nonnull
   class="kw">private PrefabRootDirectory resolvedRootDirectory = PrefabRootDirectory.ASSET;
   class="kw">private boolean inAssetsRoot = false;
   @Nonnull
   class="kw">private Path assetsCurrentDir = Paths.get("");

   class="kw">public PrefabEditorLoadSettingsPage(@Nonnull PlayerRef var1) {
      super(var1, CustomPageLifetime.CanDismissOrCloseThroughInteraction, PrefabEditorLoadSettingsPage.PageData.CODEC);
   }

   @Override
   class="kw">public void build(@Nonnull Ref<EntityStore> var1, @Nonnull UICommandBuilder var2, @Nonnull UIEventBuilder var3, @Nonnull Store<EntityStore> var4) {
      var2.append("Pages/PrefabEditorSettings.ui");
      Player var5 = var4.getComponent(var1, Player.getComponentType());
      if (var5 != null) {
         this.packBrowser.setSelectedPackKey(BuilderToolsUserData.get(var5).getLastSavePack());
      }

      this.savedConfigsDropdown.add(new DropdownEntryInfo(LocalizableString.fromMessageId("server.commands.editprefab.ui.savedConfigs.noneSelected"), ""));

      for (String var7 : PrefabEditorCreationSettings.getAssetMap().getAssetMap().keySet()) {
         this.savedConfigsDropdown.add(new DropdownEntryInfo(LocalizableString.fromString(var7), var7));
      }

      var2.set("#SavedConfigs #Input.Entries", this.savedConfigsDropdown);
      var2.set("#SavedConfigs #Input.Value", "");
      ObjectArrayList var15 = new ObjectArrayList();

      for (WorldGenType var10 : WorldGenType.values()) {
         var15.add(new DropdownEntryInfo(LocalizableString.fromMessageId(var10.getLocalizationString()), var10.name()));
      }

      var2.set("#MainPage #WorldGenType #Input.Entries", var15);
      var2.set("#MainPage #WorldGenType #Input.Value", PrefabEditLoadCommand.DEFAULT_WORLD_GEN_TYPE.name());
      ObjectArrayList var17 = new ObjectArrayList();
      Environment.getAssetMap()
         .getAssetMap()
         .keySet()
         .stream()
         .sorted()
         .forEach(var1x -> var17.add(new DropdownEntryInfo(LocalizableString.fromString(var1x), var1x)));
      var2.set("#MainPage #Environment #Input.Entries", var17);
      var2.set("#MainPage #Environment #Input.Value", "Env_Zone1_Plains");
      var2.set("#MainPage #GrassTint #Input.Color", "#5B9E28");
      ObjectArrayList var18 = new ObjectArrayList();

      for (PrefabStackingAxis var12 : PrefabStackingAxis.values()) {
         var18.add(new DropdownEntryInfo(LocalizableString.fromString(var12.name()), var12.name()));
      }

      var2.set("#MainPage #PasteAxis #Input.Entries", var18);
      var2.set("#MainPage #PasteAxis #Input.Value", PrefabEditLoadCommand.DEFAULT_PREFAB_STACKING_AXIS.name());
      ObjectArrayList var20 = new ObjectArrayList();

      for (PrefabAlignment var13 : PrefabAlignment.values()) {
         var20.add(new DropdownEntryInfo(LocalizableString.fromMessageId(var13.getLocalizationString()), var13.name()));
      }

      var2.set("#MainPage #AlignmentMethod #Input.Entries", var20);
      var2.set("#MainPage #AlignmentMethod #Input.Value", PrefabEditLoadCommand.DEFAULT_PREFAB_ALIGNMENT.name());
      ObjectArrayList var23 = new ObjectArrayList();

      for (PrefabRowSplitMode var14 : PrefabRowSplitMode.values()) {
         var23.add(new DropdownEntryInfo(LocalizableString.fromMessageId(var14.getLocalizationString()), var14.name()));
      }

      var2.set("#MainPage #RowSplitMode #Input.Entries", var23);
      var2.set("#MainPage #RowSplitMode #Input.Value", PrefabEditLoadCommand.DEFAULT_ROW_SPLIT_MODE.name());
      var2.set("#MainPage #DesiredYLevel #Input.Value", 55);
      var2.set("#MainPage #BlocksBetweenPrefabs #Input.Value", 15);
      var2.set("#MainPage #NumAirBeforeGround #Input.Value", 0);
      var2.set("#MainPage #EnableWorldTicking #CheckBox.Value", false);
      var2.set("#MainPage #Children.Visible", false);
      var2.set("#MainPage #ErrorText.Visible", false);
      var2.set("#LoadingPage.Visible", false);
      var2.set("#LoadingPage #ProgressBar.Value", 0.0F);
      var2.set("#LoadingPage #StatusText.TextSpans", Message.translation("server.commands.editprefab.loading.phase.initializing"));
      var2.set("#LoadingPage #ErrorText.Visible", false);
      var3.addEventBinding(
         CustomUIEventBindingType.Activating,
         "#MainPage #LoadButton",
         new EventData()
            .append("Action", PrefabEditorLoadSettingsPage.Action.Load.name())
            .append("@PrefabPaths", "#MainPage #PrefabPaths #Input.Value")
            .append("@Recursive", "#MainPage #Recursive #CheckBox.Value")
            .append("@Children", "#MainPage #Children #CheckBox.Value")
            .append("@Entities", "#MainPage #Entities #CheckBox.Value")
            .append("@EnableWorldTicking", "#MainPage #EnableWorldTicking #CheckBox.Value")
            .append("@DesiredYLevel", "#MainPage #DesiredYLevel #Input.Value")
            .append("@BlocksBetweenPrefabs", "#MainPage #BlocksBetweenPrefabs #Input.Value")
            .append("@WorldGenType", "#MainPage #WorldGenType #Input.Value")
            .append("@Environment", "#MainPage #Environment #Input.Value")
            .append("@GrassTint", "#MainPage #GrassTint #Input.Color")
            .append("@PasteAxis", "#MainPage #PasteAxis #Input.Value")
            .append("@NumAirBeforeGround", "#MainPage #NumAirBeforeGround #Input.Value")
            .append("@AlignmentMethod", "#MainPage #AlignmentMethod #Input.Value")
            .append("@RowSplitMode", "#MainPage #RowSplitMode #Input.Value")
      );
      var3.addEventBinding(
         CustomUIEventBindingType.ValueChanged,
         "#MainPage #SavedConfigs #Input",
         new EventData()
            .append("Action", PrefabEditorLoadSettingsPage.Action.ApplySavedProperties.name())
            .append("@ConfigName", "#MainPage #SavedConfigs #Input.Value")
      );
      var3.addEventBinding(
         CustomUIEventBindingType.Activating, "#MainPage #CancelButton", new EventData().append("Action", PrefabEditorLoadSettingsPage.Action.Cancel.name())
      );
      var3.addEventBinding(
         CustomUIEventBindingType.Activating,
         "#MainPage #SavePropertiesButton",
         new EventData().append("Action", PrefabEditorLoadSettingsPage.Action.OpenSavePropertiesDialog.name())
      );
      var3.addEventBinding(
         CustomUIEventBindingType.Activating,
         "#SaveConfigPage #CancelButton",
         new EventData().append("Action", PrefabEditorLoadSettingsPage.Action.CancelSavePropertiesDialog.name())
      );
      var3.addEventBinding(
         CustomUIEventBindingType.ValueChanged,
         "#SaveConfigPage #SaveName #Input",
         new EventData()
            .append("Action", PrefabEditorLoadSettingsPage.Action.SavePropertiesNameChanged.name())
            .append("@ConfigName", "#SaveConfigPage #SaveName #Input.Value")
      );
      var3.addEventBinding(
         CustomUIEventBindingType.Activating,
         "#SaveConfigPage #SavePropertiesButton",
         new EventData()
            .append("Action", PrefabEditorLoadSettingsPage.Action.SavePropertiesConfig.name())
            .append("@ConfigName", "#SaveConfigPage #SaveName #Input.Value")
            .append("@PrefabPaths", "#MainPage #PrefabPaths #Input.Value")
            .append("@Recursive", "#MainPage #Recursive #CheckBox.Value")
            .append("@Children", "#MainPage #Children #CheckBox.Value")
            .append("@Entities", "#MainPage #Entities #CheckBox.Value")
            .append("@EnableWorldTicking", "#MainPage #EnableWorldTicking #CheckBox.Value")
            .append("@DesiredYLevel", "#MainPage #DesiredYLevel #Input.Value")
            .append("@BlocksBetweenPrefabs", "#MainPage #BlocksBetweenPrefabs #Input.Value")
            .append("@WorldGenType", "#MainPage #WorldGenType #Input.Value")
            .append("@Environment", "#MainPage #Environment #Input.Value")
            .append("@GrassTint", "#MainPage #GrassTint #Input.Color")
            .append("@PasteAxis", "#MainPage #PasteAxis #Input.Value")
            .append("@NumAirBeforeGround", "#MainPage #NumAirBeforeGround #Input.Value")
            .append("@AlignmentMethod", "#MainPage #AlignmentMethod #Input.Value")
            .append("@RowSplitMode", "#MainPage #RowSplitMode #Input.Value")
      );
      var2.set("#PackBrowserPage.Visible", false);
      var2.set("#CreatePackPage.Visible", false);
      if (this.packBrowser.hasSelectedPack()) {
         var2.set("#SaveConfigPage #SelectedPackLabel.Text", this.packBrowser.getSelectedPackDisplayName());
      }

      this.packBrowser.buildEventBindings(var3, "#SaveConfigPage #BrowsePackButton");
      this.packBrowser.buildUI(var2, var3);
      var3.addEventBinding(
         CustomUIEventBindingType.Activating,
         "#LoadingPage #CancelButton",
         new EventData().append("Action", PrefabEditorLoadSettingsPage.Action.CancelLoading.name())
      );
      var3.addEventBinding(
         CustomUIEventBindingType.Activating,
         "#MainPage #PrefabPaths #BrowseButton",
         new EventData().append("Action", PrefabEditorLoadSettingsPage.Action.OpenBrowser.name())
      );
      var3.addEventBinding(
         CustomUIEventBindingType.Activating,
         "#BrowserPage #BrowserContent #HomeButton",
         new EventData().append("Action", PrefabEditorLoadSettingsPage.Action.BrowserHome.name())
      );
      var3.addEventBinding(
         CustomUIEventBindingType.ValueChanged,
         "#BrowserPage #BrowserContent #RootSelector",
         new EventData()
            .append("Action", PrefabEditorLoadSettingsPage.Action.BrowserRootChanged.name())
            .append("@BrowserRoot", "#BrowserPage #BrowserContent #RootSelector.Value"),
         false
      );
      var3.addEventBinding(
         CustomUIEventBindingType.ValueChanged,
         "#BrowserPage #BrowserContent #SearchInput",
         new EventData()
            .append("Action", PrefabEditorLoadSettingsPage.Action.BrowserSearch.name())
            .append("@BrowserSearch", "#BrowserPage #BrowserContent #SearchInput.Value"),
         false
      );
      var3.addEventBinding(
         CustomUIEventBindingType.Activating,
         "#BrowserPage #AddToListButton",
         new EventData().append("Action", PrefabEditorLoadSettingsPage.Action.AddFolderToList.name())
      );
      var3.addEventBinding(
         CustomUIEventBindingType.Activating,
         "#BrowserPage #ConfirmButton",
         new EventData().append("Action", PrefabEditorLoadSettingsPage.Action.ConfirmBrowser.name())
      );
      var3.addEventBinding(
         CustomUIEventBindingType.Activating,
         "#BrowserPage #CancelButton",
         new EventData().append("Action", PrefabEditorLoadSettingsPage.Action.CancelBrowser.name())
      );
      var2.set("#BrowserPage.Visible", false);
      var2.set("#BrowserPage #SelectedSection #SelectedItems.Value", "");
   }

   class="kw">public void handleDataEvent(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, @Nonnull PrefabEditorLoadSettingsPage.PageData var3) {
      Player var4 = var2.getComponent(var1, Player.getComponentType());
      assert var4 != null;
      PlayerRef var5 = var2.getComponent(var1, PlayerRef.getComponentType());
      assert var5 != null;
      AssetPackSaveBrowser.ActionResult var6 = this.packBrowser
         .handleAction(var3.uiAction != null ? var3.uiAction.name() : null, var3.packBrowserData, "#SaveConfigPage #SelectedPackLabel");
      if (var6 != null) {
         if (var6.errorKey() != null) {
            this.playerRef.sendMessage(Message.translation(var6.errorKey()));
         }

         if (var6.packConfirmed() && this.packBrowser.hasSelectedPack()) {
            BuilderToolsUserData.get(var4).setLastSavePack(this.packBrowser.getSelectedPack().getName());
         }

         this.sendUpdate(var6.commandBuilder(), var6.eventBuilder(), false);
      } else {
         class="kw">switch (var3.uiAction) {
            case Load:
               if (this.isLoading || this.isShuttingDown) {
                  class="kw">return;
               }

               this.isLoading = true;
               this.loadingCancelled = false;
               this.currentLoadingState = new PrefabLoadingState();
               this.loadingWorldName = "prefabEditor-" + var5.getUsername();
               UICommandBuilder var26 = new UICommandBuilder();
               var26.set("#MainPage.Visible", false);
               var26.set("#MainPage #ErrorText.Visible", false);
               var26.set("#SaveConfigPage.Visible", false);
               var26.set("#LoadingPage.Visible", true);
               var26.set("#LoadingPage #ProgressBar.Value", 0.0F);
               var26.set("#LoadingPage #StatusText.TextSpans", Message.translation("server.commands.editprefab.loading.phase.initializing"));
               var26.set("#LoadingPage #ErrorText.Visible", false);
               var26.set("#LoadingPage #CancelButton.Visible", true);
               this.sendUpdate(var26);
               var3.prefabRootDirectory = this.resolvedRootDirectory;
               PrefabEditorCreationSettings var34 = var3.toCreationSettings();
               CompletableFuture var39 = BuilderToolsPlugin.get()
                  .getPrefabEditSessionManager()
                  .loadPrefabAndCreateEditSession(var1, var4, var34, var2, this::onLoadingProgress);
               if (var39 == null) {
                  Message var10 = var34.getFailureMessage();
                  this.showMainPageError(var10 != null ? var10 : Message.translation("server.commands.editprefab.error.failedToStart"));
                  class="kw">return;
               }

               var39.whenComplete((var4x, var5x) -> {
                  if (!this.loadingCancelled) {
                     if (var5x != null) {
                        this.onLoadingFailed(Message.raw(var5x.getMessage() != null ? var5x.getMessage() : "Unknown error"));
                     } else if (this.currentLoadingState != null && this.currentLoadingState.hasErrors()) {
                        this.onLoadingFailed(this.currentLoadingState.getStatusMessage());
                     } else {
                        this.isLoading = false;
                        this.loadingWorldName = null;
                        this.currentLoadingState = null;
                        var4.getPageManager().setPage(var1, var2, Page.ContentCreation);
                     }
                  }
               });
               break;
            case OpenSavePropertiesDialog: {
               UICommandBuilder var25 = new UICommandBuilder();
               var25.set("#MainPage.Visible", false);
               var25.set("#SaveConfigPage.Visible", true);
               this.sendUpdate(var25);
               break;
            }
            case CancelSavePropertiesDialog: {
               UICommandBuilder var24 = new UICommandBuilder();
               var24.set("#MainPage.Visible", true);
               var24.set("#SaveConfigPage.Visible", false);
               this.sendUpdate(var24);
               break;
            }
            case SavePropertiesConfig:
               AssetPack var23 = this.packBrowser.getSelectedPack();
               if (var23 == null) {
                  this.playerRef.sendMessage(Message.translation("server.customUI.assetPackBrowser.packRequired"));
                  class="kw">return;
               }

               BuilderToolsUserData.get(var4).setLastSavePack(var23.getName());
               var3.prefabRootDirectory = this.resolvedRootDirectory;
               if (var3.configName == null || var3.configName.isBlank()) {
                  class="kw">return;
               }

               CompletableFuture var33 = PrefabEditorCreationSettings.save(var3.configName, var3.toCreationSettings(), var23, this.playerRef);
               var33.thenRun(() -> {
                  UICommandBuilder builderx = new UICommandBuilder();
                  builderx.set("#MainPage.Visible", true);
                  builderx.set("#SaveConfigPage.Visible", false);
                  builderx.set("#SaveConfigPage #Buttons.Visible", true);
                  builderx.set("#SaveConfigPage #SaveName #Input.Value", "");
                  this.savedConfigsDropdown.add(new DropdownEntryInfo(LocalizableString.fromString(var3.configName), var3.configName));
                  builderx.set("#SavedConfigs #Input.Entries", this.savedConfigsDropdown);
                  builderx.set("#SavedConfigs #Input.Value", var3.configName);
                  this.sendUpdate(builderx);
               });
               var33.exceptionally(
                  var2x -> {
                     String var3 = var2x.getMessage();
                     if (var3 != null && var3.contains("server.commands.editprefab.error")) {
                        this.playerRef.sendMessage(Message.translation(var3));
                     } else {
                        ((HytaleLogger.Api)((HytaleLogger.Api)LOGGER.atWarning()).withCause(var2x))
                           .log("Failed to save prefab editor config '%s'", var3.configName);
                        this.playerRef.sendMessage(Message.translation("server.commands.editprefab.error.failedToSave"));
                     }

                     this.sendUpdate(null, null, false);
                     class="kw">return null;
                  }
               );
               break;
            case ApplySavedProperties:
               if (var3.configName == null || var3.configName.isBlank()) {
                  this.resolvedRootDirectory = PrefabEditLoadCommand.DEFAULT_PREFAB_ROOT_DIRECTORY;
                  UICommandBuilder builderx = new UICommandBuilder();
                  builderx.set("#MainPage #PrefabPaths #Input.Value", "");
                  builderx.set("#MainPage #Recursive #CheckBox.Value", true);
                  builderx.set("#MainPage #Children #CheckBox.Value", false);
                  builderx.set("#MainPage #Entities #CheckBox.Value", false);
                  builderx.set("#MainPage #EnableWorldTicking #CheckBox.Value", false);
                  builderx.set("#MainPage #DesiredYLevel #Input.Value", 55);
                  builderx.set("#MainPage #BlocksBetweenPrefabs #Input.Value", 15);
                  builderx.set("#MainPage #WorldGenType #Input.Value", PrefabEditLoadCommand.DEFAULT_WORLD_GEN_TYPE.name());
                  builderx.set("#MainPage #Environment #Input.Value", "Env_Zone1_Plains");
                  builderx.set("#MainPage #GrassTint #Input.Color", "#5B9E28");
                  builderx.set("#MainPage #NumAirBeforeGround #Input.Value", 0);
                  builderx.set("#MainPage #PasteAxis #Input.Value", PrefabEditLoadCommand.DEFAULT_PREFAB_STACKING_AXIS.name());
                  builderx.set("#MainPage #AlignmentMethod #Input.Value", PrefabEditLoadCommand.DEFAULT_PREFAB_ALIGNMENT.name());
                  builderx.set("#MainPage #RowSplitMode #Input.Value", PrefabEditLoadCommand.DEFAULT_ROW_SPLIT_MODE.name());
                  this.sendUpdate(builderx);
                  class="kw">return;
               }

               PrefabEditorCreationSettings.load(var3.configName).thenAccept(var1x -> {
                  if (var1x != null) {
                     this.resolvedRootDirectory = var1x.getPrefabRootDirectory();
                     UICommandBuilder builderx = new UICommandBuilder();
                     builderx.set("#MainPage #PrefabPaths #Input.Value", String.join(",", var1x.getUnprocessedPrefabPaths()));
                     builderx.set("#MainPage #Recursive #CheckBox.Value", var1x.isRecursive());
                     builderx.set("#MainPage #Children #CheckBox.Value", var1x.isLoadChildren());
                     builderx.set("#MainPage #Entities #CheckBox.Value", var1x.shouldLoadEntities());
                     builderx.set("#MainPage #EnableWorldTicking #CheckBox.Value", var1x.isWorldTickingEnabled());
                     builderx.set("#MainPage #DesiredYLevel #Input.Value", var1x.getPasteYLevelGoal());
                     builderx.set("#MainPage #BlocksBetweenPrefabs #Input.Value", var1x.getBlocksBetweenEachPrefab());
                     builderx.set("#MainPage #WorldGenType #Input.Value", var1x.getWorldGenType().name());
                     builderx.set("#MainPage #Environment #Input.Value", var1x.getEnvironment());
                     builderx.set("#MainPage #GrassTint #Input.Color", var1x.getGrassTint());
                     builderx.set("#MainPage #NumAirBeforeGround #Input.Value", var1x.getBlocksAboveSurface());
                     builderx.set("#MainPage #PasteAxis #Input.Value", var1x.getStackingAxis().name());
                     builderx.set("#MainPage #AlignmentMethod #Input.Value", var1x.getAlignment().name());
                     builderx.set("#MainPage #RowSplitMode #Input.Value", var1x.getRowSplitMode().name());
                     this.sendUpdate(builderx);
                  }
               });
               break;
            case Cancel:
               var4.getPageManager().setPage(var1, var2, Page.None);
               break;
            case CancelLoading:
               if (this.isShuttingDown) {
                  class="kw">return;
               }

               this.loadingCancelled = true;
               this.isLoading = false;
               this.isShuttingDown = true;
               UICommandBuilder var21 = new UICommandBuilder();
               var21.set("#LoadingPage #CancelButton.Disabled", true);
               var21.set("#LoadingPage #StatusText.TextSpans", Message.translation("server.commands.editprefab.loading.phase.cancelling"));
               var21.set("#LoadingPage #ProgressBar.Value", 0.1F);
               var21.set("#LoadingPage #ErrorText.Visible", false);
               this.sendUpdate(var21);
               PrefabEditSessionManager var32 = BuilderToolsPlugin.get().getPrefabEditSessionManager();
               if (this.loadingWorldName != null) {
                  String var37 = this.loadingWorldName;
                  this.loadingWorldName = null;
                  var32.cleanupCancelledSession(this.playerRef.getUuid(), var37, this::onShutdownProgress).whenComplete((var1x, var2x) -> {
                     this.isShuttingDown = false;
                     this.currentLoadingState = null;
                     UICommandBuilder builderx = new UICommandBuilder();
                     builderx.set("#LoadingPage.Visible", false);
                     builderx.set("#LoadingPage #CancelButton.Disabled", false);
                     builderx.set("#MainPage.Visible", true);
                     this.sendUpdate(builderx);
                     if (var2x != null) {
                        this.playerRef.sendMessage(Message.translation("server.commands.editprefab.error.shutdownFailed"));
                     }
                  });
               } else {
                  this.isShuttingDown = false;
                  this.currentLoadingState = null;
                  UICommandBuilder builderx = new UICommandBuilder();
                  builderx.set("#LoadingPage.Visible", false);
                  builderx.set("#MainPage.Visible", true);
                  this.sendUpdate(builderx);
               }
               break;
            case SavePropertiesNameChanged:
               UICommandBuilder var20 = new UICommandBuilder();
               var20.set("#SaveConfigPage #Buttons #SavePropertiesButton.Disabled", var3.configName.isBlank());
               this.sendUpdate(var20);
               break;
            case OpenBrowser: {
               this.inAssetsRoot = true;
               List var19 = PrefabStore.get().getAllBrowsablePrefabPaths();
               this.assetsCurrentDir = var19.size() == 1 ? Paths.get("HytaleAssets") : Paths.get("");
               this.browserRoot = Paths.get("Assets");
               this.browserCurrent = Paths.get("");
               this.selectedPath = null;
               this.browserSearchQuery = "";
               this.selectedItems.clear();
               UICommandBuilder var31 = new UICommandBuilder();
               UIEventBuilder var36 = new UIEventBuilder();
               var31.set("#MainPage.Visible", false);
               var31.set("#BrowserPage.Visible", true);
               var31.set("#BrowserPage #BrowserContent #RootSelector.Visible", false);
               var31.set("#BrowserPage #BrowserContent #SearchInput.Value", "");
               var31.set("#BrowserPage #SelectedSection #SelectedItems.Value", "");
               this.buildBrowserList(var31, var36);
               this.sendUpdate(var31, var36, false);
               break;
            }
            case BrowserHome: {
               if (this.inAssetsRoot) {
                  List var17 = PrefabStore.get().getAllBrowsablePrefabPaths();
                  this.assetsCurrentDir = var17.size() == 1 ? Paths.get("HytaleAssets") : Paths.get("");
               } else {
                  this.browserCurrent = this.browserRoot.getFileSystem().getPath("");
               }

               this.selectedPath = null;
               this.browserSearchQuery = "";
               UICommandBuilder var18 = new UICommandBuilder();
               UIEventBuilder var30 = new UIEventBuilder();
               var18.set("#BrowserPage #BrowserContent #SearchInput.Value", "");
               this.buildBrowserList(var18, var30);
               this.sendUpdate(var18, var30, false);
               break;
            }
            case BrowserNavigate:
               if (var3.browserFile == null) {
                  class="kw">return;
               }

               String var16 = var3.browserFile;
               if (this.inAssetsRoot) {
                  this.handleAssetsNavigation(var16);
               } else {
                  this.handleRegularNavigation(var16);
               }
               break;
            case BrowserRootChanged: {
               if (var3.browserRootStr == null) {
                  class="kw">return;
               }

               if (!this.isAllowedBrowserRoot(var3.browserRootStr)) {
                  class="kw">return;
               }

               this.inAssetsRoot = "Assets".equals(var3.browserRootStr);
               if (this.inAssetsRoot) {
                  List var14 = PrefabStore.get().getAllBrowsablePrefabPaths();
                  this.assetsCurrentDir = var14.size() == 1 ? Paths.get("HytaleAssets") : Paths.get("");
                  this.browserRoot = Paths.get("Assets");
                  this.browserCurrent = Paths.get("");
               } else {
                  this.browserRoot = this.findActualRootPath(var3.browserRootStr);
                  if (this.browserRoot == null) {
                     this.browserRoot = Path.of(var3.browserRootStr);
                  }

                  this.browserCurrent = this.browserRoot.getFileSystem().getPath("");
               }

               this.selectedPath = null;
               this.browserSearchQuery = "";
               this.selectedItems.clear();
               UICommandBuilder var15 = new UICommandBuilder();
               UIEventBuilder var29 = new UIEventBuilder();
               var15.set("#BrowserPage #BrowserContent #SearchInput.Value", "");
               var15.set("#BrowserPage #SelectedSection #SelectedItems.Value", "");
               PrefabRootDirectory var35 = this.getRootDirectoryForPath(var3.browserRootStr);
               if (var35 != null) {
                  this.resolvedRootDirectory = var35;
               }

               this.buildBrowserList(var15, var29);
               this.sendUpdate(var15, var29, false);
               break;
            }
            case BrowserSearch: {
               this.browserSearchQuery = var3.browserSearchStr != null ? var3.browserSearchStr.trim().toLowerCase(Locale.ROOT) : "";
               UICommandBuilder var13 = new UICommandBuilder();
               UIEventBuilder var28 = new UIEventBuilder();
               this.buildBrowserList(var13, var28);
               this.sendUpdate(var13, var28, false);
               break;
            }
            case AddFolderToList: {
               String var12 = this.getCurrentBrowserPath();
               if (!var12.isEmpty() && !this.selectedItems.contains(var12)) {
                  this.selectedItems.add(var12);
               }

               UICommandBuilder var27 = new UICommandBuilder();
               var27.set("#BrowserPage #SelectedSection #SelectedItems.Value", String.join("\n", this.selectedItems));
               this.sendUpdate(var27);
               break;
            }
            case ConfirmBrowser: {
               this.clearBrowserPreview();
               String var11;
               if (!this.selectedItems.isEmpty()) {
                  var11 = String.join(",", this.selectedItems);
               } else {
                  var11 = this.getCurrentBrowserPath();
               }

               UICommandBuilder var8 = new UICommandBuilder();
               var8.set("#MainPage #PrefabPaths #Input.Value", var11);
               PrefabRootDirectory var9 = this.inAssetsRoot ? PrefabRootDirectory.ASSET : this.getRootDirectoryForPath(this.browserRoot.toString());
               if (var9 != null) {
                  this.resolvedRootDirectory = var9;
               }

               var8.set("#BrowserPage.Visible", false);
               var8.set("#MainPage.Visible", true);
               this.sendUpdate(var8);
               break;
            }
            case CancelBrowser: {
               this.clearBrowserPreview();
               UICommandBuilder var7 = new UICommandBuilder();
               var7.set("#BrowserPage.Visible", false);
               var7.set("#MainPage.Visible", true);
               this.sendUpdate(var7);
            }
            case OpenPackBrowser:
            case ConfirmPackBrowser:
            case CancelPackBrowser:
            case OpenCreatePack:
            case CreatePack:
            case CancelCreatePack:
            case PackSearch:
            case PackSelect:
         }
      }
   }

   class="kw">private void onLoadingProgress(@Nonnull PrefabLoadingState var1) {
      if (!this.loadingCancelled) {
         this.currentLoadingState = var1;
         UICommandBuilder var2 = new UICommandBuilder();
         var2.set("#LoadingPage #ProgressBar.Value", var1.getProgressPercentage());
         var2.set("#LoadingPage #StatusText.TextSpans", var1.getStatusMessage());
         if (var1.hasErrors()) {
            var2.set("#LoadingPage #ErrorText.Visible", true);
            var2.set("#LoadingPage #ErrorText.TextSpans", var1.getErrors().getLast().toMessage());
            var2.set("#LoadingPage #CancelButton.Visible", true);
         }

         this.sendUpdate(var2);
      }
   }

   class="kw">private void showMainPageError(@Nonnull Message var1) {
      this.isLoading = false;
      this.loadingWorldName = null;
      this.currentLoadingState = null;
      UICommandBuilder var2 = new UICommandBuilder();
      var2.set("#LoadingPage.Visible", false);
      var2.set("#MainPage.Visible", true);
      var2.set("#MainPage #ErrorText.Visible", true);
      var2.set("#MainPage #ErrorText.TextSpans", var1);
      this.sendUpdate(var2);
   }

   class="kw">private void onLoadingFailed(@Nonnull Message var1) {
      this.isLoading = false;
      UICommandBuilder var2 = new UICommandBuilder();
      var2.set("#LoadingPage #ProgressBar.Value", 0.0F);
      var2.set("#LoadingPage #StatusText.TextSpans", Message.translation("server.commands.editprefab.loading.phase.error"));
      var2.set("#LoadingPage #ErrorText.Visible", true);
      var2.set("#LoadingPage #ErrorText.TextSpans", var1);
      var2.set("#LoadingPage #CancelButton.Visible", true);
      this.sendUpdate(var2);
   }

   class="kw">private void onShutdownProgress(@Nonnull PrefabLoadingState var1) {
      UICommandBuilder var2 = new UICommandBuilder();
      var2.set("#LoadingPage #ProgressBar.Value", var1.getProgressPercentage());
      var2.set("#LoadingPage #StatusText.TextSpans", var1.getStatusMessage());
      this.sendUpdate(var2);
   }

   class="kw">private void handleAssetsNavigation(@Nonnull String var1) {
      if ("..".equals(var1)) {
         if (!this.assetsCurrentDir.toString().isEmpty()) {
            Path var7 = this.assetsCurrentDir.getParent();
            this.assetsCurrentDir = var7 != null ? var7 : Paths.get("");
            this.selectedPath = null;
            UICommandBuilder var8 = new UICommandBuilder();
            UIEventBuilder var9 = new UIEventBuilder();
            this.buildBrowserList(var8, var9);
            this.sendUpdate(var8, var9, false);
         }
      } else {
         String var2 = this.assetsCurrentDir.toString().replace('\\', '/');
         String var3 = var2.isEmpty() ? var1 : var2 + "/" + var1;
         Path var4 = this.assetProvider.resolveVirtualPath(var3);
         if (var4 == null) {
            this.sendUpdate();
         } else {
            if (Files.isDirectory(var4)) {
               this.assetsCurrentDir = Paths.get(var3);
               this.selectedPath = var3 + "/";
               this.clearBrowserPreview();
               UICommandBuilder var5 = new UICommandBuilder();
               UIEventBuilder var6 = new UIEventBuilder();
               this.buildBrowserList(var5, var6);
               this.sendUpdate(var5, var6, false);
            } else {
               this.selectedPath = var3;
               this.sendBrowserPreview(this.assetProvider.resolveVirtualPath(var3));
               UICommandBuilder var10 = new UICommandBuilder();
               var10.set("#BrowserPage #CurrentPath.Text", toNodeEditorPathOrVirtual(var3));
               this.sendUpdate(var10);
            }
         }
      }
   }

   class="kw">private void handleRegularNavigation(@Nonnull String var1) {
      Path var2 = this.browserRoot.resolve(this.browserCurrent).resolve(var1);
      if (!PathUtil.isChildOf(this.browserRoot, var2)) {
         this.sendUpdate();
      } else {
         if (Files.isDirectory(var2)) {
            this.browserCurrent = PathUtil.relativize(this.browserRoot, var2);
            String var3 = this.browserCurrent.toString().replace('\\', '/');
            this.selectedPath = var3.isEmpty() ? "/" : (var3.endsWith("/") ? var3 : var3 + "/");
            this.clearBrowserPreview();
            UICommandBuilder var4 = new UICommandBuilder();
            UIEventBuilder var5 = new UIEventBuilder();
            this.buildBrowserList(var4, var5);
            this.sendUpdate(var4, var5, false);
         } else {
            this.selectedPath = PathUtil.relativize(this.browserRoot, var2).toString().replace('\\', '/');
            this.sendBrowserPreview(var2);
            UICommandBuilder var6 = new UICommandBuilder();
            var6.set("#BrowserPage #CurrentPath.Text", this.selectedPath);
            this.sendUpdate(var6);
         }
      }
   }

   @Nonnull
   class="kw">private class="kw">static String toNodeEditorPathOrVirtual(@Nonnull String var0) {
      String var1 = AssetPrefabFileProvider.toNodeEditorPath(var0);
      class="kw">return var1 != null ? var1 : "assets/";
   }

   class="kw">private String getCurrentBrowserPath() {
      if (this.selectedPath != null) {
         class="kw">return this.selectedPath;
      } else if (this.inAssetsRoot) {
         String var2 = this.assetsCurrentDir.toString().replace('\\', '/');
         class="kw">return var2.isEmpty() ? "/" : (var2.endsWith("/") ? var2 : var2 + "/");
      } else {
         String var1 = this.browserCurrent.toString().replace('\\', '/');
         class="kw">return var1.isEmpty() ? "/" : (var1.endsWith("/") ? var1 : var1 + "/");
      }
   }

   class="kw">private void sendBrowserPreview(@Nullable Path var1) {
      if (var1 == null || !Files.isRegularFile(var1)) {
         this.clearBrowserPreview();
      } else if (!var1.equals(this.previewedBrowserPath)) {
         this.previewedBrowserPath = var1;

         try {
            BlockSelection var2 = PrefabStore.get().getPrefab(var1);
            this.sendBrowserPreviewPacket(var2);
         } catch (PrefabLoadException var3) {
            this.sendBrowserPreviewPacket(null);
         }
      }
   }

   class="kw">private void clearBrowserPreview() {
      if (this.previewedBrowserPath != null) {
         this.previewedBrowserPath = null;
         this.sendBrowserPreviewPacket(null);
      }
   }

   class="kw">private void sendBrowserPreviewPacket(@Nullable BlockSelection var1) {
      BuilderToolPrefabPreview var2 = new BuilderToolPrefabPreview();
      if (var1 != null) {
         var2.tilt = 23;
         var2.spinSpeed = 27;
         var2.previewScale = 100;
         if (var1.getBlockCount() > 4000000) {
            var2.blocksOmitted = true;
            var2.bounds = var1.toEditorSelectionBounds();
         } else {
            EditorBlocksChange var3 = var1.toPacket();
            var2.blocksChange = var3.blocksChange;
            var2.fluidsChange = var3.fluidsChange;
            var2.entityChanges = var3.entityChanges;
         }

         this.applyTintFromPlayerPosition(var2);
      }

      this.playerRef.getPacketHandler().write(var2);
   }

   class="kw">private void applyTintFromPlayerPosition(@Nonnull BuilderToolPrefabPreview var1) {
      Ref var2 = this.playerRef.getReference();
      if (var2 == null) {
         var1.biomeTint = DEFAULT_BIOME_TINT;
         var1.waterTint = DEFAULT_WATER_TINT;
      } else {
         Store var3 = var2.getStore();
         World var4 = var3.getExternalData().getWorld();
         Vector3d var5 = this.playerRef.getTransform().getPosition();
         int var6 = MathUtil.floor(var5.x);
         int var7 = MathUtil.floor(var5.y);
         int var8 = MathUtil.floor(var5.z);
         long var9 = ChunkUtil.indexChunkFromBlock(var6, var8);
         WorldChunk var11 = var4.getNonTickingChunk(var9);
         if (var11 != null && var11.getBlockChunk() != null) {
            BlockChunk var12 = var11.getBlockChunk();
            var1.biomeTint = var12.getTint(var6, var8);
            int var13 = var12.getEnvironment(var6, var7, var8);
            Environment var14 = Environment.getAssetMap().getAsset(var13);
            if (var14 != null) {
               Color var15 = var14.getWaterTint();
               if (var15 != null) {
                  var1.waterTint = (var15.red & 255) << 16 | (var15.green & 255) << 8 | var15.blue & 255;
                  class="kw">return;
               }
            }

            var1.waterTint = DEFAULT_WATER_TINT;
         } else {
            var1.biomeTint = DEFAULT_BIOME_TINT;
            var1.waterTint = DEFAULT_WATER_TINT;
         }
      }
   }

   class="kw">private void buildBrowserList(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2) {
      var1.clear("#BrowserPage #BrowserContent #FileList");
      if (this.inAssetsRoot) {
         this.buildAssetsBrowserList(var1, var2);
      } else {
         this.buildRegularBrowserList(var1, var2);
      }
   }

   class="kw">private void buildAssetsBrowserList(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2) {
      String var3 = this.assetsCurrentDir.toString().replace('\\', '/');
      String var4 = var3.isEmpty() ? "" : var3 + "/";
      var1.set("#BrowserPage #CurrentPath.Text", var4.isEmpty() ? "Asset Packs" : toNodeEditorPathOrVirtual(var4));
      List var5 = this.assetProvider.getFiles(this.assetsCurrentDir, this.browserSearchQuery);
      int var6 = 0;
      if (!var3.isEmpty() && this.browserSearchQuery.isEmpty()) {
         var1.append("#BrowserPage #BrowserContent #FileList", "Pages/BasicTextButton.ui");
         var1.set("#BrowserPage #BrowserContent #FileList[0].Text", "../");
         var2.addEventBinding(
            CustomUIEventBindingType.Activating,
            "#BrowserPage #BrowserContent #FileList[0]",
            new EventData().append("Action", PrefabEditorLoadSettingsPage.Action.BrowserNavigate.name()).append("File", "..")
         );
         var6++;
      }

      for (FileListProvider.FileEntry var8 : var5) {
         String var9 = var8.isDirectory() ? var8.displayName() + "/" : var8.displayName();
         String var10 = "#BrowserPage #BrowserContent #FileList[" + var6 + "]";
         var1.append("#BrowserPage #BrowserContent #FileList", "Pages/BasicTextButton.ui");
         var1.set(var10 + ".Text", var9);
         if (!var8.isDirectory()) {
            var1.set(var10 + ".Style", BUTTON_HIGHLIGHTED);
         }

         var2.addEventBinding(
            CustomUIEventBindingType.Activating,
            var10,
            new EventData().append("Action", PrefabEditorLoadSettingsPage.Action.BrowserNavigate.name()).append("File", var8.name())
         );
         var6++;
      }
   }

   class="kw">private void buildRegularBrowserList(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2) {
      String var3 = this.getRootDisplayPath(this.browserRoot);
      String var4 = this.browserCurrent.toString().replace('\\', '/');
      String var5 = var4.isEmpty() ? var3 : var3 + "/" + var4;
      var1.set("#BrowserPage #CurrentPath.Text", var5);
      List var6 = new ObjectArrayList();
      Path var7 = this.browserRoot.resolve(this.browserCurrent);
      if (Files.isDirectory(var7)) {
         try (DirectoryStream var8 = Files.newDirectoryStream(var7)) {
            for (Path var10 : var8) {
               String var11 = var10.getFileName().toString();
               if (var11.charAt(0) == '/') {
                  var11 = var11.substring(1);
               }

               if ((PrefabStore.isPrefabFileName(var11) || Files.isDirectory(var10))
                  && (this.browserSearchQuery.isEmpty() || var11.toLowerCase(Locale.ROOT).contains(this.browserSearchQuery))) {
                  var6.add(var10.toFile());
               }
            }
         } catch (IOException var16) {
            ((HytaleLogger.Api)((HytaleLogger.Api)LOGGER.atSevere()).withCause(var16)).log("Error reading directory for browser");
         }
      }

      var6.sort((var0, var1x) -> {
         if (var0.isDirectory() == var1x.isDirectory()) {
            class="kw">return var0.compareTo(var1x);
         } else {
            class="kw">return var0.isDirectory() ? -1 : 1;
         }
      });
      int var17 = 0;
      if (!this.browserCurrent.toString().isEmpty() && this.browserSearchQuery.isEmpty()) {
         var1.append("#BrowserPage #BrowserContent #FileList", "Pages/BasicTextButton.ui");
         var1.set("#BrowserPage #BrowserContent #FileList[0].Text", "../");
         var2.addEventBinding(
            CustomUIEventBindingType.Activating,
            "#BrowserPage #BrowserContent #FileList[0]",
            new EventData().append("Action", PrefabEditorLoadSettingsPage.Action.BrowserNavigate.name()).append("File", "..")
         );
         var17++;
      }

      for (File var19 : var6) {
         boolean var20 = var19.isDirectory();
         String var12 = var19.getName();
         String var13 = "#BrowserPage #BrowserContent #FileList[" + var17 + "]";
         var1.append("#BrowserPage #BrowserContent #FileList", "Pages/BasicTextButton.ui");
         var1.set(var13 + ".Text", !var20 ? var12 : var12 + "/");
         if (!var20) {
            var1.set(var13 + ".Style", BUTTON_HIGHLIGHTED);
         }

         var2.addEventBinding(
            CustomUIEventBindingType.Activating,
            var13,
            new EventData().append("Action", PrefabEditorLoadSettingsPage.Action.BrowserNavigate.name()).append("File", var12)
         );
         var17++;
      }
   }

   @Nonnull
   class="kw">private List<DropdownEntryInfo> buildBrowserRootEntries() {
      List var1 = new ObjectArrayList();
      var1.add(new DropdownEntryInfo(LocalizableString.fromString("Assets"), "Assets"));
      class="kw">return var1;
   }

   @Nullable
   class="kw">private Path findActualRootPath(@Nonnull String var1) {
      for (PrefabStore.AssetPackPrefabPath var3 : PrefabStore.get().getAllBrowsablePrefabPaths()) {
         if (var3.prefabsPath().toString().equals(var1)) {
            class="kw">return var3.prefabsPath();
         }
      }

      class="kw">return PrefabStore.get().getWorldGenPrefabsPath().toString().equals(var1) ? PrefabStore.get().getWorldGenPrefabsPath() : null;
   }

   @Nullable
   class="kw">private AssetPack findAssetPackForPath(@Nonnull String var1) {
      Path var2 = Path.of(var1).toAbsolutePath().normalize();

      for (AssetPack var4 : AssetModule.get().getAssetPacks()) {
         Path var5 = PrefabStore.get().getAssetPrefabsPathForPack(var4).toAbsolutePath().normalize();
         if (var2.equals(var5) || var2.startsWith(var5)) {
            class="kw">return var4;
         }
      }

      class="kw">return null;
   }

   @Nullable
   class="kw">private PrefabRootDirectory getRootDirectoryForPath(@Nonnull String var1) {
      if ("Assets".equals(var1)) {
         class="kw">return PrefabRootDirectory.ASSET;
      } else if (var1.equals(PrefabStore.get().getServerPrefabsPath().toString())) {
         class="kw">return PrefabRootDirectory.ASSET;
      } else if (var1.equals(PrefabStore.get().getWorldGenPrefabsPath().toString())) {
         class="kw">return PrefabRootDirectory.WORLDGEN;
      } else {
         class="kw">return this.findAssetPackForPath(var1) != null ? PrefabRootDirectory.ASSET : null;
      }
   }

   class="kw">private boolean isAllowedBrowserRoot(@Nonnull String var1) {
      class="kw">return SingleplayerModule.isOwner(this.playerRef) ? true : this.getRootDirectoryForPath(var1) != null;
   }

   @Nonnull
   class="kw">private String getRootDisplayPath(@Nonnull Path var1) {
      String var2 = var1.toString();
      if (var2.equals(PrefabStore.get().getServerPrefabsPath().toString())) {
         class="kw">return "ServerRoot/" + var1.getFileName();
      } else if (var2.equals(PrefabStore.get().getWorldGenPrefabsPath().toString())) {
         Path var6 = var1.getParent();
         class="kw">return var6 != null && var6.getFileName() != null
            ? "WorldgenRoot/" + var6.getFileName() + "/" + var1.getFileName()
            : "WorldgenRoot/" + var1.getFileName();
      } else {
         AssetPack var3 = this.findAssetPackForPath(var2);
         if (var3 != null) {
            String var4 = var3.equals(AssetModule.get().getBaseAssetPack()) ? "HytaleAssets" : "[" + var3.getName() + "]";
            Path var5 = var1.getParent();
            class="kw">return var5 != null && var5.getFileName() != null ? var4 + "/" + var5.getFileName() + "/" + var1.getFileName() : var4 + "/" + var1.getFileName();
         } else {
            class="kw">return var1.toString();
         }
      }
   }

   class="kw">public enum Action {
      Load,
      OpenSavePropertiesDialog,
      CancelSavePropertiesDialog,
      SavePropertiesConfig,
      ApplySavedProperties,
      Cancel,
      CancelLoading,
      SavePropertiesNameChanged,
      OpenBrowser,
      BrowserHome,
      BrowserNavigate,
      BrowserRootChanged,
      BrowserSearch,
      AddFolderToList,
      ConfirmBrowser,
      CancelBrowser,
      OpenPackBrowser,
      ConfirmPackBrowser,
      CancelPackBrowser,
      OpenCreatePack,
      CreatePack,
      CancelCreatePack,
      PackSearch,
      PackSelect;

      Action() {
      }
   }

   class="kw">protected class="kw">static class PageData {
      class="kw">public class="kw">static class="kw">final String CONFIG_NAME = "@ConfigName";
      class="kw">public class="kw">static class="kw">final String ROOT_DIR = "@RootDir";
      class="kw">public class="kw">static class="kw">final String PREFAB_PATHS = "@PrefabPaths";
      class="kw">public class="kw">static class="kw">final String RECURSIVE = "@Recursive";
      class="kw">public class="kw">static class="kw">final String CHILDREN = "@Children";
      class="kw">public class="kw">static class="kw">final String ENTITIES = "@Entities";
      class="kw">public class="kw">static class="kw">final String ENABLE_WORLD_TICKING = "@EnableWorldTicking";
      class="kw">public class="kw">static class="kw">final String DESIRED_Y_LEVEL = "@DesiredYLevel";
      class="kw">public class="kw">static class="kw">final String BLOCKS_BETWEEN_PREFABS = "@BlocksBetweenPrefabs";
      class="kw">public class="kw">static class="kw">final String WORLD_GEN_TYPE = "@WorldGenType";
      class="kw">public class="kw">static class="kw">final String ENVIRONMENT = "@Environment";
      class="kw">public class="kw">static class="kw">final String GRASS_TINT = "@GrassTint";
      class="kw">public class="kw">static class="kw">final String NUM_AIR_BEFORE_GROUND = "@NumAirBeforeGround";
      class="kw">public class="kw">static class="kw">final String PASTE_AXIS = "@PasteAxis";
      class="kw">public class="kw">static class="kw">final String ALIGNMENT_METHOD = "@AlignmentMethod";
      class="kw">public class="kw">static class="kw">final String ROW_SPLIT_MODE = "@RowSplitMode";
      class="kw">public class="kw">static class="kw">final String BROWSER_FILE = "File";
      class="kw">public class="kw">static class="kw">final String BROWSER_ROOT = "@BrowserRoot";
      class="kw">public class="kw">static class="kw">final String BROWSER_SEARCH = "@BrowserSearch";
      class="kw">public class="kw">static class="kw">final BuilderCodec<PrefabEditorLoadSettingsPage.PageData> CODEC = BuilderCodec.builder(
            PrefabEditorLoadSettingsPage.PageData.class, PrefabEditorLoadSettingsPage.PageData::new
         )
         .append(
            new KeyedCodec<>("Action", new EnumCodec<>(PrefabEditorLoadSettingsPage.Action.class, EnumCodec.EnumStyle.LEGACY)),
            (var0, var1) -> var0.uiAction = var1,
            var0 -> var0.uiAction
         )
         .add()
         .append(new KeyedCodec<>("@ConfigName", Codec.STRING), (var0, var1) -> var0.configName = var1, var0 -> var0.configName)
         .add()
         .append(
            new KeyedCodec<>("@RootDir", new EnumCodec<>(PrefabRootDirectory.class, EnumCodec.EnumStyle.LEGACY)),
            (var0, var1) -> var0.prefabRootDirectory = var1,
            var0 -> var0.prefabRootDirectory
         )
         .add()
         .append(new KeyedCodec<>("@PrefabPaths", Codec.STRING), (var0, var1) -> var0.unprocessedPrefabPaths = var1, var0 -> var0.unprocessedPrefabPaths)
         .add()
         .append(new KeyedCodec<>("@DesiredYLevel", Codec.INTEGER), (var0, var1) -> var0.pasteYLevelGoal = var1, var0 -> var0.pasteYLevelGoal)
         .add()
         .append(
            new KeyedCodec<>("@BlocksBetweenPrefabs", Codec.INTEGER), (var0, var1) -> var0.blocksBetweenEachPrefab = var1, var0 -> var0.blocksBetweenEachPrefab
         )
         .add()
         .append(
            new KeyedCodec<>("@WorldGenType", new EnumCodec<>(WorldGenType.class, EnumCodec.EnumStyle.LEGACY)),
            (var0, var1) -> var0.worldGenType = var1,
            var0 -> var0.worldGenType
         )
         .add()
         .append(new KeyedCodec<>("@Environment", Codec.STRING), (var0, var1) -> var0.environment = var1, var0 -> var0.environment)
         .add()
         .append(new KeyedCodec<>("@GrassTint", Codec.STRING), (var0, var1) -> var0.grassTint = var1, var0 -> var0.grassTint)
         .add()
         .append(new KeyedCodec<>("@NumAirBeforeGround", Codec.INTEGER), (var0, var1) -> var0.blocksAboveSurface = var1, var0 -> var0.blocksAboveSurface)
         .add()
         .append(
            new KeyedCodec<>("@PasteAxis", new EnumCodec<>(PrefabStackingAxis.class, EnumCodec.EnumStyle.LEGACY)),
            (var0, var1) -> var0.stackingAxis = var1,
            var0 -> var0.stackingAxis
         )
         .add()
         .append(
            new KeyedCodec<>("@AlignmentMethod", new EnumCodec<>(PrefabAlignment.class, EnumCodec.EnumStyle.LEGACY)),
            (var0, var1) -> var0.alignment = var1,
            var0 -> var0.alignment
         )
         .add()
         .append(
            new KeyedCodec<>("@RowSplitMode", new EnumCodec<>(PrefabRowSplitMode.class, EnumCodec.EnumStyle.LEGACY)),
            (var0, var1) -> var0.rowSplitMode = var1,
            var0 -> var0.rowSplitMode
         )
         .add()
         .append(new KeyedCodec<>("@Recursive", Codec.BOOLEAN), (var0, var1) -> var0.recursive = var1, var0 -> var0.recursive)
         .add()
         .append(new KeyedCodec<>("@Children", Codec.BOOLEAN), (var0, var1) -> var0.loadChildren = var1, var0 -> var0.loadChildren)
         .add()
         .append(new KeyedCodec<>("@Entities", Codec.BOOLEAN), (var0, var1) -> var0.loadEntities = var1, var0 -> var0.loadEntities)
         .add()
         .append(new KeyedCodec<>("@EnableWorldTicking", Codec.BOOLEAN), (var0, var1) -> var0.enableWorldTicking = var1, var0 -> var0.enableWorldTicking)
         .add()
         .append(new KeyedCodec<>("File", Codec.STRING), (var0, var1) -> var0.browserFile = var1, var0 -> var0.browserFile)
         .add()
         .append(new KeyedCodec<>("@BrowserRoot", Codec.STRING), (var0, var1) -> var0.browserRootStr = var1, var0 -> var0.browserRootStr)
         .add()
         .append(new KeyedCodec<>("@BrowserSearch", Codec.STRING), (var0, var1) -> var0.browserSearchStr = var1, var0 -> var0.browserSearchStr)
         .add()
         .append(new KeyedCodec<>("Pack", Codec.STRING), (var0, var1) -> var0.packBrowserData.pack = var1, var0 -> var0.packBrowserData.pack)
         .add()
         .append(new KeyedCodec<>("@PackSearch", Codec.STRING), (var0, var1) -> var0.packBrowserData.search = var1, var0 -> var0.packBrowserData.search)
         .add()
         .append(new KeyedCodec<>("@CreateName", Codec.STRING), (var0, var1) -> var0.packBrowserData.createName = var1, var0 -> var0.packBrowserData.createName)
         .add()
         .append(
            new KeyedCodec<>("@CreateGroup", Codec.STRING), (var0, var1) -> var0.packBrowserData.createGroup = var1, var0 -> var0.packBrowserData.createGroup
         )
         .add()
         .append(
            new KeyedCodec<>("@CreateDescription", Codec.STRING),
            (var0, var1) -> var0.packBrowserData.createDescription = var1,
            var0 -> var0.packBrowserData.createDescription
         )
         .add()
         .append(
            new KeyedCodec<>("@CreateVersion", Codec.STRING),
            (var0, var1) -> var0.packBrowserData.createVersion = var1,
            var0 -> var0.packBrowserData.createVersion
         )
         .add()
         .append(
            new KeyedCodec<>("@CreateWebsite", Codec.STRING),
            (var0, var1) -> var0.packBrowserData.createWebsite = var1,
            var0 -> var0.packBrowserData.createWebsite
         )
         .add()
         .append(
            new KeyedCodec<>("@CreateAuthorName", Codec.STRING),
            (var0, var1) -> var0.packBrowserData.createAuthorName = var1,
            var0 -> var0.packBrowserData.createAuthorName
         )
         .add()
         .append(
            new KeyedCodec<>("ValidateCreate", Codec.STRING),
            (var0, var1) -> var0.packBrowserData.validateCreate = var1,
            var0 -> var0.packBrowserData.validateCreate
         )
         .add()
         .build();
      class="kw">public String configName;
      class="kw">public PrefabEditorLoadSettingsPage.Action uiAction;
      class="kw">public PrefabRootDirectory prefabRootDirectory = PrefabRootDirectory.ASSET;
      class="kw">public String unprocessedPrefabPaths = "";
      class="kw">public int pasteYLevelGoal = 55;
      class="kw">public int blocksBetweenEachPrefab = 15;
      class="kw">public WorldGenType worldGenType = PrefabEditLoadCommand.DEFAULT_WORLD_GEN_TYPE;
      class="kw">public String environment = "Env_Zone1_Plains";
      class="kw">public String grassTint = "#5B9E28";
      class="kw">public int blocksAboveSurface = 0;
      class="kw">public PrefabStackingAxis stackingAxis = PrefabEditLoadCommand.DEFAULT_PREFAB_STACKING_AXIS;
      class="kw">public PrefabAlignment alignment = PrefabEditLoadCommand.DEFAULT_PREFAB_ALIGNMENT;
      class="kw">public PrefabRowSplitMode rowSplitMode = PrefabEditLoadCommand.DEFAULT_ROW_SPLIT_MODE;
      class="kw">public boolean recursive;
      class="kw">public boolean loadChildren;
      class="kw">public boolean loadEntities;
      class="kw">public boolean enableWorldTicking = false;
      class="kw">public String browserFile;
      class="kw">public String browserRootStr;
      class="kw">public String browserSearchStr;
      class="kw">public class="kw">final AssetPackSaveBrowserEventData packBrowserData = new AssetPackSaveBrowserEventData();

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

      @Nonnull
      class="kw">public PrefabEditorCreationSettings toCreationSettings() {
         String var1 = this.grassTint;
         if (var1 != null && var1.length() > 7) {
            var1 = var1.substring(0, 7);
         }

         class="kw">return new PrefabEditorCreationSettings(
            this.prefabRootDirectory,
            List.of(this.unprocessedPrefabPaths.split(",", 0)),
            this.pasteYLevelGoal,
            this.blocksBetweenEachPrefab,
            this.worldGenType,
            this.blocksAboveSurface,
            this.stackingAxis,
            this.alignment,
            this.recursive,
            this.loadChildren,
            this.loadEntities,
            this.enableWorldTicking,
            this.rowSplitMode,
            this.environment,
            var1
         );
      }
   }
}