Создайте новый мир точно так, как задумано в плагине

Я хочу построить мир в Minecraft, а затем воспроизвести его в коде, поэтому, когда мир генерируется, он строит пустой мир, начиная с самого низа, со слоем неподвижной воды высотой 10, который продолжается бесконечно, а затем со структурой, построенной в точных координатах. около 0,0 (я не против вводить блок за блоком в самой структуре). Я не совсем понимаю, как мне это сделать, я хочу полностью переопределить генерацию мира по умолчанию. Цель этого состоит в том, что, как только это будет сделано, я могу просто передать банку плагина кому-нибудь, и они могут поместить его в свою папку плагинов, и как только сервер запустится, он сгенерирует этот мир (я также хотел бы, возможно, регенерировать мир каждый раз, когда сервер загружается, но не когда плагин перезагружается, потому что я делаю это часто), мысли? Я искал, как это сделать, но мне не хватило.

обновить

У меня есть это из учебника, которому я следовал (watch?v=WsqTwUtubg), но я не понимаю, как заставить его переопределить генерацию по умолчанию. это код, который у меня есть:

Основной класс:

public ChunkGenerator getDefaultWorldGenerator(String worldname, String id){
    return new WorldGen(this);
}

Класс WorldGen:

public class WorldGen extends ChunkGenerator {
Main plugin;
public WorldGen(Main instance){
    plugin = instance;
}
public Location getFixedSpawnLocation(World world, Random random){return new Location(world, 0, 0, 0);}
public List<BlockPopulator> getDefaultPopulators(World world) {
    return new ArrayList<BlockPopulator>();
}
public byte[][] generatorBlockSections(World world, Random random, int chunkX, int chunkY, BiomeGrid biomeGrid) {
    byte[][] result = new byte[256 / 16][];
    int x, y, z;
    for (x = 0; x < 16; x++){
        for (z = 0; z < 16; z++){
            for (y = 0; y <= 9; y++){
                setBlock(result, x, y, z, (byte) Material.STATIONARY_WATER.getId());
            }
        }
    }
    return result;
}
@Override
public short[][] generateExtBlockSections(World world, Random random, int chunkX, int chunkY, BiomeGrid biomes){
    short[][] result = new short[256 / 16][];
    int x, y, z;

    for (x = 0; x < 16; x++){
        for (z = 0; z < 16; z++){
            for (y = 0; y <= 9; y++){
                setBlock(result, x, y, z, (short) Material.STATIONARY_WATER.getId());
            }
        }
    }
    return result;
}
private void setBlock(byte[][] result, int x, int y, int z, byte blockId) {
    if (result[y >> 4] == null){
        result[y >> 4] = new byte[4096];
    }
    result[y >> 4][((y & 0xF) << 8) | (z << 4) | x] = blockId;
}
private void setBlock(short[][] result, int x, int y, int z, short blockId) {
    if (result[y >> 4] == null){
        result[y >> 4] = new short[4096];
    }
    result[y >> 4][((y & 0xF) << 8) | (z << 4) | x] = blockId;
}
}

Конечным результатом была базовая генерация плоского мира (поскольку я установил его в свойствах сервера **, должен ли он быть установлен на «По умолчанию»?) Я до сих пор не очень понимаю, как я буду строить структуру.


person Tony    schedule 31.05.2014    source источник
comment
Вы уже пробовали что-нибудь, например, ChunkGenerator или BlockPopulator?   -  person    schedule 31.05.2014
comment
@xTrollxDudex Я добавил то, что пробовал, и у меня нет результатов, и я до сих пор не знаю, как мне построить с ним структуру :(   -  person Tony    schedule 31.05.2014


Ответы (1)


Обязательно добавьте в файл bukkit.yml следующее:

worlds:
  world:
    generator: ExamplePlugin

Замените «world» на название вашего мира и «ExamplePlugin» на название вашего плагина. На http://forums.bukkit.org/threads/the-always-up-to-date-definitive-guide-to-terrain-generation-part-one-prerequisites-and-setup.93982/. Для создания пользовательских структур вам потребуется создать расширение BlockPopulator, в котором вы переопределите метод populate() примерно так:

public void populate(World world, Random rand, Chunk chunk) {
    chunk.getBlockAt(0, 64, 0).setType(Material.STONE);
}

Это сделает блок (0, 64, 0) в каждом фрагменте каменным. Чтобы сделать строки из блоков, используйте циклы for. Чтобы сделать прямоугольники или кубоиды, используйте вложенные циклы for. Генерация мира быстро усложняется, поэтому я бы порекомендовал изучить учебники, подобные приведенному выше.

person Finn    schedule 23.08.2014