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