Action enum

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

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

Поля (1)

МодификаторыТипИмя
Save, Cancel, SelectAll, SelectEdited, OpenBrowser, BrowserSearch, BrowserTogglePrefab, BrowserSelectAll, ConfirmBrowser, CancelBrowser, BackFromSaving, ConfirmOverwrite, CancelOverwrite, RemoveSupportChanged, SetupSupportChanged, OpenPackBrowser, ConfirmPackBrowser, CancelPackBrowser, OpenCreatePack, CreatePack, CancelCreatePack, PackSearch, PackSelect

Исходный код

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