tutorial:features
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| tutorial:features [2023/12/17 14:20] – solidblock | tutorial:features [2024/10/28 17:58] (current) – Fix new identifier vs Identifier.of cassiancc | ||
|---|---|---|---|
| Line 20: | Line 20: | ||
| < | < | ||
| public class ExampleFeature extends class_3031< | public class ExampleFeature extends class_3031< | ||
| - | public ExampleFeature(Codec< | + | public ExampleFeature(Codec< |
| - | | + | |
| } | } | ||
| Line 36: | Line 36: | ||
| // don't worry about where these come from-- we'll implement these methods soon | // don't worry about where these come from-- we'll implement these methods soon | ||
| int number = config.number(); | int number = config.number(); | ||
| - | class_2960 | + | class_2960 |
| - | class_2680 blockState = class_7923.field_41175.get(blockID).method_9564(); | + | class_2680 blockState = class_7923.field_41175.get(blockId).method_9564(); |
| - | // ensure the ID is okay | + | // ensure the ID is okay |
| - | if (blockState == null) throw new IllegalStateException(blockID | + | if (blockState == null) throw new IllegalStateException(blockId |
| // find the surface of the world | // find the surface of the world | ||
| Line 50: | Line 50: | ||
| if (world.method_8320(testPos.method_10086()).isOf(class_2246.field_10124)) { | if (world.method_8320(testPos.method_10086()).isOf(class_2246.field_10124)) { | ||
| for (int i = 0; i < number; i++) { | for (int i = 0; i < number; i++) { | ||
| - | // create a simple pillar of blocks | + | |
| world.method_8501(testPos, | world.method_8501(testPos, | ||
| testPos = testPos.method_10086(); | testPos = testPos.method_10086(); | ||
| Line 61: | Line 61: | ||
| } | } | ||
| } | } | ||
| - | // the game couldn' | + | // the game couldn' |
| return false; | return false; | ||
| } | } | ||
| Line 70: | Line 70: | ||
| < | < | ||
| public record ExampleFeatureConfig(int number, Identifier blockId) implements FeatureConfig { | public record ExampleFeatureConfig(int number, Identifier blockId) implements FeatureConfig { | ||
| - | public static Codec< | + | public static |
| - | instance -> | + | instance -> instance.group( |
| - | | + | |
| // you can add as many of these as you want, one for each parameter | // you can add as many of these as you want, one for each parameter | ||
| Codecs.POSITIVE_INT.fieldOf(" | Codecs.POSITIVE_INT.fieldOf(" | ||
| Line 83: | Line 82: | ||
| <code java> | <code java> | ||
| - | public class FeatureExampleMod | + | public class ExampleMod |
| - | public static final Identifier EXAMPLE_FEATURE_ID = new Identifier(" | + | public static final Identifier EXAMPLE_FEATURE_ID = Identifier.of(" |
| - | public static | + | public static |
| @Override | @Override | ||
| public void onInitialize() { | public void onInitialize() { | ||
| - | Registry.register(Registry.FEATURE, EXAMPLE_FEATURE_ID, | + | Registry.register(Registries.FEATURE, EXAMPLE_FEATURE_ID, |
| } | } | ||
| } | } | ||
| Line 102: | Line 101: | ||
| public class FeatureExampleMod implements ModInitializer { | public class FeatureExampleMod implements ModInitializer { | ||
| - | public static final Identifier EXAMPLE_FEATURE_ID = new Identifier(" | + | public static final Identifier EXAMPLE_FEATURE_ID = Identifier.of(" |
| - | public static | + | public static |
| - | public static ConfiguredFeature< | + | public static |
| - | | + | EXAMPLE_FEATURE, |
| - | new ExampleFeatureConfig(10, | + | new ExampleFeatureConfig(10, |
| ); | ); | ||
| Line 118: | Line 117: | ||
| } | } | ||
| </ | </ | ||
| + | |||
| + | FIXME The last line has to be updated | ||
| ==== Adding a configured feature to a biome ==== | ==== Adding a configured feature to a biome ==== | ||
| Line 124: | Line 125: | ||
| Our final initializer class looks like this: | Our final initializer class looks like this: | ||
| < | < | ||
| - | public class FeatureExampleMod | + | public class ExampleMod |
| - | public static final Identifier EXAMPLE_FEATURE_ID = new Identifier(" | + | public static final Identifier EXAMPLE_FEATURE_ID = Identifier.of(" |
| - | public static | + | public static |
| - | public static ConfiguredFeature< | + | public static |
| - | | + | EXAMPLE_FEATURE, |
| - | new ExampleFeatureConfig(10, | + | new ExampleFeatureConfig(10, |
| ); | ); | ||
| // our PlacedFeature. this is what gets passed to the biome modification API to add to the biome. | // our PlacedFeature. this is what gets passed to the biome modification API to add to the biome. | ||
| Line 136: | Line 137: | ||
| RegistryEntry.of( | RegistryEntry.of( | ||
| EXAMPLE_FEATURE_CONFIGURED | EXAMPLE_FEATURE_CONFIGURED | ||
| - | // the SquarePlacementModifier makes the feature generate a cluster of pillars each time | + | |
| ), List.of(SquarePlacementModifier.of()) | ), List.of(SquarePlacementModifier.of()) | ||
| ); | ); | ||
| Line 142: | Line 143: | ||
| @Override | @Override | ||
| public void onInitialize() { | public void onInitialize() { | ||
| - | // register the features | + | |
| Registry.register(class_7923.field_41144, | Registry.register(class_7923.field_41144, | ||
| - | Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, | ||
| - | Registry.register(BuiltinRegistries.PLACED_FEATURE, | ||
| - | // add it to overworld biomes using FAPI | + | |
| BiomeModifications.addFeature( | BiomeModifications.addFeature( | ||
| BiomeSelectors.foundInOverworld(), | BiomeSelectors.foundInOverworld(), | ||
| // the feature is to be added while flowers and trees are being generated | // the feature is to be added while flowers and trees are being generated | ||
| GenerationStep.Feature.VEGETAL_DECORATION, | GenerationStep.Feature.VEGETAL_DECORATION, | ||
| - | RegistryKey.of(Registry.PLACED_FEATURE_KEY, EXAMPLE_FEATURE_ID)); | + | RegistryKey.of(RegistryKeys.PLACED_FEATURE, EXAMPLE_FEATURE_ID)); |
| } | } | ||
| } | } | ||
tutorial/features.1702822807.txt.gz · Last modified: 2023/12/17 14:20 by solidblock