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 {
}
}
}