完全按照插件中的预期生成新世界

时间:2014-05-31 02:09:46

标签: bukkit

我想在Minecraft中建立一个世界,然后在代码中复制它,所以当世界生成它时,建立一个空的世界,从最底层开始,一层10层高的静水无限地进行,然后是一个精确构建的结构坐标。大约0,0(我不介意在结构本身上输入阻塞块)。我并不完全理解如何实现这一目标,我想完全覆盖默认的世界。这样做的目的是,一旦完成,我可以将插件jar交给某人,他们可以将它放在他们的插件文件夹中,一旦服务器启动它就会产生这个世界(我也想也许每次加载服务器时都会重新生成世界,但是当重新加载插件时不会重新生成世界,因为我做了很多事情),想法?我一直在寻找如何做到这一点,但我一直在做空。

更新

我从我所遵循的教程中得到了这么多( watch?v = WsqTwUtubrg ),但我不明白如何让它覆盖默认代。这是我的代码:

主类:

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;
}
}

最终结果是基本平坦的世界一代(因为我已将它设置在服务器属性中**如果它设置为&#34;默认&#34;?)我仍然不明白我是怎么做的会建立一个结构。

1 个答案:

答案 0 :(得分:0)

在您的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循环。世界一代变得越来越复杂,这就是为什么我建议查看上面的教程。