diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 6831ba13..83440470 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -74,6 +74,7 @@ public class EndBlocks { public static final Block CAVE_MOSS = registerBlock("cave_moss", new BlockTerrain(MaterialColor.PURPLE)); public static final Block CRYSTAL_MOSS = registerBlock("crystal_moss", new BlockTerrain(MaterialColor.PINK)); public static final Block SHADOW_GRASS = registerBlock("shadow_grass", new BlockShadowGrass()); + public static final Block PINK_MOSS = registerBlock("pink_moss", new BlockTerrain(MaterialColor.PINK)); public static final Block AMBER_GRASS = registerBlock("amber_grass", new BlockTerrain(MaterialColor.ORANGE)); // Roads // @@ -83,6 +84,7 @@ public class EndBlocks { public static final Block CAVE_MOSS_PATH = registerBlock("cave_moss_path", new BlockPath(CAVE_MOSS)); public static final Block CRYSTAL_MOSS_PATH = registerBlock("crystal_moss_path", new BlockPath(CRYSTAL_MOSS)); public static final Block SHADOW_GRASS_PATH = registerBlock("shadow_grass_path", new BlockPath(SHADOW_GRASS)); + public static final Block PINK_MOSS_PATH = registerBlock("pink_moss_path", new BlockPath(PINK_MOSS)); public static final Block AMBER_GRASS_PATH = registerBlock("amber_grass_path", new BlockPath(AMBER_GRASS)); // Rocks // diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index a6d406b1..083adf7f 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -17,14 +17,15 @@ import ru.betterend.world.features.EndFeature; import ru.betterend.world.features.EndLilyFeature; import ru.betterend.world.features.EndLotusFeature; import ru.betterend.world.features.EndLotusLeafFeature; -import ru.betterend.world.features.FloatingSpireFeature; import ru.betterend.world.features.SinglePlantFeature; import ru.betterend.world.features.UnderwaterPlantFeature; import ru.betterend.world.features.VineFeature; import ru.betterend.world.features.WallPlantFeature; import ru.betterend.world.features.WallPlantOnLogFeature; import ru.betterend.world.features.bushes.BushFeature; +import ru.betterend.world.features.bushes.TenaneaBushFeature; import ru.betterend.world.features.terrain.EndLakeFeature; +import ru.betterend.world.features.terrain.FloatingSpireFeature; import ru.betterend.world.features.terrain.RoundCaveFeature; import ru.betterend.world.features.terrain.SpireFeature; import ru.betterend.world.features.trees.DragonTreeFeature; @@ -44,6 +45,7 @@ public class EndFeatures { // Bushes // public static final EndFeature PYTHADENDRON_BUSH = new EndFeature("pythadendron_bush", new BushFeature(EndBlocks.PYTHADENDRON_LEAVES, EndBlocks.PYTHADENDRON.bark), 4); public static final EndFeature DRAGON_TREE_BUSH = new EndFeature("dragon_tree_bush", new BushFeature(EndBlocks.DRAGON_TREE_LEAVES, EndBlocks.DRAGON_TREE.bark), 15); + public static final EndFeature TENANEA_BUSH = new EndFeature("tenanea_bush", new TenaneaBushFeature(), 10); // Plants // public static final EndFeature UMBRELLA_MOSS = new EndFeature("umbrella_moss", new DoublePlantFeature(EndBlocks.UMBRELLA_MOSS, EndBlocks.UMBRELLA_MOSS_TALL, 5), 5); diff --git a/src/main/java/ru/betterend/world/biome/BlossomingSpires.java b/src/main/java/ru/betterend/world/biome/BlossomingSpires.java index 4c945102..829b1701 100644 --- a/src/main/java/ru/betterend/world/biome/BlossomingSpires.java +++ b/src/main/java/ru/betterend/world/biome/BlossomingSpires.java @@ -10,10 +10,11 @@ public class BlossomingSpires extends EndBiome { .setFogColor(241, 146, 229) .setFogDensity(2.0F) .setPlantsColor(122, 45, 122) - .setSurface(EndBlocks.END_MOSS) + .setSurface(EndBlocks.PINK_MOSS) .addFeature(EndFeatures.SPIRE) .addFeature(EndFeatures.FLOATING_SPIRE) .addFeature(EndFeatures.TENANEA) + .addFeature(EndFeatures.TENANEA_BUSH) .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4)); } } diff --git a/src/main/java/ru/betterend/world/features/EndFeature.java b/src/main/java/ru/betterend/world/features/EndFeature.java index 17866404..5847e5bc 100644 --- a/src/main/java/ru/betterend/world/features/EndFeature.java +++ b/src/main/java/ru/betterend/world/features/EndFeature.java @@ -23,9 +23,9 @@ import ru.betterend.blocks.complex.StoneMaterial; import ru.betterend.world.features.terrain.OreLayerFeature; public class EndFeature { - protected Feature feature; - protected ConfiguredFeature featureConfigured; - protected GenerationStep.Feature featureStep; + private Feature feature; + private ConfiguredFeature featureConfigured; + private GenerationStep.Feature featureStep; protected EndFeature() {} diff --git a/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java new file mode 100644 index 00000000..4a2cd68c --- /dev/null +++ b/src/main/java/ru/betterend/world/features/bushes/TenaneaBushFeature.java @@ -0,0 +1,111 @@ +package ru.betterend.world.features.bushes; + +import java.util.List; +import java.util.Random; +import java.util.function.Function; + +import com.google.common.collect.Lists; + +import net.minecraft.block.BlockState; +import net.minecraft.block.LeavesBlock; +import net.minecraft.block.Material; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.Mutable; +import net.minecraft.util.math.Direction; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import ru.betterend.blocks.BlockProperties; +import ru.betterend.blocks.BlockProperties.TripleShape; +import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.registry.EndBlocks; +import ru.betterend.registry.EndTags; +import ru.betterend.util.BlocksHelper; +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.operator.SDFSubtraction; +import ru.betterend.util.sdf.operator.SDFTranslate; +import ru.betterend.util.sdf.primitive.SDFSphere; +import ru.betterend.world.features.DefaultFeature; + +public class TenaneaBushFeature extends DefaultFeature { + private static final Function REPLACE; + + public TenaneaBushFeature() {} + + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + if (!world.getBlockState(pos.down()).getBlock().isIn(EndTags.END_GROUND)) return false; + + float radius = MHelper.randRange(1.8F, 3.5F, random); + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextInt()); + BlockState leaves = EndBlocks.TENANEA_LEAVES.getDefaultState(); + SDF sphere = new SDFSphere().setRadius(radius).setBlock(leaves); + sphere = new SDFScale3D().setScale(1, 0.75F, 1).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 3; }).setSource(sphere); + sphere = new SDFDisplacement().setFunction((vec) -> { return MHelper.randRange(-2F, 2F, random); }).setSource(sphere); + sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere)); + sphere.setReplaceFunction(REPLACE); + List support = Lists.newArrayList(); + sphere.setPostProcess((info) -> { + if (info.getState().getBlock() instanceof LeavesBlock) { + int distance = info.getPos().getManhattanDistance(pos); + if (distance < 7) { + if (random.nextBoolean() && info.getStateDown().isAir()) { + BlockPos d = info.getPos().down(); + support.add(d); + } + return info.getState().with(LeavesBlock.DISTANCE, distance); + } + else { + return AIR; + } + } + return info.getState(); + }); + sphere.fillRecursive(world, pos); + BlockState stem = EndBlocks.TENANEA.bark.getDefaultState(); + BlocksHelper.setWithoutUpdate(world, pos, stem); + for (Direction d: Direction.values()) { + BlockPos p = pos.offset(d); + if (world.isAir(p)) { + BlocksHelper.setWithoutUpdate(world, p, leaves.with(LeavesBlock.DISTANCE, 1)); + } + } + + Mutable mut = new Mutable(); + BlockState top = EndBlocks.TENANEA_FLOWERS.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.TOP); + BlockState middle = EndBlocks.TENANEA_FLOWERS.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.MIDDLE); + BlockState bottom = EndBlocks.TENANEA_FLOWERS.getDefaultState().with(BlockProperties.TRIPLE_SHAPE, TripleShape.BOTTOM); + support.forEach((bpos) -> { + int count = MHelper.randRange(3, 8, random); + mut.set(bpos); + if (world.getBlockState(mut.up()).isOf(EndBlocks.TENANEA_LEAVES)) { + BlocksHelper.setWithoutUpdate(world, mut, top); + for (int i = 1; i < count; i++) { + mut.setY(mut.getY() - 1); + if (world.isAir(mut.down())) { + BlocksHelper.setWithoutUpdate(world, mut, middle); + } + else { + break; + } + } + BlocksHelper.setWithoutUpdate(world, mut, bottom); + } + }); + + return true; + } + + static { + REPLACE = (state) -> { + if (state.getMaterial().equals(Material.PLANT)) { + return true; + } + return state.getMaterial().isReplaceable(); + }; + } +} diff --git a/src/main/java/ru/betterend/world/features/FloatingSpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java similarity index 74% rename from src/main/java/ru/betterend/world/features/FloatingSpireFeature.java rename to src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java index c939791a..723935e9 100644 --- a/src/main/java/ru/betterend/world/features/FloatingSpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java @@ -1,19 +1,21 @@ -package ru.betterend.world.features; +package ru.betterend.world.features.terrain; +import java.util.List; import java.util.Random; +import com.google.common.collect.Lists; + import net.minecraft.block.Blocks; 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.EndFeatures; import ru.betterend.util.MHelper; import ru.betterend.util.sdf.SDF; import ru.betterend.util.sdf.operator.SDFDisplacement; import ru.betterend.util.sdf.primitive.SDFSphere; -import ru.betterend.world.features.terrain.SpireFeature; public class FloatingSpireFeature extends SpireFeature { @Override @@ -39,10 +41,22 @@ public class FloatingSpireFeature extends SpireFeature { 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; + List support = Lists.newArrayList(); sdf.setReplaceFunction(REPLACE).setPostProcess((info) -> { - return info.getStateUp().isAir() ? EndBlocks.END_MOSS.getDefaultState() : info.getState(); + if (info.getStateUp().isAir()) { + if (random.nextInt(16) == 0) { + support.add(info.getPos().up()); + } + return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceConfig().getTopMaterial(); + } + return info.getState(); }); sdf.fillRecursive(world, center); + + support.forEach((bpos) -> { + EndFeatures.TENANEA_BUSH.getFeature().generate(world, chunkGenerator, random, bpos, null); + }); + return true; } } diff --git a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java index 69309f5b..8dcc93f7 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java @@ -1,8 +1,11 @@ package ru.betterend.world.features.terrain; +import java.util.List; import java.util.Random; import java.util.function.Function; +import com.google.common.collect.Lists; + import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.LeavesBlock; @@ -12,7 +15,7 @@ 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.EndFeatures; import ru.betterend.registry.EndTags; import ru.betterend.util.MHelper; import ru.betterend.util.sdf.SDF; @@ -40,10 +43,22 @@ public class SpireFeature extends DefaultFeature { 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; + List support = Lists.newArrayList(); sdf.setReplaceFunction(REPLACE).setPostProcess((info) -> { - return info.getStateUp().isAir() ? EndBlocks.END_MOSS.getDefaultState() : info.getState(); + if (info.getStateUp().isAir()) { + if (random.nextInt(16) == 0) { + support.add(info.getPos().up()); + } + return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceConfig().getTopMaterial(); + } + return info.getState(); }); sdf.fillRecursive(world, center); + + support.forEach((bpos) -> { + EndFeatures.TENANEA_BUSH.getFeature().generate(world, chunkGenerator, random, bpos, null); + }); + return true; } return false; diff --git a/src/main/resources/assets/betterend/blockstates/pink_moss.json b/src/main/resources/assets/betterend/blockstates/pink_moss.json new file mode 100644 index 00000000..27f9613c --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/pink_moss.json @@ -0,0 +1,21 @@ +{ + "variants": { + "": [ + { + "model": "betterend:block/pink_moss" + }, + { + "model": "betterend:block/pink_moss", + "y": 90 + }, + { + "model": "betterend:block/pink_moss", + "y": 180 + }, + { + "model": "betterend:block/pink_moss", + "y": 270 + } + ] + } +} diff --git a/src/main/resources/assets/betterend/blockstates/pink_moss_path.json b/src/main/resources/assets/betterend/blockstates/pink_moss_path.json new file mode 100644 index 00000000..4ca9deab --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/pink_moss_path.json @@ -0,0 +1,10 @@ +{ + "variants": { + "": [ + { "model": "betterend:block/pink_moss_path" }, + { "model": "betterend:block/pink_moss_path", "y": 90 }, + { "model": "betterend:block/pink_moss_path", "y": 180 }, + { "model": "betterend:block/pink_moss_path", "y": 270 } + ] + } +} diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index e47468c2..4e93a053 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -333,5 +333,8 @@ "item.betterend.amber_gem": "Amber Gem", "item.betterend.raw_amber": "Raw Amber", "block.betterend.tenanea_flowers": "Tenanea Flowers", - "block.betterend.tenanea_outer_leaves": "Tenanea Outer Leaves" + "block.betterend.tenanea_outer_leaves": "Tenanea Outer Leaves", + + "block.betterend.pink_moss": "Pink Moss", + "block.betterend.pink_moss_path": "Pink Moss Path" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 3cb5ccff..ebcd4606 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -335,5 +335,8 @@ "item.betterend.amber_gem": "Огранённый янтарь", "item.betterend.raw_amber": "Необработанный янтарь", "block.betterend.tenanea_flowers": "Цветы тенанеи", - "block.betterend.tenanea_outer_leaves": "Внешние листья тенанеи" + "block.betterend.tenanea_outer_leaves": "Внешние листья тенанеи", + + "block.betterend.pink_moss": "Розовый мох", + "block.betterend.pink_moss_path": "Тропа из розового мха" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/block/pink_moss.json b/src/main/resources/assets/betterend/models/block/pink_moss.json new file mode 100644 index 00000000..237cb110 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/pink_moss.json @@ -0,0 +1,12 @@ +{ + "parent": "block/cube", + "textures": { + "down": "block/end_stone", + "east": "betterend:block/pink_moss_side", + "north": "betterend:block/pink_moss_side", + "particle": "betterend:block/pink_moss_side", + "south": "betterend:block/pink_moss_side", + "up": "betterend:block/pink_moss_top", + "west": "betterend:block/pink_moss_side" + } +} diff --git a/src/main/resources/assets/betterend/models/block/pink_moss_path.json b/src/main/resources/assets/betterend/models/block/pink_moss_path.json new file mode 100644 index 00000000..9f46434e --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/pink_moss_path.json @@ -0,0 +1,7 @@ +{ "parent": "betterend:block/path", + "textures": { + "top": "betterend:block/pink_moss_path_top", + "side": "betterend:block/pink_moss_side", + "bottom": "block/end_stone" + } +} diff --git a/src/main/resources/assets/betterend/models/item/pink_moss.json b/src/main/resources/assets/betterend/models/item/pink_moss.json new file mode 100644 index 00000000..275797f5 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/pink_moss.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/pink_moss" +} diff --git a/src/main/resources/assets/betterend/models/item/pink_moss_path.json b/src/main/resources/assets/betterend/models/item/pink_moss_path.json new file mode 100644 index 00000000..de77462e --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/pink_moss_path.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/pink_moss_path" +} diff --git a/src/main/resources/assets/betterend/textures/block/pink_moss_path_top.png b/src/main/resources/assets/betterend/textures/block/pink_moss_path_top.png new file mode 100644 index 00000000..f480e3ef Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/pink_moss_path_top.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pink_moss_side.png b/src/main/resources/assets/betterend/textures/block/pink_moss_side.png new file mode 100644 index 00000000..34a3f4b0 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/pink_moss_side.png differ diff --git a/src/main/resources/assets/betterend/textures/block/pink_moss_top.png b/src/main/resources/assets/betterend/textures/block/pink_moss_top.png new file mode 100644 index 00000000..ac900018 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/pink_moss_top.png differ