BlockSpawnerSettingsPage class

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

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

extends: InteractiveCustomUIPage<BlockSpawnerSettingsPage.PageData>

Поля (106)

МодификаторыТипИмя
public static final BuilderCodec<BlockSpawnerSettingsPage.PageData> CODEC
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
MAIN, EDIT_SPAWNER
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
SP_NAME, SP_WEIGHT, SP_DROPLIST
private String action
private String assetName
break
break
break
break
break
break
break
break
break
break
break
break
break
break
break
break
private String field
private String index
private final AssetPackSaveBrowserEventData packBrowserData
return
return
return
private String spawnerAsset
private Double valueNum
private String valueStr
ArrayList var0
UICommandBuilder var1
UICommandBuilder var1
UICommandBuilder var1
BsonDocument var1
ArrayList var1
AssetPack var10
var10
var10
Path var11
var11
var11
Path var12
String var13
AssetPack var14
AssetStore var16
DefaultAssetMap var17
BsonDocument var18
ExtraInfo var2
int var2
String var2
UICommandBuilder var2
UICommandBuilder var2
AssetStore var2
UIEventBuilder var2
BsonDocument var2
BsonDocument var2
List var3
BlockSpawnerTable var3
BsonDocument var3
String var3
DefaultAssetMap var3
BsonDocument var3
BsonDocument var3
String[] var3
BsonValue var3
List var4
AssetPackSaveBrowser.ActionResult var4
ExtraInfo var4
Path var4
BsonDocument var4
var4
BsonValue var4
BlockSpawnerSettingsPage.Action var5
ExtraInfo var5
String var5
boolean var5
var5
var5
BsonDocument var5
var5
BsonDocument var6
int var6
BlockSpawnerTable var6
AssetPack var6
boolean var6
BsonDocument var6
var6
String var7
String var7
boolean var7
AssetStore var7
String var8
String var8
String var8
ObjectArrayList var8
String var9
Path var9

Методы (65)

МодификаторыВозвратСигнатура
Action Action()
Field Field()
Mode Mode()
public PageDatapublic PageData()
private void applySelectedAssetvoid applySelectedAsset(@Nonnull BlockSpawnerSettingsPage.PageData var1)
private void applyStatusvoid applyStatus(@Nonnull UICommandBuilder var1)
static List<DropdownEntryInfo> assetDropdownEntriesList<DropdownEntryInfo> assetDropdownEntries(@Nonnull Iterable<String> var0)
private void bindEditorChromevoid bindEditorChrome(@Nonnull UIEventBuilder var1, BlockSpawnerSettingsPage.Action var2)
private void bindSaveDialogvoid bindSaveDialog(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2)
private void buildEditSpawnervoid buildEditSpawner(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2)
private void buildMainvoid buildMain(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2)
private void buildSpawnerEntriesvoid buildSpawnerEntries(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2)
private void closeSaveDialogvoid closeSaveDialog()
static double dbldouble dbl(Double var0)
private void deleteAssetvoid deleteAsset(@Nonnull World var1)
private void dialogErrorvoid dialogError(@Nonnull String var1)
static EventData fieldUpdateEventData fieldUpdate(String var0, BlockSpawnerSettingsPage.Field var1, String var2, String var3)
for for(BsonDocument var6 : this.spawnerEntries)
for for(String var7 : var3)
for for(String var10 : var0)
for for(String var3 : var0)
abstract for for(int var5 = 0; var5 < this.spawnerEntries.size()
static List<DropdownEntryInfo> furnitureContainerBlockEntriesList<DropdownEntryInfo> furnitureContainerBlockEntries()
static double getDoubledouble getDouble(@Nonnull BsonDocument var0, @Nonnull String var1, double var2)
static String getStringString getString(@Nonnull BsonDocument var0, @Nonnull String var1, @Nonnull String var2)
public void handleDataEventvoid handleDataEvent(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, @Nonnull BlockSpawnerSettingsPage.PageData var3)
if if(this.editingId != null)
if if(var2 != null)
if if(var4 != null)
if if(var5 != null)
if if(var1.valueStr != null)
if if(this.editingId != null)
if if(var2 != null)
if if(var10 == null)
if if(var7)
if if(this.editingId == null)
if if(var6)
if if(this.statusKey != null)
if if(var1 == null)
if if(var2 == null)
if if(var5 == null)
if if(var6 == null)
if if(var4 == null)
if if(var2 != null)
if if(var3 != null)
if if(var3 != null)
if if(var3 != null)
if if(var0 == null)
private void loadExistingvoid loadExisting(String var1)
private void onSaveNameChangedvoid onSaveNameChanged(@Nonnull BlockSpawnerSettingsPage.PageData var1)
private void openSaveDialogvoid openSaveDialog()
static BlockSpawnerSettingsPage.Action parseActionBlockSpawnerSettingsPage.Action parseAction(@Nonnull String var0)
static BlockSpawnerSettingsPage.Field parseFieldBlockSpawnerSettingsPage.Field parseField(@Nonnull String var0)
static int parseIndexint parseIndex(String var0)
private void refreshSpawnerEntriesvoid refreshSpawnerEntries()
private void resetDraftvoid resetDraft()
private void saveCurrentvoid saveCurrent(@Nonnull World var1, @Nonnull BlockSpawnerSettingsPage.PageData var2)
static void setDroplistIdvoid setDroplistId(@Nonnull BsonDocument var0, String var1)
abstract setDroplistId setDroplistId(var3, var1.valueStr)
abstract super super(var1, var4, BlockSpawnerSettingsPage.PageData.CODEC)
switch switch(this.mode)
switch switch(var5)
private void updateSpawnerEntryvoid updateSpawnerEntry(@Nonnull BlockSpawnerSettingsPage.PageData var1)
private boolean writeAssetboolean writeAsset(@Nonnull AssetStore<?, ?, ?> var1, @Nonnull AssetPack var2, @Nonnull Path var3, @Nonnull BsonDocument var4)
private void writeAssetAsyncvoid writeAssetAsync(@Nonnull World var1, @Nonnull AssetStore<?, ?, ?> var2, @Nonnull AssetPack var3, @Nonnull Path var4, @Nonnull BsonDocument var5, @Nonnull String var6)

Исходный код

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