-
Notifications
You must be signed in to change notification settings - Fork 3
API Reference(中文)
创建维度相关的API
template <std::derived_from<Dimension> D, class... Args>
DimensionType addDimension(std::string const& dimName, Args&&... args)
添加一个维度,维度名为dimName
,如果成功会返回此维度的DimensionType
,失败返回一个id
为-1的DimensionType
调用此函数,在维度类中必须存在一个叫generateNewData
并且返回类型为CompoundTag
的静态函数,generateNewData
的作用是为你自定义的维度类传输初始化时需要的参数。
比如MoreDimensions提供的简单维度类SimpleCustomDimension
需要知道生成维度的类型与种子,我们就通过generateNewData
来传递。
我们这样包装的初衷是不暴露维度的ID,避免开发者自定义ID造成ID出现混乱与冲突,让维度的ID完全由CustomDimensionManager
来管理。开发者只需提供维度名,不必去考虑ID的冲突
args
的参数则是依据维度类中的generateNewData
来定
例如MoreDimensions中的SimpleCustomDimension::generateNewData
接受一个uint的seed参数和一个GeneratorType的生成类型参数,那么这里这么调用:
more_dimensions::CustomDimensionManager::getInstance()
.addDimension<more_dimensions::SimpleCustomDimension>("Dimensin Name", 12345678, GeneratorType::Flat);
static DimensionType getDimensionIdFromName(std::string const& dimName);
注意,我们不建议使用此API,建议直接使用VanillaDimensions::fromString
获取
获取维度ID,使用维度名dimName
获取对应的DimensionType
。
一个由MoreDimensions提供的简单维度类,可以创建原版的Void
,Flat
,Overworld
,Nether
,TheEnd
这五种类型的维度
这也是一个示例维度类,以下主要是说明这些函数的作用,以便开发者参考
static CompoundTag generateNewData('自定义的参数');
这是一个必须提供的静态函数,其接受的参数由开发者自定义,作用是传输一些在初始化维度时需要用到的参数。
这个函数只是把这些自定义参数打包成了CompoundTag
,这个CompoundTag
会最后传给维度类的实例化函数。
SimpleCustomDimension(std::string const& name, DimensionFactoryInfo const& info);
维度类的实例化函数,其接受的参数固定,如果需要传输更多实例化时需要的参数,需在generateNewData
中自定义。
此函数的实现必须调用父类函数Dimension
的实例化函数,参考本示例类的写法:
SimpleCustomDimension::SimpleCustomDimension(std::string const& name, DimensionFactoryInfo const& info)
: Dimension(info.level, info.dimId, {-64, 320}, info.scheduler, name) {
...code...
}
这里说明一下Dimension实例化函数接受的参数:
Dimension(
info.level, /*这是Level的基类指针ILevel*/
info.dimId, /*维度id,不要更改*/
{-64, 320}, /*维度高度,这样设置即可*/
info.scheduler, /*不知道什么作用,也用不上,忽略*/
name /*维度名称*/
)
这个实例化函数中,参数info
里面包含了调用父类实例化函数所需的剩余参数,其中generateNewData
自定义的参数在info.data
:
SimpleCustomDimension::SimpleCustomDimension(std::string const& name, DimensionFactoryInfo const& info)
: Dimension(info.level, info.dimId, {-64, 320}, info.scheduler, name) {
loggerMoreDim.debug("{} dimension name:{}", __FUNCTION__, name);
mDefaultBrightness.sky = Brightness::MAX;
generatorType = *magic_enum::enum_cast<GeneratorType>((std::string_view)info.data["generatorType"]);
seed = info.data["seed"];
...code...
}
实例化函数内,最小程度初始化的成员变量有:mDefaultBrightness
,mSeaLevel
,mHasWeather
,mDimensionBrightnessRamp
如果你有自定义的变量,最好也初始化它们
SimpleCustomDimension::SimpleCustomDimension(std::string const& name, DimensionFactoryInfo const& info)
: Dimension(info.level, info.dimId, {-64, 320}, info.scheduler, name) {
loggerMoreDim.debug("{} dimension name:{}", __FUNCTION__, name);
mDefaultBrightness.sky = Brightness::MAX;
generatorType = *magic_enum::enum_cast<GeneratorType>((std::string_view)info.data["generatorType"]);
seed = info.data["seed"];
switch (generatorType) {
case GeneratorType::TheEnd: {
mSeaLevel = 63;
mHasWeather = false;
mDimensionBrightnessRamp = std::make_unique<OverworldBrightnessRamp>();
}
case GeneratorType::Nether: {
mSeaLevel = 32;
mHasWeather = false;
mDimensionBrightnessRamp = std::make_unique<NetherBrightnessRamp>();
}
default:
mSeaLevel = 63;
mHasWeather = true;
mDimensionBrightnessRamp = std::make_unique<OverworldBrightnessRamp>();
}
mDimensionBrightnessRamp->buildBrightnessRamp();
}
查看示例代码你会发现,最后后调用了buildBrightnessRamp()
,这也是必须的
对于mDimensionBrightnessRamp
的赋值,如果你不知道有什么用或者用不上,使用OverworldBrightnessRamp
构建一个即可
void init(br::worldgen::StructureSetRegistry const& structureSetRegistry)
这是一个覆写函数
维度初始化时会调用,必须调用父类Dimension
的init
函数。
除了有特别需要之外,直接调用父类的init
函数即可:
void SimpleCustomDimension::init(br::worldgen::StructureSetRegistry const& structureSetRegistry) {
setSkylight(false);
Dimension::init(structureSetRegistry);
}
std::unique_ptr<WorldGenerator> createGenerator(br::worldgen::StructureSetRegistry const&)
这是一个覆写函数
创建一个这个维度地形结构生成的WorldGenerator对象
如果你需要自定义维度的地形,从这个WorldGenerator
入手即可,本示例代码则是根据选择的地形类型,选择原版不同的地形生成器
其详细说明可以查看Wiki的示例插件FlatGeneratedVillages的WorldGenerator部分
另有以Flat世界类型的地皮系统地形generator-terrain
本示例类展示了如何去创建一个BDS可用的WorldGenerator对象,内容较长,请查看源码
这是一个覆写函数
void upgradeLevelChunk(ChunkSource& chunkSource, LevelChunk& oldLc, LevelChunk& newLc)
对旧区块的更新
此函数主要针对旧版本区块的更新,例如1.18时的洞穴更新,对旧区块y0附近基岩进行替换,y0以下高度的空间填充
如果没有特别需要,按照本示例类写即可:
void SimpleCustomDimension::upgradeLevelChunk(ChunkSource& cs, LevelChunk& lc, LevelChunk& generatedChunk) {
auto blockSource = BlockSource(getLevel(), *this, cs, false, true, false);
VanillaLevelChunkUpgrade::_upgradeLevelChunkViaMetaData(lc, generatedChunk, blockSource);
VanillaLevelChunkUpgrade::_upgradeLevelChunkLegacy(lc, blockSource);
}
这是一个覆写函数
目前尚未研究其作用
这是一个覆写函数
目前尚未研究其作用
这是一个覆写函数
目前尚未研究其作用
这是一个覆写函数
不同维度之间坐标的转换
在原版中,Nether
的坐标是Overworld
坐标的八倍,就是由此函数进行转换
这是一个覆写函数
目前尚未研究其作用
这是一个覆写函数
目前尚未研究其作用
这是一个覆写函数
获取云的高度,在BDS中的作用未知
这是一个覆写函数
目前尚未研究其作用