PrefabStore class

Пакет: com.hypixel.hytale.server.core.prefab

Файл: com/hypixel/hytale/server/core/prefab/PrefabStore.java

Поля (33)

МодификаторыТипИмя
final Predicate<Path> PREFAB_FILTER
PrefabStore.PrefabFormatPaths var1
String var1
var1
List var1
List var1
Set var1
PluginManifest var1
Path var2
PrefabStore.PrefabFormatPaths var2
PrefabStore.PrefabFormatPaths var2
Path var2
Path var2
Path var2
String var2
AssetPack var2
boolean var3
Path var3
String var3
Path var3
boolean var4
Path var4
Path var4
Path var4
Path var4
PrefabStore.PrefabFormatPaths var5
Path var5
boolean var6
boolean var7
String var7
PrefabBuffer var8
Path var8
Path var9

Методы (34)

МодификаторыВозвратСигнатура
public record AssetPackPrefabPathrecord AssetPackPrefabPath(@Nullable AssetPack pack, @Nonnull Path prefabsPath)
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Invalid world gen name: " + var1)
abstract return new ObjectArrayListreturn new ObjectArrayList(var1)
private record PrefabFormatPathsrecord PrefabFormatPaths(@Nonnull Path jsonPath, @Nonnull Path lpfPath)
abstract throw new PrefabLoadExceptionthrow new PrefabLoadException(PrefabLoadException.Type.NOT_FOUND)
abstract throw new PrefabSaveExceptionthrow new PrefabSaveException(PrefabSaveException.Type.ALREADY_EXISTS)
abstract throw new PrefabSaveExceptionthrow new PrefabSaveException(PrefabSaveException.Type.ERROR, var9)
abstract throw new RuntimeExceptionthrow new RuntimeException("Failed to list directory " + var1, var7)
public boolean deletePrefabboolean deletePrefab(@Nonnull Path var1)
for for(String var6 : new String[]{".lpf", ".prefab.json"})
static PrefabStore getPrefabStore get()
public Path getAssetRootPathPath getAssetRootPath()
public String getDisplayNamepublic String getDisplayName()
public String getPackNamepublic String getPackName()
public Path getServerPrefabsPathPath getServerPrefabsPath()
if if(var2 == null)
if if(var6 && !var3)
if if(var7)
if if(var3 == null)
if if(var8 != null)
if if(var2 != null)
if if(var3 != null)
if if(this.pack == null)
public boolean isBasePackpublic boolean isBasePack()
public boolean isFromAssetPackpublic boolean isFromAssetPack()
static boolean isPrefabFileNameboolean isPrefabFileName(@Nonnull String var0)
public boolean prefabExistsboolean prefabExists(@Nonnull Path var1)
public void saveAssetPrefabvoid saveAssetPrefab(@Nonnull String var1, @Nonnull BlockSelection var2)
public void saveAssetPrefabvoid saveAssetPrefab(@Nonnull String var1, @Nonnull BlockSelection var2, boolean var3)
public void savePrefabToPackvoid savePrefabToPack(@Nonnull AssetPack var1, @Nonnull String var2, @Nonnull BlockSelection var3, boolean var4)
public void saveServerPrefabvoid saveServerPrefab(@Nonnull String var1, @Nonnull BlockSelection var2)
public void saveServerPrefabvoid saveServerPrefab(@Nonnull String var1, @Nonnull BlockSelection var2, boolean var3)
public void saveWorldGenPrefabvoid saveWorldGenPrefab(@Nonnull String var1, @Nonnull BlockSelection var2, boolean var3)
public void saveWorldGenPrefabvoid saveWorldGenPrefab(@Nonnull String var1, @Nonnull BlockSelection var2)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.prefab;

class="kw">import com.hypixel.hytale.assetstore.AssetPack;
class="kw">import com.hypixel.hytale.common.plugin.PluginManifest;
class="kw">import com.hypixel.hytale.common.util.PathUtil;
class="kw">import com.hypixel.hytale.server.core.asset.AssetModule;
class="kw">import com.hypixel.hytale.server.core.prefab.config.SelectionPrefabSerializer;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.PrefabBufferSelectionConverter;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.PrefabBufferUtil;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.impl.PrefabBuffer;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.standard.BlockSelection;
class="kw">import com.hypixel.hytale.server.core.universe.Universe;
class="kw">import com.hypixel.hytale.server.core.util.AssetUtil;
class="kw">import com.hypixel.hytale.server.core.util.BsonUtil;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
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.LinkedHashMap;
class="kw">import java.util.LinkedHashSet;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.Set;
class="kw">import java.util.concurrent.ConcurrentHashMap;
class="kw">import java.util.function.Function;
class="kw">import java.util.function.Predicate;
class="kw">import java.util.stream.Collectors;
class="kw">import java.util.stream.Stream;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class PrefabStore {
   class="kw">public class="kw">static class="kw">final Predicate<Path> PREFAB_FILTER = var0 -> isPrefabFileName(var0.toString());
   class="kw">public class="kw">static class="kw">final int LARGE_PREFAB_BLOCK_THRESHOLD = 300000;
   class="kw">public class="kw">static class="kw">final Path PREFABS_PATH = Path.of("prefabs");
   class="kw">private class="kw">static class="kw">final String DEFAULT_WORLDGEN_NAME = "Default";
   class="kw">private class="kw">static class="kw">final PrefabStore INSTANCE = new PrefabStore();
   class="kw">private class="kw">final Map<Path, BlockSelection> PREFAB_CACHE = new ConcurrentHashMap<>();

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

   @Nonnull
   class="kw">private class="kw">static Path resolvePrefabKey(@Nonnull Path var0, @Nonnull String var1) {
      Path var2 = PathUtil.resolvePathWithinDir(var0, var1);
      if (var2 == null) {
         throw new PrefabLoadException(PrefabLoadException.Type.NOT_FOUND);
      } else {
         class="kw">return var2;
      }
   }

   @Nonnull
   class="kw">public BlockSelection getServerPrefab(@Nonnull String var1) {
      class="kw">return this.getPrefab(resolvePrefabKey(this.getServerPrefabsPath(), var1));
   }

   @Nonnull
   class="kw">public BlockSelection getPrefab(@Nonnull Path var1) {
      class="kw">return this.PREFAB_CACHE.computeIfAbsent(var1.toAbsolutePath().normalize(), var0 -> {
         PrefabStore.PrefabFormatPaths var1 = resolveFormatPaths(var0);
         if (Files.exists(var1.lpfPath())) {
            class="kw">return PrefabBufferSelectionConverter.toBlockSelection(PrefabBufferUtil.readFromFile(var1.lpfPath()));
         } else if (Files.exists(var1.jsonPath())) {
            class="kw">return SelectionPrefabSerializer.deserialize(BsonUtil.readDocument(var1.jsonPath()).join());
         } else {
            throw new PrefabLoadException(PrefabLoadException.Type.NOT_FOUND);
         }
      });
   }

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

   @Nonnull
   class="kw">public class="kw">static String stripPrefabSuffix(@Nonnull String var0) {
      if (var0.endsWith(".prefab.json")) {
         class="kw">return var0.substring(0, var0.length() - ".prefab.json".length());
      } else {
         class="kw">return isPrefabFileName(var0) ? var0.substring(0, var0.length() - ".lpf".length()) : var0;
      }
   }

   @Nonnull
   class="kw">private class="kw">static PrefabStore.PrefabFormatPaths resolveFormatPaths(@Nonnull Path var0) {
      String var1 = stripPrefabSuffix(var0.getFileName().toString());
      class="kw">return new PrefabStore.PrefabFormatPaths(var0.resolveSibling(var1 + ".prefab.json"), var0.resolveSibling(var1 + ".lpf"));
   }

   class="kw">public boolean prefabExists(@Nonnull Path var1) {
      PrefabStore.PrefabFormatPaths var2 = resolveFormatPaths(var1);
      class="kw">return Files.exists(var2.jsonPath()) || Files.exists(var2.lpfPath());
   }

   class="kw">public boolean deletePrefab(@Nonnull Path var1) class="kw">throws IOException {
      PrefabStore.PrefabFormatPaths var2 = resolveFormatPaths(var1);
      boolean var3 = Files.deleteIfExists(var2.jsonPath());
      boolean var4 = Files.deleteIfExists(var2.lpfPath());
      this.PREFAB_CACHE.remove(var1);
      class="kw">return var3 || var4;
   }

   class="kw">public Path getServerPrefabsPath() {
      class="kw">return PREFABS_PATH;
   }

   @Nonnull
   class="kw">public Map<Path, BlockSelection> getServerPrefabDir(@Nonnull String var1) {
      class="kw">return this.getPrefabDir(resolvePrefabKey(this.getServerPrefabsPath(), var1));
   }

   @Nonnull
   class="kw">public Map<Path, BlockSelection> getPrefabDir(@Nonnull Path var1) {
      try (Stream var2 = Files.list(var1)) {
         class="kw">return var2.filter(PREFAB_FILTER).sorted().collect(Collectors.toMap(Function.identity(), this::getPrefab, (var0, var1x) -> {
            throw new IllegalStateException(String.format("Duplicate key %s", var0));
         }, LinkedHashMap::new));
      } catch (IOException var7) {
         throw new RuntimeException("Failed to list directory " + var1, var7);
      }
   }

   class="kw">public void saveServerPrefab(@Nonnull String var1, @Nonnull BlockSelection var2) {
      this.saveWorldGenPrefab(var1, var2, false);
   }

   class="kw">public void saveWorldGenPrefab(@Nonnull String var1, @Nonnull BlockSelection var2, boolean var3) {
      this.savePrefab(resolvePrefabKey(this.getWorldGenPrefabsPath(), var1), var2, var3);
   }

   @Nonnull
   class="kw">public Path savePrefab(@Nonnull Path var1, @Nonnull BlockSelection var2, boolean var3) {
      class="kw">return this.savePrefab(var1, var2, var3, PrefabFormat.AUTO);
   }

   @Nonnull
   class="kw">public Path savePrefab(@Nonnull Path var1, @Nonnull BlockSelection var2, boolean var3, @Nonnull PrefabFormat var4) {
      PrefabStore.PrefabFormatPaths var5 = resolveFormatPaths(var1);
      boolean var6 = Files.exists(var5.jsonPath()) || Files.exists(var5.lpfPath());
      if (var6 && !var3) {
         throw new PrefabSaveException(PrefabSaveException.Type.ALREADY_EXISTS);
      }

      boolean var7 = class="kw">switch (var4) {
         case AUTO -> var2.getBlockCount() >= 300000;
         case COMPRESSED -> true;
      };

      try {
         Files.createDirectories(var5.jsonPath().getParent());
         if (var7) {
            PrefabBuffer var8 = PrefabBufferSelectionConverter.toPrefabBuffer(var5.jsonPath(), var2);
            PrefabBufferUtil.writeToFileAsync(var8, var5.lpfPath()).join();
            Files.deleteIfExists(var5.jsonPath());
         } else {
            BsonUtil.writeDocument(var5.jsonPath(), SelectionPrefabSerializer.serialize(var2)).join();
            Files.deleteIfExists(var5.lpfPath());
         }
      } catch (Throwable var9) {
         throw new PrefabSaveException(PrefabSaveException.Type.ERROR, var9);
      }

      this.PREFAB_CACHE.remove(var1);
      this.PREFAB_CACHE.remove(var5.jsonPath());
      this.PREFAB_CACHE.remove(var5.lpfPath());
      PrefabBufferUtil.removeCached(var1);
      PrefabBufferUtil.removeCached(var5.jsonPath());
      PrefabBufferUtil.removeCached(var5.lpfPath());
      class="kw">return var7 ? var5.lpfPath() : var5.jsonPath();
   }

   @Nonnull
   class="kw">public Path getWorldGenPrefabsPath() {
      class="kw">return this.getWorldGenPrefabsPath("Default");
   }

   class="kw">public Path getAssetRootPath() {
      class="kw">return AssetUtil.getHytaleAssetsPath();
   }

   @Nonnull
   class="kw">public Path getWorldGenPrefabsPath(@Nullable String var1) {
      var1 = var1 == null ? "Default" : var1;
      Path var2 = Universe.getWorldGenPath();
      Path var3 = PathUtil.resolvePathWithinDir(var2, var1);
      if (var3 == null) {
         throw new IllegalArgumentException("Invalid world gen name: " + var1);
      } else {
         class="kw">return var3.resolve("Prefabs");
      }
   }

   class="kw">public void saveServerPrefab(@Nonnull String var1, @Nonnull BlockSelection var2, boolean var3) {
      this.saveServerPrefab(var1, var2, var3, PrefabFormat.AUTO);
   }

   @Nonnull
   class="kw">public Path saveServerPrefab(@Nonnull String var1, @Nonnull BlockSelection var2, boolean var3, @Nonnull PrefabFormat var4) {
      class="kw">return this.savePrefab(resolvePrefabKey(this.getServerPrefabsPath(), var1), var2, var3, var4);
   }

   @Nonnull
   class="kw">public Path getAssetPrefabsPath() {
      class="kw">return AssetUtil.getHytaleAssetsPath().resolve("Server").resolve("Prefabs");
   }

   @Nonnull
   class="kw">public Path getAssetPrefabsPathForPack(@Nonnull AssetPack var1) {
      class="kw">return var1.getRoot().resolve("Server").resolve("Prefabs");
   }

   @Nonnull
   class="kw">public List<PrefabStore.AssetPackPrefabPath> getAllAssetPrefabPaths() {
      List var1 = new ObjectArrayList();

      for (AssetPack var3 : AssetModule.get().getAssetPacks()) {
         Path var4 = this.getAssetPrefabsPathForPack(var3);
         if (Files.isDirectory(var4)) {
            var1.add(new PrefabStore.AssetPackPrefabPath(var3, var4));
         }
      }

      class="kw">return var1;
   }

   @Nonnull
   class="kw">public List<PrefabStore.AssetPackPrefabPath> getAllBrowsablePrefabPaths() {
      List var1 = new ObjectArrayList(this.getAllAssetPrefabPaths());
      Path var2 = this.getServerPrefabsPath();
      if (Files.isDirectory(var2)) {
         var1.add(new PrefabStore.AssetPackPrefabPath(null, var2));
      }

      class="kw">return var1;
   }

   @Nullable
   class="kw">public BlockSelection getAssetPrefabFromAnyPack(@Nonnull String var1) {
      Path var2 = this.findAssetPrefabPath(var1);
      class="kw">return var2 != null ? this.getPrefab(var2) : null;
   }

   @Nullable
   class="kw">public Path findAssetPrefabPath(@Nonnull String var1) {
      for (AssetPack var3 : AssetModule.get().getAssetPacks()) {
         Path var4 = this.getAssetPrefabsPathForPack(var3);
         Path var5 = PathUtil.resolvePathWithinDir(var4, var1);
         if (var5 != null && (Files.exists(var5) || Files.exists(resolveFormatPaths(var5).lpfPath()))) {
            class="kw">return var5;
         }
      }

      class="kw">return null;
   }

   @Nullable
   class="kw">public Path findBrowsablePrefabPath(@Nonnull String var1) {
      String var2 = stripPrefabSuffix(var1.replace('\\', '/'));

      for (String var6 : new String[]{".lpf", ".prefab.json"}) {
         String var7 = var2 + var6;
         Path var8 = this.findAssetPrefabPath(var7);
         if (var8 != null) {
            class="kw">return var8;
         }

         Path var9 = PathUtil.resolvePathWithinDir(this.getServerPrefabsPath(), var7);
         if (var9 != null && Files.exists(var9)) {
            class="kw">return var9;
         }
      }

      class="kw">return null;
   }

   @Nonnull
   class="kw">public List<String> listBrowsablePrefabKeys() {
      Set var1 = new LinkedHashSet<>();

      for (PrefabStore.AssetPackPrefabPath var3 : this.getAllBrowsablePrefabPaths()) {
         Path var4 = var3.prefabsPath();
         if (Files.isDirectory(var4)) {
            try (Stream var5 = Files.walk(var4)) {
               var5.filter(var0 -> Files.isRegularFile(var0)).filter(PREFAB_FILTER).forEach(var2 -> {
                  String var3 = PathUtil.relativize(var4, var2).toString().replace('\\', '/');
                  var1.add(stripPrefabSuffix(var3));
               });
            } catch (IOException var10) {
            }
         }
      }

      class="kw">return new ObjectArrayList(var1);
   }

   @Nullable
   class="kw">public AssetPack findAssetPackForPrefabPath(@Nonnull Path var1) {
      for (AssetPack var3 : AssetModule.get().getAssetPacks()) {
         if (PathUtil.isChildOf(this.getAssetPrefabsPathForPack(var3), var1)) {
            class="kw">return var3;
         }
      }

      class="kw">return null;
   }

   @Nonnull
   class="kw">public Path getRelativePrefabPath(@Nonnull Path var1) {
      AssetPack var2 = this.findAssetPackForPrefabPath(var1);
      if (var2 != null) {
         Path var3 = PathUtil.relativizeWithinDir(this.getAssetPrefabsPathForPack(var2), var1);
         if (var3 != null) {
            class="kw">return var3;
         }
      }

      Path var4 = PathUtil.relativizeWithinDir(this.getServerPrefabsPath(), var1);
      class="kw">return var4 != null ? var4 : var1.toAbsolutePath().normalize().getFileName();
   }

   @Nonnull
   class="kw">public BlockSelection getAssetPrefab(@Nonnull String var1) {
      class="kw">return this.getPrefab(resolvePrefabKey(this.getAssetPrefabsPath(), var1));
   }

   @Nonnull
   class="kw">public Map<Path, BlockSelection> getAssetPrefabDir(@Nonnull String var1) {
      class="kw">return this.getPrefabDir(resolvePrefabKey(this.getAssetPrefabsPath(), var1));
   }

   class="kw">public void saveAssetPrefab(@Nonnull String var1, @Nonnull BlockSelection var2) {
      this.saveWorldGenPrefab(var1, var2, false);
   }

   class="kw">public void saveAssetPrefab(@Nonnull String var1, @Nonnull BlockSelection var2, boolean var3) {
      this.savePrefab(resolvePrefabKey(this.getAssetPrefabsPath(), var1), var2, var3);
   }

   class="kw">public void savePrefabToPack(@Nonnull AssetPack var1, @Nonnull String var2, @Nonnull BlockSelection var3, boolean var4) {
      this.savePrefabToPack(var1, var2, var3, var4, PrefabFormat.AUTO);
   }

   @Nonnull
   class="kw">public Path savePrefabToPack(@Nonnull AssetPack var1, @Nonnull String var2, @Nonnull BlockSelection var3, boolean var4, @Nonnull PrefabFormat var5) {
      if (!AssetModule.get().validatePackExistsOnDisk(var1)) {
         throw new PrefabSaveException(
            PrefabSaveException.Type.ERROR, new IllegalStateException("Asset pack '" + var1.getName() + "' no longer exists on disk")
         );
      } else {
         class="kw">return this.savePrefab(resolvePrefabKey(this.getAssetPrefabsPathForPack(var1), var2), var3, var4, var5);
      }
   }

   @Nonnull
   class="kw">public Path getPrefabsPathForPack(@Nullable AssetPack var1) {
      class="kw">return var1 != null ? this.getAssetPrefabsPathForPack(var1) : this.getServerPrefabsPath();
   }

   @Nonnull
   class="kw">public BlockSelection getWorldGenPrefab(@Nonnull String var1) {
      class="kw">return this.getWorldGenPrefab(this.getWorldGenPrefabsPath(), var1);
   }

   @Nonnull
   class="kw">public BlockSelection getWorldGenPrefab(@Nonnull Path var1, @Nonnull String var2) {
      class="kw">return this.getPrefab(resolvePrefabKey(var1, var2));
   }

   @Nonnull
   class="kw">public Map<Path, BlockSelection> getWorldGenPrefabDir(@Nonnull String var1) {
      class="kw">return this.getPrefabDir(resolvePrefabKey(this.getWorldGenPrefabsPath(), var1));
   }

   class="kw">public void saveWorldGenPrefab(@Nonnull String var1, @Nonnull BlockSelection var2) {
      this.saveWorldGenPrefab(var1, var2, false);
   }

   class="kw">public class="kw">static PrefabStore get() {
      class="kw">return INSTANCE;
   }

   class="kw">public record AssetPackPrefabPath(@Nullable AssetPack pack, @Nonnull Path prefabsPath) {
      class="kw">public AssetPackPrefabPath {
      }

      class="kw">public boolean isBasePack() {
         class="kw">return this.pack != null && this.pack.equals(AssetModule.get().getBaseAssetPack());
      }

      class="kw">public boolean isFromAssetPack() {
         class="kw">return this.pack != null;
      }

      @Nonnull
      class="kw">public String getPackName() {
         class="kw">return this.pack != null ? this.pack.getName() : "Server";
      }

      @Nonnull
      class="kw">public String getDisplayName() {
         if (this.pack == null) {
            class="kw">return "Server";
         }

         if (this.isBasePack()) {
            class="kw">return "HytaleAssets";
         }

         PluginManifest var1 = this.pack.getManifest();
         class="kw">return var1 != null ? var1.getName() : this.pack.getName();
      }
   }

   class="kw">private record PrefabFormatPaths(@Nonnull Path jsonPath, @Nonnull Path lpfPath) {
      class="kw">private PrefabFormatPaths {
      }
   }
}