PageData class

Пакет: com.hypixel.hytale.builtin.buildertools.imageimport

Файл: com/hypixel/hytale/builtin/buildertools/imageimport/ImageImportPage.java

Поля (20)

МодификаторыТипИмя
public static final BuilderCodec<ImageImportPage.PageData> CODEC
static final String KEY_BROWSE
static final String KEY_BROWSER_CANCEL
static final String KEY_BROWSER_SELECT
static final String KEY_IMAGE_PATH
static final String KEY_IMPORT
static final String KEY_MAX_SIZE
static final String KEY_ORIENTATION
static final String KEY_ORIGIN
private Boolean browse
private Boolean browserCancel
private Boolean browserSelect
private Boolean doImport
private String file
private String imagePath
private Integer maxSize
private String orientation
private String origin
private String searchQuery
private String searchResult

Исходный код

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

class="kw">import com.hypixel.hytale.builtin.buildertools.BlockColorIndex;
class="kw">import com.hypixel.hytale.builtin.buildertools.BuilderToolsPlugin;
class="kw">import com.hypixel.hytale.builtin.buildertools.utils.PasteToolUtil;
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.common.util.StringUtil;
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.protocol.packets.interface_.CustomPageLifetime;
class="kw">import com.hypixel.hytale.protocol.packets.interface_.CustomUIEventBindingType;
class="kw">import com.hypixel.hytale.protocol.packets.interface_.Page;
class="kw">import com.hypixel.hytale.server.core.Constants;
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;
class="kw">import com.hypixel.hytale.server.core.entity.entities.player.pages.InteractiveCustomUIPage;
class="kw">import com.hypixel.hytale.server.core.modules.singleplayer.SingleplayerModule;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.standard.BlockSelection;
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.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.storage.EntityStore;
class="kw">import java.awt.image.BufferedImage;
class="kw">import java.nio.file.Files;
class="kw">import java.nio.file.Path;
class="kw">import java.nio.file.Paths;
class="kw">import java.util.ArrayList;
class="kw">import java.util.List;
class="kw">import java.util.Locale;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import javax.imageio.ImageIO;
class="kw">import org.joml.Vector3i;

class="kw">public class ImageImportPage class="kw">extends InteractiveCustomUIPage<ImageImportPage.PageData> {
   class="kw">private class="kw">static class="kw">final int DEFAULT_MAX_SIZE = 128;
   class="kw">private class="kw">static class="kw">final int MIN_SIZE = 1;
   class="kw">private class="kw">static class="kw">final int MAX_SIZE = 512;
   class="kw">private class="kw">static class="kw">final String ASSET_PACK_SUB_PATH = "Server/Imports/Images";
   @Nonnull
   class="kw">private String imagePath = "";
   class="kw">private int maxDimension = 128;
   @Nonnull
   class="kw">private String orientationStr = "wall_xy";
   @Nonnull
   class="kw">private ImageImportPage.Orientation orientation = ImageImportPage.Orientation.VERTICAL_XY;
   @Nonnull
   class="kw">private String originStr = "bottom_center";
   @Nonnull
   class="kw">private ImageImportPage.Origin origin = ImageImportPage.Origin.BOTTOM_CENTER;
   @Nullable
   class="kw">private Message statusMessage = null;
   class="kw">private boolean isError = false;
   class="kw">private boolean isProcessing = false;
   class="kw">private boolean showBrowser = false;
   @Nonnull
   class="kw">private class="kw">final ServerFileBrowser browser;

   class="kw">public ImageImportPage(@Nonnull PlayerRef var1) {
      super(var1, CustomPageLifetime.CanDismiss, ImageImportPage.PageData.CODEC);
      FileBrowserConfig var2 = FileBrowserConfig.builder()
         .listElementId("#BrowserPage #FileList")
         .searchInputId("#BrowserPage #SearchInput")
         .currentPathId("#BrowserPage #CurrentPath")
         .allowedExtensions(".png", ".jpg", ".jpeg", ".gif", ".bmp")
         .enableRootSelector(false)
         .enableSearch(true)
         .enableDirectoryNav(true)
         .maxResults(50)
         .assetPackMode(true, "Server/Imports/Images")
         .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/ImageImportPage.ui");
      var2.set("#ImagePath #Input.Value", this.imagePath);
      var2.set("#MaxSizeInput #Input.Value", this.maxDimension);
      List var5 = new ArrayList<>();
      var5.add(new DropdownEntryInfo(LocalizableString.fromMessageId("server.customUI.imageImport.orientation.wall_xy"), "wall_xy"));
      var5.add(new DropdownEntryInfo(LocalizableString.fromMessageId("server.customUI.imageImport.orientation.wall_xz"), "wall_xz"));
      var5.add(new DropdownEntryInfo(LocalizableString.fromMessageId("server.customUI.imageImport.orientation.floor"), "floor"));
      var2.set("#OrientationInput #Input.Entries", var5);
      var2.set("#OrientationInput #Input.Value", this.orientationStr);
      List var6 = new ArrayList<>();
      var6.add(new DropdownEntryInfo(LocalizableString.fromMessageId("server.customUI.origin.bottom_front_left"), "bottom_front_left"));
      var6.add(new DropdownEntryInfo(LocalizableString.fromMessageId("server.customUI.origin.bottom_center"), "bottom_center"));
      var6.add(new DropdownEntryInfo(LocalizableString.fromMessageId("server.customUI.origin.center"), "center"));
      var6.add(new DropdownEntryInfo(LocalizableString.fromMessageId("server.customUI.origin.top_center"), "top_center"));
      var2.set("#OriginInput #Input.Entries", var6);
      var2.set("#OriginInput #Input.Value", this.originStr);
      this.updateStatus(var2);
      var3.addEventBinding(CustomUIEventBindingType.ValueChanged, "#ImagePath #Input", EventData.of("@ImagePath", "#ImagePath #Input.Value"), false);
      var3.addEventBinding(CustomUIEventBindingType.ValueChanged, "#MaxSizeInput #Input", EventData.of("@MaxSize", "#MaxSizeInput #Input.Value"), false);
      var3.addEventBinding(
         CustomUIEventBindingType.ValueChanged, "#OrientationInput #Input", EventData.of("@Orientation", "#OrientationInput #Input.Value"), false
      );
      var3.addEventBinding(CustomUIEventBindingType.ValueChanged, "#OriginInput #Input", EventData.of("@Origin", "#OriginInput #Input.Value"), false);
      var3.addEventBinding(CustomUIEventBindingType.Activating, "#ImportButton", EventData.of("Import", "true"));
      var3.addEventBinding(CustomUIEventBindingType.Activating, "#ImagePath #BrowseButton", EventData.of("Browse", "true"));
      var2.set("#FormContainer.Visible", !this.showBrowser);
      var2.set("#BrowserPage.Visible", this.showBrowser);
      if (this.showBrowser) {
         this.buildBrowserPage(var2, var3);
      }
   }

   class="kw">private void buildBrowserPage(@Nonnull UICommandBuilder var1, @Nonnull UIEventBuilder var2) {
      this.browser.buildSearchInput(var1, var2);
      this.browser.buildCurrentPath(var1);
      this.browser.buildFileList(var1, var2);
      var2.addEventBinding(CustomUIEventBindingType.Activating, "#BrowserPage #SelectButton", EventData.of("BrowserSelect", "true"));
      var2.addEventBinding(CustomUIEventBindingType.Activating, "#BrowserPage #CancelButton", EventData.of("BrowserCancel", "true"));
   }

   class="kw">private void updateStatus(@Nonnull UICommandBuilder var1) {
      if (this.statusMessage != null) {
         var1.set("#StatusText.Text", this.statusMessage);
         var1.set("#StatusText.Visible", true);
         var1.set("#StatusText.Style.TextColor", this.isError ? "#e74c3c" : "#cfd8e3");
      } else {
         var1.set("#StatusText.Visible", false);
      }
   }

   class="kw">private void setError(@Nonnull Message var1) {
      this.statusMessage = var1;
      this.isError = true;
      this.isProcessing = false;
      this.rebuild();
   }

   class="kw">private void setStatus(@Nonnull Message var1) {
      this.statusMessage = var1;
      this.isError = false;
      this.rebuild();
   }

   class="kw">public void handleDataEvent(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, @Nonnull ImageImportPage.PageData var3) {
      if (var3.browse != null && var3.browse) {
         this.showBrowser = true;
         this.rebuild();
      } else if (var3.browserCancel != null && var3.browserCancel) {
         this.showBrowser = false;
         this.rebuild();
      } else if (var3.browserSelect != null && var3.browserSelect) {
         this.showBrowser = false;
         this.rebuild();
      } else if (!this.showBrowser || !this.handleBrowserEvent(var3)) {
         boolean var4 = false;
         if (var3.imagePath != null) {
            this.imagePath = StringUtil.stripQuotes(var3.imagePath.trim());
            this.statusMessage = null;
            var4 = true;
         }

         if (var3.maxSize != null) {
            this.maxDimension = Math.max(1, Math.min(512, var3.maxSize));
            var4 = true;
         }

         if (var3.orientation != null) {
            this.orientationStr = var3.orientation.trim().toLowerCase(Locale.ROOT);

            this.orientation = class="kw">switch (this.orientationStr) {
               case "wall_xz", "xz", "vertical_xz" -> ImageImportPage.Orientation.VERTICAL_XZ;
               case "floor", "horizontal", "horizontal_xz" -> ImageImportPage.Orientation.HORIZONTAL_XZ;
               class="kw">default -> ImageImportPage.Orientation.VERTICAL_XY;
            };
            var4 = true;
         }

         if (var3.origin != null) {
            this.originStr = var3.origin.trim().toLowerCase(Locale.ROOT);

            this.origin = class="kw">switch (this.originStr) {
               case "bottom_front_left" -> ImageImportPage.Origin.BOTTOM_FRONT_LEFT;
               case "center" -> ImageImportPage.Origin.CENTER;
               case "top_center" -> ImageImportPage.Origin.TOP_CENTER;
               class="kw">default -> ImageImportPage.Origin.BOTTOM_CENTER;
            };
            var4 = true;
         }

         if (var3.doImport != null && var3.doImport && !this.isProcessing) {
            this.performImport(var1, var2);
         } else {
            if (var4) {
               this.sendUpdate();
            }
         }
      }
   }

   class="kw">private boolean handleBrowserEvent(@Nonnull ImageImportPage.PageData var1) {
      if (var1.searchQuery != null) {
         this.browser.setSearchQuery(var1.searchQuery.trim().toLowerCase(Locale.ROOT));
         this.rebuildBrowser();
         class="kw">return true;
      }

      if (var1.file != null) {
         String var2 = var1.file;
         if ("..".equals(var2)) {
            this.browser.navigateUp();
            this.rebuildBrowser();
            class="kw">return true;
         }

         if (this.browser.handleEvent(FileBrowserEventData.file(var2))) {
            this.rebuildBrowser();
            class="kw">return true;
         }

         String var3 = this.browser.getAssetPackCurrentPath().isEmpty() ? var2 : this.browser.getAssetPackCurrentPath() + "/" + var2;
         Path var4 = this.browser.resolveAssetPackPath(var3);
         if (var4 != null && Files.isRegularFile(var4)) {
            this.imagePath = var4.toString();
            this.showBrowser = false;
            this.rebuild();
            class="kw">return true;
         }
      }

      if (var1.searchResult != null) {
         Path var5 = this.browser.resolveAssetPackPath(var1.searchResult);
         if (var5 != null && Files.isRegularFile(var5)) {
            this.imagePath = var5.toString();
            this.showBrowser = false;
            this.rebuild();
            class="kw">return true;
         }
      }

      class="kw">return false;
   }

   class="kw">private void rebuildBrowser() {
      UICommandBuilder var1 = new UICommandBuilder();
      UIEventBuilder var2 = new UIEventBuilder();
      this.browser.buildFileList(var1, var2);
      this.browser.buildCurrentPath(var1);
      this.sendUpdate(var1, var2, false);
   }

   class="kw">private void performImport(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2) {
      if (this.imagePath.isEmpty()) {
         this.setError(Message.translation("server.builderTools.imageImport.emptyPath"));
      } else {
         Path var3 = Paths.get(this.imagePath);
         boolean var4 = Constants.SINGLEPLAYER && SingleplayerModule.isOwner(this.playerRef);
         if (!var4 && !AssetModule.get().isWithinPackSubDir(var3, "Server/Imports/Images")) {
            this.setError(Message.translation("server.builderTools.imageImport.notInImportsDir"));
         } else if (!Files.exists(var3)) {
            this.setError(Message.translation("server.builderTools.imageImport.fileNotFound").param("path", this.imagePath));
         } else {
            this.isProcessing = true;
            this.setStatus(Message.translation("server.builderTools.imageImport.processing"));
            Player var5 = var2.getComponent(var1, Player.getComponentType());
            PlayerRef var6 = var2.getComponent(var1, PlayerRef.getComponentType());
            if (var5 != null && var6 != null) {
               String var7 = this.imagePath;
               int var8 = this.maxDimension;
               ImageImportPage.Orientation var9 = this.orientation;
               ImageImportPage.Origin var10 = this.origin;
               BuilderToolsPlugin.addToQueue(
                  var5,
                  var6,
                  (var8x, var9x, var10x) -> {
                     try {
                        BufferedImage var11 = null;

                        try {
                           var11 = ImageIO.read(Paths.get(var7).toFile());
                        } catch (Exception var38) {
                        }

                        if (var11 == null) {
                           this.setError(Message.translation("server.builderTools.imageImport.unreadableImage"));
                           class="kw">return;
                        }

                        int var12 = var11.getWidth();
                        int var13 = var11.getHeight();
                        float var14 = 1.0F;
                        if (var12 > var8 || var13 > var8) {
                           var14 = (float)var8 / Math.max(var12, var13);
                           var12 = Math.round(var12 * var14);
                           var13 = Math.round(var13 * var14);
                        }

                        BlockColorIndex var15 = BuilderToolsPlugin.get().getBlockColorIndex();
                        if (var15.isEmpty()) {
                           this.setError(Message.translation("server.builderTools.imageImport.colorIndexEmpty"));
                           class="kw">return;
                        }

                        int var16;
                        int var17;
                        int var18;
                        class="kw">switch (var9) {
                           case VERTICAL_XY:
                              var16 = var12;
                              var17 = var13;
                              var18 = 1;
                              break;
                           case VERTICAL_XZ:
                              var16 = var12;
                              var17 = 1;
                              var18 = var13;
                              break;
                           case HORIZONTAL_XZ:
                              var16 = var12;
                              var17 = 1;
                              var18 = var13;
                              break;
                           class="kw">default:
                              var16 = var12;
                              var17 = var13;
                              var18 = 1;
                        }

                        int var19 = 0;
                        int var20 = 0;
                        int var21 = 0;
                        class="kw">switch (var10) {
                           case BOTTOM_FRONT_LEFT:
                           class="kw">default:
                              break;
                           case BOTTOM_CENTER:
                              var19 = -var16 / 2;
                              var21 = -var18 / 2;
                              break;
                           case CENTER:
                              var19 = -var16 / 2;
                              var20 = -var17 / 2;
                              var21 = -var18 / 2;
                              break;
                           case TOP_CENTER:
                              var19 = -var16 / 2;
                              var20 = -var17;
                              var21 = -var18 / 2;
                        }

                        BlockSelection var22 = new BlockSelection(var12 * var13, 0);
                        var22.setPosition(0, 0, 0);
                        int var23 = 0;
                        float var24 = var14;

                        for (int var25 = 0; var25 < var13; var25++) {
                           for (int var26 = 0; var26 < var12; var26++) {
                              int var27 = Math.min((int)(var26 / var24), var11.getWidth() - 1);
                              int var28 = Math.min((int)(var25 / var24), var11.getHeight() - 1);
                              int var29 = var11.getRGB(var27, var28);
                              int var30 = var29 >> 24 & 0xFF;
                              if (var30 >= 128) {
                                 int var31 = var29 >> 16 & 0xFF;
                                 int var32 = var29 >> 8 & 0xFF;
                                 int var33 = var29 & 0xFF;
                                 int var34 = var15.findClosestBlock(var31, var32, var33);
                                 if (var34 > 0) {
                                    int var35;
                                    int var36;
                                    int var37;
                                    class="kw">switch (var9) {
                                       case VERTICAL_XY:
                                          var35 = var26;
                                          var36 = var13 - 1 - var25;
                                          var37 = 0;
                                          break;
                                       case VERTICAL_XZ:
                                          var35 = var26;
                                          var36 = 0;
                                          var37 = var13 - 1 - var25;
                                          break;
                                       case HORIZONTAL_XZ:
                                          var35 = var26;
                                          var36 = 0;
                                          var37 = var25;
                                          break;
                                       class="kw">default:
                                          var35 = var26;
                                          var36 = var13 - 1 - var25;
                                          var37 = 0;
                                    }

                                    var22.addBlockAtLocalPos(var35 + var19, var36 + var20, var37 + var21, var34, 0, 0, 0);
                                    var23++;
                                 }
                              }
                           }
                        }

                        var22.setSelectionArea(new Vector3i(var19, var20, var21), new Vector3i(var16 - 1 + var19, var17 - 1 + var20, var18 - 1 + var21));
                        var9x.setSelection(var22);
                        var9x.sendSelectionToClient();
                        this.statusMessage = Message.translation("server.builderTools.imageImport.success")
                           .param("count", var23)
                           .param("width", var16)
                           .param("height", var17)
                           .param("depth", var18);
                        this.isProcessing = false;
                        var6.sendMessage(
                           Message.translation("server.builderTools.imageImport.success")
                              .param("count", var23)
                              .param("width", var16)
                              .param("height", var17)
                              .param("depth", var18)
                        );
                        var5.getPageManager().setPage(var8x, var2, Page.None);
                        PasteToolUtil.switchToPasteTool(var8x, var6, var10x);
                     } catch (Exception var39) {
                        ((HytaleLogger.Api)BuilderToolsPlugin.get().getLogger().at(Level.WARNING).withCause(var39)).log("Image class="kw">import error");
                        this.setError(Message.translation("server.builderTools.imageImport.error").param("message", var39.getMessage()));
                     }
                  }
               );
            } else {
               this.setError(Message.translation("server.builderTools.imageImport.playerNotFound"));
            }
         }
      }
   }

   class="kw">public enum Orientation {
      VERTICAL_XY,
      VERTICAL_XZ,
      HORIZONTAL_XZ;

      Orientation() {
      }
   }

   class="kw">public enum Origin {
      BOTTOM_FRONT_LEFT,
      BOTTOM_CENTER,
      CENTER,
      TOP_CENTER;

      Origin() {
      }
   }

   class="kw">public class="kw">static class PageData {
      class="kw">static class="kw">final String KEY_IMAGE_PATH = "@ImagePath";
      class="kw">static class="kw">final String KEY_MAX_SIZE = "@MaxSize";
      class="kw">static class="kw">final String KEY_ORIENTATION = "@Orientation";
      class="kw">static class="kw">final String KEY_ORIGIN = "@Origin";
      class="kw">static class="kw">final String KEY_IMPORT = "Import";
      class="kw">static class="kw">final String KEY_BROWSE = "Browse";
      class="kw">static class="kw">final String KEY_BROWSER_SELECT = "BrowserSelect";
      class="kw">static class="kw">final String KEY_BROWSER_CANCEL = "BrowserCancel";
      class="kw">public class="kw">static class="kw">final BuilderCodec<ImageImportPage.PageData> CODEC = BuilderCodec.builder(ImageImportPage.PageData.class, ImageImportPage.PageData::new)
         .append(new KeyedCodec<>("@ImagePath", Codec.STRING), (var0, var1) -> var0.imagePath = var1, var0 -> var0.imagePath)
         .add()
         .append(new KeyedCodec<>("@MaxSize", Codec.INTEGER), (var0, var1) -> var0.maxSize = var1, var0 -> var0.maxSize)
         .add()
         .append(new KeyedCodec<>("@Orientation", Codec.STRING), (var0, var1) -> var0.orientation = var1, var0 -> var0.orientation)
         .add()
         .append(new KeyedCodec<>("@Origin", Codec.STRING), (var0, var1) -> var0.origin = var1, var0 -> var0.origin)
         .add()
         .append(
            new KeyedCodec<>("Import", Codec.STRING),
            (var0, var1) -> var0.doImport = "true".equalsIgnoreCase(var1),
            var0 -> var0.doImport != null && var0.doImport ? "true" : null
         )
         .add()
         .append(
            new KeyedCodec<>("Browse", Codec.STRING),
            (var0, var1) -> var0.browse = "true".equalsIgnoreCase(var1),
            var0 -> var0.browse != null && var0.browse ? "true" : null
         )
         .add()
         .append(
            new KeyedCodec<>("BrowserSelect", Codec.STRING),
            (var0, var1) -> var0.browserSelect = "true".equalsIgnoreCase(var1),
            var0 -> var0.browserSelect != null && var0.browserSelect ? "true" : null
         )
         .add()
         .append(
            new KeyedCodec<>("BrowserCancel", Codec.STRING),
            (var0, var1) -> var0.browserCancel = "true".equalsIgnoreCase(var1),
            var0 -> var0.browserCancel != null && var0.browserCancel ? "true" : null
         )
         .add()
         .append(new KeyedCodec<>("File", Codec.STRING), (var0, var1) -> var0.file = var1, var0 -> var0.file)
         .add()
         .append(new KeyedCodec<>("@SearchQuery", Codec.STRING), (var0, var1) -> var0.searchQuery = var1, var0 -> var0.searchQuery)
         .add()
         .append(new KeyedCodec<>("SearchResult", Codec.STRING), (var0, var1) -> var0.searchResult = var1, var0 -> var0.searchResult)
         .add()
         .build();
      @Nullable
      class="kw">private String imagePath;
      @Nullable
      class="kw">private Integer maxSize;
      @Nullable
      class="kw">private String orientation;
      @Nullable
      class="kw">private String origin;
      @Nullable
      class="kw">private Boolean doImport;
      @Nullable
      class="kw">private Boolean browse;
      @Nullable
      class="kw">private Boolean browserSelect;
      @Nullable
      class="kw">private Boolean browserCancel;
      @Nullable
      class="kw">private String file;
      @Nullable
      class="kw">private String searchQuery;
      @Nullable
      class="kw">private String searchResult;

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