Add Stalinium vein generation feature

This commit is contained in:
IM23a-spirgif
2025-05-13 13:44:43 +02:00
parent 4093160a67
commit bdf75da314
7 changed files with 156 additions and 21 deletions
@@ -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)
@@ -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<BiomeModifier> ADD_STALINIUM_ORE = registerKey("add_stalinium_ore");
public static final ResourceKey<BiomeModifier> ADD_COMPRESSED_BEDROCK = registerKey("add_compressed_bedrock");
public static void bootstrap(BootstrapContext<BiomeModifier> context) {
var placedFeatures = context.lookup(Registries.PLACED_FEATURE);
var biomes = context.lookup(Registries.BIOME);
// ModBiomeModifiers.java
public static void bootstrap(BootstrapContext<BiomeModifier> ctx) {
HolderGetter<Biome> biomes = ctx.lookup(Registries.BIOME);
HolderGetter<PlacedFeature> placed = ctx.lookup(Registries.PLACED_FEATURE);
HolderSet<PlacedFeature> 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<BiomeModifier> registerKey(String name) {
return ResourceKey.create(NeoForgeRegistries.Keys.BIOME_MODIFIERS, ResourceLocation.fromNamespaceAndPath(Stalinium.MODID, name));
}
@@ -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<ConfiguredFeature<?, ?>> STALINIUM_VEIN_KEY =
registerKey("stalinium_vein");
public static void bootstrap(BootstrapContext<ConfiguredFeature<?, ?>> context) {
register(context, STALINIUM_VEIN_KEY, ModFeatures.STALINIUM_VEIN.get(), NoneFeatureConfiguration.INSTANCE);
}
public static ResourceKey<ConfiguredFeature<?, ?>> registerKey(String name) {
return ResourceKey.create(Registries.CONFIGURED_FEATURE, ResourceLocation.fromNamespaceAndPath(Stalinium.MODID, name));
private static <FC extends FeatureConfiguration, F extends Feature<FC>> void register(
BootstrapContext<ConfiguredFeature<?, ?>> ctx,
ResourceKey<ConfiguredFeature<?, ?>> key,
F feature,
FC config) {
ctx.register(key, new ConfiguredFeature<>(feature, config));
}
private static <FC extends FeatureConfiguration, F extends Feature<FC>> void register(BootstrapContext<ConfiguredFeature<?, ?>> context,
ResourceKey<ConfiguredFeature<?, ?>> key, F feature, FC configuration) {
context.register(key, new ConfiguredFeature<>(feature, configuration));
private static ResourceKey<ConfiguredFeature<?, ?>> registerKey(String name) {
return ResourceKey.create(Registries.CONFIGURED_FEATURE,
ResourceLocation.fromNamespaceAndPath(Stalinium.MODID, name));
}
}
@@ -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<Feature<?>> FEATURES =
DeferredRegister.create(Registries.FEATURE, Stalinium.MODID);
public static final DeferredHolder<Feature<?>, StaliniumVeinFeature> STALINIUM_VEIN =
FEATURES.register("stalinium_vein",
() -> new StaliniumVeinFeature(NoneFeatureConfiguration.CODEC));
private ModFeatures() {}
public static void register(IEventBus bus) {
FEATURES.register(bus);
}
}
@@ -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<PlacementModifier> orePlacement(PlacementModifier pCountPlacement, PlacementModifier pHeightRange) {
return List.of(pCountPlacement, InSquarePlacement.spread(), pHeightRange, BiomeFilter.biome());
}
public static List<PlacementModifier> commonOrePlacement(int pCount, PlacementModifier pHeightRange) {
return orePlacement(CountPlacement.of(pCount), pHeightRange);
}
public static List<PlacementModifier> rareOrePlacement(int pChance, PlacementModifier pHeightRange) {
return orePlacement(RarityFilter.onAverageOnceEvery(pChance), pHeightRange);
}
}
@@ -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<PlacedFeature> STALINIUM_VEIN_PLACED_KEY =
registerKey("stalinium_vein_placed");
public static void bootstrap(BootstrapContext<PlacedFeature> context) {
var configuredFeatures = context.lookup(Registries.CONFIGURED_FEATURE);
Holder<ConfiguredFeature<?, ?>> cfg =
context.lookup(Registries.CONFIGURED_FEATURE)
.getOrThrow(ModConfiguredFeatures.STALINIUM_VEIN_KEY);
List<PlacementModifier> 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<PlacedFeature> registerKey(String name) {
return ResourceKey.create(Registries.PLACED_FEATURE, ResourceLocation.fromNamespaceAndPath(Stalinium.MODID, name));
}
private static void register(BootstrapContext<PlacedFeature> context, ResourceKey<PlacedFeature> key, Holder<ConfiguredFeature<?, ?>> configuration,
List<PlacementModifier> modifiers) {
context.register(key, new PlacedFeature(configuration, List.copyOf(modifiers)));
return ResourceKey.create(Registries.PLACED_FEATURE,
ResourceLocation.fromNamespaceAndPath(Stalinium.MODID, name));
}
}
@@ -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<NoneFeatureConfiguration> {
public StaliniumVeinFeature(Codec<NoneFeatureConfiguration> codec) {
super(codec);
}
@Override
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> 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;
}
}