ValueOnlyCommandBuilder class

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

Файл: com/hypixel/hytale/builtin/adventure/worldevents/ui/WorldEventPanelPage.java

extends: UICommandBuilder

Методы (7)

МодификаторыВозвратСигнатура
public UICommandBuilder appendpublic UICommandBuilder append(String var1)
public UICommandBuilder appendpublic UICommandBuilder append(String var1, String var2)
public UICommandBuilder appendInlinepublic UICommandBuilder appendInline(String var1, String var2)
public UICommandBuilder clearpublic UICommandBuilder clear(String var1)
public UICommandBuilder insertBeforepublic UICommandBuilder insertBefore(String var1, String var2)
public UICommandBuilder insertBeforeInlinepublic UICommandBuilder insertBeforeInline(String var1, String var2)
public UICommandBuilder removepublic UICommandBuilder remove(String var1)

Исходный код

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

class="kw">import com.hypixel.hytale.builtin.adventure.worldevents.GlobalWorldEventManager;
class="kw">import com.hypixel.hytale.builtin.adventure.worldevents.WorldEventManager;
class="kw">import com.hypixel.hytale.builtin.adventure.worldevents.WorldEventStorage;
class="kw">import com.hypixel.hytale.builtin.adventure.worldevents.WorldEventsConfig;
class="kw">import com.hypixel.hytale.builtin.adventure.worldevents.command.ResetCommand;
class="kw">import com.hypixel.hytale.builtin.adventure.worldevents.event.Stage;
class="kw">import com.hypixel.hytale.builtin.adventure.worldevents.event.WorldEvent;
class="kw">import com.hypixel.hytale.builtin.adventure.worldevents.event.WorldEventAsset;
class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.EmptyExtraInfo;
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.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.protocol.packets.interface_.CustomPageLifetime;
class="kw">import com.hypixel.hytale.protocol.packets.interface_.CustomUICommand;
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.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.entity.entities.player.pages.InteractiveCustomUIPage;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.HeadRotation;
class="kw">import com.hypixel.hytale.server.core.modules.entity.teleport.PendingTeleport;
class="kw">import com.hypixel.hytale.server.core.modules.entity.teleport.Teleport;
class="kw">import com.hypixel.hytale.server.core.ui.PatchStyle;
class="kw">import com.hypixel.hytale.server.core.ui.Value;
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 java.util.LinkedHashMap;
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.Map.Entry;
class="kw">import java.util.concurrent.ScheduledFuture;
class="kw">import java.util.concurrent.TimeUnit;
class="kw">import java.util.concurrent.atomic.AtomicReference;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.bson.BsonArray;
class="kw">import org.bson.BsonDocument;
class="kw">import org.bson.BsonValue;
class="kw">import org.joml.Vector3d;

class="kw">public class="kw">abstract class WorldEventPanelPage class="kw">extends InteractiveCustomUIPage<WorldEventPanelPage.PageData> {
   class="kw">protected class="kw">static class="kw">final String PAGE = "Pages/WorldEvent/WorldEventPanelPage.ui";
   class="kw">protected class="kw">static class="kw">final String NAV_BUTTON = "Pages/WorldEvent/WorldEventNavButton.ui";
   class="kw">protected class="kw">static class="kw">final String LIST_ROW = "Pages/WorldEvent/WorldEventListRow.ui";
   class="kw">protected class="kw">static class="kw">final String PROPERTY_ROW = "Pages/WorldEvent/WorldEventPropertyRow.ui";
   class="kw">protected class="kw">static class="kw">final String COORDINATE_ROW = "Pages/WorldEvent/WorldEventCoordinateRow.ui";
   class="kw">protected class="kw">static class="kw">final String SECTION_LABEL = "Pages/WorldEvent/WorldEventSectionLabel.ui";
   class="kw">protected class="kw">static class="kw">final String TEXT_ROW = "Pages/WorldEvent/WorldEventTextRow.ui";
   class="kw">protected class="kw">static class="kw">final String SUMMARY_ROW = "Pages/WorldEvent/WorldEventSummaryRow.ui";
   class="kw">protected class="kw">static class="kw">final String LIST = "#ListContainer";
   class="kw">protected class="kw">static class="kw">final String SIDE = "#SideContainer";
   class="kw">protected class="kw">static class="kw">final String SUMMARY = "#Summary";
   class="kw">protected class="kw">static class="kw">final Value<String> NAV_STYLE = Value.ref("Pages/WorldEvent/WorldEventNavButton.ui", "LabelStyle");
   class="kw">protected class="kw">static class="kw">final Value<String> NAV_SELECTED_STYLE = Value.ref("Pages/WorldEvent/WorldEventNavButton.ui", "SelectedLabelStyle");
   class="kw">protected class="kw">static class="kw">final Value<String> ROW_STYLE = Value.ref("Pages/WorldEvent/WorldEventListRow.ui", "NormalRowStyle");
   class="kw">protected class="kw">static class="kw">final Value<String> ROW_SELECTED_STYLE = Value.ref("Pages/WorldEvent/WorldEventListRow.ui", "SelectedRowStyle");
   class="kw">protected class="kw">static class="kw">final Value<String> ROW_STATIC_STYLE = Value.ref("Pages/WorldEvent/WorldEventListRow.ui", "StaticRowStyle");
   class="kw">protected class="kw">static class="kw">final String COLOR_OK = "#4f9e63";
   class="kw">protected class="kw">static class="kw">final String COLOR_PENDING = "#c08a3a";
   class="kw">protected class="kw">static class="kw">final String COLOR_FAIL = "#b04a4a";
   class="kw">protected class="kw">static class="kw">final String COLOR_IDLE = "#4a5a6a";
   class="kw">protected class="kw">static class="kw">final String COLOR_INFO = "#4274a5";
   class="kw">protected class="kw">static class="kw">final int MAX_ROWS = 400;
   class="kw">protected class="kw">static class="kw">final int MAX_BSON_DEPTH = 6;
   class="kw">private class="kw">static class="kw">final Set<String> POSITION_KEYS = Set.of("position", "pos", "location", "origin", "destination", "target", "spawn", "center", "block");
   class="kw">private class="kw">static class="kw">final double MAX_TELEPORT_HORIZONTAL = 2.147483616E9;
   class="kw">private class="kw">static class="kw">final double MIN_TELEPORT_Y = -32.0;
   class="kw">private class="kw">static class="kw">final double MAX_TELEPORT_Y = 320.0;
   class="kw">private class="kw">static class="kw">final long REFRESH_INTERVAL_MS = 1000L;
   class="kw">private class="kw">static class="kw">final long VALUE_HASH_UNSET = Long.MIN_VALUE;
   class="kw">private class="kw">static class="kw">final long STRUCTURE_HASH_SEED = 1125899906842597L;
   class="kw">protected class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">protected class="kw">volatile boolean pendingConfirm = false;
   @Nonnull
   class="kw">protected String filterText = "";
   class="kw">private class="kw">final AtomicReference<ScheduledFuture<?>> refreshTask = new AtomicReference<>();
   class="kw">private long structureHash = 1125899906842597L;
   class="kw">private long lastValueHash = Long.MIN_VALUE;
   class="kw">private class="kw">final Map<UUID, WorldEventPanelPage.CachedProgress> progressCache = new LinkedHashMap<UUID, WorldEventPanelPage.CachedProgress>(16, 0.75F, true) {
      @Override
      class="kw">protected boolean removeEldestEntry(@Nonnull Entry<UUID, WorldEventPanelPage.CachedProgress> var1) {
         class="kw">return this.size() > 400;
      }
   };

   class="kw">protected WorldEventPanelPage(@Nonnull PlayerRef var1) {
      super(var1, CustomPageLifetime.CanDismiss, WorldEventPanelPage.PageData.CODEC);
   }

   @Nullable
   class="kw">protected class="kw">abstract WorldEventPanelPage.Tab tab();

   @Nonnull
   class="kw">protected class="kw">abstract String titleKey();

   @Nonnull
   class="kw">protected class="kw">abstract String descriptionKey();

   class="kw">protected class="kw">abstract void buildContent(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2, @Nonnull Store<EntityStore> var3);

   class="kw">protected boolean handleAction(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, @Nonnull WorldEventPanelPage.PageData var3) {
      class="kw">return false;
   }

   class="kw">protected boolean supportsFilter() {
      class="kw">return true;
   }

   class="kw">protected boolean supportsBack() {
      class="kw">return false;
   }

   @Nullable
   class="kw">protected Message toggleLabel() {
      class="kw">return null;
   }

   class="kw">protected boolean onToggle() {
      class="kw">return false;
   }

   @Override
   class="kw">public class="kw">final void build(@Nonnull Ref<EntityStore> var1, @Nonnull UICommandBuilder var2, @Nonnull UIEventBuilder var3, @Nonnull Store<EntityStore> var4) {
      var2.append("Pages/WorldEvent/WorldEventPanelPage.ui");
      this.buildNav(var2, var3);
      this.bindShellEvents(var3);
      var2.set("#FilterField.Value", this.filterText);
      this.paint(var2, var3, var4);
      this.lastValueHash = Long.MIN_VALUE;
      this.startLiveRefresh();
   }

   class="kw">private void paint(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2, @Nonnull Store<EntityStore> var3) {
      this.structureHash = 1125899906842597L;
      var1.set("#PageTitle.Text", Message.translation(this.titleKey()));
      var1.set("#PageDescription.Text", Message.translation(this.descriptionKey()));
      var1.set("#FilterField.Visible", this.supportsFilter());
      var1.set("#BackButton.Visible", this.supportsBack());
      Message var4 = this.toggleLabel();
      var1.set("#ToggleButton.Visible", var4 != null);
      if (var4 != null) {
         var1.set("#ToggleButton.Text", var4);
      }

      this.buildSummary(var1, var3);
      this.buildConfirm(var1);
      var1.clear("#ListContainer");
      var1.clear("#SideContainer");
      this.buildContent(var1, var2, var3);
   }

   @Override
   class="kw">public void onDismiss(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2) {
      this.stopLiveRefresh();
   }

   class="kw">public void handleDataEvent(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, @Nonnull WorldEventPanelPage.PageData var3) {
      if (var3.action != null) {
         class="kw">switch (var3.action) {
            case Navigate:
               WorldEventPanelPage.Tab var4 = WorldEventPanelPage.Tab.fromId(var3.id);
               if (var4 != null && var4 != this.tab()) {
                  this.openPage(var1, var2, var4.create(this.playerRef));
               }
               break;
            case Filter:
               this.filterText = var3.filter != null ? var3.filter : "";
               break;
            case Refresh:
               this.update(var2, true);
               break;
            case Toggle:
               if (this.onToggle()) {
                  this.update(var2, true);
               }
               break;
            case Back:
               this.openPage(var1, var2, WorldEventPanelPage.Tab.ACTIVE.create(this.playerRef));
               break;
            case Close:
               this.close();
               break;
            case ResetAll:
               this.pendingConfirm = true;
               this.update(var2, true);
               break;
            case ConfirmAccept:
               this.onConfirmAccept(var1, var2);
               break;
            case ConfirmCancel:
               this.pendingConfirm = false;
               this.update(var2, true);
               break;
            case RowSelect:
            case RowPrimary:
            case RowSecondary:
            class="kw">default:
               if (this.handleAction(var1, var2, var3)) {
                  this.update(var2, true);
               }
               break;
            case Teleport:
               this.handleTeleport(var1, var2, var3);
         }
      }
   }

   class="kw">private void onConfirmAccept(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2) {
      boolean var3 = this.pendingConfirm;
      this.pendingConfirm = false;
      if (!var3) {
         this.update(var2, true);
      } else {
         World var4 = var2.getExternalData().getWorld();
         ResetCommand.execute(var4).whenCompleteAsync((var3x, var4x) -> {
            if (var4x != null) {
               ((HytaleLogger.Api)((HytaleLogger.Api)LOGGER.atWarning()).withCause(var4x)).log("Failed to reset world-events from the admin panel");
            }

            if (var1.isValid()) {
               this.update(var2, true);
            }
         }, var4);
      }
   }

   class="kw">private void handleTeleport(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, @Nonnull WorldEventPanelPage.PageData var3) {
      Vector3d var4 = parseCoordinateId(var3.id);
      HeadRotation var5 = var2.getComponent(var1, HeadRotation.getComponentType());
      boolean var6 = var2.getComponent(var1, Teleport.getComponentType()) != null || var2.getComponent(var1, PendingTeleport.getComponentType()) != null;
      if (var4 != null && var5 != null) {
         if (!var6) {
            var2.addComponent(var1, Teleport.getComponentType(), Teleport.createForPlayer(var4, new Rotation3f(var5.getRotation())));
            this.close();
            class="kw">return;
         }

         this.playerRef.sendMessage(Message.translation("server.customUI.worldEventPanel.teleport.busy"));
      } else {
         ((HytaleLogger.Api)LOGGER.atWarning()).log("Discarded a world-event panel teleport to id '%s', headRotation=%s", var3.id, var5 != null);
         this.playerRef.sendMessage(Message.translation("server.customUI.worldEventPanel.teleport.unavailable"));
      }

      this.update(var2, true);
   }

   class="kw">private void startLiveRefresh() {
      if (this.refreshTask.get() == null) {
         ScheduledFuture var1 = HytaleServer.SCHEDULED_EXECUTOR.scheduleAtFixedRate(this::onRefreshTick, 1000L, 1000L, TimeUnit.MILLISECONDS);
         if (!this.refreshTask.compareAndSet(null, var1)) {
            var1.cancel(false);
         }
      }
   }

   class="kw">private void stopLiveRefresh() {
      ScheduledFuture var1 = this.refreshTask.getAndSet(null);
      if (var1 != null) {
         var1.cancel(false);
      }
   }

   class="kw">private void onRefreshTick() {
      Ref var1 = this.playerRef.getReference();
      if (var1 == null || !var1.isValid()) {
         this.stopLiveRefresh();
      } else if (!this.pendingConfirm) {
         Store var2 = var1.getStore();

         try {
            var2.getExternalData().getWorld().execute(() -> {
               if (!var1.isValid()) {
                  this.stopLiveRefresh();
               } else {
                  Player var3 = var2.getComponent(var1, Player.getComponentType());
                  if (var3 != null && var3.getPageManager().getCustomPage() == this) {
                     try {
                        this.update(var2, false);
                     } catch (Exception var5) {
                        ((HytaleLogger.Api)((HytaleLogger.Api)LOGGER.atWarning()).withCause(var5)).log("World-event panel refresh failed");
                     }
                  } else {
                     this.stopLiveRefresh();
                  }
               }
            });
         } catch (Exception var4) {
            this.stopLiveRefresh();
         }
      }
   }

   class="kw">private void update(@Nonnull Store<EntityStore> var1, boolean var2) {
      long var3 = this.structureHash;
      WorldEventPanelPage.ValueOnlyCommandBuilder var5 = new WorldEventPanelPage.ValueOnlyCommandBuilder();
      this.paint(var5, new UIEventBuilder(), var1);
      if (this.structureHash != var3) {
         UICommandBuilder var8 = new UICommandBuilder();
         UIEventBuilder var7 = new UIEventBuilder();
         this.paint(var8, var7, var1);
         this.lastValueHash = Long.MIN_VALUE;
         this.sendUpdate(var8, var7, false);
      } else {
         long var6 = valueHash(var5.getCommands());
         if (var2 || var6 != this.lastValueHash) {
            this.lastValueHash = var6;
            this.sendUpdate(var5, null, false);
         }
      }
   }

   class="kw">protected void trackAppend(@Nonnull String var1, @Nonnull String var2) {
      this.structureHash = this.structureHash * 31L + var1.hashCode();
      this.structureHash = this.structureHash * 31L + var2.hashCode();
   }

   class="kw">protected void trackBinding(@Nullable String var1) {
      this.structureHash = this.structureHash * 31L + (var1 != null ? var1.hashCode() : 0);
   }

   class="kw">private void trackBinding(@Nullable Enum<?> var1) {
      this.structureHash = this.structureHash * 31L + (var1 != null ? var1.ordinal() + 1 : 0);
   }

   class="kw">private class="kw">static long valueHash(@Nonnull CustomUICommand[] var0) {
      long var1 = 1125899906842597L;

      for (CustomUICommand var6 : var0) {
         var1 = var1 * 31L + var6.type.ordinal();
         var1 = var1 * 31L + (var6.selector != null ? var6.selector.hashCode() : 0);
         var1 = var1 * 31L + (var6.data != null ? var6.data.hashCode() : 0);
         var1 = var1 * 31L + (var6.text != null ? var6.text.hashCode() : 0);
      }

      class="kw">return var1;
   }

   class="kw">private void buildNav(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2) {
      var1.clear("#NavList");
      WorldEventPanelPage.Tab var3 = this.tab();
      int var4 = 0;

      for (WorldEventPanelPage.Tab var8 : WorldEventPanelPage.Tab.values()) {
         String var9 = "#NavList[" + var4 + "]";
         var1.append("#NavList", "Pages/WorldEvent/WorldEventNavButton.ui");
         var1.set(var9 + ".Text", Message.translation(var8.titleKey()));
         var1.set(var9 + ".TooltipText", Message.translation(var8.descriptionKey()));
         var1.set(var9 + ".Style", var8 == var3 ? NAV_SELECTED_STYLE : NAV_STYLE);
         var2.addEventBinding(
            CustomUIEventBindingType.Activating, var9, new EventData().append("Action", WorldEventPanelPage.Action.Navigate.name()).append("Id", var8.id())
         );
         var4++;
      }
   }

   class="kw">private void bindShellEvents(@Nonnull UIEventBuilder var1) {
      var1.addEventBinding(
         CustomUIEventBindingType.ValueChanged,
         "#FilterField",
         new EventData().append("Action", WorldEventPanelPage.Action.Filter.name()).append("@Filter", "#FilterField.Value"),
         false
      );
      var1.addEventBinding(CustomUIEventBindingType.Activating, "#RefreshButton", new EventData().append("Action", WorldEventPanelPage.Action.Refresh.name()));
      var1.addEventBinding(CustomUIEventBindingType.Activating, "#BackButton", new EventData().append("Action", WorldEventPanelPage.Action.Back.name()));
      var1.addEventBinding(CustomUIEventBindingType.Activating, "#ToggleButton", new EventData().append("Action", WorldEventPanelPage.Action.Toggle.name()));
      var1.addEventBinding(CustomUIEventBindingType.Activating, "#CloseButton", new EventData().append("Action", WorldEventPanelPage.Action.Close.name()));
      var1.addEventBinding(CustomUIEventBindingType.Activating, "#ResetAllButton", new EventData().append("Action", WorldEventPanelPage.Action.ResetAll.name()));
      var1.addEventBinding(
         CustomUIEventBindingType.Activating, "#ConfirmButton", new EventData().append("Action", WorldEventPanelPage.Action.ConfirmAccept.name())
      );
      var1.addEventBinding(
         CustomUIEventBindingType.Activating, "#CancelConfirmButton", new EventData().append("Action", WorldEventPanelPage.Action.ConfirmCancel.name())
      );
   }

   class="kw">private void buildConfirm(@Nonnull UICommandBuilder var1) {
      var1.set("#ConfirmPage.Visible", this.pendingConfirm);
      if (this.pendingConfirm) {
         var1.set("#ConfirmMessage.Text", Message.translation("server.customUI.worldEventPanel.confirm.resetAll"));
      }
   }

   class="kw">private void buildSummary(@Nonnull UICommandBuilder var1, @Nonnull Store<EntityStore> var2) {
      var1.clear("#Summary");
      WorldEventManager var3 = var2.getResource(WorldEventManager.getResourceType());
      WorldEventStorage var4 = var2.getResource(WorldEventStorage.getResourceType());
      World var5 = var2.getExternalData().getWorld();
      int[] var6 = new int[1];
      var3.forEach(var6, (var0, var1x) -> var1x[0]++);
      int var7 = 0;
      var7 = this.appendSummary(var1, var7, Message.translation("server.customUI.worldEventPanel.summary.world").param("world", var5.getName()));
      var7 = this.appendSummary(var1, var7, Message.translation("server.customUI.worldEventPanel.summary.running").param("count", var6[0]));
      var7 = this.appendSummary(var1, var7, Message.translation("server.customUI.worldEventPanel.summary.assets").param("count", assetCount()));
      var7 = this.appendSummary(
         var1, var7, Message.translation("server.customUI.worldEventPanel.summary.global").param("count", GlobalWorldEventManager.INSTANCE.activeCount())
      );
      this.appendSummary(var1, var7, Message.translation("server.customUI.worldEventPanel.summary.completed").param("count", var4.completeCount()));
   }

   class="kw">protected class="kw">static int assetCount() {
      int var0 = 0;

      for (WorldEventAsset var2 : WorldEventAsset.ASSET_MAP.getAssetMap().values()) {
         if (var2 != WorldEventAsset.UNKNOWN) {
            var0++;
         }
      }

      class="kw">return var0;
   }

   class="kw">private int appendSummary(@Nonnull UICommandBuilder var1, int var2, @Nonnull Message var3) {
      this.trackAppend("#Summary", "Pages/WorldEvent/WorldEventSummaryRow.ui");
      var1.append("#Summary", "Pages/WorldEvent/WorldEventSummaryRow.ui");
      var1.set("#Summary[" + var2 + "].Text", var3);
      class="kw">return var2 + 1;
   }

   class="kw">protected int appendSection(@Nonnull UICommandBuilder var1, @Nonnull String var2, int var3, @Nonnull Message var4) {
      this.trackAppend(var2, "Pages/WorldEvent/WorldEventSectionLabel.ui");
      var1.append(var2, "Pages/WorldEvent/WorldEventSectionLabel.ui");
      var1.set(var2 + "[" + var3 + "].Text", var4);
      class="kw">return var3 + 1;
   }

   class="kw">protected int appendText(@Nonnull UICommandBuilder var1, @Nonnull String var2, int var3, @Nonnull Message var4) {
      this.trackAppend(var2, "Pages/WorldEvent/WorldEventTextRow.ui");
      var1.append(var2, "Pages/WorldEvent/WorldEventTextRow.ui");
      var1.set(var2 + "[" + var3 + "].Text", var4);
      class="kw">return var3 + 1;
   }

   class="kw">protected int appendProperty(@Nonnull UICommandBuilder var1, @Nonnull String var2, int var3, @Nonnull Message var4, @Nonnull String var5) {
      String var6 = var2 + "[" + var3 + "]";
      this.trackAppend(var2, "Pages/WorldEvent/WorldEventPropertyRow.ui");
      var1.append(var2, "Pages/WorldEvent/WorldEventPropertyRow.ui");
      var1.set(var6 + " #Key.Text", var4);
      var1.set(var6 + " #Key.TooltipText", var4);
      var1.set(var6 + " #Value.Text", var5);
      class="kw">return var3 + 1;
   }

   class="kw">protected int appendProperty(@Nonnull UICommandBuilder var1, @Nonnull String var2, int var3, @Nonnull Message var4, @Nonnull Message var5) {
      String var6 = var2 + "[" + var3 + "]";
      this.trackAppend(var2, "Pages/WorldEvent/WorldEventPropertyRow.ui");
      var1.append(var2, "Pages/WorldEvent/WorldEventPropertyRow.ui");
      var1.set(var6 + " #Key.Text", var4);
      var1.set(var6 + " #Key.TooltipText", var4);
      var1.set(var6 + " #Value.Text", var5);
      class="kw">return var3 + 1;
   }

   class="kw">protected int appendProperty(@Nonnull UICommandBuilder var1, @Nonnull String var2, int var3, @Nonnull String var4, @Nonnull String var5) {
      String var6 = var2 + "[" + var3 + "]";
      this.trackAppend(var2, "Pages/WorldEvent/WorldEventPropertyRow.ui");
      var1.append(var2, "Pages/WorldEvent/WorldEventPropertyRow.ui");
      var1.set(var6 + " #Key.Text", var4);
      var1.set(var6 + " #Key.TooltipText", var4);
      var1.set(var6 + " #Value.Text", var5);
      class="kw">return var3 + 1;
   }

   class="kw">protected int appendProperty(@Nonnull UICommandBuilder var1, @Nonnull String var2, int var3, @Nonnull String var4, @Nonnull Message var5) {
      String var6 = var2 + "[" + var3 + "]";
      this.trackAppend(var2, "Pages/WorldEvent/WorldEventPropertyRow.ui");
      var1.append(var2, "Pages/WorldEvent/WorldEventPropertyRow.ui");
      var1.set(var6 + " #Key.Text", var4);
      var1.set(var6 + " #Key.TooltipText", var4);
      var1.set(var6 + " #Value.Text", var5);
      class="kw">return var3 + 1;
   }

   class="kw">protected int appendRow(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2, int var3, @Nonnull WorldEventPanelPage.Row var4) {
      String var5 = "#ListContainer[" + var3 + "]";
      this.trackAppend("#ListContainer", "Pages/WorldEvent/WorldEventListRow.ui");
      this.trackBinding(var4.kind);
      this.trackBinding(var4.id);
      this.trackBinding(var4.selectAction);
      this.trackBinding(var4.primaryAction);
      this.trackBinding(var4.secondaryAction);
      var1.append("#ListContainer", "Pages/WorldEvent/WorldEventListRow.ui");
      var1.set(var5 + " #Label.Text", var4.label);
      if (var4.subMessage != null) {
         var1.set(var5 + " #Sub.Text", var4.subMessage);
      } else {
         var1.set(var5 + " #Sub.Text", var4.sub);
      }

      Value var6 = var4.selectAction == null ? ROW_STATIC_STYLE : ROW_STYLE;
      var1.set(var5 + " #SelectButton.Style", var4.selected ? ROW_SELECTED_STYLE : var6);
      var1.setObject(var5 + " #StatusBar.Background", colorPatch(var4.statusColor));
      if (var4.badge != null) {
         var1.set(var5 + " #Badge.Text", var4.badge);
      }

      if (var4.selectAction != null) {
         var2.addEventBinding(CustomUIEventBindingType.Activating, var5 + " #SelectButton", rowEvent(var4.selectAction, var4.kind, var4.id));
      }

      this.bindRowButton(var1, var2, var5 + " #ActionA", var4.primaryText, var4.primaryAction, var4.kind, var4.id);
      this.bindRowButton(var1, var2, var5 + " #ActionB", var4.secondaryText, var4.secondaryAction, var4.kind, var4.id);
      class="kw">return var3 + 1;
   }

   class="kw">private void bindRowButton(
      @Nonnull UICommandBuilder var1,
      @Nonnull UIEventBuilder var2,
      @Nonnull String var3,
      @Nullable Message var4,
      @Nullable WorldEventPanelPage.Action var5,
      @Nonnull String var6,
      @Nonnull String var7
   ) {
      if (var4 != null && var5 != null) {
         var1.set(var3 + ".Visible", true);
         var1.set(var3 + ".Text", var4);
         var2.addEventBinding(CustomUIEventBindingType.Activating, var3, rowEvent(var5, var6, var7));
      }
   }

   @Nonnull
   class="kw">private class="kw">static EventData rowEvent(@Nonnull WorldEventPanelPage.Action var0, @Nonnull String var1, @Nonnull String var2) {
      class="kw">return new EventData().append("Action", var0.name()).append("Kind", var1).append("Id", var2);
   }

   class="kw">protected int appendEncoded(
      @Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2, @Nonnull String var3, int var4, @Nonnull String var5, @Nullable BsonValue var6, int var7
   ) {
      class="kw">return this.appendEncoded(var1, var2, var3, var4, var5, var6, var7, 400);
   }

   class="kw">protected int appendEncoded(
      @Nonnull UICommandBuilder var1,
      @Nonnull UIEventBuilder var2,
      @Nonnull String var3,
      int var4,
      @Nonnull String var5,
      @Nullable BsonValue var6,
      int var7,
      int var8
   ) {
      if (var6 == null || var4 >= var8) {
         class="kw">return var4;
      }

      if (var7 < 6 && var6 class="kw">instanceof BsonDocument var13) {
         double[] var14 = coordinateOf(var13);
         if (var14 != null) {
            class="kw">return this.appendCoordinate(var1, var2, var3, var4, var5, var14[0], var14[1], var14[2]);
         }

         for (Entry var12 : var13.entrySet()) {
            var4 = this.appendEncoded(var1, var2, var3, var4, join(var5, var12.getKey()), var12.getValue(), var7 + 1, var8);
         }

         class="kw">return var4;
      } else if (var7 < 6 && var6 class="kw">instanceof BsonArray var9) {
         if (var9.isEmpty()) {
            class="kw">return this.appendProperty(var1, var3, var4, var5, "[]");
         }

         for (int var10 = 0; var10 < var9.size(); var10++) {
            var4 = this.appendEncoded(var1, var2, var3, var4, var5 + "[" + var10 + "]", var9.get(var10), var7 + 1, var8);
         }

         class="kw">return var4;
      } else {
         class="kw">return this.appendProperty(var1, var3, var4, var5, scalar(var6));
      }
   }

   @Nullable
   class="kw">private class="kw">static double[] coordinateOf(@Nonnull BsonDocument var0) {
      if (var0.size() != 3) {
         class="kw">return null;
      }

      Double var1 = finiteNumberOf(var0.get("X"));
      Double var2 = finiteNumberOf(var0.get("Y"));
      Double var3 = finiteNumberOf(var0.get("Z"));
      class="kw">return var1 != null && var2 != null && var3 != null ? new double[]{var1, var2, var3} : null;
   }

   @Nullable
   class="kw">private class="kw">static Double finiteNumberOf(@Nullable BsonValue var0) {
      if (var0 != null && var0.isNumber()) {
         double var1 = var0.asNumber().doubleValue();
         class="kw">return Double.isFinite(var1) ? var1 : null;
      } else {
         class="kw">return null;
      }
   }

   class="kw">protected int appendCoordinate(
      @Nonnull UICommandBuilder var1,
      @Nonnull UIEventBuilder var2,
      @Nonnull String var3,
      int var4,
      @Nonnull String var5,
      double var6,
      double var8,
      double var10
   ) {
      String var12 = var3 + "[" + var4 + "]";
      this.trackAppend(var3, "Pages/WorldEvent/WorldEventCoordinateRow.ui");
      var1.append(var3, "Pages/WorldEvent/WorldEventCoordinateRow.ui");
      if (var5.isEmpty()) {
         Message var13 = Message.translation("server.customUI.worldEventPanel.inspector.unnamedCoordinate");
         var1.set(var12 + " #Key.Text", var13);
         var1.set(var12 + " #Key.TooltipText", var13);
      } else {
         var1.set(var12 + " #Key.Text", var5);
         var1.set(var12 + " #Key.TooltipText", var5);
      }

      String var16 = "(" + formatDouble(var6) + ", " + formatDouble(var8) + ", " + formatDouble(var10) + ")";
      var1.set(var12 + " #Value.Text", var16);
      var1.set(var12 + " #Value.TooltipText", var16);
      boolean var14 = isPosition(var5) && isInWorld(var6, var8, var10);
      var1.set(var12 + " #TeleportButton.Visible", var14);
      this.trackBinding(String.valueOf(var14));
      if (var14) {
         var1.set(var12 + " #TeleportButton.Text", Message.translation("server.customUI.worldEventPanel.action.teleport"));
         String var15 = coordinateId(var6, var8, var10);
         this.trackBinding(var15);
         var2.addEventBinding(
            CustomUIEventBindingType.Activating,
            var12 + " #TeleportButton",
            new EventData().append("Action", WorldEventPanelPage.Action.Teleport.name()).append("Id", var15)
         );
      }

      class="kw">return var4 + 1;
   }

   class="kw">private class="kw">static boolean isPosition(@Nonnull String var0) {
      int var1 = var0.lastIndexOf(46);
      String var2 = var1 < 0 ? var0 : var0.substring(var1 + 1);
      int var3 = var2.indexOf(91);
      if (var3 >= 0) {
         var2 = var2.substring(0, var3);
      }

      class="kw">return POSITION_KEYS.contains(var2.toLowerCase(Locale.ROOT));
   }

   class="kw">private class="kw">static boolean isInWorld(double var0, double var2, double var4) {
      class="kw">return Math.abs(var0) <= 2.147483616E9 && Math.abs(var4) <= 2.147483616E9 && var2 >= -32.0 && var2 <= 320.0;
   }

   @Nonnull
   class="kw">private class="kw">static String coordinateId(double var0, double var2, double var4) {
      class="kw">return var0 + "," + var2 + "," + var4;
   }

   @Nullable
   class="kw">private class="kw">static Vector3d parseCoordinateId(@Nullable String var0) {
      if (var0 == null) {
         class="kw">return null;
      }

      String[] var1 = var0.split(",", -1);
      if (var1.length != 3) {
         class="kw">return null;
      }

      try {
         double var2 = Double.parseDouble(var1[0]);
         double var4 = Double.parseDouble(var1[1]);
         double var6 = Double.parseDouble(var1[2]);
         class="kw">return !isInWorld(var2, var4, var6) ? null : new Vector3d(var2, var4, var6);
      } catch (NumberFormatException var8) {
         class="kw">return null;
      }
   }

   @Nonnull
   class="kw">private class="kw">static String join(@Nonnull String var0, @Nonnull String var1) {
      class="kw">return var0.isEmpty() ? var1 : var0 + "." + var1;
   }

   @Nonnull
   class="kw">protected class="kw">static String scalar(@Nonnull BsonValue var0) {
      class="kw">return class="kw">switch (var0.getBsonType()) {
         case STRING -> var0.asString().getValue();
         case BOOLEAN -> String.valueOf(var0.asBoolean().getValue());
         case INT32 -> String.valueOf(var0.asInt32().getValue());
         case INT64 -> String.valueOf(var0.asInt64().getValue());
         case DOUBLE -> formatDouble(var0.asDouble().getValue());
         case NULL -> "null";
         class="kw">default -> var0.toString();
      };
   }

   @Nonnull
   class="kw">protected class="kw">static String formatDouble(double var0) {
      class="kw">return var0 == Math.rint(var0) && !Double.isInfinite(var0) ? String.valueOf((long)var0) : String.format(Locale.ROOT, "%.3f", var0);
   }

   @Nullable
   class="kw">protected class="kw">static <T> BsonValue tryEncode(@Nonnull Codec<T> var0, @Nonnull T var1) {
      try {
         class="kw">return var0.encode(var1, EmptyExtraInfo.EMPTY);
      } catch (Exception var3) {
         ((HytaleLogger.Api)((HytaleLogger.Api)LOGGER.atWarning()).withCause(var3))
            .log("Failed to encode %s for the world-event panel", var1.getClass().getName());
         class="kw">return null;
      }
   }

   class="kw">protected int appendCount(@Nonnull UICommandBuilder var1, @Nonnull String var2, int var3, @Nonnull Message var4, int var5, int var6) {
      class="kw">return var5 == var6
         ? this.appendProperty(var1, var2, var3, var4, Message.translation("server.customUI.worldEventPanel.value.unlimited"))
         : this.appendProperty(var1, var2, var3, var4, String.valueOf(var5));
   }

   @Nonnull
   class="kw">protected class="kw">static Message boolLabel(boolean var0) {
      class="kw">return Message.translation(var0 ? "server.customUI.worldEventPanel.value.yes" : "server.customUI.worldEventPanel.value.no");
   }

   @Nonnull
   class="kw">protected class="kw">static PatchStyle colorPatch(@Nonnull String var0) {
      class="kw">return new PatchStyle().setColor(Value.of(var0));
   }

   class="kw">protected boolean matchesFilter(@Nonnull String... var1) {
      if (this.filterText.isEmpty()) {
         class="kw">return true;
      }

      String var2 = this.filterText.toLowerCase(Locale.ROOT);

      for (String var6 : var1) {
         if (var6.toLowerCase(Locale.ROOT).contains(var2)) {
            class="kw">return true;
         }
      }

      class="kw">return false;
   }

   @Nullable
   class="kw">protected class="kw">static WorldEventsConfig config(@Nonnull World var0) {
      class="kw">return var0.getGameplayConfig().getPluginConfig().get(WorldEventsConfig.class);
   }

   class="kw">protected void openPage(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, @Nonnull WorldEventPanelPage var3) {
      Player var4 = var2.getComponent(var1, Player.getComponentType());
      if (var4 != null) {
         var4.getPageManager().openCustomPage(var1, var2, var3);
      }
   }

   @Nullable
   class="kw">protected class="kw">static UUID parseUuid(@Nullable String var0) {
      if (var0 != null && !var0.isEmpty()) {
         try {
            class="kw">return UUID.fromString(var0);
         } catch (IllegalArgumentException var2) {
            class="kw">return null;
         }
      } else {
         class="kw">return null;
      }
   }

   @Nonnull
   class="kw">protected Message stageLabel(@Nonnull WorldEvent var1, @Nonnull String var2) {
      WorldEventPanelPage.CachedProgress var3 = this.progressCache.get(var1.uuid);
      if (var3 == null || var3.stage() != var1.stage) {
         var3 = new WorldEventPanelPage.CachedProgress(var1.stage, StageProgress.of(var1));
         this.progressCache.put(var1.uuid, var3);
      }

      class="kw">return stageLabelFrom(var3.progress(), var1.stage, var2);
   }

   @Nonnull
   class="kw">protected class="kw">static Message stageLabelFrom(@Nullable StageProgress var0, @Nonnull Stage var1, @Nonnull String var2) {
      class="kw">return var0 != null ? var0.label(var2, var1.id()) : Message.translation(var2 + ".unknownStage").param("id", stageIdText(var1));
   }

   @Nonnull
   class="kw">protected Message stageBadge(@Nonnull WorldEvent var1) {
      class="kw">return this.stageLabel(var1, stageBadgeKey(var1));
   }

   @Nonnull
   class="kw">protected class="kw">static String stageBadgeKey(@Nonnull WorldEvent var0) {
      class="kw">return var0.isTransient ? "server.customUI.worldEventPanel.active.badge.class="kw">transient" : "server.customUI.worldEventPanel.active.badge.persistent";
   }

   @Nonnull
   class="kw">protected class="kw">static String stageIdText(@Nonnull Stage var0) {
      class="kw">return var0.id() == -1 ? "-" : String.valueOf(var0.id());
   }

   class="kw">public enum Action {
      Navigate,
      Filter,
      Refresh,
      Toggle,
      Back,
      Close,
      ResetAll,
      ConfirmAccept,
      ConfirmCancel,
      RowSelect,
      RowPrimary,
      RowSecondary,
      Teleport;

      Action() {
      }
   }

   class="kw">private record CachedProgress(@Nonnull Stage stage, @Nullable StageProgress progress) {
      class="kw">private CachedProgress {
      }
   }

   class="kw">public class="kw">static class PageData {
      class="kw">public class="kw">static class="kw">final BuilderCodec<WorldEventPanelPage.PageData> CODEC = BuilderCodec.builder(
            WorldEventPanelPage.PageData.class, WorldEventPanelPage.PageData::new
         )
         .append(new KeyedCodec<>("Action", new EnumCodec<>(WorldEventPanelPage.Action.class), false), (var0, var1) -> var0.action = var1, var0 -> var0.action)
         .add()
         .append(new KeyedCodec<>("Kind", Codec.STRING, false), (var0, var1) -> var0.kind = var1, var0 -> var0.kind)
         .add()
         .append(new KeyedCodec<>("Id", Codec.STRING, false), (var0, var1) -> var0.id = var1, var0 -> var0.id)
         .add()
         .append(new KeyedCodec<>("@Filter", Codec.STRING, false), (var0, var1) -> var0.filter = var1, var0 -> var0.filter)
         .add()
         .build();
      @Nullable
      class="kw">public WorldEventPanelPage.Action action;
      @Nullable
      class="kw">public String kind;
      @Nullable
      class="kw">public String id;
      @Nullable
      class="kw">public String filter;

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

   class="kw">protected class="kw">static class="kw">final class Row {
      @Nonnull
      class="kw">private class="kw">final String kind;
      @Nonnull
      class="kw">private class="kw">final String id;
      @Nonnull
      class="kw">private String label = "";
      @Nonnull
      class="kw">private String sub = "";
      @Nullable
      class="kw">private Message subMessage = null;
      @Nonnull
      class="kw">private String statusColor = "#4a5a6a";
      @Nullable
      class="kw">private Message badge = null;
      @Nullable
      class="kw">private WorldEventPanelPage.Action selectAction = null;
      @Nullable
      class="kw">private Message primaryText = null;
      @Nullable
      class="kw">private WorldEventPanelPage.Action primaryAction = null;
      @Nullable
      class="kw">private Message secondaryText = null;
      @Nullable
      class="kw">private WorldEventPanelPage.Action secondaryAction = null;
      class="kw">private boolean selected = false;

      class="kw">public Row(@Nonnull String var1, @Nonnull String var2) {
         this.kind = var1;
         this.id = var2;
      }

      @Nonnull
      class="kw">public WorldEventPanelPage.Row label(@Nonnull String var1) {
         this.label = var1;
         class="kw">return this;
      }

      @Nonnull
      class="kw">public WorldEventPanelPage.Row sub(@Nonnull String var1) {
         this.sub = var1;
         class="kw">return this;
      }

      @Nonnull
      class="kw">public WorldEventPanelPage.Row sub(@Nonnull Message var1) {
         this.subMessage = var1;
         class="kw">return this;
      }

      @Nonnull
      class="kw">public WorldEventPanelPage.Row status(@Nonnull String var1) {
         this.statusColor = var1;
         class="kw">return this;
      }

      @Nonnull
      class="kw">public WorldEventPanelPage.Row badge(@Nonnull Message var1) {
         this.badge = var1;
         class="kw">return this;
      }

      @Nonnull
      class="kw">public WorldEventPanelPage.Row select(@Nonnull WorldEventPanelPage.Action var1) {
         this.selectAction = var1;
         class="kw">return this;
      }

      @Nonnull
      class="kw">public WorldEventPanelPage.Row primary(@Nonnull Message var1, @Nonnull WorldEventPanelPage.Action var2) {
         this.primaryText = var1;
         this.primaryAction = var2;
         class="kw">return this;
      }

      @Nonnull
      class="kw">public WorldEventPanelPage.Row secondary(@Nonnull Message var1, @Nonnull WorldEventPanelPage.Action var2) {
         this.secondaryText = var1;
         this.secondaryAction = var2;
         class="kw">return this;
      }

      @Nonnull
      class="kw">public WorldEventPanelPage.Row selected(boolean var1) {
         this.selected = var1;
         class="kw">return this;
      }
   }

   class="kw">public enum Tab {
      ACTIVE("active", "server.customUI.worldEventPanel.tab.active", "server.customUI.worldEventPanel.tab.active.desc"),
      ASSETS("assets", "server.customUI.worldEventPanel.tab.assets", "server.customUI.worldEventPanel.tab.assets.desc"),
      CONFIG("config", "server.customUI.worldEventPanel.tab.config", "server.customUI.worldEventPanel.tab.config.desc"),
      GLOBAL("global", "server.customUI.worldEventPanel.tab.global", "server.customUI.worldEventPanel.tab.global.desc"),
      STORAGE("storage", "server.customUI.worldEventPanel.tab.storage", "server.customUI.worldEventPanel.tab.storage.desc");

      @Nonnull
      class="kw">private class="kw">final String id;
      @Nonnull
      class="kw">private class="kw">final String titleKey;
      @Nonnull
      class="kw">private class="kw">final String descriptionKey;

      Tab(@Nonnull class="kw">final String nullxx, @Nonnull class="kw">final String nullxxx, @Nonnull class="kw">final String nullxxxx) {
         this.id = nullxx;
         this.titleKey = nullxxx;
         this.descriptionKey = nullxxxx;
      }

      @Nonnull
      class="kw">public String id() {
         class="kw">return this.id;
      }

      @Nonnull
      class="kw">public String titleKey() {
         class="kw">return this.titleKey;
      }

      @Nonnull
      class="kw">public String descriptionKey() {
         class="kw">return this.descriptionKey;
      }

      @Nonnull
      class="kw">public WorldEventPanelPage create(@Nonnull PlayerRef var1) {
         class="kw">return class="kw">switch (this) {
            case ACTIVE -> new WorldEventActivePage(var1);
            case ASSETS -> new WorldEventAssetsPage(var1);
            case CONFIG -> new WorldEventConfigPage(var1);
            case GLOBAL -> new WorldEventGlobalPage(var1);
            case STORAGE -> new WorldEventStoragePage(var1);
         };
      }

      @Nullable
      class="kw">public class="kw">static WorldEventPanelPage.Tab fromId(@Nullable String var0) {
         if (var0 == null) {
            class="kw">return null;
         }

         for (WorldEventPanelPage.Tab var4 : values()) {
            if (var4.id.equals(var0)) {
               class="kw">return var4;
            }
         }

         class="kw">return null;
      }
   }

   class="kw">private class="kw">static class="kw">final class ValueOnlyCommandBuilder class="kw">extends UICommandBuilder {
      class="kw">private ValueOnlyCommandBuilder() {
      }

      @Nonnull
      @Override
      class="kw">public UICommandBuilder clear(String var1) {
         class="kw">return this;
      }

      @Nonnull
      @Override
      class="kw">public UICommandBuilder remove(String var1) {
         class="kw">return this;
      }

      @Nonnull
      @Override
      class="kw">public UICommandBuilder append(String var1) {
         class="kw">return this;
      }

      @Nonnull
      @Override
      class="kw">public UICommandBuilder append(String var1, String var2) {
         class="kw">return this;
      }

      @Nonnull
      @Override
      class="kw">public UICommandBuilder appendInline(String var1, String var2) {
         class="kw">return this;
      }

      @Nonnull
      @Override
      class="kw">public UICommandBuilder insertBefore(String var1, String var2) {
         class="kw">return this;
      }

      @Nonnull
      @Override
      class="kw">public UICommandBuilder insertBeforeInline(String var1, String var2) {
         class="kw">return this;
      }
   }
}