User Tools

Site Tools


zh_cn:tutorial:colorprovider

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
zh_cn:tutorial:colorprovider [2024/08/27 03:21] solidblockzh_cn:tutorial:colorprovider [2025/04/01 12:11] (current) solidblock
Line 27: Line 27:
   [...]   [...]
  
 +  // 1.21.2 之前:
   public static final Block COLOR_BLOCK = register("color_block", new Block(AbstractBlock.Settings.create()));   public static final Block COLOR_BLOCK = register("color_block", new Block(AbstractBlock.Settings.create()));
 +  
 +  // 1.21.2 及之后:
 +  public static final Block COLOR_BLOCK = register("color_block", Block::new, AbstractBlock.Settings.create());
 } }
 </code> </code>
Line 95: Line 99:
 </code> </code>
  
-在这个实例里面,我们添加了单一的 tintindex,出现在 ''tintIndex'' 参数中(着色索引 0)。事实上,特准可以直接继承 ''minecraft:block/leaves'' 模型,因为也使用的带有 tintindex 的方块。所以可以将上面的模型替换为:+在这个实例里面,我们添加了单一的 tintindex,出现在 ''tintIndex'' 参数中(着色索引 0)。事实上,方块可以直接继承 ''minecraft:block/leaves'' 模型,因为也使用的带有 tintindex 的方块。所以可以将上面的模型替换为:
 <code javascript src/main/resources/assets/tutorial/models/block/color_block.json> <code javascript src/main/resources/assets/tutorial/models/block/color_block.json>
 { {
Line 136: Line 140:
   }   }
  
 +  // 自从 1.21.4 开始,不再需要这个方法,因为所有方块实体都默认使用方块模型。
   @Override   @Override
   protected BlockRenderType getRenderType(BlockState state) {   protected BlockRenderType getRenderType(BlockState state) {
Line 156: Line 161:
   protected void readNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup registryLookup) {   protected void readNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup registryLookup) {
     super.readNbt(nbt, registryLookup);     super.readNbt(nbt, registryLookup);
-    color = nbt.getInt("color");+     
 +    // 对于 1.21.5 之前的版本,请直接使用 nbt.getInt("color"); 
 +    color = nbt.getInt("color", 0);
          
     // 当数据通过“/data”命令修改,或者放置了有“block_entity_data”组件的物品时,     // 当数据通过“/data”命令修改,或者放置了有“block_entity_data”组件的物品时,
Line 192: Line 199:
 在 ''TutorialBlocks'' 类中,将 ''new Block'' 替换为 ''new ColorBlock'' 在 ''TutorialBlocks'' 类中,将 ''new Block'' 替换为 ''new ColorBlock''
 <code java> <code java>
 +  // 1.21.2 之前:
   public static final ColorBlock COLOR_BLOCK = register("color_block", new ColorBlock(AbstractBlock.Settings.create()));   public static final ColorBlock COLOR_BLOCK = register("color_block", new ColorBlock(AbstractBlock.Settings.create()));
 +  
 +  // 1.21.2 及之后:
 +  public static final Block COLOR_BLOCK = register("color_block", ColorBlock::new, AbstractBlock.Settings.create());
 </code> </code>
  
Line 200: Line 211:
       BlockEntityType.Builder.create(ColorBlockEntity::new, TutorialBlocks.COLOR_BLOCK).build());       BlockEntityType.Builder.create(ColorBlockEntity::new, TutorialBlocks.COLOR_BLOCK).build());
 </code> </code>
 +
 +> 不要忘了在你的模组初始化器中,静态加载 ''TutorialBlocks'' 和 ''TutorialBlockEntityTypes'' 类。
  
 现在我们修改 ''onUseWithItem'' 方法,这样颜色会在我们使用染料与方块接触时改变: 现在我们修改 ''onUseWithItem'' 方法,这样颜色会在我们使用染料与方块接触时改变:
Line 207: Line 220:
      
   @Override   @Override
-  protected ItemActionResult onUseWithItem(ItemStack stack, BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {+  protected ActionResult onUseWithItem(ItemStack stack, BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
     if (stack.getItem() instanceof DyeItem dyeItem) {     if (stack.getItem() instanceof DyeItem dyeItem) {
       if (world.getBlockEntity(pos) instanceof ColorBlockEntity colorBlockEntity) {       if (world.getBlockEntity(pos) instanceof ColorBlockEntity colorBlockEntity) {
         final int newColor = dyeItem.getColor().getEntityColor();         final int newColor = dyeItem.getColor().getEntityColor();
         final int originalColor = colorBlockEntity.color;         final int originalColor = colorBlockEntity.color;
-        colorBlockEntity.color = ColorHelper.Argb.averageArgb(newColor, originalColor);+        colorBlockEntity.color = ColorHelper.average(newColor, originalColor);
         stack.decrementUnlessCreative(1, player);         stack.decrementUnlessCreative(1, player);
         colorBlockEntity.markDirty();         colorBlockEntity.markDirty();
Line 245: Line 258:
   * 离开世界重进,颜色应该保留。   * 离开世界重进,颜色应该保留。
  
-===== 物品颜色提供器 ===== +===== 自定义物品着色(1.21.4 及之后) ===== 
-物品是类似的,区别在于提供的上下文不访问状态、世界和位置,而是访问 ''ItemStack''+从 1.21.4 开始,物品的着色是由物品模型映射指定的。原版提供了几种常见的着色来源的类型,参见 [[https://zh.minecraft.wiki/w/物品模型映射|Minecraft Wiki]]。在这个例子中,我们需要直接指定物品的颜色,因此可以将物品模型映射像这样写: 
 +<code javascript /resources/assets/tutorial/items/color_block.json> 
 +
 +  "model":
 +    "type": "model", 
 +    "model": "tutorial:block/color_block", 
 +    "tints":
 +      { 
 +        "type": "constant", 
 +        "value": 3446251 
 +      } 
 +    ] 
 +  } 
 +
 +</code> 
 + 
 +如果需要指定自定义的着色来源,可以使用原版提供的 ''TintResourceTypes.//ID_MAPPER//.put(...)'' 进行注册。注意是在客户端环境下完成的。注册时使用的 ID 将是上面的物品模型映射中的 ''%%"tints"%%'' 中的 ''%%"type"%%'' 的值。 
 + 
 +> 如果着色不生效,检查下使用的模型中的 tintindex 的值,应该与物品模型映射中的 ''%%"tints"%%'' 列表中的元素下标对应。例如,如果 tintindex 为 2,表示将使用物品模型映射中的第三个着色来源。 
 + 
 +===== 物品颜色提供器(1.21.4 之前) ===== 
 +在 1.21.3 以及之前的版本,物品的颜色提供器也可通过 Fabric API 注册。与方块不同物品的颜色提供器提供的上下文不访问状态、世界和位置,而是访问 ''ItemStack''
  
 物品模型可以直接继承使用 tintindex 的方块模型: 物品模型可以直接继承使用 tintindex 的方块模型:
 +
 +首先,物品需要一个直接继承方块模型的物品模型:
 +<code javascript /resources/assets/tutorial/models/item/color_block.json>
 +{
 +  "parent": "tutorial:block/color_block"
 +}
 +</code>
 +
 +然后,再在客户端环境中,注册颜色提供器。
  
 <code java ExampleModClient.java> <code java ExampleModClient.java>
zh_cn/tutorial/colorprovider.1724728918.txt.gz · Last modified: 2024/08/27 03:21 by solidblock