• Forge论坛

导航页

  • 主页
  • 向文档做出贡献
  • 入门
    • 概述
    • 模组文件
    • 规划你的模组结构
    • 版本号
  • 核心概念
    • 注册表
    • 端位(Sides)
    • 事件
    • 模组生命周期
    • 资源
    • 国际化与本地化
  • 方块
    • 概述
    • 方块状态
  • 物品
    • 概述
    • BlockEntityWithoutLevelRenderer
  • 网络
    • 概述
    • SimpleImpl
    • 实体的同步
  • 方块实体
    • 概述
    • BlockEntityRenderer
  • 游戏特效
    • 粒子效果
    • 音效
  • 数据储存
    • Capabilities
    • Saved Data
    • 编解码器(Codecs)
  • 图形用户界面
    • 菜单(Menus)
    • 屏幕(Screens)
  • 渲染
    • 模型扩展
      • 概述
      • 根变换
      • 渲染类型
      • 部分可见度
      • 面数据
    • 模型加载器
      • 概述
      • 烘焙模型
      • 变换
      • 物品重载
  • 资源
    • 客户端资源(Assets)
      • 概述
      • 模型
        • 概述
        • 纹理色调
        • 物品属性
          • 向物品添加属性
          • 覆盖的使用
    • 服务端数据(Data)
      • 概述
      • 配方
        • 概述
        • 自定义配方
        • 原料
        • 非数据包配方
      • 战利品表
      • 全局战利品修改器
      • 标签
      • 进度
      • 条件性加载数据
  • 数据生成
    • 概述
    • 客户端资源(Assets)
      • 模型提供者
      • 语言提供者
      • 音效提供者
    • 服务端数据(Data)
      • 配方提供者
      • 战利品表提供者
      • 标签提供者
      • 进度提供者
      • 全局战利品修改器提供者
      • 数据包注册表对象提供者
  • 杂项功能
    • 配置
    • 键盘布局
    • 游戏测试
    • Forge更新检查器
    • 调试分析器
  • 进阶主题
    • 访问转换器
  • 向Forge做出贡献
    • 概述
    • Pull Request准则
  • 旧版本
    • 概述
    • 移植到当前版本

物品属性

物品属性是将物品的“属性”公开给模型系统的一种方式。一个例子是弓,其中最重要的特性是弓被拉了多远。然后,这些信息用于选择弓的模型,创建拉动弓的动画。

物品属性为其注册的每个ItemStack分配一个特定的float值,原版物品模型定义可以使用这些值来定义“覆盖”,其中物品默认为某个模型,但如果覆盖匹配,则覆盖该模型并使用另一个模型。它们之所以有用,主要是因为它们是连续的。例如,弓使用物品属性来定义其拉动动画。物品模型由’float’数字谓词决定,它不受限制,但通常在0.0F和1.0F之间。这允许资源包为拉弓动画添加他们想要的任意多个模型,而不是在动画中为他们的模型设置四个“槽”。指南针和时钟也是如此。

向物品添加属性

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作为其参数,因为所有物品都将应用此属性。

重要

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

注意

Mojang反对使用ItemPropertyFunction而推荐使用ClampedItemPropertyFunction子接口,该子接口将结果夹在0和1之间。

覆盖的使用

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

重要

predicate适用于大于或等于给定值的所有值。

{
  "parent": "item/generated",
  "textures": {
    // Default
    "layer0": "examplemod:items/example_partial"
  },
  "overrides": [
    {
      // power >= .75
      "predicate": {
        "examplemod:power": 0.75
      },
      "model": "examplemod:item/example_powered"
    }
  ]
}

下面是支持代码中的一个假设片段。与旧版本(低于1.16.x)不同,这只需要在客户端完成,因为服务端上不存在ItemProperties。

private void setup(final FMLClientSetupEvent event)
{
  event.enqueueWork(() ->
  {
    ItemProperties.register(ExampleItems.APPLE, 
      new ResourceLocation(ExampleMod.MODID, "pulling"), (stack, level, living, id) -> {
        return living != null && living.isUsingItem() && living.getUseItem() == stack ? 1.0F : 0.0F;
      });
  });
}
Built with MkDocs using a custom theme. Hosted by Read the Docs.
Enable Dark Theme