From b7a74e971b93d565d06e37467a6c03690e4e73c3 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 13 May 2022 19:58:15 +0200 Subject: [PATCH] Adapted StructureAPI for 1.19 --- .../ru/bclib/api/biomes/BCLBiomeBuilder.java | 17 ++++--- .../java/ru/bclib/api/biomes/BiomeAPI.java | 15 +----- .../mixin/common/MinecraftServerMixin.java | 6 +++ .../bclib/mixin/common/ServerLevelMixin.java | 4 ++ .../common/WorldPresetsBootstrapMixin.java | 8 ++- .../java/ru/bclib/world/biomes/BCLBiome.java | 16 ++++++ .../generator/BCLibNetherBiomeSource.java | 27 ++++++---- .../bclib/world/structures/BCLStructure.java | 51 +++++++++++++++---- 8 files changed, 102 insertions(+), 42 deletions(-) diff --git a/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java b/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java index 6e4cce23..9053b39f 100644 --- a/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java +++ b/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java @@ -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 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; diff --git a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java index 3c5dd65f..3a9aee92 100644 --- a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java +++ b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java @@ -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 key = BiomeAPI.getBiomeKeyOrThrow(biome.getBiomeHolder()); - NetherBiomeData.addNetherBiome(key, parameters); + + biome.forEachClimateParameter(p -> NetherBiomeData.addNetherBiome(key, p)); return biome; } diff --git a/src/main/java/ru/bclib/mixin/common/MinecraftServerMixin.java b/src/main/java/ru/bclib/mixin/common/MinecraftServerMixin.java index 98872a24..e0fd1866 100644 --- a/src/main/java/ru/bclib/mixin/common/MinecraftServerMixin.java +++ b/src/main/java/ru/bclib/mixin/common/MinecraftServerMixin.java @@ -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); + } } diff --git a/src/main/java/ru/bclib/mixin/common/ServerLevelMixin.java b/src/main/java/ru/bclib/mixin/common/ServerLevelMixin.java index 231c7d30..c9671a7a 100644 --- a/src/main/java/ru/bclib/mixin/common/ServerLevelMixin.java +++ b/src/main/java/ru/bclib/mixin/common/ServerLevelMixin.java @@ -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; diff --git a/src/main/java/ru/bclib/mixin/common/WorldPresetsBootstrapMixin.java b/src/main/java/ru/bclib/mixin/common/WorldPresetsBootstrapMixin.java index d57f8106..d19fdca5 100644 --- a/src/main/java/ru/bclib/mixin/common/WorldPresetsBootstrapMixin.java +++ b/src/main/java/ru/bclib/mixin/common/WorldPresetsBootstrapMixin.java @@ -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)); diff --git a/src/main/java/ru/bclib/world/biomes/BCLBiome.java b/src/main/java/ru/bclib/world/biomes/BCLBiome.java index 2ced4006..8370f73b 100644 --- a/src/main/java/ru/bclib/world/biomes/BCLBiome.java +++ b/src/main/java/ru/bclib/world/biomes/BCLBiome.java @@ -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 customData = Maps.newHashMap(); private final ResourceLocation biomeID; private final Biome biome; + + private final List parameterPoints = Lists.newArrayList(); private Consumer> surfaceInit; private BCLBiome biomeParent; @@ -287,6 +291,18 @@ public class BCLBiome extends BCLBiomeSettings { public void attachStructures(List> 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 params) { + this.parameterPoints.addAll(params); + } + + public void forEachClimateParameter(Consumer consumer){ + this.parameterPoints.forEach(consumer); + } /** * Sets biome surface rule. diff --git a/src/main/java/ru/bclib/world/generator/BCLibNetherBiomeSource.java b/src/main/java/ru/bclib/world/generator/BCLibNetherBiomeSource.java index bf3d4468..eced98f8 100644 --- a/src/main/java/ru/bclib/world/generator/BCLibNetherBiomeSource.java +++ b/src/main/java/ru/bclib/world/generator/BCLibNetherBiomeSource.java @@ -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 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> getBiomes(Registry biomeRegistry) { List 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 void debug(Object el, Registry reg){ + System.out.println("Unknown " + el + " in " + reg); } @Override diff --git a/src/main/java/ru/bclib/world/structures/BCLStructure.java b/src/main/java/ru/bclib/world/structures/BCLStructure.java index 24a61582..80400f6f 100644 --- a/src/main/java/ru/bclib/world/structures/BCLStructure.java +++ b/src/main/java/ru/bclib/world/structures/BCLStructure.java @@ -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 { private static final Random RANDOM = new Random(354); private final Holder structure; @@ -33,13 +36,37 @@ public class BCLStructure { private final ResourceLocation id; public final TagKey biomeTag; public final ResourceKey structureKey; + public final S baseStructure; public final ResourceKey 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 structureType; + + + private static HolderSet biomes(TagKey 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 tagKey, Map map, GenerationStep.Decoration decoration, TerrainAdjustment terrainAdjustment) { + return new Structure.StructureSettings(biomes(tagKey), map, decoration, terrainAdjustment); + } + + private static Structure.StructureSettings structure(TagKey tagKey, GenerationStep.Decoration decoration, TerrainAdjustment terrainAdjustment) { + return structure(tagKey, Map.of(), decoration, terrainAdjustment); + } + + public static StructureType registerStructureType(ResourceLocation id, Codec codec) { + return Registry.register(Registry.STRUCTURE_TYPES, id, () -> codec); + } + public BCLStructure(ResourceLocation id, Function structureBuilder, GenerationStep.Decoration step, int spacing, int separation, Codec codec) { + this(id, structureBuilder, step, spacing, separation, false, codec); + } + public BCLStructure(ResourceLocation id, Function structureBuilder, GenerationStep.Decoration step, int spacing, int separation, boolean adaptNoise, Codec codec) { + this(id, structureBuilder, step, spacing, separation, adaptNoise, registerStructureType(id, codec)); + } + public BCLStructure(ResourceLocation id, Function structureBuilder, GenerationStep.Decoration step, int spacing, int separation, StructureType structureType) { + this(id, structureBuilder, step, spacing, separation, false, structureType); + } + public BCLStructure(ResourceLocation id, Function structureBuilder, GenerationStep.Decoration step, int spacing, int separation, boolean adaptNoise, StructureType 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); }