世界生成修改器

世界生成 这一部分提供了关于 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 以保证你的世界生成修改器只会应用于下界。

注册世界生成修改器

现在我们已经创建了我们的世界生成修改器,我们需要注册它。Sponge 建议开发者在游戏的 INITIALIZATION 阶段注册。通过调用 GameRegistry#register(Class, T) 方法,并将 WorldGeneratorModifier.class 传入第一个参数,你的世界生成修改器传入第二个参数,就可以完成注册过程。

@Listener
public void onGameInitialization(GameInitializationEvent event) {
    Sponge.getRegistry().register(WorldGeneratorModifier.class , 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 做什么。