Private
Public Access
1
0

Ported world generation features.

This commit is contained in:
2026-05-25 21:57:14 +01:00
parent dc4684404c
commit ad4efdc0ac
5 changed files with 45 additions and 145 deletions

View File

@ -0,0 +1,19 @@
package dev.micle.firefly_bush_backport.event;
import dev.micle.firefly_bush_backport.worldgen.ModConfiguredFeatures;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.gen.GenerationStage;
import net.minecraftforge.event.world.BiomeLoadingEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
public class OnBiomeLoadingEventHandler {
@SubscribeEvent
public void onBiomeLoadingEvent(final BiomeLoadingEvent event) {
if (event.getCategory() == Biome.Category.SWAMP) {
event.getGeneration().addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, ModConfiguredFeatures.PLACED_PATCH_FIREFLY_BUSH_SWAMP);
event.getGeneration().addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, ModConfiguredFeatures.PLACED_PATCH_FIREFLY_BUSH_NEAR_WATER_SWAMP);
} else if (event.getCategory() != Biome.Category.THEEND && event.getCategory() != Biome.Category.NETHER) {
event.getGeneration().addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, ModConfiguredFeatures.PLACED_PATCH_FIREFLY_BUSH_NEAR_WATER);
}
}
}

View File

@ -1,6 +1,5 @@
package dev.micle.firefly_bush_backport.proxy; package dev.micle.firefly_bush_backport.proxy;
import dev.micle.firefly_bush_backport.FireflyBushBackport;
import dev.micle.firefly_bush_backport.block.ModBlocks; import dev.micle.firefly_bush_backport.block.ModBlocks;
import dev.micle.firefly_bush_backport.config.Config; import dev.micle.firefly_bush_backport.config.Config;
import dev.micle.firefly_bush_backport.event.OnWandererTradesEventHandler; import dev.micle.firefly_bush_backport.event.OnWandererTradesEventHandler;
@ -9,6 +8,7 @@ import dev.micle.firefly_bush_backport.item.ModItems;
import dev.micle.firefly_bush_backport.particle.FireflyParticle; import dev.micle.firefly_bush_backport.particle.FireflyParticle;
import dev.micle.firefly_bush_backport.particle.ModParticles; import dev.micle.firefly_bush_backport.particle.ModParticles;
import dev.micle.firefly_bush_backport.sound.ModSounds; import dev.micle.firefly_bush_backport.sound.ModSounds;
import dev.micle.firefly_bush_backport.event.OnBiomeLoadingEventHandler;
import net.minecraft.block.ComposterBlock; import net.minecraft.block.ComposterBlock;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
@ -53,6 +53,7 @@ public class Proxy implements IProxy {
// Register event handlers // Register event handlers
MinecraftForge.EVENT_BUS.register(new OnWandererTradesEventHandler()); MinecraftForge.EVENT_BUS.register(new OnWandererTradesEventHandler());
MinecraftForge.EVENT_BUS.register(new OnBiomeLoadingEventHandler());
} }
private static void setup(FMLCommonSetupEvent event) { private static void setup(FMLCommonSetupEvent event) {

View File

@ -1,59 +0,0 @@
package dev.micle.firefly_bush_backport.worldgen;
import dev.micle.firefly_bush_backport.FireflyBushBackport;
import net.minecraft.core.HolderGetter;
import net.minecraft.core.HolderSet;
import net.minecraft.core.registries.Registries;
import net.minecraft.data.worldgen.BootstapContext;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.BiomeTags;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.levelgen.GenerationStep;
import net.minecraft.world.level.levelgen.placement.PlacedFeature;
import net.minecraftforge.common.Tags;
import net.minecraftforge.common.world.BiomeModifier;
import net.minecraftforge.common.world.ForgeBiomeModifiers;
import net.minecraftforge.registries.ForgeRegistries;
import java.util.Set;
public class ModBiomeModifiers {
public static final ResourceKey<BiomeModifier> ADD_PATCH_FIREFLY_BUSH_SWAMP = registerKey("add_patch_firefly_bush_swamp");
public static final ResourceKey<BiomeModifier> ADD_PATCH_FIREFLY_BUSH_NEAR_WATER_SWAMP = registerKey("add_patch_firefly_bush_near_water_swamp");
public static final ResourceKey<BiomeModifier> ADD_PATCH_FIREFLY_BUSH_NEAR_WATER = registerKey("add_patch_firefly_bush_near_water");
public static final ResourceKey<BiomeModifier> REMOVE_PATCH_FIREFLY_BUSH_NEAR_WATER = registerKey("remove_patch_firefly_bush_near_water");
public static void bootstrap(BootstapContext<BiomeModifier> context) {
HolderGetter<PlacedFeature> placedFeatures = context.lookup(Registries.PLACED_FEATURE);
HolderGetter<Biome> biomes = context.lookup(Registries.BIOME);
context.register(ADD_PATCH_FIREFLY_BUSH_SWAMP, new ForgeBiomeModifiers.AddFeaturesBiomeModifier(
biomes.getOrThrow(Tags.Biomes.IS_SWAMP),
HolderSet.direct(placedFeatures.getOrThrow(ModPlacedFeatures.PATCH_FIREFLY_BUSH_SWAMP_PLACED_KEY)),
GenerationStep.Decoration.VEGETAL_DECORATION
));
context.register(ADD_PATCH_FIREFLY_BUSH_NEAR_WATER_SWAMP, new ForgeBiomeModifiers.AddFeaturesBiomeModifier(
biomes.getOrThrow(Tags.Biomes.IS_SWAMP),
HolderSet.direct(placedFeatures.getOrThrow(ModPlacedFeatures.PATCH_FIREFLY_BUSH_NEAR_WATER_SWAMP_PLACED_KEY)),
GenerationStep.Decoration.VEGETAL_DECORATION
));
context.register(ADD_PATCH_FIREFLY_BUSH_NEAR_WATER, new ForgeBiomeModifiers.AddFeaturesBiomeModifier(
biomes.getOrThrow(BiomeTags.IS_OVERWORLD),
HolderSet.direct(placedFeatures.getOrThrow(ModPlacedFeatures.PATCH_FIREFLY_BUSH_NEAR_WATER_PLACED_KEY)),
GenerationStep.Decoration.VEGETAL_DECORATION
));
context.register(REMOVE_PATCH_FIREFLY_BUSH_NEAR_WATER, new ForgeBiomeModifiers.RemoveFeaturesBiomeModifier(
biomes.getOrThrow(Tags.Biomes.IS_SWAMP),
HolderSet.direct(placedFeatures.getOrThrow(ModPlacedFeatures.PATCH_FIREFLY_BUSH_NEAR_WATER_PLACED_KEY)),
Set.of(GenerationStep.Decoration.VEGETAL_DECORATION)
));
}
private static ResourceKey<BiomeModifier> registerKey(String name) {
return ResourceKey.create(ForgeRegistries.Keys.BIOME_MODIFIERS, ResourceLocation.fromNamespaceAndPath(FireflyBushBackport.MOD_ID, name));
}
}

View File

@ -7,19 +7,37 @@ import net.minecraft.util.registry.Registry;
import net.minecraft.util.registry.WorldGenRegistries; import net.minecraft.util.registry.WorldGenRegistries;
import net.minecraft.world.gen.blockplacer.SimpleBlockPlacer; import net.minecraft.world.gen.blockplacer.SimpleBlockPlacer;
import net.minecraft.world.gen.blockstateprovider.SimpleBlockStateProvider; import net.minecraft.world.gen.blockstateprovider.SimpleBlockStateProvider;
import net.minecraft.world.gen.feature.BlockClusterFeatureConfig; import net.minecraft.world.gen.feature.*;
import net.minecraft.world.gen.feature.ConfiguredFeature;
import net.minecraft.world.gen.feature.Feature;
import net.minecraft.world.gen.feature.IFeatureConfig;
public class ModConfiguredFeatures { public class ModConfiguredFeatures {
public static final ConfiguredFeature<?, ?> PATCH_FIREFLY_BUSH_KEY = create("patch_firefly_bush", Feature.RANDOM_PATCH.configured( public static final ConfiguredFeature<?, ?> CONFIGURED_PATCH_FIREFLY_BUSH = create("patch_firefly_bush", Feature.RANDOM_PATCH.configured(
new BlockClusterFeatureConfig.Builder( new BlockClusterFeatureConfig.Builder(
new SimpleBlockStateProvider(ModBlocks.FIREFLY_BUSH.get().defaultBlockState()), new SimpleBlockPlacer() new SimpleBlockStateProvider(ModBlocks.FIREFLY_BUSH.get().defaultBlockState()), new SimpleBlockPlacer()
).tries(20).xspread(4).zspread(4).yspread(3).build() ).tries(20).xspread(4).zspread(4).yspread(3).build()
)); ));
public static <FC extends IFeatureConfig, F extends Feature<FC>, CF extends ConfiguredFeature<FC, F>> CF create(String id, CF configuredFeature) { public static final ConfiguredFeature<?, ?> CONFIGURED_PATCH_FIREFLY_BUSH_NEAR_WATER = create("patch_firefly_bush", Feature.RANDOM_PATCH.configured(
new BlockClusterFeatureConfig.Builder(
new SimpleBlockStateProvider(ModBlocks.FIREFLY_BUSH.get().defaultBlockState()), new SimpleBlockPlacer()
).tries(20).xspread(4).zspread(4).yspread(3).needWater().build()
));
public static final ConfiguredFeature<?, ?> PLACED_PATCH_FIREFLY_BUSH_SWAMP = create("patch_firefly_bush_swamp", CONFIGURED_PATCH_FIREFLY_BUSH
.chance(8)
.decorated(Features.Placements.HEIGHTMAP_SQUARE)
);
public static final ConfiguredFeature<?, ?> PLACED_PATCH_FIREFLY_BUSH_NEAR_WATER_SWAMP = create("patch_firefly_bush_near_water_swamp", CONFIGURED_PATCH_FIREFLY_BUSH_NEAR_WATER
.count(3)
.decorated(Features.Placements.HEIGHTMAP_SQUARE)
);
public static final ConfiguredFeature<?, ?> PLACED_PATCH_FIREFLY_BUSH_NEAR_WATER = create("patch_firefly_bush_near_water", CONFIGURED_PATCH_FIREFLY_BUSH_NEAR_WATER
.count(2)
.decorated(Features.Placements.TOP_SOLID_HEIGHTMAP_SQUARE)
);
private static <FC extends IFeatureConfig, F extends Feature<FC>, CF extends ConfiguredFeature<FC, F>> CF create(String id, CF configuredFeature) {
Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation(FireflyBushBackport.MOD_ID, id), configuredFeature); Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation(FireflyBushBackport.MOD_ID, id), configuredFeature);
return configuredFeature; return configuredFeature;
} }

View File

@ -1,79 +0,0 @@
package dev.micle.firefly_bush_backport.worldgen;
import dev.micle.firefly_bush_backport.FireflyBushBackport;
import dev.micle.firefly_bush_backport.block.ModBlocks;
import net.minecraft.core.Holder;
import net.minecraft.core.HolderGetter;
import net.minecraft.core.Vec3i;
import net.minecraft.core.registries.Registries;
import net.minecraft.data.worldgen.BootstapContext;
import net.minecraft.data.worldgen.placement.PlacementUtils;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.levelgen.Heightmap;
import net.minecraft.world.level.levelgen.blockpredicates.BlockPredicate;
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
import net.minecraft.world.level.levelgen.placement.*;
import net.minecraft.world.level.material.Fluids;
import java.util.List;
public class ModPlacedFeatures {
public static final ResourceKey<PlacedFeature> PATCH_FIREFLY_BUSH_SWAMP_PLACED_KEY = registerKey("patch_firefly_bush_swamp");
public static final ResourceKey<PlacedFeature> PATCH_FIREFLY_BUSH_NEAR_WATER_SWAMP_PLACED_KEY = registerKey("patch_firefly_bush_near_water_swamp");
public static final ResourceKey<PlacedFeature> PATCH_FIREFLY_BUSH_NEAR_WATER_PLACED_KEY = registerKey("patch_firefly_bush_near_water");
public static void bootstrap(BootstapContext<PlacedFeature> context) {
HolderGetter<ConfiguredFeature<?, ?>> configuredFeatures = context.lookup(Registries.CONFIGURED_FEATURE);
register(context, PATCH_FIREFLY_BUSH_SWAMP_PLACED_KEY, configuredFeatures.getOrThrow(ModConfiguredFeatures.PATCH_FIREFLY_BUSH_KEY), List.of(
RarityFilter.onAverageOnceEvery(8),
InSquarePlacement.spread(),
PlacementUtils.HEIGHTMAP,
BiomeFilter.biome()
));
register(context, PATCH_FIREFLY_BUSH_NEAR_WATER_SWAMP_PLACED_KEY, configuredFeatures.getOrThrow(ModConfiguredFeatures.PATCH_FIREFLY_BUSH_KEY), List.of(
CountPlacement.of(3),
InSquarePlacement.spread(),
PlacementUtils.HEIGHTMAP,
BiomeFilter.biome(),
BlockPredicateFilter.forPredicate(BlockPredicate.allOf(
BlockPredicate.matchesBlocks(Blocks.AIR),
BlockPredicate.wouldSurvive(ModBlocks.FIREFLY_BUSH.get().defaultBlockState(), Vec3i.ZERO),
BlockPredicate.anyOf(
BlockPredicate.matchesFluids(new Vec3i(1, -1, 0), List.of(Fluids.WATER, Fluids.FLOWING_WATER)),
BlockPredicate.matchesFluids(new Vec3i(-1, -1, 0), List.of(Fluids.WATER, Fluids.FLOWING_WATER)),
BlockPredicate.matchesFluids(new Vec3i(0, -1, 1), List.of(Fluids.WATER, Fluids.FLOWING_WATER)),
BlockPredicate.matchesFluids(new Vec3i(0, -1, -1), List.of(Fluids.WATER, Fluids.FLOWING_WATER))
)
))
));
register(context, PATCH_FIREFLY_BUSH_NEAR_WATER_PLACED_KEY, configuredFeatures.getOrThrow(ModConfiguredFeatures.PATCH_FIREFLY_BUSH_KEY), List.of(
CountPlacement.of(2),
InSquarePlacement.spread(),
HeightmapPlacement.onHeightmap(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES),
BiomeFilter.biome(),
BlockPredicateFilter.forPredicate(BlockPredicate.allOf(
BlockPredicate.matchesBlocks(Blocks.AIR),
BlockPredicate.wouldSurvive(ModBlocks.FIREFLY_BUSH.get().defaultBlockState(), Vec3i.ZERO),
BlockPredicate.anyOf(
BlockPredicate.matchesFluids(new Vec3i(1, -1, 0), List.of(Fluids.WATER, Fluids.FLOWING_WATER)),
BlockPredicate.matchesFluids(new Vec3i(-1, -1, 0), List.of(Fluids.WATER, Fluids.FLOWING_WATER)),
BlockPredicate.matchesFluids(new Vec3i(0, -1, 1), List.of(Fluids.WATER, Fluids.FLOWING_WATER)),
BlockPredicate.matchesFluids(new Vec3i(0, -1, -1), List.of(Fluids.WATER, Fluids.FLOWING_WATER))
)
))
));
}
private static ResourceKey<PlacedFeature> registerKey(String name) {
return ResourceKey.create(Registries.PLACED_FEATURE, ResourceLocation.fromNamespaceAndPath(FireflyBushBackport.MOD_ID, name));
}
private static void register(BootstapContext<PlacedFeature> context, ResourceKey<PlacedFeature> key, Holder<ConfiguredFeature<?, ?>> configuration, List<PlacementModifier> modifiers) {
context.register(key, new PlacedFeature(configuration, List.copyOf(modifiers)));
}
}