Отмена генерации ванильного блока

Мне внезапно понадобилось отменить генерацию глины в мире, чтобы потом добавить свою, как это сделать?
Forge 1.7.10
 
Что, всё настолько плохо? А можно ли тогда заменить все блоки глины, сгенерившиеся в мире, на другой?
 

timaxa007

Модератор
5,831
409
672
WerDei написал(а):
Что, всё настолько плохо?
Можно и так сказать (написать).
WerDei написал(а):
А можно ли тогда заменить все блоки глины, сгенерившиеся в мире, на другой?
Да.
[merge_posts_bbcode]Добавлено: 20.01.2015 00:00:53[/merge_posts_bbcode]

В главном файле или где надо:
Код:
GameRegistry.registerWorldGenerator(new GeneratorMyClay(), 0);
Код:
public class GeneratorMyClay implements IWorldGenerator {

    @Override
    public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) {
        switch(world.provider.dimensionId) {
        case -1:generateNether(world, random, chunkX * 16, chunkZ * 16);break;
        case 0:generateSurface(world, random, chunkX * 16, chunkZ * 16);break;
        case 1:generateEnd(world, random, chunkX * 16, chunkZ * 16);break;
        }
    }

    private void generateEnd(World world, Random random, int x, int y) {

    }

    private void generateSurface(World world, Random random, int x, int z) {

        for (int y = 1; y < world.getHeight(); ++y) {
           for (int x1 = x; x < x + 16; x1++) {
              for (int z1 = z; z < z + 16; z1++) {
                  if (world.getBlock(x1, y, z1) == Blocks.clay) {
                      world.setBlock(x1, y, z1, MyMod.block_my_clay);
                  }
               }
            }
        }

    }

    private void generateNether(World world, Random random, int x, int y) {

    }

}
Ну, как-то так.
 

tox1cozZ

aka Agravaine
8,456
598
2,893
Тимаха, я же тебе говорил, что так делать плохо.
Игра будет "висеть" при подгрузке чанков.
Вот так лучше:

Код:
@SubscribeEvent
    public  void populateChunk(PopulateChunkEvent.Pre event){
        Chunk chunk = event.world.getChunkFromChunkCoords(event.chunkX, event.chunkZ);
        for(ExtendedBlockStorage storage : chunk.getBlockStorageArray()){
            if(storage != null){
                for(int x = 0; x < 16; x++){
                    for(int z = 0; z < 16; z++){
                        for(int y = 0; y < 256; y++){
                            if(storage.getBlockByExtId(x, y, z) == Blocks.coal_ore){
                                storage.setExtBlockMetadata(x, y, z, ModBlocks.stratifiedCoalOre.damageDropped(0));
                            }
                        }
                    }
                }
            }
        }
 

timaxa007

Модератор
5,831
409
672
Agravaine написал(а):
Тимаха, я же тебе говорил, что так делать плохо.
Игра будет "висеть" при подгрузке чанков.
Да, ты писал мне про это. В последнее время я другим занят. Про этот эвент я не знал. В некотором вроде, спасибо за код.
 
Agravaine написал(а):
Тимаха, я же тебе говорил, что так делать плохо.
Игра будет "висеть" при подгрузке чанков.
Вот так лучше:

Код:
@SubscribeEvent
    public  void populateChunk(PopulateChunkEvent.Pre event){
        Chunk chunk = event.world.getChunkFromChunkCoords(event.chunkX, event.chunkZ);
        for(ExtendedBlockStorage storage : chunk.getBlockStorageArray()){
            if(storage != null){
                for(int x = 0; x < 16; x++){
                    for(int z = 0; z < 16; z++){
                        for(int y = 0; y < 256; y++){
                            if(storage.getBlockByExtId(x, y, z) == Blocks.coal_ore){
                                storage.setExtBlockMetadata(x, y, z, ModBlocks.stratifiedCoalOre.damageDropped(0));
                            }
                        }
                    }
                }
            }
        }
А куда его пихать? Я тут попробовал его вставить... Крашается при генерации мира:
Код:
package assets.firstmod.src;

import java.util.Random;

import net.minecraft.init.Blocks;
import net.minecraft.world.World;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.IChunkProvider;
import net.minecraft.world.chunk.storage.ExtendedBlockStorage;
import net.minecraftforge.event.terraingen.PopulateChunkEvent;
import net.minecraftforge.event.terraingen.PopulateChunkEvent.Pre;
import cpw.mods.fml.common.IWorldGenerator;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;

public class ClayChanger implements IWorldGenerator {

    @Override
    public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) {

        PopulateChunkEvent.Pre event = new Pre(chunkGenerator, world, random, chunkZ, chunkZ, false);
        populateChunk(event);
        
    }
    
    @SubscribeEvent
    public  void populateChunk(PopulateChunkEvent.Pre event){
        Chunk chunk = event.world.getChunkFromChunkCoords(event.chunkX, event.chunkZ);
        for(ExtendedBlockStorage storage : chunk.getBlockStorageArray()){
            if(storage != null){
                for(int x = 0; x < 16; x++){
                    for(int z = 0; z < 16; z++){
                        for(int y = 0; y < 256; y++){
                            if(storage.getBlockByExtId(x, y, z) == Blocks.clay){
                                storage.setExtBlockMetadata(x, y, z, FirstMod.White_clay_block.damageDropped(0));
                            }
                        }
                    }
                }
            }
        }
    }

}
 

timaxa007

Модератор
5,831
409
672
Сверху