231 lines
12 KiB
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;
|
|
}
|
|
}
|