PageData class

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

Файл: com/hypixel/hytale/builtin/points/ui/PointInspectorPage.java

Поля (29)

МодификаторыТипИмя
public static final BuilderCodec<PointInspectorPage.PageData> CODEC
static final String KEY_ACTION
static final String KEY_FILTER
static final String KEY_ID
static final String KEY_NAME
static final String KEY_POS_X
static final String KEY_POS_Y
static final String KEY_POS_Z
static final String KEY_REMOVE_KEY
static final String KEY_ROT_X
static final String KEY_ROT_Y
static final String KEY_ROT_Z
static final String KEY_TAG_KEY
static final String KEY_TAG_VALUE
static final String KEY_WORLD
private String action
private String filterText
private String id
private String name
private String posX
private String posY
private String posZ
private String removeKey
private String rotX
private String rotY
private String rotZ
private String tagKey
private String tagValue
private String worldName

Исходный код

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

class="kw">import com.hypixel.hytale.builtin.buildertools.BuilderToolsPlugin;
class="kw">import com.hypixel.hytale.builtin.points.PointsPlugin;
class="kw">import com.hypixel.hytale.builtin.points.manager.PointEntry;
class="kw">import com.hypixel.hytale.builtin.points.manager.PointManager;
class="kw">import com.hypixel.hytale.builtin.points.snapshot.PointSnapshot;
class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.protocol.packets.interface_.CustomPageLifetime;
class="kw">import com.hypixel.hytale.protocol.packets.interface_.CustomUIEventBindingType;
class="kw">import com.hypixel.hytale.protocol.packets.player.PointToolSelection;
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.teleport.Teleport;
class="kw">import com.hypixel.hytale.server.core.ui.Anchor;
class="kw">import com.hypixel.hytale.server.core.ui.DropdownEntryInfo;
class="kw">import com.hypixel.hytale.server.core.ui.LocalizableString;
class="kw">import com.hypixel.hytale.server.core.ui.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.Universe;
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 it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.util.ArrayList;
class="kw">import java.util.List;
class="kw">import java.util.Locale;
class="kw">import java.util.Map;
class="kw">import java.util.Objects;
class="kw">import java.util.Map.Entry;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3f;

class="kw">public class PointInspectorPage class="kw">extends InteractiveCustomUIPage<PointInspectorPage.PageData> {
   class="kw">private class="kw">static class="kw">final Value<String> NORMAL_ROW_STYLE = Value.ref("Pages/TriggerVolume/TriggerVolumeBrowseGroupRow.ui", "NormalRowStyle");
   class="kw">private class="kw">static class="kw">final Value<String> SELECTED_ROW_STYLE = Value.ref("Pages/TriggerVolume/TriggerVolumeBrowseGroupRow.ui", "SelectedRowStyle");
   class="kw">private class="kw">static class="kw">final String PAGE = "Pages/Point/PointInspectorPage.ui";
   class="kw">private class="kw">static class="kw">final String POINT_ROW = "Pages/TriggerVolume/TriggerVolumeBrowseVolumeRow.ui";
   class="kw">private class="kw">static class="kw">final String TAG_CHIP = "Pages/TriggerVolume/TriggerVolumeTagChip.ui";
   class="kw">private class="kw">static class="kw">final String SECTION_LABEL = "Pages/TriggerVolume/TriggerVolumeInspectorSectionLabel.ui";
   class="kw">private class="kw">static class="kw">final String TAG_ROW = "Pages/Point/PointTagRow.ui";
   class="kw">private class="kw">static class="kw">final int[] TAG_CHIP_COLORS = new int[]{
      5223543,
      4176047,
      5214176,
      7237344,
      10181046,
      13393320,
      14707612,
      14715452,
      14070332,
      14247259,
      6013118,
      8365648,
      11566278,
      15241563,
      13194606,
      4878288,
      4894348,
      12546880,
      7317724,
      13332382
   };
   class="kw">private class="kw">static class="kw">final int OVERFLOW_CHIP_COLOR = 5596014;
   class="kw">private class="kw">static class="kw">final int ROW_CHIP_BUDGET = 252;
   class="kw">private class="kw">static class="kw">final String ACTION_SELECT = "Select";
   class="kw">private class="kw">static class="kw">final String ACTION_CHANGE_WORLD = "ChangeWorld";
   class="kw">private class="kw">static class="kw">final String ACTION_FILTER = "Filter";
   class="kw">private class="kw">static class="kw">final String ACTION_SAVE_NAME = "SaveName";
   class="kw">private class="kw">static class="kw">final String ACTION_SAVE_TRANSFORM = "SaveTransform";
   class="kw">private class="kw">static class="kw">final String ACTION_TELEPORT = "Teleport";
   class="kw">private class="kw">static class="kw">final String ACTION_ADD_TAG = "AddTag";
   class="kw">private class="kw">static class="kw">final String ACTION_REMOVE_TAG = "RemoveTag";
   class="kw">private class="kw">static class="kw">final String ACTION_DELETE = "Delete";
   class="kw">private class="kw">final PointManager.SelectionObserver selectionObserver = this::onExternalSelectionChanged;
   @Nonnull
   class="kw">private String selectedWorld;
   @Nullable
   class="kw">private String selectedId;
   @Nonnull
   class="kw">private String filterText = "";
   class="kw">private boolean suppressSelectionObserver;

   class="kw">public PointInspectorPage(@Nonnull PlayerRef var1, @Nonnull String var2, @Nullable String var3) {
      super(var1, CustomPageLifetime.CanDismiss, PointInspectorPage.PageData.CODEC);
      this.selectedWorld = var2.toLowerCase(Locale.ROOT);
      this.selectedId = var3;
   }

   @Override
   class="kw">public void build(@Nonnull Ref<EntityStore> var1, @Nonnull UICommandBuilder var2, @Nonnull UIEventBuilder var3, @Nonnull Store<EntityStore> var4) {
      var2.append("Pages/Point/PointInspectorPage.ui");
      this.registerSelectionObserver();
      this.buildWorldDropdown(var2);
      this.buildList(var2, var3);
      this.buildContent(var2, var3);
      this.bindStaticEvents(var3);
   }

   @Override
   class="kw">public void onDismiss(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2) {
      PointManager var3 = getManagerForWorld(this.selectedWorld);
      if (var3 != null) {
         var3.clearSelectionObserver(this.playerRef.getUuid(), this.selectionObserver);
      }
   }

   class="kw">public void handleDataEvent(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, @Nonnull PointInspectorPage.PageData var3) {
      if (var3.action != null) {
         class="kw">switch (var3.action) {
            case "Select":
               this.onSelect(var3);
               break;
            case "ChangeWorld":
               this.onChangeWorld(var3);
               break;
            case "Filter":
               this.onFilterChanged(var3);
               break;
            case "SaveName":
               this.onSaveName(var3);
               break;
            case "SaveTransform":
               this.onSaveTransform(var3, var1, var2);
               break;
            case "Teleport":
               this.onTeleport(var1, var2);
               break;
            case "AddTag":
               this.onAddTag(var3);
               break;
            case "RemoveTag":
               this.onRemoveTag(var3);
               break;
            case "Delete":
               this.onDeletePoint(var1, var2);
         }
      }
   }

   class="kw">private void onSelect(@Nonnull PointInspectorPage.PageData var1) {
      this.selectedId = var1.id;
      this.syncSelectionToTool();
      this.rebuildAll();
   }

   class="kw">private void onChangeWorld(@Nonnull PointInspectorPage.PageData var1) {
      if (var1.worldName != null) {
         String var2 = var1.worldName.toLowerCase(Locale.ROOT);
         if (!var2.equals(this.selectedWorld)) {
            PointManager var3 = getManagerForWorld(this.selectedWorld);
            if (var3 != null) {
               var3.clearSelectionObserver(this.playerRef.getUuid(), this.selectionObserver);
            }

            this.selectedWorld = var2;
            this.selectedId = null;
            this.registerSelectionObserver();
            this.syncSelectionToTool();
            this.rebuildAll();
         }
      }
   }

   class="kw">private void onFilterChanged(@Nonnull PointInspectorPage.PageData var1) {
      this.filterText = var1.filterText != null ? var1.filterText.trim().toLowerCase(Locale.ROOT) : "";
      this.rebuildAll();
   }

   class="kw">private void onSaveName(@Nonnull PointInspectorPage.PageData var1) {
      PointEntry var2 = this.resolvePoint();
      if (var2 != null) {
         var2.setName(var1.name != null && !var1.name.isBlank() ? var1.name.trim() : null);
         this.afterPointMutated(var2);
      }
   }

   class="kw">private void onSaveTransform(@Nonnull PointInspectorPage.PageData var1, @Nonnull Ref<EntityStore> var2, @Nonnull Store<EntityStore> var3) {
      PointManager var4 = getManagerForWorld(this.selectedWorld);
      PointEntry var5 = this.resolvePoint();
      if (var4 != null && var5 != null) {
         Vector3d var6 = var5.getPosition();
         Vector3f var7 = var5.getRotation();
         Vector3d var8 = new Vector3d(parseOr(var1.posX, var6.x()), parseOr(var1.posY, var6.y()), parseOr(var1.posZ, var6.z()));
         Vector3f var9 = new Vector3f((float)parseOr(var1.rotX, var7.x()), (float)parseOr(var1.rotY, var7.y()), (float)parseOr(var1.rotZ, var7.z()));
         Player var10 = var3.getComponent(var2, Player.getComponentType());
         if (var10 != null) {
            BuilderToolsPlugin.getState(var10, this.playerRef).pushPointHistory(PointSnapshot.ofMutate(var5));
         }

         var5.setPosition(var8);
         var5.setRotation(var9);
         var4.markSpatialDirty();
         this.afterPointMutated(var5);
      }
   }

   class="kw">private void onTeleport(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2) {
      PointEntry var3 = this.resolvePoint();
      World var4 = getWorldByName(this.selectedWorld);
      if (var3 != null && var4 != null) {
         World var5 = var4.equals(var2.getExternalData().getWorld()) ? null : var4;
         var2.addComponent(var1, Teleport.getComponentType(), Teleport.createForPlayer(var5, var3.getTransform()));
         this.close();
      }
   }

   class="kw">private void onAddTag(@Nonnull PointInspectorPage.PageData var1) {
      PointManager var2 = getManagerForWorld(this.selectedWorld);
      PointEntry var3 = this.resolvePoint();
      if (var2 != null && var3 != null && var1.tagKey != null && !var1.tagKey.isBlank()) {
         if (var2.setTag(var3.getId(), var1.tagKey, var1.tagValue)) {
            this.afterPointMutated(var3);
         }
      }
   }

   class="kw">private void onRemoveTag(@Nonnull PointInspectorPage.PageData var1) {
      PointManager var2 = getManagerForWorld(this.selectedWorld);
      PointEntry var3 = this.resolvePoint();
      if (var2 != null && var3 != null && var1.removeKey != null) {
         if (var2.removeTag(var3.getId(), var1.removeKey)) {
            this.afterPointMutated(var3);
         }
      }
   }

   class="kw">private void afterPointMutated(@Nonnull PointEntry var1) {
      PointManager var2 = getManagerForWorld(this.selectedWorld);
      if (var2 != null) {
         var2.notifyViewersAdd(var1);
      }

      this.rebuildAll();
   }

   class="kw">private void onDeletePoint(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2) {
      PointManager var3 = getManagerForWorld(this.selectedWorld);
      PointEntry var4 = this.resolvePoint();
      if (var3 != null && var4 != null) {
         Player var5 = var2.getComponent(var1, Player.getComponentType());
         if (var5 != null) {
            BuilderToolsPlugin.getState(var5, this.playerRef).pushPointHistory(PointSnapshot.ofDelete(var4));
         }

         var3.unregister(var4.getId());
         var3.notifyViewersRemove(var4.getId());
         this.selectedId = null;
         this.syncSelectionToTool();
         this.rebuildAll();
      }
   }

   class="kw">private void rebuildAll() {
      UICommandBuilder var1 = new UICommandBuilder();
      UIEventBuilder var2 = new UIEventBuilder();
      this.buildWorldDropdown(var1);
      this.buildList(var1, var2);
      this.buildContent(var1, var2);
      this.bindStaticEvents(var2);
      this.sendUpdate(var1, var2, false);
   }

   class="kw">private void bindStaticEvents(@Nonnull UIEventBuilder var1) {
      var1.addEventBinding(
         CustomUIEventBindingType.ValueChanged, "#WorldDropdown", new EventData().put("Action", "ChangeWorld").put("@WorldName", "#WorldDropdown.Value"), false
      );
      var1.addEventBinding(
         CustomUIEventBindingType.ValueChanged, "#FilterField", new EventData().put("Action", "Filter").put("@FilterText", "#FilterField.Value"), false
      );
      var1.addEventBinding(CustomUIEventBindingType.Activating, "#SaveNameButton", new EventData().put("Action", "SaveName").put("@Name", "#NameField.Value"));
      var1.addEventBinding(
         CustomUIEventBindingType.Activating,
         "#SaveTransformButton",
         new EventData()
            .put("Action", "SaveTransform")
            .put("@PosX", "#PosXField.Value")
            .put("@PosY", "#PosYField.Value")
            .put("@PosZ", "#PosZField.Value")
            .put("@RotX", "#RotXField.Value")
            .put("@RotY", "#RotYField.Value")
            .put("@RotZ", "#RotZField.Value")
      );
      var1.addEventBinding(CustomUIEventBindingType.Activating, "#TeleportButton", new EventData().put("Action", "Teleport"));
      var1.addEventBinding(
         CustomUIEventBindingType.Activating,
         "#AddTagButton",
         new EventData().put("Action", "AddTag").put("@TagKey", "#TagKeyField.Value").put("@TagValue", "#TagValueField.Value"),
         false
      );
      var1.addEventBinding(CustomUIEventBindingType.Activating, "#DeletePointButton", new EventData().put("Action", "Delete"));
   }

   class="kw">private void buildWorldDropdown(@Nonnull UICommandBuilder var1) {
      ObjectArrayList var2 = new ObjectArrayList();

      for (World var4 : Universe.get().getWorlds().values()) {
         String var5 = var4.getName().toLowerCase(Locale.ROOT);
         var2.add(new DropdownEntryInfo(LocalizableString.fromString(var5), var5));
      }

      var1.set("#WorldDropdown.Entries", var2);
      var1.set("#WorldDropdown.Value", this.selectedWorld);
      var1.set("#FilterField.Value", this.filterText);
   }

   class="kw">private void buildList(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2) {
      var1.clear("#ListContainer");
      PointManager var3 = getManagerForWorld(this.selectedWorld);
      if (var3 != null && !var3.getPointsMap().isEmpty()) {
         int var4 = 0;

         for (PointEntry var6 : var3.getPointsMap().values()) {
            if (this.matchesPointFilter(var6)) {
               var4 = this.appendPointRow(var1, var2, var4, var6);
            }
         }

         if (var4 == 0) {
            this.appendListMessage(var1, Message.translation("server.customUI.pointInspector.noMatches"));
         }
      } else {
         this.appendListMessage(var1, Message.translation("server.customUI.pointInspector.emptyState"));
      }
   }

   class="kw">private int appendPointRow(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2, int var3, @Nonnull PointEntry var4) {
      String var5 = "#ListContainer[" + var3 + "]";
      var1.append("#ListContainer", "Pages/TriggerVolume/TriggerVolumeBrowseVolumeRow.ui");
      var1.set(var5 + " #Label.Text", displayName(var4));
      int var6 = this.appendRowTagChips(var1, var5 + " #TagChips", var4.getRawTags());
      var1.set(var5 + " #TagChips.Visible", var6 > 0);
      if (var6 > 0) {
         Anchor var7 = new Anchor();
         var7.setHeight(Value.of(var6 == 1 ? 44 : 64));
         var1.setObject(var5 + ".Anchor", var7);
      }

      var1.set(var5 + ".Style", var4.getId().equals(this.selectedId) ? SELECTED_ROW_STYLE : NORMAL_ROW_STYLE);
      var2.addEventBinding(CustomUIEventBindingType.Activating, var5, new EventData().put("Action", "Select").put("Id", var4.getId()), false);
      class="kw">return var3 + 1;
   }

   class="kw">private void appendListMessage(@Nonnull UICommandBuilder var1, @Nonnull Message var2) {
      var1.append("#ListContainer", "Pages/TriggerVolume/TriggerVolumeInspectorSectionLabel.ui");
      var1.set("#ListContainer[0].Text", var2);
   }

   class="kw">private void buildContent(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2) {
      var1.clear("#TagsList");
      PointEntry var3 = this.resolvePoint();
      var1.set("#InspectorContent.Visible", var3 != null);
      var1.set("#DeletePointButton.Disabled", var3 == null);
      if (var3 == null) {
         var1.set("#SelectionLabel.Text", Message.translation("server.customUI.pointInspector.noSelection"));
         var1.set("#NameField.Value", "");
      } else {
         var1.set("#SelectionLabel.Text", Message.translation("server.customUI.pointInspector.editing").param("id", displayName(var3)));
         var1.set("#NameField.Value", var3.getName() != null ? var3.getName() : "");
         Vector3d var4 = var3.getPosition();
         Vector3f var5 = var3.getRotation();
         var1.set("#PosXField.Value", fmt(var4.x()));
         var1.set("#PosYField.Value", fmt(var4.y()));
         var1.set("#PosZField.Value", fmt(var4.z()));
         var1.set("#RotXField.Value", fmt(var5.x()));
         var1.set("#RotYField.Value", fmt(var5.y()));
         var1.set("#RotZField.Value", fmt(var5.z()));
         int var6 = 0;

         for (Entry var8 : var3.getRawTags().entrySet()) {
            String var9 = "#TagsList[" + var6 + "]";
            var1.append("#TagsList", "Pages/Point/PointTagRow.ui");
            var1.set(var9 + " #TagLabel.Text", var8.getKey() + ": " + var8.getValue());
            var2.addEventBinding(
               CustomUIEventBindingType.Activating, var9 + " #RemoveButton", new EventData().put("Action", "RemoveTag").put("RemoveKey", var8.getKey())
            );
            var6++;
         }
      }
   }

   class="kw">private int appendRowTagChips(@Nonnull UICommandBuilder var1, @Nonnull String var2, @Nonnull Map<String, String> var3) {
      if (var3.isEmpty()) {
         class="kw">return 0;
      }

      List var4 = this.orderedRowTags(var3);
      int var5 = 0;
      int var6 = 1;
      int var7 = 0;

      for (int var8 = 0; var8 < var4.size(); var8++) {
         Entry var9 = var4.get(var8);
         String var10 = this.chipDisplay(var9.getKey(), var9.getValue());
         int var11 = chipWidth(var10);
         if (var7 > 0 && var7 + var11 > 252) {
            if (var6 == 2) {
               this.appendChip(var1, var2, var5, "+" + (var4.size() - var8), 5596014);
               class="kw">return 2;
            }

            var6++;
            var7 = 0;
         }

         this.appendChip(var1, var2, var5++, var10, tagChipColor(var9.getKey()));
         var7 += var11;
      }

      class="kw">return var6;
   }

   @Nonnull
   class="kw">private List<Entry<String, String>> orderedRowTags(@Nonnull Map<String, String> var1) {
      ArrayList var2 = new ArrayList<>(var1.entrySet());
      if (!this.filterText.isEmpty()) {
         var2.sort(
            (var1x, var2x) -> Boolean.compare(this.tagMatchesFilter(var2x.getKey(), var2x.getValue()), this.tagMatchesFilter(var1x.getKey(), var1x.getValue()))
         );
      }

      class="kw">return var2;
   }

   @Nonnull
   class="kw">private String chipDisplay(@Nonnull String var1, @Nullable String var2) {
      boolean var3 = var2 != null && !var2.isEmpty();
      boolean var4 = var3 && !this.filterText.isEmpty() && var2.toLowerCase(Locale.ROOT).contains(this.filterText);
      class="kw">return var4 ? var1 + ": " + var2 : var1;
   }

   class="kw">private void appendChip(@Nonnull UICommandBuilder var1, @Nonnull String var2, int var3, @Nonnull String var4, int var5) {
      String var6 = var2 + "[" + var3 + "]";
      var1.append(var2, "Pages/TriggerVolume/TriggerVolumeTagChip.ui");
      var1.setObject(var6 + ".Background", new PatchStyle().setColor(Value.of(colorToHex(var5) + "99")));
      var1.set(var6 + " #ChipLabel.Text", var4);
   }

   class="kw">private class="kw">static int chipWidth(@Nonnull String var0) {
      class="kw">return (int)Math.ceil(var0.length() * 6.2) + 14;
   }

   class="kw">private class="kw">static int tagChipColor(@Nonnull String var0) {
      int var1 = var0.toLowerCase(Locale.ROOT).hashCode();
      var1 ^= var1 >>> 16;
      var1 *= 2146121005;
      var1 ^= var1 >>> 15;
      var1 *= -2073254261;
      var1 ^= var1 >>> 16;
      class="kw">return TAG_CHIP_COLORS[Math.floorMod(var1, TAG_CHIP_COLORS.length)];
   }

   @Nonnull
   class="kw">private class="kw">static String colorToHex(int var0) {
      class="kw">return String.format("#%02X%02X%02X", var0 >> 16 & 0xFF, var0 >> 8 & 0xFF, var0 & 0xFF);
   }

   class="kw">private boolean matchesPointFilter(@Nonnull PointEntry var1) {
      if (this.filterText.isEmpty()) {
         class="kw">return true;
      }

      if (var1.getId().toLowerCase(Locale.ROOT).contains(this.filterText)) {
         class="kw">return true;
      }

      if (var1.getName() != null && var1.getName().toLowerCase(Locale.ROOT).contains(this.filterText)) {
         class="kw">return true;
      }

      for (Entry var3 : var1.getRawTags().entrySet()) {
         if (this.tagMatchesFilter(var3.getKey(), var3.getValue())) {
            class="kw">return true;
         }
      }

      class="kw">return false;
   }

   class="kw">private boolean tagMatchesFilter(@Nonnull String var1, @Nullable String var2) {
      if (this.filterText.isEmpty()) {
         class="kw">return false;
      }

      String var3 = var1.toLowerCase(Locale.ROOT);
      String var4 = var2 != null ? var2.toLowerCase(Locale.ROOT) : "";
      class="kw">return var3.contains(this.filterText) || var4.contains(this.filterText) || (var3 + "=" + var4).contains(this.filterText);
   }

   class="kw">private void registerSelectionObserver() {
      PointManager var1 = getManagerForWorld(this.selectedWorld);
      if (var1 != null) {
         var1.setSelectionObserver(this.playerRef.getUuid(), this.selectionObserver);
      }
   }

   class="kw">private void onExternalSelectionChanged(@Nullable String var1) {
      if (!this.suppressSelectionObserver && !Objects.equals(this.selectedId, var1)) {
         PointManager var2 = getManagerForWorld(this.selectedWorld);
         if (var1 == null || var2 != null && var2.getPoint(var1) != null) {
            this.selectedId = var1;
            this.rebuildAll();
         }
      }
   }

   class="kw">private void syncSelectionToTool() {
      PointManager var1 = getManagerForWorld(this.selectedWorld);
      PointToolSelection var2 = new PointToolSelection();
      if (this.selectedId != null && var1 != null && var1.getPoint(this.selectedId) != null) {
         var2.primaryPointId = this.selectedId;
         var2.pointIds = new String[]{this.selectedId};
      }

      if (var1 != null) {
         this.suppressSelectionObserver = true;
         var1.setPlayerSelection(this.playerRef.getUuid(), var2.primaryPointId);
         this.suppressSelectionObserver = false;
      }

      this.playerRef.getPacketHandler().write(var2);
   }

   @Nonnull
   class="kw">private class="kw">static String displayName(@Nonnull PointEntry var0) {
      class="kw">return var0.getName() != null && !var0.getName().isBlank() ? var0.getName() : var0.getId();
   }

   class="kw">private class="kw">static String fmt(double var0) {
      class="kw">return String.format(Locale.ROOT, "%.3f", var0);
   }

   class="kw">private class="kw">static double parseOr(@Nullable String var0, double var1) {
      if (var0 != null && !var0.isBlank()) {
         try {
            class="kw">return Double.parseDouble(var0.trim());
         } catch (NumberFormatException var4) {
            class="kw">return var1;
         }
      } else {
         class="kw">return var1;
      }
   }

   @Nullable
   class="kw">private PointEntry resolvePoint() {
      PointManager var1 = getManagerForWorld(this.selectedWorld);
      class="kw">return var1 != null && this.selectedId != null ? var1.getPoint(this.selectedId) : null;
   }

   @Nullable
   class="kw">private class="kw">static PointManager getManagerForWorld(@Nonnull String var0) {
      class="kw">return PointsPlugin.get().getManagerForWorld(var0);
   }

   @Nullable
   class="kw">private class="kw">static World getWorldByName(@Nonnull String var0) {
      class="kw">return PointsPlugin.get().getWorldByName(var0);
   }

   class="kw">public class="kw">static class PageData {
      class="kw">static class="kw">final String KEY_ACTION = "Action";
      class="kw">static class="kw">final String KEY_ID = "Id";
      class="kw">static class="kw">final String KEY_WORLD = "@WorldName";
      class="kw">static class="kw">final String KEY_FILTER = "@FilterText";
      class="kw">static class="kw">final String KEY_NAME = "@Name";
      class="kw">static class="kw">final String KEY_TAG_KEY = "@TagKey";
      class="kw">static class="kw">final String KEY_TAG_VALUE = "@TagValue";
      class="kw">static class="kw">final String KEY_REMOVE_KEY = "RemoveKey";
      class="kw">static class="kw">final String KEY_POS_X = "@PosX";
      class="kw">static class="kw">final String KEY_POS_Y = "@PosY";
      class="kw">static class="kw">final String KEY_POS_Z = "@PosZ";
      class="kw">static class="kw">final String KEY_ROT_X = "@RotX";
      class="kw">static class="kw">final String KEY_ROT_Y = "@RotY";
      class="kw">static class="kw">final String KEY_ROT_Z = "@RotZ";
      class="kw">public class="kw">static class="kw">final BuilderCodec<PointInspectorPage.PageData> CODEC = BuilderCodec.builder(
            PointInspectorPage.PageData.class, PointInspectorPage.PageData::new
         )
         .addField(new KeyedCodec<>("Action", Codec.STRING), (var0, var1) -> var0.action = var1, var0 -> var0.action)
         .addField(new KeyedCodec<>("Id", Codec.STRING), (var0, var1) -> var0.id = var1, var0 -> var0.id)
         .addField(new KeyedCodec<>("@WorldName", Codec.STRING), (var0, var1) -> var0.worldName = var1, var0 -> var0.worldName)
         .addField(new KeyedCodec<>("@FilterText", Codec.STRING), (var0, var1) -> var0.filterText = var1, var0 -> var0.filterText)
         .addField(new KeyedCodec<>("@Name", Codec.STRING), (var0, var1) -> var0.name = var1, var0 -> var0.name)
         .addField(new KeyedCodec<>("@TagKey", Codec.STRING), (var0, var1) -> var0.tagKey = var1, var0 -> var0.tagKey)
         .addField(new KeyedCodec<>("@TagValue", Codec.STRING), (var0, var1) -> var0.tagValue = var1, var0 -> var0.tagValue)
         .addField(new KeyedCodec<>("RemoveKey", Codec.STRING), (var0, var1) -> var0.removeKey = var1, var0 -> var0.removeKey)
         .addField(new KeyedCodec<>("@PosX", Codec.STRING), (var0, var1) -> var0.posX = var1, var0 -> var0.posX)
         .addField(new KeyedCodec<>("@PosY", Codec.STRING), (var0, var1) -> var0.posY = var1, var0 -> var0.posY)
         .addField(new KeyedCodec<>("@PosZ", Codec.STRING), (var0, var1) -> var0.posZ = var1, var0 -> var0.posZ)
         .addField(new KeyedCodec<>("@RotX", Codec.STRING), (var0, var1) -> var0.rotX = var1, var0 -> var0.rotX)
         .addField(new KeyedCodec<>("@RotY", Codec.STRING), (var0, var1) -> var0.rotY = var1, var0 -> var0.rotY)
         .addField(new KeyedCodec<>("@RotZ", Codec.STRING), (var0, var1) -> var0.rotZ = var1, var0 -> var0.rotZ)
         .build();
      class="kw">private String action;
      class="kw">private String id;
      class="kw">private String worldName;
      class="kw">private String filterText;
      class="kw">private String name;
      class="kw">private String tagKey;
      class="kw">private String tagValue;
      class="kw">private String removeKey;
      class="kw">private String posX;
      class="kw">private String posY;
      class="kw">private String posZ;
      class="kw">private String rotX;
      class="kw">private String rotY;
      class="kw">private String rotZ;

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