• 论坛

导航

  • 主页
  • 样式指南
  • 入门
    • 概述
    • Mod的结构
    • Forge更新检查器
    • 依赖管理
    • 调试分析器
  • 概念
    • Sides
    • 资源
    • 注册表
    • Jar签名
    • 国际化和本地化
  • 方块
    • 概述
    • 介绍方块状态
    • 方块互动
  • 动画 API
    • 概述
    • 骨骼
    • 动画状态机
    • 使用API
  • TileEntity
    • 概述
    • 特殊渲染器
  • 物品
    • 主页
    • 战利品表
  • 模型
    • 模型概述
    • 模型文件
    • 方块状态
      • 方块状态JSON概述
      • Forge方块状态JSON
    • 绑定模型到方块和物品
    • 彩色纹理
    • 物品属性概述
      • 给物品添加属性
      • Using Overrides
    • 高级模型(未翻译)
      • 高级模型介绍
      • IModel
      • IModelState and IModelPart
      • IBakedModel
      • Extended Blockstates
      • Perspective
      • ItemOverrideList
      • ICustomModelLoader
  • 渲染
    • TileEntityItemStackRenderer
  • 事件
    • 基本用法
  • 网络
    • 主页
    • 概述
    • SimpleImpl
    • 实体
  • 数据储存
    • 能力系统
    • World Saved Data
    • 拓展实体属性
    • Config注解
  • 工具
    • 合成
    • 矿物词典
    • 权限API
  • 效果
    • 音效
  • 惯例
    • 版本命名
    • 文件位置
    • 加载阶段
  • 参与Forge开发
    • 入门
    • PR指南

物品属性概述

物品属性是一种通过“属性”设定模型的方式。弓就是一个例子,它最重要的一个属性是它拉了多远。这个信息用于决定它用哪个模型,做出拉动的动画。与直接通过ModelLoader.setCustomModelResourceLocation 或 ModelLoader.setCustomMeshDefinition给物品分配ModelResourceLocation不同。这些方法固定了可能的模型集。例如弓,这些方法会固定拉动动画中的帧数为4,然而,属性是可变的。

物品属性给每个注册的ItemStack分配一个确定的float,且原版模型的定义可以用这些值来“覆盖”默认的模型,如果覆盖匹配,它会覆盖并使用另一个。物品模型的格式和覆盖可以在wiki上找到。这很有用因为它是连续的。例如,弓用物品属性来定义它的拉动动画。由于属性的值是一个float,它在0到1上连续增加。这可以让材质包根据想要的增幅增加许多模型,而不是限制在默认动画中的4个模型。指南针和钟也同样如此。

给物品添加属性

用Item::addPropertyOverride给物品添加属性。ResourceLocation参数是给属性的名字(例如new ResourceLocation("pull"))。IItemPropertyGetter是一个回调函数,其中参数有拿着的ItemStack,所在的World,拿着它的实体生物EntityLivingBase,该回调函数返回float类型,即物品的属性。一些列子是ItemBow里的”pulling“和”pull“属性,和Item里的几个static final的属性。对于mod里的属性,推荐用modid作为命名空间(例如examplemod:property而不仅仅是property,因为那样实际上是minecraft:property)。

Using Overrides

覆盖的格式可以参考wiki,model/item/bow.json是一个很好的例子。作为参考,这是一个假想的例子,有一个有examplemod:power属性的物品。如果它的值不匹配,则是默认模型。

重要

predicate匹配 大于等于 给定值的值。

{
  "parent": "item/generated",
  "textures": {
    "__comment": "默认",
    "layer0": "examplemod:items/examplePartial"
  },
  "overrides": [
    {
      "__comment": "power >= .75 时",
      "predicate": {
        "examplemod:power": 0.75
      },
      "model": "examplemod:item/examplePowered"
    }
  ]
}

这是配合它的一段代码。(它不一定要仅客户端(client-only);它也可以在服务端工作。在原版里,属性在物品的构造器中注册。)

item.addPropertyOverride(new IItemPropertyGetter() {
  @SideOnly(Side.CLIENT)
  @Override
  public float apply(ItemStack stack, @Nullable World world, @Nullable EntityLivingBase entity) {
    return (float)getPowerLevel(stack) / (float)getMaxPower(stack); // 一些其它代码
  }
}
基于 MkDocs 使用自定义主题构建. 托管于 Read the Docs.
启用夜间模式