minecraft-src/net/minecraft/world/level/levelgen/feature/configurations/TreeConfiguration.java
2025-07-04 01:41:11 +03:00

137 lines
5.3 KiB
Java

package net.minecraft.world.level.levelgen.feature.configurations;
import com.google.common.collect.ImmutableList;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import java.util.List;
import java.util.Optional;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.levelgen.feature.featuresize.FeatureSize;
import net.minecraft.world.level.levelgen.feature.foliageplacers.FoliagePlacer;
import net.minecraft.world.level.levelgen.feature.rootplacers.RootPlacer;
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.trunkplacers.TrunkPlacer;
public class TreeConfiguration implements FeatureConfiguration {
public static final Codec<TreeConfiguration> CODEC = RecordCodecBuilder.create(
instance -> instance.group(
BlockStateProvider.CODEC.fieldOf("trunk_provider").forGetter(treeConfiguration -> treeConfiguration.trunkProvider),
TrunkPlacer.CODEC.fieldOf("trunk_placer").forGetter(treeConfiguration -> treeConfiguration.trunkPlacer),
BlockStateProvider.CODEC.fieldOf("foliage_provider").forGetter(treeConfiguration -> treeConfiguration.foliageProvider),
FoliagePlacer.CODEC.fieldOf("foliage_placer").forGetter(treeConfiguration -> treeConfiguration.foliagePlacer),
RootPlacer.CODEC.optionalFieldOf("root_placer").forGetter(treeConfiguration -> treeConfiguration.rootPlacer),
BlockStateProvider.CODEC.fieldOf("dirt_provider").forGetter(treeConfiguration -> treeConfiguration.dirtProvider),
FeatureSize.CODEC.fieldOf("minimum_size").forGetter(treeConfiguration -> treeConfiguration.minimumSize),
TreeDecorator.CODEC.listOf().fieldOf("decorators").forGetter(treeConfiguration -> treeConfiguration.decorators),
Codec.BOOL.fieldOf("ignore_vines").orElse(false).forGetter(treeConfiguration -> treeConfiguration.ignoreVines),
Codec.BOOL.fieldOf("force_dirt").orElse(false).forGetter(treeConfiguration -> treeConfiguration.forceDirt)
)
.apply(instance, TreeConfiguration::new)
);
public final BlockStateProvider trunkProvider;
public final BlockStateProvider dirtProvider;
public final TrunkPlacer trunkPlacer;
public final BlockStateProvider foliageProvider;
public final FoliagePlacer foliagePlacer;
public final Optional<RootPlacer> rootPlacer;
public final FeatureSize minimumSize;
public final List<TreeDecorator> decorators;
public final boolean ignoreVines;
public final boolean forceDirt;
protected TreeConfiguration(
BlockStateProvider trunkProvider,
TrunkPlacer trunkPlacer,
BlockStateProvider foliageProvider,
FoliagePlacer foliagePlacer,
Optional<RootPlacer> rootPlacer,
BlockStateProvider dirtProvider,
FeatureSize minimumSize,
List<TreeDecorator> decorators,
boolean ignoreVines,
boolean forceDirt
) {
this.trunkProvider = trunkProvider;
this.trunkPlacer = trunkPlacer;
this.foliageProvider = foliageProvider;
this.foliagePlacer = foliagePlacer;
this.rootPlacer = rootPlacer;
this.dirtProvider = dirtProvider;
this.minimumSize = minimumSize;
this.decorators = decorators;
this.ignoreVines = ignoreVines;
this.forceDirt = forceDirt;
}
public static class TreeConfigurationBuilder {
public final BlockStateProvider trunkProvider;
private final TrunkPlacer trunkPlacer;
public final BlockStateProvider foliageProvider;
private final FoliagePlacer foliagePlacer;
private final Optional<RootPlacer> rootPlacer;
private BlockStateProvider dirtProvider;
private final FeatureSize minimumSize;
private List<TreeDecorator> decorators = ImmutableList.of();
private boolean ignoreVines;
private boolean forceDirt;
public TreeConfigurationBuilder(
BlockStateProvider trunkProvider,
TrunkPlacer trunkPlacer,
BlockStateProvider foliageProvider,
FoliagePlacer foliagePlacer,
Optional<RootPlacer> rootPlacer,
FeatureSize minimumSize
) {
this.trunkProvider = trunkProvider;
this.trunkPlacer = trunkPlacer;
this.foliageProvider = foliageProvider;
this.dirtProvider = BlockStateProvider.simple(Blocks.DIRT);
this.foliagePlacer = foliagePlacer;
this.rootPlacer = rootPlacer;
this.minimumSize = minimumSize;
}
public TreeConfigurationBuilder(
BlockStateProvider trunkProvider, TrunkPlacer trunkPlacer, BlockStateProvider foliageProvider, FoliagePlacer foliagePlacer, FeatureSize minimumSize
) {
this(trunkProvider, trunkPlacer, foliageProvider, foliagePlacer, Optional.empty(), minimumSize);
}
public TreeConfiguration.TreeConfigurationBuilder dirt(BlockStateProvider dirtProvider) {
this.dirtProvider = dirtProvider;
return this;
}
public TreeConfiguration.TreeConfigurationBuilder decorators(List<TreeDecorator> decorators) {
this.decorators = decorators;
return this;
}
public TreeConfiguration.TreeConfigurationBuilder ignoreVines() {
this.ignoreVines = true;
return this;
}
public TreeConfiguration.TreeConfigurationBuilder forceDirt() {
this.forceDirt = true;
return this;
}
public TreeConfiguration build() {
return new TreeConfiguration(
this.trunkProvider,
this.trunkPlacer,
this.foliageProvider,
this.foliagePlacer,
this.rootPlacer,
this.dirtProvider,
this.minimumSize,
this.decorators,
this.ignoreVines,
this.forceDirt
);
}
}
}