Spires enhancements, pink moss

This commit is contained in:
paulevsGitch 2020-11-26 20:26:46 +03:00
parent e08d33e577
commit 1f697db60b
18 changed files with 220 additions and 13 deletions

View file

@ -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 //

View file

@ -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);

View file

@ -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));
}
}

View file

@ -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() {}

View file

@ -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<BlockState, Boolean> 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<BlockPos> 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();
};
}
}

View file

@ -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<BlockPos> 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;
}
}

View file

@ -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<BlockPos> 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;

View file

@ -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
}
]
}
}

View file

@ -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 }
]
}
}

View file

@ -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"
}

View file

@ -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": "Тропа из розового мха"
}

View file

@ -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"
}
}

View file

@ -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"
}
}

View file

@ -0,0 +1,3 @@
{
"parent": "betterend:block/pink_moss"
}

View file

@ -0,0 +1,3 @@
{
"parent": "betterend:block/pink_moss_path"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB