PageData class

Пакет: com.hypixel.hytale.builtin.instances.page

Файл: com/hypixel/hytale/builtin/instances/page/InstanceListPage.java

Поля (8)

МодификаторыТипИмя
public static final BuilderCodec<InstanceListPage.PageData> CODEC
public static final String KEY_ACTION
public static final String KEY_INSTANCE
private InstanceListPage.Action action
private String file
private String instance
private String searchQuery
private String searchResult

Методы (2)

МодификаторыВозвратСигнатура
public InstanceListPage.Action getActionpublic InstanceListPage.Action getAction()
public String getInstancepublic String getInstance()

Исходный код

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

class="kw">import com.hypixel.hytale.assetstore.AssetPack;
class="kw">import com.hypixel.hytale.builtin.instances.InstancesPlugin;
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.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.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.math.vector.Transform;
class="kw">import com.hypixel.hytale.protocol.packets.interface_.CustomPageLifetime;
class="kw">import com.hypixel.hytale.protocol.packets.interface_.CustomUIEventBindingType;
class="kw">import com.hypixel.hytale.server.core.Message;
class="kw">import com.hypixel.hytale.server.core.asset.AssetModule;
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.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.teleport.Teleport;
class="kw">import com.hypixel.hytale.server.core.ui.browser.FileBrowserConfig;
class="kw">import com.hypixel.hytale.server.core.ui.browser.FileBrowserEventData;
class="kw">import com.hypixel.hytale.server.core.ui.browser.ServerFileBrowser;
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.nio.file.Files;
class="kw">import java.nio.file.Path;
class="kw">import java.util.Locale;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;

class="kw">public class InstanceListPage class="kw">extends InteractiveCustomUIPage<InstanceListPage.PageData> {
   @Nonnull
   class="kw">private class="kw">static class="kw">final String ASSET_PACK_SUB_PATH = "Server/Instances";
   @Nullable
   class="kw">private String selectedInstance;
   @Nonnull
   class="kw">private class="kw">final ServerFileBrowser browser;

   class="kw">public InstanceListPage(@Nonnull PlayerRef var1) {
      super(var1, CustomPageLifetime.CanDismiss, InstanceListPage.PageData.CODEC);
      FileBrowserConfig var2 = FileBrowserConfig.builder()
         .listElementId("#List")
         .searchInputId("#SearchInput")
         .currentPathId("#CurrentPath")
         .enableRootSelector(false)
         .enableSearch(true)
         .enableDirectoryNav(true)
         .maxResults(50)
         .assetPackMode(true, "Server/Instances")
         .terminalDirectoryPredicate(var0 -> Files.exists(var0.resolve("instance.bson")))
         .build();
      this.browser = new ServerFileBrowser(var2);
   }

   @Override
   class="kw">public void build(@Nonnull Ref<EntityStore> var1, @Nonnull UICommandBuilder var2, @Nonnull UIEventBuilder var3, @Nonnull Store<EntityStore> var4) {
      var2.append("Pages/InstanceListPage.ui");
      var3.addEventBinding(CustomUIEventBindingType.Activating, "#Spawn", EventData.of("Action", InstanceListPage.Action.Spawn.toString()));
      var3.addEventBinding(CustomUIEventBindingType.Activating, "#Load", EventData.of("Action", InstanceListPage.Action.Load.toString()));
      var2.set("#Load.Visible", hasEditablePack());
      this.browser.buildCurrentPath(var2);
      this.browser.buildSearchInput(var2, var3);
      this.browser.buildFileList(var2, var3);
      var2.set("#Name.Text", this.selectedInstance != null ? this.selectedInstance : "");
      var2.set("#Name.Visible", this.selectedInstance != null);
      var2.set("#Spawn.Disabled", this.selectedInstance == null);
      var2.set("#Load.Disabled", this.selectedInstance == null);
   }

   class="kw">public void handleDataEvent(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, @Nonnull InstanceListPage.PageData var3) {
      if (var3.searchQuery != null) {
         this.browser.setSearchQuery(var3.searchQuery.trim().toLowerCase(Locale.ROOT));
         UICommandBuilder var8 = new UICommandBuilder();
         UIEventBuilder var11 = new UIEventBuilder();
         this.browser.buildCurrentPath(var8);
         this.browser.buildFileList(var8, var11);
         this.sendUpdate(var8, var11, false);
      } else if (var3.searchResult != null) {
         Path var7 = this.browser.resolveAssetPackPath(var3.searchResult);
         if (var7 != null && this.isInstance(var7)) {
            this.updateSelection(var3.searchResult);
         }
      } else if (var3.file != null) {
         String var4 = var3.file;
         if ("..".equals(var4)) {
            this.browser.navigateUp();
            this.selectedInstance = null;
            UICommandBuilder var10 = new UICommandBuilder();
            UIEventBuilder var13 = new UIEventBuilder();
            this.browser.buildCurrentPath(var10);
            this.browser.buildFileList(var10, var13);
            var10.set("#Name.Text", "");
            var10.set("#Name.Visible", false);
            var10.set("#Spawn.Disabled", true);
            var10.set("#Load.Disabled", true);
            this.sendUpdate(var10, var13, false);
         } else {
            if (this.browser.handleEvent(FileBrowserEventData.file(var4))) {
               this.selectedInstance = null;
               UICommandBuilder var5 = new UICommandBuilder();
               UIEventBuilder var6 = new UIEventBuilder();
               this.browser.buildCurrentPath(var5);
               this.browser.buildFileList(var5, var6);
               var5.set("#Name.Text", "");
               var5.set("#Name.Visible", false);
               var5.set("#Spawn.Disabled", true);
               var5.set("#Load.Disabled", true);
               this.sendUpdate(var5, var6, false);
            } else {
               String var9 = this.browser.getAssetPackCurrentPath().isEmpty() ? var4 : this.browser.getAssetPackCurrentPath() + "/" + var4;
               Path var12 = this.browser.resolveAssetPackPath(var9);
               if (var12 != null && this.isInstance(var12)) {
                  this.updateSelection(var9);
               }
            }
         }
      } else {
         if (var3.getAction() != null) {
            class="kw">switch (var3.getAction()) {
               case Select:
               class="kw">default:
                  break;
               case Load:
                  if (this.selectedInstance != null) {
                     this.load(var1, var2);
                     this.close();
                  }
                  break;
               case Spawn:
                  if (this.selectedInstance != null) {
                     this.spawn(var1, var2);
                     this.close();
                  }
            }
         }
      }
   }

   class="kw">private boolean isInstance(@Nonnull Path var1) {
      class="kw">return Files.isDirectory(var1) && Files.exists(var1.resolve("instance.bson"));
   }

   class="kw">private void load(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2) {
      String var3 = this.getInstanceNameFromVirtualPath(this.selectedInstance);
      if (var3 != null) {
         if (AssetModule.get().isAssetPathImmutable(InstancesPlugin.getInstanceAssetPath(var3))) {
            this.playerRef.sendMessage(Message.translation("server.commands.instances.edit.assetsImmutable"));
         } else {
            InstancesPlugin.loadInstanceAssetForEdit(var3).thenAccept(var1x -> {
               Store var2 = var1.getStore();
               World var3 = var2.getExternalData().getWorld();
               var3.execute(() -> {
                  Transform var3 = var1x.getWorldConfig().getSpawnProvider().getSpawnPoint(var1, var2);
                  Teleport var4 = Teleport.createForPlayer(var1x, var3);
                  var2.addComponent(var1, Teleport.getComponentType(), var4);
               });
            }).exceptionally(var0 -> {
               var0.printStackTrace();
               class="kw">return null;
            });
         }
      }
   }

   class="kw">private class="kw">static boolean hasEditablePack() {
      for (AssetPack var1 : AssetModule.get().getAssetPacks()) {
         if (!var1.isImmutable()) {
            class="kw">return true;
         }
      }

      class="kw">return false;
   }

   class="kw">private void spawn(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2) {
      String var3 = this.getInstanceNameFromVirtualPath(this.selectedInstance);
      if (var3 != null) {
         World var4 = var2.getExternalData().getWorld();
         var4.execute(() -> {
            TransformComponent var4 = var2.getComponent(var1, TransformComponent.getComponentType());
            HeadRotation var5 = var2.getComponent(var1, HeadRotation.getComponentType());
            assert var4 != null;
            Vector3d var6 = var4.getPosition();
            Transform var7 = new Transform(new Vector3d(var6), new Rotation3f(var5.getRotation()));
            CompletableFuture var8 = InstancesPlugin.get().spawnInstance(var3, var4, var7);
            InstancesPlugin.teleportPlayerToLoadingInstance(var1, var2, var8, null);
         });
      }
   }

   @Nullable
   class="kw">private String getInstanceNameFromVirtualPath(@Nullable String var1) {
      if (var1 != null && !var1.isEmpty()) {
         String var2 = var1.replace('\\', '/');
         String[] var3 = var2.split("/", 2);
         class="kw">return var3.length > 1 ? var3[1] : var2;
      } else {
         class="kw">return null;
      }
   }

   class="kw">private void updateSelection(@Nonnull String var1) {
      this.selectedInstance = var1;
      UICommandBuilder var2 = new UICommandBuilder();
      String var3 = var1.contains("/") ? var1.substring(var1.lastIndexOf(47) + 1) : var1;
      var2.set("#Name.Text", var3);
      var2.set("#Name.Visible", true);
      var2.set("#Spawn.Disabled", false);
      var2.set("#Load.Disabled", false);
      this.sendUpdate(var2, false);
   }

   class="kw">public enum Action {
      Select,
      Load,
      Spawn;

      Action() {
      }
   }

   class="kw">public class="kw">static class PageData {
      @Nonnull
      class="kw">public class="kw">static class="kw">final String KEY_INSTANCE = "Instance";
      @Nonnull
      class="kw">public class="kw">static class="kw">final String KEY_ACTION = "Action";
      @Nonnull
      class="kw">public class="kw">static class="kw">final BuilderCodec<InstanceListPage.PageData> CODEC = BuilderCodec.builder(InstanceListPage.PageData.class, InstanceListPage.PageData::new)
         .addField(new KeyedCodec<>("Instance", BuilderCodec.STRING), (var0, var1) -> var0.instance = var1, var0 -> var0.instance)
         .addField(new KeyedCodec<>("Action", new EnumCodec<>(InstanceListPage.Action.class)), (var0, var1) -> var0.action = var1, var0 -> var0.action)
         .addField(new KeyedCodec<>("File", Codec.STRING), (var0, var1) -> var0.file = var1, var0 -> var0.file)
         .addField(new KeyedCodec<>("@SearchQuery", Codec.STRING), (var0, var1) -> var0.searchQuery = var1, var0 -> var0.searchQuery)
         .addField(new KeyedCodec<>("SearchResult", Codec.STRING), (var0, var1) -> var0.searchResult = var1, var0 -> var0.searchResult)
         .build();
      class="kw">private String instance;
      class="kw">private InstanceListPage.Action action;
      @Nullable
      class="kw">private String file;
      @Nullable
      class="kw">private String searchQuery;
      @Nullable
      class="kw">private String searchResult;

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

      class="kw">public String getInstance() {
         class="kw">return this.instance;
      }

      class="kw">public InstanceListPage.Action getAction() {
         class="kw">return this.action;
      }
   }
}