From ce9a2b004f8037e6106ea61a786142e805568ca1 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 17 Nov 2020 22:08:22 +0300 Subject: [PATCH] Spires prototype --- .../ru/betterend/registry/EndFeatures.java | 4 +- .../world/biome/BlossomingSpires.java | 4 +- .../world/features/terrain/SpireFeature.java | 72 +++++++++++++++++++ 3 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 src/main/java/ru/betterend/world/features/terrain/SpireFeature.java diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index bd492652..ec5a3b41 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -25,6 +25,7 @@ import ru.betterend.world.features.WallPlantOnLogFeature; import ru.betterend.world.features.bushes.BushFeature; import ru.betterend.world.features.terrain.EndLakeFeature; import ru.betterend.world.features.terrain.RoundCaveFeature; +import ru.betterend.world.features.terrain.SpireFeature; import ru.betterend.world.features.trees.DragonTreeFeature; import ru.betterend.world.features.trees.LacugroveFeature; import ru.betterend.world.features.trees.MossyGlowshroomFeature; @@ -73,11 +74,12 @@ public class EndFeatures { public static final EndFeature END_LOTUS = new EndFeature("end_lotus", new EndLotusFeature(7), 5); public static final EndFeature END_LOTUS_LEAF = new EndFeature("end_lotus_leaf", new EndLotusLeafFeature(20), 25); - // Features // + // Terrain // public static final EndFeature END_LAKE = EndFeature.makeLakeFeature("end_lake", new EndLakeFeature(), 4); public static final EndFeature END_LAKE_RARE = EndFeature.makeLakeFeature("end_lake_rare", new EndLakeFeature(), 40); public static final EndFeature ROUND_CAVE = EndFeature.makeRawGenFeature("round_cave", new RoundCaveFeature(), 2); public static final EndFeature ROUND_CAVE_RARE = EndFeature.makeRawGenFeature("round_cave_rare", new RoundCaveFeature(), 25); + public static final EndFeature SPIRE = EndFeature.makeRawGenFeature("spire", new SpireFeature(), 2); // Ores // public static final EndFeature ENDER_ORE = EndFeature.makeOreFeature("ender_ore", EndBlocks.ENDER_ORE, 6, 3, 0, 4, 96); diff --git a/src/main/java/ru/betterend/world/biome/BlossomingSpires.java b/src/main/java/ru/betterend/world/biome/BlossomingSpires.java index 174af54a..1c2cd763 100644 --- a/src/main/java/ru/betterend/world/biome/BlossomingSpires.java +++ b/src/main/java/ru/betterend/world/biome/BlossomingSpires.java @@ -2,14 +2,16 @@ package ru.betterend.world.biome; import net.minecraft.entity.EntityType; import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndFeatures; public class BlossomingSpires extends EndBiome { public BlossomingSpires() { super(new BiomeDefinition("blossoming_spires") - .setFogColor(87, 26, 87) + .setFogColor(241, 146, 229) .setFogDensity(2.0F) .setPlantsColor(122, 45, 122) .setSurface(EndBlocks.END_MOSS) + .addFeature(EndFeatures.SPIRE) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4)); } } diff --git a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java new file mode 100644 index 00000000..42ac3ae5 --- /dev/null +++ b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java @@ -0,0 +1,72 @@ +package ru.betterend.world.features.terrain; + +import java.util.Random; +import java.util.function.Function; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.LeavesBlock; +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.SDFSmoothUnion; +import ru.betterend.util.sdf.operator.SDFTranslate; +import ru.betterend.util.sdf.primitive.SDFSphere; +import ru.betterend.world.features.DefaultFeature; + +public class SpireFeature extends DefaultFeature { + private static final Function REPLACE; + + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + pos = getPosOnSurfaceWG(world, pos); + if (pos.getY() > 57) { + SDF sdf = new SDFSphere().setRadius(MHelper.randRange(2, 3, random)).setBlock(Blocks.END_STONE); + int count = MHelper.randRange(3, 7, random); + for (int i = 0; i < count; i++) { + float rMin = (i * 1.3F) + 2.5F; + sdf = addSegment(sdf, MHelper.randRange(rMin, rMin + 1.5F, random), random); + } + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); + sdf = new SDFDisplacement().setFunction((vec) -> { + return (float) (Math.abs(noise.eval(vec.getX() * 0.1, vec.getY() * 0.1, vec.getZ() * 0.1)) * 3F + Math.abs(noise.eval(vec.getX() * 0.3, vec.getY() * 0.3 + 100, vec.getZ() * 0.3)) * 1.3F); + }).setSource(sdf); + final BlockPos center = pos; + sdf.setReplaceFunction(REPLACE).setPostProcess((info) -> { + return info.getStateUp().isAir() ? EndBlocks.END_MOSS.getDefaultState() : info.getState(); + }); + sdf.fillRecursive(world, center); + return true; + } + return false; + } + + private SDF addSegment(SDF sdf, float radius, Random random) { + SDF sphere = new SDFSphere().setRadius(radius).setBlock(Blocks.END_STONE); + SDF offseted = new SDFTranslate().setTranslate(0, radius + random.nextFloat() * 0.25F * radius, 0).setSource(sdf); + return new SDFSmoothUnion().setRadius(radius * 0.5F).setSourceA(sphere).setSourceB(offseted); + } + + static { + REPLACE = (state) -> { + if (state.isIn(EndTags.END_GROUND)) { + return true; + } + if (state.getBlock() instanceof LeavesBlock) { + return true; + } + if (state.getMaterial().equals(Material.PLANT)) { + return true; + } + return state.getMaterial().isReplaceable(); + }; + } +}