MCBBS Wiki欢迎您共同参与编辑!在参与编辑之前请先阅读Wiki方针

如果在编辑的过程中遇到了什么问题,可以去讨论板提问。

为了您能够无阻碍地参与编辑 未验证/绑定过邮箱的用户,请尽快绑定/验证

MCBBS Wiki GitHub群组已上线!

您可以在回声洞中发表吐槽!

服务器状态监控。点击进入

本站由MCBBS用户自行搭建,与MCBBS及东银河系漫游指南(北京)科技有限公司没有从属关系。点此了解 MCBBS Wiki 不是什么>>

用户:MashKJo/1.21.1模组开发教程/3.注册:修订间差异

来自MCBBS Wiki
跳到导航 跳到搜索
(创建页面,内容为“Minecraft中充满了各种游戏元素:物品(Item)、方块(Block)、实体(Entity)、附魔(Enchantment)等等,为了方便地统筹与管理这些游戏元素,注册表(Registry)应运而生。 需要注意的是,注册进注册表的都是游戏对象的类型,即享元对象。如“64个苹果”是一种游戏对象(其实就是ItemStack),而“苹果”是它的类型,即为需要注册进物品注册表的对象…”)
 
无编辑摘要
第7行: 第7行:
== 固有注册表与可写注册表 ==
== 固有注册表与可写注册表 ==
{{quote|游戏内有几十种注册表,它们分别都有不同的作用。这些注册表中,可以分为2类:<br>固有注册表(Built-in Registry):游戏硬编码的注册表,内部数据无法通过任何方式修改。这些注册表在各个世界中都通用。<br>可写注册表(Writable Registry):游戏读取世界中的数据包获得这些注册表的信息,游戏代码内部并不存在这些注册表的数据。这些注册表与世界绑定,根据世界不同数据也有可能不同。|[https://zh.minecraft.wiki/w/注册表 注册表 - 中文 Minecraft Wiki]}}
{{quote|游戏内有几十种注册表,它们分别都有不同的作用。这些注册表中,可以分为2类:<br>固有注册表(Built-in Registry):游戏硬编码的注册表,内部数据无法通过任何方式修改。这些注册表在各个世界中都通用。<br>可写注册表(Writable Registry):游戏读取世界中的数据包获得这些注册表的信息,游戏代码内部并不存在这些注册表的数据。这些注册表与世界绑定,根据世界不同数据也有可能不同。|[https://zh.minecraft.wiki/w/注册表 注册表 - 中文 Minecraft Wiki]}}
显而易见,我们在代码层面能直接操作并添加新元素的,就是固有注册表;至于可写注册表,我们应该以数据包的形式添加新元素。
所有固有注册表都能在BuiltInRegistries类中找到;而对于可写注册表,由于它会随着世界的不同而变动,因此你需要一个Level上下文,通过该Level对象获取一个RegistryAccess:
* 对于服务端世界,请调用ServerLevel#registryAccess。
* 对于客户端世界,请调用Minecraft.getInstance().getConnection().registryAccess()。
请注意:只有当你的客户端实际进入了一个世界(本地存档/远程服务器)的时候,它才会返回一个有效的值,否则会直接报NPE。
而且不同于固有注册表,并非所有可写注册表都会同步所有数据至客户端,请格外注意这一点。
之后,我们就可以调用方法#registryOrThrow来获取我们想要的注册表了,注意到其要求的唯一参数的类型是ResourceKey<? extends Registry<? extends E>>,这个实际上就是确定我们到底想要哪个注册项的注册表——体现为第二层泛型参数。实际上所有注册表都需要这么一个ResourceKey<Registry<?>>(注册表资源键,Registry Resource Key),用于标识它对应的注册项类型。所有注册表资源键(包括固有注册表和可写注册表)都可以在Registries类下找到。

2025年9月5日 (五) 15:54的版本

Minecraft中充满了各种游戏元素:物品(Item)、方块(Block)、实体(Entity)、附魔(Enchantment)等等,为了方便地统筹与管理这些游戏元素,注册表(Registry)应运而生。

需要注意的是,注册进注册表的都是游戏对象的类型,即享元对象。如“64个苹果”是一种游戏对象(其实就是ItemStack),而“苹果”是它的类型,即为需要注册进物品注册表的对象。

理解了这一点,我们就可以开始了。

固有注册表与可写注册表

游戏内有几十种注册表,它们分别都有不同的作用。这些注册表中,可以分为2类:
固有注册表(Built-in Registry):游戏硬编码的注册表,内部数据无法通过任何方式修改。这些注册表在各个世界中都通用。
可写注册表(Writable Registry):游戏读取世界中的数据包获得这些注册表的信息,游戏代码内部并不存在这些注册表的数据。这些注册表与世界绑定,根据世界不同数据也有可能不同。

显而易见,我们在代码层面能直接操作并添加新元素的,就是固有注册表;至于可写注册表,我们应该以数据包的形式添加新元素。

所有固有注册表都能在BuiltInRegistries类中找到;而对于可写注册表,由于它会随着世界的不同而变动,因此你需要一个Level上下文,通过该Level对象获取一个RegistryAccess:

  • 对于服务端世界,请调用ServerLevel#registryAccess。
  • 对于客户端世界,请调用Minecraft.getInstance().getConnection().registryAccess()。

请注意:只有当你的客户端实际进入了一个世界(本地存档/远程服务器)的时候,它才会返回一个有效的值,否则会直接报NPE。

而且不同于固有注册表,并非所有可写注册表都会同步所有数据至客户端,请格外注意这一点。

之后,我们就可以调用方法#registryOrThrow来获取我们想要的注册表了,注意到其要求的唯一参数的类型是ResourceKey<? extends Registry<? extends E>>,这个实际上就是确定我们到底想要哪个注册项的注册表——体现为第二层泛型参数。实际上所有注册表都需要这么一个ResourceKey<Registry<?>>(注册表资源键,Registry Resource Key),用于标识它对应的注册项类型。所有注册表资源键(包括固有注册表和可写注册表)都可以在Registries类下找到。