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

Hi, I am trying to create a custom

ItemStackTileEntityRenderer

For an Item, to render a custom durability bar.

I have looked through vanilla code and tried to implement this with a 

ItemStackTileEntityRenderer

But so far have had 0 luck.

If I try to use

ItemRenderer.render()

It crashes because it ends up endlessly looping.

My custom method to draw the bar is also not working.

CosmosEnergyItemItemStackRenderer.java

Spoiler

@Override
    public void renderByItem(ItemStack stackIn, ItemCameraTransforms.TransformType transformIn, MatrixStack matrixStack, IRenderTypeBuffer typeBuffer, int combinedLight, int combinedOverlay) {
        Item item = stackIn.getItem();
        Minecraft mc = Minecraft.getInstance();
        ItemRenderer renderer = mc.getItemRenderer();

        if (item instanceof CosmosEnergyItem) {
            boolean flag = transformIn == ItemCameraTransforms.TransformType.GUI;

            matrixStack.pushPose();
            if (flag) {
                //renderer.renderGuiItem(stackIn, combinedLight, combinedOverlay);
                IBakedModel model = renderer.getModel(stackIn, null, null);
                
                CosmosItemRenderer.renderGuiItemDecorations(matrixStack, mc.font, stackIn, combinedLight, combinedOverlay, null, renderer);
                //renderer.render(stackIn, transformIn, false, matrixStack, typeBuffer, combinedLight, combinedOverlay, model);
            } else {
                IBakedModel model = renderer.getModel(stackIn, null, null);
                
                //renderer.render(stackIn, transformIn, true, matrixStack, typeBuffer, combinedLight, combinedOverlay, model);

                boolean flag1;
                if (transformIn != ItemCameraTransforms.TransformType.GUI && !transformIn.firstPerson() && stackIn.getItem() instanceof BlockItem) {
                    Block block = ((BlockItem) stackIn.getItem()).getBlock();
                    flag1 = !(block instanceof BreakableBlock) && !(block instanceof StainedGlassPaneBlock);
                }

                else {
                    flag1 = true;
                }

                if (model.isLayered()) {
                    ForgeHooksClient.drawItemLayered(renderer, model, stackIn, matrixStack, typeBuffer, combinedLight, combinedOverlay, flag1);
                }

                else {
                    RenderType rendertype = RenderTypeLookup.getRenderType(stackIn, flag1);
                    IVertexBuilder ivertexbuilder;

                    if (stackIn.getItem() == Items.COMPASS && stackIn.hasFoil()) {
                        matrixStack.pushPose();
                        MatrixStack.Entry matrixstack$entry = matrixStack.last();

                        if (transformIn == ItemCameraTransforms.TransformType.GUI) {
                            matrixstack$entry.pose().multiply(0.5F);
                        } else if (transformIn.firstPerson()) {
                            matrixstack$entry.pose().multiply(0.75F);
                        }

                        if (flag1) {
                            ivertexbuilder = ItemRenderer.getCompassFoilBufferDirect(typeBuffer, rendertype, matrixstack$entry);
                        } else {
                            ivertexbuilder = ItemRenderer.getCompassFoilBuffer(typeBuffer, rendertype, matrixstack$entry);
                        }

                        matrixStack.popPose();
                        
                    } else if (flag1) {
                        ivertexbuilder = ItemRenderer.getFoilBufferDirect(typeBuffer, rendertype, true, stackIn.hasFoil());
                    } else {
                        ivertexbuilder = ItemRenderer.getFoilBuffer(typeBuffer, rendertype, true, stackIn.hasFoil());
                    }

                    renderer.renderModelLists(model, stackIn, combinedLight, combinedOverlay, matrixStack, ivertexbuilder);
                }
                
                matrixStack.popPose();
            }
        }
    }


CosmosItemRenderer.java

Spoiler

@SuppressWarnings("deprecation")
    @OnlyIn(Dist.CLIENT)
    public static void renderGuiItemDecorations(MatrixStack matrixstack, FontRenderer fontRenderer, ItemStack stackIn, int p_180453_3_, int p_180453_4_, @Nullable String p_180453_5_, ItemRenderer renderer) {
        if (!stackIn.isEmpty()) {
            
            Item stackItem = stackIn.getItem();
            
            if (stackItem instanceof CosmosEnergyItem) {
                CosmosEnergyItem energyItem = (CosmosEnergyItem) stackItem;
                
                if (energyItem.showEnergyBar(stackIn)) {
                    RenderSystem.disableDepthTest();
                    RenderSystem.disableTexture();
                    RenderSystem.disableAlphaTest();
                    RenderSystem.disableBlend();
                    
                    Tessellator tessellator = Tessellator.getInstance();
                    BufferBuilder bufferbuilder = tessellator.getBuilder();
                    
                    double health = energyItem.getEnergyForDisplay(stackIn);
                    int i = Math.round(13.0F - (float) health * 13.0F);
                    int j = energyItem.getRGBEnergyForDisplay(stackIn);
                    
                    fillRect(bufferbuilder, p_180453_3_ + 2, p_180453_4_ + 11, 13, 2, 0, 0, 0, 255);
                    fillRect(bufferbuilder, p_180453_3_ + 2, p_180453_4_ + 11, i, 1, j >> 16 & 255, j >> 8 & 255, j & 255, 255);
                    
                    RenderSystem.enableBlend();
                    RenderSystem.enableAlphaTest();
                    RenderSystem.enableTexture();
                    RenderSystem.enableDepthTest();
                }
            }
        }
    }

    private static void fillRect(BufferBuilder p_181565_1_, int p_181565_2_, int p_181565_3_, int p_181565_4_, int p_181565_5_, int p_181565_6_, int p_181565_7_, int p_181565_8_, int p_181565_9_) {
        p_181565_1_.begin(7, DefaultVertexFormats.POSITION_COLOR);
        p_181565_1_.vertex((double) (p_181565_2_ + 0), (double) (p_181565_3_ + 0), 0.0D) .color(p_181565_6_, p_181565_7_, p_181565_8_, p_181565_9_).endVertex();
        p_181565_1_.vertex((double) (p_181565_2_ + 0), (double) (p_181565_3_ + p_181565_5_), 0.0D) .color(p_181565_6_, p_181565_7_, p_181565_8_, p_181565_9_).endVertex();
        p_181565_1_.vertex((double) (p_181565_2_ + p_181565_4_), (double) (p_181565_3_ + p_181565_5_), 0.0D) .color(p_181565_6_, p_181565_7_, p_181565_8_, p_181565_9_).endVertex();
        p_181565_1_.vertex((double) (p_181565_2_ + p_181565_4_), (double) (p_181565_3_ + 0), 0.0D) .color(p_181565_6_, p_181565_7_, p_181565_8_, p_181565_9_).endVertex();
        Tessellator.getInstance().end();
    }


I am really not sure how to handle this. The item does not render in any state currently, it is invisible. I had to use

"parent": "builtin/entity"

inside the Item.json to allow the ISTER to even work. I know this is probably an atrocious attempt, but I have been toying with this for 3 hours now and still nothing.

Any help or advice is appreciated.

  • Author

Okay so this was NOT the way to go about this.

I have since discovered they sorta correct way to do this.

Using:

GuiContainerEvent.DrawForeground event

I can overlay my bar correctly.

why can't you use the vanilla durability bar?

oh and btw, don't use @OnlyIn, and please post code using the code tool that the forum provides

so that we can actually read the code without struggling

 

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.