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