diff --git a/src/main/java/net/krituximon/stalinium/Stalinium.java b/src/main/java/net/krituximon/stalinium/Stalinium.java index e4c1c80..8024f1b 100644 --- a/src/main/java/net/krituximon/stalinium/Stalinium.java +++ b/src/main/java/net/krituximon/stalinium/Stalinium.java @@ -3,6 +3,12 @@ package net.krituximon.stalinium; import net.krituximon.stalinium.block.ModBlocks; import net.krituximon.stalinium.item.ModItems; import net.krituximon.stalinium.sound.ModSounds; +import net.krituximon.stalinium.worldgen.ModFeatures; +import net.krituximon.stalinium.worldgen.StaliniumVeinFeature; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import org.slf4j.Logger; import com.mojang.logging.LogUtils; @@ -23,6 +29,8 @@ import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; import net.neoforged.neoforge.event.server.ServerStartingEvent; +import static net.krituximon.stalinium.worldgen.ModFeatures.FEATURES; + // The value here should match an entry in the META-INF/neoforge.mods.toml file @Mod(Stalinium.MODID) public class Stalinium @@ -54,6 +62,7 @@ public class Stalinium // Register our mod's ModConfigSpec so that FML can create and load the config file for us modContainer.registerConfig(ModConfig.Type.COMMON, Config.SPEC); + ModFeatures.register(modEventBus); } private void commonSetup(final FMLCommonSetupEvent event) diff --git a/src/main/java/net/krituximon/stalinium/worldgen/ModBiomeModifiers.java b/src/main/java/net/krituximon/stalinium/worldgen/ModBiomeModifiers.java index 55f3306..3ea10ac 100644 --- a/src/main/java/net/krituximon/stalinium/worldgen/ModBiomeModifiers.java +++ b/src/main/java/net/krituximon/stalinium/worldgen/ModBiomeModifiers.java @@ -1,21 +1,43 @@ package net.krituximon.stalinium.worldgen; import net.krituximon.stalinium.Stalinium; +import net.minecraft.core.HolderGetter; +import net.minecraft.core.HolderSet; import net.minecraft.core.registries.Registries; import net.minecraft.data.worldgen.BootstrapContext; 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.neoforged.neoforge.common.world.BiomeModifier; +import net.neoforged.neoforge.common.world.BiomeModifiers; import net.neoforged.neoforge.registries.NeoForgeRegistries; public class ModBiomeModifiers { + public static final ResourceKey ADD_STALINIUM_ORE = registerKey("add_stalinium_ore"); + public static final ResourceKey ADD_COMPRESSED_BEDROCK = registerKey("add_compressed_bedrock"); - public static void bootstrap(BootstrapContext context) { - var placedFeatures = context.lookup(Registries.PLACED_FEATURE); - var biomes = context.lookup(Registries.BIOME); + // ModBiomeModifiers.java + public static void bootstrap(BootstrapContext ctx) { + HolderGetter biomes = ctx.lookup(Registries.BIOME); + HolderGetter placed = ctx.lookup(Registries.PLACED_FEATURE); + HolderSet featureSet = HolderSet.direct( + placed.getOrThrow(ModPlacedFeatures.STALINIUM_VEIN_PLACED_KEY) + ); + + ctx.register(ADD_STALINIUM_ORE, + new BiomeModifiers.AddFeaturesBiomeModifier( + biomes.getOrThrow(BiomeTags.IS_OVERWORLD), + featureSet, + GenerationStep.Decoration.UNDERGROUND_ORES + ) + ); } + private static ResourceKey registerKey(String name) { return ResourceKey.create(NeoForgeRegistries.Keys.BIOME_MODIFIERS, ResourceLocation.fromNamespaceAndPath(Stalinium.MODID, name)); } diff --git a/src/main/java/net/krituximon/stalinium/worldgen/ModConfiguredFeatures.java b/src/main/java/net/krituximon/stalinium/worldgen/ModConfiguredFeatures.java index 4e45d06..cf5ce41 100644 --- a/src/main/java/net/krituximon/stalinium/worldgen/ModConfiguredFeatures.java +++ b/src/main/java/net/krituximon/stalinium/worldgen/ModConfiguredFeatures.java @@ -1,6 +1,9 @@ package net.krituximon.stalinium.worldgen; import net.krituximon.stalinium.Stalinium; +import net.krituximon.stalinium.block.ModBlocks; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.data.worldgen.BootstrapContext; import net.minecraft.resources.ResourceKey; @@ -8,20 +11,26 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; public class ModConfiguredFeatures { + public static final ResourceKey> STALINIUM_VEIN_KEY = + registerKey("stalinium_vein"); public static void bootstrap(BootstrapContext> context) { - - + register(context, STALINIUM_VEIN_KEY, ModFeatures.STALINIUM_VEIN.get(), NoneFeatureConfiguration.INSTANCE); } - public static ResourceKey> registerKey(String name) { - return ResourceKey.create(Registries.CONFIGURED_FEATURE, ResourceLocation.fromNamespaceAndPath(Stalinium.MODID, name)); + private static > void register( + BootstrapContext> ctx, + ResourceKey> key, + F feature, + FC config) { + ctx.register(key, new ConfiguredFeature<>(feature, config)); } - private static > void register(BootstrapContext> context, - ResourceKey> key, F feature, FC configuration) { - context.register(key, new ConfiguredFeature<>(feature, configuration)); + private static ResourceKey> registerKey(String name) { + return ResourceKey.create(Registries.CONFIGURED_FEATURE, + ResourceLocation.fromNamespaceAndPath(Stalinium.MODID, name)); } -} \ No newline at end of file +} diff --git a/src/main/java/net/krituximon/stalinium/worldgen/ModFeatures.java b/src/main/java/net/krituximon/stalinium/worldgen/ModFeatures.java new file mode 100644 index 0000000..04c4b5d --- /dev/null +++ b/src/main/java/net/krituximon/stalinium/worldgen/ModFeatures.java @@ -0,0 +1,22 @@ +package net.krituximon.stalinium.worldgen; + +import net.krituximon.stalinium.Stalinium; +import net.minecraft.core.registries.Registries; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; + +public class ModFeatures { + public static final DeferredRegister> FEATURES = + DeferredRegister.create(Registries.FEATURE, Stalinium.MODID); + public static final DeferredHolder, StaliniumVeinFeature> STALINIUM_VEIN = + FEATURES.register("stalinium_vein", + () -> new StaliniumVeinFeature(NoneFeatureConfiguration.CODEC)); + + private ModFeatures() {} + public static void register(IEventBus bus) { + FEATURES.register(bus); + } +} diff --git a/src/main/java/net/krituximon/stalinium/worldgen/ModOrePlacement.java b/src/main/java/net/krituximon/stalinium/worldgen/ModOrePlacement.java new file mode 100644 index 0000000..78383ab --- /dev/null +++ b/src/main/java/net/krituximon/stalinium/worldgen/ModOrePlacement.java @@ -0,0 +1,19 @@ +package net.krituximon.stalinium.worldgen; + +import net.minecraft.world.level.levelgen.placement.*; + +import java.util.List; + +public class ModOrePlacement { + public static List orePlacement(PlacementModifier pCountPlacement, PlacementModifier pHeightRange) { + return List.of(pCountPlacement, InSquarePlacement.spread(), pHeightRange, BiomeFilter.biome()); + } + + public static List commonOrePlacement(int pCount, PlacementModifier pHeightRange) { + return orePlacement(CountPlacement.of(pCount), pHeightRange); + } + + public static List rareOrePlacement(int pChance, PlacementModifier pHeightRange) { + return orePlacement(RarityFilter.onAverageOnceEvery(pChance), pHeightRange); + } +} \ No newline at end of file diff --git a/src/main/java/net/krituximon/stalinium/worldgen/ModPlacedFeatures.java b/src/main/java/net/krituximon/stalinium/worldgen/ModPlacedFeatures.java index f9d3428..1788900 100644 --- a/src/main/java/net/krituximon/stalinium/worldgen/ModPlacedFeatures.java +++ b/src/main/java/net/krituximon/stalinium/worldgen/ModPlacedFeatures.java @@ -6,26 +6,36 @@ import net.minecraft.core.registries.Registries; import net.minecraft.data.worldgen.BootstrapContext; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.levelgen.VerticalAnchor; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; -import net.minecraft.world.level.levelgen.placement.PlacedFeature; -import net.minecraft.world.level.levelgen.placement.PlacementModifier; +import net.minecraft.world.level.levelgen.placement.*; import java.util.List; +// ModPlacedFeatures.java public class ModPlacedFeatures { + public static final ResourceKey STALINIUM_VEIN_PLACED_KEY = + registerKey("stalinium_vein_placed"); public static void bootstrap(BootstrapContext context) { - var configuredFeatures = context.lookup(Registries.CONFIGURED_FEATURE); - + Holder> cfg = + context.lookup(Registries.CONFIGURED_FEATURE) + .getOrThrow(ModConfiguredFeatures.STALINIUM_VEIN_KEY); + List mods = List.of( + CountPlacement.of(1), + InSquarePlacement.spread(), + HeightRangePlacement.uniform( + VerticalAnchor.absolute(-64), + VerticalAnchor.absolute(-61) + ), + BiomeFilter.biome() + ); + context.register(STALINIUM_VEIN_PLACED_KEY, new PlacedFeature(cfg, mods)); } private static ResourceKey registerKey(String name) { - return ResourceKey.create(Registries.PLACED_FEATURE, ResourceLocation.fromNamespaceAndPath(Stalinium.MODID, name)); - } - - private static void register(BootstrapContext context, ResourceKey key, Holder> configuration, - List modifiers) { - context.register(key, new PlacedFeature(configuration, List.copyOf(modifiers))); + return ResourceKey.create(Registries.PLACED_FEATURE, + ResourceLocation.fromNamespaceAndPath(Stalinium.MODID, name)); } } \ No newline at end of file diff --git a/src/main/java/net/krituximon/stalinium/worldgen/StaliniumVeinFeature.java b/src/main/java/net/krituximon/stalinium/worldgen/StaliniumVeinFeature.java new file mode 100644 index 0000000..bbbd062 --- /dev/null +++ b/src/main/java/net/krituximon/stalinium/worldgen/StaliniumVeinFeature.java @@ -0,0 +1,44 @@ +package net.krituximon.stalinium.worldgen; + +import com.mojang.serialization.Codec; +import net.krituximon.stalinium.block.ModBlocks; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; + +public class StaliniumVeinFeature extends Feature { + public StaliniumVeinFeature(Codec codec) { + super(codec); + } + + @Override + public boolean place(FeaturePlaceContext ctx) { + LevelAccessor world = ctx.level(); + BlockPos center = ctx.origin(); + RandomSource rand = ctx.random(); + + // only spawn below Y = -60 + if (center.getY() > -60) return false; + + // place a 3x3x3 cube of compressed bedrock around center + BlockState bedrock = ModBlocks.COMPRESSED_BEDROCK.get().defaultBlockState(); + for (int dx = -1; dx <= 1; dx++) { + for (int dy = -1; dy <= 1; dy++) { + for (int dz = -1; dz <= 1; dz++) { + BlockPos pos = center.offset(dx, dy, dz); + world.setBlock(pos, bedrock, 2); + } + } + } + + // put the ore in the middle + BlockState ore = ModBlocks.STALINIUM_ORE.get().defaultBlockState(); + world.setBlock(center, ore, 2); + + return true; + } +}