Lacugrove feature v1

This commit is contained in:
paulevsGitch 2020-10-27 22:02:55 +03:00
parent 2042312c7b
commit 0f9edccc4e
9 changed files with 162 additions and 37 deletions

View file

@ -20,6 +20,7 @@ import ru.betterend.world.features.EndLilyFeature;
import ru.betterend.world.features.EndLotusFeature;
import ru.betterend.world.features.EndLotusLeafFeature;
import ru.betterend.world.features.EndPortalFeature;
import ru.betterend.world.features.LacugroveFeature;
import ru.betterend.world.features.MossyGlowshroomFeature;
import ru.betterend.world.features.PythadendronBushFeature;
import ru.betterend.world.features.PythadendronTreeFeature;
@ -32,6 +33,7 @@ public class EndFeatures {
// Trees //
public static final EndFeature MOSSY_GLOWSHROOM = new EndFeature("mossy_glowshroom", new MossyGlowshroomFeature(), 3);
public static final EndFeature PYTHADENDRON_TREE = new EndFeature("pythadendron_tree", new PythadendronTreeFeature(), 2);
public static final EndFeature LACUGROVE = new EndFeature("lacugrove", new LacugroveFeature(), 3);
// Bushes //
public static final EndFeature PYTHADENDRON_BUSH = new EndFeature("pythadendron_bush", new PythadendronBushFeature(), 4);

View file

@ -21,6 +21,7 @@ public class BiomeMegalake extends EndBiome {
.setSurface(EndBlocks.ENDSTONE_DUST, EndBlocks.END_MOSS)
.addStructureFeature(EndStructures.MEGALAKE)
.addStructureFeature(ConfiguredStructureFeatures.END_CITY)
.addFeature(EndFeatures.LACUGROVE)
.addFeature(EndFeatures.END_LOTUS)
.addFeature(EndFeatures.END_LOTUS_LEAF)
.addFeature(EndFeatures.BUBBLE_CORAL_RARE)

View file

@ -0,0 +1,103 @@
package ru.betterend.world.features;
import java.util.List;
import java.util.Random;
import java.util.function.Function;
import net.minecraft.block.BlockState;
import net.minecraft.block.Material;
import net.minecraft.client.util.math.Vector3f;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockPos.Mutable;
import net.minecraft.world.StructureWorldAccess;
import net.minecraft.world.gen.chunk.ChunkGenerator;
import net.minecraft.world.gen.feature.DefaultFeatureConfig;
import ru.betterend.registry.EndBlocks;
import ru.betterend.registry.EndTags;
import ru.betterend.util.BlocksHelper;
import ru.betterend.util.MHelper;
import ru.betterend.util.SplineHelper;
import ru.betterend.util.sdf.PosInfo;
import ru.betterend.util.sdf.SDF;
public class LacugroveFeature extends DefaultFeature {
private static final Function<BlockState, Boolean> REPLACE;
private static final Function<PosInfo, BlockState> POST;
@Override
public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) {
if (!world.getBlockState(pos.down()).isIn(EndTags.END_GROUND)) return false;
float size = MHelper.randRange(15, 25, random);
List<Vector3f> spline = SplineHelper.makeSpline(0, 0, 0, 0, size, 0, 6);
SplineHelper.offsetParts(spline, random, 1F, 0, 1F);
float radius = MHelper.randRange(1.2F, 1.8F, random);
SDF function = SplineHelper.buildSDF(spline, radius, 0.7F, (bpos) -> {
return EndBlocks.LACUGROVE.bark.getDefaultState();
});
function.setReplaceFunction(REPLACE);
function.setPostProcess(POST);
function.fillRecursive(world, pos);
Mutable mut = new Mutable();
int offset = random.nextInt(2);
for (int i = 0; i < 100; i++) {
double px = pos.getX() + MHelper.randRange(-5, 5, random);
double pz = pos.getZ() + MHelper.randRange(-5, 5, random);
mut.setX(MHelper.floor(px + 0.5));
mut.setZ(MHelper.floor(pz + 0.5));
if (((mut.getX() + mut.getZ() + offset) & 1) == 0) {
double distance = 3.5 - MHelper.length(px - pos.getX(), pz - pos.getZ()) * 0.5;
if (distance > 0) {
int minY = MHelper.floor(pos.getY() - distance * 0.5);
int maxY = MHelper.floor(pos.getY() + distance + random.nextDouble());
boolean generate = false;
for (int y = minY; y < maxY; y++) {
mut.setY(y);
if (world.getBlockState(mut).isIn(EndTags.END_GROUND)) {
generate = true;
break;
}
}
if (generate) {
int top = maxY - 1;
for (int y = top; y >= minY; y--) {
mut.setY(y);
BlockState state = world.getBlockState(mut);
if (state.getMaterial().isReplaceable() || state.getMaterial().equals(Material.PLANT) || state.isIn(EndTags.END_GROUND)) {
BlocksHelper.setWithoutUpdate(world, mut, y == top ? EndBlocks.LACUGROVE.bark : EndBlocks.LACUGROVE.log);
}
else {
break;
}
}
}
}
}
}
return true;
}
static {
REPLACE = (state) -> {
if (state.isIn(EndTags.END_GROUND)) {
return true;
}
if (state.getBlock() == EndBlocks.PYTHADENDRON_LEAVES) {
return true;
}
if (state.getMaterial().equals(Material.PLANT)) {
return true;
}
return state.getMaterial().isReplaceable();
};
POST = (info) -> {
if (EndBlocks.LACUGROVE.isTreeLog(info.getStateUp()) && EndBlocks.LACUGROVE.isTreeLog(info.getStateDown())) {
return EndBlocks.LACUGROVE.log.getDefaultState();
}
return info.getState();
};
}
}

View file

@ -18,6 +18,7 @@ import ru.betterend.registry.EndTags;
import ru.betterend.util.BlocksHelper;
import ru.betterend.util.MHelper;
import ru.betterend.util.SplineHelper;
import ru.betterend.util.sdf.PosInfo;
import ru.betterend.util.sdf.SDF;
import ru.betterend.util.sdf.operator.SDFDisplacement;
import ru.betterend.util.sdf.operator.SDFScale3D;
@ -27,6 +28,7 @@ import ru.betterend.util.sdf.primitive.SDFSphere;
public class PythadendronTreeFeature extends DefaultFeature {
private static final Function<BlockState, Boolean> REPLACE;
private static final Function<PosInfo, BlockState> POST;
@Override
public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) {
@ -44,14 +46,8 @@ public class PythadendronTreeFeature extends DefaultFeature {
SDF function = SplineHelper.buildSDF(spline, 1.7F, 1.1F, (bpos) -> {
return EndBlocks.PYTHADENDRON.bark.getDefaultState();
});
function.setPostProcess((info) -> {
if (EndBlocks.PYTHADENDRON.isTreeLog(info.getStateUp()) && EndBlocks.PYTHADENDRON.isTreeLog(info.getStateDown())) {
return EndBlocks.PYTHADENDRON.log.getDefaultState();
}
return info.getState();
});
function.setReplaceFunction(REPLACE);
function.setPostProcess(POST);
function.fillRecursive(world, pos);
return true;
@ -86,39 +82,9 @@ public class PythadendronTreeFeature extends DefaultFeature {
if (depth < 3) {
if (s1) {
leavesBall(world, pos.add(pos1.getX(), pos1.getY(), pos1.getZ()), random, noise);
/*float radius = MHelper.randRange(4.5F, 6.5F, random);
if (radius > 5) {
for (int i = 0; i < 10; i++) {
BlockPos p = pos.add(pos1.getX() + random.nextGaussian() * 2, pos1.getY() + random.nextGaussian() * 2, pos1.getZ() + random.nextGaussian() * 2);
BlocksHelper.setWithoutUpdate(world, p, BlockRegistry.PYTHADENDRON.bark);
}
}
SDF sphere = new SDFSphere().setRadius(radius).setBlock(BlockRegistry.PYTHADENDRON_LEAVES.getDefaultState().with(LeavesBlock.DISTANCE, 1));
sphere = new SDFScale3D().setScale(1, 0.6F, 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 random.nextFloat() * 3F - 1.5F; }).setSource(sphere);
sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere));
sphere.fillRecursive(world, new BlockPos(pos1.getX() + pos.getX(), pos1.getY() + pos.getY() + 1, pos1.getZ() + pos.getZ()));*/
}
if (s2) {
leavesBall(world, pos.add(pos2.getX(), pos2.getY(), pos2.getZ()), random, noise);
/*float radius = MHelper.randRange(4.5F, 6.5F, random);
if (radius > 5) {
for (int i = 0; i < 10; i++) {
BlockPos p = pos.add(pos1.getX() + random.nextGaussian() * 2, pos1.getY() + random.nextGaussian() * 2, pos1.getZ() + random.nextGaussian() * 2);
BlocksHelper.setWithoutUpdate(world, p, BlockRegistry.PYTHADENDRON.bark);
}
}
SDF sphere = new SDFSphere().setRadius(radius).setBlock(BlockRegistry.PYTHADENDRON_LEAVES.getDefaultState().with(LeavesBlock.DISTANCE, 1));
sphere = new SDFScale3D().setScale(1, 0.6F, 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 random.nextFloat() * 3F - 1.5F; }).setSource(sphere);
sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere));
sphere.fillRecursive(world, new BlockPos(pos2.getX() + pos.getX(), pos2.getY() + pos.getY() + 1, pos2.getZ() + pos.getZ()));*/
}
}
@ -168,5 +134,12 @@ public class PythadendronTreeFeature extends DefaultFeature {
}
return state.getMaterial().isReplaceable();
};
POST = (info) -> {
if (EndBlocks.PYTHADENDRON.isTreeLog(info.getStateUp()) && EndBlocks.PYTHADENDRON.isTreeLog(info.getStateDown())) {
return EndBlocks.PYTHADENDRON.log.getDefaultState();
}
return info.getState();
};
}
}

View file

@ -0,0 +1,22 @@
{
"variants": {
"axis=x": [
{ "model": "betterend:block/lacugrove_bark", "x": 90, "y": 90 },
{ "model": "betterend:block/lacugrove_bark_2", "x": 90, "y": 90 },
{ "model": "betterend:block/lacugrove_bark_3", "x": 90, "y": 90 },
{ "model": "betterend:block/lacugrove_bark_4", "x": 90, "y": 90 }
],
"axis=y": [
{ "model": "betterend:block/lacugrove_bark" },
{ "model": "betterend:block/lacugrove_bark_2" },
{ "model": "betterend:block/lacugrove_bark_3" },
{ "model": "betterend:block/lacugrove_bark_4" }
],
"axis=z": [
{ "model": "betterend:block/lacugrove_bark", "x": 90 },
{ "model": "betterend:block/lacugrove_bark_2", "x": 90 },
{ "model": "betterend:block/lacugrove_bark_3", "x": 90 },
{ "model": "betterend:block/lacugrove_bark_4", "x": 90 }
]
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "betterend:block/lacugrove_log_side"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "betterend:block/lacugrove_log_side_2"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "betterend:block/lacugrove_log_side_3"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "betterend:block/lacugrove_log_side_4"
}
}