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;
}
}
}