minecraft-source/src/net/minecraft/world/level/dimension/NormalDimension.java

231 lines
12 KiB
Java

package net.minecraft.world.level.dimension;
import net.minecraft.world.phys.Vec3;
import net.minecraft.util.Mth;
import net.minecraft.world.level.chunk.LevelChunk;
import net.minecraft.world.level.levelgen.Heightmap;
import net.minecraft.tags.BlockTags;
import javax.annotation.Nullable;
import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.block.state.BlockState;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import net.minecraft.world.level.biome.CheckerboardColumnBiomeSource;
import net.minecraft.world.level.biome.OverworldBiomeSource;
import net.minecraft.world.level.biome.FixedBiomeSource;
import net.minecraft.world.level.levelgen.OverworldLevelSource;
import net.minecraft.world.level.levelgen.TheEndLevelSource;
import net.minecraft.world.level.levelgen.NetherLevelSource;
import net.minecraft.world.level.levelgen.DebugLevelSource;
import net.minecraft.world.level.levelgen.DebugGeneratorSettings;
import net.minecraft.world.level.levelgen.FlatLevelSource;
import net.minecraft.world.level.levelgen.OverworldGeneratorSettings;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.levelgen.TheEndGeneratorSettings;
import net.minecraft.world.level.levelgen.NetherGeneratorSettings;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.biome.OverworldBiomeSourceSettings;
import net.minecraft.world.level.biome.CheckerboardBiomeSourceSettings;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.core.Registry;
import com.mojang.datafixers.types.JsonOps;
import com.google.gson.JsonElement;
import net.minecraft.world.level.biome.Biomes;
import net.minecraft.world.level.biome.BiomeSource;
import net.minecraft.world.level.biome.FixedBiomeSourceSettings;
import net.minecraft.world.level.levelgen.flat.FlatLevelGeneratorSettings;
import com.mojang.datafixers.types.DynamicOps;
import com.mojang.datafixers.Dynamic;
import net.minecraft.nbt.NbtOps;
import net.minecraft.world.level.LevelType;
import net.minecraft.world.level.biome.BiomeSourceType;
import net.minecraft.world.level.chunk.ChunkGeneratorType;
import net.minecraft.world.level.levelgen.ChunkGeneratorSettings;
import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.Level;
public class NormalDimension extends Dimension {
public NormalDimension(final Level bjt, final DimensionType cbf) {
super(bjt, cbf, 0.0f);
}
@Override
public DimensionType getType() {
return DimensionType.OVERWORLD;
}
@Override
public ChunkGenerator<? extends ChunkGeneratorSettings> createRandomLevelGenerator() {
final LevelType bka2 = this.level.getLevelData().getGeneratorType();
final ChunkGeneratorType<FlatLevelGeneratorSettings, FlatLevelSource> bzz3 = ChunkGeneratorType.FLAT;
final ChunkGeneratorType<DebugGeneratorSettings, DebugLevelSource> bzz4 = ChunkGeneratorType.DEBUG;
final ChunkGeneratorType<NetherGeneratorSettings, NetherLevelSource> bzz5 = ChunkGeneratorType.CAVES;
final ChunkGeneratorType<TheEndGeneratorSettings, TheEndLevelSource> bzz6 = ChunkGeneratorType.FLOATING_ISLANDS;
final ChunkGeneratorType<OverworldGeneratorSettings, OverworldLevelSource> bzz7 = ChunkGeneratorType.SURFACE;
final BiomeSourceType<FixedBiomeSourceSettings, FixedBiomeSource> bkv8 = BiomeSourceType.FIXED;
final BiomeSourceType<OverworldBiomeSourceSettings, OverworldBiomeSource> bkv9 = BiomeSourceType.VANILLA_LAYERED;
final BiomeSourceType<CheckerboardBiomeSourceSettings, CheckerboardColumnBiomeSource> bkv10 = BiomeSourceType.CHECKERBOARD;
if (bka2 == LevelType.FLAT) {
final FlatLevelGeneratorSettings civ11 = FlatLevelGeneratorSettings.fromObject(new Dynamic((DynamicOps)NbtOps.INSTANCE, this.level.getLevelData().getGeneratorOptions()));
final FixedBiomeSourceSettings bls12 = bkv8.createSettings(this.level.getLevelData()).setBiome(civ11.getBiome());
return bzz3.create(this.level, bkv8.create(bls12), civ11);
}
if (bka2 == LevelType.DEBUG_ALL_BLOCK_STATES) {
final FixedBiomeSourceSettings bls13 = bkv8.createSettings(this.level.getLevelData()).setBiome(Biomes.PLAINS);
return bzz4.create(this.level, bkv8.create(bls13), bzz4.createSettings());
}
if (bka2 == LevelType.BUFFET) {
BiomeSource bkt11 = null;
final JsonElement jsonElement12 = (JsonElement)Dynamic.convert((DynamicOps)NbtOps.INSTANCE, (DynamicOps)JsonOps.INSTANCE, this.level.getLevelData().getGeneratorOptions());
final JsonObject jsonObject13 = jsonElement12.getAsJsonObject();
final JsonObject jsonObject14 = jsonObject13.getAsJsonObject("biome_source");
if (jsonObject14 != null && jsonObject14.has("type") && jsonObject14.has("options")) {
final BiomeSourceType<?, ?> bkv11 = Registry.BIOME_SOURCE_TYPE.get(new ResourceLocation(jsonObject14.getAsJsonPrimitive("type").getAsString()));
final JsonObject jsonObject15 = jsonObject14.getAsJsonObject("options");
Biome[] arr17 = { Biomes.OCEAN };
if (jsonObject15.has("biomes")) {
final JsonArray jsonArray18 = jsonObject15.getAsJsonArray("biomes");
arr17 = ((jsonArray18.size() > 0) ? new Biome[jsonArray18.size()] : new Biome[] { Biomes.OCEAN });
for (int integer19 = 0; integer19 < jsonArray18.size(); ++integer19) {
arr17[integer19] = Registry.BIOME.getOptional(new ResourceLocation(jsonArray18.get(integer19).getAsString())).orElse(Biomes.OCEAN);
}
}
if (BiomeSourceType.FIXED == bkv11) {
final FixedBiomeSourceSettings bls14 = bkv8.createSettings(this.level.getLevelData()).setBiome(arr17[0]);
bkt11 = bkv8.create(bls14);
}
if (BiomeSourceType.CHECKERBOARD == bkv11) {
final int integer20 = jsonObject15.has("size") ? jsonObject15.getAsJsonPrimitive("size").getAsInt() : 2;
final CheckerboardBiomeSourceSettings bla19 = bkv10.createSettings(this.level.getLevelData()).setAllowedBiomes(arr17).setSize(integer20);
bkt11 = bkv10.create(bla19);
}
if (BiomeSourceType.VANILLA_LAYERED == bkv11) {
final OverworldBiomeSourceSettings bmw18 = bkv9.createSettings(this.level.getLevelData());
bkt11 = bkv9.create(bmw18);
}
}
if (bkt11 == null) {
bkt11 = bkv8.create(bkv8.createSettings(this.level.getLevelData()).setBiome(Biomes.OCEAN));
}
BlockState byg15 = Blocks.STONE.defaultBlockState();
BlockState byg16 = Blocks.WATER.defaultBlockState();
final JsonObject jsonObject16 = jsonObject13.getAsJsonObject("chunk_generator");
if (jsonObject16 != null && jsonObject16.has("options")) {
final JsonObject jsonObject17 = jsonObject16.getAsJsonObject("options");
if (jsonObject17.has("default_block")) {
final String string19 = jsonObject17.getAsJsonPrimitive("default_block").getAsString();
byg15 = Registry.BLOCK.get(new ResourceLocation(string19)).defaultBlockState();
}
if (jsonObject17.has("default_fluid")) {
final String string19 = jsonObject17.getAsJsonPrimitive("default_fluid").getAsString();
byg16 = Registry.BLOCK.get(new ResourceLocation(string19)).defaultBlockState();
}
}
if (jsonObject16 != null && jsonObject16.has("type")) {
final ChunkGeneratorType<?, ?> bzz8 = Registry.CHUNK_GENERATOR_TYPE.get(new ResourceLocation(jsonObject16.getAsJsonPrimitive("type").getAsString()));
if (ChunkGeneratorType.CAVES == bzz8) {
final NetherGeneratorSettings cbt19 = bzz5.createSettings();
cbt19.setDefaultBlock(byg15);
cbt19.setDefaultFluid(byg16);
return bzz5.create(this.level, bkt11, cbt19);
}
if (ChunkGeneratorType.FLOATING_ISLANDS == bzz8) {
final TheEndGeneratorSettings cca19 = bzz6.createSettings();
cca19.setSpawnPosition(new BlockPos(0, 64, 0));
cca19.setDefaultBlock(byg15);
cca19.setDefaultFluid(byg16);
return bzz6.create(this.level, bkt11, cca19);
}
}
final OverworldGeneratorSettings cbw18 = bzz7.createSettings();
cbw18.setDefaultBlock(byg15);
cbw18.setDefaultFluid(byg16);
return bzz7.create(this.level, bkt11, cbw18);
}
final OverworldGeneratorSettings cbw19 = bzz7.createSettings();
final OverworldBiomeSourceSettings bmw19 = bkv9.createSettings(this.level.getLevelData()).setGeneratorSettings(cbw19);
return bzz7.create(this.level, bkv9.create(bmw19), cbw19);
}
@Nullable
@Override
public BlockPos getSpawnPosInChunk(final ChunkPos bje, final boolean boolean2) {
for (int integer4 = bje.getMinBlockX(); integer4 <= bje.getMaxBlockX(); ++integer4) {
for (int integer5 = bje.getMinBlockZ(); integer5 <= bje.getMaxBlockZ(); ++integer5) {
final BlockPos fk6 = this.getValidSpawnPosition(integer4, integer5, boolean2);
if (fk6 != null) {
return fk6;
}
}
}
return null;
}
@Nullable
@Override
public BlockPos getValidSpawnPosition(final int integer1, final int integer2, final boolean boolean3) {
final BlockPos.MutableBlockPos a5 = new BlockPos.MutableBlockPos(integer1, 0, integer2);
final Biome bkq6 = this.level.getBiome(a5);
final BlockState byg7 = bkq6.getSurfaceBuilderConfig().getTopMaterial();
if (boolean3 && !byg7.getBlock().is(BlockTags.VALID_SPAWN)) {
return null;
}
final LevelChunk cai8 = this.level.getChunk(integer1 >> 4, integer2 >> 4);
final int integer3 = cai8.getHeight(Heightmap.Types.MOTION_BLOCKING, integer1 & 0xF, integer2 & 0xF);
if (integer3 < 0) {
return null;
}
if (cai8.getHeight(Heightmap.Types.WORLD_SURFACE, integer1 & 0xF, integer2 & 0xF) > cai8.getHeight(Heightmap.Types.OCEAN_FLOOR, integer1 & 0xF, integer2 & 0xF)) {
return null;
}
for (int integer4 = integer3 + 1; integer4 >= 0; --integer4) {
a5.set(integer1, integer4, integer2);
final BlockState byg8 = this.level.getBlockState(a5);
if (!byg8.getFluidState().isEmpty()) {
break;
}
if (byg8.equals(byg7)) {
return a5.above().immutable();
}
}
return null;
}
@Override
public float getTimeOfDay(final long long1, final float float2) {
final double double5 = Mth.frac(long1 / 24000.0 - 0.25);
final double double6 = 0.5 - Math.cos(double5 * 3.141592653589793) / 2.0;
return (float)(double5 * 2.0 + double6) / 3.0f;
}
@Override
public boolean isNaturalDimension() {
return true;
}
@Override
public Vec3 getFogColor(final float float1, final float float2) {
float float3 = Mth.cos(float1 * 6.2831855f) * 2.0f + 0.5f;
float3 = Mth.clamp(float3, 0.0f, 1.0f);
float float4 = 0.7529412f;
float float5 = 0.84705883f;
float float6 = 1.0f;
float4 *= float3 * 0.94f + 0.06f;
float5 *= float3 * 0.94f + 0.06f;
float6 *= float3 * 0.91f + 0.09f;
return new Vec3(float4, float5, float6);
}
@Override
public boolean mayRespawn() {
return true;
}
@Override
public boolean isFoggyAt(final int integer1, final int integer2) {
return false;
}
}