PrefabEditorCreationSettings class

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

Файл: com/hypixel/hytale/builtin/buildertools/prefabeditor/PrefabEditorCreationSettings.java

implements: PrefabEditorCreationContext, JsonAssetWithMap<String, DefaultAssetMap<String, PrefabEditorCreationSettings>>

Поля (16)

МодификаторыТипИмя
ASSET_STORE
final int RECURSIVE_SEARCH_MAX_DEPTH
char var2
String var2
String var2
Path var21
String var22
String var23
Path var24
var5
var5
var5
var5
Path var6
String var7
Path var8

Методы (16)

МодификаторыВозвратСигнатура
abstract throw new CompletionExceptionthrow new CompletionException("server.commands.editprefab.error.failedToSave", null)
for for(String var5 : this.unprocessedPrefabPaths)
for for(Path var20 : this.prefabPaths)
abstract for for(int var1 = 0; var1 < var0.length()
static DefaultAssetMap<String, PrefabEditorCreationSettings> getAssetMapDefaultAssetMap<String, PrefabEditorCreationSettings> getAssetMap()
static AssetStore<String, PrefabEditorCreationSettings, DefaultAssetMap<String, PrefabEditorCreationSettings>> getAssetStoreAssetStore<String, PrefabEditorCreationSettings, DefaultAssetMap<String, PrefabEditorCreationSettings>> getAssetStore()
public String getIdString getId()
public int getPasteYLevelGoalint getPasteYLevelGoal()
if if(ASSET_STORE == null)
if if(!var3)
if if(this.prefabRootDirectory != PrefabRootDirectory.ASSET)
if if(this.prefabRootDirectory != PrefabRootDirectory.ASSET)
public boolean isLoadChildrenboolean isLoadChildren()
public boolean isRecursiveboolean isRecursive()
static boolean namesNoPathboolean namesNoPath(@Nonnull String var0)
static boolean stringEndsWithPrefabPathboolean stringEndsWithPrefabPath(@Nonnull String var0)

Исходный код

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

class="kw">import com.hypixel.hytale.assetstore.AssetExtraInfo;
class="kw">import com.hypixel.hytale.assetstore.AssetPack;
class="kw">import com.hypixel.hytale.assetstore.AssetRegistry;
class="kw">import com.hypixel.hytale.assetstore.AssetStore;
class="kw">import com.hypixel.hytale.assetstore.codec.AssetBuilderCodec;
class="kw">import com.hypixel.hytale.assetstore.map.DefaultAssetMap;
class="kw">import com.hypixel.hytale.assetstore.map.JsonAssetWithMap;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.commands.PrefabEditLoadCommand;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.enums.PrefabAlignment;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.enums.PrefabRootDirectory;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.enums.PrefabRowSplitMode;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.enums.PrefabStackingAxis;
class="kw">import com.hypixel.hytale.builtin.buildertools.prefabeditor.enums.WorldGenType;
class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.codecs.EnumCodec;
class="kw">import com.hypixel.hytale.codec.codecs.array.ArrayCodec;
class="kw">import com.hypixel.hytale.common.util.PathUtil;
class="kw">import com.hypixel.hytale.common.util.StringUtil;
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.asset.type.environment.config.Environment;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.modules.singleplayer.SingleplayerModule;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabStore;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.io.File;
class="kw">import java.io.IOException;
class="kw">import java.nio.file.Files;
class="kw">import java.nio.file.Path;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.CompletionException;
class="kw">import java.util.stream.Stream;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class PrefabEditorCreationSettings
   class="kw">implements PrefabEditorCreationContext,
   JsonAssetWithMap<String, DefaultAssetMap<String, PrefabEditorCreationSettings>> {
   class="kw">private class="kw">static class="kw">final int RECURSIVE_SEARCH_MAX_DEPTH = 10;
   class="kw">public class="kw">static class="kw">final AssetBuilderCodec<String, PrefabEditorCreationSettings> CODEC = AssetBuilderCodec.builder(
         PrefabEditorCreationSettings.class,
         PrefabEditorCreationSettings::new,
         Codec.STRING,
         (var0, var1) -> var0.id = var1,
         var0 -> var0.id,
         (var0, var1) -> var0.data = var1,
         var0 -> var0.data
      )
      .append(
         new KeyedCodec<>("RootDirectory", new EnumCodec<>(PrefabRootDirectory.class)),
         (var0, var1) -> var0.prefabRootDirectory = var1,
         var0 -> var0.prefabRootDirectory
      )
      .add()
      .append(
         new KeyedCodec<>("UnprocessedPrefabPaths", new ArrayCodec<>(Codec.STRING, String[]::new)),
         (var0, var1) -> var0.unprocessedPrefabPaths = List.of(var1),
         var0 -> var0.unprocessedPrefabPaths.toArray(String[]::new)
      )
      .add()
      .append(new KeyedCodec<>("PasteYLevelGoal", Codec.INTEGER), (var0, var1) -> var0.pasteYLevelGoal = var1, var0 -> var0.pasteYLevelGoal)
      .add()
      .append(
         new KeyedCodec<>("BlocksBetweenEachPrefab", Codec.INTEGER), (var0, var1) -> var0.blocksBetweenEachPrefab = var1, var0 -> var0.blocksBetweenEachPrefab
      )
      .add()
      .append(new KeyedCodec<>("WorldGenType", new EnumCodec<>(WorldGenType.class)), (var0, var1) -> var0.worldGenType = var1, var0 -> var0.worldGenType)
      .add()
      .append(new KeyedCodec<>("BlocksAboveSurface", Codec.INTEGER), (var0, var1) -> var0.blocksAboveSurface = var1, var0 -> var0.blocksAboveSurface)
      .add()
      .append(
         new KeyedCodec<>("PrefabStackingAxis", new EnumCodec<>(PrefabStackingAxis.class)), (var0, var1) -> var0.stackingAxis = var1, var0 -> var0.stackingAxis
      )
      .add()
      .append(new KeyedCodec<>("PrefabAlignment", new EnumCodec<>(PrefabAlignment.class)), (var0, var1) -> var0.alignment = var1, var0 -> var0.alignment)
      .add()
      .append(new KeyedCodec<>("RecursiveSearch", Codec.BOOLEAN), (var0, var1) -> var0.recursive = var1, var0 -> var0.recursive)
      .add()
      .append(new KeyedCodec<>("LoadChildren", Codec.BOOLEAN), (var0, var1) -> var0.loadChildren = var1, var0 -> var0.loadChildren)
      .add()
      .append(new KeyedCodec<>("LoadEntities", Codec.BOOLEAN), (var0, var1) -> var0.loadEntities = var1, var0 -> var0.loadEntities)
      .add()
      .append(new KeyedCodec<>("EnableWorldTicking", Codec.BOOLEAN), (var0, var1) -> var0.enableWorldTicking = var1, var0 -> var0.enableWorldTicking)
      .add()
      .append(new KeyedCodec<>("RowSplitMode", new EnumCodec<>(PrefabRowSplitMode.class)), (var0, var1) -> var0.rowSplitMode = var1, var0 -> var0.rowSplitMode)
      .add()
      .<String>append(new KeyedCodec<>("Environment", Codec.STRING), (var0, var1) -> var0.environment = var1, var0 -> var0.environment)
      .addValidator(Environment.VALIDATOR_CACHE.getValidator())
      .add()
      .append(new KeyedCodec<>("GrassTint", Codec.STRING), (var0, var1) -> var0.grassTint = var1, var0 -> var0.grassTint)
      .add()
      .build();
   class="kw">private class="kw">static AssetStore<String, PrefabEditorCreationSettings, DefaultAssetMap<String, PrefabEditorCreationSettings>> ASSET_STORE;
   class="kw">private String id;
   class="kw">private AssetExtraInfo.Data data;
   class="kw">private class="kw">transient Player player;
   class="kw">private class="kw">transient PlayerRef playerRef;
   class="kw">private PrefabRootDirectory prefabRootDirectory = PrefabRootDirectory.ASSET;
   class="kw">private class="kw">final class="kw">transient List<Path> prefabPaths = new ObjectArrayList();
   @Nullable
   class="kw">private class="kw">transient Message failureMessage;
   class="kw">private List<String> unprocessedPrefabPaths = new ObjectArrayList();
   class="kw">private int pasteYLevelGoal = 55;
   class="kw">private int blocksBetweenEachPrefab = 15;
   class="kw">private WorldGenType worldGenType = PrefabEditLoadCommand.DEFAULT_WORLD_GEN_TYPE;
   class="kw">private int blocksAboveSurface = 0;
   class="kw">private PrefabStackingAxis stackingAxis = PrefabEditLoadCommand.DEFAULT_PREFAB_STACKING_AXIS;
   class="kw">private PrefabAlignment alignment = PrefabEditLoadCommand.DEFAULT_PREFAB_ALIGNMENT;
   class="kw">private boolean recursive;
   class="kw">private boolean loadChildren;
   class="kw">private boolean loadEntities;
   class="kw">private boolean enableWorldTicking = false;
   class="kw">private PrefabRowSplitMode rowSplitMode = PrefabRowSplitMode.BY_ALL_SUBFOLDERS;
   class="kw">private String environment = "Env_Zone1_Plains";
   class="kw">private String grassTint = "#5B9E28";

   class="kw">public class="kw">static AssetStore<String, PrefabEditorCreationSettings, DefaultAssetMap<String, PrefabEditorCreationSettings>> getAssetStore() {
      if (ASSET_STORE == null) {
         ASSET_STORE = AssetRegistry.getAssetStore(PrefabEditorCreationSettings.class);
      }

      class="kw">return ASSET_STORE;
   }

   class="kw">public class="kw">static DefaultAssetMap<String, PrefabEditorCreationSettings> getAssetMap() {
      class="kw">return (DefaultAssetMap<String, PrefabEditorCreationSettings>)getAssetStore().getAssetMap();
   }

   class="kw">private PrefabEditorCreationSettings() {
   }

   class="kw">public PrefabEditorCreationSettings(
      PrefabRootDirectory var1,
      List<String> var2,
      int var3,
      int var4,
      WorldGenType var5,
      int var6,
      PrefabStackingAxis var7,
      PrefabAlignment var8,
      boolean var9,
      boolean var10,
      boolean var11,
      boolean var12,
      PrefabRowSplitMode var13,
      String var14,
      String var15
   ) {
      this.prefabRootDirectory = var1;
      this.unprocessedPrefabPaths = var2;
      this.pasteYLevelGoal = var3;
      this.blocksBetweenEachPrefab = var4;
      this.worldGenType = var5;
      this.blocksAboveSurface = var6;
      this.stackingAxis = var7;
      this.alignment = var8;
      this.recursive = var9;
      this.loadChildren = var10;
      this.loadEntities = var11;
      this.enableWorldTicking = var12;
      this.rowSplitMode = var13;
      this.environment = var14;
      this.grassTint = var15;
   }

   @Nullable
   PrefabEditorCreationContext finishProcessing(Player var1, PlayerRef var2, boolean var3) {
      this.prefabPaths.clear();
      this.failureMessage = null;
      this.player = var1;
      this.playerRef = var2;
      if (this.unprocessedPrefabPaths.stream().allMatch(var0 -> namesNoPath(StringUtil.stripQuotes(var0)))) {
         class="kw">return this.fail(Message.translation("server.commands.editprefab.error.noPathSpecified"));
      }

      for (String var5 : this.unprocessedPrefabPaths) {
         var5 = StringUtil.stripQuotes(var5);
         var5 = var5.replace('/', File.separatorChar);
         var5 = var5.replace('\\', File.separatorChar);
         if (!namesNoPath(var5)) {
            if (!SingleplayerModule.isOwner(var2) && Path.of(var5).isAbsolute()) {
               class="kw">return this.fail(Message.translation("server.commands.editprefab.error.absolutePathNotAllowed"));
            }

            if (var5.endsWith(File.separator)) {
               Path var21 = this.resolveRootPathForInput(var5);
               String var23 = this.getRelativePathForInput(var5);
               Path var24 = var21.resolve(var23);
               if (!SingleplayerModule.isOwner(var2) && !PathUtil.isChildOf(var21, var24)) {
                  class="kw">return this.fail(Message.translation("server.commands.editprefab.error.pathTraversal"));
               }

               try (Stream var9 = Files.walk(var24, this.recursive ? 10 : 1)) {
                  var9.filter(var0 -> Files.isRegularFile(var0)).filter(PrefabStore.PREFAB_FILTER).sorted().forEach(this.prefabPaths::add);
               } catch (IOException var15) {
                  var15.printStackTrace();
               }
            } else {
               if (!stringEndsWithPrefabPath(var5)) {
                  var5 = var5 + ".prefab.json";
               }

               try {
                  Path var6 = this.resolveRootPathForInput(var5);
                  String var7 = this.getRelativePathForInput(var5);
                  Path var8 = var6.resolve(var7);
                  if (!SingleplayerModule.isOwner(var2) && !PathUtil.isChildOf(var6, var8)) {
                     class="kw">return this.fail(Message.translation("server.commands.editprefab.error.pathTraversal"));
                  }

                  this.prefabPaths.add(var8);
               } catch (Exception var13) {
                  var13.printStackTrace();
                  class="kw">return this.fail(Message.translation("server.commands.editprefab.finishProcessingError").param("error", var13.getMessage()));
               }
            }
         }
      }

      if (!var3) {
         for (Path var20 : this.prefabPaths) {
            if (!PrefabStore.get().prefabExists(var20)) {
               String var22 = PrefabStore.get().getRelativePrefabPath(var20).toString().replace('\\', '/');
               class="kw">return this.fail(Message.translation("server.commands.editprefab.load.error.prefabNotFound").param("path", var22));
            }
         }
      }

      class="kw">return this.prefabPaths.isEmpty()
         ? this.fail(
            Message.translation(this.recursive ? "server.commands.editprefab.noPrefabsInPath" : "server.commands.editprefab.noPrefabsInPathNotRecursive")
         )
         : this;
   }

   class="kw">private class="kw">static boolean namesNoPath(@Nonnull String var0) {
      for (int var1 = 0; var1 < var0.length(); var1++) {
         char var2 = var0.charAt(var1);
         if (var2 != '/' && var2 != '\\' && !Character.isWhitespace(var2)) {
            class="kw">return false;
         }
      }

      class="kw">return true;
   }

   @Nullable
   class="kw">private PrefabEditorCreationContext fail(@Nonnull Message var1) {
      this.failureMessage = var1;
      class="kw">return null;
   }

   @Nonnull
   class="kw">private Path resolveRootPathForInput(@Nonnull String var1) {
      if (this.prefabRootDirectory != PrefabRootDirectory.ASSET) {
         class="kw">return this.prefabRootDirectory.getPrefabPath();
      }

      String var2 = var1.contains(File.separator) ? var1.substring(0, var1.indexOf(File.separator)) : var1;

      for (PrefabStore.AssetPackPrefabPath var4 : PrefabStore.get().getAllAssetPrefabPaths()) {
         if (var4.getDisplayName().equals(var2)) {
            class="kw">return var4.prefabsPath();
         }
      }

      class="kw">return this.prefabRootDirectory.getPrefabPath();
   }

   @Nonnull
   class="kw">private String getRelativePathForInput(@Nonnull String var1) {
      if (this.prefabRootDirectory != PrefabRootDirectory.ASSET) {
         class="kw">return var1;
      }

      String var2 = var1.contains(File.separator) ? var1.substring(0, var1.indexOf(File.separator)) : var1;

      for (PrefabStore.AssetPackPrefabPath var4 : PrefabStore.get().getAllAssetPrefabPaths()) {
         if (var4.getDisplayName().equals(var2)) {
            if (var1.contains(File.separator)) {
               class="kw">return var1.substring(var1.indexOf(File.separator) + 1);
            }

            class="kw">return "";
         }
      }

      class="kw">return var1;
   }

   class="kw">public class="kw">static boolean stringEndsWithPrefabPath(@Nonnull String var0) {
      class="kw">return var0.endsWith(".prefab.json") || var0.endsWith(".prefab.json.lpf") || var0.endsWith(".lpf");
   }

   @Nonnull
   class="kw">public class="kw">static CompletableFuture<PrefabEditorCreationSettings> load(@Nonnull String var0) {
      class="kw">return CompletableFuture.supplyAsync(() -> getAssetMap().getAsset(var0));
   }

   @Nonnull
   class="kw">public class="kw">static CompletableFuture<Void> save(@Nonnull String var0, PrefabEditorCreationSettings var1, @Nonnull PlayerRef var2) {
      class="kw">return save(var0, var1, AssetModule.get().getBaseAssetPack(), var2);
   }

   @Nonnull
   class="kw">public class="kw">static CompletableFuture<Void> save(@Nonnull String var0, PrefabEditorCreationSettings var1, @Nonnull AssetPack var2, @Nonnull PlayerRef var3) {
      var1.id = var0;
      class="kw">return CompletableFuture.runAsync(() -> {
         try {
            getAssetStore().writeAssetToDisk(var2, Map.of(Path.of(var0 + ".json"), var1), SingleplayerModule.isOwner(var3));
         } catch (IOException var5) {
            var5.printStackTrace();
            throw new CompletionException("server.commands.editprefab.error.failedToSave", null);
         }
      });
   }

   @Override
   class="kw">public Player getEditor() {
      class="kw">return this.player;
   }

   @Override
   class="kw">public PlayerRef getEditorRef() {
      class="kw">return this.playerRef;
   }

   @Override
   class="kw">public List<Path> getPrefabPaths() {
      class="kw">return this.prefabPaths;
   }

   @Override
   class="kw">public int getBlocksBetweenEachPrefab() {
      class="kw">return this.blocksBetweenEachPrefab;
   }

   @Override
   class="kw">public int getPasteLevelGoal() {
      class="kw">return this.pasteYLevelGoal;
   }

   @Override
   class="kw">public boolean loadChildPrefabs() {
      class="kw">return this.loadChildren;
   }

   @Override
   class="kw">public boolean shouldLoadEntities() {
      class="kw">return this.loadEntities;
   }

   @Override
   class="kw">public PrefabStackingAxis getStackingAxis() {
      class="kw">return this.stackingAxis;
   }

   @Override
   class="kw">public WorldGenType getWorldGenType() {
      class="kw">return this.worldGenType;
   }

   @Override
   class="kw">public int getBlocksAboveSurface() {
      class="kw">return this.blocksAboveSurface;
   }

   @Override
   class="kw">public PrefabAlignment getAlignment() {
      class="kw">return this.alignment;
   }

   class="kw">public String getId() {
      class="kw">return this.id;
   }

   @Override
   class="kw">public PrefabRootDirectory getPrefabRootDirectory() {
      class="kw">return this.prefabRootDirectory;
   }

   @Override
   class="kw">public List<String> getUnprocessedPrefabPaths() {
      class="kw">return this.unprocessedPrefabPaths;
   }

   @Nullable
   class="kw">public Message getFailureMessage() {
      class="kw">return this.failureMessage;
   }

   class="kw">public int getPasteYLevelGoal() {
      class="kw">return this.pasteYLevelGoal;
   }

   class="kw">public boolean isRecursive() {
      class="kw">return this.recursive;
   }

   class="kw">public boolean isLoadChildren() {
      class="kw">return this.loadChildren;
   }

   @Override
   class="kw">public boolean isWorldTickingEnabled() {
      class="kw">return this.enableWorldTicking;
   }

   @Override
   class="kw">public PrefabRowSplitMode getRowSplitMode() {
      class="kw">return this.rowSplitMode;
   }

   @Override
   class="kw">public String getEnvironment() {
      class="kw">return this.environment;
   }

   @Override
   class="kw">public String getGrassTint() {
      class="kw">return this.grassTint;
   }
}