Skip to content

Commit

Permalink
Correct rendering of information blocks
Browse files Browse the repository at this point in the history
Correct rendering of information blocks of ":::note".

Signed-off-by: src_resources <src.res.211@gmail.com>
  • Loading branch information
srcres258 committed Oct 12, 2023
1 parent 6101350 commit 013a46e
Show file tree
Hide file tree
Showing 26 changed files with 76 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,9 @@ minecraft {
目标和指令
---------

!!! 重要
:::note
在Minecraft类上使用访问转换器时,字段和方法必须使用SRG名称。
:::

###
转换为目标类:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,11 @@ BlockEntity#load(CompoundTag tag)
每当你的数据发生改变时,你需要调用`BlockEntity#setChanged`;否则,保存存档时可能会跳过包含你的`BlockEntity`的`LevelChunk`。
:::

!!! 重要
:::note
调用`super`方法非常重要!

标签名称`id`、`x`、`y`、`z`、`ForgeData`和`ForgeCaps`均由`super`方法保留。
:::

## 计时的`BlockEntity`

Expand Down Expand Up @@ -88,8 +89,9 @@ IForgeBlockEntity#handleUpdateTag(CompoundTag tag)
```
同样,这非常简单,第一个方法收集应该发送到客户端的数据,而第二个方法处理这些数据。如果你的`BlockEntity`不包含太多数据,你可以使用[将数据存储到你的`BlockEntity`][storing-data]小节之外的方法。

!!! 重要
:::note
为方块实体同步过多/无用的数据可能会导致网络拥塞。你应该通过在客户端需要时仅发送客户端需要的信息来优化网络使用。例如,在更新标签中发送方块实体的物品栏通常是没有必要的,因为这可以通过其[`AbstractContainerMenu`][menu]进行同步。
:::

### 在方块更新时同步

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,11 @@

方块必须经过[注册][registering]后才能发挥作用。

!!! 重要
:::note
存档中的方块和物品栏中的“方块”是非常不同的东西。存档中的方块由`BlockState`表示,其行为由一个`Block`类的实例定义。同时,物品栏中的物品是由`Item`控制的`ItemStack`。作为`Block`和`Item`二者之间的桥梁,有一个`BlockItem`类。`BlockItem`是`Item`的一个子类,它有一个字段`block`,其中包含对它所代表的`Block`的引用。`BlockItem`将“方块”的一些行为定义为物品,例如右键单击如何放置方块。存在一个没有其`BlockItem`的`Block`也是可能的。(例如`minecraft:water`是一个方块,但不是一个物品。因此,不可能将其作为一个物品保存在物品栏中。)

当一个方块被注册时,也*仅仅*意味着一个方块被注册了。该方块不会自动具有`BlockItem`。要为块创建基本的`BlockItem`,应该将`BlockItem`的注册表名称设置为其`Block`的注册表名称。`BlockItem`的自定义子类也可以使用。一旦为方块注册了`BlockItem`,就可以使用`Block#asItem`来获取它。如果该方块没有`BlockItem`,`Block#asItem`将返回`Items#AIR`,因此,如果你不确定你正在使用的方块是否有`BlockItem`,请检查其`Block#asItem`是否返回`Items#AIR`。
:::

#### 选择性地注册方块

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,16 +93,18 @@ public class MyStaticClientOnlyEventHandler {

如果一个事件可以被取消,它将带有`@Cancelable`注释,并且方法`Event#isCancelable()`将返回`true`。可取消事件的取消状态可以通过调用`Event#setCanceled(boolean canceled)`来修改,其中传递布尔值`true`意为取消事件,传递布尔值`false`被解释为“不取消”事件。但是,如果无法取消事件(如`Event#isCancelable()`所定义),则无论传递的布尔值如何,都将抛出`UnsupportedOperationException`,因为不可取消事件事件的取消状态被认为是不可变的。

!!! 重要
:::note
并非所有事件都可以取消!试图取消不可取消的事件将导致抛出未经检查的`UnsupportedOperationException`,可能将导致游戏崩溃!在尝试取消某个事件之前,请始终使用`Event#isCancelable()`检查该事件是否可以取消!
:::

事件的结果
---------

某些事件具有`Event$Result`。结果可以是以下三种情况之一:`DENY`(停止事件)、`DEFAULT`(使用默认行为)和`ALLOW`(强制执行操作,而不管最初是否执行)。事件的结果可以通过调用`#setResult`并用一个`Event$Result`来设置。并非所有事件都有结果;带有结果的事件将用`@HasResult`进行注释。

!!! 重要
:::note
不同的事件可能以不同的方式处理结果,在使用事件的结果之前请参阅事件的JavaDoc。
:::

事件处理优先级
-------------
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,9 @@ public void register(RegisterEvent event) {

并非所有的注册表都由Forge封装。这些可以是静态注册表,如`LootItemConditionType`,使用起来是安全的。还有动态注册表,如`ConfiguredFeature`和其他一些世界生成注册表,它们通常以JSON表示。`DeferredRegister#create`有一个重载,允许模组开发者指定原版注册表所创建的`RegistryObject`的注册表键。注册表方法和模组事件总线的附加与其他`DeferredRegister`相同。

!!! 重要
:::note
动态注册表对象**只能**通过数据文件(如JSON)被注册。它们**不能**在代码中被注册。
:::

```java
private static final DeferredRegister<LootItemConditionType> REGISTER = DeferredRegister.create(Registries.LOOT_CONDITION_TYPE, "examplemod");
Expand Down Expand Up @@ -161,23 +162,26 @@ class Holder {

可以使用模组事件总线上的`DataPackRegistryEvent$NewRegistry`事件添加新的数据包注册表。注册表是通过`#dataPackRegistry`创建的,方法是传入表示注册表名称的`ResourceKey`和用于对JSON中的数据进行编码和解码的`Codec`。可以提供可选的`Codec`来将数据包注册表同步到客户端。

!!! 重要
:::note
数据包注册表不能用`DeferredRegister`创建。它们只能通过这个事件创建。
:::

### 使用DeferredRegister

`DeferredRegister`方法又是上述事件的另一个包装。一旦使用`#create`重载在常量字段中创建了`DeferredRegister`(该重载接受注册表名称和mod id),就可以通过`DeferredRegistry#makeRegistry`构建注册表。该方法接受了由Supplier提供的包含任何其他配置的`RegistryBuilder`。默认情况下,该方法已调用`#setName`。由于此方法可以在任何时候返回,因此会返回由Supplier提供的`IForgeRegistry`版本。在激发NewRegistryEvent之前试图从Supplier获取自定义注册表将得到`null`值。

!!! 重要
:::note
在通过`#register`将`DeferredRegister`添加到模组事件总线之前,必须调用`DeferredRegister#makeRegistry`。`#makeRegistry`也使用`#register`方法在`NewRegistryEvent`期间创建注册表。
:::

处理缺失的注册表条目
------------------

在某些情况下,每当更新模组或删除模组(更可能的情况)时,某些注册表对象将不复存在。可以通过第三个注册表事件指定操作来处理丢失的映射:`MissingMappingsEvent`。在该事件中,既可以通过给定注册表项和mod id的`#getMappings`获取丢失映射的列表,也可以通过给定注册项的`#getAllMappings`获取所有映射。

!!! 重要
:::note
`MissingMappingsEvent`在**Forge**事件总线上触发。
:::

对于每个映射(`Mapping`),可以选择四种映射类型之一来处理丢失的条目:

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,9 @@ public void gatherData(GatherDataEvent event) {

`RecipeBuilder`是一个方便的实现,用于创建要生成的`FinishedRecipe`。它提供了解锁、分组、保存和获取配方结果的基本定义。这分别通过`#unlockedBy`、`#group`、`#save`和`#getResult`来完成。

!!! 重要
:::note
原版配方生成器中不支持配方中的[`ItemStack`输出][stack]。对于现有的原版配方序列化器,必须以不同的方式构建`FinishedRecipe`才能生成此数据。
:::

:::danger
正在生成的物品结果必须指定有效的`RecipeCategory`;否则,将引发`NullPointerException`。
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,9 @@ this.tag(EXAMPLE_TAG_2)
.remove(EXAMPLE_OBJECT) // 从该标签中移除一个对象
```

!!! 重要
:::note
如果模组的标签软依赖于另一个模组的标签(另一个模组可能在运行时存在,也可能不存在),则应使用可选方法引用其他模组的标签。
:::

### Existing Providers

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,9 @@ public static final Capability<IItemHandler> ITEM_HANDLER = CapabilityManager.ge

当被调用时,`CapabilityManager#get`为你的相关类型提供一个非null的Capability。匿名的`CapabilityToken`允许Forge保持软依赖系统,同时仍然拥有获得正确Capability所需的泛型信息。

!!! 重要
:::note
即使你在任何时候都可以使用非null的Capability,但这并不意味着该Capability本身是可用的或已注册的。这可以通过`Capability#isRegistered`进行检查。
:::

`#getCapability`方法有另一个参数,类型为`Direction`,可用于请求那一面的特定实例。如果传递`null`,则可以假设请求来自方块内,或者来自某个侧面没有意义的地方,例如不同的维度。在这种情况下,将请求一个不关侧面的一个通用的Capability实例。`#getCapability`的返回类型将对应于传递给方法的Capability中声明的类型的`LazyOptional`。对于物品处理器Capability,其为`LazyOptional<IItemHandler>`。如果该Capability不适用于特定的提供者,它将返回一个空的`LazyOptional`

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,9 @@

在大多数情况下,不需要将任何粒子数据发送到客户端。对于这些例子,更容易创建`SimpleParticleType`的新实例:一个对`ParticleType``ParticleOptions`的实现,除了类型之外,它不向客户端发送任何自定义数据。除了红石粉之外,对于着色和依赖方块/物品的粒子而言,大多数原版实现还使用`SimpleParticleType`

!!! 重要
:::note
如果仅在客户端上引用,则生成粒子时`ParticleType`非必要。但是,有必要使用`ParticleEngine`中的任何预构建逻辑,或者从服务端生成粒子。
:::

### ParticleOptions

Expand Down Expand Up @@ -87,8 +88,9 @@

必须通过订阅**模组事件总线**上的`RegisterParticleProvidersEvent`以注册`ParticleProvider`。在事件中,可以通过向方法提供工厂实例,通过`#registerSpecial`注册工厂。

!!! 重要
:::note
`RegisterParticleProvidersEvent`应仅在客户端上调用,因此在某些客户端类中被单端化独立,并被`DistExecutor`或`@EventBusSubscriber`引用。
:::

#### ParticleDescription、SpriteSet、以及SpriteParticleRegistration

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,9 @@ Forge入门

编辑`build.gradle`文件以自定义你的模组的构建方式(如文件名称、artifact版本等等)。

!!! 重要
:::note
除非你知道你在做什么,否则**不要**编辑`settings.gradle`。该文件指定[ForgeGradle]所上传的仓库。
:::

### 建议的`build.gradle`自定义项目

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,9 @@ showAsResourcePack=false
`properties` | table | `{}` | 替换属性表。`StringSubstitutor`使用它将`${file.<key>}`替换为相应的值。该功能目前仅用于替换模组特定属性中的`version`。 | 由`${file.example}`引用的`{ "example" = "1.2.3" }`
`issueTrackerURL` | string | ** | 指向报告与追踪模组问题的地点的URL。 | `"https://forums.minecraftforge.net/"`

!!! 重要
:::note
`services`属性在功能上等效于在指定[在模块中的`uses`指令][uses],该指令允许加载给定类型的服务。
:::

### 模组特定属性

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@

在一般项目中,语义式的版本号(格式为`MAJOR.MINOR.PATCH`)被经常使用。然而,在长期性地修改的情况下,使用格式`MCVERSION-MAJORMOD.MAJORAPI.MINOR.PATCH`可能更有利于将模组的创世性的修改与API变更性的修改区分开来。

!!! 重要
:::note
Forge使用[Maven版本范围][cmpver]来比较版本字符串,这与Semantic Versioning 2.0.0规范不完全兼容,例如“prerelease”标签。
:::

样例
----
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,9 @@ public MyMenuExtra(int containerId, Inventory playerInv, FriendlyByteBuf extraDa

所有菜单都是从`AbstractContainerMenu`继承而来的。菜单包含两个参数,即表示菜单本身类型的[`MenuType`][mt]和表示当前访问者的菜单唯一标识符的容器id。

!!! 重要
:::note
玩家一次只能打开100个唯一的菜单。
:::

每个菜单应该包含两个构造函数:一个用于初始化服务端上的菜单,另一个用于启动客户端上的菜单。用于初始化客户端菜单的构造函数是提供给`MenuType`的构造函数。服务端菜单构造函数包含的任何字段都应该具有客户端菜单构造函数的一些默认值。

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@

关于如何将坐标相对化的信息将在[屏幕][screen]部分中呈现。

!!! 重要
:::note
如果选择使用固定坐标或不正确地缩放屏幕,则渲染的对象可能看起来很奇怪或错位。检查坐标是否正确相对化的一个简单方法是单击视频设置中的“Gui比例”按钮。在确定GUI渲染的比例时,此值用作显示器宽度和高度的除数。
:::

## Gui图形

Expand Down Expand Up @@ -51,8 +52,9 @@ Minecraft渲染的任何GUI通常都是使用`GuiGraphics`完成的。`GuiGraphi

渲染纹理时的z坐标通常设置为blit偏移。偏移量负责在查看屏幕时对渲染进行适当分层。z坐标较小的渲染在背景中渲染,反之亦然,z坐标较大的渲染在前景中渲染。z偏移量可以通过`#translate`直接设置在`PoseStack`本身上。一些基本的偏移逻辑在`GuiGraphics`的某些方法(例如物品渲染)中内部应用。

!!! 重要
:::note
设置blit偏移时,必须在渲染对象后重置它。否则,屏幕内的其他对象可能会在不正确的层中渲染,从而导致图形问题。建议在平移前推动当前姿势,然后在偏移处完成所有渲染后弹出。
:::

## Renderable

Expand Down Expand Up @@ -216,12 +218,13 @@ public void removed() {
`inventoryLabelX` | 将渲染玩家物品栏名称的位置的相对x坐标。
`inventoryLabelY` | 将渲染玩家物品栏名称的位置的相对y坐标。

!!! 重要
:::note
在上一节中提到应该在`#init`方法中设置预先计算的相对坐标。这仍然保持正确,因为这里提到的值不是预先计算的坐标,而是静态值和相对坐标。

图像值是静态的且不变,因为它们表示背景纹理大小。为了在渲染时更容易,在`#init`方法中预先计算了两个附加值(`leftPos`和`topPos`),该方法标记了将渲染背景的左上角。标签坐标相对于这些值。

`leftPos`和`topPos`也被用作渲染背景的方便方式,因为它们已经表示要传递到`#blit`方法中的位置。
:::

```java
// 在某个AbstractContainerScreen子类中
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ public void initializeClient(Consumer<IClientItemExtensions> consumer) {
}
```

!!! 重要
:::note
每个模组都应该只有一个自定义BEWLR的实例。
:::

这就行了,使用BEWLR不需要额外的设置。
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@

Forge已经存在多年了,你仍然可以轻松访问Minecraft 1.1版本的Forge版本。每个版本之间都有显著的差异,支持这么多不同的版本是不可能的。因此,Forge使用了一个LTS系统,其中以前的主要Minecraft版本被视为“LTS”(长期支持)。只有最新版本和任何当前的LTS版本才会有易于访问的文档,并包含在侧边栏的版本下拉列表中。然而,一些旧版本曾经是LTS,或者在某个时候是最新版本,并编写了文档。可以在这里找到带有这些版本文档的旧网站链接。

!!! 重要
:::note
这些旧文档网站仅供参考。不要在Forge discord或Forge论坛上寻求旧版本的帮助。**当你使用旧版本时,将不会获得支持。**
:::

### 以前已有文档的版本列表

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,9 @@ public static void exampleConfiguredTest(GameTestHelper helper) {
`#succeedWhen` | 所提供的`Runnable`在超时之前每tick都会进行测试,如果对其中一个tick的检查没有引发`GameTestAssertException`,则会成功。
`#succeedOnTickWhen` | 提供的`Runnable`在指定的tick上进行测试,如果没有抛出`GameTestAssertException`,则会成功。如果`Runnable`在任何其他tick上成功,则将其标记为失败。

!!! 重要
:::note
游戏测试每tick都会执行,直到测试被标记为成功。因此,在给定的tick上安排成功的方法必须小心,不要总是在之前的tick上失败。
:::

#### 计划操作

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,19 @@

### `isCustomRenderer`

!!! 重要
:::note
除非你知道自己在做什么,否则只需`return false`然后继续其他事项。
:::

将其渲染为物品时,返回`true`将导致模型不被渲染,转而回到`BlockEntityWithoutLevelRenderer#renderByItem`。对于某些原版物品,如箱子和旗帜,此方法被硬编码为将数据从物品复制到`BlockEntity`中,然后使用`BlockEntityRenderer`来渲染BE以代替物品。对于所有其他物品,它将使用由`IClientItemExtensions#getCustomRenderer`提供的`BlockEntityWithoutLevelRenderer`实例。有关详细信息,请参阅[BlockEntityWithoutLevelRenderer][bewlr]页。

### `getParticleIcon`

粒子应使用的任何纹理。对于方块,它将在实体掉落在其上或其被破坏时显示。对于物品,它将在报废或被吃掉时显示。

!!! 重要
:::note
由于模型数据可能会对特定模型的渲染方式产生影响,因此不推荐使用不带参数的原版方法,而推荐使用`#getParticleIcon(ModelData)`。
:::

### <s>`getTransforms`</s>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,9 @@
`ItemProperties#register`用于向某个物品添加属性。`Item`参数是要附加属性的物品(例如`ExampleItems#APPLE`)。`ResourceLocation`参数是所要赋予属性的名称(例如`new ResourceLocation("pull")`)。`ItemPropertyFunction`是一个函数接口,它接受`ItemStack`、它所在的`ClientLevel`(可以为null)、持有它的`LivingEntity`(可以是null)和包含持有实体的id的`int`(可能是`0`),返回属性的`float`值。对于修改后的物品属性,建议将模组的mod id用作命名空间(例如`examplemod:property`,而不仅仅是`property`,因为这实际上意味着`minecraft:property`)。这些操作应在`FMLClientSetupEvent`中完成。
还有另一个方法`ItemProperties#registerGeneric`用于向所有物品添加属性,并且它不将`Item`作为其参数,因为所有物品都将应用此属性。

!!! 重要
:::note
使用`FMLClientSetupEvent#enqueueWork`执行这些任务,因为`ItemProperties`中的数据结构不是线程安全的。
:::

:::caution
Mojang反对使用`ItemPropertyFunction`而推荐使用`ClampedItemPropertyFunction`子接口,该子接口将结果夹在`0`和`1`之间。
Expand All @@ -23,8 +24,9 @@

覆盖的格式可以在[wiki][format]上看到,一个很好的例子可以在`model/item/bow.json`中找到。为了参考,这里是一个具有`examplemod:power`属性的物品的假设例子。如果值不匹配,则默认为当前模型,但如果有多个匹配,则会选择列表中的最后一个匹配。

!!! 重要
:::note
predicate适用于*大于或等于*给定值的所有值。
:::

```js
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,8 +120,9 @@ public void trigger(ServerPlayer player, ItemStack stack) {

之后,应在`FMLCommonSetupEvent`期间使用`CriteriaTriggers#register`注册实例。

!!! 重要
:::note
`CriteriaTriggers#register`必须通过`FMLCommonSetupEvent#enqueueWork`排入同步工作队列,因为该方法不是线程安全的。
:::

### 触发器的调用

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -173,8 +173,9 @@ public void registerSerializers(RegisterEvent event) {
}
```

!!! 重要
:::note
如果使用`FMLCommonSetupEvent`注册条件序列化器,则必须通过 `FMLCommonSetupEvent#enqueueWork`将其排入同步工作队列,因为`CraftingHelper#register`不是线程安全的。
:::

[datagen]: ../../datagen/server/recipes.md
[serializer]: #iconditionserializer
Expand Down
Loading

0 comments on commit 013a46e

Please sign in to comment.