Jump to content

Help with rendering a GUI


Big_Bad_E

Recommended Posts

I have a simple GUI that's supposed to display a player's armor and a picture of it.

I know I will have problems with Leather Armor cause it's an overlay but I just wanna get basic things working first (Any help doing that would be appriciated)

Here's my code right now:
 

public ArmorOverlay() {
        Minecraft mc = Minecraft.getMinecraft();
        EntityPlayer player = mc.thePlayer;
        for (int i = 0; i < 4; i++) {
            ItemStack armor = player.getCurrentArmor(3-i);
            if (armor != null) {
                String registryName = armor.getItem().getRegistryName();
                mc.renderEngine.bindTexture(new ResourceLocation(registryName.split(":")[0], "textures/items/" + registryName.split(":")[1] + ".png"));
                drawTexturedModalRect(20, 20 + (i * 16), 0, 0, 16, 16);
                drawString(Minecraft.getMinecraft().fontRendererObj, I18n.format(armor.getItem().getUnlocalizedName() + ".name") + " (" + (armor.getMaxDamage() - armor.getItemDamage()) + "/" + armor.getMaxDamage() + ")", 40, 20 + (i * 16), MathHelper.hsvToRGB(Math.max(0.0F, (float) (1.0F - (double) armor.getItemDamage()/ (double) armor.getMaxDamage())) / 3.0F, 1.0F, 1.0F));
            }
        }
    }

My problem is the image won't render, and I think it is a problem with the third and fourth args of the drawTexturedModalRect (I tried getTextureManager too).

The strings draw with the right color, so what's wrong with the armor? If I set the third/fourth args to random things it gives me colored squares.

For a diamond helmet I get blue squares, Leather chestplate gives me green squares, Leather leggings give orange squares, and Diamond boots give me dark green/orange squares

Link to comment
Share on other sites

3 hours ago, Big_Bad_E said:

public ArmorOverlay() {

This is called literally once. There are multiple render methods in GuiScreen that are not a constructor.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

1 hour ago, Big_Bad_E said:

No it was called multiple times (I was being dumb and created an instance of it in my event)

look at how vanilla does it inside the inventory?

About Me

Spoiler

My Discord - Cadiboo#8887

My WebsiteCadiboo.github.io

My ModsCadiboo.github.io/projects

My TutorialsCadiboo.github.io/tutorials

Versions below 1.14.4 are no longer supported on this forum. Use the latest version to receive support.

When asking support remember to include all relevant log files (logs are found in .minecraft/logs/), code if applicable and screenshots if possible.

Only download mods from trusted sites like CurseForge (minecraft.curseforge.com). A list of bad sites can be found here, with more information available at stopmodreposts.org

Edit your own signature at www.minecraftforge.net/forum/settings/signature/ (Make sure to check its compatibility with the Dark Theme)

Link to comment
Share on other sites

Code from GuiCrafting (in the background drawing code)

GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
this.mc.getTextureManager().bindTexture(CRAFTING_TABLE_GUI_TEXTURES);
int i = this.guiLeft;
int j = (this.height - this.ySize) / 2;
this.drawTexturedModalRect(i, j, 0, 0, this.xSize, this.ySize);

Trying that and nothing different.

I tried setting the resource location to "minecraft", "textures/items/diamond_chestplate.png"

and

"minecraft:textures/items/diamond_chestpalte.png"

but it is not working at all.

Link to comment
Share on other sites

Just now, Big_Bad_E said:

Code from GuiCrafting (in the background drawing code)


GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
this.mc.getTextureManager().bindTexture(CRAFTING_TABLE_GUI_TEXTURES);
int i = this.guiLeft;
int j = (this.height - this.ySize) / 2;
this.drawTexturedModalRect(i, j, 0, 0, this.xSize, this.ySize);

Trying that and nothing different.

I tried setting the resource location to "minecraft", "textures/items/diamond_chestplate.png"

and

"minecraft:textures/items/diamond_chestpalte.png"

but it is not working at all.

No not that part, the part that renders the player with all their Armor and held items

About Me

Spoiler

My Discord - Cadiboo#8887

My WebsiteCadiboo.github.io

My ModsCadiboo.github.io/projects

My TutorialsCadiboo.github.io/tutorials

Versions below 1.14.4 are no longer supported on this forum. Use the latest version to receive support.

When asking support remember to include all relevant log files (logs are found in .minecraft/logs/), code if applicable and screenshots if possible.

Only download mods from trusted sites like CurseForge (minecraft.curseforge.com). A list of bad sites can be found here, with more information available at stopmodreposts.org

Edit your own signature at www.minecraftforge.net/forum/settings/signature/ (Make sure to check its compatibility with the Dark Theme)

Link to comment
Share on other sites

53 minutes ago, Cadiboo said:

No not that part, the part that renders the player with all their Armor and held items

Why?

That part renders the GUI, I wanna render a GUI, that looks like the right code.

 

Ohhh, I see what you were thinking.

I am not trying to render the armor model, just the texture.

 

Actually that's a great idea. I'ma do that myself.

Here's the code

GlStateManager.enableColorMaterial();
GlStateManager.pushMatrix();
GlStateManager.translate((float)posX, (float)posY, 50.0F);
GlStateManager.scale((float)(-scale), (float)scale, (float)scale);
GlStateManager.rotate(180.0F, 0.0F, 0.0F, 1.0F);
float f = ent.renderYawOffset;
float f1 = ent.rotationYaw;
float f2 = ent.rotationPitch;
float f3 = ent.prevRotationYawHead;
float f4 = ent.rotationYawHead;
GlStateManager.rotate(135.0F, 0.0F, 1.0F, 0.0F);
RenderHelper.enableStandardItemLighting();
GlStateManager.rotate(-135.0F, 0.0F, 1.0F, 0.0F);
GlStateManager.rotate(-((float)Math.atan((double)(mouseY / 40.0F))) * 20.0F, 1.0F, 0.0F, 0.0F);
ent.renderYawOffset = (float)Math.atan((double)(mouseX / 40.0F)) * 20.0F;
ent.rotationYaw = (float)Math.atan((double)(mouseX / 40.0F)) * 40.0F;
ent.rotationPitch = -((float)Math.atan((double)(mouseY / 40.0F))) * 20.0F;
ent.rotationYawHead = ent.rotationYaw;
ent.prevRotationYawHead = ent.rotationYaw;
GlStateManager.translate(0.0F, 0.0F, 0.0F);
RenderManager rendermanager = Minecraft.getMinecraft().getRenderManager();
rendermanager.setPlayerViewY(180.0F);
rendermanager.setRenderShadow(false);
rendermanager.renderEntity(ent, 0.0D, 0.0D, 0.0D, 0.0F, 1.0F, false);
rendermanager.setRenderShadow(true);
ent.renderYawOffset = f;
ent.rotationYaw = f1;
ent.rotationPitch = f2;
ent.prevRotationYawHead = f3;
ent.rotationYawHead = f4;
GlStateManager.popMatrix();
RenderHelper.disableStandardItemLighting();
GlStateManager.disableRescaleNormal();
GlStateManager.setActiveTexture(OpenGlHelper.lightmapTexUnit);
GlStateManager.disableTexture2D();
GlStateManager.setActiveTexture(OpenGlHelper.defaultTexUnit);
Edited by Big_Bad_E
Link to comment
Share on other sites

4 hours ago, Big_Bad_E said:

https://imgur.com/a/qmk4qaF

I think it's looking really cool :)

Needs some refining but thanks for the idea Cadiboo!

 

Quick question, what is the variable for the direction the player's body is facing? Also is it possible to disable a player's death animation?

If your just trying to render the armor ItemStack model then have a look at

https://github.com/Cadiboo/WIPTech/blob/d5504c15d23c66b220064c93ce8fa27c3c457fd0/src/main/java/cadiboo/wiptech/client/gui/GuiAssemblyTable.java#L112-L178

and

https://github.com/Cadiboo/WIPTechAlpha/blob/41c881e00fa7a309761aeeea944dc552fec3fa30/src/main/java/cadiboo/wiptech/client/ClientUtil.java#L634-L746

the variable for the players facing direction player.rotationYaw & player.rotationPitch. you may have to use some 3d math / trigonometry to get the actual position.

You could probably disable the death animation, but it would require digging into the source code to find out where the death animation is actually done.

If you do decide to try and do this have a look at 

RenderLivingBase [line: 285] - setBrightness(T, float, boolean)    
RenderLivingBase [line: 414] - applyRotations(T, float, float, float)    
RenderPlayer [line: 254] - applyRotations(AbstractClientPlayer, float, float, float)    

About Me

Spoiler

My Discord - Cadiboo#8887

My WebsiteCadiboo.github.io

My ModsCadiboo.github.io/projects

My TutorialsCadiboo.github.io/tutorials

Versions below 1.14.4 are no longer supported on this forum. Use the latest version to receive support.

When asking support remember to include all relevant log files (logs are found in .minecraft/logs/), code if applicable and screenshots if possible.

Only download mods from trusted sites like CurseForge (minecraft.curseforge.com). A list of bad sites can be found here, with more information available at stopmodreposts.org

Edit your own signature at www.minecraftforge.net/forum/settings/signature/ (Make sure to check its compatibility with the Dark Theme)

Link to comment
Share on other sites

Here is my code:

public class ArmorOverlay extends Gui {

    private List<ItemStack> armor = new ArrayList<ItemStack>();

    public ArmorOverlay() {
        if(Minecraft.getMinecraft().thePlayer != null)
        for (int i = 0; i < 4; i++) {
            ItemStack itemArmor = Minecraft.getMinecraft().thePlayer.getCurrentArmor(i);
            if (itemArmor != null)
                armor.add(itemArmor);
        }
    }

    public void render() {
        if (Minecraft.getMinecraft().thePlayer.isDead) return;
        List<ItemStack> newArmor = new ArrayList<ItemStack>();
        for (int i = 0; i < 4; i++) {
            ItemStack itemArmor = Minecraft.getMinecraft().thePlayer.getCurrentArmor(i);
            if (itemArmor != null)
                newArmor.add(itemArmor);
        }
        if (!armor.equals(newArmor)) {
            renderEntity();
            for (int i = 0; i < 4; i++) {
                ItemStack armor = Minecraft.getMinecraft().thePlayer.getCurrentArmor(3 - i);
                if (armor != null) {
                    drawString(Minecraft.getMinecraft().fontRendererObj, I18n.format(armor.getItem().getUnlocalizedName() + ".name") + " (" + (armor.getMaxDamage() - armor.getItemDamage()) + "/" + armor.getMaxDamage() + ")", 40, 20 + (i * 16), MathHelper.hsvToRGB(Math.max(0.0F, (float) (1.0F - (double) armor.getItemDamage() / (double) armor.getMaxDamage())) / 3.0F, 1.0F, 1.0F));
                }
            }
        }
    }

    private void renderEntity() {
        try {
            EntityPlayerSP ent = Minecraft.getMinecraft().thePlayer;
            
            int posX = 20;
            int posY = 80;
            GlStateManager.enableColorMaterial();
            GlStateManager.pushMatrix();
            GlStateManager.translate((float) posX, (float) posY, 50.0F);
            GlStateManager.scale(-30f, 30f, 30f);
            GlStateManager.rotate(180.0F, 0.0F, 0.0F, 1.0F);
            Collection<PotionEffect> effects = ent.getActivePotionEffects();
            Boolean invisible = ent.isInvisible();
            ItemStack item = ent.getHeldItem();
            int slot = ent.inventory.currentItem;
            Field field = Entity.class.getDeclaredField("fire");
            field.setAccessible(true);
            int fire = field.getInt(ent);
            int arrows = ent.getArrowCountInEntity();
            Boolean swing = ent.isSwingInProgress;
            float f = ent.renderYawOffset;
            float f1 = ent.rotationYaw;
            float f2 = ent.rotationPitch;
            float f3 = ent.prevRotationYawHead;
            float f4 = ent.rotationYawHead;
            GlStateManager.rotate(135.0F, 0.0F, 1.0F, 0.0F);
            RenderHelper.enableStandardItemLighting();
            GlStateManager.rotate(-135.0F, 0.0F, 1.0F, 0.0F);
            ent.clearActivePotions();
            field.setInt(ent, 0);
            ent.getDataWatcher().updateObject(9, (byte) 0);
            ent.isSwingInProgress = false;
            ent.getDataWatcher().updateObject(0, (byte) (ent.getDataWatcher().getWatchableObjectByte(0) | 1 << 5));
            ent.rotationYaw = 0f;
            ent.rotationPitch = 0f;
            ent.rotationYawHead = 0f;
            ent.prevRotationYawHead = ent.rotationYaw;
            GlStateManager.translate(0.0F, 0.0F, 0.0F);
            RenderManager rendermanager = Minecraft.getMinecraft().getRenderManager();
            rendermanager.setPlayerViewY(180.0F);
            rendermanager.setRenderShadow(false);
            rendermanager.renderEntitySimple(ent, 0f);
            rendermanager.setRenderShadow(true);
            if (invisible) {
                ent.getDataWatcher().updateObject(0, (byte) (ent.getDataWatcher().getWatchableObjectByte(0) | 1 << 5));
            } else {
                ent.getDataWatcher().updateObject(0, (byte) (ent.getDataWatcher().getWatchableObjectByte(0) & ~(1 << 5)));
            }
            field.setInt(ent, fire);
            field.setAccessible(false);
            ent.getDataWatcher().updateObject(9, (byte) arrows);
            ent.inventory.setInventorySlotContents(slot, item);
            ent.renderYawOffset = f;
            ent.rotationYaw = f1;
            ent.rotationPitch = f2;
            ent.prevRotationYawHead = f3;
            ent.rotationYawHead = f4;
            ent.isSwingInProgress = swing;
            ent.clearActivePotions();
            for (PotionEffect effect : effects) {
                ent.addPotionEffect(effect);
            }
            GlStateManager.popMatrix();
            RenderHelper.disableStandardItemLighting();
            GlStateManager.disableRescaleNormal();
            GlStateManager.setActiveTexture(OpenGlHelper.lightmapTexUnit);
            GlStateManager.disableTexture2D();
            GlStateManager.setActiveTexture(OpenGlHelper.defaultTexUnit);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

For some reason the player's body will turn instead of staying the same like it should.

Also the player will vibrate around whenever I move.

And, the player's head's pitch is not working for some reason.

I tried setting lastPosX/Y and no luck.

Edited by Big_Bad_E
Link to comment
Share on other sites

You obviously forgot to zero out the player's position before rendering.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

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.