世界生成修改器

警告

这些文档是为 SpongeAPI 7 编写的,可能已经过时。 如果你觉得你可以帮助更新它们,请提交一个 PR!

世界生成 这一部分提供了关于 Sponge 中的世界生成的一个简要概述。现在我们来看看如何修改或扩充它们。

所有希望更改世界生成的插件必须注册一个 WorldGeneratorModifier 。所有的 WorldGeneratorModifier ,也就是世界生成修改器都必须提供一个唯一的 ID,同时服务器管理员必须在关于世界的配置添加该 ID,若该 ID 已经添加进配置,世界生成时将会自动调用对应的 WorldGeneratorModifier ,以允许其修改世界生成。

创建世界生成修改器

我们先从 WorldGeneratorModifier 的格式开始。首先,我们需要实现了 WorldGeneratorModifier 接口的一个类:

import org.spongepowered.api.world.storage.WorldProperties;

public class MyModifier implements WorldGeneratorModifier {

    @Override
    public String getId() {
        return "pluginid:mymodifier";
    }

    @Override
    public String getName() {
        return "My Modifier";
    }

    @Override
    public void modifyWorldGenerator(WorldProperties world, DataContainer settings, WorldGenerator worldGenerator) {

    }

}

正如你所看到的一样,我们需要覆写 WorldGeneratorModifier 的三种方法。首先我们必须覆写 CatalogType#getId() 以使其返回一个用于 WorldGeneratorModifier 的唯一常量标识符,该常量标识符将用于关于世界的配置,并用于指定你的世界生成修改器应该应用于哪个世界。同时,我们也必须覆写 CatalogType#getName() 方法以提供用一个简单并可读性强的常量名称。

第三个需要覆写方法是你对世界生成器进行更改的位置。这个方法由游戏调用,游戏会在一个世界已经指定应用你的 WorldGeneratorModifier 时调用这个方法。

WorldPropertiesDataContainer 作为方法参数传入,旨在方便开发者更方便地获取到世界的数据。比如你可以使用 WorldProperties 以保证你的世界生成修改器只会应用于下界。

注册世界生成修改器

现在你已创建世界生成修改器的对象,接下来你只需要通过 GameRegistry 注册它就可以了。注册的方式是监听 GameRegistryEvent.Register<WorldGeneratorModifier> 事件,然后在那里注册,就像下面这样:

@Listener
public void onWorldGeneratorModifierRegistration(GameRegistryEvent.Register<WorldGeneratorModifier> event) {
    event.register(new MyModifier());
}

若要将你的世界生成修改器应用于一个世界,你必须在世界的配置文件(位于 config/sponge/worlds/[dimension]/[worldName]/world.conf )中的 world-generation-modifiers 数组下添加相应的 ID。比如我们想要把名为 skylandWorldGeneratorModifier 添加到世界生成中,我们需要这么做:

# WorldGenerationModifiers to apply to the world
world-generation-modifiers=[
    "sponge:skylands"
]

注意到 world-generation-modifiers 可能不存在,也就是默认情况下没有自定义的世界生成,因此在创建配置文件时就没有生成该值。

在后面的章节中我们将深入了解我们可以利用 WorldGeneratorModifier 做什么。