Замена камня на другой блок в собственном биоме

Версия Minecraft
1.15.2
205
12
103
Всем привет. Хочу в биоме заменить генерацию камня на блок, созданный мной. Смотрю в билдер окружения, вижу там следующие опции:
Java:
   public SurfaceBuilderConfig(BlockState topMaterial, BlockState underMaterial, BlockState underWaterMaterial) {
      this.topMaterial = topMaterial;
      this.underMaterial = underMaterial;
      this.underWaterMaterial = underWaterMaterial;
   }
Сперва думал что underWaterMaterial как раз определяет блок, который будет генерироваться под землей, но это не подтвердилось. Я вообще не нахожу указанный мною блок в сгенерированном биоме, на его месте появляется обычный камень. Потому напрашивается вопрос: каким образом можно заменить камень на свой блок?

Биом:
Java:
public class TerraForestBiome extends Biome {
    public TerraForestBiome(Builder biomeBuilder) {
        super((new Biome.Builder()
                .surfaceBuilder(new ConfiguredSurfaceBuilder<SurfaceBuilderConfig>(SurfaceBuilder.DEFAULT, new SurfaceBuilderConfig(
                                AmbientBlocks.Blocks.grass.getDefaultState(),
                                AmbientBlocks.Blocks.dirt.getDefaultState(),
                                AmbientBlocks.Blocks.stone.getDefaultState())))
                .precipitation(RainType.RAIN)
                .category(Category.PLAINS)
                .downfall(0.25F)
                .depth(0.1F)
                .scale(0.1F)
                .temperature(0.8F)
                .waterColor(4159204)
                .waterFogColor(329011)
                .parent(null)));

        this.addCarver(GenerationStage.Carving.AIR, Biome.createCarver(WorldCarver.CAVE, new ProbabilityConfig(0.2F)));
        this.addCarver(GenerationStage.Carving.AIR, Biome.createCarver(WorldCarver.CANYON, new ProbabilityConfig(0.02F)));
    }
}

Тип мира для упрощения теста:
Java:
public class TerraWorldType extends WorldType {
    public TerraWorldType(String name) {
        super(name);
    }

    @Override
    public ChunkGenerator<?> createChunkGenerator(World world) {
        OverworldGenSettings settings = new OverworldGenSettings();
        SingleBiomeProviderSettings single = new SingleBiomeProviderSettings(world.getWorldInfo());
        single.setBiome(ModBiomes.Biomes.forest);
        return new OverworldChunkGenerator(world, new SingleBiomeProvider(single), settings);
    }
}

UPD: Немного почитав разных форумов узнал, что, мол, лучше сгенерить отдельный мир, если планируются настолько фундаментальные изменения. Что думаете?
UPD^2: Нашел в GenerationSettings переменную:
Java:
protected BlockState defaultBlock = Blocks.STONE.getDefaultState();
Что-то мне подсказывает что без АСМ тут не обойтись.
 
Последнее редактирование:
Последнее редактирование:
Ага, оно. Кормодовое, скорее всего. Но я хз как там сейчас с ними на 1.15 дела обстоят.

блок покрывающий дно в озерах и других водоемах.
Я затем тоже проверил эту теорию. Мелкие озера оно не покрывало. Скорее всего, речь об океанических биомах или чем-то вроде этого. Там же гравий на дней, емнип. Хотя хрен его знает. Я тут вообще в печали от такой тупости с генерацией.
 
1.15 дела обстоят.
Мне казалось она универсальна на все версии(искльчение над оредачить под ниже 1.8 потому что там классы форджа другой путь имеют). Это не так?
 
Я и сам толком не знаю. Прошлое мое знакомство с этой гадостью выглядело примерно так:
  • Ну всё, ща как заинжектюсь, ууух.
  • Так, ага, кормод... Допустим.
  • Агааа, билд сломался. Отлично, ладно, стерпим.
  • Ммм, оно еще и не заводится по-человечески, круто
  • О, а вот и конфликты с другими модами, это их еще резолвить надо, ну за шо (хотя изначальная цель все еще не была достигнута)
  • сотню попыток спустя Ты сегодня вообще заведешься? Я с утра на первую пару реще встаю, чем ты запускаешься
  • Ой, все, пошло оно всё в болото. Пойду наклепаю стак однотипных блоков и опять заброшу проект

И всё это, естественно, сопровождалось тоннами благого мата. Зацензурил как мог.
 
5 минут просмотра кода
В своем биоме переопредели buildSurface и используй defaultBlock не из аргументов, а свой.

Это всего лишь 5 минут, может и не работает. Но этот способ ты вроде не юзал, по этому написал..
 
ну ты заменил поверхостный слой на камень) И все. Ты не видел что я творила:
unknown.png
 
Я изменил вообще всё, вероятно. У меня там все из камня было. Причем из ванильного, хотя я указывал другое



Java:
public class TerraForestBiome extends Biome {
    public TerraForestBiome(Builder biomeBuilder) {
        super((new Biome.Builder()
                .surfaceBuilder(new ConfiguredSurfaceBuilder<SurfaceBuilderConfig>(SurfaceBuilder.DEFAULT, new SurfaceBuilderConfig(
                        AmbientBlocks.Blocks.grass.getDefaultState(),
                        AmbientBlocks.Blocks.dirt.getDefaultState(),
                        AmbientBlocks.Blocks.stone.getDefaultState())))
                .precipitation(RainType.RAIN)
                .category(Category.PLAINS)
                .downfall(0.25F)
                .depth(0.1F)
                .scale(0.3F)
                .temperature(0.8F)
                .waterColor(4159204)
                .waterFogColor(329011)
                .parent(null)));
    }

    @Override
    public void buildSurface(Random random, IChunk chunkIn, int x, int z, int startHeight, double noise, BlockState defaultBlock, BlockState defaultFluid, int seaLevel, long seed) {
        this.surfaceBuilder.buildSurface(random, chunkIn, this, x, z, startHeight, noise, AmbientBlocks.Blocks.stone.getDefaultState(), defaultFluid, seaLevel, seed);
    }
}
 
Назад
Сверху