Now I have gotten the mod to do what I want. But I'm not sure I am doing it right. So posting some code here for feedback.
This is the event handler:
@SubscribeEvent
public void render(RenderLivingEvent.Pre event) {
EntityLivingBase entity = event.getEntity();
RenderLivingBase baseRenderer = event.getRenderer();
if (entity instanceof EntityPlayer) {
if (this.renderer == null) {
this.renderer = new RenderPlayerHealthDisplay(baseRenderer.getRenderManager(), baseRenderer.getMainModel(), 1.0F);
}
String health = String.format("%.1f", event.getEntity().getHealth()) + " §c❤";
this.renderer.renderHealthDisplay((AbstractClientPlayer) entity, event.getX(), event.getY(), event.getZ(), health);
}
}
Which uses this subclass of RenderLivingBase:
@SideOnly(Side.CLIENT)
public class RenderPlayerHealthDisplay extends RenderLivingBase<AbstractClientPlayer> {
public RenderPlayerHealthDisplay(RenderManager renderManagerIn, ModelBase modelBaseIn, float shadowSizeIn) {
super(renderManagerIn, modelBaseIn, shadowSizeIn);
}
public void renderHealthDisplay(AbstractClientPlayer entity, double x, double y, double z, String s) {
double distanceSq = entity.getDistanceSq(this.renderManager.renderViewEntity);
y += (double)((float)this.getFontRendererFromRenderManager().FONT_HEIGHT * 1.15F * 0.025F);
if (distanceSq < 100.0D)
{
Scoreboard scoreboard = entity.getWorldScoreboard();
ScoreObjective scoreobjective = scoreboard.getObjectiveInDisplaySlot(2);
if (scoreobjective != null)
{
y += (double)((float)this.getFontRendererFromRenderManager().FONT_HEIGHT * 1.15F * 0.025F);
}
}
this.renderLivingLabel(entity, s, x, y, z, 64);
}
@Nullable
@Override
protected ResourceLocation getEntityTexture(AbstractClientPlayer entity) {
return entity.getLocationSkin();
}
}
(The scoreboard handling is how it is done in RenderPlayer.)
This displays the health above player's nametags. But should I be instantiating a full new renderer like this? It seems it would be more efficient to replace the render class being sent to the event. Don't know if that makes sense, but anyway.