Skip to content

Commit

Permalink
Flail with ancient tree stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
quat1024 committed Dec 1, 2023
1 parent 3a32c0c commit b29eadd
Show file tree
Hide file tree
Showing 3 changed files with 120 additions and 85 deletions.
Original file line number Diff line number Diff line change
@@ -1,40 +1,28 @@
package org.violetmoon.quark.content.world.block;

import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import net.minecraft.core.BlockPos;
import net.minecraft.core.registries.Registries;
import net.minecraft.data.worldgen.BootstapContext;
import net.minecraft.resources.ResourceKey;
import net.minecraft.util.RandomSource;
import net.minecraft.util.valueproviders.ConstantInt;
import net.minecraft.util.valueproviders.UniformInt;
import net.minecraft.world.level.LevelSimulatedReader;
import net.minecraft.world.level.block.grower.AbstractTreeGrower;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
import net.minecraft.world.level.levelgen.feature.Feature;
import net.minecraft.world.level.levelgen.feature.configurations.TreeConfiguration;
import net.minecraft.world.level.levelgen.feature.featuresize.TwoLayersFeatureSize;
import net.minecraft.world.level.levelgen.feature.foliageplacers.FancyFoliagePlacer;
import net.minecraft.world.level.levelgen.feature.foliageplacers.FoliagePlacer;
import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProvider;
import net.minecraft.world.level.levelgen.feature.treedecorators.TreeDecorator;
import net.minecraft.world.level.levelgen.feature.treedecorators.TreeDecoratorType;
import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacer;
import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacerType;
import org.violetmoon.quark.base.Quark;
import org.violetmoon.quark.content.world.feature.AncientTreeTopperDecorator;
import org.violetmoon.quark.content.world.feature.MultiFoliageStraightTrunkPlacer;
import org.violetmoon.quark.content.world.module.AncientWoodModule;
import org.violetmoon.zeta.block.ZetaSaplingBlock;
import org.violetmoon.zeta.module.ZetaModule;

import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.OptionalInt;
import java.util.function.BiConsumer;
import java.util.stream.Collectors;

public class AncientSaplingBlock extends ZetaSaplingBlock {

Expand All @@ -49,7 +37,7 @@ public static class AncientTree extends AbstractTreeGrower {
public AncientTree() {
config = (new TreeConfiguration.TreeConfigurationBuilder(
BlockStateProvider.simple(AncientWoodModule.woodSet.log),
new MultiFolliageStraightTrunkPlacer(17, 4, 6, 5, 3),
new MultiFoliageStraightTrunkPlacer(17, 4, 6, 5, 3),
BlockStateProvider.simple(AncientWoodModule.ancient_leaves),
new FancyFoliagePlacer(UniformInt.of(2, 4), ConstantInt.of(-3) , 2),
new TwoLayersFeatureSize(0, 0, 0, OptionalInt.of(4))))
Expand All @@ -70,75 +58,5 @@ public void bootstrap(BootstapContext<ConfiguredFeature<?, ?>> context) {
context.register(ANCIENT_TREE, new ConfiguredFeature<>(Feature.TREE, config));
}
}

public static class MultiFolliageStraightTrunkPlacer extends TrunkPlacer {

final int folliageDistance;
final int maxBlobs;

public MultiFolliageStraightTrunkPlacer(int baseHeight, int heightRandA, int heightRandB, int folliageDistance, int maxBlobs) {
super(baseHeight, heightRandA, heightRandB);
this.folliageDistance = folliageDistance;
this.maxBlobs = maxBlobs;
}

@Override
public List<FoliagePlacer.FoliageAttachment> placeTrunk(LevelSimulatedReader p_226147_, BiConsumer<BlockPos, BlockState> p_226148_, RandomSource p_226149_, int p_226150_, BlockPos p_226151_, TreeConfiguration p_226152_) {
setDirtAt(p_226147_, p_226148_, p_226149_, p_226151_.below(), p_226152_);

List<BlockPos> folliagePositions = new ArrayList<>();

int placed = 0;
int j = 0;
for(int i = p_226150_; i >= 0; --i) {
BlockPos target = p_226151_.above(i);
this.placeLog(p_226147_, p_226148_, p_226149_, target, p_226152_);

if(placed < maxBlobs) {
if(j == 0) {
folliagePositions.add(target);
j = folliageDistance;
placed++;
} else j--;
}

}

return folliagePositions.stream().map(p -> new FoliagePlacer.FoliageAttachment(p, 0, false)).collect(Collectors.toList());
}

@Override
protected TrunkPlacerType<?> type() {
return null;
}
}

public static class AncientTreeTopperDecorator extends TreeDecorator {

@Override
public void place(Context ctx) {
Optional<BlockPos> pos = ctx.logs().stream().max((a, b) -> a.getY() - b.getY());
if(pos.isPresent()) {
BlockPos top = pos.get();

ImmutableSet<BlockPos> leafPos = ImmutableSet.of(
top.above(), top.east(), top.west(), top.north(), top.south()
);

BlockState state = AncientWoodModule.ancient_leaves.defaultBlockState();
leafPos.forEach(p -> {
if(ctx.isAir(p))
ctx.setBlock(p, state);
});
}
}

@Override
protected TreeDecoratorType<?> type() {
return null;
}


}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package org.violetmoon.quark.content.world.feature;

import java.util.Comparator;
import java.util.Optional;

import com.google.common.collect.ImmutableSet;
import com.mojang.serialization.Codec;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Vec3i;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.feature.treedecorators.TreeDecorator;
import net.minecraft.world.level.levelgen.feature.treedecorators.TreeDecoratorType;
import org.violetmoon.quark.content.world.module.AncientWoodModule;

//for Ancient Trees, TODO register me
public class AncientTreeTopperDecorator extends TreeDecorator {

public static final Codec<AncientTreeTopperDecorator> CODEC = Codec.unit(AncientTreeTopperDecorator::new);
public static final TreeDecoratorType<AncientTreeTopperDecorator> TYPE = new TreeDecoratorType<>(CODEC);

//TODO register me
@Override
protected TreeDecoratorType<?> type() {
//return TYPE;
return null;
}

@Override
public void place(Context ctx) {
Optional<BlockPos> highestLog = ctx.logs().stream().max(Comparator.comparingInt(Vec3i::getY));
if(highestLog.isPresent()) {
BlockPos top = highestLog.get();

ImmutableSet<BlockPos> leafPos = ImmutableSet.of(
top.above(), top.east(), top.west(), top.north(), top.south()
);

BlockState state = AncientWoodModule.ancient_leaves.defaultBlockState();
leafPos.forEach(p -> {
if(ctx.isAir(p))
ctx.setBlock(p, state);
});
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package org.violetmoon.quark.content.world.feature;

import java.util.ArrayList;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.stream.Collectors;

import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.core.BlockPos;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.LevelSimulatedReader;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.feature.configurations.TreeConfiguration;
import net.minecraft.world.level.levelgen.feature.foliageplacers.FoliagePlacer;
import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacer;
import net.minecraft.world.level.levelgen.feature.trunkplacers.TrunkPlacerType;

//for Ancient Saplings, TODO register me
public class MultiFoliageStraightTrunkPlacer extends TrunkPlacer {
final int foliageDistance;
final int maxBlobs;

public MultiFoliageStraightTrunkPlacer(int baseHeight, int heightRandA, int heightRandB, int foliageDistance, int maxBlobs) {
super(baseHeight, heightRandA, heightRandB);
this.foliageDistance = foliageDistance;
this.maxBlobs = maxBlobs;
}

public static final Codec<MultiFoliageStraightTrunkPlacer> CODEC = RecordCodecBuilder.create(overengineered ->
trunkPlacerParts(overengineered).and(
overengineered.group(
Codec.INT.fieldOf("foliageDistance").forGetter(x -> x.foliageDistance),
Codec.INT.fieldOf("maxBlobs").forGetter(x -> x.maxBlobs)
)
).apply(overengineered, MultiFoliageStraightTrunkPlacer::new));

//TODO: register me
public static final TrunkPlacerType<MultiFoliageStraightTrunkPlacer> TYPE = new TrunkPlacerType<>(CODEC);

@Override
protected TrunkPlacerType<?> type() {
//return TYPE;
return null;
}

@Override
public List<FoliagePlacer.FoliageAttachment> placeTrunk(LevelSimulatedReader level, BiConsumer<BlockPos, BlockState> placer, RandomSource random, int idk, BlockPos rootPos, TreeConfiguration cfg) {
setDirtAt(level, placer, random, rootPos.below(), cfg);

List<BlockPos> folliagePositions = new ArrayList<>();

int placed = 0;
int j = 0;
for(int i = idk; i >= 0; --i) {
BlockPos target = rootPos.above(i);
this.placeLog(level, placer, random, target, cfg);

if(placed < maxBlobs) {
if(j == 0) {
folliagePositions.add(target);
j = foliageDistance;
placed++;
} else j--;
}

}

return folliagePositions.stream().map(p -> new FoliagePlacer.FoliageAttachment(p, 0, false)).collect(Collectors.toList());
}
}

0 comments on commit b29eadd

Please sign in to comment.