From a06e3287d4cb35baa93327dffba1e31c1e19dda0 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Mon, 19 Oct 2020 00:11:51 +0300 Subject: [PATCH] New feature system for vanilla and datapack biomes --- gradle.properties | 2 +- .../ru/betterend/mixin/common/BiomeMixin.java | 33 +++++++-- .../common/DefaultBiomeCreatorMixin.java | 17 +++-- .../common/GenerationSettingsAccessor.java | 26 +++++++ .../mixin/common/GenerationSettingsMixin.java | 71 +++++++++---------- .../registry/DefaultBiomeFeatureRegistry.java | 2 +- .../betterend/registry/FeatureRegistry.java | 6 -- .../betterend/registry/StructureRegistry.java | 23 ++++++ .../betterend/world/biome/BiomeMegalake.java | 4 +- .../resources/betterend.mixins.common.json | 2 +- 10 files changed, 127 insertions(+), 59 deletions(-) create mode 100644 src/main/java/ru/betterend/mixin/common/GenerationSettingsAccessor.java diff --git a/gradle.properties b/gradle.properties index 003466bf..9d9cbf90 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ loader_version = 0.10.1+build.209 # Mod Properties - mod_version = 0.1.1-alpha + mod_version = 0.2.0-alpha maven_group = ru.betterend archives_base_name = better-end diff --git a/src/main/java/ru/betterend/mixin/common/BiomeMixin.java b/src/main/java/ru/betterend/mixin/common/BiomeMixin.java index dfbfd2e0..96c745a2 100644 --- a/src/main/java/ru/betterend/mixin/common/BiomeMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BiomeMixin.java @@ -1,11 +1,19 @@ package ru.betterend.mixin.common; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.function.Supplier; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; + import net.minecraft.util.math.BlockPos; import net.minecraft.world.ChunkRegion; import net.minecraft.world.biome.Biome; @@ -13,24 +21,41 @@ import net.minecraft.world.biome.GenerationSettings; import net.minecraft.world.gen.ChunkRandom; import net.minecraft.world.gen.StructureAccessor; import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.ConfiguredStructureFeature; import ru.betterend.registry.FeatureRegistry; +import ru.betterend.registry.StructureRegistry; @Mixin(Biome.class) public abstract class BiomeMixin { + private static final Set INJECTED = Sets.newHashSet(); @Shadow private Biome.Category category; + @Shadow private GenerationSettings generationSettings; - private boolean injected = false; @Inject(method = "generateFeatureStep", at = @At("HEAD")) public void generateFeatureStep(StructureAccessor structureAccessor, ChunkGenerator chunkGenerator, ChunkRegion region, long populationSeed, ChunkRandom random, BlockPos pos, CallbackInfo cinfo) { - if (!injected) { + Biome biome = (Biome) (Object) this; + if (!INJECTED.contains(biome)) { if (category.equals(Biome.Category.THEEND)) { - FeatureRegistry.registerGlobals(generationSettings.getFeatures()); + GenerationSettingsAccessor accessor = (GenerationSettingsAccessor) generationSettings; + List>> structures = Lists.newArrayList(accessor.getStructures()); + List>>> preFeatures = accessor.getFeatures(); + List>>> features = new ArrayList>>>(preFeatures.size()); + preFeatures.forEach((list) -> { + features.add(Lists.newArrayList(list)); + }); + + FeatureRegistry.registerGlobals(features); + StructureRegistry.registerBiomeStructures(biome, structures); + + accessor.setFeatures(features); + accessor.setStructures(structures); } - this.injected = true; + INJECTED.add(biome); } } } diff --git a/src/main/java/ru/betterend/mixin/common/DefaultBiomeCreatorMixin.java b/src/main/java/ru/betterend/mixin/common/DefaultBiomeCreatorMixin.java index 7c49016e..c3bbdf80 100644 --- a/src/main/java/ru/betterend/mixin/common/DefaultBiomeCreatorMixin.java +++ b/src/main/java/ru/betterend/mixin/common/DefaultBiomeCreatorMixin.java @@ -1,8 +1,10 @@ package ru.betterend.mixin.common; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.DefaultBiomeCreator; @@ -10,7 +12,6 @@ import net.minecraft.world.biome.GenerationSettings; import net.minecraft.world.gen.GenerationStep; import net.minecraft.world.gen.feature.ConfiguredFeatures; import net.minecraft.world.gen.surfacebuilder.ConfiguredSurfaceBuilders; -import ru.betterend.registry.DefaultBiomeFeatureRegistry; @Mixin(DefaultBiomeCreator.class) public class DefaultBiomeCreatorMixin { @@ -19,14 +20,12 @@ public class DefaultBiomeCreatorMixin { return null; }; - @Overwrite - public static Biome createEndHighlands() { + @Inject(method = "createEndHighlands", at = @At("HEAD"), cancellable = true) + private static void createEndHighlands(CallbackInfoReturnable info) { GenerationSettings.Builder builder = (new GenerationSettings.Builder()) .surfaceBuilder(ConfiguredSurfaceBuilders.END) - //.structureFeature(ConfiguredStructureFeatures.END_CITY) - .feature(GenerationStep.Feature.SURFACE_STRUCTURES, ConfiguredFeatures.END_GATEWAY) - //.feature(GenerationStep.Feature.VEGETAL_DECORATION, ConfiguredFeatures.CHORUS_PLANT) - .structureFeature(DefaultBiomeFeatureRegistry.MOUNTAINS.getFeatureConfigured()); - return composeEndSpawnSettings(builder); + .feature(GenerationStep.Feature.SURFACE_STRUCTURES, ConfiguredFeatures.END_GATEWAY); + info.setReturnValue(composeEndSpawnSettings(builder)); + info.cancel(); } } diff --git a/src/main/java/ru/betterend/mixin/common/GenerationSettingsAccessor.java b/src/main/java/ru/betterend/mixin/common/GenerationSettingsAccessor.java new file mode 100644 index 00000000..f7b16376 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/GenerationSettingsAccessor.java @@ -0,0 +1,26 @@ +package ru.betterend.mixin.common; + +import java.util.List; +import java.util.function.Supplier; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import net.minecraft.world.biome.GenerationSettings; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.ConfiguredStructureFeature; + +@Mixin(GenerationSettings.class) +public interface GenerationSettingsAccessor { + @Accessor("features") + List>>> getFeatures(); + + @Accessor("features") + void setFeatures(List>>> features); + + @Accessor("structureFeatures") + List>> getStructures(); + + @Accessor("structureFeatures") + void setStructures(List>> structures); +} diff --git a/src/main/java/ru/betterend/mixin/common/GenerationSettingsMixin.java b/src/main/java/ru/betterend/mixin/common/GenerationSettingsMixin.java index 1e56a41a..4115f518 100644 --- a/src/main/java/ru/betterend/mixin/common/GenerationSettingsMixin.java +++ b/src/main/java/ru/betterend/mixin/common/GenerationSettingsMixin.java @@ -1,36 +1,35 @@ -package ru.betterend.mixin.common; - -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import com.google.common.collect.Lists; - -import net.minecraft.world.biome.GenerationSettings; -import net.minecraft.world.gen.GenerationStep; -import net.minecraft.world.gen.carver.ConfiguredCarver; -import net.minecraft.world.gen.feature.ConfiguredFeature; -import net.minecraft.world.gen.feature.ConfiguredStructureFeature; -import net.minecraft.world.gen.surfacebuilder.ConfiguredSurfaceBuilder; - -@Mixin(GenerationSettings.class) -public abstract class GenerationSettingsMixin { - - @Shadow - private List>>> features; - - @Inject(method = "", at = @At("TAIL")) - void init(Supplier> surfaceBuilder, Map>>> carvers, List>>> features, List>> structureFeatures, CallbackInfo cinfo) { - List>>> mutableFeatures = Lists.newArrayList(); - this.features.forEach(supplierList -> { - mutableFeatures.add(Lists.newArrayList(supplierList)); - }); - this.features = mutableFeatures; - } -} +package ru.betterend.mixin.common; + +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.google.common.collect.Lists; + +import net.minecraft.world.biome.GenerationSettings; +import net.minecraft.world.gen.GenerationStep; +import net.minecraft.world.gen.carver.ConfiguredCarver; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.ConfiguredStructureFeature; +import net.minecraft.world.gen.surfacebuilder.ConfiguredSurfaceBuilder; + +@Mixin(GenerationSettings.class) +public abstract class GenerationSettingsMixin { + /*@Shadow + private List>>> features; + + @Inject(method = "", at = @At("TAIL")) + void init(Supplier> surfaceBuilder, Map>>> carvers, List>>> features, List>> structureFeatures, CallbackInfo cinfo) { + List>>> mutableFeatures = Lists.newArrayList(this.features); + this.features.forEach(supplierList -> { + mutableFeatures.add(Lists.newArrayList(supplierList)); + }); + this.features = mutableFeatures; + }*/ +} diff --git a/src/main/java/ru/betterend/registry/DefaultBiomeFeatureRegistry.java b/src/main/java/ru/betterend/registry/DefaultBiomeFeatureRegistry.java index 3765a325..14e719e7 100644 --- a/src/main/java/ru/betterend/registry/DefaultBiomeFeatureRegistry.java +++ b/src/main/java/ru/betterend/registry/DefaultBiomeFeatureRegistry.java @@ -5,5 +5,5 @@ import ru.betterend.world.structures.EndStructureFeature; import ru.betterend.world.structures.features.StructureMountain; public class DefaultBiomeFeatureRegistry { - public static final EndStructureFeature MOUNTAINS = new EndStructureFeature("mountains", new StructureMountain(), Feature.RAW_GENERATION, 3, 2); + //public static final EndStructureFeature MOUNTAINS = new EndStructureFeature("mountains", new StructureMountain(), Feature.RAW_GENERATION, 3, 2); } diff --git a/src/main/java/ru/betterend/registry/FeatureRegistry.java b/src/main/java/ru/betterend/registry/FeatureRegistry.java index beb71f41..08d30ce7 100644 --- a/src/main/java/ru/betterend/registry/FeatureRegistry.java +++ b/src/main/java/ru/betterend/registry/FeatureRegistry.java @@ -5,7 +5,6 @@ import java.util.function.Supplier; import com.google.common.collect.Lists; -import net.minecraft.world.gen.GenerationStep.Feature; import net.minecraft.world.gen.feature.ConfiguredFeature; import ru.betterend.world.features.BlueVineFeature; import ru.betterend.world.features.DoublePlantFeature; @@ -18,8 +17,6 @@ import ru.betterend.world.features.PythadendronTreeFeature; import ru.betterend.world.features.SinglePlantFeature; import ru.betterend.world.features.UnderwaterPlantFeature; import ru.betterend.world.features.VineFeature; -import ru.betterend.world.structures.EndStructureFeature; -import ru.betterend.world.structures.features.StructureMegaLake; public class FeatureRegistry { private final static List GLOBAL_FEATURES = Lists.newArrayList(); @@ -51,9 +48,6 @@ public class FeatureRegistry { public static final EndFeature VIOLECITE_LAYER = EndFeature.makeLayerFeature("violecite_layer", BlockRegistry.VIOLECITE, 15, 4, 96, 8); public static final EndFeature FLAVOLITE_LAYER = EndFeature.makeLayerFeature("flavolite_layer", BlockRegistry.FLAVOLITE, 12, 4, 96, 6); - // Structures // - public static final EndStructureFeature MEGALAKE = new EndStructureFeature("megalake", new StructureMegaLake(), Feature.RAW_GENERATION, 4, 1); - public static void registerGlobals(List>>> features) { GLOBAL_FEATURES.forEach(feature -> { int index = feature.getFeatureStep().ordinal(); diff --git a/src/main/java/ru/betterend/registry/StructureRegistry.java b/src/main/java/ru/betterend/registry/StructureRegistry.java index 24cda148..e2f7e9a2 100644 --- a/src/main/java/ru/betterend/registry/StructureRegistry.java +++ b/src/main/java/ru/betterend/registry/StructureRegistry.java @@ -1,11 +1,22 @@ package ru.betterend.registry; +import java.util.Collection; +import java.util.List; +import java.util.function.Supplier; + +import com.google.common.collect.Lists; + import net.minecraft.structure.StructurePieceType; import net.minecraft.util.registry.Registry; +import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.GenerationStep.Feature; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.ConfiguredStructureFeature; import ru.betterend.BetterEnd; import ru.betterend.world.structures.EndStructureFeature; import ru.betterend.world.structures.features.StructureGiantMossyGlowshroom; +import ru.betterend.world.structures.features.StructureMegaLake; +import ru.betterend.world.structures.features.StructureMountain; import ru.betterend.world.structures.piece.CavePiece; import ru.betterend.world.structures.piece.LakePiece; import ru.betterend.world.structures.piece.MountainPiece; @@ -18,10 +29,22 @@ public class StructureRegistry { public static final StructurePieceType LAKE_PIECE = register("lake_piece", LakePiece::new); public static final EndStructureFeature GIANT_MOSSY_GLOWSHROOM = new EndStructureFeature("giant_mossy_glowshroom", new StructureGiantMossyGlowshroom(), Feature.SURFACE_STRUCTURES, 16, 8); + public static final EndStructureFeature MEGALAKE = new EndStructureFeature("megalake", new StructureMegaLake(), Feature.RAW_GENERATION, 4, 1); + public static final EndStructureFeature MOUNTAINS = new EndStructureFeature("mountains", new StructureMountain(), Feature.RAW_GENERATION, 3, 2); public static void register() {} private static StructurePieceType register(String id, StructurePieceType pieceType) { return Registry.register(Registry.STRUCTURE_PIECE, BetterEnd.makeID(id), pieceType); } + + public static void registerBiomeStructures(Biome biome, Collection>> collection) { + if (BiomeRegistry.getFromBiome(biome) == BiomeRegistry.END_HIGHLANDS) { + addFeature(MOUNTAINS, collection); + } + } + + private static void addFeature(EndStructureFeature feature, Collection>> collection) { + collection.add(() -> { return feature.getFeatureConfigured(); }); + } } diff --git a/src/main/java/ru/betterend/world/biome/BiomeMegalake.java b/src/main/java/ru/betterend/world/biome/BiomeMegalake.java index edf125f0..0bd5ee56 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeMegalake.java +++ b/src/main/java/ru/betterend/world/biome/BiomeMegalake.java @@ -4,6 +4,7 @@ import net.minecraft.entity.EntityType; import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; import ru.betterend.registry.BlockRegistry; import ru.betterend.registry.FeatureRegistry; +import ru.betterend.registry.StructureRegistry; public class BiomeMegalake extends EndBiome { public BiomeMegalake() { @@ -11,8 +12,9 @@ public class BiomeMegalake extends EndBiome { .setFogColor(178, 209, 248) .setWaterColor(96, 163, 255) .setWaterFogColor(96, 163, 255) + .setFogDensity(1.75F) .setSurface(BlockRegistry.ENDSTONE_DUST) - .addStructureFeature(FeatureRegistry.MEGALAKE) + .addStructureFeature(StructureRegistry.MEGALAKE) .addStructureFeature(ConfiguredStructureFeatures.END_CITY) .addFeature(FeatureRegistry.BUBBLE_CORAL) .addFeature(FeatureRegistry.END_LILY) diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index 1f00138c..a2f0b333 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -6,8 +6,8 @@ "mixins": [ "ServerPlayNetworkHandlerMixin", "CraftingScreenHandlerMixin", + "GenerationSettingsAccessor", "DefaultBiomeCreatorMixin", - "GenerationSettingsMixin", "AnvilScreenHandlerMixin", "ChorusPlantFeatureMixin", "ChorusFlowerBlockMixin",