Jump to content

[1.7.10] How to render Mob HP Bar above Mob's position?


Thornack
 Share

Recommended Posts

Hi everyone,

 

So I am trying to render a mobs HP in a bar above its position if the mob is in a battle with a player (I use a string to control the triggering of the render) basically if the string contains the characters "Fighting:" then the hp bar should render above the mob. So far I tried the following

 

(which is kinda cool but not what I want)

 

(the code below changes the colour of the mob from green to yellow to orange to red as the mob takes damage (I want my health bar to do the same aswell).

 

Im not really experienced with this sort of thing so the code below is code that I created for rendering and Hp bar for the player in his HUD: Im using this as a basis to go off of. Any help / suggestions on what to do next are appreciated.

 

My Renderer Class

@SideOnly(Side.CLIENT)
public class RenderCustomEntity extends RenderLiving // if I extend RendererLivingEntity the Exp bar always renders and we don't want this
{
private ModelBase playerModel = new ModelBiped();
private ModelBase consistentModel;
  //  private GameProfile gameProfile = null;
private ResourceLocation consistentTexture;
private ResourceLocation currentTexture;
private Minecraft mc = Minecraft.getMinecraft();

public RenderCustomEntity(ModelBase model, String textureName, float shadowRadius)
{
	super(model, shadowRadius);
	this.consistentTexture = new ResourceLocation("customMod:textures/mob/" + textureName);
	this.consistentModel = model;
}

private static final ResourceLocation healthBarTexture = new ResourceLocation("customMod:textures/gui/HealthBar.png");

@Override
public void doRender(Entity entity, double x, double y, double z, float f, float F)
{
	if (entity instanceof EntityCustomEntity)
	{
		EntityCustomEntity customEntity= (EntityCustomEntity) entity;

		if(customEntity.inBattle != null && customEntity.inBattle.contains("Fighting:")){
			int currentHp = customEntity.stats.currentHp;
			int maxHp = customEntity.stats.hp;
			int width = mc.displayWidth;
			int height = mc.displayHeight;

			this.mc.getTextureManager().bindTexture(healthBarTexture);
			int healthBarWidth = (int)(((float) currentHp/ maxHp) * 71);
			drawTexturedModalRect(width/2 -106, height- 40, 0, 0, 77, 9);
			int xOffset = 0;
			if(currentHp >=100){
				xOffset = -6;
			}
			if(healthBarWidth > 30){
				drawTexturedModalRect(width/2 -106 + 2, height- 40 + 1, 0, 9, healthBarWidth, 5);
				this.mc.fontRenderer.drawString("HP: " + (int)this.mc.thePlayer.getHealth() + "/" + currentHp, width/2 -91 + xOffset, height- 49, 0);
				this.mc.fontRenderer.drawString("HP: " + (int)this.mc.thePlayer.getHealth() + "/" + currentHp, width/2 -89 + xOffset, height- 49, 0);
				this.mc.fontRenderer.drawString("HP: " + (int)this.mc.thePlayer.getHealth() + "/" + currentHp, width/2 -90 + xOffset, height- 50, 0);
				this.mc.fontRenderer.drawString("HP: " + (int)this.mc.thePlayer.getHealth() + "/" + currentHp, width/2 -90 + xOffset, height- 48, 0);
				this.mc.fontRenderer.drawString("HP: " + (int)this.mc.thePlayer.getHealth() + "/" + currentHp, width/2 -90 + xOffset, height- 49, 56576);
				} else if(healthBarWidth <= 30 && healthBarWidth >10 ){
				drawTexturedModalRect(width/2 -106 + 2, height- 40 + 1, 0, 14, healthBarWidth, 5);
				this.mc.fontRenderer.drawString("HP: " + (int)this.mc.thePlayer.getHealth() + "/" + currentHp, width/2 -91 + xOffset, height- 49, 0);
				this.mc.fontRenderer.drawString("HP: " + (int)this.mc.thePlayer.getHealth() + "/" + currentHp, width/2 -89 + xOffset, height- 49, 0);
				this.mc.fontRenderer.drawString("HP: " + (int)this.mc.thePlayer.getHealth() + "/" + currentHp, width/2 -90 + xOffset, height- 50, 0);
				this.mc.fontRenderer.drawString("HP: " + (int)this.mc.thePlayer.getHealth() + "/" + currentHp, width/2 -90 + xOffset, height- 48, 0);
				this.mc.fontRenderer.drawString("HP: " + (int)this.mc.thePlayer.getHealth() + "/" + currentHp, width/2 -90 + xOffset, height- 49, 15064320);
					}else if(healthBarWidth <=10){
				drawTexturedModalRect(width/2 -106 + 2, height- 40 + 1, 0, 19, healthBarWidth, 5);
				this.mc.fontRenderer.drawString("HP: " + (int)this.mc.thePlayer.getHealth() + "/" + currentHp, width/2 -91 + xOffset, height- 49, 0);
				this.mc.fontRenderer.drawString("HP: " + (int)this.mc.thePlayer.getHealth() + "/" + currentHp, width/2 -89 + xOffset, height- 49, 0);
				this.mc.fontRenderer.drawString("HP: " + (int)this.mc.thePlayer.getHealth() + "/" + currentHp, width/2 -90 + xOffset, height- 50, 0);
				this.mc.fontRenderer.drawString("HP: " + (int)this.mc.thePlayer.getHealth() + "/" + currentHp, width/2 -90 + xOffset, height- 48, 0);
				this.mc.fontRenderer.drawString("HP: " + (int)this.mc.thePlayer.getHealth() + "/" + currentHp, width/2 -90 + xOffset, height- 49, 15015936);
				}
		}

		String ownerName = customEntity.getEntityIsMorphedToPlayer();

		if (ownerName != null && !ownerName .equals(""))
		{
				this.currentTexture = AbstractClientPlayer.locationStevePng;
				this.mainModel = this.playerModel;

		}
		else
		{
			this.currentTexture = this.consistentTexture;
			this.mainModel = this.consistentModel;
		}
	}
	super.doRender(entity, x, y, z, f, F);
}

protected ResourceLocation getEntityTexture(Entity entity)
{
	return this.currentTexture;
}

 protected float zLevel;
 public void drawTexturedModalRect(int x, int y, int u, int v, int rectWidth, int rectHeight)
    {
	    float f = 0.00390625F;
        float f1 = 0.00390625F;
        Tessellator tessellator = Tessellator.instance;
        tessellator.startDrawingQuads();
        tessellator.addVertexWithUV((double)(x + 0), (double)(y + rectHeight), (double)this.zLevel, (double)((float)(u + 0) * f), (double)((float)(v + rectHeight) * f1));
        tessellator.addVertexWithUV((double)(x + rectWidth), (double)(y + rectHeight), (double)this.zLevel, (double)((float)(u + rectWidth) * f), (double)((float)(v + rectHeight) * f1));
        tessellator.addVertexWithUV((double)(x + rectWidth), (double)(y + 0), (double)this.zLevel, (double)((float)(u + rectWidth) * f), (double)((float)(v + 0) * f1));
        tessellator.addVertexWithUV((double)(x + 0), (double)(y + 0), (double)this.zLevel, (double)((float)(u + 0) * f), (double)((float)(v + 0) * f1));
        tessellator.draw();
    }
}

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

 Share



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • yeah i did. tried activating and deactivating mods at random until it stopped crashing but it didn't change anything ty!
    • also, just had to set up account to post this and noticed like 3 times I had to pick the right segments of images to verify before moving on.  I can't imagine that there are enough threat actors with their attention on minecraft modding communities to justify that level of protection.  Maybe the guys making these amazing and cool mods are kind of jerks about it, hahah?  Maybe, like other companies, customer service or satisfaction isn't that high a priority.  I don't feel like they get paid very much for making Forge and Minecraft Mods, I mean I wasn't required to pay anything to the creators to set this up.   Anyway, just wanted to vent.
    • Ok, I found this site while searching for the missing version .jar file, which didn't show up in a net query through DuckDuckGo.  The thread on this site was closed after a comment from someone listed as a coder who stated that it was meant to work in this way, without a .jar file which is no longer necessary.  From earlier posts it seems that this person believed the OP had issues due to use of non vanilla launcher, which to me means he thinks they use a client or something like this.  The OP immediately said that they use vanilla, but doesn't seem like the coder believed them.  They began asking for logs, OP did not provide them.  No need to go further into details. I just reinstalled Windows on an SSD and just installed Minecraft Java, Optifine, Shader, Forge.  That is all that exists on my pc right now, and I had the same issue with 1.19.2 Forge versions not creating .jar file. Now I admit that I am likely missing something here and there is a technicality that isn't being fulfilled, but I have to say that it is not due to using a modified launcher.  All i have done is install optifine, put a shader into the shader folder, installed forge.  No mods yet, nothing.  What is interesting, and is the only reason I felt the need to post here, is that when I went into minecraft library folder and copied forge-1.19.2-43.1.65-client.jar, (I renamed it without the -client,) the Forge version starts up just fine with no further issues. From my point of view it seems that coders are dismissing some valid issues out of hand.  I mean, there are lots of really stupid and lazy people using computers and playing games, but not all of them are really stupid and lazy.  We all have bias, I know that I do as well, and I think it's helpful to be aware of our bias as far as we have the ability to be aware of it. Again, it could be that my assumption that there is a problem with the installer not creating a version .jar file, but I couldn't get it to work, always failed with the same message and then put the .jar file in the version folder and worked without a hitch. Oh, almost forgot, I also went into each installation and changed from 2 to 20GB RAM for the game.  In the past I had issues crashing with many mods installed due to lower RAM allocations and I have 48GB, so felt that was safe enough either way.  Maybe that caused the issue, for all I know.   Just saying, would have been nice if the coder had said go to (generic/vanilla path) and copy (version I used as example) forge-1.19.2-43.1.65-client, paste into forge version folder, rename to forge-1.19.2-43.1.65 and see if that does it.
    • What would make my mod incompatible? I'm very afraid of this. I was making some changes to the game using events. but they would only change items created in my own mod. What is the chance of incompatibility?
    • Hello, Im playing on 1.16.5 and Its keep crashing whenever I try to join a world and I get an error message saying "The game crashed whilst ticking memory connection Error: java.lang.NullPointerException: Ticking memory connection". Heres the crash log https://pastebin.com/rqZtSBms
  • Topics

×
×
  • Create New...

Important Information

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