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 [2025/04/01 11:14] – [物品颜色提供器] solidblockzh_cn:tutorial:colorprovider [2025/04/01 12:11] (current) solidblock
Line 140: Line 140:
   }   }
  
 +  // 自从 1.21.4 开始,不再需要这个方法,因为所有方块实体都默认使用方块模型。
   @Override   @Override
   protected BlockRenderType getRenderType(BlockState state) {   protected BlockRenderType getRenderType(BlockState state) {
Line 160: 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 196: 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 204: 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 211: 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 249: Line 258:
   * 离开世界重进,颜色应该保留。   * 离开世界重进,颜色应该保留。
  
-===== 自定义物品着色(1.21.4 之后) =====+===== 自定义物品着色(1.21.4 之后) =====
 从 1.21.4 开始,物品的着色是由物品模型映射指定的。原版提供了几种常见的着色来源的类型,参见 [[https://zh.minecraft.wiki/w/物品模型映射|Minecraft Wiki]]。在这个例子中,我们需要直接指定物品的颜色,因此可以将物品模型映射像这样写: 从 1.21.4 开始,物品的着色是由物品模型映射指定的。原版提供了几种常见的着色来源的类型,参见 [[https://zh.minecraft.wiki/w/物品模型映射|Minecraft Wiki]]。在这个例子中,我们需要直接指定物品的颜色,因此可以将物品模型映射像这样写:
 <code javascript /resources/assets/tutorial/items/color_block.json> <code javascript /resources/assets/tutorial/items/color_block.json>
Line 266: Line 275:
 </code> </code>
  
-如果需要指定自定义的着色来源,可以使用原版提供的 ''TintResourceTypes.//ID_MAPPER//.put(...)'' 进行注册。注意这也需要在客户端环境下注册。注册时使用的 ID 将是上面的物品模型映射中的 ''%%"tints"%%'' 中的 ''%%"type"%%'' 的值。+如果需要指定自定义的着色来源,可以使用原版提供的 ''TintResourceTypes.//ID_MAPPER//.put(...)'' 进行注册。注意在客户端环境下完成的。注册时使用的 ID 将是上面的物品模型映射中的 ''%%"tints"%%'' 中的 ''%%"type"%%'' 的值。 
 + 
 +> 如果着色不生效,检查下使用的模型中的 tintindex 的值,应该与物品模型映射中的 ''%%"tints"%%'' 列表中的元素下标对应。例如,如果 tintindex 为 2,表示将使用物品模型映射中的第三个着色来源
  
 ===== 物品颜色提供器(1.21.4 之前) ===== ===== 物品颜色提供器(1.21.4 之前) =====
-在 1.21.3 以及之前的版本,物品的颜色提供器也是可通过 Fabric API 注册的。物品是类似,区别在于提供的上下文不访问状态、世界和位置,而是访问 ''ItemStack''+在 1.21.3 以及之前的版本,物品的颜色提供器也是可通过 Fabric API 注册的。与方块不同,物品的颜色提供器提供的上下文不访问状态、世界和位置,而是访问 ''ItemStack''
  
 物品模型可以直接继承使用 tintindex 的方块模型: 物品模型可以直接继承使用 tintindex 的方块模型:
zh_cn/tutorial/colorprovider.1743506055.txt.gz · Last modified: 2025/04/01 11:14 by solidblock