From 0dfcc950ca6910d3c6a0284de0bda96ba15305a7 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 26 Feb 2021 15:17:47 +0300 Subject: [PATCH] Dragon Graveyards prototype --- .../ru/betterend/blocks/MossyObsidian.java | 56 +++++++++++++++ .../java/ru/betterend/registry/EndBiomes.java | 2 + .../java/ru/betterend/registry/EndBlocks.java | 3 + .../ru/betterend/registry/EndFeatures.java | 6 ++ src/main/java/ru/betterend/util/MHelper.java | 11 ++- .../world/biome/DragonGraveyardsBiome.java | 24 +++++++ .../features/terrain/FallenPillarFeature.java | 56 +++++++++++++++ .../terrain/ObsidianBoulderFeature.java | 65 ++++++++++++++++++ .../ObsidianPillarBasementFeature.java | 64 +++++++++++++++++ .../features/terrain/RoundCaveFeature.java | 6 +- .../features/terrain/SurfaceVentFeature.java | 2 +- .../betterend/blockstates/mossy_obsidian.json | 10 +++ .../models/block/mossy_obsidian.json | 12 ++++ .../betterend/models/item/mossy_obsidian.json | 3 + .../textures/block/mossy_obsidian_side.png | Bin 0 -> 2183 bytes 15 files changed, 313 insertions(+), 7 deletions(-) create mode 100644 src/main/java/ru/betterend/blocks/MossyObsidian.java create mode 100644 src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java create mode 100644 src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java create mode 100644 src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java create mode 100644 src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java create mode 100644 src/main/resources/assets/betterend/blockstates/mossy_obsidian.json create mode 100644 src/main/resources/assets/betterend/models/block/mossy_obsidian.json create mode 100644 src/main/resources/assets/betterend/models/item/mossy_obsidian.json create mode 100644 src/main/resources/assets/betterend/textures/block/mossy_obsidian_side.png diff --git a/src/main/java/ru/betterend/blocks/MossyObsidian.java b/src/main/java/ru/betterend/blocks/MossyObsidian.java new file mode 100644 index 00000000..2122c64e --- /dev/null +++ b/src/main/java/ru/betterend/blocks/MossyObsidian.java @@ -0,0 +1,56 @@ +package ru.betterend.blocks; + +import java.util.Collections; +import java.util.List; +import java.util.Random; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.SnowBlock; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.enchantment.Enchantments; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.context.LootContext; +import net.minecraft.loot.context.LootContextParameters; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.WorldView; +import net.minecraft.world.chunk.light.ChunkLightProvider; +import ru.betterend.blocks.basis.BlockBase; + +public class MossyObsidian extends BlockBase { + public MossyObsidian() { + super(FabricBlockSettings.copyOf(Blocks.OBSIDIAN).hardness(3).ticksRandomly()); + } + + @Override + public List getDroppedStacks(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.get(LootContextParameters.TOOL); + if (tool != null && EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, tool) > 0) { + return Collections.singletonList(new ItemStack(this)); + } + return Collections.singletonList(new ItemStack(Blocks.OBSIDIAN)); + } + + @Override + public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + if (random.nextInt(16) == 0 && !canSurvive(state, world, pos)) { + world.setBlockState(pos, Blocks.OBSIDIAN.getDefaultState()); + } + } + + public static boolean canSurvive(BlockState state, WorldView worldView, BlockPos pos) { + BlockPos blockPos = pos.up(); + BlockState blockState = worldView.getBlockState(blockPos); + if (blockState.isOf(Blocks.SNOW) && (Integer)blockState.get(SnowBlock.LAYERS) == 1) { + return true; + } else if (blockState.getFluidState().getLevel() == 8) { + return false; + } else { + int i = ChunkLightProvider.getRealisticOpacity(worldView, state, pos, blockState, blockPos, Direction.UP, blockState.getOpacity(worldView, blockPos)); + return i < 5; + } + } +} diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index 282ee5cc..3cb2de94 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -43,6 +43,7 @@ import ru.betterend.world.biome.BiomePaintedMountains; import ru.betterend.world.biome.BiomeShadowForest; import ru.betterend.world.biome.BiomeSulphurSprings; import ru.betterend.world.biome.BiomeUmbrellaJungle; +import ru.betterend.world.biome.DragonGraveyardsBiome; import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.GlowingGrasslandsBiome; import ru.betterend.world.generator.BELayerRandomSource; @@ -85,6 +86,7 @@ public class EndBiomes { public static final EndBiome SULPHUR_SPRINGS = registerBiome(new BiomeSulphurSprings(), BiomeType.LAND); public static final EndBiome UMBRELLA_JUNGLE = registerBiome(new BiomeUmbrellaJungle(), BiomeType.LAND); public static final EndBiome GLOWING_GRASSLANDS = registerBiome(new GlowingGrasslandsBiome(), BiomeType.LAND); + public static final EndBiome DRAGON_GRAVEYARDS = registerBiome(new DragonGraveyardsBiome(), BiomeType.LAND); // Better End Void public static final EndBiome ICE_STARFIELD = registerBiome(new BiomeIceStarfield(), BiomeType.VOID); diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 5241c8b3..029af24f 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -67,6 +67,7 @@ import ru.betterend.blocks.MissingTileBlock; import ru.betterend.blocks.MossyGlowshroomCapBlock; import ru.betterend.blocks.MossyGlowshroomHymenophoreBlock; import ru.betterend.blocks.MossyGlowshroomSaplingBlock; +import ru.betterend.blocks.MossyObsidian; import ru.betterend.blocks.MurkweedBlock; import ru.betterend.blocks.NeedlegrassBlock; import ru.betterend.blocks.PedestalVanilla; @@ -133,6 +134,8 @@ public class EndBlocks { public static final Block AMBER_MOSS_PATH = registerBlock("amber_moss_path", new EndPathBlock(AMBER_MOSS)); public static final Block JUNGLE_MOSS_PATH = registerBlock("jungle_moss_path", new EndPathBlock(JUNGLE_MOSS)); + public static final Block MOSSY_OBSIDIAN = registerBlock("mossy_obsidian", new MossyObsidian()); + // Rocks // public static final StoneMaterial FLAVOLITE = new StoneMaterial("flavolite", MaterialColor.SAND); public static final StoneMaterial VIOLECITE = new StoneMaterial("violecite", MaterialColor.PURPLE); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 7b69c964..d4af375d 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -37,9 +37,12 @@ import ru.betterend.world.features.bushes.BushFeature; import ru.betterend.world.features.bushes.Lumecorn; import ru.betterend.world.features.bushes.TenaneaBushFeature; import ru.betterend.world.features.terrain.EndLakeFeature; +import ru.betterend.world.features.terrain.FallenPillarFeature; import ru.betterend.world.features.terrain.FloatingSpireFeature; import ru.betterend.world.features.terrain.GeyserFeature; import ru.betterend.world.features.terrain.IceStarFeature; +import ru.betterend.world.features.terrain.ObsidianBoulderFeature; +import ru.betterend.world.features.terrain.ObsidianPillarBasementFeature; import ru.betterend.world.features.terrain.RoundCaveFeature; import ru.betterend.world.features.terrain.SpireFeature; import ru.betterend.world.features.terrain.SulphurHillFeature; @@ -157,6 +160,9 @@ public class EndFeatures { public static final EndFeature ICE_STAR_SMALL = EndFeature.makeRawGenFeature("ice_star_small", new IceStarFeature(3, 5, 7, 12), 8); public static final EndFeature SURFACE_VENT = EndFeature.makeChansedFeature("surface_vent", new SurfaceVentFeature(), 4); public static final EndFeature SULPHUR_HILL = EndFeature.makeChansedFeature("sulphur_hill", new SulphurHillFeature(), 8); + public static final EndFeature OBSIDIAN_PILLAR_BASEMENT = EndFeature.makeChansedFeature("obsidian_pillar_basement", new ObsidianPillarBasementFeature(), 8); + public static final EndFeature OBSIDIAN_BOULDER = EndFeature.makeChansedFeature("obsidian_boulder", new ObsidianBoulderFeature(), 10); + public static final EndFeature FALLEN_PILLAR = EndFeature.makeChansedFeature("fallen_pillar", new FallenPillarFeature(), 20); // Ores // public static final EndFeature THALLASIUM_ORE = EndFeature.makeOreFeature("thallasium_ore", EndBlocks.THALLASIUM.ore, 12, 6, 0, 16, 128); diff --git a/src/main/java/ru/betterend/util/MHelper.java b/src/main/java/ru/betterend/util/MHelper.java index 3d48d8a4..04a9b2e5 100644 --- a/src/main/java/ru/betterend/util/MHelper.java +++ b/src/main/java/ru/betterend/util/MHelper.java @@ -4,6 +4,7 @@ import java.util.Random; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.Vec3d; +import ru.betterend.util.sdf.operator.SDFRotation; public class MHelper { public static final float PI2 = (float) (Math.PI * 2); @@ -325,11 +326,17 @@ public class MHelper { return vec; } - public static float angle(Vector3f vec1, Vector3f vec2) - { + public static float angle(Vector3f vec1, Vector3f vec2) { float dot = vec1.getX() * vec2.getX() + vec1.getY() * vec2.getY() + vec1.getZ() * vec2.getZ(); float length1 = lengthSqr(vec1.getX(), vec1.getY(), vec1.getZ()); float length2 = lengthSqr(vec2.getX(), vec2.getY(), vec2.getZ()); return (float) Math.acos(dot / Math.sqrt(length1 * length2)); } + + public static Vector3f randomHorizontal(Random random) { + float angleY = MHelper.randRange(0, MHelper.PI2, random); + float vx = (float) Math.sin(angleY); + float vz = (float) Math.cos(angleY); + return new Vector3f(vx, 0, vz); + } } diff --git a/src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java b/src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java new file mode 100644 index 00000000..17fdf531 --- /dev/null +++ b/src/main/java/ru/betterend/world/biome/DragonGraveyardsBiome.java @@ -0,0 +1,24 @@ +package ru.betterend.world.biome; + +import net.minecraft.entity.EntityType; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndSounds; + +public class DragonGraveyardsBiome extends EndBiome { + public DragonGraveyardsBiome() { + super(new BiomeDefinition("dragon_graveyards") + .setGenChance(0.1F) + .setFogColor(244, 46, 79) + .setFogDensity(1.1F) + .setMusic(EndSounds.MUSIC_OPENSPACE) + .setLoop(EndSounds.AMBIENT_GLOWING_GRASSLANDS) + .setSurface(EndBlocks.CAVE_MOSS) + .setWaterAndFogColor(203, 59, 167) + .setPlantsColor(244, 46, 79) + .addFeature(EndFeatures.OBSIDIAN_PILLAR_BASEMENT) + .addFeature(EndFeatures.FALLEN_PILLAR) + .addFeature(EndFeatures.OBSIDIAN_BOULDER) + .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + } +} diff --git a/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java b/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java new file mode 100644 index 00000000..a0cafa58 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/FallenPillarFeature.java @@ -0,0 +1,56 @@ +package ru.betterend.world.features.terrain; + +import java.util.Random; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.Material; +import net.minecraft.client.util.math.Vector3f; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.MHelper; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFDisplacement; +import ru.betterend.util.sdf.operator.SDFRotation; +import ru.betterend.util.sdf.operator.SDFTranslate; +import ru.betterend.util.sdf.primitive.SDFCappedCone; +import ru.betterend.world.features.DefaultFeature; + +public class FallenPillarFeature extends DefaultFeature { + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); + if (!world.getBlockState(pos.down(5)).isIn(EndTags.GEN_TERRAIN)) { + return false; + } + + float height = MHelper.randRange(20F, 40F, random); + float radius = MHelper.randRange(2F, 4F, random); + SDF pillar = new SDFCappedCone().setRadius1(radius).setRadius2(radius).setHeight(height * 0.5F).setBlock(Blocks.OBSIDIAN); + pillar = new SDFTranslate().setTranslate(0, radius * 0.5F - 2, 0).setSource(pillar); + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); + pillar = new SDFDisplacement().setFunction((vec) -> { + return (float) (noise.eval(vec.getX() * 0.3, vec.getY() * 0.3, vec.getZ() * 0.3) * 0.5F); + }).setSource(pillar); + Vector3f vec = MHelper.randomHorizontal(random); + float angle = (float) random.nextGaussian() * 0.05F + (float) Math.PI; + pillar = new SDFRotation().setRotation(vec, angle).setSource(pillar); + + BlockState mossy = EndBlocks.MOSSY_OBSIDIAN.getDefaultState(); + pillar.addPostProcess((info) -> { + if (info.getStateUp().isAir() && random.nextFloat() > 0.1F) { + return mossy; + } + return info.getState(); + }).setReplaceFunction((state) -> { + return state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN) || state.getMaterial().equals(Material.PLANT); + }).fillRecursive(world, pos); + + return true; + } +} diff --git a/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java b/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java new file mode 100644 index 00000000..9d00ec71 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/ObsidianBoulderFeature.java @@ -0,0 +1,65 @@ +package ru.betterend.world.features.terrain; + +import java.util.Random; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.Material; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.MHelper; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFDisplacement; +import ru.betterend.util.sdf.operator.SDFScale3D; +import ru.betterend.util.sdf.primitive.SDFSphere; +import ru.betterend.world.features.DefaultFeature; + +public class ObsidianBoulderFeature extends DefaultFeature { + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); + if (!world.getBlockState(pos.down()).isIn(EndTags.END_GROUND)) { + return false; + } + + int count = MHelper.randRange(1, 5, random); + for (int i = 0; i < count; i++) { + BlockPos p = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16) - 8, pos.getY(), pos.getZ() + random.nextInt(16) - 8)); + makeBoulder(world, p, random); + } + + return true; + } + + private void makeBoulder(StructureWorldAccess world, BlockPos pos, Random random) { + if (!world.getBlockState(pos.down()).isIn(EndTags.END_GROUND)) { + return; + } + + float radius = MHelper.randRange(1F, 5F, random); + SDF sphere = new SDFSphere().setRadius(radius).setBlock(Blocks.OBSIDIAN); + float sx = MHelper.randRange(0.7F, 1.3F, random); + float sy = MHelper.randRange(0.7F, 1.3F, random); + float sz = MHelper.randRange(0.7F, 1.3F, random); + sphere = new SDFScale3D().setScale(sx, sy, sz).setSource(sphere); + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); + sphere = new SDFDisplacement().setFunction((vec) -> { + return (float) (noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 1.5F); + }).setSource(sphere); + + BlockState mossy = EndBlocks.MOSSY_OBSIDIAN.getDefaultState(); + sphere.addPostProcess((info) -> { + if (info.getStateUp().isAir() && random.nextFloat() > 0.1F) { + return mossy; + } + return info.getState(); + }).setReplaceFunction((state) -> { + return state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN) || state.getMaterial().equals(Material.PLANT); + }).fillRecursive(world, pos); + } +} diff --git a/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java b/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java new file mode 100644 index 00000000..00948443 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/ObsidianPillarBasementFeature.java @@ -0,0 +1,64 @@ +package ru.betterend.world.features.terrain; + +import java.util.Random; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.Material; +import net.minecraft.client.util.math.Vector3f; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.MHelper; +import ru.betterend.util.sdf.SDF; +import ru.betterend.util.sdf.operator.SDFDisplacement; +import ru.betterend.util.sdf.operator.SDFRotation; +import ru.betterend.util.sdf.operator.SDFSubtraction; +import ru.betterend.util.sdf.operator.SDFTranslate; +import ru.betterend.util.sdf.primitive.SDFCappedCone; +import ru.betterend.util.sdf.primitive.SDFFlatland; +import ru.betterend.world.features.DefaultFeature; + +public class ObsidianPillarBasementFeature extends DefaultFeature { + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); + if (!world.getBlockState(pos.down(5)).isIn(EndTags.GEN_TERRAIN)) { + return false; + } + + float height = MHelper.randRange(10F, 35F, random); + float radius = MHelper.randRange(2F, 5F, random); + SDF pillar = new SDFCappedCone().setRadius1(radius).setRadius2(radius).setHeight(height * 0.5F).setBlock(Blocks.OBSIDIAN); + pillar = new SDFTranslate().setTranslate(0, height * 0.5F - 3, 0).setSource(pillar); + SDF cut = new SDFFlatland().setBlock(Blocks.OBSIDIAN); + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); + cut = new SDFDisplacement().setFunction((vec) -> { + return (float) (noise.eval(vec.getX() * 0.2, vec.getZ() * 0.2) * 3); + }).setSource(cut); + Vector3f vec = MHelper.randomHorizontal(random); + float angle = random.nextFloat() * 0.5F + (float) Math.PI; + cut = new SDFRotation().setRotation(vec, angle).setSource(cut); + cut = new SDFTranslate().setTranslate(0, height * 0.7F - 3, 0).setSource(cut); + pillar = new SDFSubtraction().setSourceA(pillar).setSourceB(cut); + vec = MHelper.randomHorizontal(random); + angle = random.nextFloat() * 0.2F; + pillar = new SDFRotation().setRotation(vec, angle).setSource(pillar); + + BlockState mossy = EndBlocks.MOSSY_OBSIDIAN.getDefaultState(); + pillar.addPostProcess((info) -> { + if (info.getStateUp().isAir() && random.nextFloat() > 0.1F) { + return mossy; + } + return info.getState(); + }).setReplaceFunction((state) -> { + return state.getMaterial().isReplaceable() || state.isIn(EndTags.GEN_TERRAIN) || state.getMaterial().equals(Material.PLANT); + }).fillRecursive(world, pos); + + return true; + } +} diff --git a/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java index 8ef6297a..6c2d53a3 100644 --- a/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/RoundCaveFeature.java @@ -158,10 +158,8 @@ public class RoundCaveFeature extends DefaultFeature { BlockPos down = pos.down(BlocksHelper.downRay(world, pos, 64) + 2); if (isReplaceable(world.getBlockState(down))) { SDF prism = new SDFHexPrism().setHeight(radius * MHelper.randRange(0.6F, 0.75F, random)).setRadius(MHelper.randRange(1.7F, 3F, random)).setBlock(EndBlocks.AURORA_CRYSTAL); - float angleY = MHelper.randRange(0, MHelper.PI2, random); - float vx = (float) Math.sin(angleY); - float vz = (float) Math.sin(angleY); - prism = new SDFRotation().setRotation(new Vector3f(vx, 0, vz), random.nextFloat()).setSource(prism); + Vector3f vec = MHelper.randomHorizontal(random); + prism = new SDFRotation().setRotation(vec, random.nextFloat()).setSource(prism); prism.setReplaceFunction((bState) -> { return bState.getMaterial().isReplaceable() || bState.isIn(EndTags.GEN_TERRAIN) diff --git a/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java b/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java index 01829f90..ab53b52f 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SurfaceVentFeature.java @@ -19,7 +19,7 @@ public class SurfaceVentFeature extends DefaultFeature { @Override public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { pos = getPosOnSurface(world, new BlockPos(pos.getX() + random.nextInt(16), pos.getY(), pos.getZ() + random.nextInt(16))); - if (pos.getY() < 57) { + if (!world.getBlockState(pos.down(3)).isIn(EndTags.GEN_TERRAIN)) { return false; } diff --git a/src/main/resources/assets/betterend/blockstates/mossy_obsidian.json b/src/main/resources/assets/betterend/blockstates/mossy_obsidian.json new file mode 100644 index 00000000..8c8edaf7 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/mossy_obsidian.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/mossy_obsidian" }, + { "model": "betterend:block/mossy_obsidian", "y": 90 }, + { "model": "betterend:block/mossy_obsidian", "y": 180 }, + { "model": "betterend:block/mossy_obsidian", "y": 270 } + ] + } +} diff --git a/src/main/resources/assets/betterend/models/block/mossy_obsidian.json b/src/main/resources/assets/betterend/models/block/mossy_obsidian.json new file mode 100644 index 00000000..78d52422 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/mossy_obsidian.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "block/obsidian", + "east": "betterend:block/mossy_obsidian_side", + "north": "betterend:block/mossy_obsidian_side", + "particle": "betterend:block/mossy_obsidian_side", + "south": "betterend:block/mossy_obsidian_side", + "up": "betterend:block/cave_moss_top", + "west": "betterend:block/mossy_obsidian_side" + } +} diff --git a/src/main/resources/assets/betterend/models/item/mossy_obsidian.json b/src/main/resources/assets/betterend/models/item/mossy_obsidian.json new file mode 100644 index 00000000..199c8c29 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/mossy_obsidian.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/mossy_obsidian" +} diff --git a/src/main/resources/assets/betterend/textures/block/mossy_obsidian_side.png b/src/main/resources/assets/betterend/textures/block/mossy_obsidian_side.png new file mode 100644 index 0000000000000000000000000000000000000000..180693ebbbb9cacba6dac7ed32ca7d1ef4219e2d GIT binary patch literal 2183 zcmbVO2~ZPf7!7n76{PhRwdlIo7NyA^IY?H*8Et}uGaj{C-Ry3Xm1H;UZU~@OQCqe3 zK4uDDqxGoM!D4L%)JkPk#un;H$7*#Dr!z=ZbgF~n)&2`1)ec&xnc3{WyYGMReaC*Y z%d<1ziwqwgu23iZD)P8Fktj04oxB8C%eN62>V!!7MmR+lgr-@up)_7# zAgxNLq%aK*#T!(Z4mIGKcOe|b;t@0+!PH6=BTyZoHb8+N4AcbLLFAey2DHGH5q3$E zmp~A|->>qkRlMLtFoVH>pg4l#N`O#`#hgSIDLFBwo5940l)!o=mggXuk+kzZ$p{0d zT_Je9L0V1>qzNPpDI&cHrb6YAI)OA5#Cd&!yHlK|5XQ}T7)}xa77Jp%E?(kA7ykn4 z;N#~6Kx(blphk~gJf5J0C`~8?VFVJ=BU-c-dl@8`5qY0LF%t@b%@{cvFOeoNq{It0 zo_BW_D!bb;>QTU}MRg>JsYx28x^e>CWC<*I z)kycVtgQq2JkrEk{zU!ygq~g^p`(*nd4s3|n!c;f?yEl?PVf zbH+dJxR5t)ci*t>M@Oue!13e&LZ(dliF)$ioeWh=uSKCskYlO*6Rg{KIUN-i@Ynmo?R`kwOhvZKM%Y;nRzSP-^{syPW3pW4& literal 0 HcmV?d00001