我的世界 fabric 1.20.1 开发教程 ep1 前言
# 前言
官方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