PrefabEditorSaveSettingsPage class

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

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

extends: InteractiveCustomUIPage<PrefabEditorSaveSettingsPage.PageData>

Поля (119)

МодификаторыТипИмя
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
final HytaleLogger LOGGER
public static final String PREFABS_TO_SAVE
public static final String PREFAB_UUID
Save, Cancel, SelectAll, SelectEdited, OpenBrowser, BrowserSearch, BrowserTogglePrefab, BrowserSelectAll, ConfirmBrowser, CancelBrowser, BackFromSaving, ConfirmOverwrite, CancelOverwrite, RemoveSupportChanged, SetupSupportChanged, OpenPackBrowser, ConfirmPackBrowser, CancelPackBrowser, OpenCreatePack, CreatePack, CancelCreatePack, PackSearch, PackSelect
public static final String REMOVE_SUPPORT
public static final String SETUP_SUPPORT
public PrefabEditorSaveSettingsPage.Action action
break
break
break
break
break
break
break
break
break
break
break
break
break
break
break
public String browserSearchStr
UICommandBuilder commandBuilderx
UICommandBuilder commandBuilderx
UICommandBuilder commandBuilderx
public boolean compressed
public boolean empty
public boolean entities
UIEventBuilder eventBuilderx
public final AssetPackSaveBrowserEventData packBrowserData
public String prefabUuid
public String prefabsToSave
public boolean removeSupport
return
return
return
return
return
return
return
public boolean setupSupport
List var10
boolean var10
boolean var11
World var11
String var12
int var12
String var13
CompletableFuture[] var13
var14
String var14
AtomicInteger var14
String var15
int var16
PrefabEditingMetadata var16
String var17
Path var17
PrefabEditSessionManager var18
Path var19
World var19
AssetPack var2
UICommandBuilder var2
UICommandBuilder var20
String var20
UICommandBuilder var21
UICommandBuilder var22
List var23
UICommandBuilder var25
UUID var26
UICommandBuilder var27
UICommandBuilder var28
String var29
Map var3
PrefabStore var3
String var30
String var31
UICommandBuilder var32
UIEventBuilder var34
UIEventBuilder var36
UIEventBuilder var37
UICommandBuilder var38
UICommandBuilder var39
Player var4
List var4
var4
var4
Path var4
int var4
PrefabSaverSettings var40
String[] var42
ObjectArrayList var43
UICommandBuilder var45
Path var48
Player var5
PlayerRef var5
Object2IntMap var5
long var5
PrefabEditingMetadata var6
AssetPackSaveBrowser.ActionResult var6
String var7
UICommandBuilder var7
float var7
AssetPack var8
String var8
int var8
UICommandBuilder var8
int var8
String var9
var9
var9
var9
int var9
int var9

Методы (36)

МодификаторыВозвратСигнатура
Action Action()
public PageDatapublic PageData()
private void buildPrefabListvoid buildPrefabList(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2)
private void executeSavevoid executeSave(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, @Nonnull Player var3, @Nonnull PlayerRef var4, @Nonnull PrefabSaverSettings var5, @Nonnull List<PrefabEditingMetadata> var6)
for for(String var14 : var42)
for for(PrefabEditingMetadata var46 : var10)
for for(PrefabEditingMetadata var18 : var4)
for for(PrefabEditingMetadata var10 : var6)
for for(int var15 = 0; var15 < var12; var15++)
for for(CompletableFuture var13 : var13)
public void handleDataEventvoid handleDataEvent(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, @Nonnull PrefabEditorSaveSettingsPage.PageData var3)
if if(this.exitOnSave)
if if(var6 != null)
if if(var5 != null)
if if(var6 != null)
if if(var8 != null)
if if(var6 != null)
if if(this.isSaving)
if if(var4 != null)
if if(var3.setupSupport)
if if(var3.compressed)
if if(var3.prefabUuid != null)
if if(this.isSaving || this.pendingSaveSettings == null || this.pendingSavePrefabs == null)
if if(var3.removeSupport)
if if(var3.setupSupport)
if if(var9 > 0)
if if(var11)
if if(var10)
if if(var8 > 0)
if if(var5 - this.lastProgressUpdateTime >= 100L || var4 == var12)
if if(var9 == 0)
if if(this.exitOnSave)
private void onSavingFailedvoid onSavingFailed(@Nonnull Message var1)
abstract super super(var1, CustomPageLifetime.CanDismissOrCloseThroughInteraction, PrefabEditorSaveSettingsPage.PageData.CODEC)
switch switch(var3.action)
abstract this this(var1, var2, false)

Исходный код

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