BiomeLocationV1 class
Пакет: com.hypixel.hytale.builtin.worldgen.integrations
Файл: com/hypixel/hytale/builtin/worldgen/integrations/BiomeLocationV1.java
implements: EventLocation
Поля (21)
| Модификаторы | Тип | Имя |
|---|---|---|
|
public static final ArrayCodec<BiomeLocationV1.Rule> |
ARRAY_CODEC |
|
private static final SetCodec<String, ObjectOpenHashSet<String>> |
BIOMES_CODEC |
|
public static final BuilderCodec<BiomeLocationV1.Config> |
CODEC |
|
public static final RecordCodec<BiomeLocationV1.Rule> |
CODEC |
|
public static final BiomeLocationV1.Rule[] |
EMPTY_ARRAY |
final |
String |
ID |
|
private final IntSet |
biomeIds |
|
private final Vector3iList |
candidates |
|
protected EventLocation.Config |
location |
|
protected BiomeLocationV1.Rule[] |
rules |
|
World |
var2 |
|
IntOpenHashSet |
var2 |
|
Vector3i |
var3 |
|
ZonePatternGenerator |
var4 |
|
boolean |
var5 |
|
int |
var5 |
|
int |
var6 |
|
Vector3i |
var6 |
|
ZoneGeneratorResult |
var7 |
|
Zone |
var8 |
|
Biome |
var9 |
Методы (8)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
public |
Configpublic Config() |
|
private |
FilterTaskprivate FilterTask(@Nonnull IntSet var1, @Nonnull Vector3iList var2) |
public |
record |
Rulerecord Rule(@Nonnull String zone, @Nullable Set<String> biomes) |
|
public Vector3iList |
applypublic Vector3iList apply(int var1, ChunkGenerator var2) |
protected |
IntSet |
collectBiomeIdsIntSet collectBiomeIds(@Nonnull ChunkGenerator var1) |
|
public EventLocation |
createpublic EventLocation create() |
|
|
for for(BiomeLocationV1.Rule var10 : this.config.rules) |
|
|
if if(this.config.rules != null && this.config.rules.length != 0) |
Исходный код
Показать/скрыть
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 {
}
}
}