ChunkGeneratorJsonLoader class

Пакет: com.hypixel.hytale.server.worldgen.loader

Файл: com/hypixel/hytale/server/worldgen/loader/ChunkGeneratorJsonLoader.java

extends: Loader<SeedStringResource, ChunkGenerator>

Поля (56)

МодификаторыТипИмя
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
Path var1
HytaleLogger.Api var1
PrefabStoreRoot var10
IWeightedMap var10
ZonePatternProviderJsonLoader var11
FileLoadingContext var12
String var12
Zone[] var13
Path var13
JsonObject var2
int var2
var2
int var2
var2
JsonElement var2
Path var2
Semver var2
Path var3
Path var3
int var3
var3
int var3
var3
String var3
JsonObject var3
WorldGenConfig var4
Path var4
WeightedMap.Builder var4
AssetPack var4
AssetFileSystem var5
JsonElement var5
String var5
EventHandler var6
JsonArray var6
Semver var6
Vector2i var7
Path var7
Vector2i var8
MaskProvider var9
JsonObject var9

Методы (10)

МодификаторыВозвратСигнатура
abstract throw new Errorthrow new Error("Invalid mask file path: " + var12)
abstract throw new Errorthrow new Error("Invalid PrefabStore name: " + var3, var5)
abstract throw new Errorthrow new Error("Expected 'PrefabStore' to be a string")
abstract return new Vector2ireturn new Vector2i(var2, var3)
abstract return new ZonePatternProviderJsonLoaderreturn new ZonePatternProviderJsonLoader(this.seed, this.dataFolder, var3, var1)
abstract for for(int var7 = 0; var7 < var6.size()
abstract for for(int var3 = 0; var3 < var0.size()
if if(var5 == null)
if if(var13 == null)
static void logAssetPacksvoid logAssetPacks(@Nonnull List<AssetPack> var0)

Исходный код

Показать/скрыть
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";
   }
}