zh_cn:tutorial:registry
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
zh_cn:tutorial:registry [2023/05/19 14:11] – [注册内容] solidblock | zh_cn:tutorial:registry [2024/08/27 05:07] (current) – [注册表键] solidblock | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== 注册表系统 | + | ====== 注册表介绍 |
- | 你需要将你添加到游戏的绝大多数内容注册进去,这有利于: | + | Minecraft 使用**注册表系统**处理游戏内的几乎一些,作为模组开发者,需要将添加到游戏的绝大多数内容注册进去,这有利于: |
* 让游戏知道你的内容存在 | * 让游戏知道你的内容存在 | ||
* 在客户端和服务器之间验证游戏内容 | * 在客户端和服务器之间验证游戏内容 | ||
Line 9: | Line 9: | ||
* 抽象化隐藏数字 ID | * 抽象化隐藏数字 ID | ||
- | 注册任何类型内容时,你传入一个 '' | + | 注册任何类型内容时,你传入一个 '' |
- | 不注册就使用自定义内容容易导致bug,比如缺失材质、世界保存问题和崩溃。游戏通常会让你知道你是否忘记注册了某个东西。 | + | 不注册就使用自定义内容容易导致 bug,比如缺失纹理、世界保存问题和崩溃。游戏通常会让你知道你是否忘记注册了某个东西。 |
- | ===== 注册类型 ===== | + | ===== 注册表类型 ===== |
- | 注册内容时,你需要指定将内容加入哪个注册表。基本的游戏提供所有原版内容的注册表,可以在 '' | + | 注册内容时,你需要指定将内容加入哪个注册表。基本的游戏提供所有原版内容的注册表,可以在 '' |
- | 如需详细了解所有可用的注册表,请阅读[[zh_cn: | + | 例如,你很有可能会使用用于物品的 '' |
- | ===== 注册内容 ===== | + | 如需详细了解所有可用的注册表,请看 '' |
- | 使用'' | + | ===== 基本用法 |
+ | ==== 注册你的内容 ==== | ||
+ | 使用 '' | ||
- | <yarncode | + | <code java> |
- | public static <T> T method_10230(class_2378<? | + | |
- | return ((class_2385)registry).method_10272(id, | + | </code> |
- | } | + | |
- | </yarncode> | + | |
- | **registry** - 你需要将内容添加到的注册表的实例。位于'' | + | |
- | **id** - 注册表内,你的内容的一个标识符。标准的格式为'' | + | |
+ | * **id** - 你的内容在注册表内的 ID。 | ||
+ | * **content** - 你需要注册的内容的实例。 | ||
- | **entry** - 你需要注册的内容的实例。 | + | 例如: |
+ | <code java> | ||
+ | Registry.register(Registries.ITEM, | ||
+ | </ | ||
- | ===== 注册表方法 ===== | + | > 记住:只能在模组初始化器中注册。否则,会因为注册表冻结而无法注册。 |
- | '' | + | ==== 通过 |
- | <code java> | + | '' |
- | @Nullable | + | |
- | public abstract T get(@Nullable Identifier id); | + | |
- | </code> | + | |
- | ---- | + | < |
+ | Registries.ITEM.containsId(Identifier.ofVanilla(" | ||
+ | |||
+ | Registries.ITEM.containsId(Identifier.ofVanilla(" | ||
+ | |||
+ | Registries.ITEM.get(Identifier.ofVanilla(" | ||
+ | |||
+ | Registries.ITEM.get(Identifier.ofVanilla(" | ||
+ | |||
+ | Registries.ITEM.getOrEmpty(Identifier.ofVanilla(" | ||
+ | |||
+ | Registries.ITEM.getOrEmpty(Identifier.ofVanilla(" | ||
+ | </ | ||
- | '' | + | ==== 获取对象的 ID ==== |
+ | |||
+ | '' | ||
<code java> | <code java> | ||
- | @Nullable | + | Registries.BLOCK.getId(Blocks.STONE); // 返回 Identifier.ofVanilla(" |
- | public abstract Identifier | + | |
</ | </ | ||
- | ---- | + | ===== 相关概念 ===== |
- | '' | + | ==== 注册表键 ===== |
+ | 有些类型的注册表不是静态存储在 | ||
+ | |||
+ | 但是,每个注册表都有个**注册表键**('' | ||
<code java> | <code java> | ||
- | public abstract int getRawId(@Nullable T entry); | + | final DynamicRegistryManager registryManager = world.getRegistryManager(); |
+ | |||
+ | // 下面两个语句都返回当前世界的沙漠的 '' | ||
+ | registryManager.get(RegistryKeys.BIOME).get(Identifier.ofVanilla(" | ||
+ | registryManager.getWrapperOrThrow(RegistryKeys.BIOME).getOrThrow(RegistryKey.of(RegistryKeys.BIOME, | ||
</ | </ | ||
+ | 不仅注册表有注册表键。所有的注册表内容都有注册表键(因为注册表本身也属于 '' | ||
+ | |||
+ | ==== 注册表项 ===== | ||
+ | |||
+ | **注册表项**('' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | 看看下面两个命令,以清晰地展示出了两者的区别: | ||
+ | * ''/ | ||
+ | * '' | ||
+ | |||
+ | 两个命令都会给你一个石头。前者会从世界的战利品表注册表中获取战利品表 '' | ||
+ | |||
+ | ==== 注册表项列表==== | ||
+ | |||
+ | 和注册表项类似,**注册表项列表**('' | ||
+ | * '' | ||
+ | * '' |
zh_cn/tutorial/registry.1684505486.txt.gz · Last modified: 2023/05/19 14:11 by solidblock