世界生成修改器
世界生成 这一部分提供了关于 Sponge 中的世界生成的一个简要概述。现在我们来看看如何修改或扩充它们。
所有希望更改世界生成的插件必须注册一个 WorldGeneratorModifier 。所有的 WorldGeneratorModifier
,也就是世界生成修改器都必须提供一个唯一的 ID,同时服务器管理员必须在关于世界的配置添加该 ID,若该 ID 已经添加进配置,世界生成时将会自动调用对应的 WorldGeneratorModifier
,以允许其修改世界生成。
创建世界生成修改器
我们先从 WorldGeneratorModifier
的格式开始。首先,我们需要实现了 WorldGeneratorModifier
接口的一个类:
import org.spongepowered.api.world.storage.WorldProperties;
private 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
时调用这个方法。
WorldProperties 和 DataContainer 作为方法参数传入,旨在方便开发者更方便地获取到世界的数据。比如你可以使用 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。比如我们想要把名为 skyland
的 WorldGeneratorModifier
添加到世界生成中,我们需要这么做:
# WorldGenerationModifiers to apply to the world
world-generation-modifiers=[
"sponge:skylands"
]
注意到 world-generation-modifiers
可能不存在,也就是默认情况下没有自定义的世界生成,因此在创建配置文件时就没有生成该值。
在后面的章节中我们将深入了解我们可以利用 WorldGeneratorModifier
做什么。