本篇教程的视频:

本篇教程源代码

GitHub地址:TutorialMod-Dimension-1.21

介绍

本篇教程我们将为我们的模组添加维度传送门

维度在MC中是一个很重要的概念,它是一个独立的世界,有自己的生物群系、生物实体等等

不过呢,这玩意现在也是数据驱动的了,所以我们得写一些json文件

传送门我们可以通过第三方的API来实现简单的传送门,这里我们将使用Custom Portal API,这里是它的GitHub地址

准备工作

那么先把第三方库的依赖加上

首先是maven仓库

1
2
3
repositories {
maven {url = "https://maven.kyrptonaught.dev"}
}

然后是具体的依赖

1
2
3
4
dependencies {
modImplementation 'net.kyrptonaught:customportalapi:0.0.1-beta66-1.21'
include 'net.kyrptonaught:customportalapi:0.0.1-beta66-1.21'
}

这里我们也使用include,直接将这个库囊括在我们的模组中,这样省的玩家去下载第三方的库了

然后重载Gradle,让它下载依赖,运行完之后再跑一下genSources,让它下载源代码

添加维度

注册维度

这里我们先来折腾维度,首先创建ModDimensions

1
2
3
public class ModDimensions {

}

这个类用于维度的注册

先是一些注册键

1
2
3
4
5
6
7
8
public static final RegistryKey<DimensionOptions> TEST_KEY = RegistryKey.of(RegistryKeys.DIMENSION,
Identifier.of(TutorialMod.MOD_ID, "test"));

public static final RegistryKey<World> TEST_LEVEL_KEY = RegistryKey.of(RegistryKeys.WORLD,
Identifier.of(TutorialMod.MOD_ID, "test"));

public static final RegistryKey<DimensionType> TEST_DIMENSION_TYPE_KEY = RegistryKey.of(RegistryKeys.DIMENSION_TYPE,
Identifier.of(TutorialMod.MOD_ID, "test_type"));

这里一共要写三个键,一个是维度的键,一个是世界的键,一个是维度类型的键

前两个的注册名字是一样的,后面的多了一个_type

然后我们用bootstrap方法来注册我们的维度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void bootstrap(Registerable<DimensionType> context) {
context.register(TEST_DIMENSION_TYPE_KEY, new DimensionType(
OptionalLong.of(12000),
false,
false,
false,
true,
1.0,
true,
false,
0,
256,
256,
BlockTags.INFINIBURN_OVERWORLD,
DimensionTypes.OVERWORLD_ID,
1.0f,
new DimensionType.MonsterSettings(false,false, UniformIntProvider.create(0,0),0)));
}

这里我们用DimensionType来注册我们的维度,这里面的参数有很多,我们一个个来看,这些都是维度的设置

  • OptionalLong.of(12000):形参OptionalLong fixedTime,这个是维度一天的时间
  • false:形参boolean hasSkyLight,这个是是否有天空光
  • false:形参boolean hasCeiling,这个是是否有天花板(下界有天花板,最上层是基岩层)
  • false:形参boolean ultrawarm,这个是是否是极热(下界就是极热维度)
  • true:形参boolean natural,这个是是否是自然维度
  • 1.0:形参float coordinateScale,这个是坐标缩放,比如下界一格等于主世界的八格
  • true:形参boolean bedWorks,这个是床能否工作
  • false:形参boolean respawnAnchorWorks,这个是重生锚能否工作
  • 0:形参int minY,这个是维度的最小高度
  • 256:形参int height,这个是维度的高度
  • 256:形参int logicalHeight,这个是逻辑高度
  • BlockTags.INFINIBURN_OVERWORLD:形参TagKey<Block> infiniburn,这个是维度的燃烧块,也就是在此维度中,在该方块上的火焰不会熄灭,如灵魂沙和灵魂火
  • DimensionTypes.OVERWORLD_ID:形参Identifier effects,这个是环境效果
  • 1.0f:形参float ambientLight,这个是环境光
  • 最后一个是MonsterSettings,这个是怪物的设置,第一个是piglinSafe,第二个是hasRaids,第三个是monsterSpawnLightTest,第四个是monsterSpawnBlockLightLimit

数据生成

然后我们在数据生成类TutorialModDataGenerator中注册这个bootstrap方法

1
registryBuilder.addRegistry(RegistryKeys.DIMENSION_TYPE, ModDimensions::bootstrap);

还有在ModWorldGen中注册

1
entries.addAll(registries.getWrapperOrThrow(RegistryKeys.DIMENSION_TYPE));

然后我们就可以跑数据生成了,我们会在data/tutorialmod/dimension_type中看到我们的维度类型文件

构造维度

那么接下来就是设置这个维度里面到底有什么了,有哪些生物群系?

先去这里Here

然后我们就可以看到一个json文件的编辑器,我们可以在这里编辑我们的维度中的生物群系,右上的一大块区域就是可视化框右下是预生成的维度文件

我们回到中间的那块区域,直接来看蓝绿色显示的那部分

我们将生物群系源选择为多重噪声,了解过MC地形生成原理的应该都知道这个噪声是什么东西

项目这栏可以更改生物群系,我们也可以用我们之前写的钻石大陆这个生物群系,不过是要你自己输入(不要输错,不然世界生成会崩溃),命名空间+生物群系注册名

下面的参数都是可以改的,包括温度湿度大陆性侵蚀奇异度深度偏移

这个你就自己玩吧,我这里就不多说了

当你编辑完之后,你可以点击右下下载,然后将这个文件放到resources/data/tutorialmod/dimension中,当然这里的名字要和呢注册的一致

另外记得要将开头的type改为tutorialmod:test_type,我们才算真正完成了这个维度的构造

添加传送门

传送门的添加相当简单,因为有了Custom Portal API,我们只需要在主类的onInitialize方法中注册传送门即可

1
2
3
4
5
6
CustomPortalBuilder.beginPortal()
.frameBlock(ModBlocks.ICE_ETHER_BLOCK)
.lightWithItem(ModItems.ICE_ETHER)
.destDimID(Identifier.of(TutorialMod.MOD_ID, "test"))
.tintColor(0xc76a4f)
.registerPortal();

这里我们使用了CustomPortalBuilder来创建传送门

frameBlock是传送门的框架方块

lightWithItem是传送门激活的物品

destDimID是传送门的目的地,填我们写的维度

tintColor是传送门的颜色

当然这里我们并没有规定传送门的大小,那就默认大于等于原版的大小即可

同样的,通过这个库中,你也可以试着构建水平的传送门,就像末地传送门一样

那么现在,我们就进入游戏,搭建一个传送门,看看我们的维度是什么样子的吧