BiomeEditor interface

Пакет: com.hypixel.hytale.builtin.hytalegenerator.plugin.editor

Файл: com/hypixel/hytale/builtin/hytalegenerator/plugin/editor/BiomeEditor.java

Поля (61)

МодификаторыТипИмя
public static final BuilderCodec<BiomeEditor.Defaults> CODEC
public static final String[] DEFAULT_ASSET_TEMPLATE_TAGS
public static final String DEFAULT_BIOME_TEMPLATE
public static final boolean DEFAULT_ENABLE_PERSISTENCE
public static final String DEFAULT_GROUP
public static final String DEFAULT_PACK
public static final Bounds3i DEFAULT_VIEWPORT_BOUNDS
public static final String DEFAULT_WORLD_STRUCTURE_TEMPLATE
HytaleLogger LOGGER
public static final Vector3i VIEWPORT_MAX
public static final Vector3i VIEWPORT_MIN
public String[] assetTemplateTags
public String biome
public transient String[] biomeAssets
public String biomeTemplate
protected BiomeEditor.Config config
public transient boolean enablePersistence
public boolean enablePersistence
public String group
public String group
public String name
public String pack
protected AssetPack pack
public String pack
BuilderCodec var0
AssetPack var1
AssetManager var1
Path var10
Set var10
String[] var11
BsonDocument var12
JsonAssetWithMap var16
BsonDocument var17
BsonDocument var18
BiomeEditor.Context var2
PluginIdentifier var2
HandleProvider var2
World var2
Store var2
AssetStore var2
HytaleServerConfig var3
WorldConfig var3
World var3
AssetMap var3
Path var4
TransformComponent var4
Set var4
CompletableFuture var5
AssetPack var5
String var6
AssetStore var7
AssetMap var8
JsonAssetWithMap var9
int var9
public transient Bounds3i viewport
public transient Bounds3i viewportBounds
public Vector3i viewportMax
public Vector3i viewportMin
public String worldStructure
public transient String[] worldStructureAssets
public String worldStructureTemplate

Методы (24)

МодификаторыВозвратСигнатура
public Configpublic Config()
public Contextpublic Context()
public Defaultspublic Defaults()
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Ref no longer valid")
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Entity ref does not have TransformComponent")
abstract throw new IllegalStateExceptionthrow new IllegalStateException("AssetManager is not available. Unable to configure viewport")
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Template asset does not exist: " + var1)
abstract throw new IllegalStateExceptionthrow new IllegalStateException("HandleProvider codec returned unexpected default value type")
abstract return new Viewportreturn new Viewport(this.config.viewport, var1)
public BiomeEditor.Context applypublic BiomeEditor.Context apply(@Nullable Object var1)
static <T extends JsonAssetWithMap<String, M>, M extends AssetMap<String, T>> void createAssetFromTemplate<T extends JsonAssetWithMap<String, M>, M extends AssetMap<String, T>> void createAssetFromTemplate(@Nonnull BiomeEditor.Context var0, @Nullable String var1, @Nonnull Class<T> var2, @Nonnull BuilderCodec<? extends T> var3, @Nonnull BiConsumer<BsonDocument, BiomeEditor.Config> var4)
public Viewport createViewportpublic Viewport createViewport(@Nonnull World var1)
static HandleProvider createWorldGenProviderHandleProvider createWorldGenProvider()
for for(String var8 : var1)
if if(var1 != null)
if if(var4 == null)
if if(var1 == null)
if if(var9 != null)
if if(var10 == null)
if if(var2 == null)
protected static <T extends JsonAssetWithMap<String, M>, M extends AssetMap<String, T>> String[] resolveAssetTagsprotected static <T extends JsonAssetWithMap<String, M>, M extends AssetMap<String, T>> String[] resolveAssetTags(@Nonnull Class<T> var0, @Nonnull String[] var1)
static CompletableFuture<BiomeEditor.Context> setupAssetsCompletableFuture<BiomeEditor.Context> setupAssets(@Nonnull BiomeEditor.Config var0)
static CompletableFuture<Void> setupViewportCompletableFuture<Void> setupViewport(@Nonnull BiomeEditor.Config var0, @Nonnull Ref<EntityStore> var1)
static CompletableFuture<Void> setupViewportCompletableFuture<Void> setupViewport(@Nonnull CompletableFuture<BiomeEditor.Context> var0, @Nonnull Ref<EntityStore> var1)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.hytalegenerator.plugin.editor;

class="kw">import com.hypixel.hytale.assetstore.AssetMap;
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.map.JsonAssetWithMap;
class="kw">import com.hypixel.hytale.builtin.asseteditor.util.BsonTransformationUtil;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.Viewport;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.assets.AssetManager;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.assets.biomes.BiomeAsset;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.assets.worldstructures.WorldStructureAsset;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.assets.worldstructures.basic.BasicWorldStructureAsset;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.bounds.Bounds3i;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.plugin.HandleProvider;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.plugin.HytaleGenerator;
class="kw">import com.hypixel.hytale.builtin.instances.InstancesPlugin;
class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.ExtraInfo;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.codec.util.RawJsonReader;
class="kw">import com.hypixel.hytale.common.plugin.PluginIdentifier;
class="kw">import com.hypixel.hytale.common.util.ArrayUtil;
class="kw">import com.hypixel.hytale.common.util.PathUtil;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.math.vector.Transform;
class="kw">import com.hypixel.hytale.math.vector.Vector3iUtil;
class="kw">import com.hypixel.hytale.server.core.HytaleServer;
class="kw">import com.hypixel.hytale.server.core.HytaleServerConfig;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.WorldConfig;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldgen.provider.IWorldGenProvider;
class="kw">import com.hypixel.hytale.sneakythrow.SneakyThrow;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
class="kw">import java.io.IOException;
class="kw">import java.nio.file.Path;
class="kw">import java.util.Arrays;
class="kw">import java.util.Set;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.function.BiConsumer;
class="kw">import java.util.function.Function;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.bson.BsonArray;
class="kw">import org.bson.BsonDocument;
class="kw">import org.bson.BsonString;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3i;

class="kw">public class="kw">interface BiomeEditor {
   HytaleLogger LOGGER = HytaleLogger.get("BiomeEditor");
   String[] BIOME_NAME_PATH = new String[]{"Name"};
   String[] BIOMES_PATH = new String[]{"Biomes"};
   String[] DEFAULT_BIOME_PATH = new String[]{"DefaultBiome"};

   class="kw">static CompletableFuture<BiomeEditor.Context> setupAssets(@Nonnull BiomeEditor.Config var0) {
      class="kw">return !PathUtil.isValidName(var0.name)
         ? CompletableFuture.failedFuture(new IllegalArgumentException("Invalid name: " + var0.name))
         : AssetPackUtil.getOrCreatePack(var0.group, var0.pack)
            .thenApply(var1 -> {
               BiomeEditor.Context var2 = new BiomeEditor.Context();
               var2.config = var0;
               var2.pack = var1;
               class="kw">return var2;
            })
            .thenComposeAsync(var0x -> {
               AssetPack var1 = var0x.pack;
               PluginIdentifier var2 = new PluginIdentifier(var1.getManifest());
               HytaleServerConfig var3 = HytaleServer.get().getConfig();
               HytaleServerConfig.setBoot(var3, var2, true);
               var3.markChanged();
               class="kw">return var3.consumeHasChanged() ? HytaleServerConfig.save(var3).thenApply(var0x) : CompletableFuture.completedFuture(var0x);
            })
            .thenApplyAsync(
               SneakyThrow.sneakyFunction(
                  var0x -> {
                     ((HytaleLogger.Api)LOGGER.atInfo()).log("Creating Biome %s with Template %s", var0x.config.name, var0x.config.biomeTemplate);
                     createAssetFromTemplate(
                        var0x,
                        var0x.config.biomeTemplate,
                        BiomeAsset.class,
                        BiomeAsset.CODEC,
                        (var0xx, var1) -> BsonTransformationUtil.setProperty(var0xx, BIOME_NAME_PATH, new BsonString(var1.name))
                     );
                     class="kw">return var0x;
                  }
               )
            )
            .thenApplyAsync(SneakyThrow.sneakyFunction(var1 -> {
               ((HytaleLogger.Api)LOGGER.atInfo()).log("Creating WorldStructure %s with Template %s", var0.name, var0.worldStructureTemplate);
               createAssetFromTemplate(var1, var1.config.worldStructureTemplate, WorldStructureAsset.class, BasicWorldStructureAsset.CODEC, (var0x, var1x) -> {
                  BsonTransformationUtil.setProperty(var0x, BIOMES_PATH, new BsonArray());
                  BsonTransformationUtil.setProperty(var0x, DEFAULT_BIOME_PATH, new BsonString(var1x.name));
               });
               class="kw">return var1;
            }))
            .thenComposeAsync(var1 -> {
               ((HytaleLogger.Api)LOGGER.atInfo()).log("Creating Instance %s", var0.name);
               HandleProvider var2 = createWorldGenProvider();
               var2.setWorldStructureName(var0.name);
               WorldConfig var3 = new WorldConfig();
               var3.setWorldGenProvider(var2);
               var3.setSavingConfig(var0.enablePersistence);
               var3.setSaveNewChunks(var0.enablePersistence);
               var3.setCanSaveChunks(var0.enablePersistence);
               var3.setSavingPlayers(var0.enablePersistence);
               var3.setDeleteOnRemove(!var0.enablePersistence);
               Path var4 = var1.pack.getRoot().resolve("Server", new String[]{"Instances", var0.name, "instance.bson"});
               class="kw">return WorldConfig.save(var4, var3).thenApply(var1);
            })
            .whenComplete((var0x, var1) -> {
               if (var1 != null) {
                  ((HytaleLogger.Api)((HytaleLogger.Api)LOGGER.atWarning()).withCause(var1)).log("Error occurred whilst setting up assets");
               }
            });
   }

   class="kw">static CompletableFuture<Void> setupViewport(@Nonnull BiomeEditor.Config var0, @Nonnull Ref<EntityStore> var1) {
      class="kw">return setupViewport(setupAssets(var0), var1);
   }

   class="kw">static CompletableFuture<Void> setupViewport(@Nonnull CompletableFuture<BiomeEditor.Context> var0, @Nonnull Ref<EntityStore> var1) {
      World var2 = var1.getStore().getExternalData().getWorld();
      class="kw">return var0.<Viewport>thenComposeAsync(
            var1x -> {
               if (!var1.isValid()) {
                  throw new IllegalStateException("Ref no longer valid");
               }

               Store var2 = var1.getStore();
               World var3 = var2.getExternalData().getWorld();
               TransformComponent var4 = var2.getComponent(var1, TransformComponent.getComponentType());
               if (var4 == null) {
                  throw new IllegalStateException("Entity ref does not have TransformComponent");
               }

               ((HytaleLogger.Api)LOGGER.atInfo()).log("Creating world Instance %s", var1x.config.name);
               CompletableFuture var5 = InstancesPlugin.get()
                  .spawnInstance(var1x.config.name, var3, new Transform(new Vector3d(var4.getPosition()), new Rotation3f(var4.getRotation())));
               ((HytaleLogger.Api)LOGGER.atInfo()).log("Teleporting player to Instance %s", var1x.config.name);
               InstancesPlugin.teleportPlayerToLoadingInstance(var1, var2, var5, null);
               class="kw">return var5.thenApply(var1x::createViewport);
            },
            var2
         )
         .thenAcceptAsync(var0x -> {
            AssetManager var1 = HytaleGenerator.get().getAssetManager();
            if (var1 == null) {
               throw new IllegalStateException("AssetManager is not available. Unable to configure viewport");
            }

            var1.registerReloadListener(var0x::submitRefresh);
         }, var2);
   }

   class="kw">static <T class="kw">extends JsonAssetWithMap<String, M>, M class="kw">extends AssetMap<String, T>> void createAssetFromTemplate(
      @Nonnull BiomeEditor.Context var0,
      @Nullable String var1,
      @Nonnull Class<T> var2,
      @Nonnull BuilderCodec<? class="kw">extends T> var3,
      @Nonnull BiConsumer<BsonDocument, BiomeEditor.Config> var4
   ) class="kw">throws IllegalStateException, IOException {
      AssetPack var5 = var0.pack;
      String var6 = var0.config.name;
      AssetStore var7 = AssetRegistry.getAssetStore(var2);
      AssetMap var8 = var7.getAssetMap();
      JsonAssetWithMap var9 = (T)var8.getAsset(var6);
      if (var9 != null) {
         if (!var5.getName().equals(var8.getAssetPack(var6))) {
            BsonDocument var17 = var7.getCodec().encode(var9, ExtraInfo.THREAD_LOCAL.get()).asDocument();
            var4.accept(var17, var0.config);
            AssetPackUtil.exportAsset(var5, var6, var17, var2);
         }
      } else if (var1 == null) {
         JsonAssetWithMap var16 = (T)var3.getDefaultValue();
         BsonDocument var18 = var7.getCodec().encode(var16, ExtraInfo.THREAD_LOCAL.get()).asDocument();
         var4.accept(var18, var0.config);
         AssetPackUtil.exportAsset(var5, var6, var18, var2);
      } else {
         Path var10 = var8.getPath(var1);
         if (var10 == null) {
            throw new IllegalStateException("Template asset does not exist: " + var1);
         }

         try (RawJsonReader var11 = RawJsonReader.fromPath(var10, RawJsonReader.READ_BUFFER.get())) {
            BsonDocument var12 = RawJsonReader.readBsonDocument(var11);
            var4.accept(var12, var0.config);
            AssetPackUtil.exportAsset(var5, var6, var12, var2);
         }
      }
   }

   class="kw">static HandleProvider createWorldGenProvider() {
      BuilderCodec var0 = IWorldGenProvider.CODEC.getCodecFor("HytaleGenerator");
      if (var0.getDefaultValue() class="kw">instanceof HandleProvider var1) {
         class="kw">return var1;
      } else {
         throw new IllegalStateException("HandleProvider codec returned unexpected class="kw">default value type");
      }
   }

   class Config {
      @Nonnull
      class="kw">public String name = "";
      @Nonnull
      class="kw">public String pack = "Biomes";
      @Nonnull
      class="kw">public String group = "User";
      @Nullable
      class="kw">public String biomeTemplate = "Basic";
      @Nullable
      class="kw">public String worldStructureTemplate = "Basic";
      @Nonnull
      class="kw">public class="kw">transient Bounds3i viewport = BiomeEditor.Defaults.DEFAULT_VIEWPORT_BOUNDS;
      class="kw">public class="kw">transient boolean enablePersistence = false;

      class="kw">public Config() {
      }
   }

   class Context class="kw">implements Function<Object, BiomeEditor.Context> {
      class="kw">protected BiomeEditor.Config config;
      class="kw">protected AssetPack pack;

      class="kw">public Context() {
      }

      @Nonnull
      class="kw">public BiomeEditor.Context apply(@Nullable Object var1) {
         class="kw">return this;
      }

      @Nonnull
      class="kw">public Viewport createViewport(@Nonnull World var1) {
         class="kw">return new Viewport(this.config.viewport, var1);
      }
   }

   class Defaults {
      class="kw">public class="kw">static class="kw">final BuilderCodec<BiomeEditor.Defaults> CODEC = BuilderCodec.builder(BiomeEditor.Defaults.class, BiomeEditor.Defaults::new)
         .documentation("Default configuration options for the BiomeEditor")
         .<String>append(new KeyedCodec<>("Group", Codec.STRING), (var0, var1) -> var0.group = var1, var0 -> var0.group)
         .documentation("The asset-pack group to create new biomes under")
         .add()
         .<String>append(new KeyedCodec<>("Pack", Codec.STRING), (var0, var1) -> var0.pack = var1, var0 -> var0.pack)
         .documentation("The asset-pack name to create new biomes under")
         .add()
         .<String>append(new KeyedCodec<>("DefaultBiome", Codec.STRING), (var0, var1) -> var0.biome = var1, var0 -> var0.biome)
         .documentation("The Biome asset template selected as class="kw">default")
         .add()
         .<String>append(new KeyedCodec<>("DefaultWorldStructure", Codec.STRING), (var0, var1) -> var0.worldStructure = var1, var0 -> var0.worldStructure)
         .documentation("The WorldStructure asset template selected as class="kw">default")
         .add()
         .<String[]>append(
            new KeyedCodec<>("AssetTemplateTags", Codec.STRING_ARRAY), (var0, var1) -> var0.assetTemplateTags = var1, var0 -> var0.assetTemplateTags
         )
         .documentation("List of tags to match Biome and WorldStructure assets to use as templates")
         .add()
         .<Vector3i>append(new KeyedCodec<>("ViewportMin", Vector3iUtil.CODEC), (var0, var1) -> var0.viewportMin = var1, var0 -> var0.viewportMin)
         .documentation("The min corner of the Viewport to set up in the biome editor world")
         .add()
         .<Vector3i>append(new KeyedCodec<>("ViewportMax", Vector3iUtil.CODEC), (var0, var1) -> var0.viewportMax = var1, var0 -> var0.viewportMax)
         .documentation("The max corner of the Viewport to set up in the biome editor world")
         .add()
         .<Boolean>append(new KeyedCodec<>("EnablePersistence", Codec.BOOLEAN), (var0, var1) -> var0.enablePersistence = var1, var0 -> var0.enablePersistence)
         .documentation("Whether the BiomdEditor world should be stored on disk after exiting it")
         .add()
         .afterDecode(var0 -> {
            var0.biomeAssets = resolveAssetTags(BiomeAsset.class, var0.assetTemplateTags);
            var0.worldStructureAssets = resolveAssetTags(WorldStructureAsset.class, var0.assetTemplateTags);
            var0.viewportBounds = new Bounds3i(var0.viewportMin, var0.viewportMax);
         })
         .build();
      class="kw">public class="kw">static class="kw">final String DEFAULT_PACK = "Biomes";
      class="kw">public class="kw">static class="kw">final String DEFAULT_GROUP = "User";
      class="kw">public class="kw">static class="kw">final String DEFAULT_BIOME_TEMPLATE = "Basic";
      class="kw">public class="kw">static class="kw">final String DEFAULT_WORLD_STRUCTURE_TEMPLATE = "Basic";
      class="kw">public class="kw">static class="kw">final String[] DEFAULT_ASSET_TEMPLATE_TAGS = new String[]{"Template"};
      class="kw">public class="kw">static class="kw">final Vector3i VIEWPORT_MIN = new Vector3i(-128, 0, -128);
      class="kw">public class="kw">static class="kw">final Vector3i VIEWPORT_MAX = new Vector3i(128, 0, 128);
      class="kw">public class="kw">static class="kw">final Bounds3i DEFAULT_VIEWPORT_BOUNDS = new Bounds3i(VIEWPORT_MIN, VIEWPORT_MAX);
      class="kw">public class="kw">static class="kw">final boolean DEFAULT_ENABLE_PERSISTENCE = false;
      @Nonnull
      class="kw">public String pack = "Biomes";
      @Nonnull
      class="kw">public String group = "User";
      @Nullable
      class="kw">public String biome = "Basic";
      @Nullable
      class="kw">public String worldStructure = "Basic";
      @Nonnull
      class="kw">public String[] assetTemplateTags = DEFAULT_ASSET_TEMPLATE_TAGS;
      @Nonnull
      class="kw">public Vector3i viewportMin = VIEWPORT_MIN;
      @Nonnull
      class="kw">public Vector3i viewportMax = VIEWPORT_MAX;
      class="kw">public boolean enablePersistence = false;
      @Nonnull
      class="kw">public class="kw">transient Bounds3i viewportBounds = new Bounds3i();
      @Nonnull
      class="kw">public class="kw">transient String[] biomeAssets = ArrayUtil.EMPTY_STRING_ARRAY;
      @Nonnull
      class="kw">public class="kw">transient String[] worldStructureAssets = ArrayUtil.EMPTY_STRING_ARRAY;

      class="kw">public Defaults() {
      }

      class="kw">protected class="kw">static <T class="kw">extends JsonAssetWithMap<String, M>, M class="kw">extends AssetMap<String, T>> String[] resolveAssetTags(
         @Nonnull Class<T> var0, @Nonnull String[] var1
      ) {
         AssetStore var2 = AssetRegistry.getAssetStore(var0);
         if (var2 == null) {
            class="kw">return ArrayUtil.EMPTY_STRING_ARRAY;
         }

         AssetMap var3 = var2.getAssetMap();
         Set var4 = (Set<String>)(var1.length == 0 ? var3.getAssetMap().keySet() : new ObjectOpenHashSet());

         for (String var8 : var1) {
            int var9 = AssetRegistry.getTagIndex(var8);
            Set var10 = var3.getKeysForTag(var9);
            var4.addAll(var10);
         }

         String[] var11 = var4.toArray(ArrayUtil.EMPTY_STRING_ARRAY);
         Arrays.sort(var11);
         class="kw">return var11;
      }
   }
}