Fixed leaves cascade update, basic structure classes separation
This commit is contained in:
parent
d87b98fcd7
commit
d0135e83e9
16 changed files with 136 additions and 53 deletions
|
@ -13,23 +13,23 @@ import ru.betterend.world.biome.EndBiome;
|
||||||
import ru.betterend.world.features.BlueVineFeature;
|
import ru.betterend.world.features.BlueVineFeature;
|
||||||
import ru.betterend.world.features.CavePlantFeature;
|
import ru.betterend.world.features.CavePlantFeature;
|
||||||
import ru.betterend.world.features.DoublePlantFeature;
|
import ru.betterend.world.features.DoublePlantFeature;
|
||||||
import ru.betterend.world.features.DragonTreeBushFeature;
|
|
||||||
import ru.betterend.world.features.DragonTreeFeature;
|
|
||||||
import ru.betterend.world.features.EndFeature;
|
import ru.betterend.world.features.EndFeature;
|
||||||
import ru.betterend.world.features.EndLakeFeature;
|
|
||||||
import ru.betterend.world.features.EndLilyFeature;
|
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.LacugroveFeature;
|
|
||||||
import ru.betterend.world.features.MossyGlowshroomFeature;
|
|
||||||
import ru.betterend.world.features.PythadendronBushFeature;
|
|
||||||
import ru.betterend.world.features.PythadendronTreeFeature;
|
|
||||||
import ru.betterend.world.features.RoundCaveFeature;
|
|
||||||
import ru.betterend.world.features.SinglePlantFeature;
|
import ru.betterend.world.features.SinglePlantFeature;
|
||||||
import ru.betterend.world.features.UnderwaterPlantFeature;
|
import ru.betterend.world.features.UnderwaterPlantFeature;
|
||||||
import ru.betterend.world.features.VineFeature;
|
import ru.betterend.world.features.VineFeature;
|
||||||
import ru.betterend.world.features.WallPlantFeature;
|
import ru.betterend.world.features.WallPlantFeature;
|
||||||
import ru.betterend.world.features.WallPlantOnLogFeature;
|
import ru.betterend.world.features.WallPlantOnLogFeature;
|
||||||
|
import ru.betterend.world.features.bushes.DragonTreeBushFeature;
|
||||||
|
import ru.betterend.world.features.bushes.PythadendronBushFeature;
|
||||||
|
import ru.betterend.world.features.terrain.EndLakeFeature;
|
||||||
|
import ru.betterend.world.features.terrain.RoundCaveFeature;
|
||||||
|
import ru.betterend.world.features.trees.DragonTreeFeature;
|
||||||
|
import ru.betterend.world.features.trees.LacugroveFeature;
|
||||||
|
import ru.betterend.world.features.trees.MossyGlowshroomFeature;
|
||||||
|
import ru.betterend.world.features.trees.PythadendronTreeFeature;
|
||||||
|
|
||||||
public class EndFeatures {
|
public class EndFeatures {
|
||||||
// Trees //
|
// Trees //
|
||||||
|
|
|
@ -11,7 +11,6 @@ import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.block.Blocks;
|
import net.minecraft.block.Blocks;
|
||||||
import net.minecraft.block.FallingBlock;
|
import net.minecraft.block.FallingBlock;
|
||||||
import net.minecraft.block.LeavesBlock;
|
|
||||||
import net.minecraft.state.property.BooleanProperty;
|
import net.minecraft.state.property.BooleanProperty;
|
||||||
import net.minecraft.state.property.Property;
|
import net.minecraft.state.property.Property;
|
||||||
import net.minecraft.tag.BlockTags;
|
import net.minecraft.tag.BlockTags;
|
||||||
|
@ -287,31 +286,4 @@ public class BlocksHelper {
|
||||||
public static Direction randomHorizontal(Random random) {
|
public static Direction randomHorizontal(Random random) {
|
||||||
return HORIZONTAL[random.nextInt(4)];
|
return HORIZONTAL[random.nextInt(4)];
|
||||||
}
|
}
|
||||||
|
|
||||||
public static BlockState getLeavesState(BlockState state, WorldAccess world, BlockPos pos) {
|
|
||||||
int i = 7;
|
|
||||||
BlockPos.Mutable mutable = new BlockPos.Mutable();
|
|
||||||
Direction[] var5 = Direction.values();
|
|
||||||
int var6 = var5.length;
|
|
||||||
|
|
||||||
for (int var7 = 0; var7 < var6; ++var7) {
|
|
||||||
Direction direction = var5[var7];
|
|
||||||
mutable.set(pos, direction);
|
|
||||||
i = Math.min(i, getDistanceFromLog(world.getBlockState(mutable)) + 1);
|
|
||||||
if (i == 1) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (BlockState) state.with(LeavesBlock.DISTANCE, i);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int getDistanceFromLog(BlockState state) {
|
|
||||||
if (BlockTags.LOGS.contains(state.getBlock())) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return state.getBlock() instanceof LeavesBlock ? (Integer) state.get(LeavesBlock.DISTANCE) : 7;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,10 +29,26 @@ public class PosInfo implements Comparable<PosInfo> {
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public BlockState getState(BlockPos pos) {
|
||||||
|
PosInfo info = blocks.get(pos);
|
||||||
|
if (info == null) {
|
||||||
|
info = add.get(pos);
|
||||||
|
return info == null ? AIR : info.getState();
|
||||||
|
}
|
||||||
|
return info.getState();
|
||||||
|
}
|
||||||
|
|
||||||
public void setState(BlockState state) {
|
public void setState(BlockState state) {
|
||||||
this.state = state;
|
this.state = state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setState(BlockPos pos, BlockState state) {
|
||||||
|
PosInfo info = blocks.get(pos);
|
||||||
|
if (info != null) {
|
||||||
|
info.setState(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public BlockState getState(Direction dir) {
|
public BlockState getState(Direction dir) {
|
||||||
PosInfo info = blocks.get(pos.offset(dir));
|
PosInfo info = blocks.get(pos.offset(dir));
|
||||||
if (info == null) {
|
if (info == null) {
|
||||||
|
|
|
@ -236,8 +236,10 @@ public abstract class SDF {
|
||||||
if (infos.size() > 0) {
|
if (infos.size() > 0) {
|
||||||
Collections.sort(infos);
|
Collections.sort(infos);
|
||||||
infos.forEach((info) -> {
|
infos.forEach((info) -> {
|
||||||
BlockState state = postProcess.apply(info);
|
info.setState(postProcess.apply(info));
|
||||||
BlocksHelper.setWithoutUpdate(world, info.getPos(), state);
|
});
|
||||||
|
infos.forEach((info) -> {
|
||||||
|
BlocksHelper.setWithoutUpdate(world, info.getPos(), info.getState());
|
||||||
});
|
});
|
||||||
|
|
||||||
infos.clear();
|
infos.clear();
|
||||||
|
|
|
@ -20,6 +20,7 @@ import net.minecraft.world.gen.feature.FeatureConfig;
|
||||||
import net.minecraft.world.gen.feature.OreFeatureConfig;
|
import net.minecraft.world.gen.feature.OreFeatureConfig;
|
||||||
import ru.betterend.BetterEnd;
|
import ru.betterend.BetterEnd;
|
||||||
import ru.betterend.blocks.complex.StoneMaterial;
|
import ru.betterend.blocks.complex.StoneMaterial;
|
||||||
|
import ru.betterend.world.features.terrain.OreLayerFeature;
|
||||||
|
|
||||||
public class EndFeature {
|
public class EndFeature {
|
||||||
protected Feature<?> feature;
|
protected Feature<?> feature;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package ru.betterend.world.features;
|
package ru.betterend.world.features.bushes;
|
||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
@ -17,6 +17,7 @@ import ru.betterend.util.sdf.operator.SDFScale3D;
|
||||||
import ru.betterend.util.sdf.operator.SDFSubtraction;
|
import ru.betterend.util.sdf.operator.SDFSubtraction;
|
||||||
import ru.betterend.util.sdf.operator.SDFTranslate;
|
import ru.betterend.util.sdf.operator.SDFTranslate;
|
||||||
import ru.betterend.util.sdf.primitive.SDFSphere;
|
import ru.betterend.util.sdf.primitive.SDFSphere;
|
||||||
|
import ru.betterend.world.features.FullHeightScatterFeature;
|
||||||
|
|
||||||
public class CaveBushFeature extends FullHeightScatterFeature {
|
public class CaveBushFeature extends FullHeightScatterFeature {
|
||||||
public CaveBushFeature(int radius) {
|
public CaveBushFeature(int radius) {
|
|
@ -1,4 +1,4 @@
|
||||||
package ru.betterend.world.features;
|
package ru.betterend.world.features.bushes;
|
||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
@ -18,6 +18,7 @@ import ru.betterend.util.sdf.operator.SDFScale3D;
|
||||||
import ru.betterend.util.sdf.operator.SDFSubtraction;
|
import ru.betterend.util.sdf.operator.SDFSubtraction;
|
||||||
import ru.betterend.util.sdf.operator.SDFTranslate;
|
import ru.betterend.util.sdf.operator.SDFTranslate;
|
||||||
import ru.betterend.util.sdf.primitive.SDFSphere;
|
import ru.betterend.util.sdf.primitive.SDFSphere;
|
||||||
|
import ru.betterend.world.features.InvertedScatterFeature;
|
||||||
|
|
||||||
public class CaveBushFeatureCeil extends InvertedScatterFeature {
|
public class CaveBushFeatureCeil extends InvertedScatterFeature {
|
||||||
public CaveBushFeatureCeil(int radius) {
|
public CaveBushFeatureCeil(int radius) {
|
|
@ -1,4 +1,4 @@
|
||||||
package ru.betterend.world.features;
|
package ru.betterend.world.features.bushes;
|
||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
@ -21,6 +21,7 @@ import ru.betterend.util.sdf.operator.SDFScale3D;
|
||||||
import ru.betterend.util.sdf.operator.SDFSubtraction;
|
import ru.betterend.util.sdf.operator.SDFSubtraction;
|
||||||
import ru.betterend.util.sdf.operator.SDFTranslate;
|
import ru.betterend.util.sdf.operator.SDFTranslate;
|
||||||
import ru.betterend.util.sdf.primitive.SDFSphere;
|
import ru.betterend.util.sdf.primitive.SDFSphere;
|
||||||
|
import ru.betterend.world.features.DefaultFeature;
|
||||||
|
|
||||||
public class DragonTreeBushFeature extends DefaultFeature {
|
public class DragonTreeBushFeature extends DefaultFeature {
|
||||||
private static final Function<BlockState, Boolean> REPLACE;
|
private static final Function<BlockState, Boolean> REPLACE;
|
|
@ -1,4 +1,4 @@
|
||||||
package ru.betterend.world.features;
|
package ru.betterend.world.features.bushes;
|
||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
@ -20,6 +20,7 @@ import ru.betterend.util.sdf.operator.SDFScale3D;
|
||||||
import ru.betterend.util.sdf.operator.SDFSubtraction;
|
import ru.betterend.util.sdf.operator.SDFSubtraction;
|
||||||
import ru.betterend.util.sdf.operator.SDFTranslate;
|
import ru.betterend.util.sdf.operator.SDFTranslate;
|
||||||
import ru.betterend.util.sdf.primitive.SDFSphere;
|
import ru.betterend.util.sdf.primitive.SDFSphere;
|
||||||
|
import ru.betterend.world.features.DefaultFeature;
|
||||||
|
|
||||||
public class PythadendronBushFeature extends DefaultFeature {
|
public class PythadendronBushFeature extends DefaultFeature {
|
||||||
private static final Function<BlockState, Boolean> REPLACE;
|
private static final Function<BlockState, Boolean> REPLACE;
|
|
@ -1,4 +1,4 @@
|
||||||
package ru.betterend.world.features;
|
package ru.betterend.world.features.terrain;
|
||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@ import ru.betterend.registry.EndBlocks;
|
||||||
import ru.betterend.registry.EndTags;
|
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.world.features.DefaultFeature;
|
||||||
|
|
||||||
public class EndLakeFeature extends DefaultFeature {
|
public class EndLakeFeature extends DefaultFeature {
|
||||||
private static final BlockState END_STONE = Blocks.END_STONE.getDefaultState();
|
private static final BlockState END_STONE = Blocks.END_STONE.getDefaultState();
|
|
@ -1,4 +1,4 @@
|
||||||
package ru.betterend.world.features;
|
package ru.betterend.world.features.terrain;
|
||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@ import ru.betterend.util.sdf.SDF;
|
||||||
import ru.betterend.util.sdf.operator.SDFCoordModify;
|
import ru.betterend.util.sdf.operator.SDFCoordModify;
|
||||||
import ru.betterend.util.sdf.operator.SDFScale3D;
|
import ru.betterend.util.sdf.operator.SDFScale3D;
|
||||||
import ru.betterend.util.sdf.primitive.SDFSphere;
|
import ru.betterend.util.sdf.primitive.SDFSphere;
|
||||||
|
import ru.betterend.world.features.DefaultFeature;
|
||||||
|
|
||||||
public class OreLayerFeature extends DefaultFeature {
|
public class OreLayerFeature extends DefaultFeature {
|
||||||
private static final SDFSphere SPHERE;
|
private static final SDFSphere SPHERE;
|
|
@ -1,4 +1,4 @@
|
||||||
package ru.betterend.world.features;
|
package ru.betterend.world.features.terrain;
|
||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
@ -29,6 +29,7 @@ import ru.betterend.util.sdf.operator.SDFSubtraction;
|
||||||
import ru.betterend.util.sdf.operator.SDFTranslate;
|
import ru.betterend.util.sdf.operator.SDFTranslate;
|
||||||
import ru.betterend.util.sdf.primitive.SDFHexPrism;
|
import ru.betterend.util.sdf.primitive.SDFHexPrism;
|
||||||
import ru.betterend.util.sdf.primitive.SDFSphere;
|
import ru.betterend.util.sdf.primitive.SDFSphere;
|
||||||
|
import ru.betterend.world.features.DefaultFeature;
|
||||||
|
|
||||||
public class RoundCaveFeature extends DefaultFeature {
|
public class RoundCaveFeature extends DefaultFeature {
|
||||||
private static final BlockState CAVE_AIR = Blocks.CAVE_AIR.getDefaultState();
|
private static final BlockState CAVE_AIR = Blocks.CAVE_AIR.getDefaultState();
|
|
@ -1,4 +1,4 @@
|
||||||
package ru.betterend.world.features;
|
package ru.betterend.world.features.trees;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
@ -11,6 +11,7 @@ import net.minecraft.block.LeavesBlock;
|
||||||
import net.minecraft.block.Material;
|
import net.minecraft.block.Material;
|
||||||
import net.minecraft.client.util.math.Vector3f;
|
import net.minecraft.client.util.math.Vector3f;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.BlockPos.Mutable;
|
||||||
import net.minecraft.util.math.Direction;
|
import net.minecraft.util.math.Direction;
|
||||||
import net.minecraft.world.StructureWorldAccess;
|
import net.minecraft.world.StructureWorldAccess;
|
||||||
import net.minecraft.world.gen.chunk.ChunkGenerator;
|
import net.minecraft.world.gen.chunk.ChunkGenerator;
|
||||||
|
@ -29,6 +30,7 @@ import ru.betterend.util.sdf.operator.SDFScale3D;
|
||||||
import ru.betterend.util.sdf.operator.SDFSubtraction;
|
import ru.betterend.util.sdf.operator.SDFSubtraction;
|
||||||
import ru.betterend.util.sdf.operator.SDFTranslate;
|
import ru.betterend.util.sdf.operator.SDFTranslate;
|
||||||
import ru.betterend.util.sdf.primitive.SDFSphere;
|
import ru.betterend.util.sdf.primitive.SDFSphere;
|
||||||
|
import ru.betterend.world.features.DefaultFeature;
|
||||||
|
|
||||||
public class DragonTreeFeature extends DefaultFeature {
|
public class DragonTreeFeature extends DefaultFeature {
|
||||||
private static final Function<BlockState, Boolean> REPLACE;
|
private static final Function<BlockState, Boolean> REPLACE;
|
||||||
|
@ -111,13 +113,14 @@ public class DragonTreeFeature extends DefaultFeature {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void leavesBall(StructureWorldAccess world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) {
|
private void leavesBall(StructureWorldAccess world, BlockPos pos, float radius, Random random, OpenSimplexNoise noise) {
|
||||||
SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.DRAGON_TREE_LEAVES.getDefaultState().with(LeavesBlock.DISTANCE, 1));
|
SDF sphere = new SDFSphere().setRadius(radius).setBlock(EndBlocks.DRAGON_TREE_LEAVES.getDefaultState().with(LeavesBlock.DISTANCE, 6));
|
||||||
SDF sub = new SDFScale().setScale(5).setSource(sphere);
|
SDF sub = new SDFScale().setScale(5).setSource(sphere);
|
||||||
sub = new SDFTranslate().setTranslate(0, -radius * 5, 0).setSource(sub);
|
sub = new SDFTranslate().setTranslate(0, -radius * 5, 0).setSource(sub);
|
||||||
sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub);
|
sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(sub);
|
||||||
sphere = new SDFScale3D().setScale(1, 0.5F, 1).setSource(sphere);
|
sphere = new SDFScale3D().setScale(1, 0.5F, 1).setSource(sphere);
|
||||||
sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 1.5F; }).setSource(sphere);
|
sphere = new SDFDisplacement().setFunction((vec) -> { return (float) noise.eval(vec.getX() * 0.2, vec.getY() * 0.2, vec.getZ() * 0.2) * 1.5F; }).setSource(sphere);
|
||||||
sphere = new SDFDisplacement().setFunction((vec) -> { return random.nextFloat() * 3F - 1.5F; }).setSource(sphere);
|
sphere = new SDFDisplacement().setFunction((vec) -> { return random.nextFloat() * 3F - 1.5F; }).setSource(sphere);
|
||||||
|
Mutable mut = new Mutable();
|
||||||
sphere.setPostProcess((info) -> {
|
sphere.setPostProcess((info) -> {
|
||||||
if (random.nextInt(5) == 0) {
|
if (random.nextInt(5) == 0) {
|
||||||
for (Direction dir: Direction.values()) {
|
for (Direction dir: Direction.values()) {
|
||||||
|
@ -126,11 +129,43 @@ public class DragonTreeFeature extends DefaultFeature {
|
||||||
return info.getState();
|
return info.getState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return EndBlocks.DRAGON_TREE.bark.getDefaultState();
|
info.setState(EndBlocks.DRAGON_TREE.bark.getDefaultState());
|
||||||
|
for (int x = -6; x < 7; x++) {
|
||||||
|
int ax = Math.abs(x);
|
||||||
|
mut.setX(x + info.getPos().getX());
|
||||||
|
for (int z = -6; z < 7; z++) {
|
||||||
|
int az = Math.abs(z);
|
||||||
|
mut.setZ(z + info.getPos().getZ());
|
||||||
|
for (int y = -6; y < 7; y++) {
|
||||||
|
int ay = Math.abs(y);
|
||||||
|
int d = ax + ay + az;
|
||||||
|
if (d < 7) {
|
||||||
|
mut.setY(y + info.getPos().getY());
|
||||||
|
BlockState state = info.getState(mut);
|
||||||
|
if (state.getBlock() instanceof LeavesBlock) {
|
||||||
|
int distance = state.get(LeavesBlock.DISTANCE);
|
||||||
|
if (d < distance) {
|
||||||
|
info.setState(mut, state.with(LeavesBlock.DISTANCE, d));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return info.getState();
|
return info.getState();
|
||||||
});
|
});
|
||||||
sphere.fillRecursiveIgnore(world, pos, IGNORE);
|
sphere.fillRecursiveIgnore(world, pos, IGNORE);
|
||||||
|
/*Collection<PosInfo> list = sphere.fillRecursiveIgnore(world, pos, IGNORE);
|
||||||
|
list.forEach((info) -> {
|
||||||
|
if (info.getState().getBlock() instanceof LeavesBlock && info.getState().get(LeavesBlock.DISTANCE) == 6) {
|
||||||
|
BlockState state = BlocksHelper.getLeavesState(info.getState(), world, info.getPos());
|
||||||
|
if (!state.equals(info.getState())) {
|
||||||
|
BlocksHelper.setWithoutUpdate(world, info.getPos(), state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});*/
|
||||||
|
|
||||||
|
|
||||||
if (radius > 5) {
|
if (radius > 5) {
|
||||||
int count = (int) (radius * 2.5F);
|
int count = (int) (radius * 2.5F);
|
|
@ -1,4 +1,4 @@
|
||||||
package ru.betterend.world.features;
|
package ru.betterend.world.features.trees;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
@ -26,6 +26,7 @@ import ru.betterend.util.sdf.operator.SDFDisplacement;
|
||||||
import ru.betterend.util.sdf.operator.SDFSubtraction;
|
import ru.betterend.util.sdf.operator.SDFSubtraction;
|
||||||
import ru.betterend.util.sdf.operator.SDFTranslate;
|
import ru.betterend.util.sdf.operator.SDFTranslate;
|
||||||
import ru.betterend.util.sdf.primitive.SDFSphere;
|
import ru.betterend.util.sdf.primitive.SDFSphere;
|
||||||
|
import ru.betterend.world.features.DefaultFeature;
|
||||||
|
|
||||||
public class LacugroveFeature extends DefaultFeature {
|
public class LacugroveFeature extends DefaultFeature {
|
||||||
private static final Function<BlockState, Boolean> REPLACE;
|
private static final Function<BlockState, Boolean> REPLACE;
|
||||||
|
@ -108,6 +109,7 @@ public class LacugroveFeature extends DefaultFeature {
|
||||||
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 (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 SDFDisplacement().setFunction((vec) -> { return random.nextFloat() * 3F - 1.5F; }).setSource(sphere);
|
||||||
sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius - 2, 0).setSource(sphere));
|
sphere = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius - 2, 0).setSource(sphere));
|
||||||
|
Mutable mut = new Mutable();
|
||||||
sphere.setPostProcess((info) -> {
|
sphere.setPostProcess((info) -> {
|
||||||
if (random.nextInt(5) == 0) {
|
if (random.nextInt(5) == 0) {
|
||||||
for (Direction dir: Direction.values()) {
|
for (Direction dir: Direction.values()) {
|
||||||
|
@ -116,7 +118,29 @@ public class LacugroveFeature extends DefaultFeature {
|
||||||
return info.getState();
|
return info.getState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return EndBlocks.LACUGROVE.bark.getDefaultState();
|
info.setState(EndBlocks.LACUGROVE.bark.getDefaultState());
|
||||||
|
for (int x = -6; x < 7; x++) {
|
||||||
|
int ax = Math.abs(x);
|
||||||
|
mut.setX(x + info.getPos().getX());
|
||||||
|
for (int z = -6; z < 7; z++) {
|
||||||
|
int az = Math.abs(z);
|
||||||
|
mut.setZ(z + info.getPos().getZ());
|
||||||
|
for (int y = -6; y < 7; y++) {
|
||||||
|
int ay = Math.abs(y);
|
||||||
|
int d = ax + ay + az;
|
||||||
|
if (d < 7) {
|
||||||
|
mut.setY(y + info.getPos().getY());
|
||||||
|
BlockState state = info.getState(mut);
|
||||||
|
if (state.getBlock() instanceof LeavesBlock) {
|
||||||
|
int distance = state.get(LeavesBlock.DISTANCE);
|
||||||
|
if (d < distance) {
|
||||||
|
info.setState(mut, state.with(LeavesBlock.DISTANCE, d));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return info.getState();
|
return info.getState();
|
||||||
});
|
});
|
|
@ -1,4 +1,4 @@
|
||||||
package ru.betterend.world.features;
|
package ru.betterend.world.features.trees;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
@ -33,6 +33,7 @@ import ru.betterend.util.sdf.operator.SDFUnion;
|
||||||
import ru.betterend.util.sdf.primitive.SDFCapedCone;
|
import ru.betterend.util.sdf.primitive.SDFCapedCone;
|
||||||
import ru.betterend.util.sdf.primitive.SDFPrimitive;
|
import ru.betterend.util.sdf.primitive.SDFPrimitive;
|
||||||
import ru.betterend.util.sdf.primitive.SDFSphere;
|
import ru.betterend.util.sdf.primitive.SDFSphere;
|
||||||
|
import ru.betterend.world.features.DefaultFeature;
|
||||||
|
|
||||||
public class MossyGlowshroomFeature extends DefaultFeature {
|
public class MossyGlowshroomFeature extends DefaultFeature {
|
||||||
private static final Function<BlockState, Boolean> REPLACE;
|
private static final Function<BlockState, Boolean> REPLACE;
|
|
@ -1,4 +1,4 @@
|
||||||
package ru.betterend.world.features;
|
package ru.betterend.world.features.trees;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
@ -9,6 +9,7 @@ import net.minecraft.block.LeavesBlock;
|
||||||
import net.minecraft.block.Material;
|
import net.minecraft.block.Material;
|
||||||
import net.minecraft.client.util.math.Vector3f;
|
import net.minecraft.client.util.math.Vector3f;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.BlockPos.Mutable;
|
||||||
import net.minecraft.util.math.Direction;
|
import net.minecraft.util.math.Direction;
|
||||||
import net.minecraft.world.StructureWorldAccess;
|
import net.minecraft.world.StructureWorldAccess;
|
||||||
import net.minecraft.world.gen.chunk.ChunkGenerator;
|
import net.minecraft.world.gen.chunk.ChunkGenerator;
|
||||||
|
@ -26,6 +27,7 @@ import ru.betterend.util.sdf.operator.SDFScale3D;
|
||||||
import ru.betterend.util.sdf.operator.SDFSubtraction;
|
import ru.betterend.util.sdf.operator.SDFSubtraction;
|
||||||
import ru.betterend.util.sdf.operator.SDFTranslate;
|
import ru.betterend.util.sdf.operator.SDFTranslate;
|
||||||
import ru.betterend.util.sdf.primitive.SDFSphere;
|
import ru.betterend.util.sdf.primitive.SDFSphere;
|
||||||
|
import ru.betterend.world.features.DefaultFeature;
|
||||||
|
|
||||||
public class PythadendronTreeFeature extends DefaultFeature {
|
public class PythadendronTreeFeature extends DefaultFeature {
|
||||||
private static final Function<BlockState, Boolean> REPLACE;
|
private static final Function<BlockState, Boolean> REPLACE;
|
||||||
|
@ -112,6 +114,7 @@ public class PythadendronTreeFeature extends DefaultFeature {
|
||||||
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 (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 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 = new SDFSubtraction().setSourceA(sphere).setSourceB(new SDFTranslate().setTranslate(0, -radius, 0).setSource(sphere));
|
||||||
|
Mutable mut = new Mutable();
|
||||||
sphere.setPostProcess((info) -> {
|
sphere.setPostProcess((info) -> {
|
||||||
if (random.nextInt(5) == 0) {
|
if (random.nextInt(5) == 0) {
|
||||||
for (Direction dir: Direction.values()) {
|
for (Direction dir: Direction.values()) {
|
||||||
|
@ -120,7 +123,29 @@ public class PythadendronTreeFeature extends DefaultFeature {
|
||||||
return info.getState();
|
return info.getState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return EndBlocks.PYTHADENDRON.bark.getDefaultState();
|
info.setState(EndBlocks.PYTHADENDRON.bark.getDefaultState());
|
||||||
|
for (int x = -6; x < 7; x++) {
|
||||||
|
int ax = Math.abs(x);
|
||||||
|
mut.setX(x + info.getPos().getX());
|
||||||
|
for (int z = -6; z < 7; z++) {
|
||||||
|
int az = Math.abs(z);
|
||||||
|
mut.setZ(z + info.getPos().getZ());
|
||||||
|
for (int y = -6; y < 7; y++) {
|
||||||
|
int ay = Math.abs(y);
|
||||||
|
int d = ax + ay + az;
|
||||||
|
if (d < 7) {
|
||||||
|
mut.setY(y + info.getPos().getY());
|
||||||
|
BlockState state = info.getState(mut);
|
||||||
|
if (state.getBlock() instanceof LeavesBlock) {
|
||||||
|
int distance = state.get(LeavesBlock.DISTANCE);
|
||||||
|
if (d < distance) {
|
||||||
|
info.setState(mut, state.with(LeavesBlock.DISTANCE, d));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return info.getState();
|
return info.getState();
|
||||||
});
|
});
|
Loading…
Add table
Add a link
Reference in a new issue