Action enum

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

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

Поля (1)

МодификаторыТипИмя
Navigate, Filter, Refresh, Toggle, Back, Close, ResetAll, ConfirmAccept, ConfirmCancel, RowSelect, RowPrimary, RowSecondary, Teleport

Исходный код

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