diff --git a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/sounds.json b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/sounds.json index a667a01cd..4cd5c6628 100644 --- a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/sounds.json +++ b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/sounds.json @@ -171,5 +171,51 @@ "stream": true } ] + }, + "music.bta.nether": { + "sounds": [ + { + "name": "btamusic/nether/nether1.ogg", + "title": "Venus", + "author": "FullDisplayCollapse", + "stream": true + }, + { + "name": "btamusic/underground/nether2.ogg", + "title": "Death Coils", + "author": "FullDisplayCollapse", + "stream": true + }, + { + "name": "btamusic/underground/nether3.ogg", + "title": "Reactor", + "author": "FullDisplayCollapse", + "stream": true + }, + { + "name": "btamusic/underground/nether4.ogg", + "title": "Outlands", + "author": "FullDisplayCollapse", + "stream": true + }, + { + "name": "btamusic/underground/nether5.ogg", + "title": "Nematocyst", + "author": "FullDisplayCollapse", + "stream": true + }, + { + "name": "btamusic/underground/nether6.ogg", + "title": "Alkali Feldspar", + "author": "FullDisplayCollapse", + "stream": true + }, + { + "name": "btamusic/underground/nether7.ogg", + "title": "Slip", + "author": "FullDisplayCollapse", + "stream": true + } + ] } } diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenSelectWorld.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenSelectWorld.java index aa7f5f622..bc9808c70 100644 --- a/game/client/src/main/java/net/minecraft/client/gui/ScreenSelectWorld.java +++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenSelectWorld.java @@ -129,9 +129,13 @@ public class ScreenSelectWorld extends Screen { this.buttons.add(this.buttonFolder = new ListenerButtonElement(8, this.width / 2 - 154, this.height - 28, 20, 20, "") .setTextures("minecraft:gui/misc/button_folder", "minecraft:gui/misc/button_folder_highlighted", "minecraft:gui/misc/button_folder_disabled") .setListener(buttonElement -> { - if (selectedWorld < 0) return; + File savesDir = new File(mc.getMinecraftDir(), "saves"); + if (this.selectedWorld < 0 || this.selectedWorld >= this.saveList.size()) { + FileOpener.open(savesDir); + return; + } SaveFile save = this.saveList.get(this.selectedWorld); - FileOpener.open(new File(mc.getMinecraftDir(), "saves/" + save.getFileName())); + FileOpener.open(new File(savesDir, save.getFileName())); })); this.buttons.add(this.buttonRename = new ButtonElement(6, this.width / 2 - 126, this.height - 28, 57, 20, i18n.translateKey("gui.select_world.button.rename"))); this.buttons.add(this.buttonDelete = new ButtonElement(2, this.width / 2 - 61, this.height - 28, 57, 20, i18n.translateKey("gui.select_world.button.delete"))); @@ -140,7 +144,6 @@ public class ScreenSelectWorld extends Screen { this.buttonSelect.enabled = false; this.buttonRename.enabled = false; this.buttonDelete.enabled = false; - this.buttonFolder.enabled = false; } public void deletePresetWorld(String name) { @@ -280,7 +283,6 @@ public class ScreenSelectWorld extends Screen { ScreenSelectWorld.this.buttonSelect.enabled = flag1 && !corrupted; ScreenSelectWorld.this.buttonRename.enabled = flag1 && !corrupted; ScreenSelectWorld.this.buttonDelete.enabled = flag1; - ScreenSelectWorld.this.buttonFolder.enabled = flag1; if (doubleClicked && flag1) { selectWorld(itemIndex); } diff --git a/game/client/src/main/java/net/minecraft/client/render/worldtype/WorldTypeFXDispatcher.java b/game/client/src/main/java/net/minecraft/client/render/worldtype/WorldTypeFXDispatcher.java index 4ce89e1cf..76a1747a9 100644 --- a/game/client/src/main/java/net/minecraft/client/render/worldtype/WorldTypeFXDispatcher.java +++ b/game/client/src/main/java/net/minecraft/client/render/worldtype/WorldTypeFXDispatcher.java @@ -62,6 +62,9 @@ public class WorldTypeFXDispatcher extends Dispatcher { addDispatch(new WorldTypeFXNether(WorldTypes.NETHER_SKYBLOCK) .setHasClouds(false) .setHasSky(false)); + addDispatch(new WorldTypeFXNether(WorldTypes.NETHER_BETA_173) + .setHasClouds(false) + .setHasSky(false)); addDispatch(new WorldTypeFXDrift(WorldTypes.DRIFT_DEFAULT) .setCloudHeight(8f) diff --git a/game/client/src/main/java/net/minecraft/client/sound/MusicCategory.java b/game/client/src/main/java/net/minecraft/client/sound/MusicCategory.java index 1f47092b9..89b651341 100644 --- a/game/client/src/main/java/net/minecraft/client/sound/MusicCategory.java +++ b/game/client/src/main/java/net/minecraft/client/sound/MusicCategory.java @@ -5,7 +5,8 @@ import org.jetbrains.annotations.NotNull; public enum MusicCategory { OVERWORLD("overworld"), - UNDERGROUND("underground"); + UNDERGROUND("underground"), + NETHER("nether"); public final String namespace; diff --git a/game/client/src/main/java/net/minecraft/client/sound/MusicCategoryManager.java b/game/client/src/main/java/net/minecraft/client/sound/MusicCategoryManager.java index 3ff45d21d..e93e77fb3 100644 --- a/game/client/src/main/java/net/minecraft/client/sound/MusicCategoryManager.java +++ b/game/client/src/main/java/net/minecraft/client/sound/MusicCategoryManager.java @@ -2,8 +2,10 @@ package net.minecraft.client.sound; import net.minecraft.client.Minecraft; import net.minecraft.core.entity.player.Player; +import net.minecraft.core.world.Dimension; import net.minecraft.core.world.World; import net.minecraft.core.world.pos.TilePos; +import net.minecraft.core.world.type.tag.WorldTypeTags; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -17,6 +19,7 @@ public class MusicCategoryManager { static { register(MusicCategory.OVERWORLD, (World::canBlockSeeSky)); register(MusicCategory.UNDERGROUND, (world, pos) -> (!world.canBlockSeeSky(pos)) && pos.y <= world.getWorldType().getOceanY()); + register(MusicCategory.NETHER, (world, pos) -> world.getWorldType().hasTag(WorldTypeTags.NETHER)); } public static void register(MusicCategory category, MusicCondition condition){ diff --git a/game/core/src/main/java/net/minecraft/core/entity/animal/MobDeer.java b/game/core/src/main/java/net/minecraft/core/entity/animal/MobDeer.java index 5ef59ea37..70a1f492a 100644 --- a/game/core/src/main/java/net/minecraft/core/entity/animal/MobDeer.java +++ b/game/core/src/main/java/net/minecraft/core/entity/animal/MobDeer.java @@ -148,17 +148,17 @@ public class MobDeer //Todo: change with new sounds @Override public String getLivingSound() { - return "mob.cow"; + return ""; } @Override protected String getHurtSound() { - return "mob.cowhurt"; + return ""; } @Override protected String getDeathSound() { - return "mob.cowhurt"; + return ""; } @Override diff --git a/game/core/src/main/java/net/minecraft/core/world/biome/Biomes.java b/game/core/src/main/java/net/minecraft/core/world/biome/Biomes.java index 3389965b3..41bf3fa58 100644 --- a/game/core/src/main/java/net/minecraft/core/world/biome/Biomes.java +++ b/game/core/src/main/java/net/minecraft/core/world/biome/Biomes.java @@ -298,7 +298,18 @@ public class Biomes { ) ); - + public static final @NotNull Biome NETHER_LEGACY_HELL = register( + "minecraft:nether.legacy.hell", + new BiomeNether("nether.legacy.hell") + .withDebugColor(0x77_37_2A) + .withBlockedWeathers(Weathers.OVERWORLD_RAIN, Weathers.OVERWORLD_SNOW, Weathers.OVERWORLD_STORM, Weathers.OVERWORLD_FOG) + .withSurfaceProperties( + new SurfaceProperties.Builder() + .withTopBlock(Blocks.COBBLE_NETHERRACK) + .withFillerBlock(Blocks.COBBLE_NETHERRACK) + .build() + ) + ); public static final @NotNull Biome DRIFT_DRIFT = register( "minecraft:drift.drift", diff --git a/game/core/src/main/java/net/minecraft/core/world/biome/provider/BiomeProviderNetherB173.java b/game/core/src/main/java/net/minecraft/core/world/biome/provider/BiomeProviderNetherB173.java new file mode 100644 index 000000000..e1f8aaeea --- /dev/null +++ b/game/core/src/main/java/net/minecraft/core/world/biome/provider/BiomeProviderNetherB173.java @@ -0,0 +1,79 @@ +package net.minecraft.core.world.biome.provider; + +import net.minecraft.core.world.World; +import net.minecraft.core.world.biome.Biome; +import net.minecraft.core.world.biome.Biomes; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; + +public final class BiomeProviderNetherB173 extends BiomeProvider { + public BiomeProviderNetherB173(final @NotNull World world) { + super(world); + } + + @Override + public Biome[] getBiomes(Biome[] biomes, double[] temperatures, double[] humidities, double[] varieties, int x, int y, int z, int xSize, int ySize, int zSize) { + if (biomes == null || biomes.length < xSize * ySize * zSize) { + biomes = new Biome[xSize * ySize * zSize]; + } + Arrays.fill(biomes, 0, xSize * ySize * zSize, Biomes.NETHER_LEGACY_HELL); + + if (temperatures != null) { + Arrays.fill(temperatures, 0, Math.min(temperatures.length, xSize * zSize), 1.0); + } + if (humidities != null) { + Arrays.fill(humidities, 0, Math.min(humidities.length, xSize * zSize), 0.0); + } + if (varieties != null) { + Arrays.fill(varieties, 0, Math.min(varieties.length, xSize * zSize), 0.0); + } + + return biomes; + } + + @Override + public double[] getTemperatures(double[] temperatures, int x, int z, int xSize, int zSize) { + if (temperatures == null || temperatures.length < xSize * zSize) { + temperatures = new double[xSize * zSize]; + } + Arrays.fill(temperatures, 0, xSize * zSize, 1.0); + return temperatures; + } + + @Override + public double[] getHumidities(double[] humidities, int x, int z, int xSize, int zSize) { + if (humidities == null || humidities.length < xSize * zSize) { + humidities = new double[xSize * zSize]; + } + Arrays.fill(humidities, 0, xSize * zSize, 0.0); + return humidities; + } + + @Override + public double[] getVarieties(double[] varieties, int x, int z, int xSize, int zSize) { + if (varieties == null || varieties.length < xSize * zSize) { + varieties = new double[xSize * zSize]; + } + Arrays.fill(varieties, 0, xSize * zSize, 0.0); + return varieties; + } + + @Override + public double[] getBiomenesses(double[] biomenesses, int x, int y, int z, int xSize, int ySize, int zSize) { + if (biomenesses == null || biomenesses.length < xSize * ySize * zSize) { + biomenesses = new double[xSize * ySize * zSize]; + } + Arrays.fill(biomenesses, 0, xSize * ySize * zSize, 1.0); + return biomenesses; + } + + @Override + public Biome lookupBiome(double temperature, double humidity, double altitude, double variety) { + return Biomes.NETHER_LEGACY_HELL; + } + + public static Biome[] allBiomes() { + return new Biome[] { Biomes.NETHER_LEGACY_HELL }; + } +} diff --git a/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/DensityGeneratorNether.java b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/DensityGeneratorNether.java index 095d6727c..d5399599f 100644 --- a/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/DensityGeneratorNether.java +++ b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/DensityGeneratorNether.java @@ -9,18 +9,25 @@ import org.jetbrains.annotations.NotNull; public class DensityGeneratorNether implements DensityGenerator { - private final @NotNull World world; + protected final @NotNull World world; private final @NotNull Noise3D minLimitNoise; private final @NotNull Noise3D maxLimitNoise; private final @NotNull Noise3D mainNoise; public DensityGeneratorNether(@NotNull World world) { - this.world = world; + this(world, + new FractalNoise3D<>(ImprovedPerlinNoise.genOctaves(world.getRandomSeed(), 16, 0)), + new FractalNoise3D<>(ImprovedPerlinNoise.genOctaves(world.getRandomSeed(), 16, 16)), + new FractalNoise3D<>(ImprovedPerlinNoise.genOctaves(world.getRandomSeed(), 8, 32)) + ); + } - this.minLimitNoise = new FractalNoise3D<>(ImprovedPerlinNoise.genOctaves(world.getRandomSeed(), 16, 0)); - this.maxLimitNoise = new FractalNoise3D<>(ImprovedPerlinNoise.genOctaves(world.getRandomSeed(), 16, 16)); - this.mainNoise = new FractalNoise3D<>(ImprovedPerlinNoise.genOctaves(world.getRandomSeed(), 8, 32)); + protected DensityGeneratorNether(@NotNull World world, @NotNull Noise3D minLimitNoise, @NotNull Noise3D maxLimitNoise, @NotNull Noise3D mainNoise) { + this.world = world; + this.minLimitNoise = minLimitNoise; + this.maxLimitNoise = maxLimitNoise; + this.mainNoise = mainNoise; } @Override @@ -42,7 +49,7 @@ public class DensityGeneratorNether // Allocate a fresh array locally for thread safety double[] densityMapArray = new double[outerSize]; - double[] biomeDensityMap = this.generateDensityMap(xSize, threeQuarterYSize, zSize, x, y, z); + double[] biomeDensityMap = this.computeDensityRegion(xSize, threeQuarterYSize, zSize, x, y, z); for (int dx = 0; dx < xSize; dx++) { for (int dz = 0; dz < zSize; dz++) { @@ -56,7 +63,7 @@ public class DensityGeneratorNether return densityMapArray; } - private double @NotNull[] generateDensityMap(int xSize, int ySize, int zSize, int x, int y, int z) { + protected double @NotNull[] computeDensityRegion(int xSize, int ySize, int zSize, int x, int y, int z) { final int innerSize = xSize * ySize * zSize; double[] densityMapArray = new double[innerSize]; diff --git a/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/ChunkDecoratorNetherB173.java b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/ChunkDecoratorNetherB173.java new file mode 100644 index 000000000..b4b0c81ab --- /dev/null +++ b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/ChunkDecoratorNetherB173.java @@ -0,0 +1,101 @@ +package net.minecraft.core.world.generate.chunk.perlin.nether.b173; + +import com.mojang.logging.LogUtils; +import net.minecraft.core.block.BlockLogicFallingBlock; +import net.minecraft.core.block.Blocks; +import net.minecraft.core.world.World; +import net.minecraft.core.world.chunk.Chunk; +import net.minecraft.core.world.generate.chunk.ChunkDecorator; +import net.minecraft.core.world.generate.feature.WorldFeatureFlowers; +import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; + +import java.util.Random; + +public class ChunkDecoratorNetherB173 implements ChunkDecorator { + private static final @NotNull Logger LOGGER = LogUtils.getLogger(); + + private final @NotNull World world; + + public ChunkDecoratorNetherB173(final @NotNull World world) { + this.world = world; + } + + @Override + public void decorate(final @NotNull Chunk chunk) { + this.world.scheduledUpdatesAreImmediate = true; + BlockLogicFallingBlock.fallInstantly = true; + + final int x = chunk.pos.x; + final int z = chunk.pos.z; + + try { + final int wx = x * 16; + final int wz = z * 16; + + final @NotNull Random rand = new Random(this.world.getRandomSeed()); + final long rx = rand.nextLong() / 2L * 2L + 1L; + final long rz = rand.nextLong() / 2L * 2L + 1L; + rand.setSeed(rx * x + rz * z ^ this.world.getRandomSeed()); + + // Lava springs + try { + for (int i = 0; i < 8; i++) { + final int fx = wx + rand.nextInt(16) + 8; + final int fy = rand.nextInt(120) + 4; + final int fz = wz + rand.nextInt(16) + 8; + new WorldFeatureNetherLavaSpringB173(Blocks.FLUID_LAVA_FLOWING).place(this.world, rand, fx, fy, fz); + } + } catch (final Throwable t) { LOGGER.error("Nether decoration step 'lava_springs' failed at chunk ({}, {}); continuing.", x, z, t); } + + // Fire + try { + final int numFire = rand.nextInt(rand.nextInt(10) + 1) + 1; + for (int i = 0; i < numFire; i++) { + final int fx = wx + rand.nextInt(16) + 8; + final int fy = rand.nextInt(120) + 4; + final int fz = wz + rand.nextInt(16) + 8; + new WorldFeatureFireB173().place(this.world, rand, fx, fy, fz); + } + } catch (final Throwable t) { LOGGER.error("Nether decoration step 'fire' failed at chunk ({}, {}); continuing.", x, z, t); } + + // Glowstone pass 1 + try { + final int numGlowstone = rand.nextInt(rand.nextInt(10) + 1); + for (int i = 0; i < numGlowstone; i++) { + final int fx = wx + rand.nextInt(16) + 8; + final int fy = rand.nextInt(120) + 4; + final int fz = wz + rand.nextInt(16) + 8; + new WorldFeatureGlowstoneB173().place(this.world, rand, fx, fy, fz); + } + } catch (final Throwable t) { LOGGER.error("Nether decoration step 'glowstone_1' failed at chunk ({}, {}); continuing.", x, z, t); } + + // Glowstone pass 2 + try { + for (int i = 0; i < 10; i++) { + final int fx = wx + rand.nextInt(16) + 8; + final int fy = rand.nextInt(128); + final int fz = wz + rand.nextInt(16) + 8; + new WorldFeatureGlowstoneB173().place(this.world, rand, fx, fy, fz); + } + } catch (final Throwable t) { LOGGER.error("Nether decoration step 'glowstone_2' failed at chunk ({}, {}); continuing.", x, z, t); } + + // Mushrooms + try { + int fx = wx + rand.nextInt(16) + 8; + int fy = rand.nextInt(128); + int fz = wz + rand.nextInt(16) + 8; + new WorldFeatureFlowers(Blocks.MUSHROOM_BROWN.id(), 64, false).place(this.world, rand, fx, fy, fz); + + fx = wx + rand.nextInt(16) + 8; + fy = rand.nextInt(128); + fz = wz + rand.nextInt(16) + 8; + new WorldFeatureFlowers(Blocks.MUSHROOM_RED.id(), 64, false).place(this.world, rand, fx, fy, fz); + } catch (final Throwable t) { LOGGER.error("Nether decoration step 'mushrooms' failed at chunk ({}, {}); continuing.", x, z, t); } + + } finally { + BlockLogicFallingBlock.fallInstantly = false; + this.world.scheduledUpdatesAreImmediate = false; + } + } +} diff --git a/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/ChunkGeneratorNetherB173.java b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/ChunkGeneratorNetherB173.java new file mode 100644 index 000000000..bf35ab95d --- /dev/null +++ b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/ChunkGeneratorNetherB173.java @@ -0,0 +1,20 @@ +package net.minecraft.core.world.generate.chunk.perlin.nether.b173; + +import net.minecraft.core.world.World; +import net.minecraft.core.world.generate.LargeFeature; +import net.minecraft.core.world.generate.chunk.perlin.ChunkGeneratorPerlin; +import org.jetbrains.annotations.NotNull; + +public class ChunkGeneratorNetherB173 extends ChunkGeneratorPerlin { + public ChunkGeneratorNetherB173(@NotNull World world) { + super( + world, + new ChunkDecoratorNetherB173(world), + new TerrainGeneratorNetherB173(world), + new SurfaceGeneratorNetherB173(world), + new LargeFeature[]{ + new NetherCavesLargeFeatureB173(world.getWorldType().getMinY(world), world.getWorldType().getMaxY(world) + 1) + } + ); + } +} diff --git a/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/DensityGeneratorNetherB173.java b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/DensityGeneratorNetherB173.java new file mode 100644 index 000000000..bbb13f611 --- /dev/null +++ b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/DensityGeneratorNetherB173.java @@ -0,0 +1,31 @@ +package net.minecraft.core.world.generate.chunk.perlin.nether.b173; + +import net.minecraft.core.world.World; +import net.minecraft.core.world.chunk.Chunk; +import net.minecraft.core.world.generate.chunk.perlin.nether.DensityGeneratorNether; +import net.minecraft.core.world.noise.FractalNoise3D; +import net.minecraft.core.world.noise.ImprovedPerlinNoise; +import net.minecraft.core.world.type.WorldType; +import org.jetbrains.annotations.NotNull; + +public class DensityGeneratorNetherB173 extends DensityGeneratorNether { + public DensityGeneratorNetherB173(@NotNull World world) { + super(world, + new FractalNoise3D<>(ImprovedPerlinNoise.genOctaves(world.getRandomSeed(), 16, 0, ImprovedPerlinNoise.LegacyNoiseType.BETA)), + new FractalNoise3D<>(ImprovedPerlinNoise.genOctaves(world.getRandomSeed(), 16, 16, ImprovedPerlinNoise.LegacyNoiseType.BETA)), + new FractalNoise3D<>(ImprovedPerlinNoise.genOctaves(world.getRandomSeed(), 8, 32, ImprovedPerlinNoise.LegacyNoiseType.BETA)) + ); + } + + @Override + public double @NotNull [] generateDensityMap(@NotNull Chunk chunk) { + WorldType worldType = this.world.getWorldType(); + + int terrainHeight = (worldType.getMaxY(world) + 1) - worldType.getMinY(world); + int xSize = 4 + 1; + int ySize = (terrainHeight / 8) + 1; + int zSize = 4 + 1; + + return this.computeDensityRegion(xSize, ySize, zSize, chunk.pos.x * 4, 0, chunk.pos.z * 4); + } +} diff --git a/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/NetherCavesLargeFeatureB173.java b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/NetherCavesLargeFeatureB173.java new file mode 100644 index 000000000..907f20b6e --- /dev/null +++ b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/NetherCavesLargeFeatureB173.java @@ -0,0 +1,49 @@ +package net.minecraft.core.world.generate.chunk.perlin.nether.b173; + +import net.minecraft.core.util.helper.MathHelper; +import net.minecraft.core.world.World; +import net.minecraft.core.world.chunk.Chunk; +import net.minecraft.core.world.generate.RetroCavesLargeFeature; +import net.minecraft.core.world.generate.chunk.ChunkGeneratorResult; +import org.jetbrains.annotations.NotNull; + +import java.util.Random; + +public class NetherCavesLargeFeatureB173 extends RetroCavesLargeFeature { + private final int caveMinY; + private final int caveMaxY; + + public NetherCavesLargeFeatureB173(int minY, int maxY) { + super(minY, maxY); + this.caveMinY = minY; + this.caveMaxY = maxY; + } + + @Override + protected void doGeneration(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, int baseChunkX, int baseChunkZ, @NotNull ChunkGeneratorResult result) { + int cavesToGenerate = random.nextInt(random.nextInt(random.nextInt(10) + 1) + 1); + if (random.nextInt(5) != 0) { + cavesToGenerate = 0; + } + + final int yRange = this.caveMaxY - this.caveMinY; + + for (int i = 0; i < cavesToGenerate; i++) { + double blockX = chunkX * Chunk.CHUNK_SIZE_X + random.nextInt(Chunk.CHUNK_SIZE_X); + double blockY = this.caveMinY + random.nextInt(yRange); + double blockZ = chunkZ * Chunk.CHUNK_SIZE_Z + random.nextInt(Chunk.CHUNK_SIZE_Z); + + int numBranches = 1; + if (random.nextInt(4) == 0) { + generateHubRoom(world, random, baseChunkX, baseChunkZ, result, blockX, blockY, blockZ); + numBranches += random.nextInt(4); + } + for (int l1 = 0; l1 < numBranches; l1++) { + float yRot = random.nextFloat() * MathHelper.PI * 2.0F; + float xRot = ((random.nextFloat() - 0.5F) * 2.0F) / 8F; + float radius = (random.nextFloat() * 2.0F + random.nextFloat()) * 2.0F; + generateCave(world, random, baseChunkX, baseChunkZ, result, blockX, blockY, blockZ, radius, yRot, xRot, 0, 0, 0.5D); + } + } + } +} diff --git a/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/SurfaceGeneratorNetherB173.java b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/SurfaceGeneratorNetherB173.java new file mode 100644 index 000000000..9ec4f1f87 --- /dev/null +++ b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/SurfaceGeneratorNetherB173.java @@ -0,0 +1,134 @@ +package net.minecraft.core.world.generate.chunk.perlin.nether.b173; + +import java.util.Random; + +import net.minecraft.core.block.Blocks; +import net.minecraft.core.world.World; +import net.minecraft.core.world.biome.Biome; +import net.minecraft.core.world.chunk.Chunk; +import net.minecraft.core.world.generate.chunk.ChunkGeneratorResult; +import net.minecraft.core.world.generate.chunk.perlin.SurfaceGenerator; +import net.minecraft.core.world.noise.FractalNoise3D; +import net.minecraft.core.world.noise.ImprovedPerlinNoise; +import net.minecraft.core.world.noise.Noise3D; +import net.minecraft.core.world.pos.ChunkTilePos; +import org.jetbrains.annotations.NotNull; + +public class SurfaceGeneratorNetherB173 implements SurfaceGenerator { + private final World world; + + private final Noise3D sandNoise; + private final Noise3D heightNoise; + + public SurfaceGeneratorNetherB173(final @NotNull World world) { + this.world = world; + this.sandNoise = new FractalNoise3D<>(ImprovedPerlinNoise.genOctaves(world.getRandomSeed(), 4, 40, ImprovedPerlinNoise.LegacyNoiseType.BETA)); + this.heightNoise = new FractalNoise3D<>(ImprovedPerlinNoise.genOctaves(world.getRandomSeed(), 4, 44, ImprovedPerlinNoise.LegacyNoiseType.BETA)); + } + + @Override + public void generateSurface(@NotNull Chunk chunk, @NotNull ChunkGeneratorResult result) { + int minY = world.getWorldType().getMinY(world); + int maxY = world.getWorldType().getMaxY(world); + int chunkX = chunk.pos.x; + int chunkZ = chunk.pos.z; + + // 173s replaceBlocksForBiome dresses the surface band at a fixed y level of 64, independent of the lava sea + // level, and drops lava into exposed dips below it. + int bandLevel = minY + 64; + + int worldFillBlock = world.getWorldType().getFillerBlockId(); + short lavaId = (short) world.getWorldType().getOceanBlockIds()[0]; + + short bedrockId = (short) Blocks.BEDROCK.id(); + short soulSandId = (short) Blocks.SOULSAND.id(); + short gravelId = (short) Blocks.GRAVEL.id(); + + Random rand = new Random((long) chunkX * 0x4F9939F508L + (long) chunkZ * 0x1EF1565BD5L); + + double beachScale = 0.03125; + + double[] soulSandField = sandNoise.getRegion(null, chunkX * Chunk.CHUNK_SIZE_X, chunkZ * Chunk.CHUNK_SIZE_Z, 0.0D, Chunk.CHUNK_SIZE_X, Chunk.CHUNK_SIZE_Z, 1, beachScale, beachScale, 1.0D); + double[] gravelField = sandNoise.getRegion(null, chunkX * Chunk.CHUNK_SIZE_X, 109.0134D, chunkZ * Chunk.CHUNK_SIZE_Z, Chunk.CHUNK_SIZE_X, 1, Chunk.CHUNK_SIZE_Z, beachScale, 1.0D, beachScale); + double[] thicknessField = heightNoise.getRegion(null, chunkX * Chunk.CHUNK_SIZE_X, chunkZ * Chunk.CHUNK_SIZE_Z, 0.0D, Chunk.CHUNK_SIZE_X, Chunk.CHUNK_SIZE_Z, 1, beachScale * 2D, beachScale * 2D, beachScale * 2D); + + ChunkTilePos biomeQueryPos = new ChunkTilePos(); + + for (int z = 0; z < Chunk.CHUNK_SIZE_Z; z++) { + for (int x = 0; x < Chunk.CHUNK_SIZE_X; x++) { + boolean generateSoulSand = soulSandField[z + (x * Chunk.CHUNK_SIZE_Z)] + rand.nextDouble() * 0.2D > 0.0D; + boolean generateGravel = gravelField[z + (x * Chunk.CHUNK_SIZE_Z)] + rand.nextDouble() * 0.2D > 0.0D; + int soilThickness = (int) (thicknessField[z + (x * Chunk.CHUNK_SIZE_Z)] / 3D + 3D + rand.nextDouble() * 0.25D); + + int currentLayerDepth = -1; + short topBlock = -1; + short fillerBlock = -1; + + Biome lastBiome = null; + + for (int y = maxY; y >= minY; y--) { + if (y >= maxY - rand.nextInt(5) || y <= minY + rand.nextInt(5)) { + result.setBlock(x, y, z, bedrockId); + continue; + } + + Biome biome = chunk.getBlockBiome(biomeQueryPos.set(x, y, z)); + if (biome == null) biome = world.getBiomeProvider().getBiome(chunkX * Chunk.CHUNK_SIZE_X + x, y >> 3, chunkZ * Chunk.CHUNK_SIZE_Z + z); + + int block = result.getBlock(x, y, z); + + if ((biome != lastBiome || topBlock == -1 || fillerBlock == -1) && block == 0) { + topBlock = (short) biome.getSurfaceProperties().getTopBlock().id(); + fillerBlock = (short) biome.getSurfaceProperties().getFillerBlock().id(); + } + lastBiome = biome; + + if (block == 0) { + currentLayerDepth = -1; + continue; + } + + if (block != worldFillBlock) { + continue; + } + + if (currentLayerDepth == -1) { + if (soilThickness <= 0) { + topBlock = 0; + fillerBlock = (short) worldFillBlock; + } else if (y >= bandLevel - 4 && y <= bandLevel + 1) { + topBlock = (short) biome.getSurfaceProperties().getTopBlock().id(); + fillerBlock = (short) biome.getSurfaceProperties().getFillerBlock().id(); + if (generateGravel) { + topBlock = gravelId; + fillerBlock = (short) worldFillBlock; + } + if (generateSoulSand) { + topBlock = soulSandId; + fillerBlock = soulSandId; + } + } + + if (y < bandLevel && topBlock == 0) { + topBlock = lavaId; + } + + currentLayerDepth = soilThickness; + + if (y >= bandLevel - 1) { + result.setBlock(x, y, z, topBlock); + } else { + result.setBlock(x, y, z, fillerBlock); + } + continue; + } + + if (currentLayerDepth > 0) { + currentLayerDepth--; + result.setBlock(x, y, z, fillerBlock); + } + } + } + } + } +} diff --git a/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/TerrainGeneratorNetherB173.java b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/TerrainGeneratorNetherB173.java new file mode 100644 index 000000000..8d6b0baa2 --- /dev/null +++ b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/TerrainGeneratorNetherB173.java @@ -0,0 +1,45 @@ +package net.minecraft.core.world.generate.chunk.perlin.nether.b173; + +import net.minecraft.core.block.Blocks; +import net.minecraft.core.world.World; +import net.minecraft.core.world.chunk.Chunk; +import net.minecraft.core.world.generate.chunk.perlin.DensityGenerator; +import net.minecraft.core.world.generate.chunk.perlin.TerrainGeneratorLerp; +import org.jetbrains.annotations.NotNull; + +public class TerrainGeneratorNetherB173 extends TerrainGeneratorLerp { + private final DensityGenerator densityGenerator; + + private final int lavaLevel; + + private final int airId; + private final int netherrackId; + private final int lavaId; + + public TerrainGeneratorNetherB173(@NotNull World world) { + super(world); + + this.densityGenerator = new DensityGeneratorNetherB173(world); + + this.lavaLevel = world.getWorldType().getMinY(world) + world.getWorldType().getOceanY(); + + this.airId = Blocks.AIR.id(); + this.netherrackId = Blocks.COBBLE_NETHERRACK.id(); + this.lavaId = Blocks.FLUID_LAVA_STILL.id(); + } + + @Override + protected int getBlockAt(@NotNull Chunk chunk, int x, int y, int z, double density) { + if (density > 0.0) { + return this.netherrackId; + } else if (y < this.lavaLevel) { + return this.lavaId; + } + return this.airId; + } + + @Override + public @NotNull DensityGenerator getDensityGenerator() { + return this.densityGenerator; + } +} diff --git a/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/WorldFeatureFireB173.java b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/WorldFeatureFireB173.java new file mode 100644 index 000000000..8d37d858a --- /dev/null +++ b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/WorldFeatureFireB173.java @@ -0,0 +1,26 @@ +package net.minecraft.core.world.generate.chunk.perlin.nether.b173; + +import net.minecraft.core.block.Blocks; +import net.minecraft.core.world.World; +import net.minecraft.core.world.pos.TilePos; +import org.jetbrains.annotations.NotNull; + +import java.util.Random; + +public class WorldFeatureFireB173 { + public boolean place(@NotNull World world, @NotNull Random random, int x, int y, int z) { + final TilePos pos = new TilePos(); + + for (int i = 0; i < 64; ++i) { + int rx = x + random.nextInt(8) - random.nextInt(8); + int ry = y + random.nextInt(4) - random.nextInt(4); + int rz = z + random.nextInt(8) - random.nextInt(8); + + if (world.isAirBlock(pos.set(rx, ry, rz)) && world.getBlockType(pos.set(rx, ry - 1, rz)) == Blocks.COBBLE_NETHERRACK) { + world.setBlockTypeRaw(pos.set(rx, ry, rz), Blocks.FIRE); + } + } + + return true; + } +} diff --git a/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/WorldFeatureGlowstoneB173.java b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/WorldFeatureGlowstoneB173.java new file mode 100644 index 000000000..93c35be18 --- /dev/null +++ b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/WorldFeatureGlowstoneB173.java @@ -0,0 +1,45 @@ +package net.minecraft.core.world.generate.chunk.perlin.nether.b173; + +import net.minecraft.core.block.Blocks; +import net.minecraft.core.world.World; +import net.minecraft.core.world.pos.TilePos; +import org.jetbrains.annotations.NotNull; + +import java.util.Random; + +public class WorldFeatureGlowstoneB173 { + public boolean place(@NotNull World world, @NotNull Random random, int x, int y, int z) { + final TilePos pos = new TilePos(); + + if (!world.isAirBlock(pos.set(x, y, z))) { + return false; + } + if (world.getBlockType(pos.set(x, y + 1, z)) != Blocks.COBBLE_NETHERRACK) { + return false; + } + + world.setBlockTypeNotify(pos.set(x, y, z), Blocks.GLOWSTONE); + + for (int i = 0; i < 1500; ++i) { + int rx = x + random.nextInt(8) - random.nextInt(8); + int ry = y - random.nextInt(12); + int rz = z + random.nextInt(8) - random.nextInt(8); + + if (world.isAirBlock(pos.set(rx, ry, rz))) { + int neighbours = 0; + if (world.getBlockType(pos.set(rx - 1, ry, rz)) == Blocks.GLOWSTONE) neighbours++; + if (world.getBlockType(pos.set(rx + 1, ry, rz)) == Blocks.GLOWSTONE) neighbours++; + if (world.getBlockType(pos.set(rx, ry - 1, rz)) == Blocks.GLOWSTONE) neighbours++; + if (world.getBlockType(pos.set(rx, ry + 1, rz)) == Blocks.GLOWSTONE) neighbours++; + if (world.getBlockType(pos.set(rx, ry, rz - 1)) == Blocks.GLOWSTONE) neighbours++; + if (world.getBlockType(pos.set(rx, ry, rz + 1)) == Blocks.GLOWSTONE) neighbours++; + + if (neighbours == 1) { + world.setBlockTypeNotify(pos.set(rx, ry, rz), Blocks.GLOWSTONE); + } + } + } + + return true; + } +} diff --git a/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/WorldFeatureNetherLavaSpringB173.java b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/WorldFeatureNetherLavaSpringB173.java new file mode 100644 index 000000000..e73c72a86 --- /dev/null +++ b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/nether/b173/WorldFeatureNetherLavaSpringB173.java @@ -0,0 +1,50 @@ +package net.minecraft.core.world.generate.chunk.perlin.nether.b173; + +import net.minecraft.core.block.Block; +import net.minecraft.core.block.Blocks; +import net.minecraft.core.world.World; +import net.minecraft.core.world.pos.TilePos; +import org.jetbrains.annotations.NotNull; + +import java.util.Random; + +public class WorldFeatureNetherLavaSpringB173 { + private static final int[][] NEIGHBOURS = {{-1, 0, 0}, {1, 0, 0}, {0, 0, -1}, {0, 0, 1}, {0, -1, 0}}; + + private final @NotNull Block block; + + public WorldFeatureNetherLavaSpringB173(@NotNull Block block) { + this.block = block; + } + + public boolean place(@NotNull World world, @NotNull Random random, int x, int y, int z) { + final TilePos pos = new TilePos(); + + if (world.getBlockType(pos.set(x, y + 1, z)) != Blocks.COBBLE_NETHERRACK) { + return false; + } + if (!world.isAirBlock(pos.set(x, y, z)) && world.getBlockType(pos) != Blocks.COBBLE_NETHERRACK) { + return false; + } + + int solid = 0; + int air = 0; + for (int[] offset : NEIGHBOURS) { + pos.set(x + offset[0], y + offset[1], z + offset[2]); + if (world.getBlockType(pos) == Blocks.COBBLE_NETHERRACK) { + solid++; + } + if (world.isAirBlock(pos)) { + air++; + } + } + + if (solid == 4 && air == 1) { + pos.set(x, y, z); + world.setBlockTypeNotify(pos, this.block); + this.block.updateTick(world, pos, random, false); + } + + return true; + } +} diff --git a/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/SurfaceGeneratorOverworld.java b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/SurfaceGeneratorOverworld.java index 97317851a..9f6523e93 100644 --- a/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/SurfaceGeneratorOverworld.java +++ b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/SurfaceGeneratorOverworld.java @@ -257,16 +257,35 @@ public class SurfaceGeneratorOverworld // if reached end of filler layer, fill world with sandstone/permafrost if inside a glacier or desert biome if(currentLayerDepth == 0) { - if(biome == Biomes.OVERWORLD_DESERT && fillerBlock == Blocks.SAND.id()) { - currentLayerDepth = rand.nextInt(8) + 2; - fillerBlock = (short)Blocks.SANDSTONE.id(); - } else if(biome == Biomes.OVERWORLD_GLACIER && fillerBlock == Blocks.BLOCK_SNOW.id()){ - currentLayerDepth = rand.nextInt(8) + 14; - fillerBlock = (short)Blocks.PERMAFROST.id(); + SubSurfaceLayer subSurfaceLayer = getSubSurfaceLayer(biome, fillerBlock, y, minY, oceanY, rand); + if(subSurfaceLayer != null){ + currentLayerDepth = subSurfaceLayer.depth; + fillerBlock = subSurfaceLayer.block; } } } } } } + + protected SubSurfaceLayer getSubSurfaceLayer(Biome biome, short fillerBlock, int y, int minY, int oceanY, Random rand) + { + if(biome == Biomes.OVERWORLD_DESERT && fillerBlock == Blocks.SAND.id()) { + return new SubSurfaceLayer((short) Blocks.SANDSTONE.id(), rand.nextInt(8) + 2); + } else if(biome == Biomes.OVERWORLD_GLACIER && fillerBlock == Blocks.BLOCK_SNOW.id()) { + return new SubSurfaceLayer((short) Blocks.PERMAFROST.id(), rand.nextInt(8) + 14); + } + return null; + } + + protected static final class SubSurfaceLayer { + public final short block; + public final int depth; + + public SubSurfaceLayer(short block, int depth) + { + this.block = block; + this.depth = depth; + } + } } diff --git a/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/b173/SurfaceGeneratorOverworldB173.java b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/b173/SurfaceGeneratorOverworldB173.java index 975fe9c46..b1bffb37b 100644 --- a/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/b173/SurfaceGeneratorOverworldB173.java +++ b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/b173/SurfaceGeneratorOverworldB173.java @@ -1,12 +1,15 @@ package net.minecraft.core.world.generate.chunk.perlin.overworld.b173; +import net.minecraft.core.block.Blocks; import net.minecraft.core.world.World; +import net.minecraft.core.world.biome.Biome; import net.minecraft.core.world.generate.chunk.perlin.overworld.SurfaceGeneratorOverworld; -import net.minecraft.core.world.noise.FractalNoise2D; import net.minecraft.core.world.noise.FractalNoise3D; import net.minecraft.core.world.noise.ImprovedPerlinNoise; import org.jetbrains.annotations.NotNull; +import java.util.Random; + public class SurfaceGeneratorOverworldB173 extends SurfaceGeneratorOverworld { public SurfaceGeneratorOverworldB173(final @NotNull World world) { @@ -17,4 +20,12 @@ public class SurfaceGeneratorOverworldB173 false ); } + + @Override + protected SubSurfaceLayer getSubSurfaceLayer(Biome biome, short fillerBlock, int y, int minY, int oceanY, Random rand) { + if (fillerBlock == Blocks.SAND.id()) { + return new SubSurfaceLayer((short) Blocks.SANDSTONE.id(), rand.nextInt(4)); + } + return null; + } } diff --git a/game/core/src/main/java/net/minecraft/core/world/type/WorldTypeGroups.java b/game/core/src/main/java/net/minecraft/core/world/type/WorldTypeGroups.java index a5e9c23db..af4eccc29 100644 --- a/game/core/src/main/java/net/minecraft/core/world/type/WorldTypeGroups.java +++ b/game/core/src/main/java/net/minecraft/core/world/type/WorldTypeGroups.java @@ -45,6 +45,7 @@ public class WorldTypeGroups { ); GROUPS.add( new Group(WorldTypes.OVERWORLD_BETA_173) + .with(Dimension.NETHER, WorldTypes.NETHER_BETA_173) ); GROUPS.add( new Group(WorldTypes.OVERWORLD_CLASSIC) diff --git a/game/core/src/main/java/net/minecraft/core/world/type/WorldTypes.java b/game/core/src/main/java/net/minecraft/core/world/type/WorldTypes.java index 96ef6c972..c1e22eb6b 100644 --- a/game/core/src/main/java/net/minecraft/core/world/type/WorldTypes.java +++ b/game/core/src/main/java/net/minecraft/core/world/type/WorldTypes.java @@ -5,6 +5,7 @@ import net.minecraft.core.data.registry.Registries; import net.minecraft.core.world.config.season.SeasonConfig; import net.minecraft.core.world.season.Seasons; import net.minecraft.core.world.type.nether.WorldTypeNether; +import net.minecraft.core.world.type.nether.WorldTypeNetherB173; import net.minecraft.core.world.type.nether.WorldTypeNetherSkyblock; import net.minecraft.core.world.type.overworld.*; import net.minecraft.core.world.type.drift.WorldTypeDrift; @@ -38,6 +39,18 @@ public abstract class WorldTypes { .withTags(WorldTypeTags.NETHER, WorldTypeTags.HOT, WorldTypeTags.BREAKS_COMPASS, WorldTypeTags.BREAKS_TIMEPIECES) ) ); + public static final @NotNull WorldType NETHER_BETA_173 = register( + "minecraft:nether.beta_173", + new WorldTypeNetherB173( + WorldTypeNether.defaultProperties("worldType.nether.beta_173") + .bounds(0, 127, 32) + .oceanBlocks(Blocks.FLUID_LAVA_STILL) + .fillerBlock(Blocks.COBBLE_NETHERRACK) + .portalBounds(0, 127) + .withNoAurora() + .withTags(WorldTypeTags.NETHER, WorldTypeTags.HOT, WorldTypeTags.BREAKS_COMPASS, WorldTypeTags.BREAKS_TIMEPIECES) + ) + ); public static final @NotNull WorldType NETHER_SKYBLOCK = register( "minecraft:nether.skyblock", new WorldTypeNetherSkyblock( diff --git a/game/core/src/main/java/net/minecraft/core/world/type/nether/WorldTypeNetherB173.java b/game/core/src/main/java/net/minecraft/core/world/type/nether/WorldTypeNetherB173.java new file mode 100644 index 000000000..7eafce41f --- /dev/null +++ b/game/core/src/main/java/net/minecraft/core/world/type/nether/WorldTypeNetherB173.java @@ -0,0 +1,30 @@ +package net.minecraft.core.world.type.nether; + +import net.minecraft.core.world.World; +import net.minecraft.core.world.biome.Biome; +import net.minecraft.core.world.biome.provider.BiomeProvider; +import net.minecraft.core.world.biome.provider.BiomeProviderNetherB173; +import net.minecraft.core.world.generate.chunk.ChunkGenerator; +import net.minecraft.core.world.generate.chunk.perlin.nether.b173.ChunkGeneratorNetherB173; +import org.jetbrains.annotations.NotNull; + +public class WorldTypeNetherB173 extends WorldTypeNether { + public WorldTypeNetherB173(Properties properties) { + super(properties); + } + + @Override + public @NotNull BiomeProvider createBiomeProvider(World world) { + return new BiomeProviderNetherB173(world); + } + + @Override + public @NotNull Biome @NotNull [] allBiomes() { + return BiomeProviderNetherB173.allBiomes(); + } + + @Override + public ChunkGenerator createChunkGenerator(World world) { + return new ChunkGeneratorNetherB173(world); + } +} diff --git a/game/core/src/main/resources/assets/minecraft/lang/en_US/biomes.lang b/game/core/src/main/resources/assets/minecraft/lang/en_US/biomes.lang index 3d5aeee0a..e595ccb5c 100644 --- a/game/core/src/main/resources/assets/minecraft/lang/en_US/biomes.lang +++ b/game/core/src/main/resources/assets/minecraft/lang/en_US/biomes.lang @@ -37,4 +37,6 @@ biome.overworld.legacy.taiga=Beta Taiga biome.overworld.legacy.shrubland=Beta Shrubland biome.overworld.legacy.forest=Beta Forest biome.overworld.legacy.seasonal_forest=Beta Seasonal Forest -biome.overworld.legacy.rainforest=Beta Rainforest \ No newline at end of file +biome.overworld.legacy.rainforest=Beta Rainforest + +biome.nether.legacy.hell=Beta Hell \ No newline at end of file diff --git a/game/core/src/main/resources/assets/minecraft/lang/en_US/strings.lang b/game/core/src/main/resources/assets/minecraft/lang/en_US/strings.lang index 24a86e707..a02f97277 100644 --- a/game/core/src/main/resources/assets/minecraft/lang/en_US/strings.lang +++ b/game/core/src/main/resources/assets/minecraft/lang/en_US/strings.lang @@ -66,6 +66,8 @@ worldType.overworld.skyblock.name=Skyblock worldType.overworld.skyblock.desc=Hardcore survival on a tiny\nisland in the sky. worldType.overworld.beta_173.name=Beta 1.7.3 worldType.overworld.beta_173.desc=Terrain generation as similar as possible to\n Minecraft Beta 1.7.3. +worldType.nether.beta_173.name=Beta 1.7.3 +worldType.nether.beta_173.desc=Terrain generation as similar as possible to\n Minecraft Beta 1.7.3. disconnect.genericReason=%s disconnect.disconnected=Disconnected by Server diff --git a/game/core/src/main/resources/assets/minecraft/sounds/sounds.json b/game/core/src/main/resources/assets/minecraft/sounds/sounds.json index 0b9e1b8b5..8e9115c42 100644 --- a/game/core/src/main/resources/assets/minecraft/sounds/sounds.json +++ b/game/core/src/main/resources/assets/minecraft/sounds/sounds.json @@ -1281,5 +1281,51 @@ "stream": true } ] + }, + "music.bta.nether": { + "sounds": [ + { + "name": "btamusic/nether/nether1.ogg", + "title": "Venus", + "author": "FullDisplayCollapse", + "stream": true + }, + { + "name": "btamusic/nether/nether2.ogg", + "title": "Death Coils", + "author": "FullDisplayCollapse", + "stream": true + }, + { + "name": "btamusic/nether/nether3.ogg", + "title": "Reactor", + "author": "FullDisplayCollapse", + "stream": true + }, + { + "name": "btamusic/nether/nether4.ogg", + "title": "Outlands", + "author": "FullDisplayCollapse", + "stream": true + }, + { + "name": "btamusic/nether/nether5.ogg", + "title": "Nematocyst", + "author": "FullDisplayCollapse", + "stream": true + }, + { + "name": "btamusic/nether/nether6.ogg", + "title": "Alkali Feldspar", + "author": "FullDisplayCollapse", + "stream": true + }, + { + "name": "btamusic/nether/nether7.ogg", + "title": "Slip", + "author": "FullDisplayCollapse", + "stream": true + } + ] } } \ No newline at end of file