Как сделать генерацию рудных жил реже чем 1 жила на 1 чанк?

Версия Minecraft
1.15.2
75
1
2
Хочу сделать генерацию ванильных и кастомных руд вместо маленьких жил повсюду, крупными жилами (по 100-150) блоков, но чтобы эти жилы генерировались в количестве 1 на 20 чанков. Подскажите, как это сделать, ведь майн не умеет генерировать меньше 1 жилы в чанке.
 
Решение
Хорошее решение: юзать другую стандартную фичу вместо ReplaceBlockFeature (не знаю, какую именно, найди сам)
Не очень хорошее решение: вместо супер-вызова в методе place написать своб логику генерации больше чем одного блока

Во втором случае нужно не выходить на пределы чанка и оставить отступ от краем чанка в 1 блок, чтобы не вызвать каскадную генерацию
7,099
324
1,510
Если у тебя стандартная генерация руды, то можешь дополнить ее таким "конфигом", который будет определять позиции генерации:
У меня в данном случае генерируется от 8 до 10 руд на чанк, поэтому возвращается стрим длиной 8-10 со случайными позициями в чанке. А тебе нужно возвращать стрим с одной случайной позицией
 
75
1
2
В том и загвоздка что генерация нестандартная. Мне нужно не определить позицию в чанке, а сгенерировать руду в каждом двадцатом чанке. Возможно есть способ поставить шанс 1/20 на успешную генерацию в чанке?
 
7,099
324
1,510
Конечно можно. Смотрим опять в генерацию моей руды: там идет фильтрация, чтобы генерировалось только в позициях находящихся рядом с крепостью. Заменяем это условие на рандомный true с вероятностью 1/20. Рандом там в аргументах есть
~~~
Вот как выше Агравэйн показал, такое условие
 
75
1
2
Вот, попробовал подогнать под себя, но остались проблеммы. На 1.15.2 нету ISeedReader, BiomeGenerationSettingsBuilder, BiomeLoadingEvent и CODEC. Каковы их аналоги на 1.15.2?


Java:
@Mod.EventBusSubscriber(modid = PetyasMod.MODID)
public class OreGeneration {

    private static ConfiguredFeature oreConfiguredFeature;

    private static ConfiguredFeature oreConfiguredFeature() {
        if (oreConfiguredFeature == null) {
            oreConfiguredFeature = new ReplaceBlockFeature(ReplaceBlockConfig.NO_FEATURE_CONFIG) {
                @Override
                public boolean generate(ISeedReader reader, ChunkGenerator generator, Random rand, BlockPos pos, ReplaceBlockConfig config) {
                    if(rand.nextInt(20) == 0)
                        return super.generate(reader, generator, rand, pos, config);
                    else
                        return false;
                }
            }.withConfiguration(new ReplaceBlockConfig(Blocks.STONE.getDefaultState(), ModBlocks.COPPER_ORE.get().getDefaultState()))
                    .withPlacement(new Height4To32(NoPlacementConfig.CODEC) {
                        @Override
                        public Stream<BlockPos> getPositions(Random random, NoPlacementConfig config, BlockPos pos) {
                            return IntStream.range(0, 8 + random.nextInt(3)).mapToObj((count) -> {
                                int j = random.nextInt(16) + pos.getX();
                                int k = random.nextInt(16) + pos.getZ();
                                int l = random.nextInt(64) + 4;
                                return new BlockPos(j, l, k);
                            });
                        }
                    }.configure(IPlacementConfig.NO_PLACEMENT_CONFIG));

        }

        return oreConfiguredFeature;
    }

    @SubscribeEvent
    public static void registerOreAtBiomes() {
        for(Biome biome : ForgeRegistries.BIOMES)
        if (!biome.getCategory().equals(Biome.Category.NETHER) && !biome.getCategory().equals(Biome.Category.THEEND))
            biome.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, oreConfiguredFeature());

    }

}
 
7,099
324
1,510
Внутри ReplaceBlockFeature есть метод generate. Его переопределение необязательно писать вручную. Сгенерируй его при помощи ide.
В 1.15 фичи генерации registerOreAtBiomes можно вызвать во время FMLLoadCompleteEvent. Также попробуй регать их через DeferredRegister
~~~
Еще можно посмотреть опенсорсные моды. Например в ae2 регаются через событие регистрации
 
Последнее редактирование:
75
1
2
Да, уже заметил что в registerOreAtBioms забыл указать FMLLoadCompleteEvent. Однако все равно спасибо. Насчет метода generate не понял, можно поподробнее? И что делать с ISeedReader и CODEC? 1.15.2 не знает что это такое и ругается.
 
7,099
324
1,510
Думаю, покатит вот так
Java:
new ReplaceBlockFeature(ReplaceBlockConfig::deserialize)

new Height4To32(NoPlacementConfig::deserialize)
 
7,099
324
1,510
ReplaceBlockFeature - это не жила, это замена одиночных блоков
Диапазон глубины генерации можно задать через getPosition, что логично, ведь этот метод возвращает позицию генерации
 
7,099
324
1,510
Хорошее решение: юзать другую стандартную фичу вместо ReplaceBlockFeature (не знаю, какую именно, найди сам)
Не очень хорошее решение: вместо супер-вызова в методе place написать своб логику генерации больше чем одного блока

Во втором случае нужно не выходить на пределы чанка и оставить отступ от краем чанка в 1 блок, чтобы не вызвать каскадную генерацию
 
Сверху