Fabric 教程
安装
- 启用 log4j 调试信息(英文)
基础
- 约定和术语
- 注册
- 开发工具
物品
方块和方块实体
数据生成
世界生成
命令
事件
实体
流体
Mixin 和 ASM
杂项
Yarn
贡献 Fabric
- FabLabs - 在提交 PR 之前起草新功能的试验场
这是由 Loom 0.11 引入的新科技,可以将方法添加到指定的已存在的类。特别地,你可以创建一个接口,然后将这个接口注入类中。这个类将会拥有该接口的所有方法,就像一直拥有这些方法一样。注入接口是仅在编译时具有的功能,这意味着需要用到 Mixin 以将接口实现到目标类。
这对库来说尤其有用,你可以给已有的类添加方法,并且可以直接使用而不需要每次都强转或重新实现接口。
举个例子来更好地解释:
这个例子的场景是,将以下方法添加到 net.minecraft.fluid.FlowableFluid
以获取桶倒空时的音效。通常来说这是不可能的,因为 net.minecraft.fluid.FlowableFluid
没有类似方法。
Optional<SoundEvent> getBucketEmptySound()
要将方法添加到类,首先你需要为其创建方法:
package net.fabricmc.example; public interface BucketEmptySoundGetter { // 被注入的接口中的方法必须为 default, // 否则使用到这些地方的代码不会编译! default Optional<SoundEvent> getBucketEmptySound() { return Optional.empty(); } }
现在你需要通过实现该接口的 mixin 来将该接口实现到 net.minecraft.fluid.FlowableFluid
中。
@Mixin(FlowableFluid.class) public class MixinFlowableFluid implements BucketEmptySoundGetter { @Override public Optional<SoundEvent> getBucketEmptySound() { // 这是如何获取默认声音的,从 BucketItem 类中复制。 return Optional.of(((FlowableFluid) (Object) this).isIn(FluidTags.LAVA) ? SoundEvents.ITEM_BUCKET_EMPTY_LAVA : SoundEvents.ITEM_BUCKET_EMPTY); } }
最后你需要将库注入到 net.minecraft.fluid.FlowableFluid
。可以将以下片段添加到你的 fabric.mod.json 文件中,以给 net.minecraft.fluid.FlowableFluid
类添加一个或多个接口。注意这里所有的类名称都必须使用“内部名称”并使用斜杠而非点。
{ "custom": { "loom:injected_interfaces": { "net/minecraft/class_3609": ["net/fabricmc/example/BucketEmptySoundGetter"] } } }
现在你可以使用新的方法:
Optional<SoundEvent> sound = mytestfluid.getBucketEmptySound();
您还可以在继承了 FlowableFluid 的类中覆盖此方法以实现自定义行为。