Lacugrove feature v1
This commit is contained in:
parent
2042312c7b
commit
0f9edccc4e
9 changed files with 162 additions and 37 deletions
|
@ -20,6 +20,7 @@ import ru.betterend.world.features.EndLilyFeature;
|
||||||
import ru.betterend.world.features.EndLotusFeature;
|
import ru.betterend.world.features.EndLotusFeature;
|
||||||
import ru.betterend.world.features.EndLotusLeafFeature;
|
import ru.betterend.world.features.EndLotusLeafFeature;
|
||||||
import ru.betterend.world.features.EndPortalFeature;
|
import ru.betterend.world.features.EndPortalFeature;
|
||||||
|
import ru.betterend.world.features.LacugroveFeature;
|
||||||
import ru.betterend.world.features.MossyGlowshroomFeature;
|
import ru.betterend.world.features.MossyGlowshroomFeature;
|
||||||
import ru.betterend.world.features.PythadendronBushFeature;
|
import ru.betterend.world.features.PythadendronBushFeature;
|
||||||
import ru.betterend.world.features.PythadendronTreeFeature;
|
import ru.betterend.world.features.PythadendronTreeFeature;
|
||||||
|
@ -32,6 +33,7 @@ public class EndFeatures {
|
||||||
// Trees //
|
// Trees //
|
||||||
public static final EndFeature MOSSY_GLOWSHROOM = new EndFeature("mossy_glowshroom", new MossyGlowshroomFeature(), 3);
|
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 PYTHADENDRON_TREE = new EndFeature("pythadendron_tree", new PythadendronTreeFeature(), 2);
|
||||||
|
public static final EndFeature LACUGROVE = new EndFeature("lacugrove", new LacugroveFeature(), 3);
|
||||||
|
|
||||||
// Bushes //
|
// Bushes //
|
||||||
public static final EndFeature PYTHADENDRON_BUSH = new EndFeature("pythadendron_bush", new PythadendronBushFeature(), 4);
|
public static final EndFeature PYTHADENDRON_BUSH = new EndFeature("pythadendron_bush", new PythadendronBushFeature(), 4);
|
||||||
|
|
|
@ -21,6 +21,7 @@ public class BiomeMegalake extends EndBiome {
|
||||||
.setSurface(EndBlocks.ENDSTONE_DUST, EndBlocks.END_MOSS)
|
.setSurface(EndBlocks.ENDSTONE_DUST, EndBlocks.END_MOSS)
|
||||||
.addStructureFeature(EndStructures.MEGALAKE)
|
.addStructureFeature(EndStructures.MEGALAKE)
|
||||||
.addStructureFeature(ConfiguredStructureFeatures.END_CITY)
|
.addStructureFeature(ConfiguredStructureFeatures.END_CITY)
|
||||||
|
.addFeature(EndFeatures.LACUGROVE)
|
||||||
.addFeature(EndFeatures.END_LOTUS)
|
.addFeature(EndFeatures.END_LOTUS)
|
||||||
.addFeature(EndFeatures.END_LOTUS_LEAF)
|
.addFeature(EndFeatures.END_LOTUS_LEAF)
|
||||||
.addFeature(EndFeatures.BUBBLE_CORAL_RARE)
|
.addFeature(EndFeatures.BUBBLE_CORAL_RARE)
|
||||||
|
|
103
src/main/java/ru/betterend/world/features/LacugroveFeature.java
Normal file
103
src/main/java/ru/betterend/world/features/LacugroveFeature.java
Normal 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();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -18,6 +18,7 @@ import ru.betterend.registry.EndTags;
|
||||||
import ru.betterend.util.BlocksHelper;
|
import ru.betterend.util.BlocksHelper;
|
||||||
import ru.betterend.util.MHelper;
|
import ru.betterend.util.MHelper;
|
||||||
import ru.betterend.util.SplineHelper;
|
import ru.betterend.util.SplineHelper;
|
||||||
|
import ru.betterend.util.sdf.PosInfo;
|
||||||
import ru.betterend.util.sdf.SDF;
|
import ru.betterend.util.sdf.SDF;
|
||||||
import ru.betterend.util.sdf.operator.SDFDisplacement;
|
import ru.betterend.util.sdf.operator.SDFDisplacement;
|
||||||
import ru.betterend.util.sdf.operator.SDFScale3D;
|
import ru.betterend.util.sdf.operator.SDFScale3D;
|
||||||
|
@ -27,6 +28,7 @@ import ru.betterend.util.sdf.primitive.SDFSphere;
|
||||||
|
|
||||||
public class PythadendronTreeFeature extends DefaultFeature {
|
public class PythadendronTreeFeature extends DefaultFeature {
|
||||||
private static final Function<BlockState, Boolean> REPLACE;
|
private static final Function<BlockState, Boolean> REPLACE;
|
||||||
|
private static final Function<PosInfo, BlockState> POST;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) {
|
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) -> {
|
SDF function = SplineHelper.buildSDF(spline, 1.7F, 1.1F, (bpos) -> {
|
||||||
return EndBlocks.PYTHADENDRON.bark.getDefaultState();
|
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.setReplaceFunction(REPLACE);
|
||||||
|
function.setPostProcess(POST);
|
||||||
function.fillRecursive(world, pos);
|
function.fillRecursive(world, pos);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -86,39 +82,9 @@ public class PythadendronTreeFeature extends DefaultFeature {
|
||||||
if (depth < 3) {
|
if (depth < 3) {
|
||||||
if (s1) {
|
if (s1) {
|
||||||
leavesBall(world, pos.add(pos1.getX(), pos1.getY(), pos1.getZ()), random, noise);
|
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) {
|
if (s2) {
|
||||||
leavesBall(world, pos.add(pos2.getX(), pos2.getY(), pos2.getZ()), random, noise);
|
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();
|
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();
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"parent": "block/cube_all",
|
||||||
|
"textures": {
|
||||||
|
"all": "betterend:block/lacugrove_log_side"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"parent": "block/cube_all",
|
||||||
|
"textures": {
|
||||||
|
"all": "betterend:block/lacugrove_log_side_2"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"parent": "block/cube_all",
|
||||||
|
"textures": {
|
||||||
|
"all": "betterend:block/lacugrove_log_side_3"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"parent": "block/cube_all",
|
||||||
|
"textures": {
|
||||||
|
"all": "betterend:block/lacugrove_log_side_4"
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue