Config class

Пакет: com.hypixel.hytale.builtin.worldgen.integrations

Файл: com/hypixel/hytale/builtin/worldgen/integrations/BiomeLocationV1.java

implements: EventLocation.Config

Поля (3)

МодификаторыТипИмя
public static final BuilderCodec<BiomeLocationV1.Config> CODEC
protected EventLocation.Config location
protected BiomeLocationV1.Rule[] rules

Методы (2)

МодификаторыВозвратСигнатура
abstract return new BiomeLocationV1return new BiomeLocationV1(this)
public EventLocation createpublic EventLocation create()

Исходный код

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

class="kw">import com.hypixel.hytale.builtin.adventure.worldevents.condition.location.EventLocation;
class="kw">import com.hypixel.hytale.builtin.adventure.worldevents.condition.location.NoLocation;
class="kw">import com.hypixel.hytale.builtin.adventure.worldevents.util.Vector3iList;
class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.codec.codecs.array.ArrayCodec;
class="kw">import com.hypixel.hytale.codec.codecs.set.SetCodec;
class="kw">import com.hypixel.hytale.codec.record.RecordCodec;
class="kw">import com.hypixel.hytale.codec.validation.Validators;
class="kw">import com.hypixel.hytale.common.util.StringUtil;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.function.function.IntObjectFunction;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.worldgen.biome.Biome;
class="kw">import com.hypixel.hytale.server.worldgen.chunk.ChunkGenerator;
class="kw">import com.hypixel.hytale.server.worldgen.zone.Zone;
class="kw">import com.hypixel.hytale.server.worldgen.zone.ZoneGeneratorResult;
class="kw">import com.hypixel.hytale.server.worldgen.zone.ZonePatternGenerator;
class="kw">import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
class="kw">import it.unimi.dsi.fastutil.ints.IntSet;
class="kw">import it.unimi.dsi.fastutil.ints.IntSets;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
class="kw">import java.lang.ref.WeakReference;
class="kw">import java.util.Set;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3i;

class="kw">public class BiomeLocationV1 class="kw">implements EventLocation {
   class="kw">public class="kw">static class="kw">final String ID = "BiomeLocationV1";
   @Nonnull
   class="kw">protected class="kw">final BiomeLocationV1.Config config;
   @Nonnull
   class="kw">protected class="kw">final EventLocation delegate;
   @Nonnull
   class="kw">protected IntSet biomeIds = IntSets.emptySet();
   @Nonnull
   class="kw">protected WeakReference<ChunkGenerator> generatorRef = new WeakReference<>(null);

   class="kw">public BiomeLocationV1(@Nonnull BiomeLocationV1.Config var1) {
      this.config = var1;
      this.delegate = var1.location.create();
   }

   @Nonnull
   @Override
   class="kw">public CompletableFuture<Vector3iList> find(@Nonnull Store<EntityStore> var1) {
      World var2 = var1.getExternalData().getWorld();
      if (var2.getChunkStore().getGenerator() class="kw">instanceof ChunkGenerator var4) {
         if (var4 != this.generatorRef.get()) {
            this.generatorRef = new WeakReference<>(var4);
            this.biomeIds = this.collectBiomeIds(var4);
         }

         boolean var5 = this.config.rules == null;
         if (this.biomeIds.isEmpty() && !var5) {
            class="kw">return CompletableFuture.completedFuture(new Vector3iList());
         }

         int var6 = (int)var2.getWorldConfig().getSeed();
         class="kw">return this.delegate
            .find(var1)
            .thenCompose(
               var4x -> !var4x.empty() && !var5
                  ? var4.execute(var6, new BiomeLocationV1.FilterTask(this.biomeIds, var4x))
                  : CompletableFuture.completedFuture(var4x)
            );
      } else {
         class="kw">return CompletableFuture.completedFuture(new Vector3iList());
      }
   }

   class="kw">protected IntSet collectBiomeIds(@Nonnull ChunkGenerator var1) {
      if (this.config.rules != null && this.config.rules.length != 0) {
         IntOpenHashSet var2 = new IntOpenHashSet();

         for (Zone var6 : var1.getZonePatternProvider().getZones()) {
            for (BiomeLocationV1.Rule var10 : this.config.rules) {
               if (StringUtil.isGlobMatching(var10.zone, var6.name())) {
                  for (Biome var14 : var6.biomePatternGenerator().getBiomes()) {
                     if (var10.biomes == null || var10.biomes.contains(var14.getName())) {
                        var2.add(var14.getId());
                     }
                  }
               }
            }
         }

         class="kw">return IntSets.unmodifiable(var2);
      } else {
         class="kw">return IntSets.emptySet();
      }
   }

   class="kw">public class="kw">static class Config class="kw">implements EventLocation.Config {
      class="kw">public class="kw">static class="kw">final BuilderCodec<BiomeLocationV1.Config> CODEC = BuilderCodec.builder(BiomeLocationV1.Config.class, BiomeLocationV1.Config::new)
         .documentation("An EventLocation that filters the output of another EventLocation, restricting locations to specific world-gen-v1 Biomes.")
         .<BiomeLocationV1.Rule[]>append(new KeyedCodec<>("Rules", BiomeLocationV1.Rule.ARRAY_CODEC), (var0, var1) -> var0.rules = var1, var0 -> var0.rules)
         .documentation("A list of biome rules that candidate locations must match. May be omitted to match all biomes.")
         .add()
         .<EventLocation.Config>append(
            new KeyedCodec<>("Location", EventLocation.Config.TYPE_CODEC), (var0, var1) -> var0.location = var1, var0 -> var0.location
         )
         .documentation("The EventLocation configuration to filter the output of.")
         .addValidator(Validators.nonNull())
         .add()
         .build();
      @Nullable
      class="kw">protected BiomeLocationV1.Rule[] rules = null;
      @Nonnull
      class="kw">protected EventLocation.Config location = NoLocation.Config.INSTANCE;

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

      @Nonnull
      @Override
      class="kw">public EventLocation create() {
         class="kw">return new BiomeLocationV1(this);
      }
   }

   class="kw">private class="kw">static class FilterTask class="kw">implements IntObjectFunction<ChunkGenerator, Vector3iList> {
      @Nonnull
      class="kw">private class="kw">final IntSet biomeIds;
      @Nonnull
      class="kw">private class="kw">final Vector3iList candidates = new Vector3iList();

      class="kw">private FilterTask(@Nonnull IntSet var1, @Nonnull Vector3iList var2) {
         this.biomeIds = var1;
         this.candidates.copy(var2);
      }

      class="kw">public Vector3iList apply(int var1, ChunkGenerator var2) {
         Vector3i var3 = new Vector3i();
         ZonePatternGenerator var4 = var2.getZonePatternGenerator(var1);
         int var5 = 0;

         while (var5 < this.candidates.size()) {
            Vector3i var6 = this.candidates.get(var5, var3);
            ZoneGeneratorResult var7 = var4.generate(var1, var6.x, var6.z);
            Zone var8 = var7.getZone();
            Biome var9 = var8.biomePatternGenerator().generateBiomeAt(var7, var1, var6.x, var6.z);
            if (this.biomeIds.contains(var9.getId())) {
               var5++;
            } else {
               this.candidates.remove(var5);
            }
         }

         class="kw">return this.candidates;
      }
   }

   class="kw">public record Rule(@Nonnull String zone, @Nullable Set<String> biomes) {
      class="kw">private class="kw">static class="kw">final SetCodec<String, ObjectOpenHashSet<String>> BIOMES_CODEC = new SetCodec<>(Codec.STRING, ObjectOpenHashSet::new, false);
      class="kw">public class="kw">static class="kw">final RecordCodec<BiomeLocationV1.Rule> CODEC = RecordCodec.builder(BiomeLocationV1.Rule.class)
         .documentation("")
         .append(
            new KeyedCodec<>("Zone", Codec.STRING),
            BiomeLocationV1.Rule::zone,
            var0 -> var0.documentation("The zone that the location should match. Supports glob wildcard matching.").addValidator(Validators.nonNull())
         )
         .append(
            new KeyedCodec<>("Biomes", BIOMES_CODEC),
            BiomeLocationV1.Rule::biomes,
            var0 -> var0.documentation("The biomes that the location should match. May be omitted to match all biomes within a zone.")
         )
         .build(BiomeLocationV1.Rule::new);
      class="kw">public class="kw">static class="kw">final ArrayCodec<BiomeLocationV1.Rule> ARRAY_CODEC = new ArrayCodec<>(CODEC, BiomeLocationV1.Rule[]::new);
      class="kw">public class="kw">static class="kw">final BiomeLocationV1.Rule[] EMPTY_ARRAY = new BiomeLocationV1.Rule[0];

      class="kw">public Rule {
      }
   }
}