111 lines
4.6 KiB
Java
111 lines
4.6 KiB
Java
package net.minecraft.world.level.chunk.status;
|
|
|
|
import com.google.common.collect.Lists;
|
|
import com.mojang.serialization.Codec;
|
|
import java.util.Collections;
|
|
import java.util.EnumSet;
|
|
import java.util.List;
|
|
import net.minecraft.core.Registry;
|
|
import net.minecraft.core.registries.BuiltInRegistries;
|
|
import net.minecraft.resources.ResourceLocation;
|
|
import net.minecraft.world.level.levelgen.Heightmap;
|
|
import org.jetbrains.annotations.Nullable;
|
|
import org.jetbrains.annotations.VisibleForTesting;
|
|
|
|
public class ChunkStatus {
|
|
public static final int MAX_STRUCTURE_DISTANCE = 8;
|
|
private static final EnumSet<Heightmap.Types> WORLDGEN_HEIGHTMAPS = EnumSet.of(Heightmap.Types.OCEAN_FLOOR_WG, Heightmap.Types.WORLD_SURFACE_WG);
|
|
public static final EnumSet<Heightmap.Types> FINAL_HEIGHTMAPS = EnumSet.of(
|
|
Heightmap.Types.OCEAN_FLOOR, Heightmap.Types.WORLD_SURFACE, Heightmap.Types.MOTION_BLOCKING, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES
|
|
);
|
|
public static final ChunkStatus EMPTY = register("empty", null, WORLDGEN_HEIGHTMAPS, ChunkType.PROTOCHUNK);
|
|
public static final ChunkStatus STRUCTURE_STARTS = register("structure_starts", EMPTY, WORLDGEN_HEIGHTMAPS, ChunkType.PROTOCHUNK);
|
|
public static final ChunkStatus STRUCTURE_REFERENCES = register("structure_references", STRUCTURE_STARTS, WORLDGEN_HEIGHTMAPS, ChunkType.PROTOCHUNK);
|
|
public static final ChunkStatus BIOMES = register("biomes", STRUCTURE_REFERENCES, WORLDGEN_HEIGHTMAPS, ChunkType.PROTOCHUNK);
|
|
public static final ChunkStatus NOISE = register("noise", BIOMES, WORLDGEN_HEIGHTMAPS, ChunkType.PROTOCHUNK);
|
|
public static final ChunkStatus SURFACE = register("surface", NOISE, WORLDGEN_HEIGHTMAPS, ChunkType.PROTOCHUNK);
|
|
public static final ChunkStatus CARVERS = register("carvers", SURFACE, FINAL_HEIGHTMAPS, ChunkType.PROTOCHUNK);
|
|
public static final ChunkStatus FEATURES = register("features", CARVERS, FINAL_HEIGHTMAPS, ChunkType.PROTOCHUNK);
|
|
public static final ChunkStatus INITIALIZE_LIGHT = register("initialize_light", FEATURES, FINAL_HEIGHTMAPS, ChunkType.PROTOCHUNK);
|
|
public static final ChunkStatus LIGHT = register("light", INITIALIZE_LIGHT, FINAL_HEIGHTMAPS, ChunkType.PROTOCHUNK);
|
|
public static final ChunkStatus SPAWN = register("spawn", LIGHT, FINAL_HEIGHTMAPS, ChunkType.PROTOCHUNK);
|
|
public static final ChunkStatus FULL = register("full", SPAWN, FINAL_HEIGHTMAPS, ChunkType.LEVELCHUNK);
|
|
public static final Codec<ChunkStatus> CODEC = BuiltInRegistries.CHUNK_STATUS.byNameCodec();
|
|
private final int index;
|
|
private final ChunkStatus parent;
|
|
private final ChunkType chunkType;
|
|
private final EnumSet<Heightmap.Types> heightmapsAfter;
|
|
|
|
private static ChunkStatus register(String name, @Nullable ChunkStatus parent, EnumSet<Heightmap.Types> heightmapsAfter, ChunkType chunkType) {
|
|
return Registry.register(BuiltInRegistries.CHUNK_STATUS, name, new ChunkStatus(parent, heightmapsAfter, chunkType));
|
|
}
|
|
|
|
public static List<ChunkStatus> getStatusList() {
|
|
List<ChunkStatus> list = Lists.<ChunkStatus>newArrayList();
|
|
|
|
ChunkStatus chunkStatus;
|
|
for (chunkStatus = FULL; chunkStatus.getParent() != chunkStatus; chunkStatus = chunkStatus.getParent()) {
|
|
list.add(chunkStatus);
|
|
}
|
|
|
|
list.add(chunkStatus);
|
|
Collections.reverse(list);
|
|
return list;
|
|
}
|
|
|
|
@VisibleForTesting
|
|
protected ChunkStatus(@Nullable ChunkStatus parent, EnumSet<Heightmap.Types> heightmapsAfter, ChunkType chunkType) {
|
|
this.parent = parent == null ? this : parent;
|
|
this.chunkType = chunkType;
|
|
this.heightmapsAfter = heightmapsAfter;
|
|
this.index = parent == null ? 0 : parent.getIndex() + 1;
|
|
}
|
|
|
|
public int getIndex() {
|
|
return this.index;
|
|
}
|
|
|
|
public ChunkStatus getParent() {
|
|
return this.parent;
|
|
}
|
|
|
|
public ChunkType getChunkType() {
|
|
return this.chunkType;
|
|
}
|
|
|
|
public static ChunkStatus byName(String name) {
|
|
return BuiltInRegistries.CHUNK_STATUS.getValue(ResourceLocation.tryParse(name));
|
|
}
|
|
|
|
public EnumSet<Heightmap.Types> heightmapsAfter() {
|
|
return this.heightmapsAfter;
|
|
}
|
|
|
|
public boolean isOrAfter(ChunkStatus chunkStatus) {
|
|
return this.getIndex() >= chunkStatus.getIndex();
|
|
}
|
|
|
|
public boolean isAfter(ChunkStatus chunkStatus) {
|
|
return this.getIndex() > chunkStatus.getIndex();
|
|
}
|
|
|
|
public boolean isOrBefore(ChunkStatus chunkStatus) {
|
|
return this.getIndex() <= chunkStatus.getIndex();
|
|
}
|
|
|
|
public boolean isBefore(ChunkStatus chunkStatus) {
|
|
return this.getIndex() < chunkStatus.getIndex();
|
|
}
|
|
|
|
public static ChunkStatus max(ChunkStatus first, ChunkStatus second) {
|
|
return first.isAfter(second) ? first : second;
|
|
}
|
|
|
|
public String toString() {
|
|
return this.getName();
|
|
}
|
|
|
|
public String getName() {
|
|
return BuiltInRegistries.CHUNK_STATUS.getKey(this).toString();
|
|
}
|
|
}
|