Add Stalinium vein generation feature
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user