Constants interface
Пакет: com.hypixel.hytale.server.worldgen.loader
Файл: com/hypixel/hytale/server/worldgen/loader/ChunkGeneratorJsonLoader.java
Поля (16)
| Модификаторы | Тип | Имя |
|---|---|---|
|
String |
ERROR_WORLD_FILE_EXIST |
|
String |
ERROR_WORLD_FILE_READ |
|
String |
ERROR_WORLD_JSON_CORRUPT |
|
String |
ERROR_ZONE_FILE |
|
String |
FILE_MASK_JSON |
|
String |
FILE_MASK_PNG |
|
String |
FILE_WORLD_JSON |
|
String |
FILE_ZONES_JSON |
|
String |
KEY_HEIGHT |
|
String |
KEY_MASKS |
|
String |
KEY_OFFSET_X |
|
String |
KEY_OFFSET_Y |
|
String |
KEY_PREFAB_STORE |
|
String |
KEY_RANDOMIZER |
|
String |
KEY_WIDTH |
|
String |
OVERRIDE_DATA_FOLDER |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.worldgen.loader;
class="kw">import com.google.gson.JsonArray;
class="kw">import com.google.gson.JsonElement;
class="kw">import com.google.gson.JsonObject;
class="kw">import com.hypixel.hytale.assetstore.AssetPack;
class="kw">import com.hypixel.hytale.builtin.worldgen.modifier.EventHandler;
class="kw">import com.hypixel.hytale.common.map.IWeightedMap;
class="kw">import com.hypixel.hytale.common.map.WeightedMap;
class="kw">import com.hypixel.hytale.common.semver.Semver;
class="kw">import com.hypixel.hytale.common.util.ArrayUtil;
class="kw">import com.hypixel.hytale.common.util.PathUtil;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.util.FastRandom;
class="kw">import com.hypixel.hytale.procedurallib.file.FileIO;
class="kw">import com.hypixel.hytale.procedurallib.json.JsonLoader;
class="kw">import com.hypixel.hytale.procedurallib.json.Loader;
class="kw">import com.hypixel.hytale.procedurallib.json.SeedString;
class="kw">import com.hypixel.hytale.server.worldgen.SeedStringResource;
class="kw">import com.hypixel.hytale.server.worldgen.WorldGenConfig;
class="kw">import com.hypixel.hytale.server.worldgen.chunk.ChunkGenerator;
class="kw">import com.hypixel.hytale.server.worldgen.chunk.MaskProvider;
class="kw">import com.hypixel.hytale.server.worldgen.loader.climate.ClimateMaskJsonLoader;
class="kw">import com.hypixel.hytale.server.worldgen.loader.context.FileContextLoader;
class="kw">import com.hypixel.hytale.server.worldgen.loader.context.FileLoadingContext;
class="kw">import com.hypixel.hytale.server.worldgen.loader.zone.ZonePatternProviderJsonLoader;
class="kw">import com.hypixel.hytale.server.worldgen.prefab.PrefabStoreRoot;
class="kw">import com.hypixel.hytale.server.worldgen.util.LogUtil;
class="kw">import com.hypixel.hytale.server.worldgen.zone.Zone;
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.Objects;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.joml.Vector2i;
class="kw">public class ChunkGeneratorJsonLoader class="kw">extends Loader<SeedStringResource, ChunkGenerator> {
@Nonnull
class="kw">private class="kw">final WorldGenConfig config;
class="kw">public ChunkGeneratorJsonLoader(@Nonnull SeedString<SeedStringResource> var1, @Nonnull WorldGenConfig var2) {
super(var1, var2.path());
this.config = var2;
}
@Nonnull
class="kw">public ChunkGenerator load() {
Path var1 = this.dataFolder.resolve("World.json").toAbsolutePath();
if (!Files.exists(var1)) {
throw new IllegalArgumentException(String.valueOf(var1));
}
if (!Files.isReadable(var1)) {
throw new IllegalArgumentException(String.valueOf(var1));
}
JsonObject var2 = this.loadWorldJson(var1);
Path var3 = this.loadOverrideDataFolderPath(var2, this.config.path());
WorldGenConfig var4 = this.config.withOverride(var3);
try (
AssetFileSystem var5 = FileIO.openFileIOSystem(new AssetFileSystem(var4));
EventHandler var6 = EventHandler.acquire(var4.path());
) {
logAssetPacks(var5.packs());
Vector2i var7 = this.loadWorldSize(var2);
Vector2i var8 = this.loadWorldOffset(var2);
MaskProvider var9 = this.loadMaskProvider(var2, var7, var8);
PrefabStoreRoot var10 = this.loadPrefabStore(var2);
this.seed.get().setPrefabConfig(var4, var10);
ZonePatternProviderJsonLoader var11 = this.loadZonePatternGenerator(var9);
FileLoadingContext var12 = new FileContextLoader(var4.name(), var3, var11.loadZoneRequirement()).load();
Zone[] var13 = new ZonesJsonLoader(this.seed, var3, var12).load();
var11.setZones(var13);
class="kw">return new ChunkGenerator(var11.load(), var3);
}
}
@Nonnull
class="kw">private Path loadOverrideDataFolderPath(@Nonnull JsonObject var1, @Nonnull Path var2) {
if (var1.has("OverrideDataFolder")) {
Path var3 = var2.resolve(var1.get("OverrideDataFolder").getAsString()).normalize();
Path var4 = var2.getParent();
if (var3.startsWith(var4) && Files.exists(var3)) {
class="kw">return var3;
} else {
throw new Error(String.format("Override folder '%s' must exist within: '%s'", var3.getFileName(), var4));
}
} else {
class="kw">return var2;
}
}
@Nonnull
class="kw">protected JsonObject loadWorldJson(@Nonnull Path var1) {
try {
class="kw">return FileIO.load(var1, JsonLoader.JSON_OBJ_LOADER);
} catch (Throwable var3) {
throw new Error(String.format("Could not read JSON configuration for world. File: %s", var1), var3);
}
}
@Nonnull
class="kw">protected Vector2i loadWorldSize(@Nonnull JsonObject var1) {
int var2 = 0;
int var3 = 0;
if (var1.has("Width")) {
var2 = var1.get("Width").getAsInt();
}
if (var1.has("Height")) {
var3 = var1.get("Height").getAsInt();
}
class="kw">return new Vector2i(var2, var3);
}
@Nonnull
class="kw">protected Vector2i loadWorldOffset(@Nonnull JsonObject var1) {
int var2 = 0;
int var3 = 0;
if (var1.has("OffsetX")) {
var2 = var1.get("OffsetX").getAsInt();
}
if (var1.has("OffsetY")) {
var3 = var1.get("OffsetY").getAsInt();
}
class="kw">return new Vector2i(var2, var3);
}
@Nonnull
class="kw">protected MaskProvider loadMaskProvider(@Nonnull JsonObject var1, Vector2i var2, Vector2i var3) {
WeightedMap.Builder var4 = WeightedMap.builder(ArrayUtil.EMPTY_STRING_ARRAY);
JsonElement var5 = var1.get("Masks");
if (var5 == null) {
var4.put("Mask.png", 1.0);
} else if (var5.isJsonPrimitive()) {
var4.put(var5.getAsString(), 1.0);
} else if (var5.isJsonArray()) {
JsonArray var6 = var5.getAsJsonArray();
if (var6.isEmpty()) {
var4.put("Mask.png", 1.0);
} else {
for (int var7 = 0; var7 < var6.size(); var7++) {
var4.put(var6.get(var7).getAsString(), 1.0);
}
}
} else if (var5.isJsonObject()) {
JsonObject var9 = var5.getAsJsonObject();
if (var9.size() == 0) {
var4.put("Mask.png", 1.0);
} else {
for (String var8 : var9.keySet()) {
var4.put(var8, var9.get(var8).getAsDouble());
}
}
}
IWeightedMap var10 = var4.build();
String var12 = var10.get(new FastRandom(this.seed.hashCode()));
Path var13 = PathUtil.resolvePathWithinDir(this.dataFolder, var12);
if (var13 == null) {
throw new Error("Invalid mask file path: " + var12);
} else {
class="kw">return var13.getFileName().toString().endsWith("Mask.json")
? new ClimateMaskJsonLoader<>(this.seed, this.dataFolder, var13).load()
: new MaskProviderJsonLoader(this.seed, this.dataFolder, var1.get("Randomizer"), var13, var2, var3).load();
}
}
@Nonnull
class="kw">protected PrefabStoreRoot loadPrefabStore(@Nonnull JsonObject var1) {
if (var1.has("PrefabStore")) {
JsonElement var2 = var1.get("PrefabStore");
if (var2.isJsonPrimitive() && var2.getAsJsonPrimitive().isString()) {
String var3 = var2.getAsString();
try {
class="kw">return PrefabStoreRoot.valueOf(var3);
} catch (IllegalArgumentException var5) {
throw new Error("Invalid PrefabStore name: " + var3, var5);
}
} else {
throw new Error("Expected 'PrefabStore' to be a string");
}
} else {
class="kw">return PrefabStoreRoot.DEFAULT;
}
}
@Nonnull
class="kw">protected ZonePatternProviderJsonLoader loadZonePatternGenerator(MaskProvider var1) {
Path var2 = this.dataFolder.resolve("Zones.json");
try {
JsonObject var3 = FileIO.load(var2, JsonLoader.JSON_OBJ_LOADER);
class="kw">return new ZonePatternProviderJsonLoader(this.seed, this.dataFolder, var3, var1);
} catch (Throwable var4) {
throw new Error(String.format("Failed to read zone configuration file! File: %s", var2.toString()), var4);
}
}
class="kw">protected class="kw">static void logAssetPacks(@Nonnull List<AssetPack> var0) {
HytaleLogger.Api var1 = (HytaleLogger.Api)LogUtil.getLogger().atInfo();
Semver var2 = new Semver(0L, 0L, 0L);
var1.log("Loading world-gen with the following asset-packs (highest priority first):");
for (int var3 = 0; var3 < var0.size(); var3++) {
AssetPack var4 = var0.get(var3);
String var5 = var4.getName();
Semver var6 = Objects.requireNonNullElse(var4.getManifest().getVersion(), var2);
Path var7 = var4.getPackLocation();
var1.log("- [%3d] %s:%s - [%s]", var3, var5, var6, var7);
}
}
class="kw">public class="kw">interface Constants {
String KEY_WIDTH = "Width";
String KEY_HEIGHT = "Height";
String KEY_OFFSET_X = "OffsetX";
String KEY_OFFSET_Y = "OffsetY";
String KEY_RANDOMIZER = "Randomizer";
String KEY_MASKS = "Masks";
String KEY_PREFAB_STORE = "PrefabStore";
String OVERRIDE_DATA_FOLDER = "OverrideDataFolder";
String FILE_WORLD_JSON = "World.json";
String FILE_ZONES_JSON = "Zones.json";
String FILE_MASK_JSON = "Mask.json";
String FILE_MASK_PNG = "Mask.png";
String ERROR_WORLD_FILE_EXIST = "World configuration file does NOT exist! File not found: %s";
String ERROR_WORLD_FILE_READ = "World configuration file is NOT readable! File: %s";
String ERROR_WORLD_JSON_CORRUPT = "Could not read JSON configuration for world. File: %s";
String ERROR_ZONE_FILE = "Failed to read zone configuration file! File: %s";
}
}