Adapted StructureAPI for 1.19
This commit is contained in:
parent
c7117fa180
commit
b7a74e971b
8 changed files with 102 additions and 42 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue