Started Feature Migration in BN
This commit is contained in:
parent
2168787ac2
commit
abe18ae923
9 changed files with 142 additions and 34 deletions
|
@ -1,7 +1,7 @@
|
||||||
# Done to increase the memory available to gradle.
|
# Done to increase the memory available to gradle.
|
||||||
org.gradle.jvmargs=-Xmx2G
|
org.gradle.jvmargs=-Xmx2G
|
||||||
#Loom
|
#Loom
|
||||||
loom_version=0.11-SNAPSHOT
|
loom_version=0.12-SNAPSHOT
|
||||||
# Fabric Properties
|
# Fabric Properties
|
||||||
# check these on https://fabricmc.net/versions.html
|
# check these on https://fabricmc.net/versions.html
|
||||||
minecraft_version=1.19-pre3
|
minecraft_version=1.19-pre3
|
||||||
|
|
|
@ -40,7 +40,12 @@ public class BCLCommonFeatures {
|
||||||
int density,
|
int density,
|
||||||
boolean allHeight) {
|
boolean allHeight) {
|
||||||
if (allHeight) {
|
if (allHeight) {
|
||||||
return BCLFeatureBuilder.start(id, feature).countLayers(density).squarePlacement().onlyInBiome().build();
|
return BCLFeatureBuilder
|
||||||
|
.start(id, feature)
|
||||||
|
.countLayers(density)
|
||||||
|
.squarePlacement()
|
||||||
|
.onlyInBiome()
|
||||||
|
.buildAndRegister();
|
||||||
} else {
|
} else {
|
||||||
return BCLFeatureBuilder
|
return BCLFeatureBuilder
|
||||||
.start(id, feature)
|
.start(id, feature)
|
||||||
|
@ -48,7 +53,7 @@ public class BCLCommonFeatures {
|
||||||
.squarePlacement()
|
.squarePlacement()
|
||||||
.heightmap()
|
.heightmap()
|
||||||
.onlyInBiome()
|
.onlyInBiome()
|
||||||
.build();
|
.buildAndRegister();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,7 +68,7 @@ public class BCLCommonFeatures {
|
||||||
public static BCLFeature makeChunkFeature(ResourceLocation id,
|
public static BCLFeature makeChunkFeature(ResourceLocation id,
|
||||||
Decoration decoration,
|
Decoration decoration,
|
||||||
Feature<NoneFeatureConfiguration> feature) {
|
Feature<NoneFeatureConfiguration> feature) {
|
||||||
return BCLFeatureBuilder.start(id, feature).decoration(decoration).count(1).onlyInBiome().build();
|
return BCLFeatureBuilder.start(id, feature).decoration(decoration).count(1).onlyInBiome().buildAndRegister();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -84,7 +89,7 @@ public class BCLCommonFeatures {
|
||||||
.oncePerChunks(chance)
|
.oncePerChunks(chance)
|
||||||
.squarePlacement()
|
.squarePlacement()
|
||||||
.onlyInBiome()
|
.onlyInBiome()
|
||||||
.build();
|
.buildAndRegister();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -105,7 +110,7 @@ public class BCLCommonFeatures {
|
||||||
.count(count)
|
.count(count)
|
||||||
.squarePlacement()
|
.squarePlacement()
|
||||||
.onlyInBiome()
|
.onlyInBiome()
|
||||||
.build();
|
.buildAndRegister();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -140,7 +145,7 @@ public class BCLCommonFeatures {
|
||||||
|
|
||||||
builder.modifier(placement).squarePlacement().onlyInBiome();
|
builder.modifier(placement).squarePlacement().onlyInBiome();
|
||||||
|
|
||||||
return builder.build(new OreConfiguration(
|
return builder.buildAndRegister(new OreConfiguration(
|
||||||
new BlockMatchTest(hostBlock),
|
new BlockMatchTest(hostBlock),
|
||||||
blockOre.defaultBlockState(),
|
blockOre.defaultBlockState(),
|
||||||
veinSize,
|
veinSize,
|
||||||
|
|
|
@ -132,17 +132,33 @@ public class BCLFeatureBuilder<FC extends FeatureConfiguration, F extends Featur
|
||||||
return modifier(InSquarePlacement.spread());
|
return modifier(InSquarePlacement.spread());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public BCLFeatureBuilder distanceToTopAndBottom10() {
|
||||||
|
return modifier(PlacementUtils.RANGE_10_10);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BCLFeatureBuilder distanceToTopAndBottom4() {
|
||||||
|
return modifier(PlacementUtils.RANGE_4_4);
|
||||||
|
}
|
||||||
|
|
||||||
public BCLFeatureBuilder heightmap() {
|
public BCLFeatureBuilder heightmap() {
|
||||||
return modifier(PlacementUtils.HEIGHTMAP);
|
return modifier(PlacementUtils.HEIGHTMAP);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public BCLFeatureBuilder heightmapTopSolid() {
|
||||||
|
return modifier(PlacementUtils.HEIGHTMAP_TOP_SOLID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BCLFeatureBuilder heightmapWorldSurface() {
|
||||||
|
return modifier(PlacementUtils.HEIGHTMAP_WORLD_SURFACE);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Builds a new {@link BCLFeature} instance. Features will be registered during this process.
|
* Builds a new {@link BCLFeature} instance. Features will be registered during this process.
|
||||||
*
|
*
|
||||||
* @param configuration any {@link FeatureConfiguration} for provided {@link Feature}.
|
* @param configuration any {@link FeatureConfiguration} for provided {@link Feature}.
|
||||||
* @return created {@link BCLFeature} instance.
|
* @return created {@link BCLFeature} instance.
|
||||||
*/
|
*/
|
||||||
public BCLFeature build(FC configuration) {
|
public BCLFeature buildAndRegister(FC configuration) {
|
||||||
PlacementModifier[] modifiers = modifications.toArray(new PlacementModifier[modifications.size()]);
|
PlacementModifier[] modifiers = modifications.toArray(new PlacementModifier[modifications.size()]);
|
||||||
return new BCLFeature(featureID, feature, decoration, configuration, modifiers);
|
return new BCLFeature(featureID, feature, decoration, configuration, modifiers);
|
||||||
}
|
}
|
||||||
|
@ -153,7 +169,17 @@ public class BCLFeatureBuilder<FC extends FeatureConfiguration, F extends Featur
|
||||||
*
|
*
|
||||||
* @return created {@link BCLFeature} instance.
|
* @return created {@link BCLFeature} instance.
|
||||||
*/
|
*/
|
||||||
|
public BCLFeature buildAndRegister() {
|
||||||
|
return buildAndRegister((FC) FeatureConfiguration.NONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated(forRemoval = true)
|
||||||
|
public BCLFeature build(FC configuration) {
|
||||||
|
return buildAndRegister(configuration);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated(forRemoval = true)
|
||||||
public BCLFeature build() {
|
public BCLFeature build() {
|
||||||
return build((FC) FeatureConfiguration.NONE);
|
return buildAndRegister();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,11 +4,13 @@ import net.minecraft.core.Holder;
|
||||||
import net.minecraft.core.Registry;
|
import net.minecraft.core.Registry;
|
||||||
import net.minecraft.resources.RegistryOps;
|
import net.minecraft.resources.RegistryOps;
|
||||||
import net.minecraft.resources.ResourceKey;
|
import net.minecraft.resources.ResourceKey;
|
||||||
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.world.level.biome.BiomeSource;
|
import net.minecraft.world.level.biome.BiomeSource;
|
||||||
import net.minecraft.world.level.chunk.ChunkGenerator;
|
import net.minecraft.world.level.chunk.ChunkGenerator;
|
||||||
import net.minecraft.world.level.dimension.LevelStem;
|
import net.minecraft.world.level.dimension.LevelStem;
|
||||||
import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator;
|
import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator;
|
||||||
import net.minecraft.world.level.levelgen.NoiseGeneratorSettings;
|
import net.minecraft.world.level.levelgen.NoiseGeneratorSettings;
|
||||||
|
import net.minecraft.world.level.levelgen.RandomState;
|
||||||
import net.minecraft.world.level.levelgen.WorldGenSettings;
|
import net.minecraft.world.level.levelgen.WorldGenSettings;
|
||||||
import net.minecraft.world.level.levelgen.structure.StructureSet;
|
import net.minecraft.world.level.levelgen.structure.StructureSet;
|
||||||
import net.minecraft.world.level.levelgen.synth.NormalNoise;
|
import net.minecraft.world.level.levelgen.synth.NormalNoise;
|
||||||
|
@ -116,4 +118,14 @@ public class BCLChunkGenerator extends NoiseBasedChunkGenerator {
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "BCLib - Chunk Generator (" + Integer.toHexString(hashCode()) + ")";
|
return "BCLib - Chunk Generator (" + Integer.toHexString(hashCode()) + ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static RandomState createRandomState(ServerLevel level, ChunkGenerator generator) {
|
||||||
|
if (generator instanceof NoiseBasedChunkGenerator noiseBasedChunkGenerator) {
|
||||||
|
return RandomState.create(noiseBasedChunkGenerator.generatorSettings().value(),
|
||||||
|
level.registryAccess().registryOrThrow(Registry.NOISE_REGISTRY),
|
||||||
|
level.getSeed());
|
||||||
|
} else {
|
||||||
|
return RandomState.create(level.registryAccess(), NoiseGeneratorSettings.OVERWORLD, level.getSeed());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,9 @@ import net.minecraft.world.level.block.state.properties.Property;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
public class BlocksHelper {
|
public class BlocksHelper {
|
||||||
private static final Map<Block, Integer> COLOR_BY_BLOCK = Maps.newHashMap();
|
private static final Map<Block, Integer> COLOR_BY_BLOCK = Maps.newHashMap();
|
||||||
|
@ -201,4 +203,16 @@ public class BlocksHelper {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Optional<BlockPos> findSurface(LevelAccessor level,
|
||||||
|
BlockPos startPos,
|
||||||
|
int minY,
|
||||||
|
Predicate<BlockState> surface) {
|
||||||
|
final MutableBlockPos POS = new MutableBlockPos(startPos.getX(), startPos.getY(), startPos.getZ());
|
||||||
|
for (int y = startPos.getY(); y >= minY; y--) {
|
||||||
|
POS.setY(y);
|
||||||
|
if (surface.test(level.getBlockState(POS))) return Optional.of(POS);
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,6 @@ import com.google.gson.JsonElement;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import com.google.gson.JsonParser;
|
import com.google.gson.JsonParser;
|
||||||
import com.google.gson.stream.JsonReader;
|
import com.google.gson.stream.JsonReader;
|
||||||
import org.apache.logging.log4j.LogManager;
|
|
||||||
import org.betterx.bclib.BCLib;
|
import org.betterx.bclib.BCLib;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -48,7 +47,6 @@ public class ModUtil {
|
||||||
if (mods != null) return mods;
|
if (mods != null) return mods;
|
||||||
|
|
||||||
mods = new HashMap<>();
|
mods = new HashMap<>();
|
||||||
org.apache.logging.log4j.Logger logger = LogManager.getFormatterLogger("BCLib|ModLoader");
|
|
||||||
PathUtil.fileWalker(PathUtil.MOD_FOLDER.toFile(), false, (ModUtil::accept));
|
PathUtil.fileWalker(PathUtil.MOD_FOLDER.toFile(), false, (ModUtil::accept));
|
||||||
|
|
||||||
return mods;
|
return mods;
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
package org.betterx.bclib.world.features;
|
||||||
|
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
import net.minecraft.world.level.levelgen.Heightmap;
|
||||||
|
import net.minecraft.world.level.levelgen.feature.Feature;
|
||||||
|
import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
|
||||||
|
import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration;
|
||||||
|
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
|
||||||
|
|
||||||
|
import com.mojang.serialization.Codec;
|
||||||
|
import org.betterx.bclib.util.BlocksHelper;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public abstract class SurfaceFeature<T extends FeatureConfiguration> extends Feature<T> {
|
||||||
|
public static abstract class DefaultConfiguration extends SurfaceFeature<NoneFeatureConfiguration> {
|
||||||
|
protected DefaultConfiguration() {
|
||||||
|
super(NoneFeatureConfiguration.CODEC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected SurfaceFeature(Codec<T> codec) {
|
||||||
|
super(codec);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract boolean isValidSurface(BlockState state);
|
||||||
|
|
||||||
|
protected int minHeight(FeaturePlaceContext<T> ctx) {
|
||||||
|
return ctx.chunkGenerator().getSeaLevel();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean place(FeaturePlaceContext<T> ctx) {
|
||||||
|
Optional<BlockPos> pos = BlocksHelper.findSurface(ctx.level(),
|
||||||
|
ctx.origin(),
|
||||||
|
minHeight(ctx),
|
||||||
|
this::isValidSurface);
|
||||||
|
if (pos.isPresent()) {
|
||||||
|
int y2 = ctx.level().getHeight(Heightmap.Types.WORLD_SURFACE_WG, ctx.origin().getX(), ctx.origin().getZ());
|
||||||
|
int y3 = ctx.level().getHeight(Heightmap.Types.WORLD_SURFACE, ctx.origin().getX(), ctx.origin().getZ());
|
||||||
|
System.out.println("Surfaces:" + pos.get().getY() + ", " + y2 + ", " + y3);
|
||||||
|
|
||||||
|
generate(pos.get(), ctx);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract void generate(BlockPos centerPos, FeaturePlaceContext<T> ctx);
|
||||||
|
}
|
|
@ -34,23 +34,23 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource {
|
||||||
public static final Codec<BCLibNetherBiomeSource> CODEC = RecordCodecBuilder
|
public static final Codec<BCLibNetherBiomeSource> CODEC = RecordCodecBuilder
|
||||||
.create(instance -> instance
|
.create(instance -> instance
|
||||||
.group(RegistryOps
|
.group(RegistryOps
|
||||||
.retrieveRegistry(Registry.BIOME_REGISTRY)
|
.retrieveRegistry(Registry.BIOME_REGISTRY)
|
||||||
.forGetter(source -> source.biomeRegistry),
|
.forGetter(source -> source.biomeRegistry),
|
||||||
Codec
|
Codec
|
||||||
.LONG
|
.LONG
|
||||||
.fieldOf("seed")
|
.fieldOf("seed")
|
||||||
.stable()
|
.stable()
|
||||||
.forGetter(source -> {
|
.forGetter(source -> {
|
||||||
return source.currentSeed;
|
return source.currentSeed;
|
||||||
}),
|
}),
|
||||||
Codec
|
Codec
|
||||||
.INT
|
.INT
|
||||||
.optionalFieldOf("version")
|
.optionalFieldOf("version")
|
||||||
.stable()
|
.stable()
|
||||||
.forGetter(source -> Optional.of(source.biomeSourceVersion))
|
.forGetter(source -> Optional.of(source.biomeSourceVersion))
|
||||||
)
|
)
|
||||||
.apply(instance, instance.stable(BCLibNetherBiomeSource::new))
|
.apply(instance, instance.stable(BCLibNetherBiomeSource::new))
|
||||||
);
|
);
|
||||||
private BiomeMap biomeMap;
|
private BiomeMap biomeMap;
|
||||||
private final BiomePicker biomePicker;
|
private final BiomePicker biomePicker;
|
||||||
|
|
||||||
|
@ -104,10 +104,10 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource {
|
||||||
protected BCLBiomeSource cloneForDatapack(Set<Holder<Biome>> datapackBiomes) {
|
protected BCLBiomeSource cloneForDatapack(Set<Holder<Biome>> datapackBiomes) {
|
||||||
datapackBiomes.addAll(getBclBiomes(this.biomeRegistry));
|
datapackBiomes.addAll(getBclBiomes(this.biomeRegistry));
|
||||||
return new BCLibNetherBiomeSource(this.biomeRegistry,
|
return new BCLibNetherBiomeSource(this.biomeRegistry,
|
||||||
datapackBiomes.stream().toList(),
|
datapackBiomes.stream().toList(),
|
||||||
this.currentSeed,
|
this.currentSeed,
|
||||||
Optional.of(biomeSourceVersion),
|
Optional.of(biomeSourceVersion),
|
||||||
true);
|
true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -165,7 +165,6 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource {
|
||||||
public Holder<Biome> getNoiseBiome(int biomeX, int biomeY, int biomeZ, Climate.Sampler var4) {
|
public Holder<Biome> getNoiseBiome(int biomeX, int biomeY, int biomeZ, Climate.Sampler var4) {
|
||||||
if (biomeMap == null)
|
if (biomeMap == null)
|
||||||
return this.possibleBiomes().stream().findFirst().get();
|
return this.possibleBiomes().stream().findFirst().get();
|
||||||
|
|
||||||
if (lastWorldHeight != worldHeight) {
|
if (lastWorldHeight != worldHeight) {
|
||||||
lastWorldHeight = worldHeight;
|
lastWorldHeight = worldHeight;
|
||||||
initMap(this.currentSeed);
|
initMap(this.currentSeed);
|
||||||
|
@ -198,8 +197,8 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource {
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
this.biomeMap = mapConstructor.apply(seed,
|
this.biomeMap = mapConstructor.apply(seed,
|
||||||
GeneratorOptions.getBiomeSizeNether(),
|
GeneratorOptions.getBiomeSizeNether(),
|
||||||
biomePicker);
|
biomePicker);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@ public class HexBiomeMap implements BiomeMap {
|
||||||
this.picker = picker;
|
this.picker = picker;
|
||||||
this.scale = HexBiomeChunk.scaleMap(size);
|
this.scale = HexBiomeChunk.scaleMap(size);
|
||||||
Random random = new Random(seed);
|
Random random = new Random(seed);
|
||||||
|
|
||||||
noises[0] = new OpenSimplexNoise(random.nextInt());
|
noises[0] = new OpenSimplexNoise(random.nextInt());
|
||||||
noises[1] = new OpenSimplexNoise(random.nextInt());
|
noises[1] = new OpenSimplexNoise(random.nextInt());
|
||||||
noiseIterations = (byte) Math.min(Math.ceil(Math.log(scale) / Math.log(2)), 5);
|
noiseIterations = (byte) Math.min(Math.ceil(Math.log(scale) / Math.log(2)), 5);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue