FilterTask class

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

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

implements: IntObjectFunction<ChunkGenerator, Vector3iList>

Поля (9)

МодификаторыТипИмя
private final IntSet biomeIds
private final Vector3iList candidates
Vector3i var3
ZonePatternGenerator var4
int var5
Vector3i var6
ZoneGeneratorResult var7
Zone var8
Biome var9

Методы (1)

МодификаторыВозвратСигнатура
public Vector3iList applypublic Vector3iList apply(int var1, ChunkGenerator var2)

Исходный код

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