PageData class

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

Файл: com/hypixel/hytale/builtin/blockspawner/ui/BlockSpawnerSettingsPage.java

Поля (16)

МодификаторыТипИмя
public static final BuilderCodec<BlockSpawnerSettingsPage.PageData> CODEC
public static final String KEY_ACTION
public static final String KEY_ASSET_NAME
public static final String KEY_FIELD
public static final String KEY_INDEX
public static final String KEY_SPAWNER_ASSET
public static final String KEY_VALUE_NUM
public static final String KEY_VALUE_STR
private String action
private String assetName
private String field
private String index
private final AssetPackSaveBrowserEventData packBrowserData
private String spawnerAsset
private Double valueNum
private String valueStr

Исходный код

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

class="kw">import com.hypixel.hytale.assetstore.AssetPack;
class="kw">import com.hypixel.hytale.assetstore.AssetRegistry;
class="kw">import com.hypixel.hytale.assetstore.AssetStore;
class="kw">import com.hypixel.hytale.assetstore.map.DefaultAssetMap;
class="kw">import com.hypixel.hytale.builtin.blockspawner.BlockSpawnerEntry;
class="kw">import com.hypixel.hytale.builtin.blockspawner.BlockSpawnerTable;
class="kw">import com.hypixel.hytale.builtin.blockspawner.state.BlockSpawner;
class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.ExtraInfo;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
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.logger.sentry.SkipSentryException;
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.server.core.HytaleServer;
class="kw">import com.hypixel.hytale.server.core.Message;
class="kw">import com.hypixel.hytale.server.core.asset.AssetModule;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.Item;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.ItemDropList;
class="kw">import com.hypixel.hytale.server.core.entity.entities.player.pages.InteractiveCustomUIPage;
class="kw">import com.hypixel.hytale.server.core.modules.block.BlockModule;
class="kw">import com.hypixel.hytale.server.core.ui.DropdownEntryInfo;
class="kw">import com.hypixel.hytale.server.core.ui.LocalizableString;
class="kw">import com.hypixel.hytale.server.core.ui.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.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.core.util.BsonUtil;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.nio.file.Files;
class="kw">import java.nio.file.Path;
class="kw">import java.util.ArrayList;
class="kw">import java.util.List;
class="kw">import java.util.Map.Entry;
class="kw">import java.util.logging.Level;
class="kw">import java.util.regex.Pattern;
class="kw">import java.util.stream.Collectors;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.bson.BsonArray;
class="kw">import org.bson.BsonDocument;
class="kw">import org.bson.BsonDouble;
class="kw">import org.bson.BsonString;
class="kw">import org.bson.BsonValue;

class="kw">public class BlockSpawnerSettingsPage class="kw">extends InteractiveCustomUIPage<BlockSpawnerSettingsPage.PageData> {
   @Nonnull
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">private class="kw">static class="kw">final String MAIN_PAGE = "Pages/BlockSpawner/BlockSpawnerMainPage.ui";
   class="kw">private class="kw">static class="kw">final String EDIT_SPAWNER_PAGE = "Pages/BlockSpawner/BlockSpawnerCreateSpawnerPage.ui";
   class="kw">private class="kw">static class="kw">final String SPAWNER_ENTRY_ROW = "Pages/BlockSpawner/BlockSpawnerSpawnerEntryRow.ui";
   class="kw">private class="kw">static class="kw">final String FURNITURE_CONTAINER_CATEGORY = "Furniture.Containers";
   class="kw">private class="kw">static class="kw">final Pattern ASSET_NAME_PATTERN = Pattern.compile("^[A-Za-z0-9_]+$");
   class="kw">private class="kw">final BlockModule.BlockStateInfo info;
   class="kw">private class="kw">final BlockSpawner state;
   class="kw">private class="kw">final AssetPackSaveBrowser packBrowser = new AssetPackSaveBrowser(AssetPackSaveBrowserConfig.defaults());
   class="kw">private BlockSpawnerSettingsPage.Mode mode = BlockSpawnerSettingsPage.Mode.MAIN;
   class="kw">private String editingId;
   class="kw">private class="kw">final List<BsonDocument> spawnerEntries = new ArrayList<>();
   class="kw">private String statusKey;

   class="kw">public BlockSpawnerSettingsPage(
      @Nonnull PlayerRef var1, @Nonnull BlockModule.BlockStateInfo var2, @Nonnull BlockSpawner var3, @Nonnull CustomPageLifetime var4
   ) {
      super(var1, var4, BlockSpawnerSettingsPage.PageData.CODEC);
      this.info = var2;
      this.state = var3;
   }

   @Override
   class="kw">public void build(@Nonnull Ref<EntityStore> var1, @Nonnull UICommandBuilder var2, @Nonnull UIEventBuilder var3, @Nonnull Store<EntityStore> var4) {
      class="kw">switch (this.mode) {
         case MAIN:
            this.buildMain(var2, var3);
            break;
         case EDIT_SPAWNER:
            this.buildEditSpawner(var2, var3);
      }

      this.applyStatus(var2);
   }

   class="kw">private void buildMain(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2) {
      var1.append("Pages/BlockSpawner/BlockSpawnerMainPage.ui");
      var1.set("#SpawnerAsset.Entries", assetDropdownEntries(BlockSpawnerTable.getAssetMap().getAssetMap().keySet()));
      if (this.state.getBlockSpawnerId() != null) {
         var1.set("#SpawnerAsset.Value", this.state.getBlockSpawnerId());
      }

      var2.addEventBinding(
         CustomUIEventBindingType.Activating,
         "#SaveButton",
         new EventData().append("Action", BlockSpawnerSettingsPage.Action.APPLY.name()).append("@SpawnerAsset", "#SpawnerAsset.Value")
      );
      var2.addEventBinding(
         CustomUIEventBindingType.Activating,
         "#CreateSpawnerButton",
         new EventData().append("Action", BlockSpawnerSettingsPage.Action.GOTO_EDIT_SPAWNER.name()),
         false
      );
   }

   class="kw">private void buildEditSpawner(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2) {
      var1.append("Pages/BlockSpawner/BlockSpawnerCreateSpawnerPage.ui");
      var1.set("#EditExisting.Entries", assetDropdownEntries(BlockSpawnerTable.getAssetMap().getAssetMap().keySet()));
      if (this.editingId != null) {
         var1.set("#EditExisting.Value", this.editingId);
      }

      this.buildSpawnerEntries(var1, var2);
      this.bindEditorChrome(var2, BlockSpawnerSettingsPage.Action.SPAWNER_ADD);
      this.bindSaveDialog(var1, var2);
   }

   class="kw">private void bindEditorChrome(@Nonnull UIEventBuilder var1, BlockSpawnerSettingsPage.Action var2) {
      var1.addEventBinding(
         CustomUIEventBindingType.ValueChanged,
         "#EditExisting",
         new EventData().append("Action", BlockSpawnerSettingsPage.Action.LOAD_EXISTING.name()).append("@ValueStr", "#EditExisting.Value"),
         false
      );
      var1.addEventBinding(
         CustomUIEventBindingType.Activating, "#NewButton", new EventData().append("Action", BlockSpawnerSettingsPage.Action.NEW_ASSET.name()), false
      );
      if (var2 != null) {
         var1.addEventBinding(CustomUIEventBindingType.Activating, "#AddEntryButton", new EventData().append("Action", var2.name()), false);
      }

      var1.addEventBinding(
         CustomUIEventBindingType.Activating, "#SaveButton", new EventData().append("Action", BlockSpawnerSettingsPage.Action.OPEN_SAVE.name()), false
      );
      var1.addEventBinding(
         CustomUIEventBindingType.Activating, "#DeleteButton", new EventData().append("Action", BlockSpawnerSettingsPage.Action.DELETE.name()), false
      );
      var1.addEventBinding(
         CustomUIEventBindingType.Activating, "#CancelButton", new EventData().append("Action", BlockSpawnerSettingsPage.Action.GOTO_MAIN.name()), false
      );
   }

   class="kw">private void bindSaveDialog(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2) {
      this.packBrowser.buildUI(var1, var2);
      this.packBrowser.buildEventBindings(var2, "#BrowsePackButton");
      var2.addEventBinding(
         CustomUIEventBindingType.ValueChanged,
         "#SaveAssetName #Input",
         new EventData().append("Action", BlockSpawnerSettingsPage.Action.SAVE_NAME_CHANGED.name()).append("@AssetName", "#SaveAssetName #Input.Value"),
         false
      );
      var2.addEventBinding(
         CustomUIEventBindingType.Activating,
         "#ConfirmSaveButton",
         new EventData().append("Action", BlockSpawnerSettingsPage.Action.CONFIRM_SAVE.name()).append("@AssetName", "#SaveAssetName #Input.Value"),
         false
      );
      var2.addEventBinding(
         CustomUIEventBindingType.Activating, "#CancelSaveButton", new EventData().append("Action", BlockSpawnerSettingsPage.Action.CANCEL_SAVE.name()), false
      );
   }

   class="kw">private void buildSpawnerEntries(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2) {
      List var3 = furnitureContainerBlockEntries();
      List var4 = assetDropdownEntries(ItemDropList.getAssetMap().getAssetMap().keySet());

      for (int var5 = 0; var5 < this.spawnerEntries.size(); var5++) {
         BsonDocument var6 = this.spawnerEntries.get(var5);
         String var7 = "#EntryList[" + var5 + "]";
         String var8 = Integer.toString(var5);
         var1.append("#EntryList", "Pages/BlockSpawner/BlockSpawnerSpawnerEntryRow.ui");
         var1.set(var7 + " #Name.Entries", var3);
         var1.set(var7 + " #Name.Value", getString(var6, "Name", ""));
         var1.set(var7 + " #Weight.Value", getDouble(var6, "Weight", 100.0));
         var1.set(var7 + " #Droplist.Entries", var4);
         var1.set(var7 + " #Droplist.Value", extractDroplistId(var6));
         var2.addEventBinding(
            CustomUIEventBindingType.ValueChanged,
            var7 + " #Name",
            fieldUpdate(var8, BlockSpawnerSettingsPage.Field.SP_NAME, "@ValueStr", var7 + " #Name.Value"),
            false
         );
         var2.addEventBinding(
            CustomUIEventBindingType.ValueChanged,
            var7 + " #Weight",
            fieldUpdate(var8, BlockSpawnerSettingsPage.Field.SP_WEIGHT, "@ValueNum", var7 + " #Weight.Value"),
            false
         );
         var2.addEventBinding(
            CustomUIEventBindingType.ValueChanged,
            var7 + " #Droplist",
            fieldUpdate(var8, BlockSpawnerSettingsPage.Field.SP_DROPLIST, "@ValueStr", var7 + " #Droplist.Value"),
            false
         );
         var2.addEventBinding(
            CustomUIEventBindingType.Activating,
            var7 + " #RemoveButton",
            new EventData().append("Action", BlockSpawnerSettingsPage.Action.SPAWNER_REMOVE.name()).append("Index", var8),
            false
         );
      }
   }

   class="kw">private class="kw">static EventData fieldUpdate(String var0, BlockSpawnerSettingsPage.Field var1, String var2, String var3) {
      class="kw">return new EventData()
         .append("Action", BlockSpawnerSettingsPage.Action.SPAWNER_UPDATE.name())
         .append("Index", var0)
         .append("Field", var1.name())
         .append(var2, var3);
   }

   class="kw">public void handleDataEvent(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, @Nonnull BlockSpawnerSettingsPage.PageData var3) {
      AssetPackSaveBrowser.ActionResult var4 = this.packBrowser.handleAction(var3.action, var3.packBrowserData, "#SavePage #SelectedPackLabel");
      if (var4 != null) {
         if (var4.errorKey() != null) {
            this.playerRef.sendMessage(Message.translation(var4.errorKey()));
         }

         this.sendUpdate(var4.commandBuilder(), var4.eventBuilder(), false);
      } else {
         BlockSpawnerSettingsPage.Action var5 = var3.action == null ? null : parseAction(var3.action);
         if (var5 != null) {
            class="kw">switch (var5) {
               case APPLY:
                  this.applySelectedAsset(var3);
                  break;
               case GOTO_MAIN:
                  this.mode = BlockSpawnerSettingsPage.Mode.MAIN;
                  this.rebuild();
                  break;
               case GOTO_EDIT_SPAWNER:
                  this.mode = BlockSpawnerSettingsPage.Mode.EDIT_SPAWNER;
                  this.editingId = null;
                  this.resetDraft();
                  this.rebuild();
                  break;
               case LOAD_EXISTING:
                  this.loadExisting(var3.valueStr);
                  break;
               case NEW_ASSET:
                  this.editingId = null;
                  this.resetDraft();
                  this.rebuild();
                  break;
               case SPAWNER_ADD:
                  this.spawnerEntries.add(defaultSpawnerEntry());
                  this.refreshSpawnerEntries();
                  break;
               case SPAWNER_REMOVE:
                  int var6 = parseIndex(var3.index);
                  if (var6 >= 0 && var6 < this.spawnerEntries.size()) {
                     this.spawnerEntries.remove(var6);
                     this.refreshSpawnerEntries();
                  }
                  break;
               case SPAWNER_UPDATE:
                  this.updateSpawnerEntry(var3);
                  break;
               case OPEN_SAVE:
                  this.openSaveDialog();
                  break;
               case SAVE_NAME_CHANGED:
                  this.onSaveNameChanged(var3);
                  break;
               case CONFIRM_SAVE:
                  this.saveCurrent(var2.getExternalData().getWorld(), var3);
                  break;
               case CANCEL_SAVE:
                  this.closeSaveDialog();
                  break;
               case DELETE:
                  this.deleteAsset(var2.getExternalData().getWorld());
            }
         }
      }
   }

   class="kw">private void applySelectedAsset(@Nonnull BlockSpawnerSettingsPage.PageData var1) {
      if (BlockSpawnerTable.getAssetMap().getAsset(var1.spawnerAsset) == null) {
         this.statusKey = "server.customUI.blockSpawner.status.errorAssetNotFound";
         this.rebuild();
      } else {
         this.state.setBlockSpawnerId(var1.spawnerAsset);
         this.info.markNeedsSaving();
         this.close();
      }
   }

   class="kw">private void loadExisting(String var1) {
      if (var1 != null && !var1.isEmpty()) {
         ExtraInfo var2 = ExtraInfo.THREAD_LOCAL.get();
         this.spawnerEntries.clear();
         BlockSpawnerTable var3 = BlockSpawnerTable.getAssetMap().getAsset(var1);
         if (var3 != null && var3.getEntries() != null) {
            for (BlockSpawnerEntry var7 : var3.getEntries().internalKeys()) {
               this.spawnerEntries.add(BlockSpawnerEntry.CODEC.encode(var7, var2).asDocument());
            }
         }

         if (this.spawnerEntries.isEmpty()) {
            this.spawnerEntries.add(defaultSpawnerEntry());
         }

         this.editingId = var1;
         this.rebuild();
      }
   }

   class="kw">private void resetDraft() {
      this.spawnerEntries.clear();
      this.spawnerEntries.add(defaultSpawnerEntry());
   }

   class="kw">private void updateSpawnerEntry(@Nonnull BlockSpawnerSettingsPage.PageData var1) {
      int var2 = parseIndex(var1.index);
      if (var2 >= 0 && var2 < this.spawnerEntries.size() && var1.field != null) {
         BsonDocument var3 = this.spawnerEntries.get(var2);
         class="kw">switch (parseField(var1.field)) {
            case SP_NAME:
               if (var1.valueStr != null) {
                  var3.put("Name", new BsonString(var1.valueStr));
               }
               break;
            case SP_WEIGHT:
               var3.put("Weight", new BsonDouble(dbl(var1.valueNum)));
               break;
            case SP_DROPLIST:
               setDroplistId(var3, var1.valueStr);
         }
      }
   }

   class="kw">private void openSaveDialog() {
      UICommandBuilder var1 = new UICommandBuilder();
      if (this.editingId != null) {
         String var2 = ((DefaultAssetMap)this.spawnerStore().getAssetMap()).getAssetPack(this.editingId);
         if (var2 != null) {
            this.packBrowser.setSelectedPackKey(var2);
         }
      }

      var1.set("#SavePage.Visible", true);
      var1.set("#SaveAssetName #Input.Value", this.editingId == null ? "" : this.editingId);
      var1.set("#SaveStatus.Text", "");
      var1.set("#ConfirmSaveButton.Disabled", this.editingId == null);
      if (this.packBrowser.hasSelectedPack()) {
         var1.set("#SavePage #SelectedPackLabel.Text", this.packBrowser.getSelectedPackDisplayName());
      }

      this.sendUpdate(var1, false);
   }

   class="kw">private void closeSaveDialog() {
      UICommandBuilder var1 = new UICommandBuilder();
      var1.set("#SavePage.Visible", false);
      this.sendUpdate(var1, false);
   }

   class="kw">private void onSaveNameChanged(@Nonnull BlockSpawnerSettingsPage.PageData var1) {
      UICommandBuilder var2 = new UICommandBuilder();
      var2.set("#ConfirmSaveButton.Disabled", var1.assetName == null || var1.assetName.isBlank());
      this.sendUpdate(var2, false);
   }

   class="kw">private void dialogError(@Nonnull String var1) {
      UICommandBuilder var2 = new UICommandBuilder();
      var2.set("#SaveStatus.Text", Message.translation(var1));
      this.sendUpdate(var2, false);
   }

   class="kw">private void saveCurrent(@Nonnull World var1, @Nonnull BlockSpawnerSettingsPage.PageData var2) {
      String var3 = var2.assetName == null ? "" : var2.assetName.trim();
      if (!ASSET_NAME_PATTERN.matcher(var3).matches()) {
         this.dialogError("server.customUI.blockSpawner.status.errorName");
      } else {
         ExtraInfo var4 = ExtraInfo.THREAD_LOCAL.get();
         if (this.spawnerEntries.isEmpty()) {
            this.dialogError("server.customUI.blockSpawner.status.errorFields");
         } else {
            for (BsonDocument var6 : this.spawnerEntries) {
               String var7 = getString(var6, "Name", "");
               if (var7.isEmpty() || BlockType.getAssetMap().getAsset(var7) == null) {
                  this.dialogError("server.customUI.blockSpawner.status.errorFields");
                  class="kw">return;
               }

               try {
                  BlockSpawnerEntry.CODEC.decode(var6, var4);
               } catch (Exception var15) {
                  this.dialogError("server.customUI.blockSpawner.status.errorShape");
                  class="kw">return;
               }
            }

            AssetStore var16 = this.spawnerStore();
            DefaultAssetMap var17 = (DefaultAssetMap<String, BlockSpawnerTable>)var16.getAssetMap();
            BsonDocument var18 = new BsonDocument().append("Entries", new BsonArray(new ArrayList<>(this.spawnerEntries)));
            String var8 = "New";
            String var9 = "server.customUI.blockSpawner.status.spawnerSaved";
            Path var12 = var17.getPath(var3);
            String var13 = var17.getAssetPack(var3);
            AssetPack var14 = var13 == null ? null : AssetModule.get().getAssetPack(var13);
            AssetPack var10;
            Path var11;
            if (var12 != null && var14 != null && !var14.isImmutable()) {
               var10 = var14;
               var11 = var12;
            } else {
               var10 = this.packBrowser.getSelectedPack();
               if (var10 == null) {
                  this.dialogError("server.customUI.blockSpawner.status.errorPack");
                  class="kw">return;
               }

               var11 = var10.getRoot().resolve("Server").resolve(var16.getPath()).resolve(var8).resolve(var3 + var16.getExtension());
            }

            this.editingId = var3;
            this.writeAssetAsync(var1, var16, var10, var11, var18, var9);
         }
      }
   }

   class="kw">private void writeAssetAsync(
      @Nonnull World var1, @Nonnull AssetStore<?, ?, ?> var2, @Nonnull AssetPack var3, @Nonnull Path var4, @Nonnull BsonDocument var5, @Nonnull String var6
   ) {
      HytaleServer.SCHEDULED_EXECUTOR.execute(() -> {
         boolean var7 = this.writeAsset(var2, var3, var4, var5);
         var1.execute(() -> {
            if (var7) {
               this.statusKey = var6;
               this.mode = BlockSpawnerSettingsPage.Mode.MAIN;
            } else {
               this.statusKey = "server.customUI.blockSpawner.status.errorWrite";
            }

            this.rebuild();
         });
      });
   }

   class="kw">private boolean writeAsset(@Nonnull AssetStore<?, ?, ?> var1, @Nonnull AssetPack var2, @Nonnull Path var3, @Nonnull BsonDocument var4) {
      try {
         ExtraInfo var5 = ExtraInfo.THREAD_LOCAL.get();
         BlockSpawnerTable var6 = BlockSpawnerTable.CODEC.decode(var4, var5);
         BsonUtil.writeSync(var3, BlockSpawnerTable.CODEC, var6, LOGGER);
         var1.loadAssetsFromPaths(var2.getName(), List.of(var3));
         class="kw">return true;
      } catch (Exception var7) {
         ((HytaleLogger.Api)LOGGER.at(Level.WARNING).withCause(new SkipSentryException(var7))).log("Failed to write block spawner asset to '%s'", var3);
         class="kw">return false;
      }
   }

   class="kw">private void deleteAsset(@Nonnull World var1) {
      if (this.editingId == null) {
         this.statusKey = "server.customUI.blockSpawner.status.errorSelection";
         this.rebuild();
      } else {
         AssetStore var2 = this.spawnerStore();
         DefaultAssetMap var3 = (DefaultAssetMap<String, BlockSpawnerTable>)var2.getAssetMap();
         Path var4 = var3.getPath(this.editingId);
         String var5 = var3.getAssetPack(this.editingId);
         AssetPack var6 = var5 == null ? null : AssetModule.get().getAssetPack(var5);
         if (var4 != null && var6 != null && !var6.isImmutable()) {
            AssetStore var7 = var2;
            String var8 = var5;
            Path var9 = var4;
            HytaleServer.SCHEDULED_EXECUTOR
               .execute(
                  () -> {
                     boolean var5;
                     try {
                        var7.removeAssetWithPaths(var8, List.of(var9));
                        Files.deleteIfExists(var9);
                        var5 = true;
                     } catch (Exception var7) {
                        ((HytaleLogger.Api)LOGGER.at(Level.WARNING).withCause(new SkipSentryException(var7)))
                           .log("Failed to delete block spawner asset at '%s'", var9);
                        var5 = false;
                     }

                     boolean var6 = var5;
                     var1.execute(() -> {
                        if (var6) {
                           this.statusKey = "server.customUI.blockSpawner.status.deleted";
                           this.editingId = null;
                           this.resetDraft();
                        } else {
                           this.statusKey = "server.customUI.blockSpawner.status.errorWrite";
                        }

                        this.rebuild();
                     });
                  }
               );
         } else {
            this.statusKey = "server.customUI.blockSpawner.status.errorPack";
            this.rebuild();
         }
      }
   }

   class="kw">private void refreshSpawnerEntries() {
      UICommandBuilder var1 = new UICommandBuilder();
      UIEventBuilder var2 = new UIEventBuilder();
      var1.clear("#EntryList");
      this.buildSpawnerEntries(var1, var2);
      this.sendUpdate(var1, var2, false);
   }

   class="kw">private void applyStatus(@Nonnull UICommandBuilder var1) {
      if (this.statusKey != null) {
         var1.set("#Status.Text", Message.translation(this.statusKey));
         this.statusKey = null;
      }
   }

   @Nonnull
   class="kw">private class="kw">static BsonDocument defaultSpawnerEntry() {
      class="kw">return new BsonDocument().append("Name", new BsonString("")).append("Weight", new BsonDouble(100.0));
   }

   @Nonnull
   class="kw">private class="kw">static String extractDroplistId(@Nonnull BsonDocument var0) {
      BsonDocument var1 = var0.getDocument("Components", null);
      if (var1 == null) {
         class="kw">return "";
      }

      BsonDocument var2 = var1.getDocument("Components", null);
      if (var2 == null) {
         class="kw">return "";
      }

      BsonDocument var3 = var2.getDocument("ItemContainerBlock", null);
      class="kw">return var3 == null ? "" : getString(var3, "Droplist", "");
   }

   class="kw">private class="kw">static void setDroplistId(@Nonnull BsonDocument var0, String var1) {
      if (var1 != null && !var1.isEmpty()) {
         BsonDocument var5 = var0.getDocument("Components", null);
         if (var5 == null) {
            var5 = new BsonDocument();
            var0.put("Components", var5);
         }

         BsonDocument var6 = var5.getDocument("Components", null);
         if (var6 == null) {
            var6 = new BsonDocument();
            var5.put("Components", var6);
         }

         BsonDocument var4 = var6.getDocument("ItemContainerBlock", null);
         if (var4 == null) {
            var4 = new BsonDocument();
            var6.put("ItemContainerBlock", var4);
         }

         var4.put("Droplist", new BsonString(var1));
      } else {
         BsonDocument var2 = var0.getDocument("Components", null);
         if (var2 != null) {
            BsonDocument var3 = var2.getDocument("Components", null);
            if (var3 != null) {
               var3.remove("ItemContainerBlock");
            }
         }
      }
   }

   @Nonnull
   class="kw">private AssetStore<String, BlockSpawnerTable, DefaultAssetMap<String, BlockSpawnerTable>> spawnerStore() {
      class="kw">return AssetRegistry.getAssetStore(BlockSpawnerTable.class);
   }

   class="kw">private class="kw">static List<DropdownEntryInfo> furnitureContainerBlockEntries() {
      ArrayList var0 = new ArrayList<>();

      for (Entry var2 : Item.getAssetMap().getAssetMap().entrySet()) {
         String[] var3 = var2.getValue().getCategories();
         if (var3 != null) {
            for (String var7 : var3) {
               if ("Furniture.Containers".equals(var7)) {
                  if (BlockType.getAssetMap().getAsset(var2.getKey()) != null) {
                     var0.add(var2.getKey());
                  }
                  break;
               }
            }
         }
      }

      var0.sort(String.CASE_INSENSITIVE_ORDER);
      ObjectArrayList var8 = new ObjectArrayList();
      var8.add(new DropdownEntryInfo(LocalizableString.fromString("Empty"), "Empty"));

      for (String var10 : var0) {
         var8.add(new DropdownEntryInfo(LocalizableString.fromString(var10), var10));
      }

      class="kw">return var8;
   }

   class="kw">private class="kw">static List<DropdownEntryInfo> assetDropdownEntries(@Nonnull Iterable<String> var0) {
      ArrayList var1 = new ArrayList<>();

      for (String var3 : var0) {
         if (var3 != null) {
            var1.add(var3);
         }
      }

      var1.sort(String.CASE_INSENSITIVE_ORDER);
      class="kw">return var1.stream()
         .map(var0x -> new DropdownEntryInfo(LocalizableString.fromString(var0x), var0x))
         .collect(Collectors.toCollection(ObjectArrayList::new));
   }

   class="kw">private class="kw">static String getString(@Nonnull BsonDocument var0, @Nonnull String var1, @Nonnull String var2) {
      BsonValue var3 = var0.get(var1);
      class="kw">return var3 != null && var3.isString() ? var3.asString().getValue() : var2;
   }

   class="kw">private class="kw">static double getDouble(@Nonnull BsonDocument var0, @Nonnull String var1, double var2) {
      BsonValue var4 = var0.get(var1);
      class="kw">return var4 != null && var4.isNumber() ? var4.asNumber().doubleValue() : var2;
   }

   class="kw">private class="kw">static BlockSpawnerSettingsPage.Action parseAction(@Nonnull String var0) {
      try {
         class="kw">return BlockSpawnerSettingsPage.Action.valueOf(var0);
      } catch (IllegalArgumentException var2) {
         class="kw">return null;
      }
   }

   class="kw">private class="kw">static BlockSpawnerSettingsPage.Field parseField(@Nonnull String var0) {
      try {
         class="kw">return BlockSpawnerSettingsPage.Field.valueOf(var0);
      } catch (IllegalArgumentException var2) {
         class="kw">return BlockSpawnerSettingsPage.Field.SP_NAME;
      }
   }

   class="kw">private class="kw">static double dbl(Double var0) {
      class="kw">return var0 == null ? 0.0 : var0;
   }

   class="kw">private class="kw">static int parseIndex(String var0) {
      if (var0 == null) {
         class="kw">return -1;
      }

      try {
         class="kw">return Integer.parseInt(var0);
      } catch (NumberFormatException var2) {
         class="kw">return -1;
      }
   }

   class="kw">private enum Action {
      APPLY,
      GOTO_MAIN,
      GOTO_EDIT_SPAWNER,
      LOAD_EXISTING,
      NEW_ASSET,
      SPAWNER_ADD,
      SPAWNER_REMOVE,
      SPAWNER_UPDATE,
      OPEN_SAVE,
      SAVE_NAME_CHANGED,
      CONFIRM_SAVE,
      CANCEL_SAVE,
      DELETE;

      Action() {
      }
   }

   class="kw">private enum Field {
      SP_NAME,
      SP_WEIGHT,
      SP_DROPLIST;

      Field() {
      }
   }

   class="kw">private enum Mode {
      MAIN,
      EDIT_SPAWNER;

      Mode() {
      }
   }

   class="kw">public class="kw">static class PageData {
      class="kw">public class="kw">static class="kw">final String KEY_ACTION = "Action";
      class="kw">public class="kw">static class="kw">final String KEY_INDEX = "Index";
      class="kw">public class="kw">static class="kw">final String KEY_FIELD = "Field";
      class="kw">public class="kw">static class="kw">final String KEY_VALUE_STR = "@ValueStr";
      class="kw">public class="kw">static class="kw">final String KEY_VALUE_NUM = "@ValueNum";
      class="kw">public class="kw">static class="kw">final String KEY_SPAWNER_ASSET = "@SpawnerAsset";
      class="kw">public class="kw">static class="kw">final String KEY_ASSET_NAME = "@AssetName";
      class="kw">public class="kw">static class="kw">final BuilderCodec<BlockSpawnerSettingsPage.PageData> CODEC = BuilderCodec.builder(
            BlockSpawnerSettingsPage.PageData.class, BlockSpawnerSettingsPage.PageData::new
         )
         .addField(new KeyedCodec<>("Action", Codec.STRING), (var0, var1) -> var0.action = var1, var0 -> var0.action)
         .addField(new KeyedCodec<>("Index", Codec.STRING), (var0, var1) -> var0.index = var1, var0 -> var0.index)
         .addField(new KeyedCodec<>("Field", Codec.STRING), (var0, var1) -> var0.field = var1, var0 -> var0.field)
         .addField(new KeyedCodec<>("@ValueStr", Codec.STRING), (var0, var1) -> var0.valueStr = var1, var0 -> var0.valueStr)
         .addField(new KeyedCodec<>("@ValueNum", Codec.DOUBLE), (var0, var1) -> var0.valueNum = var1, var0 -> var0.valueNum)
         .addField(new KeyedCodec<>("@SpawnerAsset", Codec.STRING), (var0, var1) -> var0.spawnerAsset = var1, var0 -> var0.spawnerAsset)
         .addField(new KeyedCodec<>("@AssetName", Codec.STRING), (var0, var1) -> var0.assetName = var1, var0 -> var0.assetName)
         .addField(new KeyedCodec<>("Pack", Codec.STRING), (var0, var1) -> var0.packBrowserData.pack = var1, var0 -> var0.packBrowserData.pack)
         .addField(new KeyedCodec<>("@PackSearch", Codec.STRING), (var0, var1) -> var0.packBrowserData.search = var1, var0 -> var0.packBrowserData.search)
         .addField(
            new KeyedCodec<>("@CreateName", Codec.STRING), (var0, var1) -> var0.packBrowserData.createName = var1, var0 -> var0.packBrowserData.createName
         )
         .addField(
            new KeyedCodec<>("@CreateGroup", Codec.STRING), (var0, var1) -> var0.packBrowserData.createGroup = var1, var0 -> var0.packBrowserData.createGroup
         )
         .addField(
            new KeyedCodec<>("@CreateDescription", Codec.STRING),
            (var0, var1) -> var0.packBrowserData.createDescription = var1,
            var0 -> var0.packBrowserData.createDescription
         )
         .addField(
            new KeyedCodec<>("@CreateVersion", Codec.STRING),
            (var0, var1) -> var0.packBrowserData.createVersion = var1,
            var0 -> var0.packBrowserData.createVersion
         )
         .addField(
            new KeyedCodec<>("@CreateWebsite", Codec.STRING),
            (var0, var1) -> var0.packBrowserData.createWebsite = var1,
            var0 -> var0.packBrowserData.createWebsite
         )
         .addField(
            new KeyedCodec<>("@CreateAuthorName", Codec.STRING),
            (var0, var1) -> var0.packBrowserData.createAuthorName = var1,
            var0 -> var0.packBrowserData.createAuthorName
         )
         .addField(
            new KeyedCodec<>("ValidateCreate", Codec.STRING),
            (var0, var1) -> var0.packBrowserData.validateCreate = var1,
            var0 -> var0.packBrowserData.validateCreate
         )
         .addField(
            new KeyedCodec<>("@CreateTargetDir", Codec.STRING),
            (var0, var1) -> var0.packBrowserData.createTargetDir = var1,
            var0 -> var0.packBrowserData.createTargetDir
         )
         .addField(
            new KeyedCodec<>("@DirectoryFilter", Codec.STRING),
            (var0, var1) -> var0.packBrowserData.directoryFilter = var1,
            var0 -> var0.packBrowserData.directoryFilter
         )
         .build();
      class="kw">private String action;
      class="kw">private String index;
      class="kw">private String field;
      class="kw">private String valueStr;
      class="kw">private Double valueNum;
      class="kw">private String spawnerAsset;
      class="kw">private String assetName;
      class="kw">private class="kw">final AssetPackSaveBrowserEventData packBrowserData = new AssetPackSaveBrowserEventData();

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