Adapted StructureAPI for 1.19

This commit is contained in:
Frank 2022-05-13 19:58:15 +02:00
parent c7117fa180
commit b7a74e971b
8 changed files with 102 additions and 42 deletions

View file

@ -14,15 +14,9 @@ import net.minecraft.tags.TagKey;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.Mob;
import net.minecraft.world.level.biome.AmbientAdditionsSettings;
import net.minecraft.world.level.biome.AmbientMoodSettings;
import net.minecraft.world.level.biome.AmbientParticleSettings;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.*;
import net.minecraft.world.level.biome.Biome.BiomeBuilder;
import net.minecraft.world.level.biome.Biome.Precipitation;
import net.minecraft.world.level.biome.BiomeGenerationSettings;
import net.minecraft.world.level.biome.BiomeSpecialEffects;
import net.minecraft.world.level.biome.MobSpawnSettings;
import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
@ -67,6 +61,8 @@ public class BCLBiomeBuilder {
private Precipitation precipitation;
private ResourceLocation biomeID;
private List<Climate.ParameterPoint> parameters = Lists.newArrayList();
//BiomeTags.IS_NETHER
private float temperature;
private float fogDensity;
@ -99,8 +95,14 @@ public class BCLBiomeBuilder {
INSTANCE.vertical = false;
INSTANCE.edge = null;
INSTANCE.carvers.clear();
INSTANCE.parameters.clear();
return INSTANCE;
}
public BCLBiomeBuilder addNetherClimateParamater(float temperature, float humidity){
parameters.add(Climate.parameters(temperature, humidity, 0,0,0,0,0));
return this;
}
/**
* Set biome {@link Precipitation}. Affect biome visual effects (rain, snow, none).
@ -695,6 +697,7 @@ public class BCLBiomeBuilder {
final T res = biomeConstructor.apply(biomeID, biome, settings);
res.attachStructures(structureTags);
res.setSurface(surfaceRule);
res.addClimateParameters(parameters);
//carvers.forEach(cfg -> BiomeAPI.addBiomeCarver(biome, cfg.second, cfg.first));
return res;

View file

@ -192,20 +192,9 @@ public class BiomeAPI {
public static BCLBiome registerNetherBiome(BCLBiome biome) {
registerBiome(biome);
NETHER_BIOME_PICKER.addBiome(biome);
Random random = new Random(biome.getID().hashCode());
//temperature, humidity, continentalness, erosion, depth, weirdness, offset
Climate.ParameterPoint parameters = Climate.parameters(
MHelper.randRange(-1.5F, 1.5F, random),
MHelper.randRange(-1.5F, 1.5F, random),
MHelper.randRange(-1.5F, 1.5F, random), //new in 1.18
MHelper.randRange(-1.5F, 1.5F, random), //new in 1.18
MHelper.randRange(-1.5F, 1.5F, random),
MHelper.randRange(-1.5F, 1.5F, random),
random.nextFloat()
);
ResourceKey<Biome> key = BiomeAPI.getBiomeKeyOrThrow(biome.getBiomeHolder());
NetherBiomeData.addNetherBiome(key, parameters);
biome.forEachClimateParameter(p -> NetherBiomeData.addNetherBiome(key, p));
return biome;
}

View file

@ -7,6 +7,7 @@ import net.minecraft.resources.ResourceKey;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.WorldStem;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.progress.ChunkProgressListener;
import net.minecraft.server.level.progress.ChunkProgressListenerFactory;
import net.minecraft.server.packs.repository.PackRepository;
import net.minecraft.server.players.GameProfileCache;
@ -61,4 +62,9 @@ public class MinecraftServerMixin {
accessor.bclib_setRecipesByName(BCLRecipeManager.getMapByName(accessor.bclib_getRecipesByName()));
accessor.bclib_setRecipes(BCLRecipeManager.getMap(accessor.bclib_getRecipes()));
}
@Inject(method = "createLevels", at = @At(value = "HEAD"))
private void bcl_createLevel(ChunkProgressListener chunkProgressListener, CallbackInfo ci){
System.out.println(this.worldData);
}
}

View file

@ -20,6 +20,7 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import ru.bclib.api.LifeCycleAPI;
import ru.bclib.api.biomes.BiomeAPI;
import ru.bclib.world.generator.BCLBiomeSource;
import ru.bclib.world.generator.BCLibNetherBiomeSource;
import java.util.List;
@ -63,6 +64,9 @@ public abstract class ServerLevelMixin extends Level {
if (level.dimension() == Level.NETHER) {
BCLibNetherBiomeSource.setWorldHeight(level.getChunkSource().getGenerator().getGenDepth());
}
if (levelStem.generator().getBiomeSource() instanceof BCLBiomeSource source){
source.setSeed(level.getSeed());
}
if (bclib_lastWorld != null && bclib_lastWorld.equals(levelStorageAccess.getLevelId())) {
return;

View file

@ -28,6 +28,7 @@ import org.spongepowered.asm.mixin.injection.ModifyArg;
import org.spongepowered.asm.mixin.injection.ModifyArgs;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import ru.bclib.BCLib;
import ru.bclib.api.LifeCycleAPI;
import ru.bclib.world.generator.BCLibEndBiomeSource;
import ru.bclib.world.generator.BCLibNetherBiomeSource;
@ -52,12 +53,15 @@ public abstract class WorldPresetsBootstrapMixin {
@ModifyArg(method="run", at=@At(value="INVOKE", ordinal = 0, target="Lnet/minecraft/world/level/levelgen/presets/WorldPresets$Bootstrap;registerCustomOverworldPreset(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/dimension/LevelStem;)Lnet/minecraft/core/Holder;"))
private LevelStem bcl_getOverworldStem(LevelStem overworldStem){
BCLibNetherBiomeSource netherSource = new BCLibNetherBiomeSource(this.biomes);
BCLibEndBiomeSource endSource = new BCLibEndBiomeSource(this.biomes);
LevelStem bclNether = new LevelStem(
this.netherDimensionType,
new NoiseBasedChunkGenerator(
this.structureSets,
this.noises,
new BCLibNetherBiomeSource(this.biomes),
netherSource,
this.netherNoiseSettings)
);
@ -66,7 +70,7 @@ public abstract class WorldPresetsBootstrapMixin {
new NoiseBasedChunkGenerator(
this.structureSets,
this.noises,
new BCLibEndBiomeSource(this.biomes),
endSource,
this.endNoiseSettings)
);
WorldPreset preset = new WorldPreset(Map.of(LevelStem.OVERWORLD, overworldStem, LevelStem.NETHER, bclNether, LevelStem.END, bclEnd));

View file

@ -1,5 +1,6 @@
package ru.bclib.world.biomes;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import net.minecraft.core.Holder;
@ -9,6 +10,7 @@ import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.TagKey;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.Climate;
import net.minecraft.world.level.levelgen.SurfaceRules;
import net.minecraft.world.level.levelgen.SurfaceRules.RuleSource;
import org.jetbrains.annotations.Nullable;
@ -31,6 +33,8 @@ public class BCLBiome extends BCLBiomeSettings {
private final Map<String, Object> customData = Maps.newHashMap();
private final ResourceLocation biomeID;
private final Biome biome;
private final List<Climate.ParameterPoint> parameterPoints = Lists.newArrayList();
private Consumer<Holder<Biome>> surfaceInit;
private BCLBiome biomeParent;
@ -287,6 +291,18 @@ public class BCLBiome extends BCLBiomeSettings {
public void attachStructures(List<TagKey<Biome>> structures) {
this.structureTags.addAll(structures);
}
/**
* Adds structures to this biome. For internal use only.
* Used inside {@link ru.bclib.api.biomes.BCLBiomeBuilder}.
*/
public void addClimateParameters(List<Climate.ParameterPoint> params) {
this.parameterPoints.addAll(params);
}
public void forEachClimateParameter(Consumer<Climate.ParameterPoint> consumer){
this.parameterPoints.forEach(consumer);
}
/**
* Sets biome surface rule.

View file

@ -2,15 +2,17 @@ package ru.bclib.world.generator;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.core.DefaultedRegistry;
import net.minecraft.core.Holder;
import net.minecraft.core.MappedRegistry;
import net.minecraft.core.Registry;
import net.minecraft.data.BuiltinRegistries;
import net.minecraft.resources.RegistryOps;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.BiomeTags;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.BiomeSource;
import net.minecraft.world.level.biome.Biomes;
import net.minecraft.world.level.biome.Climate;
import net.minecraft.world.level.biome.*;
import org.apache.commons.lang3.function.TriFunction;
import ru.bclib.BCLib;
import ru.bclib.api.biomes.BiomeAPI;
@ -60,7 +62,6 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource {
public static void setWorldHeight(int worldHeight) {
BCLibNetherBiomeSource.worldHeight = worldHeight;
}
public BCLibNetherBiomeSource(Registry<Biome> biomeRegistry) {
super(biomeRegistry, getBiomes(biomeRegistry));
@ -87,16 +88,18 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource {
BiomeAPI.NETHER_BIOME_PICKER.getBiomes().forEach(biome -> biome.updateActualBiomes(biomeRegistry));
BiomeAPI.NETHER_BIOME_PICKER.rebuild();
//initMap();
}
initMap(0);
}
@Override
public void setSeed(long seed) {
seed = 0;
super.setSeed(seed);
initMap(seed);
}
private static List<Holder<Biome>> getBiomes(Registry<Biome> biomeRegistry) {
List<String> include = Configs.BIOMES_CONFIG.getEntry("force_include", "nether_biomes", StringArrayEntry.class).getValue();
@ -138,7 +141,13 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource {
if ((biomeX & 63) == 0 && (biomeZ & 63) == 0) {
biomeMap.clearCache();
}
return biomeMap.getBiome(biomeX << 2, biomeY << 2, biomeZ << 2).getActualBiome();
BCLBiome bb = biomeMap.getBiome(biomeX << 2, biomeY << 2, biomeZ << 2);
if(biomeRegistry.getId(bb.getActualBiome().value())<0) debug(bb, biomeRegistry);
return bb.getActualBiome();
}
public static<T> void debug(Object el, Registry<T> reg){
System.out.println("Unknown " + el + " in " + reg);
}
@Override

View file

@ -1,30 +1,33 @@
package ru.bclib.world.structures;
import com.google.common.collect.Lists;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Holder;
import net.minecraft.core.QuartPos;
import net.minecraft.core.Registry;
import net.minecraft.core.*;
import net.minecraft.data.BuiltinRegistries;
import net.minecraft.data.worldgen.StructureSets;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.TagKey;
import net.minecraft.world.entity.MobCategory;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.levelgen.GenerationStep;
import net.minecraft.world.level.levelgen.structure.Structure;
import net.minecraft.world.level.levelgen.structure.*;
import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration;
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
import net.minecraft.world.level.levelgen.structure.StructureSet;
import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier;
import net.minecraft.world.level.levelgen.structure.placement.RandomSpreadStructurePlacement;
import net.minecraft.world.level.levelgen.structure.placement.RandomSpreadType;
import com.mojang.serialization.Codec;
import ru.bclib.api.tag.TagAPI;
import ru.bclib.mixin.common.StructuresAccessor;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.function.Function;
public class BCLStructure {
public class BCLStructure<S extends Structure> {
private static final Random RANDOM = new Random(354);
private final Holder<Structure> structure;
@ -33,13 +36,37 @@ public class BCLStructure {
private final ResourceLocation id;
public final TagKey<Biome> biomeTag;
public final ResourceKey<Structure> structureKey;
public final S baseStructure;
public final ResourceKey<StructureSet> structureSetKey;
public final RandomSpreadStructurePlacement spreadConfig;
public BCLStructure(ResourceLocation id, Structure structure, GenerationStep.Decoration step, int spacing, int separation) {
this(id, structure, step, spacing, separation, false);
public final StructureType<S> structureType;
private static HolderSet<Biome> biomes(TagKey<Biome> tagKey) {
return BuiltinRegistries.BIOME.getOrCreateTag(tagKey);
}
public BCLStructure(ResourceLocation id, Structure structure, GenerationStep.Decoration step, int spacing, int separation, boolean adaptNoise) {
private static Structure.StructureSettings structure(TagKey<Biome> tagKey, Map<MobCategory, StructureSpawnOverride> map, GenerationStep.Decoration decoration, TerrainAdjustment terrainAdjustment) {
return new Structure.StructureSettings(biomes(tagKey), map, decoration, terrainAdjustment);
}
private static Structure.StructureSettings structure(TagKey<Biome> tagKey, GenerationStep.Decoration decoration, TerrainAdjustment terrainAdjustment) {
return structure(tagKey, Map.of(), decoration, terrainAdjustment);
}
public static <S extends Structure> StructureType<S> registerStructureType(ResourceLocation id, Codec<S> codec) {
return Registry.register(Registry.STRUCTURE_TYPES, id, () -> codec);
}
public BCLStructure(ResourceLocation id, Function<Structure.StructureSettings, S> structureBuilder, GenerationStep.Decoration step, int spacing, int separation, Codec<S> codec) {
this(id, structureBuilder, step, spacing, separation, false, codec);
}
public BCLStructure(ResourceLocation id, Function<Structure.StructureSettings, S> structureBuilder, GenerationStep.Decoration step, int spacing, int separation, boolean adaptNoise, Codec<S> codec) {
this(id, structureBuilder, step, spacing, separation, adaptNoise, registerStructureType(id, codec));
}
public BCLStructure(ResourceLocation id, Function<Structure.StructureSettings, S> structureBuilder, GenerationStep.Decoration step, int spacing, int separation, StructureType<S> structureType) {
this(id, structureBuilder, step, spacing, separation, false, structureType);
}
public BCLStructure(ResourceLocation id, Function<Structure.StructureSettings, S> structureBuilder, GenerationStep.Decoration step, int spacing, int separation, boolean adaptNoise, StructureType<S> structureType) {
this.id = id;
this.featureStep = step;
//parts from vanilla for Structure generation
@ -56,9 +83,11 @@ public class BCLStructure {
this.spreadConfig = new RandomSpreadStructurePlacement(spacing, separation, RandomSpreadType.LINEAR, RANDOM.nextInt(8192));
this.structureKey = ResourceKey.create(Registry.STRUCTURE_REGISTRY, id);
this.structureSetKey = ResourceKey.create(Registry.STRUCTURE_SET_REGISTRY, id);
this.structureType = structureType;
this.biomeTag = TagAPI.makeBiomeTag(id.getNamespace(), "has_structure/"+id.getPath());
this.structure = StructuresAccessor.callRegister(structureKey, structure);
this.baseStructure = structureBuilder.apply(structure(biomeTag, featureStep, TerrainAdjustment.NONE));
this.structure = StructuresAccessor.callRegister(structureKey, this.baseStructure);
StructureSets.register(structureSetKey, this.structure, spreadConfig);
}