Jump to content

[1.16.1] Dyeable Item Layers Incorrect


urbanxx001

Recommended Posts

After following a tutorial I still have a small problem (I know the anti-tut ppl will berate me). Layer0 is dyeable but returns a black color, and layer1 (overlay) returns the default color that layer0 should be. The layer0 texture is properly grayscale. Item code below. It's probably due to getItemColor, but I've toyed with it with no success

 

public class DyeableBackpackItem extends Item implements IBackpack {

   private final Backpack backpack;
   private static final String NBT_COLOR = "BackpackColor";

   public DyeableBackpackItem(Backpack backpack, Properties properties) {
      super(properties);
      this.backpack = backpack;
   }

   public static int getBackpackColor(ItemStack stack) {
      return stack.getOrCreateTag().getInt(NBT_COLOR);
   }

   public static void setBackpackColor(ItemStack stack, int color) {
      stack.getOrCreateTag().putInt(NBT_COLOR, color);
   }

   public static int getItemColor(ItemStack stack, int tintIndex) {
      if (tintIndex == 0) {
         return getBackpackColor(stack);
      }
      return 10511680;
   }

   @Override
   public ActionResult<ItemStack> onItemRightClick(World worldIn, PlayerEntity playerIn, Hand handIn) {

      ItemStack itemstack = playerIn.getHeldItem(handIn);

      if (playerIn.isSneaking()) {
         if (!worldIn.isRemote && playerIn instanceof ServerPlayerEntity) {

            double pX = playerIn.getPosX();
            double pY = playerIn.getPosY();
            double pZ = playerIn.getPosZ();

            worldIn.playSound(null, pX, pY + 0.5D, pZ, SoundEvents.ITEM_ARMOR_EQUIP_LEATHER, SoundCategory.PLAYERS, 1.0F, 1.0F);
            open((ServerPlayerEntity)playerIn, itemstack, handIn == Hand.MAIN_HAND ? playerIn.inventory.currentItem : -1);

            return ActionResult.resultConsume(itemstack);
         }
      }
      return ActionResult.resultFail(itemstack);
   }

   @Override
   public void open(ServerPlayerEntity player, ItemStack stack, int selectedSlot) {
      NetworkHooks.openGui(player, new SimpleNamedContainerProvider((id, playerInventory, openPlayer) -> new BackpackContainer(id, playerInventory, new BackpackInventory(stack, backpack.getInventorySize()), backpack, selectedSlot), stack.getDisplayName()), buffer -> {
         buffer.writeEnumValue(backpack);
         buffer.writeVarInt(selectedSlot);
      });
   }
   
   public Backpack getBackpack() {
      return backpack;
   }

   // Fixes bug

   @Override
   public CompoundNBT getShareTag(ItemStack stack) {
      if (ServerConfig.getInstance().shareAllNBTData.get()) {
         return super.getShareTag(stack);
      }
      if (!stack.hasTag()) {
         return null;
      }
      final CompoundNBT compound = stack.getTag().copy();
      compound.remove("Items");
      if (compound.isEmpty()) {
         return null;
      }
      return compound;
   }

   // Fixes bug
   
   @Override
   public boolean onDroppedByPlayer(ItemStack item, PlayerEntity player) {
      return !(player.openContainer instanceof BackpackContainer);
   }
}
Edited by urbanxx001
Link to comment
Share on other sites

Yeah. In the main class:

eventBus.addListener(ColorHandler::registerItemColors);

With:

public class ColorHandler {

    public static void registerItemColors(ColorHandlerEvent.Item event) {
        event.getItemColors().register(DyeableBackpackItem::getItemColor, ModItems.LEATHER_BACKPACK);
    }
}
Edited by urbanxx001
Link to comment
Share on other sites

34 minutes ago, urbanxx001 said:

The method is definitely called, again layer0 is dyeable, and the dyeing recipe uses getItemColor, it's just the default color is applied to layer1 instead of 0.

The default color is returned for layer1 because you are returning 10511680 in getItemColor() if the layer is not 0. Try changing the last return to -1.

  • Thanks 1
Link to comment
Share on other sites

4 hours ago, vemerion said:

Try changing the last return to -1.

That did the trick, thanks for your help yesterday and now today. I wonder why it wasn't that way in the tutorial. Fixed Layer0 by using fillItemGroup, I first avoided it as I thought it would register 2 instances of the item. 

Edited by urbanxx001
Link to comment
Share on other sites

10 hours ago, urbanxx001 said:

That did the trick, thanks for your help yesterday and now today. I wonder why it wasn't that way in the tutorial. Fixed Layer0 by using fillItemGroup, I first avoided it as I thought it would register 2 instances of the item. 

No problem, glad I could be of help :) 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.