本篇教程的视频

(待发布)

本篇教程的源代码

(待发布)

介绍

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

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

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

前面的Fabric教程我们使用了Custom Portal API,它有一个Forge的移植版,这里我们来尝试一下

添加依赖

1
2
3
4
5
6
repositories {
maven {
name = "AzureDoom Mods"
url = "https://maven.azuredoom.com/mods"
}
}

然后是具体的模组和版本

1
2
3
dependencies {
implementation fg.deobf('net.kyrptonaught.customportalapi:customportalapi-reforged:1.0.2')
}

然后重新构建项目,下载依赖

添加维度

注册维度

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

1
2
3
public class ModDimensions {

}

这个类用于维度的注册

先是一些注册键

1
2
3
4
5
6
7
8
public static final ResourceKey<LevelStem> TEST_KEY = ResourceKey.create(Registries.LEVEL_STEM,
ResourceLocation.fromNamespaceAndPath(TutorialMod.MOD_ID, "test"));

public static final ResourceKey<Level> TEST_LEVEL_KEY = ResourceKey.create(Registries.DIMENSION,
ResourceLocation.fromNamespaceAndPath(TutorialMod.MOD_ID, "test"));

public static final ResourceKey<DimensionType> TEST_DIMENSION_TYPE_KEY = ResourceKey.create(Registries.DIMENSION_TYPE,
ResourceLocation.fromNamespaceAndPath(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(BootstapContext<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,
BuiltinDimensionTypes.OVERWORLD_EFFECTS,
1.0f,
new DimensionType.MonsterSettings(false,false, ConstantInt.of(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:形参ResourceLocation effectsLocation,这个是环境效果
  • 1.0f:形参float ambientLight,这个是环境光
  • 最后一个是MonsterSettings,这个是怪物的设置,第一个是piglinSafe,第二个是hasRaids,第三个是monsterSpawnLightTest,第四个是monsterSpawnBlockLightLimit

数据生成

然后我们在数据生成类ModWorldGenProvider中再加一行语句

1
2
3
4
5
6
public static final RegistrySetBuilder BUILDER = new RegistrySetBuilder()
.add(Registries.CONFIGURED_FEATURE, ModConfiguredFeatures::bootstrap)
.add(Registries.PLACED_FEATURE, ModPlacedFeatures::bootstrap)
.add(ForgeRegistries.Keys.BIOME_MODIFIERS, ModBiomeModifiers::bootstrap)
.add(Registries.BIOME, ModBiomes::bootstrap)
.add(Registries.DIMENSION_TYPE, ModDimensions::bootstrap);

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

构造维度

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

先去这里Here

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

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

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

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

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

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

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

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

注册传送门

最后我们在模组主类的commonSetup方法中,注册我们的传送门

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

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

  • frameBlock是传送门的框架方块
  • lightWithItem是传送门激活的物品
  • forcedSize是传送门的大小
  • destDimID是传送门的目的地,填我们写的维度
  • tintColor是传送门的颜色

测试

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