PageData class

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

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

Поля (19)

МодификаторыТипИмя
public static final String BROWSER_SEARCH
public static final BuilderCodec<PrefabEditorSaveSettingsPage.PageData> CODEC
public static final String COMPRESSED
public static final String EMPTY
public static final String ENTITIES
public static final String PREFABS_TO_SAVE
public static final String PREFAB_UUID
public static final String REMOVE_SUPPORT
public static final String SETUP_SUPPORT
public PrefabEditorSaveSettingsPage.Action action
public String browserSearchStr
public boolean compressed
public boolean empty
public boolean entities
public final AssetPackSaveBrowserEventData packBrowserData
public String prefabUuid
public String prefabsToSave
public boolean removeSupport
public boolean setupSupport

Исходный код

Показать/скрыть
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.PrefabEditSession;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.PrefabEditSessionManager;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.PrefabEditingMetadata;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.saving.PrefabSaver;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.saving.PrefabSaverSettings;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.saving.SupportMode;
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.StringCompareUtil;
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.protocol.packets.interface_.CustomPageLifetime;
class="kw">import com.hypixel.hytale.protocol.packets.interface_.CustomUIEventBindingType;
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.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.entity.entities.player.pages.InteractiveCustomUIPage;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabFormat;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabStore;
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.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.Universe;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import it.unimi.dsi.fastutil.objects.Object2IntMap;
class="kw">import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.nio.file.Path;
class="kw">import java.util.Comparator;
class="kw">import java.util.HashSet;
class="kw">import java.util.List;
class="kw">import java.util.Locale;
class="kw">import java.util.Map;
class="kw">import java.util.Set;
class="kw">import java.util.UUID;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.atomic.AtomicInteger;
class="kw">import java.util.stream.Collectors;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class PrefabEditorSaveSettingsPage class="kw">extends InteractiveCustomUIPage<PrefabEditorSaveSettingsPage.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 Value<String> BUTTON_SELECTED = Value.ref("Pages/BasicTextButton.ui", "SelectedLabelStyle");
   @Nonnull
   class="kw">private class="kw">final PrefabEditSession prefabEditSession;
   class="kw">private class="kw">final AssetPackSaveBrowser packBrowser = new AssetPackSaveBrowser(AssetPackSaveBrowserConfig.defaults());
   class="kw">private class="kw">final boolean exitOnSave;
   class="kw">private class="kw">volatile boolean isSaving = false;
   class="kw">private class="kw">volatile long lastProgressUpdateTime = 0L;
   class="kw">private class="kw">static class="kw">final long PROGRESS_UPDATE_INTERVAL_MS = 100L;
   @Nullable
   class="kw">private PrefabSaverSettings pendingSaveSettings;
   @Nullable
   class="kw">private List<PrefabEditingMetadata> pendingSavePrefabs;
   @Nonnull
   class="kw">private String browserSearchQuery = "";
   class="kw">private class="kw">final Set<UUID> selectedPrefabUuids = new HashSet<>();

   class="kw">public PrefabEditorSaveSettingsPage(@Nonnull PlayerRef var1, @Nonnull PrefabEditSession var2) {
      this(var1, var2, false);
   }

   class="kw">public PrefabEditorSaveSettingsPage(@Nonnull PlayerRef var1, @Nonnull PrefabEditSession var2, boolean var3) {
      super(var1, CustomPageLifetime.CanDismissOrCloseThroughInteraction, PrefabEditorSaveSettingsPage.PageData.CODEC);
      this.prefabEditSession = var2;
      this.exitOnSave = var3;
   }

   @Override
   class="kw">public void build(@Nonnull Ref<EntityStore> var1, @Nonnull UICommandBuilder var2, @Nonnull UIEventBuilder var3, @Nonnull Store<EntityStore> var4) {
      var2.append("Pages/PrefabEditorSaveSettings.ui");
      if (this.exitOnSave) {
         var2.set("#MainPage #TitleLabel.Text", Message.translation("server.customUI.prefabEditorSaveSettings.titleSaveAndExit"));
         var2.set("#MainPage #SaveButton.Text", Message.translation("server.customUI.prefabEditorSaveSettings.saveAndExit"));
      }

      Player var5 = var4.getComponent(var1, Player.getComponentType());
      PrefabEditingMetadata var6 = this.prefabEditSession.getSelectedPrefab(this.playerRef.getUuid());
      if (var6 != null) {
         String var7 = this.toDisplayPath(var6);
         var2.set("#MainPage #PrefabsToSave #Input.Value", var7);
         this.selectedPrefabUuids.add(var6.getUuid());
      }

      if (var5 != null) {
         String var9 = null;
         if (var6 != null) {
            AssetPack var8 = PrefabStore.get().findAssetPackForPrefabPath(var6.getPrefabPath());
            if (var8 != null) {
               if (!var8.isImmutable()) {
                  var9 = var8.getName();
               }
            } else if (!var6.isReadOnly()) {
               var9 = BuilderToolsUserData.get(var5).getLastSavePack();
            }
         } else {
            var9 = BuilderToolsUserData.get(var5).getLastSavePack();
         }

         this.packBrowser.setSelectedPackKey(var9);
         if (var9 != null && !this.packBrowser.hasSelectedPack()) {
            this.playerRef.sendMessage(Message.translation("server.customUI.assetPackBrowser.packNoLongerAvailable"));
         }
      }

      var2.set("#MainPage #Entities #CheckBox.Value", true);
      var2.set("#MainPage #Empty #CheckBox.Value", false);
      var2.set("#MainPage #RemoveSupport #CheckBox.Value", false);
      var2.set("#MainPage #SetupSupport #CheckBox.Value", false);
      var2.set("#MainPage #Compressed #CheckBox.Value", false);
      if (this.packBrowser.hasSelectedPack()) {
         var2.set("#MainPage #SelectedPackLabel.Text", this.packBrowser.getSelectedPackDisplayName());
      }

      var2.set("#PackBrowserPage.Visible", false);
      var2.set("#CreatePackPage.Visible", false);
      var2.set("#SavingPage.Visible", false);
      var2.set("#SavingPage #ProgressBar.Value", 0.0F);
      var2.set("#SavingPage #StatusText.TextSpans", Message.translation("server.commands.editprefab.save.saving"));
      var2.set("#SavingPage #ErrorText.Visible", false);
      var2.set("#OverwriteConfirmPage.Visible", false);
      var3.addEventBinding(
         CustomUIEventBindingType.Activating,
         "#MainPage #SaveButton",
         new EventData()
            .append("Action", PrefabEditorSaveSettingsPage.Action.Save.name())
            .append("@PrefabsToSave", "#MainPage #PrefabsToSave #Input.Value")
            .append("@Entities", "#MainPage #Entities #CheckBox.Value")
            .append("@Empty", "#MainPage #Empty #CheckBox.Value")
            .append("@RemoveSupport", "#MainPage #RemoveSupport #CheckBox.Value")
            .append("@SetupSupport", "#MainPage #SetupSupport #CheckBox.Value")
            .append("@Compressed", "#MainPage #Compressed #CheckBox.Value"),
         false
      );
      var3.addEventBinding(
         CustomUIEventBindingType.Activating, "#MainPage #CancelButton", new EventData().append("Action", PrefabEditorSaveSettingsPage.Action.Cancel.name())
      );
      var3.addEventBinding(
         CustomUIEventBindingType.Activating,
         "#MainPage #PrefabsToSave #BrowseButton",
         new EventData().append("Action", PrefabEditorSaveSettingsPage.Action.OpenBrowser.name())
      );
      var3.addEventBinding(
         CustomUIEventBindingType.Activating,
         "#MainPage #PrefabsToSave #SelectAllButton",
         new EventData().append("Action", PrefabEditorSaveSettingsPage.Action.SelectAll.name())
      );
      var3.addEventBinding(
         CustomUIEventBindingType.Activating,
         "#MainPage #PrefabsToSave #SelectEditedButton",
         new EventData().append("Action", PrefabEditorSaveSettingsPage.Action.SelectEdited.name())
      );
      var3.addEventBinding(
         CustomUIEventBindingType.ValueChanged,
         "#BrowserPage #SearchInput",
         new EventData().append("Action", PrefabEditorSaveSettingsPage.Action.BrowserSearch.name()).append("@BrowserSearch", "#BrowserPage #SearchInput.Value"),
         false
      );
      var3.addEventBinding(
         CustomUIEventBindingType.Activating,
         "#BrowserPage #BrowserButtons #SelectAllBrowserButton",
         new EventData().append("Action", PrefabEditorSaveSettingsPage.Action.BrowserSelectAll.name())
      );
      var3.addEventBinding(
         CustomUIEventBindingType.Activating,
         "#BrowserPage #BrowserButtons #ConfirmButton",
         new EventData().append("Action", PrefabEditorSaveSettingsPage.Action.ConfirmBrowser.name())
      );
      var3.addEventBinding(
         CustomUIEventBindingType.Activating,
         "#BrowserPage #BrowserButtons #CancelButton",
         new EventData().append("Action", PrefabEditorSaveSettingsPage.Action.CancelBrowser.name())
      );
      var3.addEventBinding(
         CustomUIEventBindingType.Activating,
         "#SavingPage #BackButton",
         new EventData().append("Action", PrefabEditorSaveSettingsPage.Action.BackFromSaving.name())
      );
      var3.addEventBinding(
         CustomUIEventBindingType.ValueChanged,
         "#MainPage #RemoveSupport #CheckBox",
         new EventData()
            .append("Action", PrefabEditorSaveSettingsPage.Action.RemoveSupportChanged.name())
            .append("@RemoveSupport", "#MainPage #RemoveSupport #CheckBox.Value"),
         false
      );
      var3.addEventBinding(
         CustomUIEventBindingType.ValueChanged,
         "#MainPage #SetupSupport #CheckBox",
         new EventData()
            .append("Action", PrefabEditorSaveSettingsPage.Action.SetupSupportChanged.name())
            .append("@SetupSupport", "#MainPage #SetupSupport #CheckBox.Value"),
         false
      );
      var3.addEventBinding(
         CustomUIEventBindingType.Activating,
         "#OverwriteConfirmPage #ConfirmOverwriteButton",
         new EventData().append("Action", PrefabEditorSaveSettingsPage.Action.ConfirmOverwrite.name()),
         false
      );
      var3.addEventBinding(
         CustomUIEventBindingType.Activating,
         "#OverwriteConfirmPage #CancelOverwriteButton",
         new EventData().append("Action", PrefabEditorSaveSettingsPage.Action.CancelOverwrite.name()),
         false
      );
      this.packBrowser.buildEventBindings(var3, "#MainPage #BrowsePackButton");
      this.packBrowser.buildUI(var2, var3);
      var2.set("#BrowserPage.Visible", false);
   }

   class="kw">public void handleDataEvent(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, @Nonnull PrefabEditorSaveSettingsPage.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.action != null ? var3.action.name() : null, var3.packBrowserData, "#MainPage #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.action) {
            case Save:
               if (this.isSaving) {
                  class="kw">return;
               }

               if (this.packBrowser.getSelectedPack() == null) {
                  this.playerRef.sendMessage(Message.translation("server.customUI.assetPackBrowser.packRequired"));
                  class="kw">return;
               }

               if (!AssetModule.get().validatePackExistsOnDisk(this.packBrowser.getSelectedPack())) {
                  this.playerRef.sendMessage(Message.translation("server.customUI.assetPackBrowser.packRequired"));
                  class="kw">return;
               }

               if (var4 != null) {
                  BuilderToolsUserData.get(var4).setLastSavePack(this.packBrowser.getSelectedPack().getName());
               }

               String var31 = var3.prefabsToSave;
               if (var31 == null || var31.isBlank()) {
                  this.playerRef.sendMessage(Message.translation("server.commands.editprefab.save.noPrefabsSelected"));
                  class="kw">return;
               }

               PrefabSaverSettings var40 = new PrefabSaverSettings();
               var40.setBlocks(true);
               var40.setEntities(var3.entities);
               var40.setEmpty(var3.empty);
               var40.setOverwriteExisting(false);
               if (var3.setupSupport) {
                  var40.setSupportMode(SupportMode.CALCULATE);
               } else if (var3.removeSupport) {
                  var40.setSupportMode(SupportMode.REMOVE);
               }

               if (var3.compressed) {
                  var40.setPrefabFormat(PrefabFormat.COMPRESSED);
               }

               String[] var42 = var31.split("[,\\n]", 0);
               List var10 = new ObjectArrayList();

               for (String var14 : var42) {
                  var14 = var14.trim();
                  if (!var14.isEmpty()) {
                     for (PrefabEditingMetadata var16 : this.prefabEditSession.getLoadedPrefabMetadata().values()) {
                        String var17 = var16.getPrefabPath().toString().replace('\\', '/');
                        if (var17.equals(var14) || var17.endsWith(var14)) {
                           var10.add(var16);
                           break;
                        }
                     }
                  }
               }

               if (var10.isEmpty()) {
                  this.onSavingFailed(Message.translation("server.commands.editprefab.save.noPrefabsFound"));
                  class="kw">return;
               }

               ObjectArrayList var43 = new ObjectArrayList();

               for (PrefabEditingMetadata var46 : var10) {
                  Path var48 = this.getWritableSavePath(var46);
                  if (PrefabStore.get().prefabExists(var48)) {
                     var43.add(var48.getFileName().toString());
                  }
               }

               if (!var43.isEmpty()) {
                  this.pendingSaveSettings = var40;
                  this.pendingSavePrefabs = var10;
                  UICommandBuilder var45 = new UICommandBuilder();
                  var45.set("#MainPage.Visible", false);
                  var45.set("#OverwriteConfirmPage.Visible", true);
                  if (var43.size() == 1) {
                     var45.set(
                        "#OverwriteConfirmPage #MessageText.TextSpans",
                        Message.translation("server.customUI.prefabEditorSaveSettings.overwriteConfirm.messageSingle").param("name", (String)var43.getFirst())
                     );
                  } else {
                     var45.set(
                        "#OverwriteConfirmPage #MessageText.TextSpans",
                        Message.translation("server.customUI.prefabEditorSaveSettings.overwriteConfirm.messageMultiple")
                     );
                  }

                  this.sendUpdate(var45);
                  class="kw">return;
               }

               this.executeSave(var1, var2, var4, var5, var40, var10);
               break;
            case Cancel:
               var4.getPageManager().setPage(var1, var2, Page.None);
               break;
            case SelectAll: {
               String var30 = this.prefabEditSession.getLoadedPrefabMetadata().values().stream().map(this::toDisplayPath).collect(Collectors.joining("\n"));
               UICommandBuilder var39 = new UICommandBuilder();
               var39.set("#MainPage #PrefabsToSave #Input.Value", var30);
               this.sendUpdate(var39);
               break;
            }
            case SelectEdited: {
               String var29 = this.prefabEditSession
                  .getLoadedPrefabMetadata()
                  .values()
                  .stream()
                  .filter(PrefabEditingMetadata::isDirty)
                  .map(this::toDisplayPath)
                  .collect(Collectors.joining("\n"));
               UICommandBuilder var38 = new UICommandBuilder();
               var38.set("#MainPage #PrefabsToSave #Input.Value", var29);
               this.sendUpdate(var38);
               if (var29.isEmpty()) {
                  this.playerRef.sendMessage(Message.translation("server.commands.editprefab.save.noEditedPrefabs"));
               }
               break;
            }
            case OpenBrowser: {
               this.browserSearchQuery = "";
               this.selectedPrefabUuids.clear();
               UICommandBuilder var28 = new UICommandBuilder();
               UIEventBuilder var37 = new UIEventBuilder();
               var28.set("#MainPage.Visible", false);
               var28.set("#BrowserPage.Visible", true);
               var28.set("#BrowserPage #SearchInput.Value", "");
               this.buildPrefabList(var28, var37);
               this.sendUpdate(var28, var37, false);
               break;
            }
            case BrowserSearch: {
               this.browserSearchQuery = var3.browserSearchStr != null ? var3.browserSearchStr.trim().toLowerCase(Locale.ROOT) : "";
               UICommandBuilder var27 = new UICommandBuilder();
               UIEventBuilder var36 = new UIEventBuilder();
               this.buildPrefabList(var27, var36);
               this.sendUpdate(var27, var36, false);
               break;
            }
            case BrowserTogglePrefab:
               if (var3.prefabUuid != null) {
                  try {
                     UUID var26 = UUID.fromString(var3.prefabUuid);
                     if (this.selectedPrefabUuids.contains(var26)) {
                        this.selectedPrefabUuids.remove(var26);
                     } else {
                        this.selectedPrefabUuids.add(var26);
                     }

                     UICommandBuilder commandBuilderx = new UICommandBuilder();
                     UIEventBuilder eventBuilderx = new UIEventBuilder();
                     this.buildPrefabList(commandBuilderx, eventBuilderx);
                     this.sendUpdate(commandBuilderx, eventBuilderx, false);
                  } catch (IllegalArgumentException var18) {
                  }
               }
               break;
            case BrowserSelectAll: {
               this.selectedPrefabUuids.clear();

               for (PrefabEditingMetadata var33 : this.prefabEditSession.getLoadedPrefabMetadata().values()) {
                  this.selectedPrefabUuids.add(var33.getUuid());
               }

               UICommandBuilder var25 = new UICommandBuilder();
               UIEventBuilder var34 = new UIEventBuilder();
               this.buildPrefabList(var25, var34);
               this.sendUpdate(var25, var34, false);
               break;
            }
            case ConfirmBrowser: {
               List var23 = new ObjectArrayList();

               for (PrefabEditingMetadata var9 : this.prefabEditSession.getLoadedPrefabMetadata().values()) {
                  if (this.selectedPrefabUuids.contains(var9.getUuid())) {
                     var23.add(this.toDisplayPath(var9));
                  }
               }

               UICommandBuilder var32 = new UICommandBuilder();
               var32.set("#MainPage #PrefabsToSave #Input.Value", String.join("\n", var23));
               var32.set("#BrowserPage.Visible", false);
               var32.set("#MainPage.Visible", true);
               this.sendUpdate(var32);
               break;
            }
            case CancelBrowser: {
               UICommandBuilder var22 = new UICommandBuilder();
               var22.set("#BrowserPage.Visible", false);
               var22.set("#MainPage.Visible", true);
               this.sendUpdate(var22);
               break;
            }
            case BackFromSaving: {
               this.isSaving = false;
               UICommandBuilder var21 = new UICommandBuilder();
               var21.set("#SavingPage.Visible", false);
               var21.set("#MainPage.Visible", true);
               this.sendUpdate(var21);
               break;
            }
            case ConfirmOverwrite:
               if (this.isSaving || this.pendingSaveSettings == null || this.pendingSavePrefabs == null) {
                  class="kw">return;
               }

               this.pendingSaveSettings.setOverwriteExisting(true);
               this.executeSave(var1, var2, var4, var5, this.pendingSaveSettings, this.pendingSavePrefabs);
               this.pendingSaveSettings = null;
               this.pendingSavePrefabs = null;
               break;
            case CancelOverwrite: {
               this.pendingSaveSettings = null;
               this.pendingSavePrefabs = null;
               UICommandBuilder var20 = new UICommandBuilder();
               var20.set("#OverwriteConfirmPage.Visible", false);
               var20.set("#MainPage.Visible", true);
               this.sendUpdate(var20);
               break;
            }
            case RemoveSupportChanged:
               if (var3.removeSupport) {
                  UICommandBuilder commandBuilderx = new UICommandBuilder();
                  commandBuilderx.set("#MainPage #SetupSupport #CheckBox.Value", false);
                  this.sendUpdate(commandBuilderx, null, false);
               }
               break;
            case SetupSupportChanged:
               if (var3.setupSupport) {
                  UICommandBuilder commandBuilderx = new UICommandBuilder();
                  commandBuilderx.set("#MainPage #RemoveSupport #CheckBox.Value", false);
                  this.sendUpdate(commandBuilderx, null, false);
               }
            case OpenPackBrowser:
            case ConfirmPackBrowser:
            case CancelPackBrowser:
            case OpenCreatePack:
            case CreatePack:
            case CancelCreatePack:
            case PackSearch:
            case PackSelect:
         }
      }
   }

   class="kw">private void buildPrefabList(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2) {
      var1.clear("#BrowserPage #FileList");
      Map var3 = this.prefabEditSession.getLoadedPrefabMetadata();
      if (!var3.isEmpty()) {
         List var4;
         if (!this.browserSearchQuery.isEmpty()) {
            Object2IntMap var5 = new Object2IntOpenHashMap(var3.size());

            for (PrefabEditingMetadata var7 : var3.values()) {
               String var8 = PrefabStore.stripPrefabSuffix(var7.getPrefabPath().getFileName().toString());
               int var9 = StringCompareUtil.getFuzzyDistance(var8, this.browserSearchQuery, Locale.ENGLISH);
               if (var9 > 0) {
                  var5.put(var7, var9);
               }
            }

            var4 = var5.keySet().stream().sorted(Comparator.comparingInt(var5::getInt).reversed()).collect(Collectors.toList());
         } else {
            var4 = var3.values()
               .stream()
               .sorted(Comparator.comparing(var0 -> var0.getPrefabPath().getFileName().toString().toLowerCase(Locale.ROOT)))
               .collect(Collectors.toList());
         }

         int var16 = 0;

         for (PrefabEditingMetadata var18 : var4) {
            Path var19 = var18.getPrefabPath();
            String var20 = PrefabStore.stripPrefabSuffix(var19.getFileName().toString());
            boolean var10 = this.selectedPrefabUuids.contains(var18.getUuid());
            boolean var11 = var18.isReadOnly();
            String var12 = var10 ? "[x] " : "[ ] ";
            String var13 = var19.toString().replace('\\', '/');
            String var14 = var11 ? var13 + "\n(Will save to Server/Prefabs)" : var13;
            var1.append("#BrowserPage #FileList", "Pages/BasicTextButton.ui");
            String var15 = "#BrowserPage #FileList[" + var16 + "]";
            if (var11) {
               var1.set(var15 + ".Text", Message.raw(var12 + var20 + " ").insert(Message.translation("server.customUI.assetPackBrowser.readOnly")));
            } else {
               var1.set(var15 + ".Text", var12 + var20);
            }

            var1.set(var15 + ".TooltipText", var14);
            if (var10) {
               var1.set(var15 + ".Style", BUTTON_SELECTED);
            }

            var2.addEventBinding(
               CustomUIEventBindingType.Activating,
               var15,
               new EventData()
                  .append("Action", PrefabEditorSaveSettingsPage.Action.BrowserTogglePrefab.name())
                  .append("PrefabUuid", var18.getUuid().toString())
            );
            var16++;
         }
      }
   }

   @Nonnull
   class="kw">private String toDisplayPath(@Nonnull PrefabEditingMetadata var1) {
      class="kw">return PrefabStore.get().getRelativePrefabPath(var1.getPrefabPath()).toString().replace('\\', '/');
   }

   @Nonnull
   class="kw">private Path getWritableSavePath(@Nonnull PrefabEditingMetadata var1) {
      AssetPack var2 = this.packBrowser.getSelectedPack();
      assert var2 != null;
      PrefabStore var3 = PrefabStore.get();
      Path var4 = var3.getAssetPrefabsPathForPack(var2);
      class="kw">return var4.resolve(var3.getRelativePrefabPath(var1.getPrefabPath())).toAbsolutePath().normalize();
   }

   class="kw">private void executeSave(
      @Nonnull Ref<EntityStore> var1,
      @Nonnull Store<EntityStore> var2,
      @Nonnull Player var3,
      @Nonnull PlayerRef var4,
      @Nonnull PrefabSaverSettings var5,
      @Nonnull List<PrefabEditingMetadata> var6
   ) {
      this.isSaving = true;
      UICommandBuilder var7 = new UICommandBuilder();
      var7.set("#MainPage.Visible", false);
      var7.set("#BrowserPage.Visible", false);
      var7.set("#OverwriteConfirmPage.Visible", false);
      var7.set("#SavingPage.Visible", true);
      var7.set("#SavingPage #ProgressBar.Value", 0.0F);
      var7.set("#SavingPage #StatusText.TextSpans", Message.translation("server.commands.editprefab.save.saving"));
      var7.set("#SavingPage #ErrorText.Visible", false);
      var7.set("#SavingPage #BackButton.Visible", false);
      this.sendUpdate(var7);
      int var8 = 0;

      for (PrefabEditingMetadata var10 : var6) {
         if (var10.isReadOnly()) {
            var8++;
         }
      }

      if (var8 > 0) {
         this.playerRef.sendMessage(Message.translation("server.commands.editprefab.save.readOnlyRedirect").param("count", var8));
      }

      PrefabEditSessionManager var18 = BuilderToolsPlugin.get().getPrefabEditSessionManager();
      World var19 = var2.getExternalData().getWorld();
      World var11 = Universe.get().getWorld(var18.getPrefabEditSession(this.playerRef.getUuid()).getWorldName());
      int var12 = var6.size();
      CompletableFuture[] var13 = new CompletableFuture[var12];
      AtomicInteger var14 = new AtomicInteger(0);
      this.lastProgressUpdateTime = 0L;

      for (int var15 = 0; var15 < var12; var15++) {
         PrefabEditingMetadata var16 = var6.get(var15);
         Path var17 = this.getWritableSavePath(var16);
         var13[var15] = PrefabSaver.savePrefab(
               var4,
               var11,
               var17,
               var16.getAnchorPoint(),
               var16.getMinPoint(),
               var16.getMaxPoint(),
               var16.getPastePosition(),
               var16.getOriginalFileAnchor(),
               var5
            )
            .thenApply(
               var3x -> {
                  int var4 = var14.incrementAndGet();
                  long var5 = System.currentTimeMillis();
                  if (var5 - this.lastProgressUpdateTime >= 100L || var4 == var12) {
                     this.lastProgressUpdateTime = var5;
                     float var7 = (float)var4 / var12;
                     UICommandBuilder var8 = new UICommandBuilder();
                     var8.set("#SavingPage #ProgressBar.Value", var7);
                     var8.set(
                        "#SavingPage #StatusText.TextSpans",
                        Message.translation("server.commands.editprefab.save.progress").param("current", var4).param("total", var12)
                     );
                     this.sendUpdate(var8);
                  }

                  class="kw">return (Path)var3x;
               }
            );
      }

      CompletableFuture.allOf(var13).thenAccept(var7x -> {
         int var8 = 0;
         int var9 = 0;

         for (CompletableFuture var13 : var13) {
            if (var13.join() != null) {
               var8++;
            } else {
               var9++;
            }
         }

         this.isSaving = false;
         if (var9 == 0) {
            this.playerRef.sendMessage(Message.translation("server.commands.editprefab.save.saveAll.success").param("successes", var8).param("failures", var9));
            var3.getPageManager().setPage(var1, var2, Page.None);
            if (this.exitOnSave) {
               var18.exitEditSession(var1, var19, this.playerRef, var2);
            }
         } else {
            this.onSavingFailed(Message.translation("server.commands.editprefab.save.saveAll.success").param("successes", var8).param("failures", var9));
         }
      }).exceptionally(var1x -> {
         this.isSaving = false;
         ((HytaleLogger.Api)((HytaleLogger.Api)LOGGER.atWarning()).withCause(var1x)).log("Error saving prefabs");
         this.onSavingFailed(Message.raw(var1x.getMessage() != null ? var1x.getMessage() : "Unknown error"));
         class="kw">return null;
      });
   }

   class="kw">private void onSavingFailed(@Nonnull Message var1) {
      this.isSaving = false;
      UICommandBuilder var2 = new UICommandBuilder();
      var2.set("#SavingPage #ProgressBar.Value", 0.0F);
      var2.set("#SavingPage #StatusText.TextSpans", Message.translation("server.commands.editprefab.save.error"));
      var2.set("#SavingPage #ErrorText.Visible", true);
      var2.set("#SavingPage #ErrorText.TextSpans", var1);
      var2.set("#SavingPage #BackButton.Visible", true);
      this.sendUpdate(var2);
   }

   class="kw">public enum Action {
      Save,
      Cancel,
      SelectAll,
      SelectEdited,
      OpenBrowser,
      BrowserSearch,
      BrowserTogglePrefab,
      BrowserSelectAll,
      ConfirmBrowser,
      CancelBrowser,
      BackFromSaving,
      ConfirmOverwrite,
      CancelOverwrite,
      RemoveSupportChanged,
      SetupSupportChanged,
      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 PREFABS_TO_SAVE = "@PrefabsToSave";
      class="kw">public class="kw">static class="kw">final String ENTITIES = "@Entities";
      class="kw">public class="kw">static class="kw">final String EMPTY = "@Empty";
      class="kw">public class="kw">static class="kw">final String REMOVE_SUPPORT = "@RemoveSupport";
      class="kw">public class="kw">static class="kw">final String SETUP_SUPPORT = "@SetupSupport";
      class="kw">public class="kw">static class="kw">final String COMPRESSED = "@Compressed";
      class="kw">public class="kw">static class="kw">final String BROWSER_SEARCH = "@BrowserSearch";
      class="kw">public class="kw">static class="kw">final String PREFAB_UUID = "PrefabUuid";
      class="kw">public class="kw">static class="kw">final BuilderCodec<PrefabEditorSaveSettingsPage.PageData> CODEC = BuilderCodec.builder(
            PrefabEditorSaveSettingsPage.PageData.class, PrefabEditorSaveSettingsPage.PageData::new
         )
         .append(
            new KeyedCodec<>("Action", new EnumCodec<>(PrefabEditorSaveSettingsPage.Action.class, EnumCodec.EnumStyle.LEGACY)),
            (var0, var1) -> var0.action = var1,
            var0 -> var0.action
         )
         .add()
         .append(new KeyedCodec<>("@PrefabsToSave", Codec.STRING), (var0, var1) -> var0.prefabsToSave = var1, var0 -> var0.prefabsToSave)
         .add()
         .append(new KeyedCodec<>("@Entities", Codec.BOOLEAN), (var0, var1) -> var0.entities = var1, var0 -> var0.entities)
         .add()
         .append(new KeyedCodec<>("@Empty", Codec.BOOLEAN), (var0, var1) -> var0.empty = var1, var0 -> var0.empty)
         .add()
         .append(new KeyedCodec<>("@RemoveSupport", Codec.BOOLEAN), (var0, var1) -> var0.removeSupport = var1, var0 -> var0.removeSupport)
         .add()
         .append(new KeyedCodec<>("@SetupSupport", Codec.BOOLEAN), (var0, var1) -> var0.setupSupport = var1, var0 -> var0.setupSupport)
         .add()
         .append(new KeyedCodec<>("@Compressed", Codec.BOOLEAN), (var0, var1) -> var0.compressed = var1, var0 -> var0.compressed)
         .add()
         .append(new KeyedCodec<>("@BrowserSearch", Codec.STRING), (var0, var1) -> var0.browserSearchStr = var1, var0 -> var0.browserSearchStr)
         .add()
         .append(new KeyedCodec<>("PrefabUuid", Codec.STRING), (var0, var1) -> var0.prefabUuid = var1, var0 -> var0.prefabUuid)
         .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 PrefabEditorSaveSettingsPage.Action action;
      class="kw">public String prefabsToSave;
      class="kw">public boolean entities = true;
      class="kw">public boolean empty = false;
      class="kw">public boolean removeSupport;
      class="kw">public boolean setupSupport;
      class="kw">public boolean compressed;
      class="kw">public String browserSearchStr;
      class="kw">public String prefabUuid;
      class="kw">public class="kw">final AssetPackSaveBrowserEventData packBrowserData = new AssetPackSaveBrowserEventData();

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