Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

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

  • Author

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

  • Author

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.

Edited by urbanxx001

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.

  • Author
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

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 :) 

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...

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.