欢迎光临散文网 会员登陆 & 注册

我的世界 fabric 1.20.1 开发教程 ep1 前言

2023-07-29 19:16 作者:Flandre芙兰  | 我要投稿

# 前言


官方wiki:fabricmc.net/wiki/zh_cn


有中文,非常详细。



# Minecraft开发的基础


- 具有Java基础,熟悉JAVA的语法,例如Lambda,泛型,语法糖,和基础的语法。

- 具有使用互联网查找答案的基础



# 模组编写什么


给Minecraft游戏中增加或者修改内容



# Fabric是什么


写模组的工具,分为几个部分


- Fabric Loader - 加载Minecraft代码修改的框架

- Fabric Loom 给Fabirc的mod构建系统

- Fabric 语言模块 提供了JVM上其他语言开发,例如Kotlin和Scala

- Fabric API - 提供了添加修改Minecraft内容的工具

- Fabric Installer - 安装Fabric Loader到Minecraft 的工具


由于Minecraft是商业版的游戏,没有开源的代码,mojang为了防止盗版,混淆了Minecraf的代码,所以在我们idea中看到的源代码是经过反混淆后的代码,但是这些代码在反混淆之前是一些随机名称,命名的代码,例如一个版本的方法是abc,而到了下一个版本就是abd了。Fabric提供了一套映射工具给每个名称另外起了一个能看得懂的名字。


当然反混淆的yarn并没有做到将全部的名称修改掉,你还是会在编程过程中看到混淆之前的名称。



# 代码结构


## 注册表


游戏中的方块,物品的等内容在游戏加载时候会放入注册表,游戏在通过这些注册表的内容去获得相应的实体。例如Item 和ItemStack


另外游戏还有数据驱动的一些功能,例如方块的贴图等等。



## 端


Minecraft运行在两个线程,服务器端和客户端,单人游戏你自己进入世界就相当于开启了一个服务器端,和一个客户端。


如果是多人游戏,相当于服务端是你输入的地址是服务器端,而你操作的是客户端。


在服务端和客户端上的数据要保持一致,例如区块,箱子的内容,玩家的位置。


服务端主要负责的是游戏的逻辑相关的内容,而客户端负责的是界面,GUI等。


所以在编程时候不要在服务器调用客户端相关的内容,也不要再客户端执行一些逻辑后不将数据同步到服务器。



# Fabric编写的内容


Fabric提供了一些修改和增加Minecraft原版的内容的方法和工具,当然也并不是全部,此外还有许多的第三方的库可以帮你完成工作。



# Minecraft API


Minecraft本身就有一部分的API是可以直接使用的, 你不要重复的造轮子,例如Registry类可以直接注册方块和物品。


此外使用JSON数据可以驱动很多的共。你可以在mod开发中使用,Fabric会自动注入。例如方块的纹理,掉落物表等等。



# Fabric API


Fabric API主打一个轻量级,快速移植新版本, 所以API并不是涵盖了所有的内容,主要有常见的事件,联网和渲染相关的内容。



## 第三方API


第三方API填补Fabirc API轻量级的空白。应该尽量使用Fabric API 和第三方API ,尽量不要直接自己编写Mixin


第三方API WIKI 列表:https://fabricmc.net/wiki/zh_cn:tutorial:libraries



# Mixin


Mixin强大,可以直接修改Minecraft自己的代码,但是多个mod之间会引起冲突。


Mixin提供了几种功能


- 添加接口


mixin的安全方法之一,添加新的接口到Minecraft类中,通过强制转化访问接口,不会冲突。


- 回调注入


@Inject 向现有的方法中添加回调钩子,还可以拦截更改返回值,回调可以堆叠,不会冲突


- 重定向注入


@Redirect 让你的代码可以调用访问目标方法的变量,仅会重定向一次,如果多个mod对目标代码进行了重定向就会冲突。


- 覆写


极有可能冲突,不要怎么干。


# 阅读Minecraft代码


Minecraft没有什么文档,而且很容易过时,所以直接看源代码是好的。


# 搜索Minecraft 主类


idea 中 ctrl+N 将搜索范围设置为 项目和库


# 查找你想看到的类


看其他的开源的mod如何做


注册相关的可以在 `net.minecraft.util.registry.Registry`看到


所有的类从net.minecraft.client.main.Main 和 net.minecraft.server.Main 继承出来,可以通过这两个父类查找。


# 注册表


这里是添加游戏内容的地方,例如方块,物品,等等。


# 标准注册表


## 一般注册表


这些注册表对很多类型的模组都有用:


* `Registry.REGISTRIES`

  * 包含所有的注册表。

* `Registry.BLOCK`

  * 包含所有的[方块](https://fabricmc.net/wiki/zh_cn:tutorial:blocks "zh_cn:tutorial:blocks")。

* `Registry.ITEM`

  * 包含所有的[物品](https://fabricmc.net/wiki/zh_cn:tutorial:items "zh_cn:tutorial:items")(包括方块物品)。

* `Registry.BLOCK_ENTITY_TYPE`

  * 包含每个[方块实体](https://fabricmc.net/wiki/zh_cn:tutorial:blockentity "zh_cn:tutorial:blockentity")的 `BlockEntityType`。方块实体类型用来反序列化方块实体并储存兼容的方块。

* `Registry.STATUS_EFFECT`

  * 包含所有的[状态效果](https://fabricmc.net/wiki/zh_cn:tutorial:status_effects "zh_cn:tutorial:status_effects"),如隐身和夜视。

* `Registry.PARTICLE_TYPE`

  * 包含所有的[粒子类型](https://fabricmc.net/wiki/zh_cn:tutorial:particles "zh_cn:tutorial:particles")。

* `Registry.FLUID`

  * 包含所有的[流体](https://fabricmc.net/wiki/zh_cn:tutorial:fluids "zh_cn:tutorial:fluids")。

* `Registry.ENCHANTMENT`

  * 包含所有的附魔。

* `Registry.POTION`

  * 包含所有不同的药水类型,比如“long potion of night vision”“water”或“potion of luck”。

* `Registry.DIMENSION_TYPE`

  * 包含所有的维度类型。

* `Registry.SCREEN_HANDLER`

  * 包含所有的屏幕处理器(screen handlers)。屏幕处理器用于在服务器和客户端之间同步 GUI 状态。

* `Registry.RECIPE_TYPE`

  * 包含所有的[配方类型](https://fabricmc.net/wiki/zh_cn:tutorial:recipe_types_introduction "zh_cn:tutorial:recipe_types_introduction")。

* `Registry.RECIPE_SERIALIZER`

  * 包含所有的配方序列化器。配方序列化器用于加载配方,同一类型可以有多个序列化器(例如有序和无需合成配方)。

* `Registry.PAINTING_MOTIVE`

  * 包含所有的画的类型。

* `Registry.SOUND_EVENT`

  * 包含所有的[声音事件](https://fabricmc.net/wiki/zh_cn:tutorial:sounds "zh_cn:tutorial:sounds")如 `entity.item.pickup`。

* `Registry.STAT`

  * 包含所有不同的统计类型。统计使用泛型 `<T>`,用于获取不同 `T` 值的不同数据。

    * 不依赖于外部内容的统计,如 `walk_one_cm`,使用 `custom` 统计类型,它使用注册的 `Identifier` 作为 `T` 类型。

    * 不属于 `custom` 统计的统计可能依赖于特定的方块或者物品类型,如 `Stats.MINED`。

* `Registry.CUSTOM_STAT`

  * 包含所有的“自定义统计”,即不依赖于外部内容的统计 ID。


## 实体


绝大多数这些注册表,除了 `ENTITY_TYPE` 自身,都与实体 AI 有关。


* `Registry.ENTITY_TYPE`

  * 包含每个[实体](https://fabricmc.net/wiki/zh_cn:tutorial:entity "zh_cn:tutorial:entity")的实体类型(`EntityType`)。类似于方块实体类型,实体类型用于同步和取消序列化。

* `Registry.SCHEDULE`

  * 包含实体(通常是村民)的时刻表。时刻表控制实体基于一天内时间的行为。

* `Registry.ACTIVITY`

  * 控制实体(通常是村民)的活动。这些活动,比如 `play` 或 `work`,控制实体的行为。

* `Registry.SENSOR_TYPE`

  * 包含每个实体传感器的类型。传感器允许实体“感受”不同的事物,并将其储存在记忆中。

  * 类似于时刻表和活动,主要用于村民。

* `Registry.MEMORY_MODULE_TYPE`

  * 包含所有类型的记忆模块。记忆模块描述了实体能够记住的不同内容。

* `Registry.VILLAGER_TYPE`

  * 包含所有村民生物群系类型。

* `Registry.VILLAGER_PROFESSION`

  * 包含所有村民职业。

* `Registry.POINT_OF_INTEREST_TYPE`

  * 包含所有兴趣点乐行。兴趣点允许实体寻找世界内的不同方块,比如村民工作站点。也用于寻找下界传送门。


## 世界生成


Minecraft的世界生成比较复杂,对于世界生成有许多不同的注册表。


* `Registry.BIOME`

  * 包含所有的[生物群系](https://fabricmc.net/wiki/zh_cn:tutorial:biomes "zh_cn:tutorial:biomes")。

* `Registry.FEATURE`

  * 包含所有的[地物](https://fabricmc.net/wiki/zh_cn:tutorial:features "zh_cn:tutorial:features"),包括结构。

* `Registry.STRUCTURE_FEATURE`

  * 包含所有的[结构地物](https://fabricmc.net/wiki/zh_cn:tutorial:structures "zh_cn:tutorial:structures")。

* `Registry.CARVER`

  * 包含所有的雕刻器。雕刻器用于创建洞穴和峡谷。

* `Registry.DECORATOR`

  * 包含所有的装饰器。装饰器用于安放特征。

* `Registry.BIOME_SOURCE_TYPE`

  * 包含所有的生物群系源类型,这决定了生成世界时使用哪些生物群系。

* `Registry.TREE_DECORATOR_TYPE`

  * 包含所有的树木装饰器类型。这些装饰器添加一些附加方块,例如蜂箱、藤蔓。

* `Registry.FOLIAGE_PLACER_TYPE`

  * 包含所有的树叶放置器类型,用于生成树叶。

* `Registry.BLOCK_STATE_PROVIDER_TYPE`

  * 包含所有的方块状态提供器类型,用于基于位置选择可能的随机方块状态。

* `Registry.BLOCK_PLACER_TYPE`

  * 包含所有的方块放置器类型,用于在 `RandomPatchFeature` 之类的地形中放置方块。

* `Registry.CHUNK_GENERATOR_TYPE`

  * 包含所有的区块生成器类型。区块生成器决定了地形的基本形状,如 `surface` 生成类似于主世界的地表地形,`caves` 用于生成类似于下界的洞穴地形,`floating_islands` 用于生成类似于末地的浮岛类型。

* `Registry.CHUNK_STATUS`

  * 包含所有的区块状态类型。区块状态描述了区块中世界生成的当前进站。

* `Registry.STRUCTURE_PIECE`

  * 包含所有的结构构件。结构构件是结构的小部分,例如单间房间。

* `Registry.RULE_TEST`

  * 包含所有的规则测试类型,用于在世界生成中匹配方块。

* `Registry.STRUCTURE_PROCESSOR`

  * 包含所有的结构处理器类型。结构处理器会在结构生成后对其进行修改。

* `Registry.STRUCTURE_POOL_ELEMENT`

  * 包含所有的结构池元素。结构池元素时结构的更小部分,包含在池结构构件中,用于生成基于数据包的结构(例如使用拼图的结构)。

* `Registry.SURFACE_BUILDER`

  * 包含所有的地表构造器。地表构造器


# 修改不要重新加载游戏


### 重新加载更改的类


在 Eclipse 或 Intellij IDEA 中,以调试模式运行 Minecraft。要应用代码更改,在 Intellij 中点按“构建”按钮或在 Eclipse 中保存。注意:这仅允许您更改方法主体。如果进行任何其他类型的更改,则必须重新启动。但是,如果使用 [DCEVM](http://dcevm.github.io/ "http://dcevm.github.io/"),则可以进行大多数更改,包括添加和删除方法和类。


重载贴图资源


F3+T,例如方块的贴图等


重加载数据


例如配方,loottable和tag, 输入命令/realod


我的世界 fabric 1.20.1 开发教程 ep1 前言的评论 (共 条)

分享到微博请遵守国家法律